From 2e4de12d4f77a3e3ede527ca2c1d1f3e9e4e6f67 Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 5 Dec 2019 11:32:58 +0100 Subject: [PATCH 001/530] Hexagonal architecture: a quick and practical example --- hexagonal-architecture-poc/pom.xml | 44 +++++++++++++++++++ .../HexagonalArchitecturePocApplication.java | 13 ++++++ .../boundary/input/OrderService.java | 11 +++++ .../boundary/output/OrderRepository.java | 11 +++++ .../hexagonal/core/entities/Order.java | 27 ++++++++++++ .../core/services/OrderServiceImpl.java | 35 +++++++++++++++ .../hexagonal/outside/OrderController.java | 32 ++++++++++++++ .../src/main/resources/application.properties | 5 +++ 8 files changed, 178 insertions(+) create mode 100644 hexagonal-architecture-poc/pom.xml create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java create mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java create mode 100644 hexagonal-architecture-poc/src/main/resources/application.properties diff --git a/hexagonal-architecture-poc/pom.xml b/hexagonal-architecture-poc/pom.xml new file mode 100644 index 0000000000..b31a6dec90 --- /dev/null +++ b/hexagonal-architecture-poc/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.0.5.RELEASE + + + com.baeldung + hexagonal-architecture-poc + 0.0.1-SNAPSHOT + hexagonal-architecture-poc + Demo project for Hexagonal Architecture POC + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java new file mode 100644 index 0000000000..1690fbbeb5 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.hexagonal; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HexagonalArchitecturePocApplication { + + public static void main(String[] args) { + SpringApplication.run(HexagonalArchitecturePocApplication.class, args); + } + +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java new file mode 100644 index 0000000000..07793f75ab --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java @@ -0,0 +1,11 @@ +package com.baeldung.hexagonal.boundary.input; + +import org.springframework.stereotype.Service; + +import com.baeldung.hexagonal.core.entities.Order; + +@Service public interface OrderService { + Iterable getOrders(); + Order createOrder(Double total); + boolean registerOrder(Order order); +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java new file mode 100644 index 0000000000..ea1d38d296 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.hexagonal.boundary.output; + +import java.util.List; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.hexagonal.core.entities.Order; + +@Repository public interface OrderRepository extends CrudRepository{ +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java new file mode 100644 index 0000000000..db0c4efd54 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java @@ -0,0 +1,27 @@ +package com.baeldung.hexagonal.core.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity @Table(name="Orders") public class Order { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; + Double total; + + public Order() { + super(); + } + public Double getTotal() { + return total; + } + public void setTotal(Double total) { + this.total = total; + } + public Long getId() { + return id; + } + + +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java new file mode 100644 index 0000000000..d3d8f1ba6a --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java @@ -0,0 +1,35 @@ +package com.baeldung.hexagonal.core.services; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.hexagonal.boundary.input.OrderService; +import com.baeldung.hexagonal.boundary.output.OrderRepository; +import com.baeldung.hexagonal.core.entities.Order; + +@Service public class OrderServiceImpl implements OrderService { + + @Autowired OrderRepository orderRepository; + + @Override + public Iterable getOrders() { + return orderRepository.findAll(); + } + + @Override + public boolean registerOrder(Order order) { + if (order.getTotal() > 0) + orderRepository.save(order); + else + return false; + + return true; + } + + @Override + public Order createOrder(Double total) { + Order order = new Order(); + order.setTotal(total); + return order; + } +} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java new file mode 100644 index 0000000000..85c2e42368 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java @@ -0,0 +1,32 @@ +package com.baeldung.hexagonal.outside; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.hexagonal.boundary.input.OrderService; +import com.baeldung.hexagonal.core.entities.Order; + +@RestController public class OrderController { + + @Autowired OrderService orderService; + + @GetMapping(path = "/orders/list") + public Iterable getOrders(){ + return orderService.getOrders(); + } + + @GetMapping(path = "/orders/add") + public String placeOrder(@RequestParam Double total) { + boolean isPlaced = orderService.registerOrder(orderService.createOrder(total)); + return isPlaced ? "Ok" : "Nok"; + } + + @GetMapping(path = "/orders/add-commission") + public String placeCommissionOrder(@RequestParam Double total) { + boolean isPlaced = orderService.registerOrder(orderService.createOrder(total*1.05)); + return isPlaced ? "Ok" : "Nok"; + } + +} diff --git a/hexagonal-architecture-poc/src/main/resources/application.properties b/hexagonal-architecture-poc/src/main/resources/application.properties new file mode 100644 index 0000000000..bc2fdde8c1 --- /dev/null +++ b/hexagonal-architecture-poc/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect From b48f01d324bf1d3439eaa4b7337f541f842da0d0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 09:28:02 +0100 Subject: [PATCH 002/530] BAEL 3486 --- .../baeldung/algorithms/greedy/Follower.java | 20 ++++++ .../algorithms/greedy/FollowersPath.java | 44 +++++++++++++ .../algorithms/greedy/GreedyAlgorithm.java | 47 +++++++++++++ .../algorithms/greedy/NonGreedyAlgorithm.java | 44 +++++++++++++ .../algorithms/greedy/SocialConnector.java | 36 ++++++++++ .../algorithms/greedy/SocialUser.java | 38 +++++++++++ .../greedy/GreedyAlgorithmUnitTest.java | 66 +++++++++++++++++++ 7 files changed, 295 insertions(+) create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java new file mode 100644 index 0000000000..e24b29f5cb --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.greedy; + +import lombok.Getter; + +public class Follower { + + @Getter String username; + @Getter long count; + + public Follower(String username, long count) { + super(); + this.username = username; + this.count = count; + } + + @Override + public String toString() { + return "User: " + username + ", Followers: " + count + "\n\r" ; + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java new file mode 100644 index 0000000000..932037edb1 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java @@ -0,0 +1,44 @@ +package com.baeldung.algorithms.greedy; + +import java.util.ArrayList; +import java.util.List; + +public class FollowersPath { + + private List accounts; + private long count; + + public FollowersPath() { + super(); + this.accounts = new ArrayList<>(); + } + + public List getAccounts() { + return accounts; + } + public long getCount() { + return count; + } + + public void addFollower(String username, long count) { + accounts.add(new Follower(username, count)); + } + + public void addCount(long count) { + this.count += count; + } + + @Override + public String toString() { + String details = ""; + for(Follower a : accounts) { + details+=a.toString() + ", "; + } + + return "Total: " + count + ", \n\r" + + " Details: { " + "\n\r" + + details + "\n\r" + + " }"; + } + +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java new file mode 100644 index 0000000000..891695e5dc --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java @@ -0,0 +1,47 @@ +package com.baeldung.algorithms.greedy; + +import java.util.List; + +public class GreedyAlgorithm { + + int currentLevel = 0; + final int maxLevel = 3; + SocialConnector sc; + FollowersPath fp; + + public GreedyAlgorithm(SocialConnector sc) { + super(); + this.sc = sc; + this.fp = new FollowersPath(); + } + + public long findMostFollowersPath(String account) throws Exception { + long max = 0; + SocialUser toFollow = null; + + List followers = sc.getFollowers(account); + for (SocialUser el : followers) { + long followersCount = el.getFollowersCount(); + if (followersCount > max) { + toFollow = el; + max = followersCount; + } + } + + if (currentLevel < maxLevel - 1) { + currentLevel++; + max += findMostFollowersPath(toFollow.getUsername()); + //fp.addFollower(toFollow.getUsername(), max); + //fp.addCount(max); + return max; + } else { + //fp.addFollower(toFollow.getUsername(), max); + //fp.addCount(max); + return max; + } + } + + public FollowersPath getFollowers() { + return fp; + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java new file mode 100644 index 0000000000..db8a47be11 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java @@ -0,0 +1,44 @@ +package com.baeldung.algorithms.greedy; + +import java.util.List; + +public class NonGreedyAlgorithm { + + int currentLevel = 0; + final int maxLevel = 3; + SocialConnector tc; + + public NonGreedyAlgorithm(SocialConnector tc, int level) { + super(); + this.tc = tc; + this.currentLevel = level; + } + + + public long findMostFollowersPath(String account) throws Exception { + List followers = tc.getFollowers(account); + long total = currentLevel > 0 ? followers.size() : 0; + + if (currentLevel < maxLevel ) { + currentLevel++; + + long[] count = new long[followers.size()]; + int i = 0; + for (SocialUser el : followers) { + NonGreedyAlgorithm sub = new NonGreedyAlgorithm(tc, currentLevel); + count[i] = sub.findMostFollowersPath(el.getUsername()); + i++; + } + + long max = 0; + for (; i > 0; i--) { + if (count[i-1] > max ) + max = count[i-1]; + } + + return total + max; + } + + return total; + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java new file mode 100644 index 0000000000..cdcf0df395 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java @@ -0,0 +1,36 @@ +package com.baeldung.algorithms.greedy; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +public class SocialConnector { + private boolean isCounterEnabled = true; + private int counter = 4; + @Getter @Setter List users; + + public SocialConnector() { + users = new ArrayList<>(); + } + + public boolean switchCounter() { + this.isCounterEnabled = !this.isCounterEnabled; + return this.isCounterEnabled; + } + + public List getFollowers(String account) throws Exception { + if (counter < 0) + throw new Exception ("API limit reached"); + else { + if(this.isCounterEnabled) counter--; + for(SocialUser user : users) { + if (user.getUsername().equals(account)) { + return user.getFollowers(); + } + } + } + return new ArrayList<>(); + } +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java new file mode 100644 index 0000000000..33eab9e799 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.greedy; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Getter; + +public class SocialUser { + + @Getter private String username; + @Getter private List followers; + + public SocialUser(String username) { + super(); + this.username = username; + this.followers = new ArrayList<>(); + } + + public SocialUser(String username, List followers) { + super(); + this.username = username; + this.followers = followers; + } + + public long getFollowersCount() { + return followers.size(); + } + + public void addFollowers(List followers) { + this.followers.addAll(followers); + } + + @Override + public boolean equals(Object obj) { + return ((SocialUser) obj).getUsername().equals(username); + } + +} diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java new file mode 100644 index 0000000000..3560657ace --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung.algorithms.greedy; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class GreedyAlgorithmUnitTest { + + private SocialConnector prepareNetwork() { + SocialConnector sc = new SocialConnector(); + + SocialUser root = new SocialUser("root"); + SocialUser child1 = new SocialUser("child1"); + SocialUser child2 = new SocialUser("child2"); + SocialUser child3 = new SocialUser("child3"); + SocialUser child21 = new SocialUser("child21"); + SocialUser child211 = new SocialUser("child211"); + SocialUser child2111 = new SocialUser("child2111"); + SocialUser child31 = new SocialUser("child31"); + SocialUser child311 = new SocialUser("child311"); + SocialUser child3111 = new SocialUser("child3111"); + + + child211.addFollowers(Arrays.asList(new SocialUser[]{child2111})); + child311.addFollowers(Arrays.asList(new SocialUser[]{child3111})); + + child21.addFollowers(Arrays.asList(new SocialUser[]{child211})); + child31.addFollowers(Arrays.asList(new SocialUser[]{child311, + new SocialUser("child312"), new SocialUser("child313"), new SocialUser("child314")})); + + child1.addFollowers(Arrays.asList(new SocialUser[]{new SocialUser("child11"), new SocialUser("child12")})); + child2.addFollowers(Arrays.asList(new SocialUser[]{child21, new SocialUser("child22"), new SocialUser("child23")})); + child3.addFollowers(Arrays.asList(new SocialUser[]{child31})); + + root.addFollowers(Arrays.asList(new SocialUser[]{child1, child2, child3})); + + sc.setUsers(Arrays.asList(new SocialUser[]{root, child1, child2, child3, child21, child31, child311, child211})); + return sc; + } + + @Test + public void greedyAlgorithmTest() throws Exception { + GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork()); + assertEquals(ga.findMostFollowersPath("root"), 5); + } + + @Test + public void nongreedyAlgorithmTest() throws Exception { + NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0); + Assertions.assertThrows(Exception.class, () -> { + nga.findMostFollowersPath("root"); + }); + } + + @Test + public void nongreedyAlgorithmUnboundedTest() throws Exception { + SocialConnector sc = prepareNetwork(); + sc.switchCounter(); + NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0); + assertEquals(nga.findMostFollowersPath("root"), 6); + } + +} \ No newline at end of file From 36350012225d15264bfd5165d0a5f3fd2a052668 Mon Sep 17 00:00:00 2001 From: Max <56247279+the-magic-max@users.noreply.github.com> Date: Wed, 15 Jan 2020 15:43:57 +0100 Subject: [PATCH 003/530] Redundant Variable 'config' Instead of initializing a local variable first and then return it, you could directly return a new Builder instance. -> return new Builder().uri(URL).build(); --- .../data/neo4j/config/MovieDatabaseNeo4jConfiguration.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java index 9bbc571aee..4e87c24614 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java @@ -16,8 +16,7 @@ public class MovieDatabaseNeo4jConfiguration { @Bean public org.neo4j.ogm.config.Configuration getConfiguration() { - org.neo4j.ogm.config.Configuration config = new Builder().uri(URL).build(); - return config; + return new Builder().uri(URL).build(); } @Bean From 03da414d7a7df52cb8d732c98e62b67d1998f0ff Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sat, 25 Jan 2020 23:15:17 +0530 Subject: [PATCH 004/530] updated spring 4 minor version --- parent-spring-4/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml index 671ca7db6b..3749c5016e 100644 --- a/parent-spring-4/pom.xml +++ b/parent-spring-4/pom.xml @@ -51,7 +51,7 @@ - 4.3.25.RELEASE + 4.3.26.RELEASE 1.6.1 From fe1642be6f13d0f3c886cd8c023df4fccabade51 Mon Sep 17 00:00:00 2001 From: chirag d Date: Tue, 4 Feb 2020 22:19:12 +0530 Subject: [PATCH 005/530] BAEL3771: Cache Headers in Spring MVC --- .../baeldung/spring/web/config/WebConfig.java | 25 +++++- .../controller/CacheControlController.java | 55 ++++++++++++ .../src/main/webapp/resources/hello.css | 0 ...CacheControlControllerIntegrationTest.java | 84 +++++++++++++++++++ 4 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/web/controller/CacheControlController.java create mode 100644 spring-mvc-java/src/main/webapp/resources/hello.css create mode 100644 spring-mvc-java/src/test/java/com/baeldung/web/controller/CacheControlControllerIntegrationTest.java diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 96e300464b..5cc165680f 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -2,6 +2,7 @@ package com.baeldung.spring.web.config; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; @@ -9,15 +10,19 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.http.CacheControl; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.mvc.WebContentInterceptor; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.util.UrlPathHelper; @@ -30,14 +35,14 @@ import com.baeldung.excel.ExcelPOIHelper; @EnableWebMvc @Configuration -@ComponentScan(basePackages = { "com.baeldung.web.controller" }) +@ComponentScan(basePackages = {"com.baeldung.web.controller"}) public class WebConfig implements WebMvcConfigurer { - + @Override public void addViewControllers(final ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } - + @Bean public ViewResolver thymeleafViewResolver() { final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); @@ -84,7 +89,10 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(final ResourceHandlerRegistry registry) { - registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/") + .setCacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS) + .noTransform() + .mustRevalidate()); } @Override @@ -121,4 +129,13 @@ public class WebConfig implements WebMvcConfigurer { public ExcelPOIHelper excelPOIHelper() { return new ExcelPOIHelper(); } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + WebContentInterceptor interceptor = new WebContentInterceptor(); + interceptor.addCacheMapping(CacheControl.maxAge(60, TimeUnit.SECONDS) + .noTransform() + .mustRevalidate(), "/cache/*"); + registry.addInterceptor(interceptor); + } } \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CacheControlController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/CacheControlController.java new file mode 100644 index 0000000000..f1614ab448 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/CacheControlController.java @@ -0,0 +1,55 @@ +package com.baeldung.web.controller; + +import org.springframework.http.CacheControl; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.context.request.WebRequest; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.concurrent.TimeUnit; + +@Controller +public class CacheControlController { + + @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET) + public ResponseEntity helloWorld(@PathVariable String name) { + CacheControl cacheControl = CacheControl.maxAge(60, TimeUnit.SECONDS) + .noTransform() + .mustRevalidate(); + return ResponseEntity.ok() + .cacheControl(cacheControl) + .body("Hello " + name); + } + + @RequestMapping(value = "/home/{name}", method = RequestMethod.GET) + public String home(@PathVariable String name, final HttpServletResponse response) { + response.addHeader("Cache-Control", "max-age=60, must-revalidate, no-transform"); + return "home"; + } + + @RequestMapping(value = "/cache/{name}", method = RequestMethod.GET) + public ResponseEntity intercept(@PathVariable String name) { + return ResponseEntity.ok().body("Hello " + name); + } + + @RequestMapping(value = "/validate/{name}", method = RequestMethod.GET) + public ResponseEntity validate(@PathVariable String name, WebRequest request) { + + ZoneId zoneId = ZoneId.of("GMT"); + long lastModifiedTimestamp = LocalDateTime.of(2020, 02, 4, 19, 57, 45) + .atZone(zoneId).toInstant().toEpochMilli(); + + if (request.checkNotModified(lastModifiedTimestamp)) { + return ResponseEntity.status(304).build(); + } + + return ResponseEntity.ok().body("Hello " + name); + } + + +} diff --git a/spring-mvc-java/src/main/webapp/resources/hello.css b/spring-mvc-java/src/main/webapp/resources/hello.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/CacheControlControllerIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/CacheControlControllerIntegrationTest.java new file mode 100644 index 0000000000..b03f628b20 --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/web/controller/CacheControlControllerIntegrationTest.java @@ -0,0 +1,84 @@ +package com.baeldung.web.controller; + +import com.baeldung.spring.web.config.WebConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import static org.springframework.http.HttpHeaders.IF_UNMODIFIED_SINCE; + +@ExtendWith(SpringExtension.class) +@WebAppConfiguration +@ContextConfiguration(classes = {WebConfig.class, WebConfig.class}) +public class CacheControlControllerIntegrationTest { + + @Autowired + private WebApplicationContext wac; + + private MockMvc mockMvc; + + @BeforeEach + void setup() throws Exception { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + } + + @Test + void whenResponseBody_thenReturnCacheHeader() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/hello/baeldung")) + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.header().string("Cache-Control","max-age=60, must-revalidate, no-transform")); + } + + @Test + void whenViewName_thenReturnCacheHeader() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/home/baeldung")) + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.header().string("Cache-Control","max-age=60, must-revalidate, no-transform")) + .andExpect(MockMvcResultMatchers.view().name("home")); + } + + @Test + void whenStaticResources_thenReturnCacheHeader() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/resources/hello.css")) + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.header().string("Cache-Control","max-age=60, must-revalidate, no-transform")); + } + + @Test + void whenInterceptor_thenReturnCacheHeader() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/cache/baeldung")) + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.header().string("Cache-Control","max-age=60, must-revalidate, no-transform")); + } + + @Test + void whenValidate_thenReturnCacheHeader() throws Exception { + HttpHeaders headers = new HttpHeaders(); + headers.add(IF_UNMODIFIED_SINCE, "Tue, 04 Feb 2020 19:57:25 GMT"); + this.mockMvc.perform(MockMvcRequestBuilders.get("/validate/baeldung").headers(headers)) + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().is(304)); + } + + + + +} From 92b7e549a14f82dcef37d29e793a19c8ea853f98 Mon Sep 17 00:00:00 2001 From: chirag d Date: Sat, 8 Feb 2020 16:34:45 +0530 Subject: [PATCH 006/530] BEAL3771: Cache Headers in Spring MVC --- pom.xml | 1 + spring-mvc-java-2/.gitignore | 13 ++++++ spring-mvc-java-2/pom.xml | 39 ++++++++++++++++++ .../cache}/CacheControlController.java | 2 +- .../java/com/baeldung/cache/WebConfig.java | 41 +++++++++++++++++++ .../src/main/webapp/resources/hello.css | 0 ...CacheControlControllerIntegrationTest.java | 6 +-- .../baeldung/spring/web/config/WebConfig.java | 25 ++--------- 8 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 spring-mvc-java-2/.gitignore create mode 100644 spring-mvc-java-2/pom.xml rename {spring-mvc-java/src/main/java/com/baeldung/web/controller => spring-mvc-java-2/src/main/java/com/baeldung/cache}/CacheControlController.java (98%) create mode 100644 spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java rename {spring-mvc-java => spring-mvc-java-2}/src/main/webapp/resources/hello.css (100%) rename {spring-mvc-java/src/test/java/com/baeldung/web/controller => spring-mvc-java-2/src/test/java/com/baeldung/cache}/CacheControlControllerIntegrationTest.java (95%) diff --git a/pom.xml b/pom.xml index 6e6316edd6..1972350c75 100644 --- a/pom.xml +++ b/pom.xml @@ -692,6 +692,7 @@ spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java + spring-mvc-java-2 spring-mvc-kotlin spring-mvc-velocity diff --git a/spring-mvc-java-2/.gitignore b/spring-mvc-java-2/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-mvc-java-2/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-mvc-java-2/pom.xml b/spring-mvc-java-2/pom.xml new file mode 100644 index 0000000000..d5b7d087ab --- /dev/null +++ b/spring-mvc-java-2/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + spring-mvc-java-2 + 0.1-SNAPSHOT + spring-mvc-java-2 + war + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + javax.servlet + javax.servlet-api + ${javax.version} + + + org.springframework + spring-webmvc + ${spring.mvc.version} + + + + + + 4.0.1 + 5.2.2.RELEASE + + + + + \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CacheControlController.java b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheControlController.java similarity index 98% rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/CacheControlController.java rename to spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheControlController.java index f1614ab448..5bf095888e 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CacheControlController.java +++ b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheControlController.java @@ -1,4 +1,4 @@ -package com.baeldung.web.controller; +package com.baeldung.cache; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java new file mode 100644 index 0000000000..728479979c --- /dev/null +++ b/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java @@ -0,0 +1,41 @@ +package com.baeldung.cache; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.mvc.WebContentInterceptor; + +import java.util.concurrent.TimeUnit; + +@EnableWebMvc +@Configuration +@ComponentScan(basePackages = {"com.baeldung.cache"}) +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + } + + @Override + public void addResourceHandlers(final ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/") + .setCacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS) + .noTransform() + .mustRevalidate()); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + WebContentInterceptor interceptor = new WebContentInterceptor(); + interceptor.addCacheMapping(CacheControl.maxAge(60, TimeUnit.SECONDS) + .noTransform() + .mustRevalidate(), "/cache/*"); + registry.addInterceptor(interceptor); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/webapp/resources/hello.css b/spring-mvc-java-2/src/main/webapp/resources/hello.css similarity index 100% rename from spring-mvc-java/src/main/webapp/resources/hello.css rename to spring-mvc-java-2/src/main/webapp/resources/hello.css diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/CacheControlControllerIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java similarity index 95% rename from spring-mvc-java/src/test/java/com/baeldung/web/controller/CacheControlControllerIntegrationTest.java rename to spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java index b03f628b20..ef408038ae 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/CacheControlControllerIntegrationTest.java +++ b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java @@ -1,6 +1,5 @@ -package com.baeldung.web.controller; +package com.baeldung.cache; -import com.baeldung.spring.web.config.WebConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -16,9 +15,6 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import java.time.LocalDate; -import java.time.LocalDateTime; - import static org.springframework.http.HttpHeaders.IF_UNMODIFIED_SINCE; @ExtendWith(SpringExtension.class) diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 5cc165680f..96e300464b 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -2,7 +2,6 @@ package com.baeldung.spring.web.config; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; @@ -10,19 +9,15 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.http.CacheControl; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.mvc.WebContentInterceptor; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.util.UrlPathHelper; @@ -35,14 +30,14 @@ import com.baeldung.excel.ExcelPOIHelper; @EnableWebMvc @Configuration -@ComponentScan(basePackages = {"com.baeldung.web.controller"}) +@ComponentScan(basePackages = { "com.baeldung.web.controller" }) public class WebConfig implements WebMvcConfigurer { - + @Override public void addViewControllers(final ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } - + @Bean public ViewResolver thymeleafViewResolver() { final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); @@ -89,10 +84,7 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(final ResourceHandlerRegistry registry) { - registry.addResourceHandler("/resources/**").addResourceLocations("/resources/") - .setCacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS) - .noTransform() - .mustRevalidate()); + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); } @Override @@ -129,13 +121,4 @@ public class WebConfig implements WebMvcConfigurer { public ExcelPOIHelper excelPOIHelper() { return new ExcelPOIHelper(); } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - WebContentInterceptor interceptor = new WebContentInterceptor(); - interceptor.addCacheMapping(CacheControl.maxAge(60, TimeUnit.SECONDS) - .noTransform() - .mustRevalidate(), "/cache/*"); - registry.addInterceptor(interceptor); - } } \ No newline at end of file From e6b1faa8c2ae0edfbc292c98a22f5eee0964a120 Mon Sep 17 00:00:00 2001 From: chirag d Date: Sat, 8 Feb 2020 18:17:34 +0530 Subject: [PATCH 007/530] BEAL3771: Cache Headers in Spring MVC --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 1972350c75..6bc56a8ab6 100644 --- a/pom.xml +++ b/pom.xml @@ -1194,6 +1194,7 @@ spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java + spring-mvc-java-2 spring-mvc-kotlin spring-mvc-velocity From 91da58e880b411d0a99000d555359c41d5af59f2 Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Wed, 12 Feb 2020 16:06:47 +0100 Subject: [PATCH 008/530] initial commit of Hexagonal Architecture --- spring-boot-modules/pom.xml | 1 + .../spring-boot-hexagonal/README.md | 4 + .../spring-boot-hexagonal/pom.xml | 76 +++++++++++++++++++ .../main/java/com/baeldung/Application.java | 13 ++++ .../adapter/DocumentRepositoryImpl.java | 24 ++++++ .../baeldung/adapter/DocumentRestAdapter.java | 24 ++++++ .../java/com/baeldung/domain/Document.java | 13 ++++ .../java/com/baeldung/port/DocumentRepo.java | 11 +++ .../com/baeldung/port/DocumentService.java | 11 +++ .../port/impl/DocumentServiceImpl.java | 24 ++++++ .../src/main/resources/application.properties | 1 + .../java/com/baeldung/ApplicationTests.java | 16 ++++ 12 files changed, 218 insertions(+) create mode 100644 spring-boot-modules/spring-boot-hexagonal/README.md create mode 100644 spring-boot-modules/spring-boot-hexagonal/pom.xml create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 234c52f638..3a503bf837 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -49,6 +49,7 @@ spring-boot-springdoc spring-boot-testing spring-boot-vue + spring-boot-hexagonal diff --git a/spring-boot-modules/spring-boot-hexagonal/README.md b/spring-boot-modules/spring-boot-hexagonal/README.md new file mode 100644 index 0000000000..44728b185e --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/README.md @@ -0,0 +1,4 @@ +## HEXAGONAL Architecture + +This module contains articles about Hexagonal Architecture implemented via Spring Boot. + diff --git a/spring-boot-modules/spring-boot-hexagonal/pom.xml b/spring-boot-modules/spring-boot-hexagonal/pom.xml new file mode 100644 index 0000000000..4d6109d24f --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + spring-boot-hexagonal + spring-boot-hexagonal + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + + + + org.projectlombok + lombok + 1.18.12 + + + + + + spring-boot-hexagonal + + + src/main/resources + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + exec + + + + org.apache.maven.plugins + maven-assembly-plugin + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + + UTF-8 + + + diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..17be2b0d79 --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java @@ -0,0 +1,13 @@ +package com.ajay.documentservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DocumentserviceApplication { + + public static void main(String[] args) { + SpringApplication.run(DocumentserviceApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java new file mode 100644 index 0000000000..e22ccb5cbf --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java @@ -0,0 +1,24 @@ +package com.ajay.documentservice.adapter; + +import com.ajay.documentservice.domain.Document; +import com.ajay.documentservice.port.DocumentRepo; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.Map; + +@Repository +public class DocumentRepositoryImpl implements DocumentRepo { + + private Map documentMap = new HashMap<>(); + + @Override + public void storeDocument(Document document) { + documentMap.put(document.getId(), document); + } + + @Override + public Document findDocumentById(String id) { + return documentMap.get(id); + } +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java new file mode 100644 index 0000000000..2a3cffb0e8 --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java @@ -0,0 +1,24 @@ +package com.ajay.documentservice.adapter; + +import com.ajay.documentservice.domain.Document; +import com.ajay.documentservice.port.DocumentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/doc") +public class DocumentRestAdapter { + @Autowired + private DocumentService documentService; + + @PostMapping + public void createDocument(@RequestBody Document document) { + documentService.createDocument(document); + } + + @GetMapping("/{id}") + public Document findById(@PathVariable String id) { + return documentService.findById(id); + } + +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java new file mode 100644 index 0000000000..14ab4900e2 --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java @@ -0,0 +1,13 @@ +package com.ajay.documentservice.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@AllArgsConstructor +@Builder +public class Document { + private String id; + private String data; +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java new file mode 100644 index 0000000000..2e18dd92ee --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java @@ -0,0 +1,11 @@ +package com.ajay.documentservice.port; + + +import com.ajay.documentservice.domain.Document; + +public interface DocumentRepo { + void storeDocument(Document document); + + Document findDocumentById(String id); +} + diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java new file mode 100644 index 0000000000..6ed9edaf2c --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java @@ -0,0 +1,11 @@ +package com.ajay.documentservice.port; + +import com.ajay.documentservice.domain.Document; + +public interface DocumentService { + + void createDocument(Document document); + + Document findById(String id); + +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java new file mode 100644 index 0000000000..2549ca834c --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java @@ -0,0 +1,24 @@ +package com.ajay.documentservice.port.impl; + +import com.ajay.documentservice.domain.Document; +import com.ajay.documentservice.port.DocumentRepo; +import com.ajay.documentservice.port.DocumentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DocumentServiceImpl implements DocumentService { + + @Autowired + private DocumentRepo documentRepo; + + @Override + public void createDocument(Document document) { + documentRepo.storeDocument(document); + } + + @Override + public Document findById(String id) { + return documentRepo.findDocumentById(id); + } +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties b/spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java new file mode 100644 index 0000000000..ce3b754df3 --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java @@ -0,0 +1,16 @@ +package com.ajay.documentservice.documentservice; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@SpringBootTest +@RunWith(SpringRunner.class) +class ApplicationTests { + + @Test + public void contextLoads() { + } + +} From 563b6b7a89896bc643a22d227b4318529360a67a Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Wed, 12 Feb 2020 16:10:36 +0100 Subject: [PATCH 009/530] updated package name --- .../src/main/java/com/baeldung/Application.java | 2 +- .../main/java/com/baeldung/adapter/DocumentRepositoryImpl.java | 2 +- .../src/main/java/com/baeldung/adapter/DocumentRestAdapter.java | 2 +- .../src/main/java/com/baeldung/domain/Document.java | 2 +- .../src/main/java/com/baeldung/port/DocumentRepo.java | 2 +- .../src/main/java/com/baeldung/port/DocumentService.java | 2 +- .../main/java/com/baeldung/port/impl/DocumentServiceImpl.java | 2 +- .../src/test/java/com/baeldung/ApplicationTests.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java index 17be2b0d79..5e4bcc0435 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice; +package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java index e22ccb5cbf..eabdaa63b8 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice.adapter; +package com.baeldung.adapter; import com.ajay.documentservice.domain.Document; import com.ajay.documentservice.port.DocumentRepo; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java index 2a3cffb0e8..d8c89d5c6e 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice.adapter; +package com.baeldung.adapter; import com.ajay.documentservice.domain.Document; import com.ajay.documentservice.port.DocumentService; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java index 14ab4900e2..77c1079cdc 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice.domain; +package com.baeldung.domain; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java index 2e18dd92ee..d5591f9aa4 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice.port; +package com.baeldung.port; import com.ajay.documentservice.domain.Document; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java index 6ed9edaf2c..5df49efa88 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice.port; +package com.baeldung.port; import com.ajay.documentservice.domain.Document; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java index 2549ca834c..a2942b2d59 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice.port.impl; +package com.baeldung.port.impl; import com.ajay.documentservice.domain.Document; import com.ajay.documentservice.port.DocumentRepo; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java index ce3b754df3..f531a9fba0 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java @@ -1,4 +1,4 @@ -package com.ajay.documentservice.documentservice; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 7feb7bf9d8d22dfc015b969eda13e5c76e3e6426 Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Wed, 12 Feb 2020 17:15:44 +0100 Subject: [PATCH 010/530] renamed packages. --- .../spring-boot-hexagonal/pom.xml | 6 ----- .../main/java/com/baeldung/Application.java | 4 ++-- .../adapter/DocumentRepositoryImpl.java | 5 +++-- .../baeldung/adapter/DocumentRestAdapter.java | 6 +++-- .../java/com/baeldung/domain/Document.java | 22 +++++++++++++------ .../java/com/baeldung/port/DocumentRepo.java | 3 +-- .../com/baeldung/port/DocumentService.java | 2 +- .../port/impl/DocumentServiceImpl.java | 7 +++--- ...ionTests.java => ApplicationUnitTest.java} | 2 +- 9 files changed, 31 insertions(+), 26 deletions(-) rename spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/{ApplicationTests.java => ApplicationUnitTest.java} (91%) diff --git a/spring-boot-modules/spring-boot-hexagonal/pom.xml b/spring-boot-modules/spring-boot-hexagonal/pom.xml index 4d6109d24f..54d61fa806 100644 --- a/spring-boot-modules/spring-boot-hexagonal/pom.xml +++ b/spring-boot-modules/spring-boot-hexagonal/pom.xml @@ -24,12 +24,6 @@ spring-boot-starter-test - - org.projectlombok - lombok - 1.18.12 - - diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java index 5e4bcc0435..a898f9cf05 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java @@ -4,10 +4,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class DocumentserviceApplication { +public class Application { public static void main(String[] args) { - SpringApplication.run(DocumentserviceApplication.class, args); + SpringApplication.run(Application.class, args); } } diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java index eabdaa63b8..1248133665 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java @@ -1,9 +1,10 @@ package com.baeldung.adapter; -import com.ajay.documentservice.domain.Document; -import com.ajay.documentservice.port.DocumentRepo; import org.springframework.stereotype.Repository; +import com.baeldung.domain.Document; +import com.baeldung.port.DocumentRepo; + import java.util.HashMap; import java.util.Map; diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java index d8c89d5c6e..e7fa5d0b42 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java @@ -1,10 +1,12 @@ package com.baeldung.adapter; -import com.ajay.documentservice.domain.Document; -import com.ajay.documentservice.port.DocumentService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import com.baeldung.domain.Document; +import com.baeldung.port.DocumentService; + @RestController @RequestMapping("/doc") public class DocumentRestAdapter { diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java index 77c1079cdc..58381d536d 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java @@ -1,13 +1,21 @@ package com.baeldung.domain; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -@Data -@AllArgsConstructor -@Builder public class Document { private String id; private String data; + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getData() { + return data; + } + public void setData(String data) { + this.data = data; + } + + } diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java index d5591f9aa4..96dba3d954 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java @@ -1,7 +1,6 @@ package com.baeldung.port; - -import com.ajay.documentservice.domain.Document; +import com.baeldung.domain.Document; public interface DocumentRepo { void storeDocument(Document document); diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java index 5df49efa88..5d5bfb2035 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java @@ -1,6 +1,6 @@ package com.baeldung.port; -import com.ajay.documentservice.domain.Document; +import com.baeldung.domain.Document; public interface DocumentService { diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java index a2942b2d59..1b50e1efe2 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java @@ -1,11 +1,12 @@ package com.baeldung.port.impl; -import com.ajay.documentservice.domain.Document; -import com.ajay.documentservice.port.DocumentRepo; -import com.ajay.documentservice.port.DocumentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.baeldung.domain.Document; +import com.baeldung.port.DocumentRepo; +import com.baeldung.port.DocumentService; + @Service public class DocumentServiceImpl implements DocumentService { diff --git a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java similarity index 91% rename from spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java rename to spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java index f531a9fba0..f7592c0cc8 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationTests.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest @RunWith(SpringRunner.class) -class ApplicationTests { +class ApplicationUnitTest { @Test public void contextLoads() { From d868eda952f0698e0568dfbab26134a06f47c001 Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Sat, 15 Feb 2020 09:32:50 +0100 Subject: [PATCH 011/530] reformatted as per standard formatter and incorporated review comments. --- .../spring-boot-hexagonal/pom.xml | 102 ++++++++---------- .../main/java/com/baeldung/Application.java | 10 +- .../adapter/DocumentRepositoryImpl.java | 26 ++--- .../baeldung/adapter/DocumentRestAdapter.java | 29 +++-- .../java/com/baeldung/domain/Document.java | 36 ++++--- .../baeldung/domain/port/DocumentRepo.java | 9 ++ .../baeldung/domain/port/DocumentService.java | 11 ++ .../domain/port/impl/DocumentServiceImpl.java | 25 +++++ .../java/com/baeldung/port/DocumentRepo.java | 10 -- .../com/baeldung/port/DocumentService.java | 11 -- .../port/impl/DocumentServiceImpl.java | 25 ----- .../com/baeldung/ApplicationUnitTest.java | 10 +- 12 files changed, 143 insertions(+), 161 deletions(-) create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java create mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java diff --git a/spring-boot-modules/spring-boot-hexagonal/pom.xml b/spring-boot-modules/spring-boot-hexagonal/pom.xml index 54d61fa806..c4ff36c2cf 100644 --- a/spring-boot-modules/spring-boot-hexagonal/pom.xml +++ b/spring-boot-modules/spring-boot-hexagonal/pom.xml @@ -1,70 +1,52 @@ - 4.0.0 - spring-boot-hexagonal - spring-boot-hexagonal + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + 4.0.0 + spring-boot-hexagonal + spring-boot-hexagonal - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + - - - org.springframework.boot - spring-boot-starter-web - + + + org.springframework.boot + spring-boot-starter-web + - - org.springframework.boot - spring-boot-starter-test - + + org.springframework.boot + spring-boot-starter-test + - + - - spring-boot-hexagonal - - - src/main/resources - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - exec - - - - org.apache.maven.plugins - maven-assembly-plugin - - - jar-with-dependencies - - - - - make-assembly - package - - single - - - - - - + + spring-boot-hexagonal + + + src/main/resources + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + exec + + + + - - UTF-8 - + + UTF-8 + diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java index a898f9cf05..37dbe7dab8 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java @@ -5,9 +5,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + } diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java index 1248133665..32414442ef 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java @@ -3,23 +3,23 @@ package com.baeldung.adapter; import org.springframework.stereotype.Repository; import com.baeldung.domain.Document; -import com.baeldung.port.DocumentRepo; +import com.baeldung.domain.port.DocumentRepo; import java.util.HashMap; import java.util.Map; @Repository public class DocumentRepositoryImpl implements DocumentRepo { - - private Map documentMap = new HashMap<>(); - - @Override - public void storeDocument(Document document) { - documentMap.put(document.getId(), document); - } - - @Override - public Document findDocumentById(String id) { - return documentMap.get(id); - } + + private Map documentMap = new HashMap<>(); + + @Override + public void storeDocument(Document document) { + documentMap.put(document.getId(), document); + } + + @Override + public Document findDocumentById(String id) { + return documentMap.get(id); + } } diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java index e7fa5d0b42..985a5257c0 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java @@ -1,26 +1,25 @@ package com.baeldung.adapter; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.baeldung.domain.Document; -import com.baeldung.port.DocumentService; +import com.baeldung.domain.port.DocumentService; @RestController @RequestMapping("/doc") public class DocumentRestAdapter { - @Autowired - private DocumentService documentService; - - @PostMapping - public void createDocument(@RequestBody Document document) { - documentService.createDocument(document); - } - - @GetMapping("/{id}") - public Document findById(@PathVariable String id) { - return documentService.findById(id); - } - + @Autowired + private DocumentService documentService; + + @PostMapping + public void createDocument(@RequestBody Document document) { + documentService.createDocument(document); + } + + @GetMapping("/{id}") + public Document findById(@PathVariable String id) { + return documentService.findById(id); + } + } diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java index 58381d536d..24d0a95071 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java @@ -1,21 +1,23 @@ package com.baeldung.domain; public class Document { - private String id; - private String data; - - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getData() { - return data; - } - public void setData(String data) { - this.data = data; - } - - + private String id; + private String data; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + } diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java new file mode 100644 index 0000000000..001e3251e4 --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java @@ -0,0 +1,9 @@ +package com.baeldung.domain.port; + +import com.baeldung.domain.Document; + +public interface DocumentRepo { + void storeDocument(Document document); + + Document findDocumentById(String id); +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java new file mode 100644 index 0000000000..009c26c01f --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java @@ -0,0 +1,11 @@ +package com.baeldung.domain.port; + +import com.baeldung.domain.Document; + +public interface DocumentService { + + void createDocument(Document document); + + Document findById(String id); + +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java new file mode 100644 index 0000000000..f5c351406e --- /dev/null +++ b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java @@ -0,0 +1,25 @@ +package com.baeldung.domain.port.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.domain.Document; +import com.baeldung.domain.port.DocumentRepo; +import com.baeldung.domain.port.DocumentService; + +@Service +public class DocumentServiceImpl implements DocumentService { + + @Autowired + private DocumentRepo documentRepo; + + @Override + public void createDocument(Document document) { + documentRepo.storeDocument(document); + } + + @Override + public Document findById(String id) { + return documentRepo.findDocumentById(id); + } +} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java deleted file mode 100644 index 96dba3d954..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentRepo.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.port; - -import com.baeldung.domain.Document; - -public interface DocumentRepo { - void storeDocument(Document document); - - Document findDocumentById(String id); -} - diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java deleted file mode 100644 index 5d5bfb2035..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/DocumentService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.port; - -import com.baeldung.domain.Document; - -public interface DocumentService { - - void createDocument(Document document); - - Document findById(String id); - -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java deleted file mode 100644 index 1b50e1efe2..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/port/impl/DocumentServiceImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.port.impl; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.domain.Document; -import com.baeldung.port.DocumentRepo; -import com.baeldung.port.DocumentService; - -@Service -public class DocumentServiceImpl implements DocumentService { - - @Autowired - private DocumentRepo documentRepo; - - @Override - public void createDocument(Document document) { - documentRepo.storeDocument(document); - } - - @Override - public Document findById(String id) { - return documentRepo.findDocumentById(id); - } -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java index f7592c0cc8..2ce9b1cf24 100644 --- a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java +++ b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java @@ -8,9 +8,9 @@ import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest @RunWith(SpringRunner.class) class ApplicationUnitTest { - - @Test - public void contextLoads() { - } - + + @Test + public void contextLoads() { + } + } From af596b23381616097aa132ef2eacfcd3eeaad02e Mon Sep 17 00:00:00 2001 From: chirag d Date: Sat, 15 Feb 2020 21:57:54 +0530 Subject: [PATCH 012/530] BAEL:3771 Few review comments --- .../cache/CacheControlController.java | 21 +++++++++---------- .../java/com/baeldung/cache/WebConfig.java | 2 +- ...CacheControlControllerIntegrationTest.java | 7 ++++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheControlController.java b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheControlController.java index 5bf095888e..7305f836cf 100644 --- a/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheControlController.java +++ b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheControlController.java @@ -3,9 +3,8 @@ package com.baeldung.cache; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.request.WebRequest; import javax.servlet.http.HttpServletResponse; @@ -16,28 +15,28 @@ import java.util.concurrent.TimeUnit; @Controller public class CacheControlController { - @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET) - public ResponseEntity helloWorld(@PathVariable String name) { + @GetMapping(value = "/hello/{name}") + public ResponseEntity hello(@PathVariable String name) { CacheControl cacheControl = CacheControl.maxAge(60, TimeUnit.SECONDS) - .noTransform() - .mustRevalidate(); + .noTransform() + .mustRevalidate(); return ResponseEntity.ok() - .cacheControl(cacheControl) - .body("Hello " + name); + .cacheControl(cacheControl) + .body("Hello " + name); } - @RequestMapping(value = "/home/{name}", method = RequestMethod.GET) + @GetMapping(value = "/home/{name}") public String home(@PathVariable String name, final HttpServletResponse response) { response.addHeader("Cache-Control", "max-age=60, must-revalidate, no-transform"); return "home"; } - @RequestMapping(value = "/cache/{name}", method = RequestMethod.GET) + @GetMapping(value = "/login/{name}") public ResponseEntity intercept(@PathVariable String name) { return ResponseEntity.ok().body("Hello " + name); } - @RequestMapping(value = "/validate/{name}", method = RequestMethod.GET) + @GetMapping(value = "/productInfo/{name}") public ResponseEntity validate(@PathVariable String name, WebRequest request) { ZoneId zoneId = ZoneId.of("GMT"); diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java index 728479979c..2f07912e80 100644 --- a/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java +++ b/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java @@ -35,7 +35,7 @@ public class WebConfig implements WebMvcConfigurer { WebContentInterceptor interceptor = new WebContentInterceptor(); interceptor.addCacheMapping(CacheControl.maxAge(60, TimeUnit.SECONDS) .noTransform() - .mustRevalidate(), "/cache/*"); + .mustRevalidate(), "/login/*"); registry.addInterceptor(interceptor); } } \ No newline at end of file diff --git a/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java index ef408038ae..7acfe5e480 100644 --- a/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java +++ b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java @@ -37,7 +37,8 @@ public class CacheControlControllerIntegrationTest { this.mockMvc.perform(MockMvcRequestBuilders.get("/hello/baeldung")) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.header().string("Cache-Control","max-age=60, must-revalidate, no-transform")); + .andExpect(MockMvcResultMatchers.header() + .string("Cache-Control","max-age=60, must-revalidate, no-transform")); } @Test @@ -59,7 +60,7 @@ public class CacheControlControllerIntegrationTest { @Test void whenInterceptor_thenReturnCacheHeader() throws Exception { - this.mockMvc.perform(MockMvcRequestBuilders.get("/cache/baeldung")) + this.mockMvc.perform(MockMvcRequestBuilders.get("/login/baeldung")) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.header().string("Cache-Control","max-age=60, must-revalidate, no-transform")); @@ -69,7 +70,7 @@ public class CacheControlControllerIntegrationTest { void whenValidate_thenReturnCacheHeader() throws Exception { HttpHeaders headers = new HttpHeaders(); headers.add(IF_UNMODIFIED_SINCE, "Tue, 04 Feb 2020 19:57:25 GMT"); - this.mockMvc.perform(MockMvcRequestBuilders.get("/validate/baeldung").headers(headers)) + this.mockMvc.perform(MockMvcRequestBuilders.get("/productInfo/baeldung").headers(headers)) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().is(304)); } From 34d04156fc8033181c42c956ff3ef148e8c9bc09 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:14:00 +0100 Subject: [PATCH 013/530] BAEL-3855 Lock Striping --- lock-striping/pom.xml | 43 ++++++++++++ .../baeldung/concurrent/lock/BenchMark.java | 66 +++++++++++++++++++ .../concurrent/lock/CoarseGrained.java | 39 +++++++++++ .../concurrent/lock/ConcurrentAccessMap.java | 33 ++++++++++ .../baeldung/concurrent/lock/LockStriped.java | 47 +++++++++++++ .../com/baeldung/concurrent/lock/NoLock.java | 34 ++++++++++ 6 files changed, 262 insertions(+) create mode 100644 lock-striping/pom.xml create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java create mode 100644 lock-striping/src/com/baeldung/concurrent/lock/NoLock.java diff --git a/lock-striping/pom.xml b/lock-striping/pom.xml new file mode 100644 index 0000000000..79469593cf --- /dev/null +++ b/lock-striping/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + com.baeldung.concurrent.lock + lock-striping + 0.0.1-SNAPSHOT + + + 1.21 + 28.2-jre + + + + + com.google.guava + guava + ${guava.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + src + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java new file mode 100644 index 0000000000..5aae5145d2 --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java @@ -0,0 +1,66 @@ +package com.baeldung.concurrent.lock; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +@State(Scope.Thread) +@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.MILLISECONDS) +@Measurement(iterations = 3, time = 1, timeUnit = TimeUnit.MILLISECONDS) +public class BenchMark { + ConcurrentAccessMap accessMyMap; + + @Param({"HashMap", "HashMap with Lock", "HashMap with Striped Lock", + "ConcurrentHashMap", "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) + private String type; + + @Setup + public void setup() { + switch (type) { + case "HashMap": + accessMyMap = new NoLock(getHashMap()); + break; + case "ConcurrentHashMap": + accessMyMap = new NoLock(getConcurrentHashMap()); + break; + case "HashMap with Lock": + accessMyMap = new CoarseGrained(getHashMap()); + break; + case "ConcurrentHashMap with Lock": + accessMyMap = new CoarseGrained(getConcurrentHashMap()); + break; + case "HashMap with Striped Lock": + accessMyMap = new LockStriped(getHashMap()); + break; + case "ConcurrentHashMap with Striped Lock": + accessMyMap = new LockStriped(getConcurrentHashMap()); + break; + } + } + + private Map getHashMap() { + return new HashMap(); + } + + private Map getConcurrentHashMap() { + return new ConcurrentHashMap(); + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void test() throws InterruptedException { + accessMyMap.doWork(type); + } +} diff --git a/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java b/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java new file mode 100644 index 0000000000..adc70fc3ab --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java @@ -0,0 +1,39 @@ +package com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; + +import com.google.common.base.Supplier; + +public class CoarseGrained extends ConcurrentAccessMap { + ReentrantLock lock; + + public CoarseGrained(Map map) { + super(map); + lock = new ReentrantLock(); + } + + protected Supplier putSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.put("key" + x, "value" + x); + lock.unlock(); + return null; + }); + } + + protected Supplier getSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.get("key" + x); + lock.unlock(); + return null; + }); + } +} diff --git a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java new file mode 100644 index 0000000000..87c305b8aa --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java @@ -0,0 +1,33 @@ +package com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import com.google.common.base.Supplier; + +public abstract class ConcurrentAccessMap { + static final int SLOTS = 4; + static final int THREADS = 10000; + static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; + private CompletableFuture[] requests; + Map map; + + public ConcurrentAccessMap(Map map) { + this.map = map; + } + + public final void doWork(String type) { + requests = new CompletableFuture[THREADS * SLOTS]; + + for (int i = 0; i < THREADS; i++) { + requests[SLOTS * i + 0] = CompletableFuture.supplyAsync(putSupplier(i)); + requests[SLOTS * i + 1] = CompletableFuture.supplyAsync(getSupplier(i)); + requests[SLOTS * i + 2] = CompletableFuture.supplyAsync(getSupplier(i)); + requests[SLOTS * i + 3] = CompletableFuture.supplyAsync(getSupplier(i)); + } + CompletableFuture.allOf(requests).join(); + } + + protected abstract Supplier putSupplier(int x); + protected abstract Supplier getSupplier(int x); +} diff --git a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java new file mode 100644 index 0000000000..91d72eb362 --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java @@ -0,0 +1,47 @@ +package com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.locks.Lock; + +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.Striped; + +public class LockStriped extends ConcurrentAccessMap { + Striped lock; + + public LockStriped(Map map) { + super(map); + lock = getStripedLock(); + } + + private Striped getStripedLock() { + Striped map = Striped.lock(BUCKETS); + return map; + } + + protected Supplier putSupplier(int x) { + return (()-> { + Lock currentLock = lock.get("key" + x); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.put("key" + x, "value" + x); + currentLock.unlock(); + return null; + }); + } + + protected Supplier getSupplier(int x) { + return (()-> { + Lock currentLock = lock.get("key" + x); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.get("key" + x); + currentLock.unlock(); + return null; + }); + } +} diff --git a/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java b/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java new file mode 100644 index 0000000000..f2d5b445d7 --- /dev/null +++ b/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java @@ -0,0 +1,34 @@ +package com.baeldung.concurrent.lock; + +import java.util.Map; + +import com.google.common.base.Supplier; + +public class NoLock extends ConcurrentAccessMap { + + public NoLock(Map map) { + super(map); + } + + protected Supplier putSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + map.put("key" + x, "value" + x); + done = true; + } + return null; + }); + } + + protected Supplier getSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + map.get("key" + x); + done = true; + } + return null; + }); + } +} \ No newline at end of file From 72ea7a14e6bf9e00ca20e592c5d49bc7376bc82b Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:26:24 +0100 Subject: [PATCH 014/530] BAEL-3855 --- .../baeldung/algorithms/greedy/Follower.java | 20 -------- .../algorithms/greedy/FollowersPath.java | 44 ----------------- .../algorithms/greedy/GreedyAlgorithm.java | 47 ------------------- .../algorithms/greedy/NonGreedyAlgorithm.java | 44 ----------------- .../algorithms/greedy/SocialConnector.java | 36 -------------- .../algorithms/greedy/SocialUser.java | 38 --------------- 6 files changed, 229 deletions(-) delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java deleted file mode 100644 index e24b29f5cb..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/Follower.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import lombok.Getter; - -public class Follower { - - @Getter String username; - @Getter long count; - - public Follower(String username, long count) { - super(); - this.username = username; - this.count = count; - } - - @Override - public String toString() { - return "User: " + username + ", Followers: " + count + "\n\r" ; - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java deleted file mode 100644 index 932037edb1..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/FollowersPath.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.ArrayList; -import java.util.List; - -public class FollowersPath { - - private List accounts; - private long count; - - public FollowersPath() { - super(); - this.accounts = new ArrayList<>(); - } - - public List getAccounts() { - return accounts; - } - public long getCount() { - return count; - } - - public void addFollower(String username, long count) { - accounts.add(new Follower(username, count)); - } - - public void addCount(long count) { - this.count += count; - } - - @Override - public String toString() { - String details = ""; - for(Follower a : accounts) { - details+=a.toString() + ", "; - } - - return "Total: " + count + ", \n\r" + - " Details: { " + "\n\r" + - details + "\n\r" + - " }"; - } - -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java deleted file mode 100644 index 891695e5dc..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/GreedyAlgorithm.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.List; - -public class GreedyAlgorithm { - - int currentLevel = 0; - final int maxLevel = 3; - SocialConnector sc; - FollowersPath fp; - - public GreedyAlgorithm(SocialConnector sc) { - super(); - this.sc = sc; - this.fp = new FollowersPath(); - } - - public long findMostFollowersPath(String account) throws Exception { - long max = 0; - SocialUser toFollow = null; - - List followers = sc.getFollowers(account); - for (SocialUser el : followers) { - long followersCount = el.getFollowersCount(); - if (followersCount > max) { - toFollow = el; - max = followersCount; - } - } - - if (currentLevel < maxLevel - 1) { - currentLevel++; - max += findMostFollowersPath(toFollow.getUsername()); - //fp.addFollower(toFollow.getUsername(), max); - //fp.addCount(max); - return max; - } else { - //fp.addFollower(toFollow.getUsername(), max); - //fp.addCount(max); - return max; - } - } - - public FollowersPath getFollowers() { - return fp; - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java deleted file mode 100644 index db8a47be11..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/NonGreedyAlgorithm.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.List; - -public class NonGreedyAlgorithm { - - int currentLevel = 0; - final int maxLevel = 3; - SocialConnector tc; - - public NonGreedyAlgorithm(SocialConnector tc, int level) { - super(); - this.tc = tc; - this.currentLevel = level; - } - - - public long findMostFollowersPath(String account) throws Exception { - List followers = tc.getFollowers(account); - long total = currentLevel > 0 ? followers.size() : 0; - - if (currentLevel < maxLevel ) { - currentLevel++; - - long[] count = new long[followers.size()]; - int i = 0; - for (SocialUser el : followers) { - NonGreedyAlgorithm sub = new NonGreedyAlgorithm(tc, currentLevel); - count[i] = sub.findMostFollowersPath(el.getUsername()); - i++; - } - - long max = 0; - for (; i > 0; i--) { - if (count[i-1] > max ) - max = count[i-1]; - } - - return total + max; - } - - return total; - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java deleted file mode 100644 index cdcf0df395..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialConnector.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -public class SocialConnector { - private boolean isCounterEnabled = true; - private int counter = 4; - @Getter @Setter List users; - - public SocialConnector() { - users = new ArrayList<>(); - } - - public boolean switchCounter() { - this.isCounterEnabled = !this.isCounterEnabled; - return this.isCounterEnabled; - } - - public List getFollowers(String account) throws Exception { - if (counter < 0) - throw new Exception ("API limit reached"); - else { - if(this.isCounterEnabled) counter--; - for(SocialUser user : users) { - if (user.getUsername().equals(account)) { - return user.getFollowers(); - } - } - } - return new ArrayList<>(); - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java deleted file mode 100644 index 33eab9e799..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/greedy/SocialUser.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Getter; - -public class SocialUser { - - @Getter private String username; - @Getter private List followers; - - public SocialUser(String username) { - super(); - this.username = username; - this.followers = new ArrayList<>(); - } - - public SocialUser(String username, List followers) { - super(); - this.username = username; - this.followers = followers; - } - - public long getFollowersCount() { - return followers.size(); - } - - public void addFollowers(List followers) { - this.followers.addAll(followers); - } - - @Override - public boolean equals(Object obj) { - return ((SocialUser) obj).getUsername().equals(username); - } - -} From 510c474ef568f59bdb3c0832385d971b41dd9747 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:27:45 +0100 Subject: [PATCH 015/530] BAEL-3855 --- .../greedy/GreedyAlgorithmUnitTest.java | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java deleted file mode 100644 index 3560657ace..0000000000 --- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baeldung.algorithms.greedy; - -import static org.junit.Assert.assertEquals; - -import java.util.Arrays; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class GreedyAlgorithmUnitTest { - - private SocialConnector prepareNetwork() { - SocialConnector sc = new SocialConnector(); - - SocialUser root = new SocialUser("root"); - SocialUser child1 = new SocialUser("child1"); - SocialUser child2 = new SocialUser("child2"); - SocialUser child3 = new SocialUser("child3"); - SocialUser child21 = new SocialUser("child21"); - SocialUser child211 = new SocialUser("child211"); - SocialUser child2111 = new SocialUser("child2111"); - SocialUser child31 = new SocialUser("child31"); - SocialUser child311 = new SocialUser("child311"); - SocialUser child3111 = new SocialUser("child3111"); - - - child211.addFollowers(Arrays.asList(new SocialUser[]{child2111})); - child311.addFollowers(Arrays.asList(new SocialUser[]{child3111})); - - child21.addFollowers(Arrays.asList(new SocialUser[]{child211})); - child31.addFollowers(Arrays.asList(new SocialUser[]{child311, - new SocialUser("child312"), new SocialUser("child313"), new SocialUser("child314")})); - - child1.addFollowers(Arrays.asList(new SocialUser[]{new SocialUser("child11"), new SocialUser("child12")})); - child2.addFollowers(Arrays.asList(new SocialUser[]{child21, new SocialUser("child22"), new SocialUser("child23")})); - child3.addFollowers(Arrays.asList(new SocialUser[]{child31})); - - root.addFollowers(Arrays.asList(new SocialUser[]{child1, child2, child3})); - - sc.setUsers(Arrays.asList(new SocialUser[]{root, child1, child2, child3, child21, child31, child311, child211})); - return sc; - } - - @Test - public void greedyAlgorithmTest() throws Exception { - GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork()); - assertEquals(ga.findMostFollowersPath("root"), 5); - } - - @Test - public void nongreedyAlgorithmTest() throws Exception { - NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0); - Assertions.assertThrows(Exception.class, () -> { - nga.findMostFollowersPath("root"); - }); - } - - @Test - public void nongreedyAlgorithmUnboundedTest() throws Exception { - SocialConnector sc = prepareNetwork(); - sc.switchCounter(); - NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0); - assertEquals(nga.findMostFollowersPath("root"), 6); - } - -} \ No newline at end of file From d144322c45d0a5f6940bfa9939307450c0de9291 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 19 Feb 2020 23:28:54 +0100 Subject: [PATCH 016/530] BAEL-3855 --- hexagonal-architecture-poc/pom.xml | 44 ------------------- .../HexagonalArchitecturePocApplication.java | 13 ------ .../boundary/input/OrderService.java | 11 ----- .../boundary/output/OrderRepository.java | 11 ----- .../hexagonal/core/entities/Order.java | 27 ------------ .../core/services/OrderServiceImpl.java | 35 --------------- .../hexagonal/outside/OrderController.java | 32 -------------- .../src/main/resources/application.properties | 5 --- 8 files changed, 178 deletions(-) delete mode 100644 hexagonal-architecture-poc/pom.xml delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java delete mode 100644 hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java delete mode 100644 hexagonal-architecture-poc/src/main/resources/application.properties diff --git a/hexagonal-architecture-poc/pom.xml b/hexagonal-architecture-poc/pom.xml deleted file mode 100644 index b31a6dec90..0000000000 --- a/hexagonal-architecture-poc/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.0.5.RELEASE - - - com.baeldung - hexagonal-architecture-poc - 0.0.1-SNAPSHOT - hexagonal-architecture-poc - Demo project for Hexagonal Architecture POC - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - runtime - - - org.springframework.boot - spring-boot-starter-web - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java deleted file mode 100644 index 1690fbbeb5..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/HexagonalArchitecturePocApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.hexagonal; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class HexagonalArchitecturePocApplication { - - public static void main(String[] args) { - SpringApplication.run(HexagonalArchitecturePocApplication.class, args); - } - -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java deleted file mode 100644 index 07793f75ab..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/input/OrderService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.hexagonal.boundary.input; - -import org.springframework.stereotype.Service; - -import com.baeldung.hexagonal.core.entities.Order; - -@Service public interface OrderService { - Iterable getOrders(); - Order createOrder(Double total); - boolean registerOrder(Order order); -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java deleted file mode 100644 index ea1d38d296..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/boundary/output/OrderRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.hexagonal.boundary.output; - -import java.util.List; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Repository; - -import com.baeldung.hexagonal.core.entities.Order; - -@Repository public interface OrderRepository extends CrudRepository{ -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java deleted file mode 100644 index db0c4efd54..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/entities/Order.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.hexagonal.core.entities; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity @Table(name="Orders") public class Order { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; - Double total; - - public Order() { - super(); - } - public Double getTotal() { - return total; - } - public void setTotal(Double total) { - this.total = total; - } - public Long getId() { - return id; - } - - -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java deleted file mode 100644 index d3d8f1ba6a..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/core/services/OrderServiceImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.hexagonal.core.services; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.hexagonal.boundary.input.OrderService; -import com.baeldung.hexagonal.boundary.output.OrderRepository; -import com.baeldung.hexagonal.core.entities.Order; - -@Service public class OrderServiceImpl implements OrderService { - - @Autowired OrderRepository orderRepository; - - @Override - public Iterable getOrders() { - return orderRepository.findAll(); - } - - @Override - public boolean registerOrder(Order order) { - if (order.getTotal() > 0) - orderRepository.save(order); - else - return false; - - return true; - } - - @Override - public Order createOrder(Double total) { - Order order = new Order(); - order.setTotal(total); - return order; - } -} diff --git a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java b/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java deleted file mode 100644 index 85c2e42368..0000000000 --- a/hexagonal-architecture-poc/src/main/java/com/baeldung/hexagonal/outside/OrderController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.hexagonal.outside; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.hexagonal.boundary.input.OrderService; -import com.baeldung.hexagonal.core.entities.Order; - -@RestController public class OrderController { - - @Autowired OrderService orderService; - - @GetMapping(path = "/orders/list") - public Iterable getOrders(){ - return orderService.getOrders(); - } - - @GetMapping(path = "/orders/add") - public String placeOrder(@RequestParam Double total) { - boolean isPlaced = orderService.registerOrder(orderService.createOrder(total)); - return isPlaced ? "Ok" : "Nok"; - } - - @GetMapping(path = "/orders/add-commission") - public String placeCommissionOrder(@RequestParam Double total) { - boolean isPlaced = orderService.registerOrder(orderService.createOrder(total*1.05)); - return isPlaced ? "Ok" : "Nok"; - } - -} diff --git a/hexagonal-architecture-poc/src/main/resources/application.properties b/hexagonal-architecture-poc/src/main/resources/application.properties deleted file mode 100644 index bc2fdde8c1..0000000000 --- a/hexagonal-architecture-poc/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -spring.datasource.url=jdbc:h2:mem:testdb -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect From d01b7be0b6476aad67aa9fad3ccdacd6d474d68e Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 21 Feb 2020 14:17:46 +0100 Subject: [PATCH 017/530] BAEL-3855 identation, moved to new module, removed needless classes, better benchmark --- lock-striping/pom.xml | 38 +++++----- .../baeldung/concurrent/lock/BenchMark.java | 49 ++++++------- .../concurrent/lock/CoarseGrained.java | 56 +++++++-------- .../concurrent/lock/ConcurrentAccessMap.java | 46 ++++++------ .../baeldung/concurrent/lock/LockStriped.java | 70 +++++++++---------- .../com/baeldung/concurrent/lock/NoLock.java | 34 --------- 6 files changed, 127 insertions(+), 166 deletions(-) delete mode 100644 lock-striping/src/com/baeldung/concurrent/lock/NoLock.java diff --git a/lock-striping/pom.xml b/lock-striping/pom.xml index 79469593cf..0e5310b9da 100644 --- a/lock-striping/pom.xml +++ b/lock-striping/pom.xml @@ -1,31 +1,31 @@ 4.0.0 com.baeldung.concurrent.lock - lock-striping + core-java-concurrency-collections-2 0.0.1-SNAPSHOT - + 1.21 28.2-jre - + - - com.google.guava - guava - ${guava.version} - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - + + com.google.guava + guava + ${guava.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + src diff --git a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java index 5aae5145d2..438bcb2f4b 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java @@ -6,6 +6,7 @@ import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; @@ -16,24 +17,18 @@ import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) -@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.MILLISECONDS) -@Measurement(iterations = 3, time = 1, timeUnit = TimeUnit.MILLISECONDS) +@Fork(value = 2) +@Warmup(iterations = 3) public class BenchMark { ConcurrentAccessMap accessMyMap; - - @Param({"HashMap", "HashMap with Lock", "HashMap with Striped Lock", - "ConcurrentHashMap", "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) + + @Param({"HashMap with Lock", "HashMap with Striped Lock", + "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) private String type; - - @Setup + + @Setup public void setup() { switch (type) { - case "HashMap": - accessMyMap = new NoLock(getHashMap()); - break; - case "ConcurrentHashMap": - accessMyMap = new NoLock(getConcurrentHashMap()); - break; case "HashMap with Lock": accessMyMap = new CoarseGrained(getHashMap()); break; @@ -48,19 +43,19 @@ public class BenchMark { break; } } - - private Map getHashMap() { - return new HashMap(); - } - - private Map getConcurrentHashMap() { - return new ConcurrentHashMap(); - } - - @Benchmark - @BenchmarkMode(Mode.Throughput) - @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void test() throws InterruptedException { + + private Map getHashMap() { + return new HashMap(); + } + + private Map getConcurrentHashMap() { + return new ConcurrentHashMap(); + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void test() throws InterruptedException { accessMyMap.doWork(type); - } + } } diff --git a/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java b/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java index adc70fc3ab..a9af3e1bba 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java @@ -6,34 +6,34 @@ import java.util.concurrent.locks.ReentrantLock; import com.google.common.base.Supplier; public class CoarseGrained extends ConcurrentAccessMap { - ReentrantLock lock; + ReentrantLock lock; - public CoarseGrained(Map map) { - super(map); - lock = new ReentrantLock(); - } + public CoarseGrained(Map map) { + super(map); + lock = new ReentrantLock(); + } - protected Supplier putSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - done = lock.tryLock(); - } - map.put("key" + x, "value" + x); - lock.unlock(); - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - done = lock.tryLock(); - } - map.get("key" + x); - lock.unlock(); - return null; - }); - } + protected Supplier putSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.put("key" + x, "value" + x); + lock.unlock(); + return null; + }); + } + + protected Supplier getSupplier(int x) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.get("key" + x); + lock.unlock(); + return null; + }); + } } diff --git a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java index 87c305b8aa..00b61cdc09 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java @@ -6,28 +6,28 @@ import java.util.concurrent.CompletableFuture; import com.google.common.base.Supplier; public abstract class ConcurrentAccessMap { - static final int SLOTS = 4; - static final int THREADS = 10000; - static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; - private CompletableFuture[] requests; - Map map; - - public ConcurrentAccessMap(Map map) { - this.map = map; - } - - public final void doWork(String type) { - requests = new CompletableFuture[THREADS * SLOTS]; + static final int SLOTS = 4; + static final int THREADS = 10000; + static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; + private CompletableFuture[] requests; + protected Map map; + + public ConcurrentAccessMap(Map map) { + this.map = map; + } - for (int i = 0; i < THREADS; i++) { - requests[SLOTS * i + 0] = CompletableFuture.supplyAsync(putSupplier(i)); - requests[SLOTS * i + 1] = CompletableFuture.supplyAsync(getSupplier(i)); - requests[SLOTS * i + 2] = CompletableFuture.supplyAsync(getSupplier(i)); - requests[SLOTS * i + 3] = CompletableFuture.supplyAsync(getSupplier(i)); + public final void doWork(String type) { + requests = new CompletableFuture[THREADS * SLOTS]; + + for (int i = 0; i < THREADS; i++) { + requests[SLOTS * i + 0] = CompletableFuture.supplyAsync(putSupplier(i)); + requests[SLOTS * i + 1] = CompletableFuture.supplyAsync(getSupplier(i)); + requests[SLOTS * i + 2] = CompletableFuture.supplyAsync(getSupplier(i)); + requests[SLOTS * i + 3] = CompletableFuture.supplyAsync(getSupplier(i)); } - CompletableFuture.allOf(requests).join(); - } - - protected abstract Supplier putSupplier(int x); - protected abstract Supplier getSupplier(int x); -} + CompletableFuture.allOf(requests).join(); + } + + protected abstract Supplier putSupplier(int x); + protected abstract Supplier getSupplier(int x); +} \ No newline at end of file diff --git a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java index 91d72eb362..f162c06f89 100644 --- a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java +++ b/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java @@ -7,41 +7,41 @@ import com.google.common.base.Supplier; import com.google.common.util.concurrent.Striped; public class LockStriped extends ConcurrentAccessMap { - Striped lock; + Striped lock; - public LockStriped(Map map) { - super(map); - lock = getStripedLock(); - } + public LockStriped(Map map) { + super(map); + lock = getStripedLock(); + } - private Striped getStripedLock() { - Striped map = Striped.lock(BUCKETS); - return map; - } - - protected Supplier putSupplier(int x) { - return (()-> { - Lock currentLock = lock.get("key" + x); - boolean done = false; - while(!done) { - done = currentLock.tryLock(); - } - map.put("key" + x, "value" + x); - currentLock.unlock(); - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - Lock currentLock = lock.get("key" + x); - boolean done = false; - while(!done) { - done = currentLock.tryLock(); - } - map.get("key" + x); - currentLock.unlock(); - return null; - }); - } + private Striped getStripedLock() { + Striped map = Striped.lock(BUCKETS); + return map; + } + + protected Supplier putSupplier(int x) { + return (()-> { + Lock currentLock = lock.get("key" + x); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.put("key" + x, "value" + x); + currentLock.unlock(); + return null; + }); + } + + protected Supplier getSupplier(int x) { + return (()-> { + Lock currentLock = lock.get("key" + x); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.get("key" + x); + currentLock.unlock(); + return null; + }); + } } diff --git a/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java b/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java deleted file mode 100644 index f2d5b445d7..0000000000 --- a/lock-striping/src/com/baeldung/concurrent/lock/NoLock.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.concurrent.lock; - -import java.util.Map; - -import com.google.common.base.Supplier; - -public class NoLock extends ConcurrentAccessMap { - - public NoLock(Map map) { - super(map); - } - - protected Supplier putSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - map.put("key" + x, "value" + x); - done = true; - } - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - map.get("key" + x); - done = true; - } - return null; - }); - } -} \ No newline at end of file From 41d82b78f5de6d0f247d4e39e8cd8c916427d788 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 22 Feb 2020 12:34:10 +0100 Subject: [PATCH 018/530] BAEL-3855 Tree update --- {lock-striping => core-java-concurrency-collections-2}/pom.xml | 0 .../src/com/baeldung/concurrent/lock/BenchMark.java | 0 .../src/com/baeldung/concurrent/lock/CoarseGrained.java | 0 .../src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java | 0 .../src/com/baeldung/concurrent/lock/LockStriped.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {lock-striping => core-java-concurrency-collections-2}/pom.xml (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/BenchMark.java (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/CoarseGrained.java (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java (100%) rename {lock-striping => core-java-concurrency-collections-2}/src/com/baeldung/concurrent/lock/LockStriped.java (100%) diff --git a/lock-striping/pom.xml b/core-java-concurrency-collections-2/pom.xml similarity index 100% rename from lock-striping/pom.xml rename to core-java-concurrency-collections-2/pom.xml diff --git a/lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/BenchMark.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java diff --git a/lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/CoarseGrained.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java b/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java similarity index 100% rename from lock-striping/src/com/baeldung/concurrent/lock/LockStriped.java rename to core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java From 0fc23d01e519741b417620f517041aef7747eadf Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 24 Feb 2020 10:10:02 +0100 Subject: [PATCH 019/530] BAEL-3855 tree fix --- .../{ => main/java}/com/baeldung/concurrent/lock/BenchMark.java | 0 .../java}/com/baeldung/concurrent/lock/CoarseGrained.java | 0 .../java}/com/baeldung/concurrent/lock/ConcurrentAccessMap.java | 0 .../{ => main/java}/com/baeldung/concurrent/lock/LockStriped.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/BenchMark.java (100%) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/CoarseGrained.java (100%) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/ConcurrentAccessMap.java (100%) rename core-java-concurrency-collections-2/src/{ => main/java}/com/baeldung/concurrent/lock/LockStriped.java (100%) diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/BenchMark.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/CoarseGrained.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/ConcurrentAccessMap.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java b/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java similarity index 100% rename from core-java-concurrency-collections-2/src/com/baeldung/concurrent/lock/LockStriped.java rename to core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java From 79be75cd74e17ae9000abbc025c81bb69cb80560 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 25 Feb 2020 10:31:59 +0100 Subject: [PATCH 020/530] BAEL-3855 Moved to java-core-modules folder --- .../core-java-concurrency-collections-2}/pom.xml | 0 .../src/main/java/com/baeldung/concurrent/lock/BenchMark.java | 0 .../src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java | 0 .../java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java | 0 .../src/main/java/com/baeldung/concurrent/lock/LockStriped.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/pom.xml (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/BenchMark.java (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java (100%) rename {core-java-concurrency-collections-2 => core-java-modules/core-java-concurrency-collections-2}/src/main/java/com/baeldung/concurrent/lock/LockStriped.java (100%) diff --git a/core-java-concurrency-collections-2/pom.xml b/core-java-modules/core-java-concurrency-collections-2/pom.xml similarity index 100% rename from core-java-concurrency-collections-2/pom.xml rename to core-java-modules/core-java-concurrency-collections-2/pom.xml diff --git a/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java diff --git a/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java similarity index 100% rename from core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java rename to core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java From ab784af235a2dc2ec9a8409ff9cc09c111c4ef6b Mon Sep 17 00:00:00 2001 From: mikr Date: Sat, 29 Feb 2020 16:12:08 +0100 Subject: [PATCH 021/530] JAVA-841 Standardize package in spring-security-modules-mvc-boot-2 module --- .../spring-security-mvc-boot-2/pom.xml | 11 +++++------ .../h2/H2JdbcAuthenticationApplication.java | 2 +- .../h2/config/SecurityConfiguration.java | 2 +- .../jdbcauthentication/h2/web/UserController.java | 2 +- .../mysql/MySqlJdbcAuthenticationApplication.java | 2 +- .../mysql/config/SecurityConfiguration.java | 2 +- .../jdbcauthentication/mysql/web/UserController.java | 2 +- .../postgre/PostgreJdbcAuthenticationApplication.java | 2 +- .../postgre/config/SecurityConfiguration.java | 2 +- .../postgre/web/UserController.java | 2 +- .../CustomAuthenticationProvider.java | 2 +- .../multipleauthproviders/MultipleAuthController.java | 2 +- .../MultipleAuthProvidersApplication.java | 2 +- .../MultipleAuthProvidersSecurityConfig.java | 2 +- .../MultipleEntryPointsApplication.java | 2 +- .../MultipleEntryPointsSecurityConfig.java | 2 +- .../baeldung/multipleentrypoints/PagesController.java | 2 +- .../multiplelogin/MultipleLoginApplication.java | 3 +-- .../multiplelogin/MultipleLoginMvcConfig.java | 4 +--- .../multiplelogin/MultipleLoginSecurityConfig.java | 2 +- .../baeldung/multiplelogin/UsersController.java | 2 +- .../baeldung/ssl/HttpsEnabledApplication.java | 2 +- .../{org => com}/baeldung/ssl/SecurityConfig.java | 2 +- .../{org => com}/baeldung/ssl/WelcomeController.java | 3 +-- .../jdbcauthentication/h2/SpringContextTest.java | 3 +-- .../h2/web/UserControllerLiveTest.java | 2 +- .../mysql/web/UserControllerLiveTest.java | 2 +- .../postgre/web/UserControllerLiveTest.java | 2 +- .../baeldung/web/HttpsApplicationIntegrationTest.java | 4 ++-- ...ltipleAuthProvidersApplicationIntegrationTest.java | 4 ++-- .../web/MultipleEntryPointsIntegrationTest.java | 4 ++-- 31 files changed, 38 insertions(+), 44 deletions(-) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java (92%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java (97%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/h2/web/UserController.java (89%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java (90%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java (95%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/mysql/web/UserController.java (88%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java (90%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java (93%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/jdbcauthentication/postgre/web/UserController.java (88%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multipleauthproviders/CustomAuthenticationProvider.java (96%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multipleauthproviders/MultipleAuthController.java (85%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java (92%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java (97%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java (92%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java (99%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multipleentrypoints/PagesController.java (96%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multiplelogin/MultipleLoginApplication.java (85%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multiplelogin/MultipleLoginMvcConfig.java (89%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multiplelogin/MultipleLoginSecurityConfig.java (99%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/multiplelogin/UsersController.java (95%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/ssl/HttpsEnabledApplication.java (95%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/ssl/SecurityConfig.java (95%) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/{org => com}/baeldung/ssl/WelcomeController.java (74%) rename spring-security-modules/spring-security-mvc-boot-2/src/test/java/{org => com}/baeldung/jdbcauthentication/h2/SpringContextTest.java (76%) rename spring-security-modules/spring-security-mvc-boot-2/src/test/java/{org => com}/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java (95%) rename spring-security-modules/spring-security-mvc-boot-2/src/test/java/{org => com}/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java (95%) rename spring-security-modules/spring-security-mvc-boot-2/src/test/java/{org => com}/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java (95%) rename spring-security-modules/spring-security-mvc-boot-2/src/test/java/{org => com}/baeldung/web/HttpsApplicationIntegrationTest.java (96%) rename spring-security-modules/spring-security-mvc-boot-2/src/test/java/{org => com}/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java (96%) rename spring-security-modules/spring-security-mvc-boot-2/src/test/java/{org => com}/baeldung/web/MultipleEntryPointsIntegrationTest.java (96%) diff --git a/spring-security-modules/spring-security-mvc-boot-2/pom.xml b/spring-security-modules/spring-security-mvc-boot-2/pom.xml index fca38b9714..799b3acd96 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/pom.xml +++ b/spring-security-modules/spring-security-mvc-boot-2/pom.xml @@ -227,16 +227,15 @@ - org.baeldung.custom.Application - - + + + com.baeldung.multiplelogin.MultipleLoginApplication - + - + 1.1.2 1.6.1 diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java similarity index 92% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java index 6936cdc560..d71885d73c 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.h2; +package com.baeldung.jdbcauthentication.h2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java index 8b8696f0b2..50dc5b6958 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.h2.config; +package com.baeldung.jdbcauthentication.h2.config; import javax.sql.DataSource; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/web/UserController.java similarity index 89% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/web/UserController.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/web/UserController.java index 0955061614..03271677a4 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/web/UserController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/h2/web/UserController.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.h2.web; +package com.baeldung.jdbcauthentication.h2.web; import java.security.Principal; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java similarity index 90% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java index 52934e0096..1f4c54e512 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.mysql; +package com.baeldung.jdbcauthentication.mysql; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java index 157c0be748..a0584818cd 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.mysql.config; +package com.baeldung.jdbcauthentication.mysql.config; import javax.sql.DataSource; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/web/UserController.java similarity index 88% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/web/UserController.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/web/UserController.java index f1060b5f78..ed15f8bfe6 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/web/UserController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/mysql/web/UserController.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.mysql.web; +package com.baeldung.jdbcauthentication.mysql.web; import java.security.Principal; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java similarity index 90% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java index 2c4d1a5255..4b074ef51d 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.postgre; +package com.baeldung.jdbcauthentication.postgre; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java similarity index 93% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java index ba79635852..85dc9d364c 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.postgre.config; +package com.baeldung.jdbcauthentication.postgre.config; import javax.sql.DataSource; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/web/UserController.java similarity index 88% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/web/UserController.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/web/UserController.java index c8fd3812b1..da85a46562 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/web/UserController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/jdbcauthentication/postgre/web/UserController.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.postgre.web; +package com.baeldung.jdbcauthentication.postgre.web; import java.security.Principal; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/CustomAuthenticationProvider.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/CustomAuthenticationProvider.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/CustomAuthenticationProvider.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/CustomAuthenticationProvider.java index 1a89c362cd..97a8d8ac2a 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/CustomAuthenticationProvider.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/CustomAuthenticationProvider.java @@ -1,4 +1,4 @@ -package org.baeldung.multipleauthproviders; +package com.baeldung.multipleauthproviders; import java.util.Collections; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthController.java similarity index 85% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthController.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthController.java index b63169bb00..0079c84c6c 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthController.java @@ -1,4 +1,4 @@ -package org.baeldung.multipleauthproviders; +package com.baeldung.multipleauthproviders; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java similarity index 92% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java index 1f641298c3..e1a437e9a9 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.multipleauthproviders; +package com.baeldung.multipleauthproviders; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java index 3819e981a2..aa2ffc9046 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.multipleauthproviders; +package com.baeldung.multipleauthproviders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java similarity index 92% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java index 847dab073e..4ed36f770f 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.multipleentrypoints; +package com.baeldung.multipleentrypoints; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java similarity index 99% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java index dc89c83cde..b6155fc100 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.multipleentrypoints; +package com.baeldung.multipleentrypoints; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/PagesController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/PagesController.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/PagesController.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/PagesController.java index b3462d4061..ba5028aea7 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/PagesController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multipleentrypoints/PagesController.java @@ -1,4 +1,4 @@ -package org.baeldung.multipleentrypoints; +package com.baeldung.multipleentrypoints; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginApplication.java similarity index 85% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginApplication.java index 90bb5e4260..abba2ba339 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.multiplelogin; +package com.baeldung.multiplelogin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,7 +7,6 @@ import org.springframework.context.annotation.PropertySource; @SpringBootApplication @PropertySource("classpath:application-defaults.properties") -@ComponentScan("org.baeldung.multiplelogin") public class MultipleLoginApplication { public static void main(String[] args) { SpringApplication.run(MultipleLoginApplication.class, args); diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginMvcConfig.java similarity index 89% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginMvcConfig.java index 204b186411..86b3314c7c 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginMvcConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.multiplelogin; +package com.baeldung.multiplelogin; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -6,14 +6,12 @@ import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.context.annotation.ComponentScan; @EnableWebMvc @Configuration -@ComponentScan("org.baeldung.controller") public class MultipleLoginMvcConfig implements WebMvcConfigurer { public MultipleLoginMvcConfig() { diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginSecurityConfig.java similarity index 99% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginSecurityConfig.java index 9962bf41a9..3d12951f39 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/MultipleLoginSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.multiplelogin; +package com.baeldung.multiplelogin; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/UsersController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/UsersController.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/UsersController.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/UsersController.java index 61d7da127c..03be0fd6b2 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/UsersController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/multiplelogin/UsersController.java @@ -1,4 +1,4 @@ -package org.baeldung.multiplelogin; +package com.baeldung.multiplelogin; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/HttpsEnabledApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/HttpsEnabledApplication.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/HttpsEnabledApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/HttpsEnabledApplication.java index 17c249067c..f6a550ae54 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/HttpsEnabledApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/HttpsEnabledApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.ssl; +package com.baeldung.ssl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/SecurityConfig.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/SecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/SecurityConfig.java index 92f92d8fc7..4bddf0592a 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/SecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/SecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.ssl; +package com.baeldung.ssl; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/WelcomeController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/WelcomeController.java similarity index 74% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/WelcomeController.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/WelcomeController.java index 72ad8abb85..2bd8c8cfde 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/WelcomeController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/ssl/WelcomeController.java @@ -1,8 +1,7 @@ -package org.baeldung.ssl; +package com.baeldung.ssl; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseBody; @Controller public class WelcomeController { diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/h2/SpringContextTest.java similarity index 76% rename from spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/h2/SpringContextTest.java index 659dad9155..5bd2a0ce27 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/h2/SpringContextTest.java @@ -1,6 +1,5 @@ -package org.baeldung.jdbcauthentication.h2; +package com.baeldung.jdbcauthentication.h2; -import org.baeldung.jdbcauthentication.h2.H2JdbcAuthenticationApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java index 638e9d7919..12b5ca5867 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.h2.web; +package com.baeldung.jdbcauthentication.h2.web; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java index 261063cbb6..79bc84ea69 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.mysql.web; +package com.baeldung.jdbcauthentication.mysql.web; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java index 82bf6df8db..e6426a843e 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.jdbcauthentication.postgre.web; +package com.baeldung.jdbcauthentication.postgre.web; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/HttpsApplicationIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/HttpsApplicationIntegrationTest.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/HttpsApplicationIntegrationTest.java rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/HttpsApplicationIntegrationTest.java index fe7883ec94..63d47e6a46 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/HttpsApplicationIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/HttpsApplicationIntegrationTest.java @@ -1,10 +1,10 @@ -package org.baeldung.web; +package com.baeldung.web; import org.apache.http.client.HttpClient; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContextBuilder; -import org.baeldung.ssl.HttpsEnabledApplication; +import com.baeldung.ssl.HttpsEnabledApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java index 9ef09f1f67..c5ef469fe8 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java @@ -1,10 +1,10 @@ -package org.baeldung.web; +package com.baeldung.web; import static org.assertj.core.api.Assertions.assertThat; import java.util.Collections; -import org.baeldung.multipleauthproviders.MultipleAuthProvidersApplication; +import com.baeldung.multipleauthproviders.MultipleAuthProvidersApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/MultipleEntryPointsIntegrationTest.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/MultipleEntryPointsIntegrationTest.java index 422be2ac88..352b4af244 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/web/MultipleEntryPointsIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package com.baeldung.web; import org.junit.Before; import org.junit.Test; @@ -15,7 +15,7 @@ import org.springframework.web.context.WebApplicationContext; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -import org.baeldung.multipleentrypoints.MultipleEntryPointsApplication; +import com.baeldung.multipleentrypoints.MultipleEntryPointsApplication; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; From 523ad7f7767fa6f17f7e468e19ec78e7e5860518 Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Sat, 7 Mar 2020 15:21:12 +0100 Subject: [PATCH 022/530] java abstract number class --- .../AbstractNumberUnitTest.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 java-numbers-3/src/test/java/com/baeldung/abstractnumber/AbstractNumberUnitTest.java diff --git a/java-numbers-3/src/test/java/com/baeldung/abstractnumber/AbstractNumberUnitTest.java b/java-numbers-3/src/test/java/com/baeldung/abstractnumber/AbstractNumberUnitTest.java new file mode 100644 index 0000000000..521f2d37a6 --- /dev/null +++ b/java-numbers-3/src/test/java/com/baeldung/abstractnumber/AbstractNumberUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.abstractnumber; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class AbstractNumberUnitTest { + + private final static double DOUBLE_VALUE = 9999.999; + private final static float FLOAT_VALUE = 101.99F; + private final static long LONG_VALUE = 1000L; + private final static int INTEGER_VALUE = 100; + private final static short SHORT_VALUE = 127; + private final static byte BYTE_VALUE = 120; + + @Test + public void givenDoubleValue_whenShortValueUsed_thenShortValueReturned() { + Double doubleValue = Double.valueOf(DOUBLE_VALUE); + assertEquals(9999, doubleValue.shortValue()); + } + + @Test + public void givenFloatValue_whenByteValueUsed_thenByteValueReturned() { + Float floatValue = Float.valueOf(FLOAT_VALUE); + assertEquals(101, floatValue.byteValue()); + } + + @Test + public void givenLongValue_whenInitValueUsed_thenInitValueReturned() { + Long longValue = Long.valueOf(LONG_VALUE); + assertEquals(1000, longValue.intValue()); + } + + @Test + public void givenIntegerValue_whenLongValueUsed_thenLongValueReturned() { + Integer integerValue = Integer.valueOf(INTEGER_VALUE); + assertEquals(100, integerValue.longValue()); + } + + @Test + public void givenShortValue_whenFloatValueUsed_thenFloatValueReturned() { + Short shortValue = Short.valueOf(SHORT_VALUE); + assertEquals(127.0F, shortValue.floatValue(), 0); + } + + @Test + public void givenByteValue_whenDoubleValueUsed_thenDoubleValueReturned() { + Byte byteValue = Byte.valueOf(BYTE_VALUE); + assertEquals(120.0, byteValue.doubleValue(), 0); + } + +} From 636e76ade03ef610f4ceee65886b97c32f7d0ea2 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 9 Mar 2020 16:43:35 +0100 Subject: [PATCH 023/530] BAEL-3855 Updated --- .../baeldung/concurrent/lock/BenchMark.java | 47 +++++++---------- .../concurrent/lock/ConcurrentAccessMap.java | 51 ++++++++++++------- .../baeldung/concurrent/lock/SingleLock.java | 38 ++++++++++++++ .../baeldung/concurrent/lock/StripedLock.java | 46 +++++++++++++++++ 4 files changed, 134 insertions(+), 48 deletions(-) create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java index 438bcb2f4b..5d9e382351 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java @@ -1,13 +1,9 @@ -package com.baeldung.concurrent.lock; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +package main.java.com.baeldung.concurrent.lock; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; @@ -17,45 +13,36 @@ import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) -@Fork(value = 2) -@Warmup(iterations = 3) +@Fork(value = 1) +@Warmup(iterations = 0) public class BenchMark { ConcurrentAccessMap accessMyMap; + static final int SLOTS = 4; + static final int THREADS = 1000; + static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; - @Param({"HashMap with Lock", "HashMap with Striped Lock", - "ConcurrentHashMap with Lock", "ConcurrentHashMap with Striped Lock"}) - private String type; + @Param({"Single Lock", "Striped Lock"}) + private String lockType; + @Param({"HashMap", "ConcurrentHashMap"}) + private String mapType; + @Setup public void setup() { - switch (type) { - case "HashMap with Lock": - accessMyMap = new CoarseGrained(getHashMap()); + switch (lockType) { + case "Single Lock": + accessMyMap = new SingleLock(); break; - case "ConcurrentHashMap with Lock": - accessMyMap = new CoarseGrained(getConcurrentHashMap()); - break; - case "HashMap with Striped Lock": - accessMyMap = new LockStriped(getHashMap()); - break; - case "ConcurrentHashMap with Striped Lock": - accessMyMap = new LockStriped(getConcurrentHashMap()); + case "Striped Lock": + accessMyMap = new StripedLock(BUCKETS); break; } } - private Map getHashMap() { - return new HashMap(); - } - - private Map getConcurrentHashMap() { - return new ConcurrentHashMap(); - } - @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public void test() throws InterruptedException { - accessMyMap.doWork(type); + accessMyMap.doWork(mapType, THREADS, SLOTS); } } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java index 00b61cdc09..e5fcd6d406 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java @@ -1,33 +1,48 @@ -package com.baeldung.concurrent.lock; +package main.java.com.baeldung.concurrent.lock; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import com.google.common.base.Supplier; public abstract class ConcurrentAccessMap { - static final int SLOTS = 4; - static final int THREADS = 10000; - static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; - private CompletableFuture[] requests; - protected Map map; - public ConcurrentAccessMap(Map map) { - this.map = map; + public ConcurrentAccessMap() { + } + + private Map getHashMap() { + return new HashMap(); } - public final void doWork(String type) { - requests = new CompletableFuture[THREADS * SLOTS]; + private Map getConcurrentHashMap() { + return new ConcurrentHashMap(); + } + + private Map setup(String type) { + switch (type) { + case "HashMap": + return getHashMap(); + case "ConcurrentHashMap": + return getConcurrentHashMap(); + } + return null; + } - for (int i = 0; i < THREADS; i++) { - requests[SLOTS * i + 0] = CompletableFuture.supplyAsync(putSupplier(i)); - requests[SLOTS * i + 1] = CompletableFuture.supplyAsync(getSupplier(i)); - requests[SLOTS * i + 2] = CompletableFuture.supplyAsync(getSupplier(i)); - requests[SLOTS * i + 3] = CompletableFuture.supplyAsync(getSupplier(i)); - } + public final void doWork(String type, int threads, int slots) { + CompletableFuture[] requests = new CompletableFuture[threads * slots]; + Map map = setup(type); + + for (int i = 0; i < threads; i++) { + requests[slots * i + 0] = CompletableFuture.supplyAsync(putSupplier(map, i)); + requests[slots * i + 1] = CompletableFuture.supplyAsync(getSupplier(map, i)); + requests[slots * i + 2] = CompletableFuture.supplyAsync(getSupplier(map, i)); + requests[slots * i + 3] = CompletableFuture.supplyAsync(getSupplier(map, i)); + } CompletableFuture.allOf(requests).join(); } - protected abstract Supplier putSupplier(int x); - protected abstract Supplier getSupplier(int x); + protected abstract Supplier putSupplier(Map map, int key); + protected abstract Supplier getSupplier(Map map, int key); } \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java new file mode 100644 index 0000000000..4f0fe0222a --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -0,0 +1,38 @@ +package main.java.com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; + +import com.google.common.base.Supplier; + +public class SingleLock extends ConcurrentAccessMap { + ReentrantLock lock; + + public SingleLock() { + lock = new ReentrantLock(); + } + + protected synchronized Supplier putSupplier(Map map, int key) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.put("key" + key, "value" + key); + lock.unlock(); + return null; + }); + } + + protected synchronized Supplier getSupplier(Map map, int key) { + return (()-> { + boolean done = false; + while(!done) { + done = lock.tryLock(); + } + map.get("key" + key); + lock.unlock(); + return null; + }); + } +} diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java new file mode 100644 index 0000000000..fe98dd82be --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -0,0 +1,46 @@ +package main.java.com.baeldung.concurrent.lock; + +import java.util.Map; +import java.util.concurrent.locks.Lock; + +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.Striped; + +public class StripedLock extends ConcurrentAccessMap { + Striped lock; + + public StripedLock(int buckets) { + lock = getStripedLock(buckets); + } + + private Striped getStripedLock(int buckets) { + Striped map = Striped.lock(buckets); + return map; + } + + protected synchronized Supplier putSupplier(Map map, int key) { + return (()-> { + Lock currentLock = lock.get("key" + key); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.put("key" + key, "value" + key); + currentLock.unlock(); + return null; + }); + } + + protected synchronized Supplier getSupplier(Map map, int key) { + return (()-> { + Lock currentLock = lock.get("key" + key); + boolean done = false; + while(!done) { + done = currentLock.tryLock(); + } + map.get("key" + key); + currentLock.unlock(); + return null; + }); + } +} From ae6aaf40f057741fec9429fa5ba1e6576fe6310f Mon Sep 17 00:00:00 2001 From: Florin Hriscu Date: Tue, 10 Mar 2020 00:50:53 +0200 Subject: [PATCH 024/530] BAEL-3859 - Add implementation for AtomicMarkableReference article. --- .../AtomicMarkableReferenceUnitTest.java | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java new file mode 100644 index 0000000000..b864c78559 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java @@ -0,0 +1,193 @@ +package com.baeldung.concurrent.atomic; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicMarkableReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class AtomicMarkableReferenceUnitTest { + + private AtomicMarkableReference employeeNode; + + class Employee { + private int id; + private String name; + + Employee(int id, String name) { + this.id = id; + this.name = name; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof Employee)) + return false; + Employee employee = (Employee) obj; + return id == employee.id && name.equals(employee.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + } + + @Test + void givenMarkValueAsTrue_whenUsingIsMarkedMethod_thenMarkValueShouldBeTrue() { + employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), true); + + Assertions.assertTrue(employeeNode.isMarked()); + } + + @Test + void givenMarkValueAsFalse_whenUsingIsMarkedMethod_thenMarkValueShouldBeFalse() { + employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), false); + + Assertions.assertFalse(employeeNode.isMarked()); + } + + @Test + void whenUsingGetReferenceMethod_thenCurrentReferenceShouldBeReturned() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, false); + + Assertions.assertEquals(employeeNode.getReference(), employee); + } + + @Test + void whenUsingGetMethod_thenCurrentReferenceAndMarkShouldBeReturned() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + + boolean[] markHolder = new boolean[1]; + Employee currentEmployee = employeeNode.get(markHolder); + + Assertions.assertEquals(currentEmployee, employee); + Assertions.assertTrue(markHolder[0]); + } + + @Test + void givenNewReferenceAndMark_whenUsingSetMethod_thenCurrentReferenceAndMarkShouldBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + + Employee newEmployee = new Employee(124, "John"); + employeeNode.set(newEmployee, false); + + Assertions.assertEquals(employeeNode.getReference(), newEmployee); + Assertions.assertFalse(employeeNode.isMarked()); + } + + @Test + void givenTheSameObjectReference_whenUsingAttemptMarkMethod_thenMarkShouldBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + + Assertions.assertTrue(employeeNode.attemptMark(employee, false)); + Assertions.assertFalse(employeeNode.isMarked()); + } + + @Test + void givenDifferentObjectReference_whenUsingAttemptMarkMethod_thenMarkShouldNotBeUpdated() { + Employee employee = new Employee(123, "Mike"); + Employee expectedEmployee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + + Assertions.assertFalse(employeeNode.attemptMark(expectedEmployee, false)); + Assertions.assertTrue(employeeNode.isMarked()); + } + + @Test + void givenCurrentReferenceAndCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertTrue(employeeNode.compareAndSet(employee, newEmployee, true, false)); + Assertions.assertEquals(employeeNode.getReference(), newEmployee); + Assertions.assertFalse(employeeNode.isMarked()); + } + + @Test + void givenNotCurrentReferenceAndCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertFalse(employeeNode.compareAndSet(new Employee(1234, "Steve"), newEmployee, true, false)); + Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertTrue(employeeNode.isMarked()); + } + + @Test + void givenCurrentReferenceAndNotCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertFalse(employeeNode.compareAndSet(employee, newEmployee, false, true)); + Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertTrue(employeeNode.isMarked()); + } + + @Test + void givenNotCurrentReferenceAndNotCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertFalse(employeeNode.compareAndSet(new Employee(1234, "Steve"), newEmployee, false, true)); + Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertTrue(employeeNode.isMarked()); + } + + @Test + void givenCurrentReferenceAndCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertTrue(employeeNode.weakCompareAndSet(employee, newEmployee, true, false)); + Assertions.assertEquals(employeeNode.getReference(), newEmployee); + Assertions.assertFalse(employeeNode.isMarked()); + } + + @Test + void givenNotCurrentReferenceAndCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { + Employee expectedEmployee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(expectedEmployee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertFalse(employeeNode.weakCompareAndSet(new Employee(1234, "Steve"), newEmployee, true, false)); + Assertions.assertEquals(employeeNode.getReference(), expectedEmployee); + Assertions.assertTrue(employeeNode.isMarked()); + } + + @Test + void givenCurrentReferenceAndNotCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { + Employee expectedEmployee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(expectedEmployee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertFalse(employeeNode.weakCompareAndSet(expectedEmployee, newEmployee, false, true)); + Assertions.assertEquals(employeeNode.getReference(), expectedEmployee); + Assertions.assertTrue(employeeNode.isMarked()); + } + + @Test + void givenNotCurrentReferenceAndNotCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { + Employee employee = new Employee(123, "Mike"); + employeeNode = new AtomicMarkableReference(employee, true); + Employee newEmployee = new Employee(124, "John"); + + Assertions.assertFalse(employeeNode.weakCompareAndSet(new Employee(1234, "Steve"), newEmployee, false, true)); + Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertTrue(employeeNode.isMarked()); + } +} From 9860318a485ac6705f4457f2d49d4460df331975 Mon Sep 17 00:00:00 2001 From: ramkumarvenkat Date: Tue, 10 Mar 2020 16:35:00 +0530 Subject: [PATCH 025/530] Guava MapMaker --- .../guava/mapmaker/GuavaMapMakerUnitTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java diff --git a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java new file mode 100644 index 0000000000..36c0cd8493 --- /dev/null +++ b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.guava.mapmaker; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertEquals; + +import com.google.common.collect.MapMaker; +import org.junit.Test; + +import java.util.concurrent.ConcurrentMap; + +public class GuavaMapMakerUnitTest { + @Test + public void whenMakeMap_thenCreated() { + ConcurrentMap m = new MapMaker() + .makeMap(); + assertNotNull(m); + } + + @Test + public void whenMakeMapWithWeakKeys_thenCreated() { + ConcurrentMap m = new MapMaker() + .weakKeys() + .makeMap(); + assertNotNull(m); + } + + @Test + public void whenMakeMapWithWeakValues_thenCreated() { + ConcurrentMap m = new MapMaker() + .weakValues() + .makeMap(); + assertNotNull(m); + } + + @Test + public void whenMakeMapWithInitialCapacity_thenCreated() { + ConcurrentMap m = new MapMaker() + .initialCapacity(10) + .makeMap(); + assertNotNull(m); + } + + @Test + public void whenMakeMapWithConcurrencyLevel_thenCreated() { + ConcurrentMap m = new MapMaker() + .concurrencyLevel(10) + .makeMap(); + assertNotNull(m); + } +} From 1470deb1878580e3e46a8ebcbb1538c4d94df0da Mon Sep 17 00:00:00 2001 From: mguarnaccia Date: Wed, 11 Mar 2020 11:20:37 +0100 Subject: [PATCH 026/530] Delete CoarseGrained.java --- .../concurrent/lock/CoarseGrained.java | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java deleted file mode 100644 index a9af3e1bba..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/CoarseGrained.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.concurrent.lock; - -import java.util.Map; -import java.util.concurrent.locks.ReentrantLock; - -import com.google.common.base.Supplier; - -public class CoarseGrained extends ConcurrentAccessMap { - ReentrantLock lock; - - public CoarseGrained(Map map) { - super(map); - lock = new ReentrantLock(); - } - - protected Supplier putSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - done = lock.tryLock(); - } - map.put("key" + x, "value" + x); - lock.unlock(); - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - boolean done = false; - while(!done) { - done = lock.tryLock(); - } - map.get("key" + x); - lock.unlock(); - return null; - }); - } -} From 52608c32cbee8cb73f261a78106ae9417cbfe615 Mon Sep 17 00:00:00 2001 From: mguarnaccia Date: Wed, 11 Mar 2020 11:21:01 +0100 Subject: [PATCH 027/530] Delete LockStriped.java --- .../baeldung/concurrent/lock/LockStriped.java | 47 ------------------- 1 file changed, 47 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java deleted file mode 100644 index f162c06f89..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/LockStriped.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.concurrent.lock; - -import java.util.Map; -import java.util.concurrent.locks.Lock; - -import com.google.common.base.Supplier; -import com.google.common.util.concurrent.Striped; - -public class LockStriped extends ConcurrentAccessMap { - Striped lock; - - public LockStriped(Map map) { - super(map); - lock = getStripedLock(); - } - - private Striped getStripedLock() { - Striped map = Striped.lock(BUCKETS); - return map; - } - - protected Supplier putSupplier(int x) { - return (()-> { - Lock currentLock = lock.get("key" + x); - boolean done = false; - while(!done) { - done = currentLock.tryLock(); - } - map.put("key" + x, "value" + x); - currentLock.unlock(); - return null; - }); - } - - protected Supplier getSupplier(int x) { - return (()-> { - Lock currentLock = lock.get("key" + x); - boolean done = false; - while(!done) { - done = currentLock.tryLock(); - } - map.get("key" + x); - currentLock.unlock(); - return null; - }); - } -} From ff4ac10bb2b8f3f0ba74e0ff084f56dff634dee6 Mon Sep 17 00:00:00 2001 From: Michele Date: Wed, 11 Mar 2020 13:19:25 +0100 Subject: [PATCH 028/530] BAEL-3855 --- .../baeldung/concurrent/lock/BenchMark.java | 48 ------------------- .../concurrent/lock/ConcurrentAccessMap.java | 48 ------------------- .../baeldung/concurrent/lock/SingleLock.java | 26 ++++++---- .../baeldung/concurrent/lock/StripedLock.java | 26 ++++++---- 4 files changed, 32 insertions(+), 116 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java delete mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java deleted file mode 100644 index 5d9e382351..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/BenchMark.java +++ /dev/null @@ -1,48 +0,0 @@ -package main.java.com.baeldung.concurrent.lock; -import java.util.concurrent.TimeUnit; - -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.Warmup; - -@State(Scope.Thread) -@Fork(value = 1) -@Warmup(iterations = 0) -public class BenchMark { - ConcurrentAccessMap accessMyMap; - static final int SLOTS = 4; - static final int THREADS = 1000; - static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; - - @Param({"Single Lock", "Striped Lock"}) - private String lockType; - - @Param({"HashMap", "ConcurrentHashMap"}) - private String mapType; - - @Setup - public void setup() { - switch (lockType) { - case "Single Lock": - accessMyMap = new SingleLock(); - break; - case "Striped Lock": - accessMyMap = new StripedLock(BUCKETS); - break; - } - } - - @Benchmark - @BenchmarkMode(Mode.Throughput) - @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void test() throws InterruptedException { - accessMyMap.doWork(mapType, THREADS, SLOTS); - } -} diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java deleted file mode 100644 index e5fcd6d406..0000000000 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessMap.java +++ /dev/null @@ -1,48 +0,0 @@ -package main.java.com.baeldung.concurrent.lock; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; - -import com.google.common.base.Supplier; - -public abstract class ConcurrentAccessMap { - - public ConcurrentAccessMap() { - } - - private Map getHashMap() { - return new HashMap(); - } - - private Map getConcurrentHashMap() { - return new ConcurrentHashMap(); - } - - private Map setup(String type) { - switch (type) { - case "HashMap": - return getHashMap(); - case "ConcurrentHashMap": - return getConcurrentHashMap(); - } - return null; - } - - public final void doWork(String type, int threads, int slots) { - CompletableFuture[] requests = new CompletableFuture[threads * slots]; - Map map = setup(type); - - for (int i = 0; i < threads; i++) { - requests[slots * i + 0] = CompletableFuture.supplyAsync(putSupplier(map, i)); - requests[slots * i + 1] = CompletableFuture.supplyAsync(getSupplier(map, i)); - requests[slots * i + 2] = CompletableFuture.supplyAsync(getSupplier(map, i)); - requests[slots * i + 3] = CompletableFuture.supplyAsync(getSupplier(map, i)); - } - CompletableFuture.allOf(requests).join(); - } - - protected abstract Supplier putSupplier(Map map, int key); - protected abstract Supplier getSupplier(Map map, int key); -} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 4f0fe0222a..8a3106f650 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -1,11 +1,11 @@ -package main.java.com.baeldung.concurrent.lock; +package com.baeldung.concurrent.lock; import java.util.Map; import java.util.concurrent.locks.ReentrantLock; import com.google.common.base.Supplier; -public class SingleLock extends ConcurrentAccessMap { +public class SingleLock extends ConcurrentAccessExperiment { ReentrantLock lock; public SingleLock() { @@ -15,11 +15,14 @@ public class SingleLock extends ConcurrentAccessMap { protected synchronized Supplier putSupplier(Map map, int key) { return (()-> { boolean done = false; - while(!done) { - done = lock.tryLock(); + try { + while(!done) { + done = lock.tryLock(); + } + map.put("key" + key, "value" + key); + } finally { + lock.unlock(); } - map.put("key" + key, "value" + key); - lock.unlock(); return null; }); } @@ -27,11 +30,14 @@ public class SingleLock extends ConcurrentAccessMap { protected synchronized Supplier getSupplier(Map map, int key) { return (()-> { boolean done = false; - while(!done) { - done = lock.tryLock(); + try { + while(!done) { + done = lock.tryLock(); + } + map.get("key" + key); + } finally { + lock.unlock(); } - map.get("key" + key); - lock.unlock(); return null; }); } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index fe98dd82be..fad7243bf4 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -1,4 +1,4 @@ -package main.java.com.baeldung.concurrent.lock; +package com.baeldung.concurrent.lock; import java.util.Map; import java.util.concurrent.locks.Lock; @@ -6,7 +6,7 @@ import java.util.concurrent.locks.Lock; import com.google.common.base.Supplier; import com.google.common.util.concurrent.Striped; -public class StripedLock extends ConcurrentAccessMap { +public class StripedLock extends ConcurrentAccessExperiment { Striped lock; public StripedLock(int buckets) { @@ -22,11 +22,14 @@ public class StripedLock extends ConcurrentAccessMap { return (()-> { Lock currentLock = lock.get("key" + key); boolean done = false; - while(!done) { - done = currentLock.tryLock(); + try { + while(!done) { + done = currentLock.tryLock(); + } + map.put("key" + key, "value" + key); + } finally { + currentLock.unlock(); } - map.put("key" + key, "value" + key); - currentLock.unlock(); return null; }); } @@ -35,11 +38,14 @@ public class StripedLock extends ConcurrentAccessMap { return (()-> { Lock currentLock = lock.get("key" + key); boolean done = false; - while(!done) { - done = currentLock.tryLock(); + try { + while(!done) { + done = currentLock.tryLock(); + } + map.get("key" + key); + } finally { + currentLock.unlock(); } - map.get("key" + key); - currentLock.unlock(); return null; }); } From 7cbc45c95aa939462b93db5cc2e987c2259600fe Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:15:02 +0530 Subject: [PATCH 029/530] JAVA-4 : Module pom update --- persistence-modules/pom.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 15b62d5d77..2e9b033b79 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -21,9 +21,13 @@ flyway hbase hibernate5 - hibernate5-2 hibernate-mapping hibernate-ogm + hibernate5-mapping + hibernate5-annotations + hibernate5-jpa + hibernate5-queries + hibernate5-enterprise influxdb java-cassandra java-cockroachdb From 25d015b3dfb6f62a1c6493c66225a3dc9e14c3fb Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:17:43 +0530 Subject: [PATCH 030/530] JAVA-4 : Removed hibernate5-2 module, moved its artifacts to other modules - hibernate-jpa and hibernate-enterprise --- persistence-modules/hibernate5-2/README.md | 11 --- persistence-modules/hibernate5-2/pom.xml | 74 --------------- .../baeldung/hibernate/logging/Employee.java | 59 ------------ .../baeldung/hibernateparameters/Event.java | 30 ------- .../PersistenceContextDemoApplication.java | 13 --- .../persistencecontext/entity/User.java | 36 -------- ...ExtendedPersistenceContextUserService.java | 33 ------- ...ansctionPersistenceContextUserService.java | 32 ------- .../hibernateparameters/Event.hbm.xml | 15 ---- .../main/resources/hibernate-logging.cfg.xml | 27 ------ .../src/main/resources/hibernate.cfg.xml | 28 ------ .../HibernateLoggingIntegrationTest.java | 50 ----------- .../NamedParameterUnitTest.java | 73 --------------- .../PersistenceContextIntegrationTest.java | 90 ------------------- .../hibernate5-2/src/test/resources/log4j.xml | 25 ------ .../src/test/resources/log4j2.xml | 18 ---- .../src/test/resources/logback.xml | 18 ---- 17 files changed, 632 deletions(-) delete mode 100644 persistence-modules/hibernate5-2/README.md delete mode 100644 persistence-modules/hibernate5-2/pom.xml delete mode 100644 persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java delete mode 100644 persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernateparameters/Event.java delete mode 100644 persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java delete mode 100644 persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/entity/User.java delete mode 100644 persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java delete mode 100644 persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java delete mode 100644 persistence-modules/hibernate5-2/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml delete mode 100644 persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml delete mode 100644 persistence-modules/hibernate5-2/src/main/resources/hibernate.cfg.xml delete mode 100644 persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java delete mode 100644 persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java delete mode 100644 persistence-modules/hibernate5-2/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java delete mode 100644 persistence-modules/hibernate5-2/src/test/resources/log4j.xml delete mode 100644 persistence-modules/hibernate5-2/src/test/resources/log4j2.xml delete mode 100644 persistence-modules/hibernate5-2/src/test/resources/logback.xml diff --git a/persistence-modules/hibernate5-2/README.md b/persistence-modules/hibernate5-2/README.md deleted file mode 100644 index 330708f6d3..0000000000 --- a/persistence-modules/hibernate5-2/README.md +++ /dev/null @@ -1,11 +0,0 @@ -## Hibernate 5 - -This module contains articles about Hibernate 5. - -### Relevant Articles: -- [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set) -- [FetchMode in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-fetchmode) -- [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context) -- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode) -- [Various Logging Levels in Hibernate](https://www.baeldung.com/hibernate-logging-levels) -- [[<-- Prev]](/hibernate5) diff --git a/persistence-modules/hibernate5-2/pom.xml b/persistence-modules/hibernate5-2/pom.xml deleted file mode 100644 index 15d42b3244..0000000000 --- a/persistence-modules/hibernate5-2/pom.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - 4.0.0 - hibernate5-2 - 0.1-SNAPSHOT - hibernate5-2 - jar - Hibernate tutorial illustrating the use of named parameters - - - com.baeldung - persistence-modules - 1.0.0-SNAPSHOT - - - - - org.hibernate - hibernate-core - ${hibernate-core.version} - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-thymeleaf - ${spring-boot.version} - - - org.springframework.boot - spring-boot-starter-data-jpa - ${spring-boot.version} - - - com.zaxxer - HikariCP - - - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot.version} - - - - com.h2database - h2 - ${h2.version} - - - - org.apache.commons - commons-lang3 - ${commons.lang3.version} - - - - - 5.4.7.Final - 1.4.200 - 3.8.1 - true - 2.1.7.RELEASE - 5.4.7.Final - 1.4.200 - 3.8.1 - - - diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java deleted file mode 100644 index 9dcf4058a7..0000000000 --- a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.baeldung.hibernate.logging; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -public class Employee { - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE) - private long id; - - private String employeeNumber; - - private String title; - - private String name; - - public Employee() { - } - - public Employee(String name, String employeeNumber) { - this.name = name; - this.employeeNumber = employeeNumber; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getEmployeeNumber() { - return employeeNumber; - } - - public void setEmployeeNumber(String employeeNumber) { - this.employeeNumber = employeeNumber; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } -} diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernateparameters/Event.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernateparameters/Event.java deleted file mode 100644 index 7912659a09..0000000000 --- a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernateparameters/Event.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.hibernateparameters; - -public class Event { - private Long id; - - private String title; - - public Event() { - } - - public Event(String title) { - this.title = title; - } - - public Long getId() { - return id; - } - - private void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java deleted file mode 100644 index 17fa582e10..0000000000 --- a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.persistencecontext; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -@ComponentScan(basePackages="com.baeldung.persistencecontext") -public class PersistenceContextDemoApplication { - public static void main(String[] args) { - SpringApplication.run(PersistenceContextDemoApplication.class, args); - } -} diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/entity/User.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/entity/User.java deleted file mode 100644 index 7252ac46f5..0000000000 --- a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/entity/User.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.persistencecontext.entity; - -import javax.persistence.Entity; -import javax.persistence.Id; - -@Entity -public class User { - - @Id - private Long id; - private String name; - private String role; - - public User() { - - } - - public User(Long id, String name, String role) { - this.id = id; - this.name = name; - this.role = role; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getRole() { - return role; - } - -} diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java deleted file mode 100644 index ef25aac69f..0000000000 --- a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.persistencecontext.service; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.PersistenceContextType; -import javax.transaction.Transactional; - -import org.springframework.stereotype.Component; - -import com.baeldung.persistencecontext.entity.User; - -@Component -public class ExtendedPersistenceContextUserService { - - @PersistenceContext(type = PersistenceContextType.EXTENDED) - private EntityManager entityManager; - - @Transactional - public User insertWithTransaction(User user) { - entityManager.persist(user); - return user; - } - - public User insertWithoutTransaction(User user) { - entityManager.persist(user); - return user; - } - - public User find(long id) { - User user = entityManager.find(User.class, id); - return user; - } -} diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java deleted file mode 100644 index 481defcf08..0000000000 --- a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.persistencecontext.service; - - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -import org.springframework.stereotype.Component; - -import com.baeldung.persistencecontext.entity.User; - -@Component -public class TransctionPersistenceContextUserService { - - @PersistenceContext - private EntityManager entityManager; - - @Transactional - public User insertWithTransaction(User user) { - entityManager.persist(user); - return user; - } - - public User insertWithoutTransaction(User user) { - entityManager.persist(user); - return user; - } - - public User find(long id) { - return entityManager.find(User.class, id); - } -} diff --git a/persistence-modules/hibernate5-2/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml b/persistence-modules/hibernate5-2/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml deleted file mode 100644 index c485080879..0000000000 --- a/persistence-modules/hibernate5-2/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml b/persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml deleted file mode 100644 index 52ef1ee685..0000000000 --- a/persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - org.h2.Driver - jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1 - sa - - - 1 - - org.hibernate.dialect.H2Dialect - - org.hibernate.cache.internal.NoCacheProvider - - true - - create - - - - - \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/main/resources/hibernate.cfg.xml b/persistence-modules/hibernate5-2/src/main/resources/hibernate.cfg.xml deleted file mode 100644 index be564aaf5a..0000000000 --- a/persistence-modules/hibernate5-2/src/main/resources/hibernate.cfg.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - org.h2.Driver - jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1 - sa - - - 1 - - org.hibernate.dialect.H2Dialect - - org.hibernate.cache.internal.NoCacheProvider - - true - - create - - - - - - \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java b/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java deleted file mode 100644 index f609c75834..0000000000 --- a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.hibernate.logging; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -import java.io.IOException; -import java.util.List; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistry; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.query.Query; -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.hibernate.logging.Employee; - -public class HibernateLoggingIntegrationTest { - - private SessionFactory sessionFactory; - - @Before - public void setUp() throws IOException { - final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure("hibernate-logging.cfg.xml") - .build(); - try { - sessionFactory = new MetadataSources(registry).buildMetadata() - .buildSessionFactory(); - Session session = sessionFactory.openSession(); - session.beginTransaction(); - session.save(new Employee("John Smith", "001")); - session.getTransaction() - .commit(); - session.close(); - } catch (Exception e) { - fail(e); - StandardServiceRegistryBuilder.destroy(registry); - } - } - - @Test - public void whenAllEmployeesAreSelected_ThenSuccess() { - Query query = sessionFactory.openSession().createQuery("from com.baeldung.hibernate.logging.Employee", Employee.class); - List deptEmployees = query.list(); - Employee deptEmployee = deptEmployees.get(0); - assertEquals("John Smith", deptEmployee.getName()); - } -} diff --git a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java b/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java deleted file mode 100644 index 4efa1e1f68..0000000000 --- a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.baeldung.hibernateparameters; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistry; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.query.Query; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -public class NamedParameterUnitTest { - private SessionFactory sessionFactory; - - @Before - public void setUp() throws Exception { - final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() - .configure() - .build(); - try { - sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); - Session session = sessionFactory.openSession(); - session.beginTransaction(); - session.save(new Event("Event 1")); - session.save(new Event("Event 2")); - session.getTransaction().commit(); - session.close(); - } catch (Exception e) { - fail(e); - StandardServiceRegistryBuilder.destroy(registry); - } - } - - @After - public void tearDown() throws Exception { - if (sessionFactory != null) { - sessionFactory.close(); - } - } - - @Test - public void whenNamedParameterProvided_thenCorrect() { - Session session = sessionFactory.openSession(); - session.beginTransaction(); - Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class); - - // This binds the value "Event1" to the parameter :eventTitle - query.setParameter("eventTitle", "Event 1"); - - assertEquals(1, query.list().size()); - session.getTransaction().commit(); - session.close(); - } - - @Test(expected = org.hibernate.QueryException.class) - public void whenNamedParameterMissing_thenThrowsQueryException() { - Session session = sessionFactory.openSession(); - session.beginTransaction(); - Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class); - - try { - query.list(); - fail("We are expecting an exception!"); - } finally { - session.getTransaction().commit(); - session.close(); - } - } -} diff --git a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java b/persistence-modules/hibernate5-2/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java deleted file mode 100644 index b299dd5834..0000000000 --- a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.baeldung.persistencecontext; - -import com.baeldung.persistencecontext.entity.User; -import com.baeldung.persistencecontext.service.ExtendedPersistenceContextUserService; -import com.baeldung.persistencecontext.service.TransctionPersistenceContextUserService; - -import javax.persistence.EntityExistsException; -import javax.persistence.TransactionRequiredException; - -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 static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = com.baeldung.persistencecontext.PersistenceContextDemoApplication.class) -public class PersistenceContextIntegrationTest { - - @Autowired - private TransctionPersistenceContextUserService transctionPersistenceContext; - @Autowired - private ExtendedPersistenceContextUserService extendedPersistenceContext; - - @Test - public void testThatWhenUserSavedWithTransctionPersistenceContextThenUserShouldGetSavedInDB() { - User user = new User(121L, "Devender", "admin"); - transctionPersistenceContext.insertWithTransaction(user); - - User userFromTransctionPersistenceContext = transctionPersistenceContext.find(user.getId()); - assertNotNull(userFromTransctionPersistenceContext); - - User userFromExtendedPersistenceContext = extendedPersistenceContext.find(user.getId()); - assertNotNull(userFromExtendedPersistenceContext); - } - - @Test(expected = TransactionRequiredException.class) - public void testThatUserSaveWithoutTransactionThrowException() { - User user = new User(122L, "Devender", "admin"); - transctionPersistenceContext.insertWithoutTransaction(user); - } - - @Test - public void testThatWhenUserSavedWithExtendedPersistenceContextWithoutTransactionThenUserShouldGetCached() { - User user = new User(123L, "Devender", "admin"); - extendedPersistenceContext.insertWithoutTransaction(user); - - User userFromExtendedPersistenceContext = extendedPersistenceContext.find(user.getId()); - assertNotNull(userFromExtendedPersistenceContext); - - User userFromTransctionPersistenceContext = transctionPersistenceContext.find(user.getId()); - assertNull(userFromTransctionPersistenceContext); - } - - @Test(expected = EntityExistsException.class) - public void testThatPersistUserWithSameIdentifierThrowException() { - User user1 = new User(126L, "Devender", "admin"); - User user2 = new User(126L, "Devender", "admin"); - extendedPersistenceContext.insertWithoutTransaction(user1); - extendedPersistenceContext.insertWithoutTransaction(user2); - } - - @Test - public void testThatWhenUserSavedWithExtendedPersistenceContextWithTransactionThenUserShouldSaveEntityIntoDB() { - User user = new User(127L, "Devender", "admin"); - extendedPersistenceContext.insertWithTransaction(user); - - User userFromDB = transctionPersistenceContext.find(user.getId()); - assertNotNull(userFromDB); - } - - @Test - public void testThatWhenUserSavedWithExtendedPersistenceContextWithTransactionThenUserShouldFlushCachedEntityIntoDB() { - User user1 = new User(124L, "Devender", "admin"); - extendedPersistenceContext.insertWithoutTransaction(user1); - - User user2 = new User(125L, "Devender", "admin"); - extendedPersistenceContext.insertWithTransaction(user2); - - User user1FromTransctionPersistenceContext = transctionPersistenceContext.find(user1.getId()); - assertNotNull(user1FromTransctionPersistenceContext); - - User user2FromTransctionPersistenceContext = transctionPersistenceContext.find(user2.getId()); - assertNotNull(user2FromTransctionPersistenceContext); - } - -} diff --git a/persistence-modules/hibernate5-2/src/test/resources/log4j.xml b/persistence-modules/hibernate5-2/src/test/resources/log4j.xml deleted file mode 100644 index 2d153af124..0000000000 --- a/persistence-modules/hibernate5-2/src/test/resources/log4j.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/test/resources/log4j2.xml b/persistence-modules/hibernate5-2/src/test/resources/log4j2.xml deleted file mode 100644 index c5d0f12462..0000000000 --- a/persistence-modules/hibernate5-2/src/test/resources/log4j2.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/test/resources/logback.xml b/persistence-modules/hibernate5-2/src/test/resources/logback.xml deleted file mode 100644 index 9e591977d7..0000000000 --- a/persistence-modules/hibernate5-2/src/test/resources/logback.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - %d{yyyy-MM-dd HH:mm:ss} | %-5p | [%thread] %logger{5}:%L - %msg%n - - - - - - - - - - - - \ No newline at end of file From a5ae83d28aef770b7ef5722a56d086244369a549 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:18:27 +0530 Subject: [PATCH 031/530] JAVA-4 : Split hibernate5 module to smaller parts --- persistence-modules/hibernate5/README.md | 25 -- .../com/baeldung/hibernate/HibernateUtil.java | 28 -- .../converters/PersonNameConverter.java | 61 --- .../criteriaquery/HibernateUtil.java | 60 --- .../hibernate/criteriaquery/Student.java | 58 --- .../hibernate/customtypes/Address.java | 69 --- .../hibernate/customtypes/AddressType.java | 169 ------- .../LocalDateStringJavaDescriptor.java | 51 --- .../customtypes/LocalDateStringType.java | 34 -- .../hibernate/customtypes/OfficeEmployee.java | 88 ---- .../hibernate/customtypes/PhoneNumber.java | 43 -- .../customtypes/PhoneNumberType.java | 98 ---- .../hibernate/customtypes/Salary.java | 39 -- .../customtypes/SalaryCurrencyConvertor.java | 15 - .../hibernate/customtypes/SalaryType.java | 161 ------- .../hibernate/exception/EntityWithNoId.java | 16 - .../hibernate/exception/HibernateUtil.java | 63 --- .../baeldung/hibernate/exception/Product.java | 40 -- .../baeldung/hibernate/findall/FindAll.java | 35 -- .../baeldung/hibernate/joincolumn/Email.java | 47 -- .../baeldung/hibernate/joincolumn/Office.java | 41 -- .../hibernate/joincolumn/OfficeAddress.java | 34 -- .../joincolumn/OfficialEmployee.java | 36 -- .../jpabootstrap/application/Application.java | 34 -- .../config/HibernatePersistenceUnitInfo.java | 131 ------ .../config/JpaEntityManagerFactory.java | 69 --- .../hibernate/jpabootstrap/entities/User.java | 45 -- .../service/EmployeeSearchService.java | 15 - .../service/EmployeeSearchServiceImpl.java | 77 ---- .../hibernate/lob/HibernateSessionUtil.java | 61 --- .../baeldung/hibernate/lob/model/User.java | 46 -- .../hibernate/onetoone/HibernateUtil.java | 63 --- .../baeldung/hibernate/onetoone/Strategy.java | 25 -- .../onetoone/foreignkeybased/Address.java | 60 --- .../onetoone/foreignkeybased/User.java | 51 --- .../onetoone/jointablebased/Employee.java | 53 --- .../onetoone/jointablebased/WorkStation.java | 61 --- .../onetoone/sharedkeybased/Address.java | 60 --- .../onetoone/sharedkeybased/User.java | 50 --- .../OptimisticLockingCourse.java | 48 -- .../OptimisticLockingStudent.java | 70 --- .../hibernate/pessimisticlocking/Address.java | 34 -- .../pessimisticlocking/Customer.java | 58 --- .../pessimisticlocking/Individual.java | 49 -- .../PessimisticLockingCourse.java | 47 -- .../PessimisticLockingEmployee.java | 27 -- .../PessimisticLockingStudent.java | 46 -- .../com/baeldung/hibernate/pojo/Person.java | 32 -- .../hibernate/transaction/PostService.java | 29 -- .../hibernate/CustomClassIntegrationTest.java | 78 ---- .../DynamicMappingIntegrationTest.java | 160 ------- .../HibernateSpatialIntegrationTest.java | 161 ------- .../InheritanceMappingIntegrationTest.java | 89 ---- .../hibernate/NamedQueryIntegrationTest.java | 98 ---- .../hibernate/TemporalValuesUnitTest.java | 128 ------ .../AggregateFunctionsIntegrationTest.java | 87 ---- .../PersonNameConverterUnitTest.java | 200 --------- .../TypeSafeCriteriaIntegrationTest.java | 89 ---- .../HibernateCustomTypesManualTest.java | 90 ---- .../exception/HibernateExceptionUnitTest.java | 425 ------------------ .../hibernate/findall/FindAllUnitTest.java | 63 --- .../joincolumn/JoinColumnIntegrationTest.java | 57 --- .../EmployeeSearchServiceIntegrationTest.java | 121 ----- .../baeldung/hibernate/lob/LobUnitTest.java | 61 --- .../baeldung/hibernate/multitenancy/Car.java | 26 -- .../MultitenancyIntegrationTest.java | 104 ----- ...seApproachMultitenancyIntegrationTest.java | 25 -- .../MapMultiTenantConnectionProvider.java | 42 -- .../multitenancy/database/TenantIdNames.java | 6 - ...maApproachMultitenancyIntegrationTest.java | 26 -- .../SchemaMultiTenantConnectionProvider.java | 48 -- .../multitenancy/schema/TenantIdNames.java | 6 - ...ToOneAnnotationFKBasedIntegrationTest.java | 80 ---- ...ToOneAnnotationJTBasedIntegrationTest.java | 80 ---- ...oOneAnnotationSPKBasedIntegrationTest.java | 79 ---- .../OptimisticLockingIntegrationTest.java | 146 ------ ...asicPessimisticLockingIntegrationTest.java | 162 ------- .../PessimisticLockScopesIntegrationTest.java | 125 ------ .../QueryPlanCacheBenchmark.java | 106 ----- .../TransactionIntegrationTest.java | 57 --- .../hibernate-customtypes.properties | 14 - ...hibernate-database-multitenancy.properties | 2 - .../hibernate-database-mydb1.properties | 4 - .../hibernate-database-mydb2.properties | 4 - .../resources/hibernate-exception.properties | 16 - .../resources/hibernate-namedquery.properties | 9 - .../hibernate-pessimistic-locking.properties | 8 - .../hibernate-schema-multitenancy.properties | 7 - .../resources/hibernate-spatial.properties | 14 - 89 files changed, 5755 deletions(-) delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Address.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Salary.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/model/User.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Person.java delete mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/transaction/PostService.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java delete mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-customtypes.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-database-multitenancy.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb1.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb2.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-namedquery.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-pessimistic-locking.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties delete mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-spatial.properties diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index d1bfe897f6..7b5e3bb189 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -4,38 +4,13 @@ This module contains articles about Hibernate 5. ### Relevant articles: -- [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) - [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers) -- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time) -- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance) -- [A Guide to Multitenancy in Hibernate 5](http://www.baeldung.com/hibernate-5-multitenancy) -- [Introduction to Hibernate Spatial](http://www.baeldung.com/hibernate-spatial) - [Hibernate Interceptors](http://www.baeldung.com/hibernate-interceptor) -- [JPA Attribute Converters](http://www.baeldung.com/jpa-attribute-converters) -- [Mapping LOB Data in Hibernate](http://www.baeldung.com/hibernate-lob) -- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) -- [Pessimistic Locking in JPA](http://www.baeldung.com/jpa-pessimistic-locking) -- [Bootstrapping JPA Programmatically in Java](http://www.baeldung.com/java-bootstrap-jpa) -- [Optimistic Locking in JPA](http://www.baeldung.com/jpa-optimistic-locking) - [Hibernate Entity Lifecycle](https://www.baeldung.com/hibernate-entity-lifecycle) -- [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class) -- [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column) - [Hibernate 5 Naming Strategy Configuration](https://www.baeldung.com/hibernate-naming-strategy) - [Proxy in Hibernate load() Method](https://www.baeldung.com/hibernate-proxy-load-method) -- [Custom Types in Hibernate and the @Type Annotation](https://www.baeldung.com/hibernate-custom-types) -- [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) -- [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) - [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) -- [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) - [Guide to the Hibernate EntityManager](https://www.baeldung.com/hibernate-entitymanager) -- [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) -- [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) -- [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query) - [Using c3p0 with Hibernate](https://www.baeldung.com/hibernate-c3p0) - [Persist a JSON Object Using Hibernate](https://www.baeldung.com/hibernate-persist-json-object) -- [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions) -- [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions) -- [Hibernate Query Plan Cache](https://www.baeldung.com/hibernate-query-plan-cache) -- [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception) -- [Enabling Transaction Locks in Spring Data JPA](https://www.baeldung.com/java-jpa-transaction-locks) - [[Next -->]](/hibernate5-2) \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java index 137fc4f0bd..11a59c9cf0 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -12,25 +12,13 @@ import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry; -import com.baeldung.hibernate.customtypes.LocalDateStringType; -import com.baeldung.hibernate.customtypes.OfficeEmployee; import com.baeldung.hibernate.entities.DeptEmployee; -import com.baeldung.hibernate.joincolumn.Email; -import com.baeldung.hibernate.joincolumn.Office; -import com.baeldung.hibernate.joincolumn.OfficeAddress; -import com.baeldung.hibernate.optimisticlocking.OptimisticLockingCourse; -import com.baeldung.hibernate.optimisticlocking.OptimisticLockingStudent; -import com.baeldung.hibernate.pessimisticlocking.Individual; -import com.baeldung.hibernate.pessimisticlocking.PessimisticLockingCourse; -import com.baeldung.hibernate.pessimisticlocking.PessimisticLockingEmployee; -import com.baeldung.hibernate.pessimisticlocking.PessimisticLockingStudent; import com.baeldung.hibernate.pojo.Course; import com.baeldung.hibernate.pojo.Employee; import com.baeldung.hibernate.pojo.EntityDescription; import com.baeldung.hibernate.pojo.OrderEntry; import com.baeldung.hibernate.pojo.OrderEntryIdClass; import com.baeldung.hibernate.pojo.OrderEntryPK; -import com.baeldung.hibernate.pojo.Person; import com.baeldung.hibernate.pojo.Phone; import com.baeldung.hibernate.pojo.PointEntity; import com.baeldung.hibernate.pojo.PolygonEntity; @@ -88,7 +76,6 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(MyEmployee.class); metadataSources.addAnnotatedClass(MyProduct.class); metadataSources.addAnnotatedClass(Pen.class); - metadataSources.addAnnotatedClass(Person.class); metadataSources.addAnnotatedClass(Animal.class); metadataSources.addAnnotatedClass(Pet.class); metadataSources.addAnnotatedClass(Vehicle.class); @@ -96,26 +83,11 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(Bag.class); metadataSources.addAnnotatedClass(PointEntity.class); metadataSources.addAnnotatedClass(PolygonEntity.class); - metadataSources.addAnnotatedClass(com.baeldung.hibernate.pojo.Person.class); - metadataSources.addAnnotatedClass(Individual.class); - metadataSources.addAnnotatedClass(PessimisticLockingEmployee.class); - metadataSources.addAnnotatedClass(PessimisticLockingStudent.class); - metadataSources.addAnnotatedClass(PessimisticLockingCourse.class); - metadataSources.addAnnotatedClass(com.baeldung.hibernate.pessimisticlocking.Customer.class); - metadataSources.addAnnotatedClass(com.baeldung.hibernate.pessimisticlocking.Address.class); metadataSources.addAnnotatedClass(DeptEmployee.class); metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); - metadataSources.addAnnotatedClass(OptimisticLockingCourse.class); - metadataSources.addAnnotatedClass(OptimisticLockingStudent.class); - metadataSources.addAnnotatedClass(OfficeEmployee.class); metadataSources.addAnnotatedClass(Post.class); - metadataSources.addAnnotatedClass(com.baeldung.hibernate.joincolumn.OfficialEmployee.class); - metadataSources.addAnnotatedClass(Email.class); - metadataSources.addAnnotatedClass(Office.class); - metadataSources.addAnnotatedClass(OfficeAddress.class); Metadata metadata = metadataSources.getMetadataBuilder() - .applyBasicType(LocalDateStringType.INSTANCE) .build(); return metadata.getSessionFactoryBuilder() diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java deleted file mode 100644 index 506e674984..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung.hibernate.converters; - -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; - -import com.baeldung.hibernate.pojo.PersonName; - -@Converter -public class PersonNameConverter implements AttributeConverter { - - private static final String SEPARATOR = ", "; - - @Override - public String convertToDatabaseColumn(PersonName personName) { - if (personName == null) { - return null; - } - - StringBuilder sb = new StringBuilder(); - if (personName.getSurname() != null && !personName.getSurname() - .isEmpty()) { - sb.append(personName.getSurname()); - sb.append(SEPARATOR); - } - - if (personName.getName() != null && !personName.getName() - .isEmpty()) { - sb.append(personName.getName()); - } - - return sb.toString(); - } - - @Override - public PersonName convertToEntityAttribute(String dbPersonName) { - if (dbPersonName == null || dbPersonName.isEmpty()) { - return null; - } - - String[] pieces = dbPersonName.split(SEPARATOR); - - if (pieces == null || pieces.length == 0) { - return null; - } - - PersonName personName = new PersonName(); - String firstPiece = !pieces[0].isEmpty() ? pieces[0] : null; - if (dbPersonName.contains(SEPARATOR)) { - personName.setSurname(firstPiece); - - if (pieces.length >= 2 && pieces[1] != null && !pieces[1].isEmpty()) { - personName.setName(pieces[1]); - } - } else { - personName.setName(firstPiece); - } - - return personName; - } - -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java deleted file mode 100644 index 35cfe55ba6..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.hibernate.criteriaquery; - -import com.baeldung.hibernate.customtypes.LocalDateStringType; -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.service.ServiceRegistry; - -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Properties; - -public class HibernateUtil { - private static SessionFactory sessionFactory; - - private HibernateUtil() { - } - - public static SessionFactory getSessionFactory() { - if (sessionFactory == null) { - sessionFactory = buildSessionFactory(); - } - return sessionFactory; - } - - private static SessionFactory buildSessionFactory() { - try { - ServiceRegistry serviceRegistry = configureServiceRegistry(); - - MetadataSources metadataSources = new MetadataSources(serviceRegistry); - - metadataSources.addAnnotatedClass(Student.class); - Metadata metadata = metadataSources.getMetadataBuilder() - .applyBasicType(LocalDateStringType.INSTANCE) - .build(); - return metadata.getSessionFactoryBuilder().build(); - } catch (IOException ex) { - throw new ExceptionInInitializerError(ex); - } - } - - - private static ServiceRegistry configureServiceRegistry() throws IOException { - Properties properties = getProperties(); - return new StandardServiceRegistryBuilder().applySettings(properties).build(); - } - - private static Properties getProperties() throws IOException { - Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource("hibernate.properties"); - try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { - properties.load(inputStream); - } - return properties; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java deleted file mode 100644 index 314e7ca557..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java +++ /dev/null @@ -1,58 +0,0 @@ -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; - -@Entity -@Table(name = "students") -public class Student { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private int id; - - @Column(name = "first_name") - private String firstName; - - @Column(name = "last_name") - private String lastName; - - @Column(name = "grad_year") - private int gradYear; - - public int getId() { - return id; - } - - public void setId(int 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; - } - - public int getGradYear() { - return gradYear; - } - - public void setGradYear(int gradYear) { - this.gradYear = gradYear; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Address.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Address.java deleted file mode 100644 index d559e5a6c2..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Address.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import java.util.Objects; - -public class Address { - - private String addressLine1; - private String addressLine2; - private String city; - private String country; - private int zipCode; - - public String getAddressLine1() { - return addressLine1; - } - - public String getAddressLine2() { - return addressLine2; - } - - public String getCity() { - return city; - } - - public String getCountry() { - return country; - } - - public int getZipCode() { - return zipCode; - } - - public void setAddressLine1(String addressLine1) { - this.addressLine1 = addressLine1; - } - - public void setAddressLine2(String addressLine2) { - this.addressLine2 = addressLine2; - } - - public void setCity(String city) { - this.city = city; - } - - public void setCountry(String country) { - this.country = country; - } - - public void setZipCode(int zipCode) { - this.zipCode = zipCode; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Address address = (Address) o; - return zipCode == address.zipCode && - Objects.equals(addressLine1, address.addressLine1) && - Objects.equals(addressLine2, address.addressLine2) && - Objects.equals(city, address.city) && - Objects.equals(country, address.country); - } - - @Override - public int hashCode() { - return Objects.hash(addressLine1, addressLine2, city, country, zipCode); - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java deleted file mode 100644 index c10c67df9a..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.type.IntegerType; -import org.hibernate.type.StringType; -import org.hibernate.type.Type; -import org.hibernate.usertype.CompositeUserType; - -import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.Objects; - -public class AddressType implements CompositeUserType { - - @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; - - switch (property) { - case 0: - return empAdd.getAddressLine1(); - case 1: - return empAdd.getAddressLine2(); - case 2: - return empAdd.getCity(); - case 3: - return empAdd.getCountry(); - case 4: - return Integer.valueOf(empAdd.getZipCode()); - } - - 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()); - - } - - @Override - public Class returnedClass() { - return Address.class; - } - - @Override - public boolean equals(Object x, Object y) throws HibernateException { - if (x == y) - return true; - - if (Objects.isNull(x) || Objects.isNull(y)) - return false; - - return x.equals(y); - } - - @Override - public int hashCode(Object x) throws HibernateException { - return x.hashCode(); - } - - @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - - Address empAdd = new Address(); - empAdd.setAddressLine1(rs.getString(names[0])); - - 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])); - - return empAdd; - } - - @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, 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()); - } - } - - @Override - public Object deepCopy(Object value) throws HibernateException { - - 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()); - - return newEmpAdd; - } - - @Override - public boolean isMutable() { - return true; - } - - @Override - public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException { - return (Serializable) deepCopy(value); - } - - @Override - public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return deepCopy(cached); - } - - @Override - public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return original; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java deleted file mode 100644 index 56be9e693f..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java +++ /dev/null @@ -1,51 +0,0 @@ -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; - -public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor { - - public static final LocalDateStringJavaDescriptor INSTANCE = new LocalDateStringJavaDescriptor(); - - public LocalDateStringJavaDescriptor() { - super(LocalDate.class, ImmutableMutabilityPlan.INSTANCE); - } - - @Override - public String toString(LocalDate value) { - return LocalDateType.FORMATTER.format(value); - } - - @Override - public LocalDate fromString(String string) { - return LocalDate.from(LocalDateType.FORMATTER.parse(string)); - } - - @Override - public X unwrap(LocalDate value, Class type, WrapperOptions options) { - - if (value == null) - return null; - - if (String.class.isAssignableFrom(type)) - return (X) LocalDateType.FORMATTER.format(value); - - throw unknownUnwrap(type); - } - - @Override - public LocalDate wrap(X value, WrapperOptions options) { - if (value == null) - return null; - - if(String.class.isInstance(value)) - return LocalDate.from(LocalDateType.FORMATTER.parse((CharSequence) value)); - - throw unknownWrap(value.getClass()); - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java deleted file mode 100644 index c8d37073e8..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import org.hibernate.dialect.Dialect; -import org.hibernate.type.AbstractSingleColumnStandardBasicType; -import org.hibernate.type.DiscriminatorType; -import org.hibernate.type.descriptor.java.LocalDateJavaDescriptor; -import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor; - -import java.time.LocalDate; - -public class LocalDateStringType extends AbstractSingleColumnStandardBasicType implements DiscriminatorType { - - public static final LocalDateStringType INSTANCE = new LocalDateStringType(); - - public LocalDateStringType() { - super(VarcharTypeDescriptor.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE); - } - - @Override - public String getName() { - return "LocalDateString"; - } - - @Override - public LocalDate stringToObject(String xml) throws Exception { - return fromString(xml); - } - - @Override - public String objectToSQLString(LocalDate value, Dialect dialect) throws Exception { - return '\'' + toString(value) + '\''; - } - -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java deleted file mode 100644 index 3ca06e4316..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import com.baeldung.hibernate.pojo.Phone; -import org.hibernate.annotations.Columns; -import org.hibernate.annotations.Parameter; -import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import java.time.LocalDate; - -@TypeDef(name = "PhoneNumber", - typeClass = PhoneNumberType.class, - defaultForType = PhoneNumber.class) -@Entity -@Table(name = "OfficeEmployee") -public class OfficeEmployee { - - @Id - @GeneratedValue - private long id; - - @Column - @Type(type = "LocalDateString") - private LocalDate dateOfJoining; - - @Columns(columns = {@Column(name = "country_code"), - @Column(name = "city_code"), - @Column(name = "number")}) - private PhoneNumber employeeNumber; - - @Columns(columns = {@Column(name = "address_line_1"), - @Column(name = "address_line_2"), - @Column(name = "city"), @Column(name = "country"), - @Column(name = "zip_code")}) - @Type(type = "com.baeldung.hibernate.customtypes.AddressType") - private Address empAddress; - - @Type(type = "com.baeldung.hibernate.customtypes.SalaryType", - parameters = {@Parameter(name = "currency", value = "USD")}) - @Columns(columns = {@Column(name = "amount"), - @Column(name = "currency")}) - private Salary salary; - - public Salary getSalary() { - return salary; - } - - public void setSalary(Salary salary) { - this.salary = salary; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public LocalDate getDateOfJoining() { - return dateOfJoining; - } - - public void setDateOfJoining(LocalDate dateOfJoining) { - this.dateOfJoining = dateOfJoining; - } - - public PhoneNumber getEmployeeNumber() { - return employeeNumber; - } - - public void setEmployeeNumber(PhoneNumber employeeNumber) { - this.employeeNumber = employeeNumber; - } - - public Address getEmpAddress() { - return empAddress; - } - - public void setEmpAddress(Address empAddress) { - this.empAddress = empAddress; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java deleted file mode 100644 index 0be6cbc910..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import java.util.Objects; - -public final class PhoneNumber { - - private final int countryCode; - private final int cityCode; - private final int number; - - public PhoneNumber(int countryCode, int cityCode, int number) { - this.countryCode = countryCode; - this.cityCode = cityCode; - this.number = number; - } - - public int getCountryCode() { - return countryCode; - } - - public int getCityCode() { - return cityCode; - } - - public int getNumber() { - return number; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - PhoneNumber that = (PhoneNumber) o; - return countryCode == that.countryCode && - cityCode == that.cityCode && - number == that.number; - } - - @Override - public int hashCode() { - return Objects.hash(countryCode, cityCode, number); - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java deleted file mode 100644 index 9f09352bec..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.usertype.UserType; - -import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.Objects; - - -public class PhoneNumberType implements UserType { - @Override - public int[] sqlTypes() { - return new int[]{Types.INTEGER, Types.INTEGER, Types.INTEGER}; - } - - @Override - public Class returnedClass() { - return PhoneNumber.class; - } - - @Override - public boolean equals(Object x, Object y) throws HibernateException { - if (x == y) - return true; - if (Objects.isNull(x) || Objects.isNull(y)) - return false; - - return x.equals(y); - } - - @Override - public int hashCode(Object x) throws HibernateException { - return x.hashCode(); - } - - @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - int countryCode = rs.getInt(names[0]); - - if (rs.wasNull()) - return null; - - int cityCode = rs.getInt(names[1]); - int number = rs.getInt(names[2]); - PhoneNumber employeeNumber = new PhoneNumber(countryCode, cityCode, number); - - return employeeNumber; - } - - @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { - - if (Objects.isNull(value)) { - st.setNull(index, Types.INTEGER); - } else { - PhoneNumber employeeNumber = (PhoneNumber) value; - st.setInt(index,employeeNumber.getCountryCode()); - st.setInt(index+1,employeeNumber.getCityCode()); - st.setInt(index+2,employeeNumber.getNumber()); - } - } - - @Override - public Object deepCopy(Object value) throws HibernateException { - if (Objects.isNull(value)) - return null; - - PhoneNumber empNumber = (PhoneNumber) value; - PhoneNumber newEmpNumber = new PhoneNumber(empNumber.getCountryCode(),empNumber.getCityCode(),empNumber.getNumber()); - - return newEmpNumber; - } - - @Override - public boolean isMutable() { - return false; - } - - @Override - public Serializable disassemble(Object value) throws HibernateException { - return (Serializable) value; - } - - @Override - public Object assemble(Serializable cached, Object owner) throws HibernateException { - return cached; - } - - @Override - public Object replace(Object original, Object target, Object owner) throws HibernateException { - return original; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Salary.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Salary.java deleted file mode 100644 index f9a7ac5902..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Salary.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import java.util.Objects; - -public class Salary { - - private Long amount; - private String currency; - - public Long getAmount() { - return amount; - } - - public void setAmount(Long amount) { - this.amount = amount; - } - - public String getCurrency() { - return currency; - } - - public void setCurrency(String currency) { - this.currency = currency; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Salary salary = (Salary) o; - return Objects.equals(amount, salary.amount) && - Objects.equals(currency, salary.currency); - } - - @Override - public int hashCode() { - return Objects.hash(amount, currency); - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java deleted file mode 100644 index 340c697c11..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -public class SalaryCurrencyConvertor { - - public static Long convert(Long amount, String oldCurr, String newCurr){ - if (newCurr.equalsIgnoreCase(oldCurr)) - return amount; - - return convertTo(); - } - - private static Long convertTo() { - return 10L; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java deleted file mode 100644 index 266b85140b..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.type.LongType; -import org.hibernate.type.StringType; -import org.hibernate.type.Type; -import org.hibernate.usertype.CompositeUserType; -import org.hibernate.usertype.DynamicParameterizedType; - -import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.Objects; -import java.util.Properties; - -public class SalaryType implements 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; - - switch (property) { - case 0: - return salary.getAmount(); - case 1: - return salary.getCurrency(); - } - - 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() { - return Salary.class; - } - - @Override - public boolean equals(Object x, Object y) throws HibernateException { - - if (x == y) - return true; - - if (Objects.isNull(x) || Objects.isNull(y)) - return false; - - return x.equals(y); - - } - - @Override - public int hashCode(Object x) throws HibernateException { - return x.hashCode(); - } - - @Override - public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - - Salary salary = new Salary(); - salary.setAmount(rs.getLong(names[0])); - - if (rs.wasNull()) - return null; - - salary.setCurrency(rs.getString(names[1])); - - return salary; - } - - @Override - public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, 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()); - } - } - - @Override - public Object deepCopy(Object value) throws HibernateException { - - if (Objects.isNull(value)) - return null; - - Salary oldSal = (Salary) value; - Salary newSal = new Salary(); - - newSal.setAmount(oldSal.getAmount()); - newSal.setCurrency(oldSal.getCurrency()); - - return newSal; - } - - @Override - public boolean isMutable() { - return true; - } - - @Override - public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException { - return (Serializable) deepCopy(value); - } - - @Override - public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return deepCopy(cached); - } - - @Override - public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException { - return original; - } - - @Override - public void setParameterValues(Properties parameters) { - this.localCurrency = parameters.getProperty("currency"); - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java deleted file mode 100644 index 989fa1281a..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.hibernate.exception; - -import javax.persistence.Entity; - -@Entity -public class EntityWithNoId { - private int id; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java deleted file mode 100644 index ae5174ac9c..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.hibernate.exception; - -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Properties; - -import org.apache.commons.lang3.StringUtils; -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.service.ServiceRegistry; - -public class HibernateUtil { - private static SessionFactory sessionFactory; - private static String PROPERTY_FILE_NAME; - - public static SessionFactory getSessionFactory() throws IOException { - return getSessionFactory(null); - } - - public static SessionFactory getSessionFactory(String propertyFileName) - throws IOException { - PROPERTY_FILE_NAME = propertyFileName; - if (sessionFactory == null) { - ServiceRegistry serviceRegistry = configureServiceRegistry(); - sessionFactory = makeSessionFactory(serviceRegistry); - } - return sessionFactory; - } - - private static SessionFactory makeSessionFactory( - ServiceRegistry serviceRegistry) { - MetadataSources metadataSources = new MetadataSources(serviceRegistry); - metadataSources.addAnnotatedClass(Product.class); - Metadata metadata = metadataSources.getMetadataBuilder() - .build(); - return metadata.getSessionFactoryBuilder() - .build(); - - } - - private static ServiceRegistry configureServiceRegistry() - throws IOException { - Properties properties = getProperties(); - return new StandardServiceRegistryBuilder().applySettings(properties) - .build(); - } - - private static Properties getProperties() throws IOException { - Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, - "hibernate-exception.properties")); - try (FileInputStream inputStream = new FileInputStream( - propertiesURL.getFile())) { - properties.load(inputStream); - } - return properties; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java deleted file mode 100644 index 031fa38de0..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.hibernate.exception; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; - -@Entity -public class Product { - - private int id; - - private String name; - private String description; - - @Id - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - @Column(nullable=false) - 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/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java deleted file mode 100644 index cc0c234df0..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.hibernate.findall; - -import java.util.List; - -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; - -import org.hibernate.Session; - -import com.baeldung.hibernate.pojo.Student; - -public class FindAll { - - private Session session; - - public FindAll(Session session) { - super(); - this.session = session; - } - - public List findAllWithJpql() { - return session.createQuery("SELECT a FROM Student a", Student.class).getResultList(); - } - - public List findAllWithCriteriaQuery() { - CriteriaBuilder cb = session.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Student.class); - Root rootEntry = cq.from(Student.class); - CriteriaQuery all = cq.select(rootEntry); - TypedQuery allQuery = session.createQuery(all); - return allQuery.getResultList(); - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java deleted file mode 100644 index df07c3cf69..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java +++ /dev/null @@ -1,47 +0,0 @@ -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; - -@Entity -public class Email { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - private String address; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "employee_id") - private OfficialEmployee employee; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public OfficialEmployee getEmployee() { - return employee; - } - - public void setEmployee(OfficialEmployee employee) { - this.employee = employee; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java deleted file mode 100644 index 9940577761..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java +++ /dev/null @@ -1,41 +0,0 @@ -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; - -@Entity -public class Office { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumns({ - @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), - @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") - }) - private OfficeAddress address; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public OfficeAddress getAddress() { - return address; - } - - public void setAddress(OfficeAddress address) { - this.address = address; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java deleted file mode 100644 index cc723db6a2..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java +++ /dev/null @@ -1,34 +0,0 @@ -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; - -@Entity -public class OfficeAddress { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Column(name = "ZIP") - private String zipCode; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getZipCode() { - return zipCode; - } - - public void setZipCode(String zipCode) { - this.zipCode = zipCode; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java deleted file mode 100644 index 49c63c7578..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java +++ /dev/null @@ -1,36 +0,0 @@ -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; - -@Entity -public class OfficialEmployee { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") - private List emails; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public List getEmails() { - return emails; - } - - public void setEmails(List emails) { - this.emails = emails; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java deleted file mode 100644 index f7b8e6bf6d..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.hibernate.jpabootstrap.application; - -import com.baeldung.hibernate.jpabootstrap.config.JpaEntityManagerFactory; -import com.baeldung.hibernate.jpabootstrap.entities.User; -import javax.persistence.EntityManager; - -public class Application { - - public static void main(String[] args) { - EntityManager entityManager = getJpaEntityManager(); - User user = entityManager.find(User.class, 1); - System.out.println(user); - entityManager.getTransaction().begin(); - user.setName("John"); - user.setEmail("john@domain.com"); - entityManager.merge(user); - entityManager.getTransaction().commit(); - entityManager.getTransaction().begin(); - entityManager.persist(new User("Monica", "monica@domain.com")); - entityManager.getTransaction().commit(); - - // additional CRUD operations - - } - - private static class EntityManagerHolder { - private static final EntityManager ENTITY_MANAGER = new JpaEntityManagerFactory( - new Class[]{User.class}).getEntityManager(); - } - - public static EntityManager getJpaEntityManager() { - return EntityManagerHolder.ENTITY_MANAGER; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java deleted file mode 100644 index 3852b44b64..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.baeldung.hibernate.jpabootstrap.config; - -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Properties; -import javax.sql.DataSource; -import javax.persistence.SharedCacheMode; -import javax.persistence.ValidationMode; -import javax.persistence.spi.ClassTransformer; -import javax.persistence.spi.PersistenceUnitInfo; -import javax.persistence.spi.PersistenceUnitTransactionType; -import org.hibernate.jpa.HibernatePersistenceProvider; - -public class HibernatePersistenceUnitInfo implements PersistenceUnitInfo { - - public static final String JPA_VERSION = "2.1"; - private final String persistenceUnitName; - private PersistenceUnitTransactionType transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL; - private final List managedClassNames; - private final List mappingFileNames = new ArrayList<>(); - private final Properties properties; - private DataSource jtaDataSource; - private DataSource nonjtaDataSource; - private final List transformers = new ArrayList<>(); - - public HibernatePersistenceUnitInfo(String persistenceUnitName, List managedClassNames, Properties properties) { - this.persistenceUnitName = persistenceUnitName; - this.managedClassNames = managedClassNames; - this.properties = properties; - } - - @Override - public String getPersistenceUnitName() { - return persistenceUnitName; - } - - @Override - public String getPersistenceProviderClassName() { - return HibernatePersistenceProvider.class.getName(); - } - - @Override - public PersistenceUnitTransactionType getTransactionType() { - return transactionType; - } - - public HibernatePersistenceUnitInfo setJtaDataSource(DataSource jtaDataSource) { - this.jtaDataSource = jtaDataSource; - this.nonjtaDataSource = null; - transactionType = PersistenceUnitTransactionType.JTA; - return this; - } - - @Override - public DataSource getJtaDataSource() { - return jtaDataSource; - } - - public HibernatePersistenceUnitInfo setNonJtaDataSource(DataSource nonJtaDataSource) { - this.nonjtaDataSource = nonJtaDataSource; - this.jtaDataSource = null; - transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL; - return this; - } - - @Override - public DataSource getNonJtaDataSource() { - return nonjtaDataSource; - } - - @Override - public List getMappingFileNames() { - return mappingFileNames; - } - - @Override - public List getJarFileUrls() { - return Collections.emptyList(); - } - - @Override - public URL getPersistenceUnitRootUrl() { - return null; - } - - @Override - public List getManagedClassNames() { - return managedClassNames; - } - - @Override - public boolean excludeUnlistedClasses() { - return false; - } - - @Override - public SharedCacheMode getSharedCacheMode() { - return SharedCacheMode.UNSPECIFIED; - } - - @Override - public ValidationMode getValidationMode() { - return ValidationMode.AUTO; - } - - public Properties getProperties() { - return properties; - } - - @Override - public String getPersistenceXMLSchemaVersion() { - return JPA_VERSION; - } - - @Override - public ClassLoader getClassLoader() { - return Thread.currentThread().getContextClassLoader(); - } - - @Override - public void addTransformer(ClassTransformer transformer) { - transformers.add(transformer); - } - - @Override - public ClassLoader getNewTempClassLoader() { - return null; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java deleted file mode 100644 index bc1932af6f..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.hibernate.jpabootstrap.config; - -import com.mysql.cj.jdbc.MysqlDataSource; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.stream.Collectors; -import javax.persistence.EntityManager; -import javax.sql.DataSource; -import javax.persistence.EntityManagerFactory; -import javax.persistence.spi.PersistenceUnitInfo; -import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; -import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor; - -public class JpaEntityManagerFactory { - - private final String DB_URL = "jdbc:mysql://databaseurl"; - private final String DB_USER_NAME = "username"; - private final String DB_PASSWORD = "password"; - private final Class[] entityClasses; - - public JpaEntityManagerFactory(Class[] entityClasses) { - this.entityClasses = entityClasses; - } - - public EntityManager getEntityManager() { - return getEntityManagerFactory().createEntityManager(); - } - - protected EntityManagerFactory getEntityManagerFactory() { - PersistenceUnitInfo persistenceUnitInfo = getPersistenceUnitInfo(getClass().getSimpleName()); - Map configuration = new HashMap<>(); - return new EntityManagerFactoryBuilderImpl(new PersistenceUnitInfoDescriptor(persistenceUnitInfo), configuration) - .build(); - } - - protected HibernatePersistenceUnitInfo getPersistenceUnitInfo(String name) { - return new HibernatePersistenceUnitInfo(name, getEntityClassNames(), getProperties()); - } - - protected List getEntityClassNames() { - return Arrays.asList(getEntities()) - .stream() - .map(Class::getName) - .collect(Collectors.toList()); - } - - protected Properties getProperties() { - Properties properties = new Properties(); - properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); - properties.put("hibernate.id.new_generator_mappings", false); - properties.put("hibernate.connection.datasource", getMysqlDataSource()); - return properties; - } - - protected Class[] getEntities() { - return entityClasses; - } - - protected DataSource getMysqlDataSource() { - MysqlDataSource mysqlDataSource = new MysqlDataSource(); - mysqlDataSource.setURL(DB_URL); - mysqlDataSource.setUser(DB_USER_NAME); - mysqlDataSource.setPassword(DB_PASSWORD); - return mysqlDataSource; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java deleted file mode 100644 index 86ca1dfa19..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.hibernate.jpabootstrap.entities; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = "users") -public class User { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - private String name; - private String email; - - public User(){} - - public User(String name, String email) { - this.name = name; - this.email = email; - } - - public void setName(String name) { - this.name = name; - } - - public void setEmail(String email) { - this.email = email; - } - - public long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java deleted file mode 100644 index b7d1a537f0..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.hibernate.jpacriteriabuilder.service; - -import java.util.List; - -import com.baeldung.hibernate.entities.DeptEmployee; - -public interface EmployeeSearchService { - - List filterbyTitleUsingCriteriaBuilder(List titles); - - List filterbyTitleUsingExpression(List titles); - - List searchByDepartmentQuery(String query); - -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java deleted file mode 100644 index e79168a451..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.baeldung.hibernate.jpacriteriabuilder.service; - -import java.util.List; - -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaBuilder.In; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; -import javax.persistence.criteria.Subquery; - -import com.baeldung.hibernate.entities.Department; -import com.baeldung.hibernate.entities.DeptEmployee; - -public class EmployeeSearchServiceImpl implements EmployeeSearchService { - - private EntityManager entityManager; - private CriteriaBuilder criteriaBuilder; - - public EmployeeSearchServiceImpl(EntityManager entityManager) { - this.entityManager = entityManager; - this.criteriaBuilder = entityManager.getCriteriaBuilder(); - - } - - @Override - public List filterbyTitleUsingCriteriaBuilder(List titles) { - CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class); - Root root = criteriaQuery.from(DeptEmployee.class); - In inClause = criteriaBuilder.in(root.get("title")); - for (String title : titles) { - inClause.value(title); - } - criteriaQuery.select(root) - .where(inClause); - TypedQuery query = entityManager.createQuery(criteriaQuery); - return query.getResultList(); - } - - @Override - public List filterbyTitleUsingExpression(List titles) { - CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class); - Root root = criteriaQuery.from(DeptEmployee.class); - criteriaQuery.select(root) - .where(root.get("title") - .in(titles)); - TypedQuery query = entityManager.createQuery(criteriaQuery); - return query.getResultList(); - } - - @Override - public List searchByDepartmentQuery(String searchKey) { - CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class); - Root emp = criteriaQuery.from(DeptEmployee.class); - - Subquery subquery = criteriaQuery.subquery(Department.class); - Root dept = subquery.from(Department.class); - subquery.select(dept) - .distinct(true) - .where(criteriaBuilder.like(dept.get("name"), new StringBuffer("%").append(searchKey) - .append("%") - .toString())); - - criteriaQuery.select(emp) - .where(criteriaBuilder.in(emp.get("department")) - .value(subquery)); - - TypedQuery query = entityManager.createQuery(criteriaQuery); - return query.getResultList(); - } - - private CriteriaQuery createCriteriaQuery(Class klass) { - return criteriaBuilder.createQuery(klass); - } - -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java deleted file mode 100644 index dc5242ee7c..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung.hibernate.lob; - -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Properties; - -import org.apache.commons.lang3.StringUtils; -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.service.ServiceRegistry; - -import com.baeldung.hibernate.lob.model.User; - -public class HibernateSessionUtil { - - private static SessionFactory sessionFactory; - private static String PROPERTY_FILE_NAME; - - public static SessionFactory getSessionFactory() throws IOException { - return getSessionFactory(null); - } - - public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { - PROPERTY_FILE_NAME = propertyFileName; - if (sessionFactory == null) { - ServiceRegistry serviceRegistry = configureServiceRegistry(); - sessionFactory = makeSessionFactory(serviceRegistry); - } - return sessionFactory; - } - - private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { - MetadataSources metadataSources = new MetadataSources(serviceRegistry); - metadataSources.addAnnotatedClass(User.class); - - Metadata metadata = metadataSources.buildMetadata(); - return metadata.getSessionFactoryBuilder() - .build(); - - } - - private static ServiceRegistry configureServiceRegistry() throws IOException { - Properties properties = getProperties(); - return new StandardServiceRegistryBuilder().applySettings(properties) - .build(); - } - - private static Properties getProperties() throws IOException { - Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); - try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { - properties.load(inputStream); - } - return properties; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/model/User.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/model/User.java deleted file mode 100644 index 21f725b388..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/lob/model/User.java +++ /dev/null @@ -1,46 +0,0 @@ -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; - -@Entity -@Table(name="user") -public class User { - - @Id - private String id; - - @Column(name = "name", columnDefinition="VARCHAR(128)") - private String name; - - @Lob - @Column(name = "photo", columnDefinition="BLOB") - private byte[] photo; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public byte[] getPhoto() { - return photo; - } - - public void setPhoto(byte[] photo) { - this.photo = photo; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java deleted file mode 100644 index c2f276472e..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.hibernate.onetoone; - -import com.baeldung.hibernate.customtypes.LocalDateStringType; -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.service.ServiceRegistry; - -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Properties; - -public class HibernateUtil { - private static SessionFactory sessionFactory; - - private HibernateUtil() { - } - - public static SessionFactory getSessionFactory(Strategy strategy) { - return buildSessionFactory(strategy); - } - - private static SessionFactory buildSessionFactory(Strategy strategy) { - try { - ServiceRegistry serviceRegistry = configureServiceRegistry(); - - MetadataSources metadataSources = new MetadataSources(serviceRegistry); - - for (Class entityClass : strategy.getEntityClasses()) { - metadataSources.addAnnotatedClass(entityClass); - } - - Metadata metadata = metadataSources.getMetadataBuilder() - .applyBasicType(LocalDateStringType.INSTANCE) - .build(); - - return metadata.getSessionFactoryBuilder() - .build(); - } catch (IOException ex) { - throw new ExceptionInInitializerError(ex); - } - } - - - private static ServiceRegistry configureServiceRegistry() throws IOException { - Properties properties = getProperties(); - return new StandardServiceRegistryBuilder().applySettings(properties) - .build(); - } - - private static Properties getProperties() throws IOException { - Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource("hibernate.properties"); - try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { - properties.load(inputStream); - } - return properties; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java deleted file mode 100644 index 3180566ca5..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.hibernate.onetoone; - - -import java.util.Arrays; -import java.util.List; - -public enum Strategy { - //See that the classes belongs to different packages - FOREIGN_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.foreignkeybased.User.class, - com.baeldung.hibernate.onetoone.foreignkeybased.Address.class)), - SHARED_PRIMARY_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.sharedkeybased.User.class, - com.baeldung.hibernate.onetoone.sharedkeybased.Address.class)), - JOIN_TABLE_BASED(Arrays.asList(com.baeldung.hibernate.onetoone.jointablebased.Employee.class, - com.baeldung.hibernate.onetoone.jointablebased.WorkStation.class)); - - private List> entityClasses; - - Strategy(List> entityClasses) { - this.entityClasses = entityClasses; - } - - public List> getEntityClasses() { - return entityClasses; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java deleted file mode 100644 index e05eb46030..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.hibernate.onetoone.foreignkeybased; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -@Entity -@Table(name = "address") -public class Address { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private Long id; - - @Column(name = "street") - private String street; - - @Column(name = "city") - private String city; - - @OneToOne(mappedBy = "address") - private User user; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getStreet() { - return street; - } - - public void setStreet(String street) { - this.street = street; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java deleted file mode 100644 index dda972f29c..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.hibernate.onetoone.foreignkeybased; - -import javax.persistence.CascadeType; -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.OneToOne; -import javax.persistence.Table; - -@Entity -@Table(name = "users") -public class User { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private Long id; - - @Column(name = "username") - private String userName; - - @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "address_id", referencedColumnName = "id") - private Address address; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java deleted file mode 100644 index a0bc101b9f..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.baeldung.hibernate.onetoone.jointablebased; - -import javax.persistence.CascadeType; -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.JoinTable; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -@Entity -@Table(name = "employee") -public class Employee { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private Long id; - - @Column(name = "ename") - private String name; - - @OneToOne(cascade = CascadeType.ALL) - @JoinTable(name = "emp_workstation", joinColumns = {@JoinColumn(name = "employee_id", referencedColumnName = "id")}, - inverseJoinColumns = {@JoinColumn(name = "workstation_id", referencedColumnName = "id")}) - private WorkStation workStation; - - 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 WorkStation getWorkStation() { - return workStation; - } - - public void setWorkStation(WorkStation workStation) { - this.workStation = workStation; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java deleted file mode 100644 index f530611f6e..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung.hibernate.onetoone.jointablebased; - - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -@Entity -@Table(name = "workstation") -public class WorkStation { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private Long id; - - @Column(name = "workstation_number") - private Integer workstationNumber; - - @Column(name = "floor") - private String floor; - - @OneToOne(mappedBy = "workStation") - private Employee employee; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Integer getWorkstationNumber() { - return workstationNumber; - } - - public void setWorkstationNumber(Integer workstationNumber) { - this.workstationNumber = workstationNumber; - } - - public String getFloor() { - return floor; - } - - public void setFloor(String floor) { - this.floor = floor; - } - - public Employee getEmployee() { - return employee; - } - - public void setEmployee(Employee employee) { - this.employee = employee; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java deleted file mode 100644 index 927516f6bb..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.hibernate.onetoone.sharedkeybased; - - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.MapsId; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -@Entity -@Table(name = "address") -public class Address { - - @Id - @Column(name = "id") - private Long id; - - @Column(name = "street") - private String street; - - @Column(name = "city") - private String city; - - @OneToOne - @MapsId - private User user; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getStreet() { - return street; - } - - public void setStreet(String street) { - this.street = street; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java deleted file mode 100644 index fa00db1271..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.hibernate.onetoone.sharedkeybased; - - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -@Entity -@Table(name = "users") -public class User { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private Long id; - - @Column(name = "username") - private String userName; - - @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) - private Address address; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java deleted file mode 100644 index 1af3e3e21b..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.hibernate.optimisticlocking; - -import javax.persistence.*; - -@Entity -public class OptimisticLockingCourse { - - @Id - private Long id; - - private String name; - - @ManyToOne - @JoinTable(name = "optimistic_student_course") - private OptimisticLockingStudent student; - - public OptimisticLockingCourse(Long id, String name) { - this.id = id; - this.name = name; - } - - public OptimisticLockingCourse() { - } - - 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 OptimisticLockingStudent getStudent() { - return student; - } - - public void setStudent(OptimisticLockingStudent student) { - this.student = student; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java deleted file mode 100644 index b79212ae8d..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.baeldung.hibernate.optimisticlocking; - -import javax.persistence.*; -import java.util.List; - -@Entity -public class OptimisticLockingStudent { - - @Id - private Long id; - - private String name; - - private String lastName; - @Version - private Integer version; - - @OneToMany(mappedBy = "student") - private List courses; - - public OptimisticLockingStudent(Long id, String name, String lastName, List courses) { - this.id = id; - this.name = name; - this.lastName = lastName; - this.courses = courses; - } - - public OptimisticLockingStudent() { - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Integer getVersion() { - return version; - } - - public void setVersion(Integer version) { - this.version = version; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public List getCourses() { - return courses; - } - - public void setCourses(List courses) { - this.courses = courses; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java deleted file mode 100644 index c889cb6127..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import javax.persistence.Embeddable; - -@Embeddable -public class Address { - - private String country; - private String city; - - public Address(String country, String city) { - this.country = country; - this.city = city; - } - - public Address() { - } - - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java deleted file mode 100644 index cb73cbc958..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import javax.persistence.*; -import java.util.List; - -@Entity -public class Customer { - - @Id - private Long customerId; - private String name; - private String lastName; - @ElementCollection - @CollectionTable(name = "customer_address") - private List
addressList; - - public Customer() { - } - - public Customer(Long customerId, String name, String lastName, List
addressList) { - this.customerId = customerId; - this.name = name; - this.lastName = lastName; - this.addressList = addressList; - } - - public Long getCustomerId() { - return customerId; - } - - public void setCustomerId(Long customerId) { - this.customerId = customerId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public List
getAddressList() { - return addressList; - } - - public void setAddressList(List
addressList) { - this.addressList = addressList; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java deleted file mode 100644 index e491c09eb5..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; - -@Entity -@Inheritance(strategy = InheritanceType.JOINED) -public class Individual { - - @Id - private Long id; - private String name; - private String lastName; - - public Individual(Long id, String name, String lastName) { - this.id = id; - this.name = name; - this.lastName = lastName; - } - - public Individual() { - } - - 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 String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java deleted file mode 100644 index aea7d5fc87..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import javax.persistence.*; - -@Entity -public class PessimisticLockingCourse { - - @Id - private Long courseId; - private String name; - @ManyToOne - @JoinTable(name = "student_course") - private PessimisticLockingStudent student; - - public PessimisticLockingCourse(Long courseId, String name, PessimisticLockingStudent student) { - this.courseId = courseId; - this.name = name; - this.student = student; - } - - public PessimisticLockingCourse() { - } - - public Long getCourseId() { - return courseId; - } - - public void setCourseId(Long courseId) { - this.courseId = courseId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public PessimisticLockingStudent getStudent() { - return student; - } - - public void setStudent(PessimisticLockingStudent students) { - this.student = students; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java deleted file mode 100644 index a1328cbdad..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import javax.persistence.Entity; -import java.math.BigDecimal; - -@Entity -public class PessimisticLockingEmployee extends Individual { - - private BigDecimal salary; - - public PessimisticLockingEmployee(Long id, String name, String lastName, BigDecimal salary) { - super(id, name, lastName); - this.salary = salary; - } - - public PessimisticLockingEmployee() { - super(); - } - - public BigDecimal getSalary() { - return salary; - } - - public void setSalary(BigDecimal average) { - this.salary = average; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java deleted file mode 100644 index e6c5f476b4..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import javax.persistence.*; -import java.util.List; - -@Entity -public class PessimisticLockingStudent { - - @Id - private Long id; - private String name; - @OneToMany(mappedBy = "student") - private List courses; - - public PessimisticLockingStudent(Long id, String name) { - this.id = id; - this.name = name; - } - - public PessimisticLockingStudent() { - } - - 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 getCourses() { - return courses; - } - - public void setCourses(List courses) { - this.courses = courses; - } -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Person.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Person.java deleted file mode 100644 index 390a5954ed..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Person.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.hibernate.pojo; - -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -import com.baeldung.hibernate.converters.PersonNameConverter; - -@Entity(name = "PersonTable") -public class Person { - - @Id - @GeneratedValue - private Long id; - - @Convert(converter = PersonNameConverter.class) - private PersonName personName; - - public PersonName getPersonName() { - return personName; - } - - public void setPersonName(PersonName personName) { - this.personName = personName; - } - - public Long getId() { - return id; - } - -} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/transaction/PostService.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/transaction/PostService.java deleted file mode 100644 index 5a4eb20079..0000000000 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/transaction/PostService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.hibernate.transaction; - -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.query.Query; - -public class PostService { - - - private Session session; - - public PostService(Session session) { - this.session = session; - } - - - public void updatePost(String title, String body, int id) { - Transaction txn = session.beginTransaction(); - Query updateQuery = session.createQuery("UPDATE Post p SET p.title = ?1, p.body = ?2 WHERE p.id = ?3"); - updateQuery.setParameter(1, title); - updateQuery.setParameter(2, body); - updateQuery.setParameter(3, id); - updateQuery.executeUpdate(); - txn.commit(); - } - - - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java deleted file mode 100644 index 699890c457..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.baeldung.hibernate; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.IOException; -import java.util.List; - -import com.baeldung.hibernate.entities.DeptEmployee; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.query.Query; -import org.hibernate.transform.Transformers; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import com.baeldung.hibernate.entities.Department; -import com.baeldung.hibernate.pojo.Result; - -public class CustomClassIntegrationTest { - - private Session session; - - private Transaction transaction; - - @BeforeEach - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory().openSession(); - transaction = session.beginTransaction(); - session.createNativeQuery("delete from department").executeUpdate(); - Department department = new Department("Sales"); - DeptEmployee employee = new DeptEmployee("John Smith", "001", department); - session.persist(department); - session.persist(employee); - transaction.commit(); - transaction = session.beginTransaction(); - } - - @Test - public void whenAllManagersAreSelected_ThenObjectGraphIsReturned() { - Query query = session.createQuery("from com.baeldung.hibernate.entities.DeptEmployee"); - List deptEmployees = query.list(); - DeptEmployee deptEmployee = deptEmployees.get(0); - assertEquals("John Smith", deptEmployee.getName()); - assertEquals("Sales", deptEmployee.getDepartment().getName()); - } - - @Test - public void whenIndividualPropertiesAreSelected_ThenObjectArrayIsReturned() { - Query query = session.createQuery("select m.name, m.department.name from com.baeldung.hibernate.entities.DeptEmployee m"); - List managers = query.list(); - Object[] manager = (Object[]) managers.get(0); - assertEquals("John Smith", manager[0]); - assertEquals("Sales", manager[1]); - } - - @Test - public void whenResultConstructorInSelect_ThenListOfResultIsReturned() { - Query query = session.createQuery("select new com.baeldung.hibernate.pojo.Result(m.name, m.department.name) " - + "from DeptEmployee m"); - List results = query.list(); - Result result = results.get(0); - assertEquals("John Smith", result.getEmployeeName()); - assertEquals("Sales", result.getDepartmentName()); - } - - @Test - public void whenResultTransformerOnQuery_ThenListOfResultIsReturned() { - Query query = session.createQuery("select m.name as employeeName, m.department.name as departmentName " - + "from com.baeldung.hibernate.entities.DeptEmployee m"); - query.setResultTransformer(Transformers.aliasToBean(Result.class)); - List results = query.list(); - Result result = results.get(0); - assertEquals("John Smith", result.getEmployeeName()); - assertEquals("Sales", result.getDepartmentName()); - } - - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java deleted file mode 100644 index 7a112200b5..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.baeldung.hibernate; - -import com.baeldung.hibernate.pojo.Employee; -import com.baeldung.hibernate.pojo.EntityDescription; -import com.baeldung.hibernate.pojo.Phone; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DynamicMappingIntegrationTest { - - private Session session; - - private Transaction transaction; - - @Before - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory().openSession(); - transaction = session.beginTransaction(); - - session.createNativeQuery("delete from phone").executeUpdate(); - session.createNativeQuery("delete from employee").executeUpdate(); - - transaction.commit(); - transaction = session.beginTransaction(); - } - - @After - public void tearDown() { - transaction.rollback(); - session.close(); - } - - @Test - public void givenEntity_whenFieldMappedWithFormula_thenFieldIsCalculated() { - Employee employee = new Employee(10_000L, 25); - assertThat(employee.getTaxJavaWay()).isEqualTo(2_500L); - - session.save(employee); - session.flush(); - session.clear(); - - employee = session.get(Employee.class, employee.getId()); - assertThat(employee.getTax()).isEqualTo(2_500L); - } - - @Test - public void givenEntityMappedWithWhere_whenDeletedIsTrue_thenEntityNotFetched() { - Employee employee = new Employee(); - - session.save(employee); - session.clear(); - - employee = session.find(Employee.class, employee.getId()); - assertThat(employee).isNotNull(); - - employee.setDeleted(true); - session.flush(); - - employee = session.find(Employee.class, employee.getId()); - assertThat(employee).isNotNull(); - - session.clear(); - - employee = session.find(Employee.class, employee.getId()); - assertThat(employee).isNull(); - - } - - @Test - public void givenCollectionMappedWithWhere_whenDeletedIsTrue_thenEntityNotFetched() { - Employee employee = new Employee(); - Phone phone1 = new Phone("555-45-67"); - Phone phone2 = new Phone("555-89-01"); - employee.getPhones().add(phone1); - employee.getPhones().add(phone2); - - session.save(phone1); - session.save(phone2); - session.save(employee); - session.flush(); - session.clear(); - - employee = session.find(Employee.class, employee.getId()); - assertThat(employee.getPhones()).hasSize(2); - - employee.getPhones().iterator().next().setDeleted(true); - session.flush(); - session.clear(); - - employee = session.find(Employee.class, employee.getId()); - assertThat(employee.getPhones()).hasSize(1); - - List fullPhoneList = session.createQuery("from Phone").getResultList(); - assertThat(fullPhoneList).hasSize(2); - - } - - @Test - public void givenFilterByIncome_whenIncomeLimitSet_thenFilterIsApplied() throws IOException { - session.save(new Employee(10_000, 25)); - session.save(new Employee(12_000, 25)); - session.save(new Employee(15_000, 25)); - - session.flush(); - session.clear(); - - session.enableFilter("incomeLevelFilter") - .setParameter("incomeLimit", 11_000); - - List employees = session.createQuery("from Employee").getResultList(); - - assertThat(employees).hasSize(2); - - Employee employee = session.get(Employee.class, 1); - assertThat(employee.getGrossIncome()).isEqualTo(10_000); - - session.disableFilter("incomeLevelFilter"); - employees = session.createQuery("from Employee").getResultList(); - - assertThat(employees).hasSize(3); - - } - - @Test - public void givenMappingWithAny_whenDescriptionAddedToEntity_thenDescriptionCanReferAnyEntity() { - Employee employee = new Employee(); - Phone phone1 = new Phone("555-45-67"); - Phone phone2 = new Phone("555-89-01"); - employee.getPhones().add(phone1); - employee.getPhones().add(phone2); - - EntityDescription employeeDescription = new EntityDescription("Send to conference next year", employee); - EntityDescription phone1Description = new EntityDescription("Home phone (do not call after 10PM)", phone1); - EntityDescription phone2Description = new EntityDescription("Work phone", phone1); - - session.save(phone1); - session.save(phone2); - session.save(employee); - session.save(employeeDescription); - session.save(phone1Description); - session.save(phone2Description); - session.flush(); - session.clear(); - - List descriptions = session.createQuery("from EntityDescription").getResultList(); - - assertThat(Employee.class.isAssignableFrom(descriptions.get(0).getEntity().getClass())).isTrue(); - assertThat(Phone.class.isAssignableFrom(descriptions.get(1).getEntity().getClass())).isTrue(); - assertThat(Phone.class.isAssignableFrom(descriptions.get(2).getEntity().getClass())).isTrue(); - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java deleted file mode 100644 index 74f752ab8c..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.baeldung.hibernate; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Properties; - -import javax.persistence.Query; - -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -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; - -public class HibernateSpatialIntegrationTest { - - private Session session; - private Transaction transaction; - - @Before - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") - .openSession(); - transaction = session.beginTransaction(); - session.doWork(conn -> { GeoDB.InitGeoDB(conn); }); - } - - @After - public void tearDown() { - transaction.rollback(); - session.close(); - } - - @Test - public void shouldConvertWktToGeometry() throws ParseException { - Geometry geometry = wktToGeometry("POINT (2 5)"); - assertEquals("Point", geometry.getGeometryType()); - assertTrue(geometry instanceof Point); - } - - @Test - public void shouldInsertAndSelectPoints() throws ParseException { - PointEntity entity = new PointEntity(); - entity.setPoint((Point) wktToGeometry("POINT (1 1)")); - - session.persist(entity); - PointEntity fromDb = session.find(PointEntity.class, entity.getId()); - assertEquals("POINT (1 1)", fromDb.getPoint().toString()); - } - - @Test - public void shouldSelectDisjointPoints() throws ParseException { - insertPoint("POINT (1 2)"); - insertPoint("POINT (3 4)"); - insertPoint("POINT (5 6)"); - - Point point = (Point) wktToGeometry("POINT (3 4)"); - Query query = session.createQuery("select p from PointEntity p " - + "where disjoint(p.point, :point) = true", PointEntity.class); - query.setParameter("point", point); - assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(0)).getPoint().toString()); - assertEquals("POINT (5 6)", ((PointEntity) query.getResultList().get(1)).getPoint().toString()); - } - - @Test - public void shouldSelectAllPointsWithinPolygon() throws ParseException { - insertPoint("POINT (1 1)"); - insertPoint("POINT (1 2)"); - insertPoint("POINT (3 4)"); - insertPoint("POINT (5 6)"); - - Query query = session.createQuery("select p from PointEntity p where within(p.point, :area) = true", - PointEntity.class); - query.setParameter("area", wktToGeometry("POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))")); - assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) - .containsOnly("POINT (1 1)", "POINT (1 2)", "POINT (3 4)"); - } - - @Test - public void shouldSelectAllPointsWithinRadius() throws ParseException { - insertPoint("POINT (1 1)"); - insertPoint("POINT (1 2)"); - insertPoint("POINT (3 4)"); - insertPoint("POINT (5 6)"); - - Query query = session.createQuery("select p from PointEntity p where within(p.point, :circle) = true", - PointEntity.class); - query.setParameter("circle", createCircle(0.0, 0.0, 5)); - - assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) - .containsOnly("POINT (1 1)", "POINT (1 2)"); - } - - @Test - public void shouldSelectAdjacentPolygons() throws ParseException { - insertPolygon("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))"); - insertPolygon("POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); - insertPolygon("POLYGON ((2 2, 3 1, 2 5, 4 3, 3 3, 2 2))"); - - Query query = session.createQuery("select p from PolygonEntity p where touches(p.polygon, :polygon) = true", - PolygonEntity.class); - query.setParameter("polygon", wktToGeometry("POLYGON ((5 5, 5 10, 10 10, 10 5, 5 5))")); - assertThat(query.getResultList().stream().map(p -> ((PolygonEntity) p).getPolygon().toString())) - .containsOnly("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))", "POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); - } - - private void insertPoint(String point) throws ParseException { - PointEntity entity = new PointEntity(); - entity.setPoint((Point) wktToGeometry(point)); - session.persist(entity); - } - - private void insertPolygon(String polygon) throws ParseException { - PolygonEntity entity = new PolygonEntity(); - entity.setPolygon((Polygon) wktToGeometry(polygon)); - session.persist(entity); - } - - private Geometry wktToGeometry(String wellKnownText) throws ParseException { - WKTReader fromText = new WKTReader(); - Geometry geom = null; - geom = fromText.read(wellKnownText); - return geom; - } - - private static Geometry createCircle(double x, double y, double radius) { - GeometricShapeFactory shapeFactory = new GeometricShapeFactory(); - shapeFactory.setNumPoints(32); - shapeFactory.setCentre(new Coordinate(x, y)); - shapeFactory.setSize(radius * 2); - return shapeFactory.createCircle(); - } - - public static Properties getProperties(String propertyFile) throws IOException { - Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource(propertyFile); - try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { - properties.load(inputStream); - } - return properties; - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java deleted file mode 100644 index 0f35dbb8af..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.baeldung.hibernate; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.IOException; - -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.After; -import org.junit.Before; -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.MyEmployee; -import com.baeldung.hibernate.pojo.inheritance.Pen; -import com.baeldung.hibernate.pojo.inheritance.Pet; - -public class InheritanceMappingIntegrationTest { - private Session session; - - private Transaction transaction; - - @Before - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory() - .openSession(); - transaction = session.beginTransaction(); - } - - @After - public void tearDown() { - transaction.rollback(); - session.close(); - } - - @Test - public void givenSubclasses_whenQuerySingleTableSuperclass_thenOk() { - Book book = new Book(1, "1984", "George Orwell"); - session.save(book); - Pen pen = new Pen(2, "my pen", "blue"); - session.save(pen); - - assertThat(session.createQuery("from MyProduct") - .getResultList() - .size()).isEqualTo(2); - } - - @Test - public void givenSubclasses_whenQueryMappedSuperclass_thenOk() { - MyEmployee emp = new MyEmployee(1, "john", "baeldung"); - session.save(emp); - - assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Person") - .getResultList() - .size()).isEqualTo(1); - } - - @Test - public void givenSubclasses_whenQueryJoinedTableSuperclass_thenOk() { - Pet pet = new Pet(1, "dog", "lassie"); - session.save(pet); - - assertThat(session.createQuery("from Animal") - .getResultList() - .size()).isEqualTo(1); - } - - @Test - public void givenSubclasses_whenQueryTablePerClassSuperclass_thenOk() { - Car car = new Car(1, "audi", "xyz"); - session.save(car); - - assertThat(session.createQuery("from Vehicle") - .getResultList() - .size()).isEqualTo(1); - } - - @Test - public void givenSubclasses_whenQueryNonMappedInterface_thenOk() { - Bag bag = new Bag(1, "large"); - session.save(bag); - - assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Item") - .getResultList() - .size()).isEqualTo(0); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java deleted file mode 100644 index cb73fe348c..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.baeldung.hibernate; - -import com.baeldung.hibernate.entities.Department; -import com.baeldung.hibernate.entities.DeptEmployee; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.query.NativeQuery; -import org.hibernate.query.Query; -import org.junit.*; - -import java.io.IOException; - -public class NamedQueryIntegrationTest { - private static Session session; - - private Transaction transaction; - - private Long purchaseDeptId; - - @BeforeClass - public static void setUpClass() throws IOException { - session = HibernateUtil.getSessionFactory("hibernate-namedquery.properties").openSession(); - } - - @Before - public void setUp() throws IOException { - transaction = session.beginTransaction(); - session.createNativeQuery("delete from deptemployee").executeUpdate(); - session.createNativeQuery("delete from department").executeUpdate(); - Department salesDepartment = new Department("Sales"); - Department purchaseDepartment = new Department("Purchase"); - DeptEmployee employee1 = new DeptEmployee("John Wayne", "001", salesDepartment); - DeptEmployee employee2 = new DeptEmployee("Sarah Vinton", "002", salesDepartment); - DeptEmployee employee3 = new DeptEmployee("Lisa Carter", "003", salesDepartment); - session.persist(salesDepartment); - session.persist(purchaseDepartment); - purchaseDeptId = purchaseDepartment.getId(); - session.persist(employee1); - session.persist(employee2); - session.persist(employee3); - transaction.commit(); - transaction = session.beginTransaction(); - } - - @After - public void tearDown() { - if(transaction.isActive()) { - transaction.rollback(); - } - } - - @Test - public void whenNamedQueryIsCalledUsingCreateNamedQuery_ThenOk() { - Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); - query.setParameter("employeeNo", "001"); - DeptEmployee result = query.getSingleResult(); - Assert.assertNotNull(result); - Assert.assertEquals("John Wayne", result.getName()); - } - - @Test - public void whenNamedNativeQueryIsCalledUsingCreateNamedQuery_ThenOk() { - Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeName", DeptEmployee.class); - query.setParameter("name", "John Wayne"); - DeptEmployee result = query.getSingleResult(); - Assert.assertNotNull(result); - Assert.assertEquals("001", result.getEmployeeNumber()); - } - - @Test - public void whenNamedNativeQueryIsCalledUsingGetNamedNativeQuery_ThenOk() { - @SuppressWarnings("rawtypes") - NativeQuery query = session.getNamedNativeQuery("DeptEmployee_FindByEmployeeName"); - query.setParameter("name", "John Wayne"); - DeptEmployee result = (DeptEmployee) query.getSingleResult(); - Assert.assertNotNull(result); - Assert.assertEquals("001", result.getEmployeeNumber()); - } - - @Test - public void whenUpdateQueryIsCalledWithCreateNamedQuery_ThenOk() { - Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDepartment"); - spQuery.setParameter("employeeNo", "001"); - Department newDepartment = session.find(Department.class, purchaseDeptId); - spQuery.setParameter("newDepartment", newDepartment); - spQuery.executeUpdate(); - transaction.commit(); - } - - @Test - public void whenNamedStoredProcedureIsCalledWithCreateNamedQuery_ThenOk() { - Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDesignation"); - spQuery.setParameter("employeeNumber", "002"); - spQuery.setParameter("newDesignation", "Supervisor"); - spQuery.executeUpdate(); - transaction.commit(); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java deleted file mode 100644 index 91c41af0fe..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.baeldung.hibernate; - -import com.baeldung.hibernate.pojo.TemporalValues; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.time.*; -import java.util.Calendar; -import java.util.TimeZone; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TemporalValuesUnitTest { - - private Session session; - - private Transaction transaction; - - @Before - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory().withOptions() - .jdbcTimeZone(TimeZone.getTimeZone("UTC")) - .openSession(); - transaction = session.beginTransaction(); - session.createNativeQuery("delete from temporalvalues").executeUpdate(); - } - - @After - public void tearDown() { - transaction.rollback(); - session.close(); - } - - @Test - public void givenEntity_whenMappingSqlTypes_thenTemporalIsSelectedAutomatically() { - TemporalValues temporalValues = new TemporalValues(); - temporalValues.setSqlDate(java.sql.Date.valueOf("2017-11-15")); - temporalValues.setSqlTime(java.sql.Time.valueOf("15:30:14")); - temporalValues.setSqlTimestamp(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332")); - - session.save(temporalValues); - session.flush(); - session.clear(); - - temporalValues = session.get(TemporalValues.class, temporalValues.getId()); - assertThat(temporalValues.getSqlDate()).isEqualTo(java.sql.Date.valueOf("2017-11-15")); - assertThat(temporalValues.getSqlTime()).isEqualTo(java.sql.Time.valueOf("15:30:14")); - assertThat(temporalValues.getSqlTimestamp()).isEqualTo(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332")); - - } - - @Test - public void givenEntity_whenMappingUtilDateType_thenTemporalIsSpecifiedExplicitly() throws Exception { - TemporalValues temporalValues = new TemporalValues(); - temporalValues.setUtilDate(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15")); - temporalValues.setUtilTime(new SimpleDateFormat("HH:mm:ss").parse("15:30:14")); - temporalValues.setUtilTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.332")); - - session.save(temporalValues); - session.flush(); - session.clear(); - - temporalValues = session.get(TemporalValues.class, temporalValues.getId()); - assertThat(temporalValues.getUtilDate()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15")); - assertThat(temporalValues.getUtilTime()).isEqualTo(new SimpleDateFormat("HH:mm:ss").parse("15:30:14")); - assertThat(temporalValues.getUtilTimestamp()).isEqualTo(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332")); - - } - - @Test - public void givenEntity_whenMappingCalendarType_thenTemporalIsSpecifiedExplicitly() throws Exception { - TemporalValues temporalValues = new TemporalValues(); - - Calendar calendarDate = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - calendarDate.set(Calendar.YEAR, 2017); - calendarDate.set(Calendar.MONTH, 10); - calendarDate.set(Calendar.DAY_OF_MONTH, 15); - temporalValues.setCalendarDate(calendarDate); - - Calendar calendarTimestamp = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - calendarTimestamp.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.322")); - temporalValues.setCalendarTimestamp(calendarTimestamp); - - session.save(temporalValues); - session.flush(); - session.clear(); - - temporalValues = session.get(TemporalValues.class, temporalValues.getId()); - assertThat(temporalValues.getCalendarDate().getTime()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15")); - assertThat(temporalValues.getCalendarTimestamp().getTime()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.322")); - - } - - @Test - public void givenEntity_whenMappingJavaTimeTypes_thenTemporalIsSelectedAutomatically() { - TemporalValues temporalValues = new TemporalValues(); - - temporalValues.setLocalDate(LocalDate.parse("2017-11-15")); - temporalValues.setLocalTime(LocalTime.parse("15:30:18")); - temporalValues.setOffsetTime(OffsetTime.parse("08:22:12+01:00")); - - System.out.println("********"+OffsetTime.parse("08:22:12+01:00").toString()); - temporalValues.setInstant(Instant.parse("2017-11-15T08:22:12Z")); - temporalValues.setLocalDateTime(LocalDateTime.parse("2017-11-15T08:22:12")); - temporalValues.setOffsetDateTime(OffsetDateTime.parse("2017-11-15T08:22:12+01:00")); - temporalValues.setZonedDateTime(ZonedDateTime.parse("2017-11-15T08:22:12+01:00[Europe/Paris]")); - - session.save(temporalValues); - session.flush(); - session.clear(); - - temporalValues = session.get(TemporalValues.class, temporalValues.getId()); - assertThat(temporalValues.getLocalDate()).isEqualTo(LocalDate.parse("2017-11-15")); - assertThat(temporalValues.getLocalTime()).isEqualTo(LocalTime.parse("15:30:18")); - //assertThat(temporalValues.getOffsetTime()).isEqualTo(OffsetTime.parse("08:22:12+01:00")); - assertThat(temporalValues.getInstant()).isEqualTo(Instant.parse("2017-11-15T08:22:12Z")); - assertThat(temporalValues.getLocalDateTime()).isEqualTo(LocalDateTime.parse("2017-11-15T08:22:12")); - //assertThat(temporalValues.getOffsetDateTime()).isEqualTo(OffsetDateTime.parse("2017-11-15T08:22:12+01:00")); - assertThat(temporalValues.getZonedDateTime()).isEqualTo(ZonedDateTime.parse("2017-11-15T08:22:12+01:00[Europe/Paris]")); - - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java deleted file mode 100644 index 0b2bdf7ead..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.baeldung.hibernate.aggregatefunctions; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.IOException; - -import org.hibernate.HibernateException; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.baeldung.hibernate.HibernateUtil; -import com.baeldung.hibernate.pojo.Student; - -public class AggregateFunctionsIntegrationTest { - - private static Session session; - private static Transaction transaction; - - @BeforeClass - public static final void setup() throws HibernateException, IOException { - session = HibernateUtil.getSessionFactory() - .openSession(); - transaction = session.beginTransaction(); - - Student jonas = new Student("Jonas", 22); - session.save(jonas); - - Student sally = new Student("Sally", 20); - session.save(sally); - - Student simon = new Student("Simon", 25); - session.save(simon); - - Student raven = new Student("Raven", 21); - session.save(raven); - - Student sam = new Student("Sam", 23); - session.save(sam); - - } - - @AfterClass - public static final void teardown() { - if (session != null) { - transaction.rollback(); - session.close(); - } - } - - @Test - public void whenMaxAge_ThenReturnValue() { - int maxAge = (int) session.createQuery("SELECT MAX(age) from Student") - .getSingleResult(); - assertThat(maxAge).isEqualTo(25); - } - - @Test - public void whenMinAge_ThenReturnValue() { - int minAge = (int) session.createQuery("SELECT MIN(age) from Student") - .getSingleResult(); - assertThat(minAge).isEqualTo(20); - } - - @Test - public void whenAverageAge_ThenReturnValue() { - Double avgAge = (Double) session.createQuery("SELECT AVG(age) from Student") - .getSingleResult(); - assertThat(avgAge).isEqualTo(22.2); - } - - @Test - public void whenCountAll_ThenReturnValue() { - Long totalStudents = (Long) session.createQuery("SELECT COUNT(*) from Student") - .getSingleResult(); - assertThat(totalStudents).isEqualTo(5); - } - - @Test - public void whenSumOfAllAges_ThenReturnValue() { - Long sumOfAllAges = (Long) session.createQuery("SELECT SUM(age) from Student") - .getSingleResult(); - assertThat(sumOfAllAges).isEqualTo(111); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java deleted file mode 100644 index 3cd4761a7b..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.baeldung.hibernate.converter; - -import java.io.IOException; - -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.hibernate.HibernateUtil; -import com.baeldung.hibernate.pojo.Person; -import com.baeldung.hibernate.pojo.PersonName; - -import static org.junit.Assert.assertEquals; - -public class PersonNameConverterUnitTest { - - private Session session; - private Transaction transaction; - - @Before - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory() - .openSession(); - transaction = session.beginTransaction(); - - session.createNativeQuery("delete from personTable") - .executeUpdate(); - - transaction.commit(); - transaction = session.beginTransaction(); - } - - @After - public void tearDown() { - transaction.rollback(); - session.close(); - } - - @Test - public void givenPersonName_WhenSaving_ThenNameAndSurnameConcat() { - final String name = "name"; - final String surname = "surname"; - - PersonName personName = new PersonName(); - personName.setName(name); - personName.setSurname(surname); - - Person person = new Person(); - person.setPersonName(personName); - - Long id = (Long) session.save(person); - - session.flush(); - session.clear(); - - String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") - .setParameter("id", id) - .getSingleResult(); - - assertEquals(surname + ", " + name, dbPersonName); - - Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) - .setParameter("id", id) - .getSingleResult(); - - assertEquals(dbPerson.getPersonName() - .getName(), name); - assertEquals(dbPerson.getPersonName() - .getSurname(), surname); - } - - @Test - public void givenPersonNameNull_WhenSaving_ThenNullStored() { - final String name = null; - final String surname = null; - - PersonName personName = new PersonName(); - personName.setName(name); - personName.setSurname(surname); - - Person person = new Person(); - person.setPersonName(personName); - - Long id = (Long) session.save(person); - - session.flush(); - session.clear(); - - String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") - .setParameter("id", id) - .getSingleResult(); - - assertEquals("", dbPersonName); - - Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) - .setParameter("id", id) - .getSingleResult(); - - assertEquals(dbPerson.getPersonName(), null); - } - - @Test - public void givenPersonNameWithoutName_WhenSaving_ThenNotNameStored() { - final String name = null; - final String surname = "surname"; - - PersonName personName = new PersonName(); - personName.setName(name); - personName.setSurname(surname); - - Person person = new Person(); - person.setPersonName(personName); - - Long id = (Long) session.save(person); - - session.flush(); - session.clear(); - - String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") - .setParameter("id", id) - .getSingleResult(); - - assertEquals("surname, ", dbPersonName); - - Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) - .setParameter("id", id) - .getSingleResult(); - - assertEquals(dbPerson.getPersonName() - .getName(), name); - assertEquals(dbPerson.getPersonName() - .getSurname(), surname); - } - - @Test - public void givenPersonNameWithoutSurName_WhenSaving_ThenNotSurNameStored() { - final String name = "name"; - final String surname = null; - - PersonName personName = new PersonName(); - personName.setName(name); - personName.setSurname(surname); - - Person person = new Person(); - person.setPersonName(personName); - - Long id = (Long) session.save(person); - - session.flush(); - session.clear(); - - String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") - .setParameter("id", id) - .getSingleResult(); - - assertEquals("name", dbPersonName); - - Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) - .setParameter("id", id) - .getSingleResult(); - - assertEquals(dbPerson.getPersonName() - .getName(), name); - assertEquals(dbPerson.getPersonName() - .getSurname(), surname); - } - - @Test - public void givenPersonNameEmptyFields_WhenSaving_ThenFielsNotStored() { - final String name = ""; - final String surname = ""; - - PersonName personName = new PersonName(); - personName.setName(name); - personName.setSurname(surname); - - Person person = new Person(); - person.setPersonName(personName); - - Long id = (Long) session.save(person); - - session.flush(); - session.clear(); - - String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") - .setParameter("id", id) - .getSingleResult(); - - assertEquals("", dbPersonName); - - Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) - .setParameter("id", id) - .getSingleResult(); - - assertEquals(dbPerson.getPersonName(), null); - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java deleted file mode 100644 index cedba412d9..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.baeldung.hibernate.criteriaquery; - -import com.baeldung.hibernate.criteriaquery.HibernateUtil; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.query.Query; -import org.junit.After; -import org.junit.AfterClass; -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 java.io.IOException; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - - -public class TypeSafeCriteriaIntegrationTest { - - private static SessionFactory sessionFactory; - - private Session session; - - @BeforeClass - public static void beforeTests() throws IOException { - sessionFactory = HibernateUtil.getSessionFactory(); - } - - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); - } - - @Test - public void givenStudentData_whenUsingTypeSafeCriteriaQuery_thenSearchAllStudentsOfAGradYear() { - - prepareData(); - CriteriaBuilder cb = session.getCriteriaBuilder(); - CriteriaQuery criteriaQuery = cb.createQuery(Student.class); - - Root root = criteriaQuery.from(Student.class); - criteriaQuery.select(root).where(cb.equal(root.get("gradYear"), 1965)); - - Query query = session.createQuery(criteriaQuery); - List results = query.getResultList(); - - assertNotNull(results); - assertEquals(1, results.size()); - - Student student = results.get(0); - - assertEquals("Ken", student.getFirstName()); - assertEquals("Thompson", student.getLastName()); - assertEquals(1965, student.getGradYear()); - } - - private void prepareData() { - Student student1 = new Student(); - student1.setFirstName("Ken"); - student1.setLastName("Thompson"); - student1.setGradYear(1965); - - session.save(student1); - - Student student2 = new Student(); - student2.setFirstName("Dennis"); - student2.setLastName("Ritchie"); - student2.setGradYear(1963); - - session.save(student2); - session.getTransaction().commit(); - } - - @After - public void tearDown() { - session.close(); - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java deleted file mode 100644 index 63dc6330be..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.baeldung.hibernate.customtypes; - -import com.baeldung.hibernate.HibernateUtil; -import org.hibernate.SessionFactory; -import org.hibernate.query.Query; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.time.LocalDate; - -import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; - -public class HibernateCustomTypesManualTest { - - @Test - public void givenEmployee_whenSavedWithCustomTypes_thenEntityIsSaved() throws IOException { - - final OfficeEmployee e = new OfficeEmployee(); - e.setDateOfJoining(LocalDate.now()); - - PhoneNumber number = new PhoneNumber(1, 222, 8781902); - e.setEmployeeNumber(number); - - Address empAdd = new Address(); - empAdd.setAddressLine1("Street"); - empAdd.setAddressLine2("Area"); - empAdd.setCity("City"); - empAdd.setCountry("Country"); - empAdd.setZipCode(100); - - e.setEmpAddress(empAdd); - - Salary empSalary = new Salary(); - empSalary.setAmount(1000L); - empSalary.setCurrency("USD"); - e.setSalary(empSalary); - - doInHibernate(this::sessionFactory, session -> { - session.save(e); - boolean contains = session.contains(e); - Assert.assertTrue(contains); - }); - - } - - @Test - public void givenEmployee_whenCustomTypeInQuery_thenReturnEntity() throws IOException { - - final OfficeEmployee e = new OfficeEmployee(); - e.setDateOfJoining(LocalDate.now()); - - PhoneNumber number = new PhoneNumber(1, 222, 8781902); - e.setEmployeeNumber(number); - - Address empAdd = new Address(); - empAdd.setAddressLine1("Street"); - empAdd.setAddressLine2("Area"); - empAdd.setCity("City"); - empAdd.setCountry("Country"); - empAdd.setZipCode(100); - e.setEmpAddress(empAdd); - - Salary empSalary = new Salary(); - empSalary.setAmount(1000L); - empSalary.setCurrency("USD"); - e.setSalary(empSalary); - - doInHibernate(this::sessionFactory, session -> { - session.save(e); - - Query query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode"); - query.setParameter("pinCode",100); - int size = query.list().size(); - - Assert.assertEquals(1, size); - }); - - } - - private SessionFactory sessionFactory() { - try { - return HibernateUtil.getSessionFactory("hibernate-customtypes.properties"); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java deleted file mode 100644 index 3581c81daa..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java +++ /dev/null @@ -1,425 +0,0 @@ -package com.baeldung.hibernate.exception; - -import static org.hamcrest.CoreMatchers.isA; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import java.util.List; - -import javax.persistence.OptimisticLockException; -import javax.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.query.NativeQuery; -import org.hibernate.tool.schema.spi.CommandAcceptanceException; -import org.hibernate.tool.schema.spi.SchemaManagementException; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class HibernateExceptionUnitTest { - - private static final Logger logger = LoggerFactory - .getLogger(HibernateExceptionUnitTest.class); - private SessionFactory sessionFactory; - - @Before - public void setUp() throws IOException { - sessionFactory = HibernateUtil.getSessionFactory(); - } - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private Configuration getConfiguration() { - Configuration cfg = new Configuration(); - cfg.setProperty(AvailableSettings.DIALECT, - "org.hibernate.dialect.H2Dialect"); - cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "none"); - cfg.setProperty(AvailableSettings.DRIVER, "org.h2.Driver"); - cfg.setProperty(AvailableSettings.URL, - "jdbc:h2:mem:myexceptiondb2;DB_CLOSE_DELAY=-1"); - cfg.setProperty(AvailableSettings.USER, "sa"); - cfg.setProperty(AvailableSettings.PASS, ""); - return cfg; - } - - @Test - public void whenQueryExecutedWithUnmappedEntity_thenMappingException() { - thrown.expectCause(isA(MappingException.class)); - thrown.expectMessage("Unknown entity: java.lang.String"); - - Session session = sessionFactory.openSession(); - NativeQuery query = session - .createNativeQuery("select name from PRODUCT", String.class); - query.getResultList(); - } - - @Test - @SuppressWarnings("rawtypes") - public void whenQueryExecuted_thenOK() { - Session session = sessionFactory.openSession(); - NativeQuery query = session - .createNativeQuery("select name from PRODUCT"); - List results = query.getResultList(); - assertNotNull(results); - } - - @Test - public void givenEntityWithoutId_whenSessionFactoryCreated_thenAnnotationException() { - thrown.expect(AnnotationException.class); - thrown.expectMessage("No identifier specified for entity"); - - Configuration cfg = getConfiguration(); - cfg.addAnnotatedClass(EntityWithNoId.class); - cfg.buildSessionFactory(); - } - - @Test - public void givenMissingTable_whenSchemaValidated_thenSchemaManagementException() { - thrown.expect(SchemaManagementException.class); - thrown.expectMessage("Schema-validation: missing table"); - - Configuration cfg = getConfiguration(); - cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "validate"); - cfg.addAnnotatedClass(Product.class); - cfg.buildSessionFactory(); - } - - @Test - public void whenWrongDialectSpecified_thenCommandAcceptanceException() { - thrown.expect(SchemaManagementException.class); - thrown.expectCause(isA(CommandAcceptanceException.class)); - thrown.expectMessage("Halting on error : Error executing DDL"); - - Configuration cfg = getConfiguration(); - cfg.setProperty(AvailableSettings.DIALECT, - "org.hibernate.dialect.MySQLDialect"); - cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "update"); - - // This does not work due to hibernate bug - // cfg.setProperty(AvailableSettings.HBM2DDL_HALT_ON_ERROR,"true"); - cfg.getProperties() - .put(AvailableSettings.HBM2DDL_HALT_ON_ERROR, true); - - cfg.addAnnotatedClass(Product.class); - cfg.buildSessionFactory(); - } - - @Test - public void givenMissingTable_whenEntitySaved_thenSQLGrammarException() { - thrown.expect(isA(PersistenceException.class)); - thrown.expectCause(isA(SQLGrammarException.class)); - thrown - .expectMessage("SQLGrammarException: could not prepare statement"); - - Configuration cfg = getConfiguration(); - cfg.addAnnotatedClass(Product.class); - - SessionFactory sessionFactory = cfg.buildSessionFactory(); - Session session = null; - Transaction transaction = null; - try { - - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - Product product = new Product(); - product.setId(1); - product.setName("Product 1"); - session.save(product); - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - closeSessionFactoryQuietly(sessionFactory); - } - } - - @Test - public void givenMissingTable_whenQueryExecuted_thenSQLGrammarException() { - thrown.expect(isA(PersistenceException.class)); - thrown.expectCause(isA(SQLGrammarException.class)); - thrown - .expectMessage("SQLGrammarException: could not prepare statement"); - - Session session = sessionFactory.openSession(); - NativeQuery query = session.createNativeQuery( - "select * from NON_EXISTING_TABLE", Product.class); - query.getResultList(); - } - - @Test - public void whenDuplicateIdSaved_thenConstraintViolationException() { - thrown.expect(isA(PersistenceException.class)); - thrown.expectCause(isA(ConstraintViolationException.class)); - thrown.expectMessage( - "ConstraintViolationException: could not execute statement"); - - Session session = null; - Transaction transaction = null; - - for (int i = 1; i <= 2; i++) { - try { - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - Product product = new Product(); - product.setId(1); - product.setName("Product " + i); - session.save(product); - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - } - } - } - - @Test - public void givenNotNullPropertyNotSet_whenEntityIdSaved_thenPropertyValueException() { - thrown.expect(isA(PropertyValueException.class)); - thrown.expectMessage( - "not-null property references a null or transient value"); - - Session session = null; - Transaction transaction = null; - - try { - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - - Product product = new Product(); - product.setId(1); - session.save(product); - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - } - - } - - @Test - public void givenQueryWithDataTypeMismatch_WhenQueryExecuted_thenDataException() { - thrown.expectCause(isA(DataException.class)); - thrown.expectMessage( - "org.hibernate.exception.DataException: could not prepare statement"); - - Session session = sessionFactory.openSession(); - NativeQuery query = session.createNativeQuery( - "select * from PRODUCT where id='wrongTypeId'", Product.class); - query.getResultList(); - } - - @Test - public void givenSessionContainingAnId_whenIdAssociatedAgain_thenNonUniqueObjectException() { - thrown.expect(isA(NonUniqueObjectException.class)); - thrown.expectMessage( - "A different object with the same identifier value was already associated with the session"); - - Session session = null; - Transaction transaction = null; - - try { - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - - Product product1 = new Product(); - product1.setId(1); - product1.setName("Product 1"); - session.save(product1); - - Product product2 = new Product(); - product2.setId(1); - product2.setName("Product 2"); - session.save(product2); - - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - } - } - - @Test - public void whenDeletingADeletedObject_thenOptimisticLockException() { - thrown.expect(isA(OptimisticLockException.class)); - thrown.expectMessage( - "Batch update returned unexpected row count from update"); - thrown.expectCause(isA(StaleStateException.class)); - - Session session = null; - Transaction transaction = null; - - try { - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - - Product product1 = new Product(); - product1.setId(12); - product1.setName("Product 12"); - session.save(product1); - transaction.commit(); - session.close(); - - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - Product product2 = session.get(Product.class, 12); - session.createNativeQuery("delete from Product where id=12") - .executeUpdate(); - // We need to refresh to fix the error. - // session.refresh(product2); - session.delete(product2); - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - } - } - - @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)); - - Session session = null; - Transaction transaction = null; - - try { - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - - Product product1 = new Product(); - product1.setId(15); - product1.setName("Product1"); - session.update(product1); - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - } - } - - @Test - public void givenTxnMarkedRollbackOnly_whenCommitted_thenTransactionException() { - thrown.expect(isA(TransactionException.class)); - - Session session = null; - Transaction transaction = null; - try { - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - - Product product1 = new Product(); - product1.setId(15); - product1.setName("Product1"); - session.save(product1); - transaction.setRollbackOnly(); - - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - } - } - - private void rollbackTransactionQuietly(Transaction transaction) { - if (transaction != null && transaction.isActive()) { - try { - transaction.rollback(); - } catch (Exception e) { - logger.error("Exception while rolling back transaction", e); - } - } - } - - private void closeSessionQuietly(Session session) { - if (session != null) { - try { - session.close(); - } catch (Exception e) { - logger.error("Exception while closing session", e); - } - } - } - - private void closeSessionFactoryQuietly(SessionFactory sessionFactory) { - if (sessionFactory != null) { - try { - sessionFactory.close(); - } catch (Exception e) { - logger.error("Exception while closing sessionFactory", e); - } - } - } - - @Test - public void givenExistingEntity_whenIdUpdated_thenHibernateException() { - thrown.expect(isA(PersistenceException.class)); - thrown.expectCause(isA(HibernateException.class)); - thrown.expectMessage( - "identifier of an instance of com.baeldung.hibernate.exception.Product was altered"); - - Session session = null; - Transaction transaction = null; - - try { - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - - Product product1 = new Product(); - product1.setId(222); - product1.setName("Product 222"); - session.save(product1); - transaction.commit(); - closeSessionQuietly(session); - - session = sessionFactory.openSession(); - transaction = session.beginTransaction(); - - Product product2 = session.get(Product.class, 222); - product2.setId(333); - session.save(product2); - - transaction.commit(); - } catch (Exception e) { - rollbackTransactionQuietly(transaction); - throw (e); - } finally { - closeSessionQuietly(session); - } - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java deleted file mode 100644 index 8a1b9e9791..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.hibernate.findall; - -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import java.util.List; - -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.hibernate.HibernateUtil; -import com.baeldung.hibernate.pojo.Student; - -public class FindAllUnitTest { - - private Session session; - private Transaction transaction; - - private FindAll findAll; - - @Before - public void setUp() throws IOException { - - session = HibernateUtil.getSessionFactory().openSession(); - transaction = session.beginTransaction(); - findAll = new FindAll(session); - - session.createNativeQuery("delete from Student").executeUpdate(); - - Student student1 = new Student(); - session.persist(student1); - - Student student2 = new Student(); - session.persist(student2); - - Student student3 = new Student(); - session.persist(student3); - - transaction.commit(); - transaction = session.beginTransaction(); - } - - @After - public void tearDown() { - transaction.rollback(); - session.close(); - } - - @Test - public void givenCriteriaQuery_WhenFindAll_ThenGetAllPersons() { - List list = findAll.findAllWithCriteriaQuery(); - assertEquals(3, list.size()); - } - - @Test - public void givenJpql_WhenFindAll_ThenGetAllPersons() { - List list = findAll.findAllWithJpql(); - assertEquals(3, list.size()); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java deleted file mode 100644 index 0998ff1d90..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.hibernate.joincolumn; - -import com.baeldung.hibernate.HibernateUtil; -import java.io.IOException; -import org.hibernate.Session; -import org.hibernate.Transaction; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - - -public class JoinColumnIntegrationTest { - - private Session session; - private Transaction transaction; - - @Before - public void setUp() throws IOException { - session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") - .openSession(); - transaction = session.beginTransaction(); - } - - @After - public void tearDown() { - transaction.rollback(); - session.close(); - } - - @Test - public void givenOfficeEntity_setAddress_shouldPersist() { - Office office = new Office(); - - OfficeAddress address = new OfficeAddress(); - address.setZipCode("11-111"); - office.setAddress(address); - - session.save(office); - session.flush(); - session.clear(); - } - - @Test - public void givenEmployeeEntity_setEmails_shouldPersist() { - OfficialEmployee employee = new OfficialEmployee(); - - Email email = new Email(); - email.setAddress("example@email.com"); - email.setEmployee(employee); - - session.save(employee); - session.flush(); - session.clear(); - } - -} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java deleted file mode 100644 index 2b12734a10..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.baeldung.hibernate.jpacriteriabuilder; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import javax.persistence.EntityManager; - -import org.hibernate.HibernateException; -import org.hibernate.Session; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.hibernate.HibernateUtil; -import com.baeldung.hibernate.entities.Department; -import com.baeldung.hibernate.entities.DeptEmployee; -import com.baeldung.hibernate.jpacriteriabuilder.service.EmployeeSearchService; -import com.baeldung.hibernate.jpacriteriabuilder.service.EmployeeSearchServiceImpl; - -public class EmployeeSearchServiceIntegrationTest { - - private EntityManager entityManager; - private EmployeeSearchService searchService; - private Session session; - - @Before - public final void setup() throws HibernateException, IOException { - session = HibernateUtil.getSessionFactory() - .openSession(); - entityManager = session.getEntityManagerFactory() - .createEntityManager(); - searchService = new EmployeeSearchServiceImpl(entityManager); - - entityManager.getTransaction() - .begin(); - Department department = new Department("Pre Sales"); - DeptEmployee employee = new DeptEmployee("John Smith", "001", "Manager", department); - entityManager.persist(department); - entityManager.persist(employee); - employee = new DeptEmployee("Ian Evans", "002", "Associate", department); - entityManager.persist(department); - entityManager.persist(employee); - department = new Department("Copporate Sales"); - employee = new DeptEmployee("Robert Carter", "003", "Manager", department); - entityManager.persist(department); - entityManager.persist(employee); - employee = new DeptEmployee("John Carter", "004", "Senior Manager", department); - entityManager.persist(employee); - employee = new DeptEmployee("David Guetta", "009", "Associate", department); - entityManager.persist(department); - entityManager.persist(employee); - department = new Department("Post Sales"); - employee = new DeptEmployee("Robert Jonas", "005", "Director", department); - entityManager.persist(department); - entityManager.persist(employee); - employee = new DeptEmployee("John Ferros", "006", "Junior Associate", department); - entityManager.persist(department); - entityManager.persist(employee); - department = new Department("Client Support"); - employee = new DeptEmployee("Robert Mcclements", "007", "Director", department); - entityManager.persist(department); - entityManager.persist(employee); - employee = new DeptEmployee("Peter Parker", "008", "Manager", department); - entityManager.persist(department); - entityManager.persist(employee); - - } - - @After - public final void teardown() { - entityManager.getTransaction() - .rollback(); - entityManager.close(); - } - - @Test - public final void givenCriteriaQuery_whenSearchedUsingCriteriaBuilderWithListofAuthors_thenResultIsFilteredByAuthorNames() { - List titles = new ArrayList() { - { - add("Manager"); - add("Senior Manager"); - add("Director"); - } - }; - List result = searchService.filterbyTitleUsingCriteriaBuilder(titles); - assertEquals("Number of Employees does not match with expected.", 6, result.size()); - assertThat(result.stream() - .map(DeptEmployee::getTitle) - .distinct() - .collect(Collectors.toList()), containsInAnyOrder(titles.toArray())); - } - - @Test - public final void givenCriteriaQuery_whenSearchedUsingExpressionWithListofAuthors_thenResultIsFilteredByAuthorNames() { - List titles = new ArrayList() { - { - add("Manager"); - add("Senior Manager"); - add("Director"); - } - }; - List result = searchService.filterbyTitleUsingExpression(titles); - assertEquals("Number of Employees does not match with expected.", 6, result.size()); - assertThat(result.stream() - .map(DeptEmployee::getTitle) - .distinct() - .collect(Collectors.toList()), containsInAnyOrder(titles.toArray())); - } - - @Test - public final void givenCriteriaQuery_whenSearchedDepartmentLike_thenResultIsFilteredByDepartment() { - List result = searchService.searchByDepartmentQuery("Sales"); - assertEquals("Number of Employees does not match with expected.", 7, result.size()); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java deleted file mode 100644 index 398b2290fa..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung.hibernate.lob; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; - -import org.apache.commons.io.IOUtils; -import org.hibernate.HibernateException; -import org.hibernate.Session; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.hibernate.lob.model.User; - -public class LobUnitTest { - - private Session session; - - @Before - public void init(){ - try { - session = HibernateSessionUtil.getSessionFactory("hibernate.properties") - .openSession(); - } catch (HibernateException | IOException e) { - fail("Failed to initiate Hibernate Session [Exception:" + e.toString() + "]"); - } - } - - @After - public void close(){ - if(session != null) session.close(); - } - - @Test - public void givenValidInsertLobObject_whenQueried_returnSameDataAsInserted(){ - User user = new User(); - try(InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("profile.png");) { - // Get Image file from the resource - if(inputStream == null) fail("Unable to get resources"); - user.setId("1"); - user.setName("User"); - user.setPhoto(IOUtils.toByteArray(inputStream)); - - session.persist(user); - } catch (IOException e) { - fail("Unable to read input stream"); - } - - User result = session.find(User.class, "1"); - - assertNotNull("Query result is null", result); - assertEquals("User's name is invalid", user.getName(), result.getName() ); - assertTrue("User's photo is corrupted", Arrays.equals(user.getPhoto(), result.getPhoto()) ); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java deleted file mode 100644 index 1b6cee7e67..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.hibernate.multitenancy; - -import java.io.Serializable; - -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity(name = "Car") -@Table(name = "Car") -public class Car implements Serializable { - - private static final long serialVersionUID = 1015320564683423342L; - - private String brand; - - @Id - public String getBrand() { - return brand; - } - - public void setBrand(String brand) { - this.brand = brand; - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java deleted file mode 100644 index fdc3f9fa81..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.baeldung.hibernate.multitenancy; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -import java.io.IOException; -import java.util.Properties; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.context.spi.CurrentTenantIdentifierResolver; -import org.hibernate.service.ServiceRegistry; -import org.junit.Before; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import com.baeldung.hibernate.multitenancy.database.TenantIdNames; - -public abstract class MultitenancyIntegrationTest { - - public abstract String getPropertyFile(); - - @Mock - private CurrentTenantIdentifierResolver currentTenantIdentifierResolver; - - private SessionFactory sessionFactory; - - @Before - public void setup() throws IOException { - MockitoAnnotations.initMocks(this); - - Mockito.when(currentTenantIdentifierResolver.validateExistingCurrentSessions()) - .thenReturn(false); - - Properties properties = getHibernateProperties(); - properties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver); - - sessionFactory = buildSessionFactory(properties); - - initTenant(TenantIdNames.MYDB1); - initTenant(TenantIdNames.MYDB2); - } - - protected void initTenant(String tenantId) { - whenCurrentTenantIs(tenantId); - createCarTable(); - } - - protected void whenCurrentTenantIs(String tenantId) { - Mockito.when(currentTenantIdentifierResolver.resolveCurrentTenantIdentifier()) - .thenReturn(tenantId); - } - - protected void whenAddCar(String brand) { - Session session = sessionFactory.openSession(); - Transaction tx = session.beginTransaction(); - Car car = new Car(); - car.setBrand(brand); - session.save(car); - tx.commit(); - } - - protected void thenCarFound(String brand) { - Session session = sessionFactory.openSession(); - assertNotNull(session.get(Car.class, brand)); - } - - protected void thenCarNotFound(String brand) { - Session session = sessionFactory.openSession(); - assertNull(session.get(Car.class, brand)); - } - - @SuppressWarnings("deprecation") - private void createCarTable() { - Session session = sessionFactory.openSession(); - Transaction tx = session.beginTransaction(); - session.createSQLQuery("drop table Car if exists") - .executeUpdate(); - session.createSQLQuery("create table Car (brand varchar(255) primary key)") - .executeUpdate(); - tx.commit(); - } - - private Properties getHibernateProperties() throws IOException { - Properties properties = new Properties(); - properties.load(getClass().getResourceAsStream(getPropertyFile())); - return properties; - } - - private static SessionFactory buildSessionFactory(Properties properties) { - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(properties) - .build(); - MetadataSources metadataSources = new MetadataSources(serviceRegistry); - metadataSources.addAnnotatedClass(Car.class); - return metadataSources.buildMetadata() - .buildSessionFactory(); - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java deleted file mode 100644 index 92f477a646..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.hibernate.multitenancy.database; - -import java.io.IOException; - -import org.junit.Test; - -import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest; - -public class DatabaseApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest { - - @Override - public String getPropertyFile() { - return "/hibernate-database-multitenancy.properties"; - } - - @Test - public void givenDatabaseApproach_whenAddingEntries_thenOnlyAddedToConcreteDatabase() throws IOException { - whenCurrentTenantIs(TenantIdNames.MYDB1); - whenAddCar("myCar"); - thenCarFound("myCar"); - whenCurrentTenantIs(TenantIdNames.MYDB2); - thenCarNotFound("myCar"); - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java deleted file mode 100644 index eb1f410622..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.hibernate.multitenancy.database; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; -import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; -import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; - -@SuppressWarnings("serial") -public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { - - private final Map connectionProviderMap = new HashMap<>(); - - public MapMultiTenantConnectionProvider() throws IOException { - initConnectionProviderForTenant(TenantIdNames.MYDB1); - initConnectionProviderForTenant(TenantIdNames.MYDB2); - } - - @Override - protected ConnectionProvider getAnyConnectionProvider() { - return connectionProviderMap.values() - .iterator() - .next(); - } - - @Override - protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { - return connectionProviderMap.get(tenantIdentifier); - } - - private void initConnectionProviderForTenant(String tenantId) throws IOException { - Properties properties = new Properties(); - properties.load(getClass().getResourceAsStream(String.format("/hibernate-database-%s.properties", tenantId))); - DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); - connectionProvider.configure(properties); - this.connectionProviderMap.put(tenantId, connectionProvider); - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java deleted file mode 100644 index 231272fa63..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.hibernate.multitenancy.database; - -public class TenantIdNames { - public static final String MYDB1 = "mydb1"; - public static final String MYDB2 = "mydb2"; -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java deleted file mode 100644 index 304af65fca..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.hibernate.multitenancy.schema; - -import java.io.IOException; - -import org.junit.Test; - -import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest; -import com.baeldung.hibernate.multitenancy.database.TenantIdNames; - -public class SchemaApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest { - - @Override - public String getPropertyFile() { - return "/hibernate-schema-multitenancy.properties"; - } - - @Test - public void givenSchemaApproach_whenAddingEntries_thenOnlyAddedToConcreteSchema() throws IOException { - whenCurrentTenantIs(TenantIdNames.MYDB1); - whenAddCar("Ferrari"); - thenCarFound("Ferrari"); - whenCurrentTenantIs(TenantIdNames.MYDB2); - thenCarNotFound("Ferrari"); - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java deleted file mode 100644 index 601eba651c..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.hibernate.multitenancy.schema; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Properties; - -import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; -import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; -import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; - -@SuppressWarnings("serial") -public class SchemaMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { - - private final ConnectionProvider connectionProvider; - - public SchemaMultiTenantConnectionProvider() throws IOException { - connectionProvider = initConnectionProvider(); - } - - @Override - protected ConnectionProvider getAnyConnectionProvider() { - return connectionProvider; - } - - @Override - protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { - return connectionProvider; - } - - @Override - public Connection getConnection(String tenantIdentifier) throws SQLException { - Connection connection = super.getConnection(tenantIdentifier); - connection.createStatement() - .execute(String.format("SET SCHEMA %s;", tenantIdentifier)); - return connection; - } - - private ConnectionProvider initConnectionProvider() throws IOException { - Properties properties = new Properties(); - properties.load(getClass().getResourceAsStream("/hibernate-schema-multitenancy.properties")); - - DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); - connectionProvider.configure(properties); - return connectionProvider; - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java deleted file mode 100644 index 2eba94e307..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.hibernate.multitenancy.schema; - -public class TenantIdNames { - public static final String MYDB1 = "mydb1"; - public static final String MYDB2 = "mydb2"; -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java deleted file mode 100644 index 475c93f6ff..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.baeldung.hibernate.onetoone; - -import com.baeldung.hibernate.onetoone.foreignkeybased.Address; -import com.baeldung.hibernate.onetoone.foreignkeybased.User; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class HibernateOneToOneAnnotationFKBasedIntegrationTest { - - private static SessionFactory sessionFactory; - - private Session session; - - @BeforeClass - public static void beforeTests() { - sessionFactory = HibernateUtil.getSessionFactory(Strategy.FOREIGN_KEY); - } - - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); - } - - @Test - public void givenData_whenInsert_thenCreates1to1relationship() { - User user = new User(); - user.setUserName("alice@baeldung.com"); - - Address address = new Address(); - address.setStreet("FK Street"); - address.setCity("FK City"); - - address.setUser(user); - user.setAddress(address); - - //Address entry will automatically be created by hibernate, since cascade type is specified as ALL - session.persist(user); - session.getTransaction().commit(); - - assert1to1InsertedData(); - } - - private void assert1to1InsertedData() { - @SuppressWarnings("unchecked") - List userList = session.createQuery("FROM User").list(); - - assertNotNull(userList); - assertEquals(1, userList.size()); - - User user = userList.get(0); - assertEquals("alice@baeldung.com", user.getUserName()); - - Address address = user.getAddress(); - assertNotNull(address); - assertEquals("FK Street", address.getStreet()); - assertEquals("FK City", address.getCity()); - - } - - @After - public void tearDown() { - session.close(); - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java deleted file mode 100644 index df4cd4d137..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.baeldung.hibernate.onetoone; - -import com.baeldung.hibernate.onetoone.jointablebased.Employee; -import com.baeldung.hibernate.onetoone.jointablebased.WorkStation; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class HibernateOneToOneAnnotationJTBasedIntegrationTest { - - private static SessionFactory sessionFactory; - - private Session session; - - @BeforeClass - public static void beforeTests() { - sessionFactory = HibernateUtil.getSessionFactory(Strategy.JOIN_TABLE_BASED); - } - - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); - } - - @Test - public void givenData_whenInsert_thenCreates1to1relationship() { - Employee employee = new Employee(); - employee.setName("bob@baeldung.com"); - - WorkStation workStation = new WorkStation(); - workStation.setWorkstationNumber(626); - workStation.setFloor("Sixth Floor"); - - - employee.setWorkStation(workStation); - workStation.setEmployee(employee); - - session.persist(employee); - session.getTransaction().commit(); - - assert1to1InsertedData(); - } - - private void assert1to1InsertedData() { - @SuppressWarnings("unchecked") - List employeeList = session.createQuery("FROM Employee").list(); - assertNotNull(employeeList); - assertEquals(1, employeeList.size()); - - Employee employee = employeeList.get(0); - assertEquals("bob@baeldung.com", employee.getName()); - - WorkStation workStation = employee.getWorkStation(); - - assertNotNull(workStation); - assertEquals((long) 626, (long) workStation.getWorkstationNumber()); - assertEquals("Sixth Floor", workStation.getFloor()); - - } - - @After - public void tearDown() { - session.close(); - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java deleted file mode 100644 index 7931a8e3fe..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.baeldung.hibernate.onetoone; - -import com.baeldung.hibernate.onetoone.sharedkeybased.Address; -import com.baeldung.hibernate.onetoone.sharedkeybased.User; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class HibernateOneToOneAnnotationSPKBasedIntegrationTest { - - private static SessionFactory sessionFactory; - - private Session session; - - @BeforeClass - public static void beforeTests() { - sessionFactory = HibernateUtil.getSessionFactory(Strategy.SHARED_PRIMARY_KEY); - } - - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); - } - - @Test - public void givenData_whenInsert_thenCreates1to1relationship() { - User user = new User(); - user.setUserName("alice@baeldung.com"); - - Address address = new Address(); - address.setStreet("SPK Street"); - address.setCity("SPK City"); - - address.setUser(user); - user.setAddress(address); - - //Address entry will automatically be created by hibernate, since cascade type is specified as ALL - session.persist(user); - session.getTransaction().commit(); - - assert1to1InsertedData(); - } - - - private void assert1to1InsertedData() { - @SuppressWarnings("unchecked") - List userList = session.createQuery("FROM User").list(); - assertNotNull(userList); - assertEquals(1, userList.size()); - - User user = userList.get(0); - assertEquals("alice@baeldung.com", user.getUserName()); - - Address address = user.getAddress(); - assertNotNull(address); - assertEquals("SPK Street", address.getStreet()); - assertEquals("SPK City", address.getCity()); - } - - @After - public void tearDown() { - session.close(); - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java deleted file mode 100644 index 37c490f297..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.baeldung.hibernate.optimisticlocking; - -import java.io.IOException; -import java.util.Arrays; - -import javax.persistence.EntityManager; -import javax.persistence.LockModeType; -import javax.persistence.OptimisticLockException; - -import org.hibernate.SessionFactory; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.hibernate.HibernateUtil; - -public class OptimisticLockingIntegrationTest { - - private static SessionFactory sessionFactory; - - @Before - public void setUp() throws IOException { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - OptimisticLockingCourse course = new OptimisticLockingCourse(1L, "MATH"); - OptimisticLockingStudent student = new OptimisticLockingStudent(1L, "John", "Doe", Arrays.asList(course)); - course.setStudent(student); - entityManager.persist(course); - entityManager.persist(student); - entityManager.getTransaction() - .commit(); - entityManager.close(); - } - - @After - public void clean() throws IOException { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - OptimisticLockingCourse course = entityManager.find(OptimisticLockingCourse.class, 1L); - OptimisticLockingStudent student = entityManager.find(OptimisticLockingStudent.class, 1L); - entityManager.remove(course); - entityManager.remove(student); - entityManager.getTransaction() - .commit(); - entityManager.close(); - } - - @Test(expected = OptimisticLockException.class) - public void givenVersionedEntities_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { - EntityManager em = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L); - - EntityManager em2 = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L); - student2.setName("RICHARD"); - em2.persist(student2); - em2.getTransaction() - .commit(); - em2.close(); - - student.setName("JOHN"); - em.persist(student); - em.getTransaction() - .commit(); - em.close(); - } - - @Test(expected = OptimisticLockException.class) - public void givenVersionedEntitiesWithLockByFindMethod_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { - EntityManager em = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L, LockModeType.OPTIMISTIC); - - EntityManager em2 = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L, LockModeType.OPTIMISTIC_FORCE_INCREMENT); - student2.setName("RICHARD"); - em2.persist(student2); - em2.getTransaction() - .commit(); - em2.close(); - - student.setName("JOHN"); - em.persist(student); - em.getTransaction() - .commit(); - em.close(); - } - - @Test(expected = OptimisticLockException.class) - public void givenVersionedEntitiesWithLockByRefreshMethod_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { - EntityManager em = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L); - em.refresh(student, LockModeType.OPTIMISTIC); - - EntityManager em2 = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L); - em.refresh(student, LockModeType.OPTIMISTIC_FORCE_INCREMENT); - student2.setName("RICHARD"); - em2.persist(student2); - em2.getTransaction() - .commit(); - em2.close(); - - student.setName("JOHN"); - em.persist(student); - em.getTransaction() - .commit(); - em.close(); - } - - @Test(expected = OptimisticLockException.class) - public void givenVersionedEntitiesWithLockByLockMethod_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { - EntityManager em = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L); - em.lock(student, LockModeType.OPTIMISTIC); - - EntityManager em2 = getEntityManagerWithOpenTransaction(); - OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L); - em.lock(student, LockModeType.OPTIMISTIC_FORCE_INCREMENT); - student2.setName("RICHARD"); - em2.persist(student2); - em2.getTransaction() - .commit(); - em2.close(); - - student.setName("JOHN"); - em.persist(student); - em.getTransaction() - .commit(); - em.close(); - } - - protected static EntityManager getEntityManagerWithOpenTransaction() throws IOException { - String propertyFileName = "hibernate-pessimistic-locking.properties"; - if (sessionFactory == null) { - sessionFactory = HibernateUtil.getSessionFactory(propertyFileName); - } - EntityManager entityManager = sessionFactory.openSession(); - entityManager.getTransaction().begin(); - - return entityManager; - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java deleted file mode 100644 index 4b9c7720fd..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import com.baeldung.hibernate.HibernateUtil; -import com.vividsolutions.jts.util.Assert; - -import org.hibernate.SessionFactory; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import javax.persistence.*; -import java.io.IOException; -import java.util.Arrays; - -public class BasicPessimisticLockingIntegrationTest { - - private static SessionFactory sessionFactory; - - @BeforeClass - public static void setUp() throws IOException { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent student = new PessimisticLockingStudent(1L, "JOHN"); - PessimisticLockingCourse course = new PessimisticLockingCourse(1L, "MATH", student); - student.setCourses(Arrays.asList(course)); - entityManager.persist(course); - entityManager.persist(student); - entityManager.getTransaction() - .commit(); - entityManager.close(); - } - - @Test - public void givenFoundRecordWithPessimisticRead_whenFindingNewOne_PessimisticLockExceptionThrown() { - try { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - entityManager.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_READ); - - EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); - entityManager2.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_READ); - - entityManager.close(); - entityManager2.close(); - } catch (Exception e) { - Assert.isTrue(e instanceof PessimisticLockException); - } - } - - @Test - public void givenRecordWithPessimisticReadQuery_whenQueryingNewOne_PessimisticLockExceptionThrown() throws IOException { - try { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - Query query = entityManager.createQuery("from Student where studentId = :studentId"); - query.setParameter("studentId", 1L); - query.setLockMode(LockModeType.PESSIMISTIC_WRITE); - query.getResultList(); - - EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); - Query query2 = entityManager2.createQuery("from Student where studentId = :studentId"); - query2.setParameter("studentId", 1L); - query2.setLockMode(LockModeType.PESSIMISTIC_READ); - query2.getResultList(); - - entityManager.close(); - entityManager2.close(); - } catch (Exception e) { - Assert.isTrue(e instanceof PessimisticLockException); - } - } - - @Test - public void givenRecordWithPessimisticReadLock_whenFindingNewOne_PessimisticLockExceptionThrown() { - try { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); - entityManager.lock(resultStudent, LockModeType.PESSIMISTIC_READ); - - EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); - entityManager2.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_FORCE_INCREMENT); - - entityManager.close(); - entityManager2.close(); - } catch (Exception e) { - Assert.isTrue(e instanceof PessimisticLockException); - } - } - - @Test - public void givenRecordAndRefreshWithPessimisticRead_whenFindingWithPessimisticWrite_PessimisticLockExceptionThrown() { - try { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); - entityManager.refresh(resultStudent, LockModeType.PESSIMISTIC_FORCE_INCREMENT); - - EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); - entityManager2.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_WRITE); - - entityManager.close(); - entityManager2.close(); - } catch (Exception e) { - Assert.isTrue(e instanceof PessimisticLockException); - } - } - - @Test - public void givenRecordWithPessimisticRead_whenUpdatingRecord_PessimisticLockExceptionThrown() { - try { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); - entityManager.refresh(resultStudent, LockModeType.PESSIMISTIC_READ); - - EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent resultStudent2 = entityManager2.find(PessimisticLockingStudent.class, 1L); - resultStudent2.setName("Change"); - entityManager2.persist(resultStudent2); - entityManager2.getTransaction() - .commit(); - - entityManager.close(); - entityManager2.close(); - } catch (Exception e) { - Assert.isTrue(e instanceof PessimisticLockException); - } - } - - @Test - public void givenRecordWithPessimisticWrite_whenUpdatingRecord_PessimisticLockExceptionThrown() { - try { - EntityManager entityManager = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); - entityManager.refresh(resultStudent, LockModeType.PESSIMISTIC_WRITE); - - EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent resultStudent2 = entityManager2.find(PessimisticLockingStudent.class, 1L); - resultStudent2.setName("Change"); - entityManager2.persist(resultStudent2); - entityManager2.getTransaction() - .commit(); - - entityManager.close(); - entityManager2.close(); - } catch (Exception e) { - Assert.isTrue(e instanceof PessimisticLockException); - } - } - - protected static EntityManager getEntityManagerWithOpenTransaction() throws IOException { - String propertyFileName = "hibernate-pessimistic-locking.properties"; - if (sessionFactory == null) { - sessionFactory = HibernateUtil.getSessionFactory(propertyFileName); - } - EntityManager entityManager = sessionFactory.openSession(); - entityManager.getTransaction().begin(); - - return entityManager; - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } - -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java deleted file mode 100644 index 81cb7d95f8..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.baeldung.hibernate.pessimisticlocking; - -import com.baeldung.hibernate.HibernateUtil; - -import org.hibernate.SessionFactory; -import org.junit.AfterClass; -import org.junit.Test; - -import javax.persistence.EntityManager; -import javax.persistence.LockModeType; -import javax.persistence.PessimisticLockScope; -import java.io.IOException; -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -public class PessimisticLockScopesIntegrationTest { - - private static SessionFactory sessionFactory; - - @Test - public void givenEclipseEntityWithJoinInheritance_whenNormalLock_thenShouldChildAndParentEntity() throws IOException { - EntityManager em = getEntityManagerWithOpenTransaction(); - PessimisticLockingEmployee employee = new PessimisticLockingEmployee(1L, "JOHN", "SMITH", new BigDecimal(4.5)); - em.persist(employee); - em.getTransaction() - .commit(); - em.close(); - - // NORMAL SCOPE - EntityManager em2 = getEntityManagerWithOpenTransaction(); - PessimisticLockingEmployee foundEmployee = em2.find(PessimisticLockingEmployee.class, 1L, LockModeType.PESSIMISTIC_WRITE); - em2.getTransaction() - .rollback(); - - // EXTENDED SCOPE - Map map = new HashMap<>(); - map.put("javax.persistence.lock.scope", PessimisticLockScope.EXTENDED); - - EntityManager em3 = getEntityManagerWithOpenTransaction(); - foundEmployee = em3.find(PessimisticLockingEmployee.class, 1L, LockModeType.PESSIMISTIC_WRITE, map); - em3.getTransaction() - .rollback(); - - em2.close(); - em3.close(); - } - - @Test - public void givenEntityWithElementCollection_whenLock_thenHibernateExtendedScopeLockOnlyOwningEntity() throws IOException { - EntityManager em = getEntityManagerWithOpenTransaction(); - Address address = new Address("Poland", "Warsaw"); - Customer customer = new Customer(1L, "JOE", "DOE", Arrays.asList(address)); - em.persist(customer); - em.getTransaction() - .commit(); - em.close(); - - // NORMAL SCOPE - EntityManager em2 = getEntityManagerWithOpenTransaction(); - Customer foundCustomer = em2.find(Customer.class, 1L, LockModeType.PESSIMISTIC_WRITE); - em2.getTransaction() - .rollback(); - - // EXTENDED SCOPE - Map map = new HashMap<>(); - map.put("javax.persistence.lock.scope", PessimisticLockScope.EXTENDED); - - EntityManager em3 = getEntityManagerWithOpenTransaction(); - foundCustomer = em3.find(Customer.class, 1L, LockModeType.PESSIMISTIC_WRITE, map); - em2.getTransaction() - .rollback(); - - em2.close(); - em3.close(); - } - - @Test - public void givenEntityWithOneToMany_whenLock_thenHibernateExtendedScopeLockOnlyOwningEntity() throws IOException { - EntityManager em = getEntityManagerWithOpenTransaction(); - PessimisticLockingStudent student = new PessimisticLockingStudent(1L, "JOE"); - PessimisticLockingCourse course = new PessimisticLockingCourse(1L, "COURSE", student); - student.setCourses(Arrays.asList(course)); - em.persist(course); - em.persist(student); - em.getTransaction() - .commit(); - em.close(); - - // NORMAL SCOPE - EntityManager em2 = getEntityManagerWithOpenTransaction(); - PessimisticLockingCourse foundCourse = em2.find(PessimisticLockingCourse.class, 1L, LockModeType.PESSIMISTIC_WRITE); - em2.getTransaction() - .rollback(); - - // EXTENDED SCOPE - Map map = new HashMap<>(); - map.put("javax.persistence.lock.scope", PessimisticLockScope.EXTENDED); - - EntityManager em3 = getEntityManagerWithOpenTransaction(); - foundCourse = em3.find(PessimisticLockingCourse.class, 1L, LockModeType.PESSIMISTIC_WRITE, map); - em3.getTransaction() - .rollback(); - - em2.close(); - em3.close(); - } - - protected EntityManager getEntityManagerWithOpenTransaction() throws IOException { - String propertyFileName = "hibernate-pessimistic-locking.properties"; - if (sessionFactory == null) { - sessionFactory = HibernateUtil.getSessionFactory(propertyFileName); - } - EntityManager entityManager = sessionFactory.openSession(); - entityManager.getTransaction().begin(); - - return entityManager; - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java deleted file mode 100644 index 13eae3d877..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.baeldung.hibernate.queryplancache; - -import com.baeldung.hibernate.HibernateUtil; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.jpa.QueryHints; -import org.hibernate.query.Query; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Measurement; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.TearDown; -import org.openjdk.jmh.annotations.Warmup; -import org.openjdk.jmh.infra.Blackhole; -import org.openjdk.jmh.runner.RunnerException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - -public class QueryPlanCacheBenchmark { - - private static final Logger LOGGER = LoggerFactory.getLogger(QueryPlanCacheBenchmark.class); - - @State(Scope.Thread) - public static class QueryPlanCacheBenchMarkState { - @Param({"1", "2", "3"}) - public int planCacheSize; - - public Session session; - - @Setup - public void stateSetup() throws IOException { - LOGGER.info("State - Setup"); - session = initSession(planCacheSize); - LOGGER.info("State - Setup Complete"); - } - - private Session initSession(int planCacheSize) throws IOException { - Properties properties = HibernateUtil.getProperties(); - properties.put("hibernate.query.plan_cache_max_size", planCacheSize); - properties.put("hibernate.query.plan_parameter_metadata_max_size", planCacheSize); - SessionFactory sessionFactory = HibernateUtil.getSessionFactoryByProperties(properties); - return sessionFactory.openSession(); - } - - @TearDown - public void tearDownState() { - LOGGER.info("State - Teardown"); - SessionFactory sessionFactory = session.getSessionFactory(); - session.close(); - sessionFactory.close(); - LOGGER.info("State - Teardown complete"); - } - } - - @Benchmark - @BenchmarkMode(Mode.AverageTime) - @OutputTimeUnit(TimeUnit.MICROSECONDS) - @Fork(1) - @Warmup(iterations = 2) - @Measurement(iterations = 5) - public void givenQueryPlanCacheSize_thenCompileQueries(QueryPlanCacheBenchMarkState state, Blackhole blackhole) { - - Query query1 = findEmployeesByDepartmentNameQuery(state.session); - Query query2 = findEmployeesByDesignationQuery(state.session); - Query query3 = findDepartmentOfAnEmployeeQuery(state.session); - - blackhole.consume(query1); - blackhole.consume(query2); - blackhole.consume(query3); - - } - - private Query findEmployeesByDepartmentNameQuery(Session session) { - return session.createQuery("SELECT e FROM DeptEmployee e " + - "JOIN e.department WHERE e.department.name = :deptName") - .setMaxResults(30) - .setHint(QueryHints.HINT_FETCH_SIZE, 30); - } - - private Query findEmployeesByDesignationQuery(Session session) { - return session.createQuery("SELECT e FROM DeptEmployee e " + - "WHERE e.title = :designation") - .setHint(QueryHints.SPEC_HINT_TIMEOUT, 1000); - } - - private Query findDepartmentOfAnEmployeeQuery(Session session) { - return session.createQuery("SELECT e.department FROM DeptEmployee e " + - "JOIN e.department WHERE e.employeeNumber = :empId"); - - } - - public static void main(String... args) throws IOException, RunnerException { - //main-class to run the benchmark - org.openjdk.jmh.Main.main(args); - } -} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java deleted file mode 100644 index 246a7d59f9..0000000000 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.hibernate.transaction; - -import com.baeldung.hibernate.HibernateUtil; -import com.baeldung.hibernate.pojo.Post; -import com.baeldung.hibernate.transaction.PostService; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.junit.BeforeClass; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Properties; - -import static org.junit.Assert.assertEquals; - -public class TransactionIntegrationTest { - - private static PostService postService; - private static Session session; - private static Logger logger = LoggerFactory.getLogger(TransactionIntegrationTest.class); - - @BeforeClass - public static void init() throws IOException { - Properties properties = new Properties(); - properties.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); - properties.setProperty("hibernate.connection.url", "jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1"); - properties.setProperty("hibernate.connection.username", "sa"); - properties.setProperty("hibernate.show_sql", "true"); - properties.setProperty("jdbc.password", ""); - properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); - properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); - SessionFactory sessionFactory = HibernateUtil.getSessionFactoryByProperties(properties); - session = sessionFactory.openSession(); - postService = new PostService(session); - } - - @Test - public void givenTitleAndBody_whenRepositoryUpdatePost_thenUpdatePost() { - - Post post = new Post("This is a title", "This is a sample post"); - session.persist(post); - - String title = "[UPDATE] Java HowTos"; - String body = "This is an updated posts on Java how-tos"; - postService.updatePost(title, body, post.getId()); - - session.refresh(post); - - assertEquals(post.getTitle(), title); - assertEquals(post.getBody(), body); - } - - -} diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-customtypes.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-customtypes.properties deleted file mode 100644 index c14782ce0f..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-customtypes.properties +++ /dev/null @@ -1,14 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 -hibernate.connection.username=sa -hibernate.connection.autocommit=true -jdbc.password= - -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop - -hibernate.c3p0.min_size=5 -hibernate.c3p0.max_size=20 -hibernate.c3p0.acquire_increment=5 -hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-database-multitenancy.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-database-multitenancy.properties deleted file mode 100644 index 853fa80dfc..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-database-multitenancy.properties +++ /dev/null @@ -1,2 +0,0 @@ -hibernate.multiTenancy=DATABASE -hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.database.MapMultiTenantConnectionProvider \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb1.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb1.properties deleted file mode 100644 index 345f1dbbea..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb1.properties +++ /dev/null @@ -1,4 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 -hibernate.connection.username=sa -hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb2.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb2.properties deleted file mode 100644 index 626b7853c6..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-database-mydb2.properties +++ /dev/null @@ -1,4 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb2;DB_CLOSE_DELAY=-1 -hibernate.connection.username=sa -hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties deleted file mode 100644 index e08a23166d..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties +++ /dev/null @@ -1,16 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:myexceptiondb1;DB_CLOSE_DELAY=-1 -hibernate.connection.username=sa -hibernate.connection.autocommit=true -jdbc.password= - -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop - -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/hibernate5/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-namedquery.properties deleted file mode 100644 index 457f965347..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-namedquery.properties +++ /dev/null @@ -1,9 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' -hibernate.connection.username=sa -hibernate.connection.autocommit=true -jdbc.password= - -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-pessimistic-locking.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-pessimistic-locking.properties deleted file mode 100644 index 4f1ff5e93a..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-pessimistic-locking.properties +++ /dev/null @@ -1,8 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb3;DB_CLOSE_DELAY=-1;LOCK_TIMEOUT=100;MVCC=FALSE -hibernate.connection.username=sa -hibernate.connection.autocommit=true -hibernate.dialect=org.hibernate.dialect.H2Dialect - -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties deleted file mode 100644 index 4abb621355..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties +++ /dev/null @@ -1,7 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS MYDB1\\;CREATE SCHEMA IF NOT EXISTS MYDB2\\; -hibernate.connection.username=sa -hibernate.connection.autocommit=true -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.multiTenancy=SCHEMA -hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.schema.SchemaMultiTenantConnectionProvider \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-spatial.properties deleted file mode 100644 index 1657c838e3..0000000000 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-spatial.properties +++ /dev/null @@ -1,14 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 -hibernate.connection.username=sa -hibernate.connection.autocommit=true -jdbc.password= - -hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop - -hibernate.c3p0.min_size=5 -hibernate.c3p0.max_size=20 -hibernate.c3p0.acquire_increment=5 -hibernate.c3p0.timeout=1800 From 592df829e60a68045e6332f2a74f1a0141c52438 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:19:46 +0530 Subject: [PATCH 032/530] JAVA-4 : added new module hibernate-annotations --- .../hibernate5-annotations/README.md | 10 ++ .../hibernate5-annotations/pom.xml | 74 ++++++++ .../com/baeldung/hibernate/HibernateUtil.java | 73 ++++++++ .../UnsupportedTenancyException.java | 8 + .../hibernate/customtypes/Address.java | 69 +++++++ .../hibernate/customtypes/AddressType.java | 169 ++++++++++++++++++ .../LocalDateStringJavaDescriptor.java | 51 ++++++ .../customtypes/LocalDateStringType.java | 34 ++++ .../hibernate/customtypes/OfficeEmployee.java | 88 +++++++++ .../hibernate/customtypes/PhoneNumber.java | 43 +++++ .../customtypes/PhoneNumberType.java | 98 ++++++++++ .../hibernate/customtypes/Salary.java | 39 ++++ .../customtypes/SalaryCurrencyConvertor.java | 15 ++ .../hibernate/customtypes/SalaryType.java | 161 +++++++++++++++++ .../baeldung/hibernate/joincolumn/Email.java | 47 +++++ .../baeldung/hibernate/joincolumn/Office.java | 41 +++++ .../hibernate/joincolumn/OfficeAddress.java | 34 ++++ .../joincolumn/OfficialEmployee.java | 36 ++++ .../com/baeldung/hibernate/pojo/Phone.java | 50 ++++++ .../main/resources/META-INF/persistence.xml | 18 ++ .../src/main/resources/logback.xml | 13 ++ .../HibernateCustomTypesManualTest.java | 90 ++++++++++ .../joincolumn/JoinColumnIntegrationTest.java | 57 ++++++ .../resources/hibernate-spatial.properties | 14 ++ .../src/test/resources/log4j.xml | 25 +++ .../src/test/resources/log4j2.xml | 18 ++ .../src/test/resources/logback.xml | 18 ++ .../src/test/resources/profile.png | Bin 0 -> 1117 bytes 28 files changed, 1393 insertions(+) create mode 100644 persistence-modules/hibernate5-annotations/README.md create mode 100644 persistence-modules/hibernate5-annotations/pom.xml create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate5-annotations/src/main/resources/logback.xml create mode 100644 persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java create mode 100644 persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java create mode 100644 persistence-modules/hibernate5-annotations/src/test/resources/hibernate-spatial.properties create mode 100644 persistence-modules/hibernate5-annotations/src/test/resources/log4j.xml create mode 100644 persistence-modules/hibernate5-annotations/src/test/resources/log4j2.xml create mode 100644 persistence-modules/hibernate5-annotations/src/test/resources/logback.xml create mode 100644 persistence-modules/hibernate5-annotations/src/test/resources/profile.png diff --git a/persistence-modules/hibernate5-annotations/README.md b/persistence-modules/hibernate5-annotations/README.md new file mode 100644 index 0000000000..da3c5ad1fd --- /dev/null +++ b/persistence-modules/hibernate5-annotations/README.md @@ -0,0 +1,10 @@ +## Hibernate 5 + +This module contains articles about Hibernate 5. + +### Relevant Articles: +- [Custom Types in Hibernate and the @Type Annotation](https://www.baeldung.com/hibernate-custom-types) +- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) +- [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column) +- [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) + diff --git a/persistence-modules/hibernate5-annotations/pom.xml b/persistence-modules/hibernate5-annotations/pom.xml new file mode 100644 index 0000000000..ab242333fe --- /dev/null +++ b/persistence-modules/hibernate5-annotations/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + hibernate5-annotations + 0.1-SNAPSHOT + hibernate5-annotations + jar + Hibernate tutorial illustrating the use of named parameters + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + org.hibernate + hibernate-core + ${hibernate-core.version} + + + + com.h2database + h2 + ${h2.version} + + + + org.apache.commons + commons-lang3 + ${commons.lang3.version} + + + + org.hibernate + hibernate-testing + ${hibernate-core.version} + + + + org.hibernate + hibernate-spatial + ${hibernate-core.version} + + + org.opengeo + geodb + ${geodb.version} + + + + + + geodb-repo + GeoDB repository + http://repo.boundlessgeo.com/main/ + + + + + 5.4.7.Final + 1.4.200 + 3.8.1 + true + 2.1.7.RELEASE + 5.4.7.Final + 1.4.200 + 3.8.1 + 0.9 + + + diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java new file mode 100644 index 0000000000..afe2aeac89 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -0,0 +1,73 @@ +package com.baeldung.hibernate; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.joincolumn.Email; +import com.baeldung.hibernate.joincolumn.Office; +import com.baeldung.hibernate.joincolumn.OfficeAddress; + +public class HibernateUtil { + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + ServiceRegistry serviceRegistry = configureServiceRegistry(); + return makeSessionFactory(serviceRegistry); + } + + public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException { + ServiceRegistry serviceRegistry = configureServiceRegistry(properties); + return makeSessionFactory(serviceRegistry); + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addPackage("com.baeldung.hibernate.pojo"); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.joincolumn.OfficialEmployee.class); + metadataSources.addAnnotatedClass(Email.class); + metadataSources.addAnnotatedClass(Office.class); + metadataSources.addAnnotatedClass(OfficeAddress.class); + + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + return configureServiceRegistry(getProperties()); + } + + private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException { + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + public static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java new file mode 100644 index 0000000000..99d9505ea3 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java @@ -0,0 +1,8 @@ +package com.baeldung.hibernate; + +public class UnsupportedTenancyException extends Exception { + public UnsupportedTenancyException (String message) { + super(message); + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java new file mode 100644 index 0000000000..d559e5a6c2 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java @@ -0,0 +1,69 @@ +package com.baeldung.hibernate.customtypes; + +import java.util.Objects; + +public class Address { + + private String addressLine1; + private String addressLine2; + private String city; + private String country; + private int zipCode; + + public String getAddressLine1() { + return addressLine1; + } + + public String getAddressLine2() { + return addressLine2; + } + + public String getCity() { + return city; + } + + public String getCountry() { + return country; + } + + public int getZipCode() { + return zipCode; + } + + public void setAddressLine1(String addressLine1) { + this.addressLine1 = addressLine1; + } + + public void setAddressLine2(String addressLine2) { + this.addressLine2 = addressLine2; + } + + public void setCity(String city) { + this.city = city; + } + + public void setCountry(String country) { + this.country = country; + } + + public void setZipCode(int zipCode) { + this.zipCode = zipCode; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Address address = (Address) o; + return zipCode == address.zipCode && + Objects.equals(addressLine1, address.addressLine1) && + Objects.equals(addressLine2, address.addressLine2) && + Objects.equals(city, address.city) && + Objects.equals(country, address.country); + } + + @Override + public int hashCode() { + return Objects.hash(addressLine1, addressLine2, city, country, zipCode); + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java new file mode 100644 index 0000000000..c10c67df9a --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java @@ -0,0 +1,169 @@ +package com.baeldung.hibernate.customtypes; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.type.IntegerType; +import org.hibernate.type.StringType; +import org.hibernate.type.Type; +import org.hibernate.usertype.CompositeUserType; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Objects; + +public class AddressType implements CompositeUserType { + + @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; + + switch (property) { + case 0: + return empAdd.getAddressLine1(); + case 1: + return empAdd.getAddressLine2(); + case 2: + return empAdd.getCity(); + case 3: + return empAdd.getCountry(); + case 4: + return Integer.valueOf(empAdd.getZipCode()); + } + + 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()); + + } + + @Override + public Class returnedClass() { + return Address.class; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x == y) + return true; + + if (Objects.isNull(x) || Objects.isNull(y)) + return false; + + return x.equals(y); + } + + @Override + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { + + Address empAdd = new Address(); + empAdd.setAddressLine1(rs.getString(names[0])); + + 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])); + + return empAdd; + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, 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()); + } + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + + 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()); + + return newEmpAdd; + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException { + return (Serializable) deepCopy(value); + } + + @Override + public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException { + return deepCopy(cached); + } + + @Override + public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException { + return original; + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java new file mode 100644 index 0000000000..56be9e693f --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java @@ -0,0 +1,51 @@ +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; + +public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor { + + public static final LocalDateStringJavaDescriptor INSTANCE = new LocalDateStringJavaDescriptor(); + + public LocalDateStringJavaDescriptor() { + super(LocalDate.class, ImmutableMutabilityPlan.INSTANCE); + } + + @Override + public String toString(LocalDate value) { + return LocalDateType.FORMATTER.format(value); + } + + @Override + public LocalDate fromString(String string) { + return LocalDate.from(LocalDateType.FORMATTER.parse(string)); + } + + @Override + public X unwrap(LocalDate value, Class type, WrapperOptions options) { + + if (value == null) + return null; + + if (String.class.isAssignableFrom(type)) + return (X) LocalDateType.FORMATTER.format(value); + + throw unknownUnwrap(type); + } + + @Override + public LocalDate wrap(X value, WrapperOptions options) { + if (value == null) + return null; + + if(String.class.isInstance(value)) + return LocalDate.from(LocalDateType.FORMATTER.parse((CharSequence) value)); + + throw unknownWrap(value.getClass()); + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java new file mode 100644 index 0000000000..c8d37073e8 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java @@ -0,0 +1,34 @@ +package com.baeldung.hibernate.customtypes; + +import org.hibernate.dialect.Dialect; +import org.hibernate.type.AbstractSingleColumnStandardBasicType; +import org.hibernate.type.DiscriminatorType; +import org.hibernate.type.descriptor.java.LocalDateJavaDescriptor; +import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor; + +import java.time.LocalDate; + +public class LocalDateStringType extends AbstractSingleColumnStandardBasicType implements DiscriminatorType { + + public static final LocalDateStringType INSTANCE = new LocalDateStringType(); + + public LocalDateStringType() { + super(VarcharTypeDescriptor.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE); + } + + @Override + public String getName() { + return "LocalDateString"; + } + + @Override + public LocalDate stringToObject(String xml) throws Exception { + return fromString(xml); + } + + @Override + public String objectToSQLString(LocalDate value, Dialect dialect) throws Exception { + return '\'' + toString(value) + '\''; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java new file mode 100644 index 0000000000..3ca06e4316 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java @@ -0,0 +1,88 @@ +package com.baeldung.hibernate.customtypes; + +import com.baeldung.hibernate.pojo.Phone; +import org.hibernate.annotations.Columns; +import org.hibernate.annotations.Parameter; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import java.time.LocalDate; + +@TypeDef(name = "PhoneNumber", + typeClass = PhoneNumberType.class, + defaultForType = PhoneNumber.class) +@Entity +@Table(name = "OfficeEmployee") +public class OfficeEmployee { + + @Id + @GeneratedValue + private long id; + + @Column + @Type(type = "LocalDateString") + private LocalDate dateOfJoining; + + @Columns(columns = {@Column(name = "country_code"), + @Column(name = "city_code"), + @Column(name = "number")}) + private PhoneNumber employeeNumber; + + @Columns(columns = {@Column(name = "address_line_1"), + @Column(name = "address_line_2"), + @Column(name = "city"), @Column(name = "country"), + @Column(name = "zip_code")}) + @Type(type = "com.baeldung.hibernate.customtypes.AddressType") + private Address empAddress; + + @Type(type = "com.baeldung.hibernate.customtypes.SalaryType", + parameters = {@Parameter(name = "currency", value = "USD")}) + @Columns(columns = {@Column(name = "amount"), + @Column(name = "currency")}) + private Salary salary; + + public Salary getSalary() { + return salary; + } + + public void setSalary(Salary salary) { + this.salary = salary; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public LocalDate getDateOfJoining() { + return dateOfJoining; + } + + public void setDateOfJoining(LocalDate dateOfJoining) { + this.dateOfJoining = dateOfJoining; + } + + public PhoneNumber getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(PhoneNumber employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public Address getEmpAddress() { + return empAddress; + } + + public void setEmpAddress(Address empAddress) { + this.empAddress = empAddress; + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java new file mode 100644 index 0000000000..0be6cbc910 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java @@ -0,0 +1,43 @@ +package com.baeldung.hibernate.customtypes; + +import java.util.Objects; + +public final class PhoneNumber { + + private final int countryCode; + private final int cityCode; + private final int number; + + public PhoneNumber(int countryCode, int cityCode, int number) { + this.countryCode = countryCode; + this.cityCode = cityCode; + this.number = number; + } + + public int getCountryCode() { + return countryCode; + } + + public int getCityCode() { + return cityCode; + } + + public int getNumber() { + return number; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PhoneNumber that = (PhoneNumber) o; + return countryCode == that.countryCode && + cityCode == that.cityCode && + number == that.number; + } + + @Override + public int hashCode() { + return Objects.hash(countryCode, cityCode, number); + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java new file mode 100644 index 0000000000..9f09352bec --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java @@ -0,0 +1,98 @@ +package com.baeldung.hibernate.customtypes; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.usertype.UserType; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Objects; + + +public class PhoneNumberType implements UserType { + @Override + public int[] sqlTypes() { + return new int[]{Types.INTEGER, Types.INTEGER, Types.INTEGER}; + } + + @Override + public Class returnedClass() { + return PhoneNumber.class; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x == y) + return true; + if (Objects.isNull(x) || Objects.isNull(y)) + return false; + + return x.equals(y); + } + + @Override + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { + int countryCode = rs.getInt(names[0]); + + if (rs.wasNull()) + return null; + + int cityCode = rs.getInt(names[1]); + int number = rs.getInt(names[2]); + PhoneNumber employeeNumber = new PhoneNumber(countryCode, cityCode, number); + + return employeeNumber; + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { + + if (Objects.isNull(value)) { + st.setNull(index, Types.INTEGER); + } else { + PhoneNumber employeeNumber = (PhoneNumber) value; + st.setInt(index,employeeNumber.getCountryCode()); + st.setInt(index+1,employeeNumber.getCityCode()); + st.setInt(index+2,employeeNumber.getNumber()); + } + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + if (Objects.isNull(value)) + return null; + + PhoneNumber empNumber = (PhoneNumber) value; + PhoneNumber newEmpNumber = new PhoneNumber(empNumber.getCountryCode(),empNumber.getCityCode(),empNumber.getNumber()); + + return newEmpNumber; + } + + @Override + public boolean isMutable() { + return false; + } + + @Override + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable) value; + } + + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java new file mode 100644 index 0000000000..f9a7ac5902 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java @@ -0,0 +1,39 @@ +package com.baeldung.hibernate.customtypes; + +import java.util.Objects; + +public class Salary { + + private Long amount; + private String currency; + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Salary salary = (Salary) o; + return Objects.equals(amount, salary.amount) && + Objects.equals(currency, salary.currency); + } + + @Override + public int hashCode() { + return Objects.hash(amount, currency); + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java new file mode 100644 index 0000000000..340c697c11 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java @@ -0,0 +1,15 @@ +package com.baeldung.hibernate.customtypes; + +public class SalaryCurrencyConvertor { + + public static Long convert(Long amount, String oldCurr, String newCurr){ + if (newCurr.equalsIgnoreCase(oldCurr)) + return amount; + + return convertTo(); + } + + private static Long convertTo() { + return 10L; + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java new file mode 100644 index 0000000000..266b85140b --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java @@ -0,0 +1,161 @@ +package com.baeldung.hibernate.customtypes; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.type.LongType; +import org.hibernate.type.StringType; +import org.hibernate.type.Type; +import org.hibernate.usertype.CompositeUserType; +import org.hibernate.usertype.DynamicParameterizedType; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Objects; +import java.util.Properties; + +public class SalaryType implements 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; + + switch (property) { + case 0: + return salary.getAmount(); + case 1: + return salary.getCurrency(); + } + + 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() { + return Salary.class; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + + if (x == y) + return true; + + if (Objects.isNull(x) || Objects.isNull(y)) + return false; + + return x.equals(y); + + } + + @Override + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { + + Salary salary = new Salary(); + salary.setAmount(rs.getLong(names[0])); + + if (rs.wasNull()) + return null; + + salary.setCurrency(rs.getString(names[1])); + + return salary; + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, 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()); + } + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + + if (Objects.isNull(value)) + return null; + + Salary oldSal = (Salary) value; + Salary newSal = new Salary(); + + newSal.setAmount(oldSal.getAmount()); + newSal.setCurrency(oldSal.getCurrency()); + + return newSal; + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException { + return (Serializable) deepCopy(value); + } + + @Override + public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException { + return deepCopy(cached); + } + + @Override + public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException { + return original; + } + + @Override + public void setParameterValues(Properties parameters) { + this.localCurrency = parameters.getProperty("currency"); + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java new file mode 100644 index 0000000000..df07c3cf69 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java @@ -0,0 +1,47 @@ +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; + +@Entity +public class Email { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String address; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "employee_id") + private OfficialEmployee employee; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public OfficialEmployee getEmployee() { + return employee; + } + + public void setEmployee(OfficialEmployee employee) { + this.employee = employee; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java new file mode 100644 index 0000000000..9940577761 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java @@ -0,0 +1,41 @@ +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; + +@Entity +public class Office { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumns({ + @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), + @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") + }) + private OfficeAddress address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public OfficeAddress getAddress() { + return address; + } + + public void setAddress(OfficeAddress address) { + this.address = address; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java new file mode 100644 index 0000000000..cc723db6a2 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java @@ -0,0 +1,34 @@ +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; + +@Entity +public class OfficeAddress { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "ZIP") + private String zipCode; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getZipCode() { + return zipCode; + } + + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java new file mode 100644 index 0000000000..49c63c7578 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java @@ -0,0 +1,36 @@ +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; + +@Entity +public class OfficialEmployee { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") + private List emails; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getEmails() { + return emails; + } + + public void setEmails(List emails) { + this.emails = emails; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java new file mode 100644 index 0000000000..d923bda5de --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java @@ -0,0 +1,50 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.io.Serializable; + +@Entity +public class Phone implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + private boolean deleted; + + private String number; + + public Phone() { + } + + public Phone(String number) { + this.number = number; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate5-annotations/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..474eeb7a44 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + Hibernate EntityManager Demo + true + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/main/resources/logback.xml b/persistence-modules/hibernate5-annotations/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java new file mode 100644 index 0000000000..63dc6330be --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java @@ -0,0 +1,90 @@ +package com.baeldung.hibernate.customtypes; + +import com.baeldung.hibernate.HibernateUtil; +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.time.LocalDate; + +import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; + +public class HibernateCustomTypesManualTest { + + @Test + public void givenEmployee_whenSavedWithCustomTypes_thenEntityIsSaved() throws IOException { + + final OfficeEmployee e = new OfficeEmployee(); + e.setDateOfJoining(LocalDate.now()); + + PhoneNumber number = new PhoneNumber(1, 222, 8781902); + e.setEmployeeNumber(number); + + Address empAdd = new Address(); + empAdd.setAddressLine1("Street"); + empAdd.setAddressLine2("Area"); + empAdd.setCity("City"); + empAdd.setCountry("Country"); + empAdd.setZipCode(100); + + e.setEmpAddress(empAdd); + + Salary empSalary = new Salary(); + empSalary.setAmount(1000L); + empSalary.setCurrency("USD"); + e.setSalary(empSalary); + + doInHibernate(this::sessionFactory, session -> { + session.save(e); + boolean contains = session.contains(e); + Assert.assertTrue(contains); + }); + + } + + @Test + public void givenEmployee_whenCustomTypeInQuery_thenReturnEntity() throws IOException { + + final OfficeEmployee e = new OfficeEmployee(); + e.setDateOfJoining(LocalDate.now()); + + PhoneNumber number = new PhoneNumber(1, 222, 8781902); + e.setEmployeeNumber(number); + + Address empAdd = new Address(); + empAdd.setAddressLine1("Street"); + empAdd.setAddressLine2("Area"); + empAdd.setCity("City"); + empAdd.setCountry("Country"); + empAdd.setZipCode(100); + e.setEmpAddress(empAdd); + + Salary empSalary = new Salary(); + empSalary.setAmount(1000L); + empSalary.setCurrency("USD"); + e.setSalary(empSalary); + + doInHibernate(this::sessionFactory, session -> { + session.save(e); + + Query query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode"); + query.setParameter("pinCode",100); + int size = query.list().size(); + + Assert.assertEquals(1, size); + }); + + } + + private SessionFactory sessionFactory() { + try { + return HibernateUtil.getSessionFactory("hibernate-customtypes.properties"); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } +} diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java new file mode 100644 index 0000000000..0998ff1d90 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java @@ -0,0 +1,57 @@ +package com.baeldung.hibernate.joincolumn; + +import com.baeldung.hibernate.HibernateUtil; +import java.io.IOException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +public class JoinColumnIntegrationTest { + + private Session session; + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") + .openSession(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenOfficeEntity_setAddress_shouldPersist() { + Office office = new Office(); + + OfficeAddress address = new OfficeAddress(); + address.setZipCode("11-111"); + office.setAddress(address); + + session.save(office); + session.flush(); + session.clear(); + } + + @Test + public void givenEmployeeEntity_setEmails_shouldPersist() { + OfficialEmployee employee = new OfficialEmployee(); + + Email email = new Email(); + email.setAddress("example@email.com"); + email.setEmployee(employee); + + session.save(employee); + session.flush(); + session.clear(); + } + +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate5-annotations/src/test/resources/hibernate-spatial.properties new file mode 100644 index 0000000000..1657c838e3 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/resources/hibernate-spatial.properties @@ -0,0 +1,14 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/log4j.xml b/persistence-modules/hibernate5-annotations/src/test/resources/log4j.xml new file mode 100644 index 0000000000..2d153af124 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/resources/log4j.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/log4j2.xml b/persistence-modules/hibernate5-annotations/src/test/resources/log4j2.xml new file mode 100644 index 0000000000..c5d0f12462 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/resources/log4j2.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/logback.xml b/persistence-modules/hibernate5-annotations/src/test/resources/logback.xml new file mode 100644 index 0000000000..9e591977d7 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} | %-5p | [%thread] %logger{5}:%L - %msg%n + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/profile.png b/persistence-modules/hibernate5-annotations/src/test/resources/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd4e978b96d0f59a6e48692fcb68d1c6c565a20 GIT binary patch literal 1117 zcmV-j1fu(iP)%yyh@V&OYl(_AFwE`D&8)` zPnvkdvc#Z>pRh2kBHk{=qaGfCG;?<;rVe;D+%LyZS~!K}c+|op81YK@rzPHU@Th|m z4Dk`HcojTY;+}_-W%HGqKH@C!LiH8Tp>1lC@aTqoy zBU~QK<}hs@q|M8($ee`o<9#`B3-PL4Y7d9kW#<;n>t}6VNpYCswLrJTtEa_lFwgN$52-_vxvvfJs@B6-OYs%-@M_JTx*UfozG6(Bhs)>w z!pG%vU$b%f++EGa<#Tu1FZ^c#{;G|y5=kM3Y#X^mtSrFA_-o-vX7e_$5-udx(>S4U)i|4)(UJ~zR(vwE+6VTAzoo7wIS|c zh*yt`3wK%<+yX~Z9G1z2GQgf3~qx jc9u$WjpqGof00000NkvXXu0mjfJX<<= literal 0 HcmV?d00001 From 074dd3e986f44ebc0100103b381c64ee8d8c8bed Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:20:04 +0530 Subject: [PATCH 033/530] JAVA-4 : added new module hibernate-enterprise --- .../hibernate5-enterprise/README.md | 13 + .../hibernate5-enterprise/pom.xml | 76 ++++ .../com/baeldung/hibernate/HibernateUtil.java | 72 +++ .../UnsupportedTenancyException.java | 8 + .../hibernate/exception/EntityWithNoId.java | 16 + .../hibernate/exception/HibernateUtil.java | 63 +++ .../baeldung/hibernate/exception/Product.java | 40 ++ .../baeldung/hibernate/logging/Employee.java | 59 +++ .../baeldung/hibernate/pojo/PointEntity.java | 43 ++ .../hibernate/pojo/PolygonEntity.java | 38 ++ .../com/baeldung/hibernate/pojo/Student.java | 51 +++ .../baeldung/hibernateparameters/Event.java | 30 ++ .../main/resources/META-INF/persistence.xml | 18 + .../hibernateparameters/Event.hbm.xml | 15 + .../main/resources/hibernate-logging.cfg.xml | 27 ++ .../src/main/resources/hibernate.cfg.xml | 28 ++ .../src/main/resources/init_database.sql | 10 + .../src/main/resources/logback.xml | 13 + .../HibernateSpatialIntegrationTest.java | 161 +++++++ .../AggregateFunctionsIntegrationTest.java | 87 ++++ .../exception/HibernateExceptionUnitTest.java | 425 ++++++++++++++++++ .../HibernateLoggingIntegrationTest.java | 50 +++ .../baeldung/hibernate/multitenancy/Car.java | 26 ++ .../MultitenancyIntegrationTest.java | 104 +++++ ...seApproachMultitenancyIntegrationTest.java | 25 ++ .../MapMultiTenantConnectionProvider.java | 42 ++ .../multitenancy/database/TenantIdNames.java | 6 + ...maApproachMultitenancyIntegrationTest.java | 26 ++ .../SchemaMultiTenantConnectionProvider.java | 48 ++ .../multitenancy/schema/TenantIdNames.java | 6 + .../NamedParameterUnitTest.java | 73 +++ ...hibernate-database-multitenancy.properties | 2 + .../hibernate-database-mydb1.properties | 4 + .../hibernate-database-mydb2.properties | 4 + .../resources/hibernate-exception.properties | 16 + .../hibernate-schema-multitenancy.properties | 7 + .../resources/hibernate-spatial.properties | 14 + .../src/test/resources/hibernate.properties | 14 + .../src/test/resources/lifecycle-init.sql | 25 ++ .../src/test/resources/profile.png | Bin 0 -> 1117 bytes 40 files changed, 1785 insertions(+) create mode 100644 persistence-modules/hibernate5-enterprise/README.md create mode 100644 persistence-modules/hibernate5-enterprise/pom.xml create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java create mode 100644 persistence-modules/hibernate5-enterprise/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate5-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml create mode 100644 persistence-modules/hibernate5-enterprise/src/main/resources/hibernate-logging.cfg.xml create mode 100644 persistence-modules/hibernate5-enterprise/src/main/resources/hibernate.cfg.xml create mode 100644 persistence-modules/hibernate5-enterprise/src/main/resources/init_database.sql create mode 100644 persistence-modules/hibernate5-enterprise/src/main/resources/logback.xml create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-multitenancy.properties create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb1.properties create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb2.properties create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-exception.properties create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-schema-multitenancy.properties create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-spatial.properties create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/hibernate.properties create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/lifecycle-init.sql create mode 100644 persistence-modules/hibernate5-enterprise/src/test/resources/profile.png diff --git a/persistence-modules/hibernate5-enterprise/README.md b/persistence-modules/hibernate5-enterprise/README.md new file mode 100644 index 0000000000..994d8f062a --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/README.md @@ -0,0 +1,13 @@ +## Hibernate 5 + +This module contains articles about Hibernate 5. + +### Relevant articles: + +- [Introduction to Hibernate Spatial](http://www.baeldung.com/hibernate-spatial) +- [A Guide to Multitenancy in Hibernate 5](http://www.baeldung.com/hibernate-5-multitenancy) +- [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions) +- [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions) +- [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set) +- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode) +- [Various Logging Levels in Hibernate](https://www.baeldung.com/hibernate-logging-levels) \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/pom.xml b/persistence-modules/hibernate5-enterprise/pom.xml new file mode 100644 index 0000000000..f12bb7e081 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + hibernate5-enterprise + 0.0.1-SNAPSHOT + hibernate5-enterprise + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + com.h2database + h2 + ${h2.version} + + + org.hibernate + hibernate-spatial + ${hibernate.version} + + + org.opengeo + geodb + ${geodb.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + ch.vorburger.mariaDB4j + mariaDB4j + ${mariaDB4j.version} + + + org.hibernate + hibernate-testing + ${hibernate.version} + + + + + + geodb-repo + GeoDB repository + http://repo.boundlessgeo.com/main/ + + + + + 5.3.7.Final + 6.0.6 + 2.2.3 + 3.8.0 + 0.9 + + + diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java new file mode 100644 index 0000000000..ddeb1c42ea --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -0,0 +1,72 @@ +package com.baeldung.hibernate; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.pojo.PointEntity; +import com.baeldung.hibernate.pojo.PolygonEntity; +import com.baeldung.hibernate.pojo.Student; + +public class HibernateUtil { + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + ServiceRegistry serviceRegistry = configureServiceRegistry(); + return makeSessionFactory(serviceRegistry); + } + + public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException { + ServiceRegistry serviceRegistry = configureServiceRegistry(properties); + return makeSessionFactory(serviceRegistry); + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addPackage("com.baeldung.hibernate.pojo"); + metadataSources.addAnnotatedClass(Student.class); + metadataSources.addAnnotatedClass(PointEntity.class); + metadataSources.addAnnotatedClass(PolygonEntity.class); + + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + return configureServiceRegistry(getProperties()); + } + + private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException { + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + public static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java new file mode 100644 index 0000000000..99d9505ea3 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java @@ -0,0 +1,8 @@ +package com.baeldung.hibernate; + +public class UnsupportedTenancyException extends Exception { + public UnsupportedTenancyException (String message) { + super(message); + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java new file mode 100644 index 0000000000..989fa1281a --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java @@ -0,0 +1,16 @@ +package com.baeldung.hibernate.exception; + +import javax.persistence.Entity; + +@Entity +public class EntityWithNoId { + private int id; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java new file mode 100644 index 0000000000..ae5174ac9c --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java @@ -0,0 +1,63 @@ +package com.baeldung.hibernate.exception; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) + throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + if (sessionFactory == null) { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + sessionFactory = makeSessionFactory(serviceRegistry); + } + return sessionFactory; + } + + private static SessionFactory makeSessionFactory( + ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(Product.class); + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() + throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, + "hibernate-exception.properties")); + try (FileInputStream inputStream = new FileInputStream( + propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java new file mode 100644 index 0000000000..031fa38de0 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java @@ -0,0 +1,40 @@ +package com.baeldung.hibernate.exception; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Product { + + private int id; + + private String name; + private String description; + + @Id + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Column(nullable=false) + 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/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java new file mode 100644 index 0000000000..9dcf4058a7 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java @@ -0,0 +1,59 @@ +package com.baeldung.hibernate.logging; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Employee { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String employeeNumber; + + private String title; + + private String name; + + public Employee() { + } + + public Employee(String name, String employeeNumber) { + this.name = name; + this.employeeNumber = employeeNumber; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java new file mode 100644 index 0000000000..736abde866 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java @@ -0,0 +1,43 @@ +package com.baeldung.hibernate.pojo; + +import com.vividsolutions.jts.geom.Point; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class PointEntity { + + @Id + @GeneratedValue + private Long id; + + @Column(columnDefinition="BINARY(2048)") + private Point point; + + public PointEntity() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Point getPoint() { + return point; + } + + public void setPoint(Point point) { + this.point = point; + } + + @Override + public String toString() { + return "PointEntity{" + "id=" + id + ", point=" + point + '}'; + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java new file mode 100644 index 0000000000..69208c8cd4 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.pojo; + +import com.vividsolutions.jts.geom.Polygon; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class PolygonEntity { + + @Id + @GeneratedValue + private Long id; + + private Polygon polygon; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Polygon getPolygon() { + return polygon; + } + + public void setPolygon(Polygon polygon) { + this.polygon = polygon; + } + + @Override + public String toString() { + return "PolygonEntity{" + "id=" + id + ", polygon=" + polygon + '}'; + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java new file mode 100644 index 0000000000..9b26c117eb --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java @@ -0,0 +1,51 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long studentId; + + private String name; + + private int age; + + public Student() { + } + + public Student(String name, int age) { + this.name = name; + this.age = age; + } + + public long getStudentId() { + return studentId; + } + + public void setStudentId(long studentId) { + this.studentId = studentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java new file mode 100644 index 0000000000..7912659a09 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java @@ -0,0 +1,30 @@ +package com.baeldung.hibernateparameters; + +public class Event { + private Long id; + + private String title; + + public Event() { + } + + public Event(String title) { + this.title = title; + } + + public Long getId() { + return id; + } + + private void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate5-enterprise/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..474eeb7a44 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + Hibernate EntityManager Demo + true + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml b/persistence-modules/hibernate5-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml new file mode 100644 index 0000000000..c485080879 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate-logging.cfg.xml b/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate-logging.cfg.xml new file mode 100644 index 0000000000..52ef1ee685 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate-logging.cfg.xml @@ -0,0 +1,27 @@ + + + + + + + org.h2.Driver + jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1 + sa + + + 1 + + org.hibernate.dialect.H2Dialect + + org.hibernate.cache.internal.NoCacheProvider + + true + + create + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate.cfg.xml b/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000000..be564aaf5a --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,28 @@ + + + + + + + org.h2.Driver + jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1 + sa + + + 1 + + org.hibernate.dialect.H2Dialect + + org.hibernate.cache.internal.NoCacheProvider + + true + + create + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/init_database.sql b/persistence-modules/hibernate5-enterprise/src/main/resources/init_database.sql new file mode 100644 index 0000000000..b2848aa256 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/resources/init_database.sql @@ -0,0 +1,10 @@ +CREATE ALIAS UPDATE_EMPLOYEE_DESIGNATION AS $$ +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +@CODE +void updateEmployeeDesignation(final Connection conn, final String employeeNumber, final String title) throws SQLException { + CallableStatement updateStatement = conn.prepareCall("update deptemployee set title = '" + title + "' where employeeNumber = '" + employeeNumber + "'"); + updateStatement.execute(); +} +$$; \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/logback.xml b/persistence-modules/hibernate5-enterprise/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java new file mode 100644 index 0000000000..74f752ab8c --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java @@ -0,0 +1,161 @@ +package com.baeldung.hibernate; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import javax.persistence.Query; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +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; + +public class HibernateSpatialIntegrationTest { + + private Session session; + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") + .openSession(); + transaction = session.beginTransaction(); + session.doWork(conn -> { GeoDB.InitGeoDB(conn); }); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void shouldConvertWktToGeometry() throws ParseException { + Geometry geometry = wktToGeometry("POINT (2 5)"); + assertEquals("Point", geometry.getGeometryType()); + assertTrue(geometry instanceof Point); + } + + @Test + public void shouldInsertAndSelectPoints() throws ParseException { + PointEntity entity = new PointEntity(); + entity.setPoint((Point) wktToGeometry("POINT (1 1)")); + + session.persist(entity); + PointEntity fromDb = session.find(PointEntity.class, entity.getId()); + assertEquals("POINT (1 1)", fromDb.getPoint().toString()); + } + + @Test + public void shouldSelectDisjointPoints() throws ParseException { + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Point point = (Point) wktToGeometry("POINT (3 4)"); + Query query = session.createQuery("select p from PointEntity p " + + "where disjoint(p.point, :point) = true", PointEntity.class); + query.setParameter("point", point); + assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(0)).getPoint().toString()); + assertEquals("POINT (5 6)", ((PointEntity) query.getResultList().get(1)).getPoint().toString()); + } + + @Test + public void shouldSelectAllPointsWithinPolygon() throws ParseException { + insertPoint("POINT (1 1)"); + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Query query = session.createQuery("select p from PointEntity p where within(p.point, :area) = true", + PointEntity.class); + query.setParameter("area", wktToGeometry("POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))")); + assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) + .containsOnly("POINT (1 1)", "POINT (1 2)", "POINT (3 4)"); + } + + @Test + public void shouldSelectAllPointsWithinRadius() throws ParseException { + insertPoint("POINT (1 1)"); + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Query query = session.createQuery("select p from PointEntity p where within(p.point, :circle) = true", + PointEntity.class); + query.setParameter("circle", createCircle(0.0, 0.0, 5)); + + assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) + .containsOnly("POINT (1 1)", "POINT (1 2)"); + } + + @Test + public void shouldSelectAdjacentPolygons() throws ParseException { + insertPolygon("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))"); + insertPolygon("POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); + insertPolygon("POLYGON ((2 2, 3 1, 2 5, 4 3, 3 3, 2 2))"); + + Query query = session.createQuery("select p from PolygonEntity p where touches(p.polygon, :polygon) = true", + PolygonEntity.class); + query.setParameter("polygon", wktToGeometry("POLYGON ((5 5, 5 10, 10 10, 10 5, 5 5))")); + assertThat(query.getResultList().stream().map(p -> ((PolygonEntity) p).getPolygon().toString())) + .containsOnly("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))", "POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); + } + + private void insertPoint(String point) throws ParseException { + PointEntity entity = new PointEntity(); + entity.setPoint((Point) wktToGeometry(point)); + session.persist(entity); + } + + private void insertPolygon(String polygon) throws ParseException { + PolygonEntity entity = new PolygonEntity(); + entity.setPolygon((Polygon) wktToGeometry(polygon)); + session.persist(entity); + } + + private Geometry wktToGeometry(String wellKnownText) throws ParseException { + WKTReader fromText = new WKTReader(); + Geometry geom = null; + geom = fromText.read(wellKnownText); + return geom; + } + + private static Geometry createCircle(double x, double y, double radius) { + GeometricShapeFactory shapeFactory = new GeometricShapeFactory(); + shapeFactory.setNumPoints(32); + shapeFactory.setCentre(new Coordinate(x, y)); + shapeFactory.setSize(radius * 2); + return shapeFactory.createCircle(); + } + + public static Properties getProperties(String propertyFile) throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(propertyFile); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java new file mode 100644 index 0000000000..0b2bdf7ead --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java @@ -0,0 +1,87 @@ +package com.baeldung.hibernate.aggregatefunctions; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; + +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.pojo.Student; + +public class AggregateFunctionsIntegrationTest { + + private static Session session; + private static Transaction transaction; + + @BeforeClass + public static final void setup() throws HibernateException, IOException { + session = HibernateUtil.getSessionFactory() + .openSession(); + transaction = session.beginTransaction(); + + Student jonas = new Student("Jonas", 22); + session.save(jonas); + + Student sally = new Student("Sally", 20); + session.save(sally); + + Student simon = new Student("Simon", 25); + session.save(simon); + + Student raven = new Student("Raven", 21); + session.save(raven); + + Student sam = new Student("Sam", 23); + session.save(sam); + + } + + @AfterClass + public static final void teardown() { + if (session != null) { + transaction.rollback(); + session.close(); + } + } + + @Test + public void whenMaxAge_ThenReturnValue() { + int maxAge = (int) session.createQuery("SELECT MAX(age) from Student") + .getSingleResult(); + assertThat(maxAge).isEqualTo(25); + } + + @Test + public void whenMinAge_ThenReturnValue() { + int minAge = (int) session.createQuery("SELECT MIN(age) from Student") + .getSingleResult(); + assertThat(minAge).isEqualTo(20); + } + + @Test + public void whenAverageAge_ThenReturnValue() { + Double avgAge = (Double) session.createQuery("SELECT AVG(age) from Student") + .getSingleResult(); + assertThat(avgAge).isEqualTo(22.2); + } + + @Test + public void whenCountAll_ThenReturnValue() { + Long totalStudents = (Long) session.createQuery("SELECT COUNT(*) from Student") + .getSingleResult(); + assertThat(totalStudents).isEqualTo(5); + } + + @Test + public void whenSumOfAllAges_ThenReturnValue() { + Long sumOfAllAges = (Long) session.createQuery("SELECT SUM(age) from Student") + .getSingleResult(); + assertThat(sumOfAllAges).isEqualTo(111); + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java new file mode 100644 index 0000000000..3581c81daa --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java @@ -0,0 +1,425 @@ +package com.baeldung.hibernate.exception; + +import static org.hamcrest.CoreMatchers.isA; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.util.List; + +import javax.persistence.OptimisticLockException; +import javax.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.query.NativeQuery; +import org.hibernate.tool.schema.spi.CommandAcceptanceException; +import org.hibernate.tool.schema.spi.SchemaManagementException; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HibernateExceptionUnitTest { + + private static final Logger logger = LoggerFactory + .getLogger(HibernateExceptionUnitTest.class); + private SessionFactory sessionFactory; + + @Before + public void setUp() throws IOException { + sessionFactory = HibernateUtil.getSessionFactory(); + } + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private Configuration getConfiguration() { + Configuration cfg = new Configuration(); + cfg.setProperty(AvailableSettings.DIALECT, + "org.hibernate.dialect.H2Dialect"); + cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "none"); + cfg.setProperty(AvailableSettings.DRIVER, "org.h2.Driver"); + cfg.setProperty(AvailableSettings.URL, + "jdbc:h2:mem:myexceptiondb2;DB_CLOSE_DELAY=-1"); + cfg.setProperty(AvailableSettings.USER, "sa"); + cfg.setProperty(AvailableSettings.PASS, ""); + return cfg; + } + + @Test + public void whenQueryExecutedWithUnmappedEntity_thenMappingException() { + thrown.expectCause(isA(MappingException.class)); + thrown.expectMessage("Unknown entity: java.lang.String"); + + Session session = sessionFactory.openSession(); + NativeQuery query = session + .createNativeQuery("select name from PRODUCT", String.class); + query.getResultList(); + } + + @Test + @SuppressWarnings("rawtypes") + public void whenQueryExecuted_thenOK() { + Session session = sessionFactory.openSession(); + NativeQuery query = session + .createNativeQuery("select name from PRODUCT"); + List results = query.getResultList(); + assertNotNull(results); + } + + @Test + public void givenEntityWithoutId_whenSessionFactoryCreated_thenAnnotationException() { + thrown.expect(AnnotationException.class); + thrown.expectMessage("No identifier specified for entity"); + + Configuration cfg = getConfiguration(); + cfg.addAnnotatedClass(EntityWithNoId.class); + cfg.buildSessionFactory(); + } + + @Test + public void givenMissingTable_whenSchemaValidated_thenSchemaManagementException() { + thrown.expect(SchemaManagementException.class); + thrown.expectMessage("Schema-validation: missing table"); + + Configuration cfg = getConfiguration(); + cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "validate"); + cfg.addAnnotatedClass(Product.class); + cfg.buildSessionFactory(); + } + + @Test + public void whenWrongDialectSpecified_thenCommandAcceptanceException() { + thrown.expect(SchemaManagementException.class); + thrown.expectCause(isA(CommandAcceptanceException.class)); + thrown.expectMessage("Halting on error : Error executing DDL"); + + Configuration cfg = getConfiguration(); + cfg.setProperty(AvailableSettings.DIALECT, + "org.hibernate.dialect.MySQLDialect"); + cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "update"); + + // This does not work due to hibernate bug + // cfg.setProperty(AvailableSettings.HBM2DDL_HALT_ON_ERROR,"true"); + cfg.getProperties() + .put(AvailableSettings.HBM2DDL_HALT_ON_ERROR, true); + + cfg.addAnnotatedClass(Product.class); + cfg.buildSessionFactory(); + } + + @Test + public void givenMissingTable_whenEntitySaved_thenSQLGrammarException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(SQLGrammarException.class)); + thrown + .expectMessage("SQLGrammarException: could not prepare statement"); + + Configuration cfg = getConfiguration(); + cfg.addAnnotatedClass(Product.class); + + SessionFactory sessionFactory = cfg.buildSessionFactory(); + Session session = null; + Transaction transaction = null; + try { + + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + Product product = new Product(); + product.setId(1); + product.setName("Product 1"); + session.save(product); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + closeSessionFactoryQuietly(sessionFactory); + } + } + + @Test + public void givenMissingTable_whenQueryExecuted_thenSQLGrammarException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(SQLGrammarException.class)); + thrown + .expectMessage("SQLGrammarException: could not prepare statement"); + + Session session = sessionFactory.openSession(); + NativeQuery query = session.createNativeQuery( + "select * from NON_EXISTING_TABLE", Product.class); + query.getResultList(); + } + + @Test + public void whenDuplicateIdSaved_thenConstraintViolationException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(ConstraintViolationException.class)); + thrown.expectMessage( + "ConstraintViolationException: could not execute statement"); + + Session session = null; + Transaction transaction = null; + + for (int i = 1; i <= 2; i++) { + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + Product product = new Product(); + product.setId(1); + product.setName("Product " + i); + session.save(product); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + } + + @Test + public void givenNotNullPropertyNotSet_whenEntityIdSaved_thenPropertyValueException() { + thrown.expect(isA(PropertyValueException.class)); + thrown.expectMessage( + "not-null property references a null or transient value"); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product = new Product(); + product.setId(1); + session.save(product); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + + } + + @Test + public void givenQueryWithDataTypeMismatch_WhenQueryExecuted_thenDataException() { + thrown.expectCause(isA(DataException.class)); + thrown.expectMessage( + "org.hibernate.exception.DataException: could not prepare statement"); + + Session session = sessionFactory.openSession(); + NativeQuery query = session.createNativeQuery( + "select * from PRODUCT where id='wrongTypeId'", Product.class); + query.getResultList(); + } + + @Test + public void givenSessionContainingAnId_whenIdAssociatedAgain_thenNonUniqueObjectException() { + thrown.expect(isA(NonUniqueObjectException.class)); + thrown.expectMessage( + "A different object with the same identifier value was already associated with the session"); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(1); + product1.setName("Product 1"); + session.save(product1); + + Product product2 = new Product(); + product2.setId(1); + product2.setName("Product 2"); + session.save(product2); + + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + @Test + public void whenDeletingADeletedObject_thenOptimisticLockException() { + thrown.expect(isA(OptimisticLockException.class)); + thrown.expectMessage( + "Batch update returned unexpected row count from update"); + thrown.expectCause(isA(StaleStateException.class)); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(12); + product1.setName("Product 12"); + session.save(product1); + transaction.commit(); + session.close(); + + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + Product product2 = session.get(Product.class, 12); + session.createNativeQuery("delete from Product where id=12") + .executeUpdate(); + // We need to refresh to fix the error. + // session.refresh(product2); + session.delete(product2); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + @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)); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(15); + product1.setName("Product1"); + session.update(product1); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + @Test + public void givenTxnMarkedRollbackOnly_whenCommitted_thenTransactionException() { + thrown.expect(isA(TransactionException.class)); + + Session session = null; + Transaction transaction = null; + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(15); + product1.setName("Product1"); + session.save(product1); + transaction.setRollbackOnly(); + + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + private void rollbackTransactionQuietly(Transaction transaction) { + if (transaction != null && transaction.isActive()) { + try { + transaction.rollback(); + } catch (Exception e) { + logger.error("Exception while rolling back transaction", e); + } + } + } + + private void closeSessionQuietly(Session session) { + if (session != null) { + try { + session.close(); + } catch (Exception e) { + logger.error("Exception while closing session", e); + } + } + } + + private void closeSessionFactoryQuietly(SessionFactory sessionFactory) { + if (sessionFactory != null) { + try { + sessionFactory.close(); + } catch (Exception e) { + logger.error("Exception while closing sessionFactory", e); + } + } + } + + @Test + public void givenExistingEntity_whenIdUpdated_thenHibernateException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(HibernateException.class)); + thrown.expectMessage( + "identifier of an instance of com.baeldung.hibernate.exception.Product was altered"); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(222); + product1.setName("Product 222"); + session.save(product1); + transaction.commit(); + closeSessionQuietly(session); + + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product2 = session.get(Product.class, 222); + product2.setId(333); + session.save(product2); + + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java new file mode 100644 index 0000000000..f609c75834 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java @@ -0,0 +1,50 @@ +package com.baeldung.hibernate.logging; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.IOException; +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.query.Query; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.logging.Employee; + +public class HibernateLoggingIntegrationTest { + + private SessionFactory sessionFactory; + + @Before + public void setUp() throws IOException { + final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure("hibernate-logging.cfg.xml") + .build(); + try { + sessionFactory = new MetadataSources(registry).buildMetadata() + .buildSessionFactory(); + Session session = sessionFactory.openSession(); + session.beginTransaction(); + session.save(new Employee("John Smith", "001")); + session.getTransaction() + .commit(); + session.close(); + } catch (Exception e) { + fail(e); + StandardServiceRegistryBuilder.destroy(registry); + } + } + + @Test + public void whenAllEmployeesAreSelected_ThenSuccess() { + Query query = sessionFactory.openSession().createQuery("from com.baeldung.hibernate.logging.Employee", Employee.class); + List deptEmployees = query.list(); + Employee deptEmployee = deptEmployees.get(0); + assertEquals("John Smith", deptEmployee.getName()); + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java new file mode 100644 index 0000000000..1b6cee7e67 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java @@ -0,0 +1,26 @@ +package com.baeldung.hibernate.multitenancy; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity(name = "Car") +@Table(name = "Car") +public class Car implements Serializable { + + private static final long serialVersionUID = 1015320564683423342L; + + private String brand; + + @Id + public String getBrand() { + return brand; + } + + public void setBrand(String brand) { + this.brand = brand; + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java new file mode 100644 index 0000000000..fdc3f9fa81 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java @@ -0,0 +1,104 @@ +package com.baeldung.hibernate.multitenancy; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.IOException; +import java.util.Properties; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.context.spi.CurrentTenantIdentifierResolver; +import org.hibernate.service.ServiceRegistry; +import org.junit.Before; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import com.baeldung.hibernate.multitenancy.database.TenantIdNames; + +public abstract class MultitenancyIntegrationTest { + + public abstract String getPropertyFile(); + + @Mock + private CurrentTenantIdentifierResolver currentTenantIdentifierResolver; + + private SessionFactory sessionFactory; + + @Before + public void setup() throws IOException { + MockitoAnnotations.initMocks(this); + + Mockito.when(currentTenantIdentifierResolver.validateExistingCurrentSessions()) + .thenReturn(false); + + Properties properties = getHibernateProperties(); + properties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver); + + sessionFactory = buildSessionFactory(properties); + + initTenant(TenantIdNames.MYDB1); + initTenant(TenantIdNames.MYDB2); + } + + protected void initTenant(String tenantId) { + whenCurrentTenantIs(tenantId); + createCarTable(); + } + + protected void whenCurrentTenantIs(String tenantId) { + Mockito.when(currentTenantIdentifierResolver.resolveCurrentTenantIdentifier()) + .thenReturn(tenantId); + } + + protected void whenAddCar(String brand) { + Session session = sessionFactory.openSession(); + Transaction tx = session.beginTransaction(); + Car car = new Car(); + car.setBrand(brand); + session.save(car); + tx.commit(); + } + + protected void thenCarFound(String brand) { + Session session = sessionFactory.openSession(); + assertNotNull(session.get(Car.class, brand)); + } + + protected void thenCarNotFound(String brand) { + Session session = sessionFactory.openSession(); + assertNull(session.get(Car.class, brand)); + } + + @SuppressWarnings("deprecation") + private void createCarTable() { + Session session = sessionFactory.openSession(); + Transaction tx = session.beginTransaction(); + session.createSQLQuery("drop table Car if exists") + .executeUpdate(); + session.createSQLQuery("create table Car (brand varchar(255) primary key)") + .executeUpdate(); + tx.commit(); + } + + private Properties getHibernateProperties() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getResourceAsStream(getPropertyFile())); + return properties; + } + + private static SessionFactory buildSessionFactory(Properties properties) { + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(Car.class); + return metadataSources.buildMetadata() + .buildSessionFactory(); + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java new file mode 100644 index 0000000000..92f477a646 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.multitenancy.database; + +import java.io.IOException; + +import org.junit.Test; + +import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest; + +public class DatabaseApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest { + + @Override + public String getPropertyFile() { + return "/hibernate-database-multitenancy.properties"; + } + + @Test + public void givenDatabaseApproach_whenAddingEntries_thenOnlyAddedToConcreteDatabase() throws IOException { + whenCurrentTenantIs(TenantIdNames.MYDB1); + whenAddCar("myCar"); + thenCarFound("myCar"); + whenCurrentTenantIs(TenantIdNames.MYDB2); + thenCarNotFound("myCar"); + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java new file mode 100644 index 0000000000..eb1f410622 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java @@ -0,0 +1,42 @@ +package com.baeldung.hibernate.multitenancy.database; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; +import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; + +@SuppressWarnings("serial") +public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { + + private final Map connectionProviderMap = new HashMap<>(); + + public MapMultiTenantConnectionProvider() throws IOException { + initConnectionProviderForTenant(TenantIdNames.MYDB1); + initConnectionProviderForTenant(TenantIdNames.MYDB2); + } + + @Override + protected ConnectionProvider getAnyConnectionProvider() { + return connectionProviderMap.values() + .iterator() + .next(); + } + + @Override + protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { + return connectionProviderMap.get(tenantIdentifier); + } + + private void initConnectionProviderForTenant(String tenantId) throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getResourceAsStream(String.format("/hibernate-database-%s.properties", tenantId))); + DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); + connectionProvider.configure(properties); + this.connectionProviderMap.put(tenantId, connectionProvider); + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java new file mode 100644 index 0000000000..231272fa63 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java @@ -0,0 +1,6 @@ +package com.baeldung.hibernate.multitenancy.database; + +public class TenantIdNames { + public static final String MYDB1 = "mydb1"; + public static final String MYDB2 = "mydb2"; +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java new file mode 100644 index 0000000000..304af65fca --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.hibernate.multitenancy.schema; + +import java.io.IOException; + +import org.junit.Test; + +import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest; +import com.baeldung.hibernate.multitenancy.database.TenantIdNames; + +public class SchemaApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest { + + @Override + public String getPropertyFile() { + return "/hibernate-schema-multitenancy.properties"; + } + + @Test + public void givenSchemaApproach_whenAddingEntries_thenOnlyAddedToConcreteSchema() throws IOException { + whenCurrentTenantIs(TenantIdNames.MYDB1); + whenAddCar("Ferrari"); + thenCarFound("Ferrari"); + whenCurrentTenantIs(TenantIdNames.MYDB2); + thenCarNotFound("Ferrari"); + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java new file mode 100644 index 0000000000..601eba651c --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java @@ -0,0 +1,48 @@ +package com.baeldung.hibernate.multitenancy.schema; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Properties; + +import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; +import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; + +@SuppressWarnings("serial") +public class SchemaMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { + + private final ConnectionProvider connectionProvider; + + public SchemaMultiTenantConnectionProvider() throws IOException { + connectionProvider = initConnectionProvider(); + } + + @Override + protected ConnectionProvider getAnyConnectionProvider() { + return connectionProvider; + } + + @Override + protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { + return connectionProvider; + } + + @Override + public Connection getConnection(String tenantIdentifier) throws SQLException { + Connection connection = super.getConnection(tenantIdentifier); + connection.createStatement() + .execute(String.format("SET SCHEMA %s;", tenantIdentifier)); + return connection; + } + + private ConnectionProvider initConnectionProvider() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getResourceAsStream("/hibernate-schema-multitenancy.properties")); + + DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); + connectionProvider.configure(properties); + return connectionProvider; + } + +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java new file mode 100644 index 0000000000..2eba94e307 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java @@ -0,0 +1,6 @@ +package com.baeldung.hibernate.multitenancy.schema; + +public class TenantIdNames { + public static final String MYDB1 = "mydb1"; + public static final String MYDB2 = "mydb2"; +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java new file mode 100644 index 0000000000..4efa1e1f68 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.hibernateparameters; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.query.Query; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class NamedParameterUnitTest { + private SessionFactory sessionFactory; + + @Before + public void setUp() throws Exception { + final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() + .configure() + .build(); + try { + sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); + Session session = sessionFactory.openSession(); + session.beginTransaction(); + session.save(new Event("Event 1")); + session.save(new Event("Event 2")); + session.getTransaction().commit(); + session.close(); + } catch (Exception e) { + fail(e); + StandardServiceRegistryBuilder.destroy(registry); + } + } + + @After + public void tearDown() throws Exception { + if (sessionFactory != null) { + sessionFactory.close(); + } + } + + @Test + public void whenNamedParameterProvided_thenCorrect() { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class); + + // This binds the value "Event1" to the parameter :eventTitle + query.setParameter("eventTitle", "Event 1"); + + assertEquals(1, query.list().size()); + session.getTransaction().commit(); + session.close(); + } + + @Test(expected = org.hibernate.QueryException.class) + public void whenNamedParameterMissing_thenThrowsQueryException() { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class); + + try { + query.list(); + fail("We are expecting an exception!"); + } finally { + session.getTransaction().commit(); + session.close(); + } + } +} diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-multitenancy.properties b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-multitenancy.properties new file mode 100644 index 0000000000..853fa80dfc --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-multitenancy.properties @@ -0,0 +1,2 @@ +hibernate.multiTenancy=DATABASE +hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.database.MapMultiTenantConnectionProvider \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb1.properties b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb1.properties new file mode 100644 index 0000000000..345f1dbbea --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb1.properties @@ -0,0 +1,4 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb2.properties b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb2.properties new file mode 100644 index 0000000000..626b7853c6 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb2.properties @@ -0,0 +1,4 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb2;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-exception.properties b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-exception.properties new file mode 100644 index 0000000000..e08a23166d --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-exception.properties @@ -0,0 +1,16 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:myexceptiondb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +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/hibernate5-enterprise/src/test/resources/hibernate-schema-multitenancy.properties b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-schema-multitenancy.properties new file mode 100644 index 0000000000..4abb621355 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-schema-multitenancy.properties @@ -0,0 +1,7 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS MYDB1\\;CREATE SCHEMA IF NOT EXISTS MYDB2\\; +hibernate.connection.username=sa +hibernate.connection.autocommit=true +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.multiTenancy=SCHEMA +hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.schema.SchemaMultiTenantConnectionProvider \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-spatial.properties new file mode 100644 index 0000000000..1657c838e3 --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-spatial.properties @@ -0,0 +1,14 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate.properties b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate.properties new file mode 100644 index 0000000000..c14782ce0f --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate.properties @@ -0,0 +1,14 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/lifecycle-init.sql b/persistence-modules/hibernate5-enterprise/src/test/resources/lifecycle-init.sql new file mode 100644 index 0000000000..c0c9a3f34d --- /dev/null +++ b/persistence-modules/hibernate5-enterprise/src/test/resources/lifecycle-init.sql @@ -0,0 +1,25 @@ +create sequence hibernate_sequence start with 1 increment by 1; + +create table Football_Player ( + id bigint not null, + name varchar(255), + primary key (id) +); + +insert into + Football_Player + (name, id) + values + ('Cristiano Ronaldo', next value for hibernate_sequence); + +insert into + Football_Player + (name, id) + values + ('Lionel Messi', next value for hibernate_sequence); + +insert into + Football_Player + (name, id) + values + ('Gigi Buffon', next value for hibernate_sequence); \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/profile.png b/persistence-modules/hibernate5-enterprise/src/test/resources/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd4e978b96d0f59a6e48692fcb68d1c6c565a20 GIT binary patch literal 1117 zcmV-j1fu(iP)%yyh@V&OYl(_AFwE`D&8)` zPnvkdvc#Z>pRh2kBHk{=qaGfCG;?<;rVe;D+%LyZS~!K}c+|op81YK@rzPHU@Th|m z4Dk`HcojTY;+}_-W%HGqKH@C!LiH8Tp>1lC@aTqoy zBU~QK<}hs@q|M8($ee`o<9#`B3-PL4Y7d9kW#<;n>t}6VNpYCswLrJTtEa_lFwgN$52-_vxvvfJs@B6-OYs%-@M_JTx*UfozG6(Bhs)>w z!pG%vU$b%f++EGa<#Tu1FZ^c#{;G|y5=kM3Y#X^mtSrFA_-o-vX7e_$5-udx(>S4U)i|4)(UJ~zR(vwE+6VTAzoo7wIS|c zh*yt`3wK%<+yX~Z9G1z2GQgf3~qx jc9u$WjpqGof00000NkvXXu0mjfJX<<= literal 0 HcmV?d00001 From 0bb56912ff21f25c7386b6b2dc0e9350b2d31ac5 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:20:26 +0530 Subject: [PATCH 034/530] JAVA-4 : added new module hibernate5-jpa --- persistence-modules/hibernate5-jpa/README.md | 16 ++ persistence-modules/hibernate5-jpa/pom.xml | 95 +++++++++ .../com/baeldung/hibernate/HibernateUtil.java | 89 ++++++++ .../UnsupportedTenancyException.java | 8 + .../converters/PersonNameConverter.java | 61 ++++++ .../hibernate/entities/Department.java | 45 ++++ .../hibernate/entities/DeptEmployee.java | 83 ++++++++ .../jpabootstrap/application/Application.java | 34 +++ .../config/HibernatePersistenceUnitInfo.java | 131 ++++++++++++ .../config/JpaEntityManagerFactory.java | 69 ++++++ .../hibernate/jpabootstrap/entities/User.java | 45 ++++ .../service/EmployeeSearchService.java | 15 ++ .../service/EmployeeSearchServiceImpl.java | 77 +++++++ .../hibernate/onetoone/HibernateUtil.java | 61 ++++++ .../baeldung/hibernate/onetoone/Strategy.java | 25 +++ .../onetoone/foreignkeybased/Address.java | 60 ++++++ .../onetoone/foreignkeybased/User.java | 51 +++++ .../onetoone/jointablebased/Employee.java | 53 +++++ .../onetoone/jointablebased/WorkStation.java | 61 ++++++ .../onetoone/sharedkeybased/Address.java | 60 ++++++ .../onetoone/sharedkeybased/User.java | 50 +++++ .../OptimisticLockingCourse.java | 48 +++++ .../OptimisticLockingStudent.java | 70 ++++++ .../hibernate/pessimisticlocking/Address.java | 34 +++ .../pessimisticlocking/Customer.java | 58 +++++ .../pessimisticlocking/Individual.java | 49 +++++ .../PessimisticLockingCourse.java | 47 ++++ .../PessimisticLockingEmployee.java | 27 +++ .../PessimisticLockingStudent.java | 46 ++++ .../com/baeldung/hibernate/pojo/Movie.java | 52 +++++ .../com/baeldung/hibernate/pojo/Person.java | 32 +++ .../baeldung/hibernate/pojo/PersonName.java | 29 +++ .../com/baeldung/hibernate/pojo/Post.java | 59 ++++++ .../com/baeldung/hibernate/pojo/Student.java | 51 +++++ .../hibernate/transaction/PostService.java | 29 +++ .../PersistenceContextDemoApplication.java | 13 ++ .../persistencecontext/entity/User.java | 36 ++++ ...ExtendedPersistenceContextUserService.java | 33 +++ ...ansctionPersistenceContextUserService.java | 32 +++ .../main/resources/META-INF/persistence.xml | 19 ++ .../src/main/resources/init_database.sql | 10 + .../src/main/resources/logback.xml | 13 ++ .../PersonNameConverterUnitTest.java | 200 ++++++++++++++++++ .../EmployeeSearchServiceIntegrationTest.java | 121 +++++++++++ ...ToOneAnnotationFKBasedIntegrationTest.java | 80 +++++++ ...ToOneAnnotationJTBasedIntegrationTest.java | 80 +++++++ ...oOneAnnotationSPKBasedIntegrationTest.java | 79 +++++++ .../OptimisticLockingIntegrationTest.java | 146 +++++++++++++ ...asicPessimisticLockingIntegrationTest.java | 162 ++++++++++++++ .../PessimisticLockScopesIntegrationTest.java | 125 +++++++++++ .../TransactionIntegrationTest.java | 57 +++++ .../PersistenceContextIntegrationTest.java | 90 ++++++++ .../resources/hibernate-namedquery.properties | 9 + .../hibernate-pessimistic-locking.properties | 8 + .../src/test/resources/hibernate.properties | 14 ++ .../src/test/resources/profile.png | Bin 0 -> 1117 bytes 56 files changed, 3147 insertions(+) create mode 100644 persistence-modules/hibernate5-jpa/README.md create mode 100644 persistence-modules/hibernate5-jpa/pom.xml create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java create mode 100644 persistence-modules/hibernate5-jpa/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate5-jpa/src/main/resources/init_database.sql create mode 100644 persistence-modules/hibernate5-jpa/src/main/resources/logback.xml create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java create mode 100644 persistence-modules/hibernate5-jpa/src/test/resources/hibernate-namedquery.properties create mode 100644 persistence-modules/hibernate5-jpa/src/test/resources/hibernate-pessimistic-locking.properties create mode 100644 persistence-modules/hibernate5-jpa/src/test/resources/hibernate.properties create mode 100644 persistence-modules/hibernate5-jpa/src/test/resources/profile.png diff --git a/persistence-modules/hibernate5-jpa/README.md b/persistence-modules/hibernate5-jpa/README.md new file mode 100644 index 0000000000..bffba85d54 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/README.md @@ -0,0 +1,16 @@ +## Hibernate 5 + +This module contains articles about Hibernate 5. + +### Relevant articles: + +- [JPA Attribute Converters](http://www.baeldung.com/jpa-attribute-converters) +- [Pessimistic Locking in JPA](http://www.baeldung.com/jpa-pessimistic-locking) +- [Bootstrapping JPA Programmatically in Java](http://www.baeldung.com/java-bootstrap-jpa) +- [Optimistic Locking in JPA](http://www.baeldung.com/jpa-optimistic-locking) +- [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) +- [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) +- [Enabling Transaction Locks in Spring Data JPA](https://www.baeldung.com/java-jpa-transaction-locks) +- [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception) +- [FetchMode in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-fetchmode) +- [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context) diff --git a/persistence-modules/hibernate5-jpa/pom.xml b/persistence-modules/hibernate5-jpa/pom.xml new file mode 100644 index 0000000000..b181fff36b --- /dev/null +++ b/persistence-modules/hibernate5-jpa/pom.xml @@ -0,0 +1,95 @@ + + + 4.0.0 + hibernate5-jpa + 0.0.1-SNAPSHOT + hibernate5-jpa + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-thymeleaf + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + com.zaxxer + HikariCP + + + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + com.h2database + h2 + ${h2.version} + + + org.hibernate + hibernate-spatial + ${hibernate.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + ch.vorburger.mariaDB4j + mariaDB4j + ${mariaDB4j.version} + + + org.hibernate + hibernate-testing + ${hibernate.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${openjdk-jmh.version} + + + + + 5.3.7.Final + 6.0.6 + 2.2.3 + 3.8.0 + 1.21 + 2.1.7.RELEASE + + + diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java new file mode 100644 index 0000000000..cf59fe4855 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -0,0 +1,89 @@ +package com.baeldung.hibernate; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.entities.DeptEmployee; +import com.baeldung.hibernate.optimisticlocking.OptimisticLockingCourse; +import com.baeldung.hibernate.optimisticlocking.OptimisticLockingStudent; +import com.baeldung.hibernate.pessimisticlocking.Individual; +import com.baeldung.hibernate.pessimisticlocking.PessimisticLockingCourse; +import com.baeldung.hibernate.pessimisticlocking.PessimisticLockingEmployee; +import com.baeldung.hibernate.pessimisticlocking.PessimisticLockingStudent; +import com.baeldung.hibernate.pojo.Person; +import com.baeldung.hibernate.pojo.Post; +import com.baeldung.hibernate.pojo.Student; + +public class HibernateUtil { + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + ServiceRegistry serviceRegistry = configureServiceRegistry(); + return makeSessionFactory(serviceRegistry); + } + + public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException { + ServiceRegistry serviceRegistry = configureServiceRegistry(properties); + return makeSessionFactory(serviceRegistry); + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addPackage("com.baeldung.hibernate.pojo"); + metadataSources.addAnnotatedClass(Person.class); + metadataSources.addAnnotatedClass(Student.class); + metadataSources.addAnnotatedClass(Individual.class); + metadataSources.addAnnotatedClass(PessimisticLockingEmployee.class); + metadataSources.addAnnotatedClass(PessimisticLockingStudent.class); + metadataSources.addAnnotatedClass(PessimisticLockingCourse.class); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.pessimisticlocking.Customer.class); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.pessimisticlocking.Address.class); + metadataSources.addAnnotatedClass(DeptEmployee.class); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); + metadataSources.addAnnotatedClass(OptimisticLockingCourse.class); + metadataSources.addAnnotatedClass(OptimisticLockingStudent.class); + metadataSources.addAnnotatedClass(Post.class); + + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + return configureServiceRegistry(getProperties()); + } + + private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException { + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + public static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java new file mode 100644 index 0000000000..99d9505ea3 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java @@ -0,0 +1,8 @@ +package com.baeldung.hibernate; + +public class UnsupportedTenancyException extends Exception { + public UnsupportedTenancyException (String message) { + super(message); + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java new file mode 100644 index 0000000000..506e674984 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.converters; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +import com.baeldung.hibernate.pojo.PersonName; + +@Converter +public class PersonNameConverter implements AttributeConverter { + + private static final String SEPARATOR = ", "; + + @Override + public String convertToDatabaseColumn(PersonName personName) { + if (personName == null) { + return null; + } + + StringBuilder sb = new StringBuilder(); + if (personName.getSurname() != null && !personName.getSurname() + .isEmpty()) { + sb.append(personName.getSurname()); + sb.append(SEPARATOR); + } + + if (personName.getName() != null && !personName.getName() + .isEmpty()) { + sb.append(personName.getName()); + } + + return sb.toString(); + } + + @Override + public PersonName convertToEntityAttribute(String dbPersonName) { + if (dbPersonName == null || dbPersonName.isEmpty()) { + return null; + } + + String[] pieces = dbPersonName.split(SEPARATOR); + + if (pieces == null || pieces.length == 0) { + return null; + } + + PersonName personName = new PersonName(); + String firstPiece = !pieces[0].isEmpty() ? pieces[0] : null; + if (dbPersonName.contains(SEPARATOR)) { + personName.setSurname(firstPiece); + + if (pieces.length >= 2 && pieces[1] != null && !pieces[1].isEmpty()) { + personName.setName(pieces[1]); + } + } else { + personName.setName(firstPiece); + } + + return personName; + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java new file mode 100644 index 0000000000..ff94f4f849 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java @@ -0,0 +1,45 @@ +package com.baeldung.hibernate.entities; + +import java.util.List; + +import javax.persistence.*; + +@Entity +public class Department { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String name; + + @OneToMany(mappedBy="department") + private List employees; + + public Department(String name) { + this.name = name; + } + + 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 getEmployees() { + return employees; + } + + public void setEmployees(List employees) { + this.employees = employees; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java new file mode 100644 index 0000000000..6510e70650 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java @@ -0,0 +1,83 @@ +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; + +@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_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), + @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_UpdateEmployeeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION(:employeeNumber, :newDesignation)", resultClass = DeptEmployee.class) }) +@Entity +public class DeptEmployee { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String employeeNumber; + + private String title; + + private String name; + + @ManyToOne + private Department department; + + public DeptEmployee(String name, String employeeNumber, Department department) { + this.name = name; + this.employeeNumber = employeeNumber; + this.department = department; + } + + public DeptEmployee(String name, String employeeNumber, String title, Department department) { + super(); + this.name = name; + this.employeeNumber = employeeNumber; + this.title = title; + this.department = department; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java new file mode 100644 index 0000000000..f7b8e6bf6d --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java @@ -0,0 +1,34 @@ +package com.baeldung.hibernate.jpabootstrap.application; + +import com.baeldung.hibernate.jpabootstrap.config.JpaEntityManagerFactory; +import com.baeldung.hibernate.jpabootstrap.entities.User; +import javax.persistence.EntityManager; + +public class Application { + + public static void main(String[] args) { + EntityManager entityManager = getJpaEntityManager(); + User user = entityManager.find(User.class, 1); + System.out.println(user); + entityManager.getTransaction().begin(); + user.setName("John"); + user.setEmail("john@domain.com"); + entityManager.merge(user); + entityManager.getTransaction().commit(); + entityManager.getTransaction().begin(); + entityManager.persist(new User("Monica", "monica@domain.com")); + entityManager.getTransaction().commit(); + + // additional CRUD operations + + } + + private static class EntityManagerHolder { + private static final EntityManager ENTITY_MANAGER = new JpaEntityManagerFactory( + new Class[]{User.class}).getEntityManager(); + } + + public static EntityManager getJpaEntityManager() { + return EntityManagerHolder.ENTITY_MANAGER; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java new file mode 100644 index 0000000000..3852b44b64 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java @@ -0,0 +1,131 @@ +package com.baeldung.hibernate.jpabootstrap.config; + +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Properties; +import javax.sql.DataSource; +import javax.persistence.SharedCacheMode; +import javax.persistence.ValidationMode; +import javax.persistence.spi.ClassTransformer; +import javax.persistence.spi.PersistenceUnitInfo; +import javax.persistence.spi.PersistenceUnitTransactionType; +import org.hibernate.jpa.HibernatePersistenceProvider; + +public class HibernatePersistenceUnitInfo implements PersistenceUnitInfo { + + public static final String JPA_VERSION = "2.1"; + private final String persistenceUnitName; + private PersistenceUnitTransactionType transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL; + private final List managedClassNames; + private final List mappingFileNames = new ArrayList<>(); + private final Properties properties; + private DataSource jtaDataSource; + private DataSource nonjtaDataSource; + private final List transformers = new ArrayList<>(); + + public HibernatePersistenceUnitInfo(String persistenceUnitName, List managedClassNames, Properties properties) { + this.persistenceUnitName = persistenceUnitName; + this.managedClassNames = managedClassNames; + this.properties = properties; + } + + @Override + public String getPersistenceUnitName() { + return persistenceUnitName; + } + + @Override + public String getPersistenceProviderClassName() { + return HibernatePersistenceProvider.class.getName(); + } + + @Override + public PersistenceUnitTransactionType getTransactionType() { + return transactionType; + } + + public HibernatePersistenceUnitInfo setJtaDataSource(DataSource jtaDataSource) { + this.jtaDataSource = jtaDataSource; + this.nonjtaDataSource = null; + transactionType = PersistenceUnitTransactionType.JTA; + return this; + } + + @Override + public DataSource getJtaDataSource() { + return jtaDataSource; + } + + public HibernatePersistenceUnitInfo setNonJtaDataSource(DataSource nonJtaDataSource) { + this.nonjtaDataSource = nonJtaDataSource; + this.jtaDataSource = null; + transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL; + return this; + } + + @Override + public DataSource getNonJtaDataSource() { + return nonjtaDataSource; + } + + @Override + public List getMappingFileNames() { + return mappingFileNames; + } + + @Override + public List getJarFileUrls() { + return Collections.emptyList(); + } + + @Override + public URL getPersistenceUnitRootUrl() { + return null; + } + + @Override + public List getManagedClassNames() { + return managedClassNames; + } + + @Override + public boolean excludeUnlistedClasses() { + return false; + } + + @Override + public SharedCacheMode getSharedCacheMode() { + return SharedCacheMode.UNSPECIFIED; + } + + @Override + public ValidationMode getValidationMode() { + return ValidationMode.AUTO; + } + + public Properties getProperties() { + return properties; + } + + @Override + public String getPersistenceXMLSchemaVersion() { + return JPA_VERSION; + } + + @Override + public ClassLoader getClassLoader() { + return Thread.currentThread().getContextClassLoader(); + } + + @Override + public void addTransformer(ClassTransformer transformer) { + transformers.add(transformer); + } + + @Override + public ClassLoader getNewTempClassLoader() { + return null; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java new file mode 100644 index 0000000000..bc1932af6f --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java @@ -0,0 +1,69 @@ +package com.baeldung.hibernate.jpabootstrap.config; + +import com.mysql.cj.jdbc.MysqlDataSource; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; +import javax.persistence.EntityManager; +import javax.sql.DataSource; +import javax.persistence.EntityManagerFactory; +import javax.persistence.spi.PersistenceUnitInfo; +import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; +import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor; + +public class JpaEntityManagerFactory { + + private final String DB_URL = "jdbc:mysql://databaseurl"; + private final String DB_USER_NAME = "username"; + private final String DB_PASSWORD = "password"; + private final Class[] entityClasses; + + public JpaEntityManagerFactory(Class[] entityClasses) { + this.entityClasses = entityClasses; + } + + public EntityManager getEntityManager() { + return getEntityManagerFactory().createEntityManager(); + } + + protected EntityManagerFactory getEntityManagerFactory() { + PersistenceUnitInfo persistenceUnitInfo = getPersistenceUnitInfo(getClass().getSimpleName()); + Map configuration = new HashMap<>(); + return new EntityManagerFactoryBuilderImpl(new PersistenceUnitInfoDescriptor(persistenceUnitInfo), configuration) + .build(); + } + + protected HibernatePersistenceUnitInfo getPersistenceUnitInfo(String name) { + return new HibernatePersistenceUnitInfo(name, getEntityClassNames(), getProperties()); + } + + protected List getEntityClassNames() { + return Arrays.asList(getEntities()) + .stream() + .map(Class::getName) + .collect(Collectors.toList()); + } + + protected Properties getProperties() { + Properties properties = new Properties(); + properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); + properties.put("hibernate.id.new_generator_mappings", false); + properties.put("hibernate.connection.datasource", getMysqlDataSource()); + return properties; + } + + protected Class[] getEntities() { + return entityClasses; + } + + protected DataSource getMysqlDataSource() { + MysqlDataSource mysqlDataSource = new MysqlDataSource(); + mysqlDataSource.setURL(DB_URL); + mysqlDataSource.setUser(DB_USER_NAME); + mysqlDataSource.setPassword(DB_PASSWORD); + return mysqlDataSource; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java new file mode 100644 index 0000000000..86ca1dfa19 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java @@ -0,0 +1,45 @@ +package com.baeldung.hibernate.jpabootstrap.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + private String name; + private String email; + + public User(){} + + public User(String name, String email) { + this.name = name; + this.email = email; + } + + public void setName(String name) { + this.name = name; + } + + public void setEmail(String email) { + this.email = email; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java new file mode 100644 index 0000000000..b7d1a537f0 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java @@ -0,0 +1,15 @@ +package com.baeldung.hibernate.jpacriteriabuilder.service; + +import java.util.List; + +import com.baeldung.hibernate.entities.DeptEmployee; + +public interface EmployeeSearchService { + + List filterbyTitleUsingCriteriaBuilder(List titles); + + List filterbyTitleUsingExpression(List titles); + + List searchByDepartmentQuery(String query); + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java new file mode 100644 index 0000000000..e79168a451 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java @@ -0,0 +1,77 @@ +package com.baeldung.hibernate.jpacriteriabuilder.service; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaBuilder.In; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.Subquery; + +import com.baeldung.hibernate.entities.Department; +import com.baeldung.hibernate.entities.DeptEmployee; + +public class EmployeeSearchServiceImpl implements EmployeeSearchService { + + private EntityManager entityManager; + private CriteriaBuilder criteriaBuilder; + + public EmployeeSearchServiceImpl(EntityManager entityManager) { + this.entityManager = entityManager; + this.criteriaBuilder = entityManager.getCriteriaBuilder(); + + } + + @Override + public List filterbyTitleUsingCriteriaBuilder(List titles) { + CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class); + Root root = criteriaQuery.from(DeptEmployee.class); + In inClause = criteriaBuilder.in(root.get("title")); + for (String title : titles) { + inClause.value(title); + } + criteriaQuery.select(root) + .where(inClause); + TypedQuery query = entityManager.createQuery(criteriaQuery); + return query.getResultList(); + } + + @Override + public List filterbyTitleUsingExpression(List titles) { + CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class); + Root root = criteriaQuery.from(DeptEmployee.class); + criteriaQuery.select(root) + .where(root.get("title") + .in(titles)); + TypedQuery query = entityManager.createQuery(criteriaQuery); + return query.getResultList(); + } + + @Override + public List searchByDepartmentQuery(String searchKey) { + CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class); + Root emp = criteriaQuery.from(DeptEmployee.class); + + Subquery subquery = criteriaQuery.subquery(Department.class); + Root dept = subquery.from(Department.class); + subquery.select(dept) + .distinct(true) + .where(criteriaBuilder.like(dept.get("name"), new StringBuffer("%").append(searchKey) + .append("%") + .toString())); + + criteriaQuery.select(emp) + .where(criteriaBuilder.in(emp.get("department")) + .value(subquery)); + + TypedQuery query = entityManager.createQuery(criteriaQuery); + return query.getResultList(); + } + + private CriteriaQuery createCriteriaQuery(Class klass) { + return criteriaBuilder.createQuery(klass); + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java new file mode 100644 index 0000000000..18fa2a41db --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.onetoone; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + private HibernateUtil() { + } + + public static SessionFactory getSessionFactory(Strategy strategy) { + return buildSessionFactory(strategy); + } + + private static SessionFactory buildSessionFactory(Strategy strategy) { + try { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + for (Class entityClass : strategy.getEntityClasses()) { + metadataSources.addAnnotatedClass(entityClass); + } + + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + } catch (IOException ex) { + throw new ExceptionInInitializerError(ex); + } + } + + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource("hibernate.properties"); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java new file mode 100644 index 0000000000..3180566ca5 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.onetoone; + + +import java.util.Arrays; +import java.util.List; + +public enum Strategy { + //See that the classes belongs to different packages + FOREIGN_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.foreignkeybased.User.class, + com.baeldung.hibernate.onetoone.foreignkeybased.Address.class)), + SHARED_PRIMARY_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.sharedkeybased.User.class, + com.baeldung.hibernate.onetoone.sharedkeybased.Address.class)), + JOIN_TABLE_BASED(Arrays.asList(com.baeldung.hibernate.onetoone.jointablebased.Employee.class, + com.baeldung.hibernate.onetoone.jointablebased.WorkStation.class)); + + private List> entityClasses; + + Strategy(List> entityClasses) { + this.entityClasses = entityClasses; + } + + public List> getEntityClasses() { + return entityClasses; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java new file mode 100644 index 0000000000..e05eb46030 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java @@ -0,0 +1,60 @@ +package com.baeldung.hibernate.onetoone.foreignkeybased; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "address") +public class Address { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "street") + private String street; + + @Column(name = "city") + private String city; + + @OneToOne(mappedBy = "address") + private User user; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java new file mode 100644 index 0000000000..dda972f29c --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java @@ -0,0 +1,51 @@ +package com.baeldung.hibernate.onetoone.foreignkeybased; + +import javax.persistence.CascadeType; +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.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "username") + private String userName; + + @OneToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "address_id", referencedColumnName = "id") + private Address address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java new file mode 100644 index 0000000000..a0bc101b9f --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java @@ -0,0 +1,53 @@ +package com.baeldung.hibernate.onetoone.jointablebased; + +import javax.persistence.CascadeType; +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.JoinTable; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "employee") +public class Employee { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "ename") + private String name; + + @OneToOne(cascade = CascadeType.ALL) + @JoinTable(name = "emp_workstation", joinColumns = {@JoinColumn(name = "employee_id", referencedColumnName = "id")}, + inverseJoinColumns = {@JoinColumn(name = "workstation_id", referencedColumnName = "id")}) + private WorkStation workStation; + + 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 WorkStation getWorkStation() { + return workStation; + } + + public void setWorkStation(WorkStation workStation) { + this.workStation = workStation; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java new file mode 100644 index 0000000000..f530611f6e --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.onetoone.jointablebased; + + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "workstation") +public class WorkStation { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "workstation_number") + private Integer workstationNumber; + + @Column(name = "floor") + private String floor; + + @OneToOne(mappedBy = "workStation") + private Employee employee; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getWorkstationNumber() { + return workstationNumber; + } + + public void setWorkstationNumber(Integer workstationNumber) { + this.workstationNumber = workstationNumber; + } + + public String getFloor() { + return floor; + } + + public void setFloor(String floor) { + this.floor = floor; + } + + public Employee getEmployee() { + return employee; + } + + public void setEmployee(Employee employee) { + this.employee = employee; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java new file mode 100644 index 0000000000..927516f6bb --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java @@ -0,0 +1,60 @@ +package com.baeldung.hibernate.onetoone.sharedkeybased; + + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.MapsId; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "address") +public class Address { + + @Id + @Column(name = "id") + private Long id; + + @Column(name = "street") + private String street; + + @Column(name = "city") + private String city; + + @OneToOne + @MapsId + private User user; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java new file mode 100644 index 0000000000..fa00db1271 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java @@ -0,0 +1,50 @@ +package com.baeldung.hibernate.onetoone.sharedkeybased; + + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "username") + private String userName; + + @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) + private Address address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java new file mode 100644 index 0000000000..1af3e3e21b --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java @@ -0,0 +1,48 @@ +package com.baeldung.hibernate.optimisticlocking; + +import javax.persistence.*; + +@Entity +public class OptimisticLockingCourse { + + @Id + private Long id; + + private String name; + + @ManyToOne + @JoinTable(name = "optimistic_student_course") + private OptimisticLockingStudent student; + + public OptimisticLockingCourse(Long id, String name) { + this.id = id; + this.name = name; + } + + public OptimisticLockingCourse() { + } + + 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 OptimisticLockingStudent getStudent() { + return student; + } + + public void setStudent(OptimisticLockingStudent student) { + this.student = student; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java new file mode 100644 index 0000000000..b79212ae8d --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java @@ -0,0 +1,70 @@ +package com.baeldung.hibernate.optimisticlocking; + +import javax.persistence.*; +import java.util.List; + +@Entity +public class OptimisticLockingStudent { + + @Id + private Long id; + + private String name; + + private String lastName; + @Version + private Integer version; + + @OneToMany(mappedBy = "student") + private List courses; + + public OptimisticLockingStudent(Long id, String name, String lastName, List courses) { + this.id = id; + this.name = name; + this.lastName = lastName; + this.courses = courses; + } + + public OptimisticLockingStudent() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getCourses() { + return courses; + } + + public void setCourses(List courses) { + this.courses = courses; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java new file mode 100644 index 0000000000..c889cb6127 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java @@ -0,0 +1,34 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import javax.persistence.Embeddable; + +@Embeddable +public class Address { + + private String country; + private String city; + + public Address(String country, String city) { + this.country = country; + this.city = city; + } + + public Address() { + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java new file mode 100644 index 0000000000..cb73cbc958 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import javax.persistence.*; +import java.util.List; + +@Entity +public class Customer { + + @Id + private Long customerId; + private String name; + private String lastName; + @ElementCollection + @CollectionTable(name = "customer_address") + private List
addressList; + + public Customer() { + } + + public Customer(Long customerId, String name, String lastName, List
addressList) { + this.customerId = customerId; + this.name = name; + this.lastName = lastName; + this.addressList = addressList; + } + + public Long getCustomerId() { + return customerId; + } + + public void setCustomerId(Long customerId) { + this.customerId = customerId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List
getAddressList() { + return addressList; + } + + public void setAddressList(List
addressList) { + this.addressList = addressList; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java new file mode 100644 index 0000000000..e491c09eb5 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java @@ -0,0 +1,49 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +public class Individual { + + @Id + private Long id; + private String name; + private String lastName; + + public Individual(Long id, String name, String lastName) { + this.id = id; + this.name = name; + this.lastName = lastName; + } + + public Individual() { + } + + 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 String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java new file mode 100644 index 0000000000..aea7d5fc87 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java @@ -0,0 +1,47 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import javax.persistence.*; + +@Entity +public class PessimisticLockingCourse { + + @Id + private Long courseId; + private String name; + @ManyToOne + @JoinTable(name = "student_course") + private PessimisticLockingStudent student; + + public PessimisticLockingCourse(Long courseId, String name, PessimisticLockingStudent student) { + this.courseId = courseId; + this.name = name; + this.student = student; + } + + public PessimisticLockingCourse() { + } + + public Long getCourseId() { + return courseId; + } + + public void setCourseId(Long courseId) { + this.courseId = courseId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public PessimisticLockingStudent getStudent() { + return student; + } + + public void setStudent(PessimisticLockingStudent students) { + this.student = students; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java new file mode 100644 index 0000000000..a1328cbdad --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import javax.persistence.Entity; +import java.math.BigDecimal; + +@Entity +public class PessimisticLockingEmployee extends Individual { + + private BigDecimal salary; + + public PessimisticLockingEmployee(Long id, String name, String lastName, BigDecimal salary) { + super(id, name, lastName); + this.salary = salary; + } + + public PessimisticLockingEmployee() { + super(); + } + + public BigDecimal getSalary() { + return salary; + } + + public void setSalary(BigDecimal average) { + this.salary = average; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java new file mode 100644 index 0000000000..e6c5f476b4 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java @@ -0,0 +1,46 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import javax.persistence.*; +import java.util.List; + +@Entity +public class PessimisticLockingStudent { + + @Id + private Long id; + private String name; + @OneToMany(mappedBy = "student") + private List courses; + + public PessimisticLockingStudent(Long id, String name) { + this.id = id; + this.name = name; + } + + public PessimisticLockingStudent() { + } + + 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 getCourses() { + return courses; + } + + public void setCourses(List courses) { + this.courses = courses; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java new file mode 100644 index 0000000000..5fae7f6a97 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java @@ -0,0 +1,52 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "MOVIE") +public class Movie { + + @Id + private Long id; + + private String movieName; + + private Integer releaseYear; + + private String language; + + public String getMovieName() { + return movieName; + } + + public void setMovieName(String movieName) { + this.movieName = movieName; + } + + public Integer getReleaseYear() { + return releaseYear; + } + + public void setReleaseYear(Integer releaseYear) { + this.releaseYear = releaseYear; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java new file mode 100644 index 0000000000..390a5954ed --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java @@ -0,0 +1,32 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import com.baeldung.hibernate.converters.PersonNameConverter; + +@Entity(name = "PersonTable") +public class Person { + + @Id + @GeneratedValue + private Long id; + + @Convert(converter = PersonNameConverter.class) + private PersonName personName; + + public PersonName getPersonName() { + return personName; + } + + public void setPersonName(PersonName personName) { + this.personName = personName; + } + + public Long getId() { + return id; + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java new file mode 100644 index 0000000000..335fe73f75 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java @@ -0,0 +1,29 @@ +package com.baeldung.hibernate.pojo; + +import java.io.Serializable; + +public class PersonName implements Serializable { + + private static final long serialVersionUID = 7883094644631050150L; + + private String name; + + private String surname; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java new file mode 100644 index 0000000000..25e51e35d0 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java @@ -0,0 +1,59 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "posts") +public class Post { + + @Id + @GeneratedValue + private int id; + + private String title; + + private String body; + + public Post() { } + + public Post(String title, String body) { + this.title = title; + this.body = body; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + @Override + public String toString() { + return "Post{" + + "id=" + id + + ", title='" + title + '\'' + + ", body='" + body + '\'' + + '}'; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java new file mode 100644 index 0000000000..9b26c117eb --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java @@ -0,0 +1,51 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long studentId; + + private String name; + + private int age; + + public Student() { + } + + public Student(String name, int age) { + this.name = name; + this.age = age; + } + + public long getStudentId() { + return studentId; + } + + public void setStudentId(long studentId) { + this.studentId = studentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java new file mode 100644 index 0000000000..5a4eb20079 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java @@ -0,0 +1,29 @@ +package com.baeldung.hibernate.transaction; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +public class PostService { + + + private Session session; + + public PostService(Session session) { + this.session = session; + } + + + public void updatePost(String title, String body, int id) { + Transaction txn = session.beginTransaction(); + Query updateQuery = session.createQuery("UPDATE Post p SET p.title = ?1, p.body = ?2 WHERE p.id = ?3"); + updateQuery.setParameter(1, title); + updateQuery.setParameter(2, body); + updateQuery.setParameter(3, id); + updateQuery.executeUpdate(); + txn.commit(); + } + + + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java new file mode 100644 index 0000000000..17fa582e10 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.persistencecontext; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages="com.baeldung.persistencecontext") +public class PersistenceContextDemoApplication { + public static void main(String[] args) { + SpringApplication.run(PersistenceContextDemoApplication.class, args); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java new file mode 100644 index 0000000000..7252ac46f5 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java @@ -0,0 +1,36 @@ +package com.baeldung.persistencecontext.entity; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class User { + + @Id + private Long id; + private String name; + private String role; + + public User() { + + } + + public User(Long id, String name, String role) { + this.id = id; + this.name = name; + this.role = role; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getRole() { + return role; + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java new file mode 100644 index 0000000000..ef25aac69f --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java @@ -0,0 +1,33 @@ +package com.baeldung.persistencecontext.service; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceContextType; +import javax.transaction.Transactional; + +import org.springframework.stereotype.Component; + +import com.baeldung.persistencecontext.entity.User; + +@Component +public class ExtendedPersistenceContextUserService { + + @PersistenceContext(type = PersistenceContextType.EXTENDED) + private EntityManager entityManager; + + @Transactional + public User insertWithTransaction(User user) { + entityManager.persist(user); + return user; + } + + public User insertWithoutTransaction(User user) { + entityManager.persist(user); + return user; + } + + public User find(long id) { + User user = entityManager.find(User.class, id); + return user; + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java new file mode 100644 index 0000000000..481defcf08 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java @@ -0,0 +1,32 @@ +package com.baeldung.persistencecontext.service; + + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +import org.springframework.stereotype.Component; + +import com.baeldung.persistencecontext.entity.User; + +@Component +public class TransctionPersistenceContextUserService { + + @PersistenceContext + private EntityManager entityManager; + + @Transactional + public User insertWithTransaction(User user) { + entityManager.persist(user); + return user; + } + + public User insertWithoutTransaction(User user) { + entityManager.persist(user); + return user; + } + + public User find(long id) { + return entityManager.find(User.class, id); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate5-jpa/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..4dfade1af3 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,19 @@ + + + + Hibernate EntityManager Demo + com.baeldung.hibernate.pojo.Movie + true + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/resources/init_database.sql b/persistence-modules/hibernate5-jpa/src/main/resources/init_database.sql new file mode 100644 index 0000000000..b2848aa256 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/resources/init_database.sql @@ -0,0 +1,10 @@ +CREATE ALIAS UPDATE_EMPLOYEE_DESIGNATION AS $$ +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +@CODE +void updateEmployeeDesignation(final Connection conn, final String employeeNumber, final String title) throws SQLException { + CallableStatement updateStatement = conn.prepareCall("update deptemployee set title = '" + title + "' where employeeNumber = '" + employeeNumber + "'"); + updateStatement.execute(); +} +$$; \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/main/resources/logback.xml b/persistence-modules/hibernate5-jpa/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java new file mode 100644 index 0000000000..3cd4761a7b --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java @@ -0,0 +1,200 @@ +package com.baeldung.hibernate.converter; + +import java.io.IOException; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.pojo.Person; +import com.baeldung.hibernate.pojo.PersonName; + +import static org.junit.Assert.assertEquals; + +public class PersonNameConverterUnitTest { + + private Session session; + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory() + .openSession(); + transaction = session.beginTransaction(); + + session.createNativeQuery("delete from personTable") + .executeUpdate(); + + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenPersonName_WhenSaving_ThenNameAndSurnameConcat() { + final String name = "name"; + final String surname = "surname"; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals(surname + ", " + name, dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName() + .getName(), name); + assertEquals(dbPerson.getPersonName() + .getSurname(), surname); + } + + @Test + public void givenPersonNameNull_WhenSaving_ThenNullStored() { + final String name = null; + final String surname = null; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName(), null); + } + + @Test + public void givenPersonNameWithoutName_WhenSaving_ThenNotNameStored() { + final String name = null; + final String surname = "surname"; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("surname, ", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName() + .getName(), name); + assertEquals(dbPerson.getPersonName() + .getSurname(), surname); + } + + @Test + public void givenPersonNameWithoutSurName_WhenSaving_ThenNotSurNameStored() { + final String name = "name"; + final String surname = null; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("name", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName() + .getName(), name); + assertEquals(dbPerson.getPersonName() + .getSurname(), surname); + } + + @Test + public void givenPersonNameEmptyFields_WhenSaving_ThenFielsNotStored() { + final String name = ""; + final String surname = ""; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName(), null); + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java new file mode 100644 index 0000000000..2b12734a10 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java @@ -0,0 +1,121 @@ +package com.baeldung.hibernate.jpacriteriabuilder; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; + +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.entities.Department; +import com.baeldung.hibernate.entities.DeptEmployee; +import com.baeldung.hibernate.jpacriteriabuilder.service.EmployeeSearchService; +import com.baeldung.hibernate.jpacriteriabuilder.service.EmployeeSearchServiceImpl; + +public class EmployeeSearchServiceIntegrationTest { + + private EntityManager entityManager; + private EmployeeSearchService searchService; + private Session session; + + @Before + public final void setup() throws HibernateException, IOException { + session = HibernateUtil.getSessionFactory() + .openSession(); + entityManager = session.getEntityManagerFactory() + .createEntityManager(); + searchService = new EmployeeSearchServiceImpl(entityManager); + + entityManager.getTransaction() + .begin(); + Department department = new Department("Pre Sales"); + DeptEmployee employee = new DeptEmployee("John Smith", "001", "Manager", department); + entityManager.persist(department); + entityManager.persist(employee); + employee = new DeptEmployee("Ian Evans", "002", "Associate", department); + entityManager.persist(department); + entityManager.persist(employee); + department = new Department("Copporate Sales"); + employee = new DeptEmployee("Robert Carter", "003", "Manager", department); + entityManager.persist(department); + entityManager.persist(employee); + employee = new DeptEmployee("John Carter", "004", "Senior Manager", department); + entityManager.persist(employee); + employee = new DeptEmployee("David Guetta", "009", "Associate", department); + entityManager.persist(department); + entityManager.persist(employee); + department = new Department("Post Sales"); + employee = new DeptEmployee("Robert Jonas", "005", "Director", department); + entityManager.persist(department); + entityManager.persist(employee); + employee = new DeptEmployee("John Ferros", "006", "Junior Associate", department); + entityManager.persist(department); + entityManager.persist(employee); + department = new Department("Client Support"); + employee = new DeptEmployee("Robert Mcclements", "007", "Director", department); + entityManager.persist(department); + entityManager.persist(employee); + employee = new DeptEmployee("Peter Parker", "008", "Manager", department); + entityManager.persist(department); + entityManager.persist(employee); + + } + + @After + public final void teardown() { + entityManager.getTransaction() + .rollback(); + entityManager.close(); + } + + @Test + public final void givenCriteriaQuery_whenSearchedUsingCriteriaBuilderWithListofAuthors_thenResultIsFilteredByAuthorNames() { + List titles = new ArrayList() { + { + add("Manager"); + add("Senior Manager"); + add("Director"); + } + }; + List result = searchService.filterbyTitleUsingCriteriaBuilder(titles); + assertEquals("Number of Employees does not match with expected.", 6, result.size()); + assertThat(result.stream() + .map(DeptEmployee::getTitle) + .distinct() + .collect(Collectors.toList()), containsInAnyOrder(titles.toArray())); + } + + @Test + public final void givenCriteriaQuery_whenSearchedUsingExpressionWithListofAuthors_thenResultIsFilteredByAuthorNames() { + List titles = new ArrayList() { + { + add("Manager"); + add("Senior Manager"); + add("Director"); + } + }; + List result = searchService.filterbyTitleUsingExpression(titles); + assertEquals("Number of Employees does not match with expected.", 6, result.size()); + assertThat(result.stream() + .map(DeptEmployee::getTitle) + .distinct() + .collect(Collectors.toList()), containsInAnyOrder(titles.toArray())); + } + + @Test + public final void givenCriteriaQuery_whenSearchedDepartmentLike_thenResultIsFilteredByDepartment() { + List result = searchService.searchByDepartmentQuery("Sales"); + assertEquals("Number of Employees does not match with expected.", 7, result.size()); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java new file mode 100644 index 0000000000..475c93f6ff --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.onetoone; + +import com.baeldung.hibernate.onetoone.foreignkeybased.Address; +import com.baeldung.hibernate.onetoone.foreignkeybased.User; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class HibernateOneToOneAnnotationFKBasedIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + sessionFactory = HibernateUtil.getSessionFactory(Strategy.FOREIGN_KEY); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenData_whenInsert_thenCreates1to1relationship() { + User user = new User(); + user.setUserName("alice@baeldung.com"); + + Address address = new Address(); + address.setStreet("FK Street"); + address.setCity("FK City"); + + address.setUser(user); + user.setAddress(address); + + //Address entry will automatically be created by hibernate, since cascade type is specified as ALL + session.persist(user); + session.getTransaction().commit(); + + assert1to1InsertedData(); + } + + private void assert1to1InsertedData() { + @SuppressWarnings("unchecked") + List userList = session.createQuery("FROM User").list(); + + assertNotNull(userList); + assertEquals(1, userList.size()); + + User user = userList.get(0); + assertEquals("alice@baeldung.com", user.getUserName()); + + Address address = user.getAddress(); + assertNotNull(address); + assertEquals("FK Street", address.getStreet()); + assertEquals("FK City", address.getCity()); + + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java new file mode 100644 index 0000000000..df4cd4d137 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.onetoone; + +import com.baeldung.hibernate.onetoone.jointablebased.Employee; +import com.baeldung.hibernate.onetoone.jointablebased.WorkStation; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class HibernateOneToOneAnnotationJTBasedIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + sessionFactory = HibernateUtil.getSessionFactory(Strategy.JOIN_TABLE_BASED); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenData_whenInsert_thenCreates1to1relationship() { + Employee employee = new Employee(); + employee.setName("bob@baeldung.com"); + + WorkStation workStation = new WorkStation(); + workStation.setWorkstationNumber(626); + workStation.setFloor("Sixth Floor"); + + + employee.setWorkStation(workStation); + workStation.setEmployee(employee); + + session.persist(employee); + session.getTransaction().commit(); + + assert1to1InsertedData(); + } + + private void assert1to1InsertedData() { + @SuppressWarnings("unchecked") + List employeeList = session.createQuery("FROM Employee").list(); + assertNotNull(employeeList); + assertEquals(1, employeeList.size()); + + Employee employee = employeeList.get(0); + assertEquals("bob@baeldung.com", employee.getName()); + + WorkStation workStation = employee.getWorkStation(); + + assertNotNull(workStation); + assertEquals((long) 626, (long) workStation.getWorkstationNumber()); + assertEquals("Sixth Floor", workStation.getFloor()); + + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java new file mode 100644 index 0000000000..7931a8e3fe --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java @@ -0,0 +1,79 @@ +package com.baeldung.hibernate.onetoone; + +import com.baeldung.hibernate.onetoone.sharedkeybased.Address; +import com.baeldung.hibernate.onetoone.sharedkeybased.User; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class HibernateOneToOneAnnotationSPKBasedIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + sessionFactory = HibernateUtil.getSessionFactory(Strategy.SHARED_PRIMARY_KEY); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenData_whenInsert_thenCreates1to1relationship() { + User user = new User(); + user.setUserName("alice@baeldung.com"); + + Address address = new Address(); + address.setStreet("SPK Street"); + address.setCity("SPK City"); + + address.setUser(user); + user.setAddress(address); + + //Address entry will automatically be created by hibernate, since cascade type is specified as ALL + session.persist(user); + session.getTransaction().commit(); + + assert1to1InsertedData(); + } + + + private void assert1to1InsertedData() { + @SuppressWarnings("unchecked") + List userList = session.createQuery("FROM User").list(); + assertNotNull(userList); + assertEquals(1, userList.size()); + + User user = userList.get(0); + assertEquals("alice@baeldung.com", user.getUserName()); + + Address address = user.getAddress(); + assertNotNull(address); + assertEquals("SPK Street", address.getStreet()); + assertEquals("SPK City", address.getCity()); + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java new file mode 100644 index 0000000000..37c490f297 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java @@ -0,0 +1,146 @@ +package com.baeldung.hibernate.optimisticlocking; + +import java.io.IOException; +import java.util.Arrays; + +import javax.persistence.EntityManager; +import javax.persistence.LockModeType; +import javax.persistence.OptimisticLockException; + +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; + +public class OptimisticLockingIntegrationTest { + + private static SessionFactory sessionFactory; + + @Before + public void setUp() throws IOException { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + OptimisticLockingCourse course = new OptimisticLockingCourse(1L, "MATH"); + OptimisticLockingStudent student = new OptimisticLockingStudent(1L, "John", "Doe", Arrays.asList(course)); + course.setStudent(student); + entityManager.persist(course); + entityManager.persist(student); + entityManager.getTransaction() + .commit(); + entityManager.close(); + } + + @After + public void clean() throws IOException { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + OptimisticLockingCourse course = entityManager.find(OptimisticLockingCourse.class, 1L); + OptimisticLockingStudent student = entityManager.find(OptimisticLockingStudent.class, 1L); + entityManager.remove(course); + entityManager.remove(student); + entityManager.getTransaction() + .commit(); + entityManager.close(); + } + + @Test(expected = OptimisticLockException.class) + public void givenVersionedEntities_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { + EntityManager em = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L); + + EntityManager em2 = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L); + student2.setName("RICHARD"); + em2.persist(student2); + em2.getTransaction() + .commit(); + em2.close(); + + student.setName("JOHN"); + em.persist(student); + em.getTransaction() + .commit(); + em.close(); + } + + @Test(expected = OptimisticLockException.class) + public void givenVersionedEntitiesWithLockByFindMethod_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { + EntityManager em = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L, LockModeType.OPTIMISTIC); + + EntityManager em2 = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L, LockModeType.OPTIMISTIC_FORCE_INCREMENT); + student2.setName("RICHARD"); + em2.persist(student2); + em2.getTransaction() + .commit(); + em2.close(); + + student.setName("JOHN"); + em.persist(student); + em.getTransaction() + .commit(); + em.close(); + } + + @Test(expected = OptimisticLockException.class) + public void givenVersionedEntitiesWithLockByRefreshMethod_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { + EntityManager em = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L); + em.refresh(student, LockModeType.OPTIMISTIC); + + EntityManager em2 = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L); + em.refresh(student, LockModeType.OPTIMISTIC_FORCE_INCREMENT); + student2.setName("RICHARD"); + em2.persist(student2); + em2.getTransaction() + .commit(); + em2.close(); + + student.setName("JOHN"); + em.persist(student); + em.getTransaction() + .commit(); + em.close(); + } + + @Test(expected = OptimisticLockException.class) + public void givenVersionedEntitiesWithLockByLockMethod_whenConcurrentUpdate_thenOptimisticLockException() throws IOException { + EntityManager em = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student = em.find(OptimisticLockingStudent.class, 1L); + em.lock(student, LockModeType.OPTIMISTIC); + + EntityManager em2 = getEntityManagerWithOpenTransaction(); + OptimisticLockingStudent student2 = em2.find(OptimisticLockingStudent.class, 1L); + em.lock(student, LockModeType.OPTIMISTIC_FORCE_INCREMENT); + student2.setName("RICHARD"); + em2.persist(student2); + em2.getTransaction() + .commit(); + em2.close(); + + student.setName("JOHN"); + em.persist(student); + em.getTransaction() + .commit(); + em.close(); + } + + protected static EntityManager getEntityManagerWithOpenTransaction() throws IOException { + String propertyFileName = "hibernate-pessimistic-locking.properties"; + if (sessionFactory == null) { + sessionFactory = HibernateUtil.getSessionFactory(propertyFileName); + } + EntityManager entityManager = sessionFactory.openSession(); + entityManager.getTransaction().begin(); + + return entityManager; + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java new file mode 100644 index 0000000000..4b9c7720fd --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java @@ -0,0 +1,162 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import com.baeldung.hibernate.HibernateUtil; +import com.vividsolutions.jts.util.Assert; + +import org.hibernate.SessionFactory; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.persistence.*; +import java.io.IOException; +import java.util.Arrays; + +public class BasicPessimisticLockingIntegrationTest { + + private static SessionFactory sessionFactory; + + @BeforeClass + public static void setUp() throws IOException { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent student = new PessimisticLockingStudent(1L, "JOHN"); + PessimisticLockingCourse course = new PessimisticLockingCourse(1L, "MATH", student); + student.setCourses(Arrays.asList(course)); + entityManager.persist(course); + entityManager.persist(student); + entityManager.getTransaction() + .commit(); + entityManager.close(); + } + + @Test + public void givenFoundRecordWithPessimisticRead_whenFindingNewOne_PessimisticLockExceptionThrown() { + try { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + entityManager.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_READ); + + EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); + entityManager2.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_READ); + + entityManager.close(); + entityManager2.close(); + } catch (Exception e) { + Assert.isTrue(e instanceof PessimisticLockException); + } + } + + @Test + public void givenRecordWithPessimisticReadQuery_whenQueryingNewOne_PessimisticLockExceptionThrown() throws IOException { + try { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + Query query = entityManager.createQuery("from Student where studentId = :studentId"); + query.setParameter("studentId", 1L); + query.setLockMode(LockModeType.PESSIMISTIC_WRITE); + query.getResultList(); + + EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); + Query query2 = entityManager2.createQuery("from Student where studentId = :studentId"); + query2.setParameter("studentId", 1L); + query2.setLockMode(LockModeType.PESSIMISTIC_READ); + query2.getResultList(); + + entityManager.close(); + entityManager2.close(); + } catch (Exception e) { + Assert.isTrue(e instanceof PessimisticLockException); + } + } + + @Test + public void givenRecordWithPessimisticReadLock_whenFindingNewOne_PessimisticLockExceptionThrown() { + try { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); + entityManager.lock(resultStudent, LockModeType.PESSIMISTIC_READ); + + EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); + entityManager2.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_FORCE_INCREMENT); + + entityManager.close(); + entityManager2.close(); + } catch (Exception e) { + Assert.isTrue(e instanceof PessimisticLockException); + } + } + + @Test + public void givenRecordAndRefreshWithPessimisticRead_whenFindingWithPessimisticWrite_PessimisticLockExceptionThrown() { + try { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); + entityManager.refresh(resultStudent, LockModeType.PESSIMISTIC_FORCE_INCREMENT); + + EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); + entityManager2.find(PessimisticLockingStudent.class, 1L, LockModeType.PESSIMISTIC_WRITE); + + entityManager.close(); + entityManager2.close(); + } catch (Exception e) { + Assert.isTrue(e instanceof PessimisticLockException); + } + } + + @Test + public void givenRecordWithPessimisticRead_whenUpdatingRecord_PessimisticLockExceptionThrown() { + try { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); + entityManager.refresh(resultStudent, LockModeType.PESSIMISTIC_READ); + + EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent resultStudent2 = entityManager2.find(PessimisticLockingStudent.class, 1L); + resultStudent2.setName("Change"); + entityManager2.persist(resultStudent2); + entityManager2.getTransaction() + .commit(); + + entityManager.close(); + entityManager2.close(); + } catch (Exception e) { + Assert.isTrue(e instanceof PessimisticLockException); + } + } + + @Test + public void givenRecordWithPessimisticWrite_whenUpdatingRecord_PessimisticLockExceptionThrown() { + try { + EntityManager entityManager = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent resultStudent = entityManager.find(PessimisticLockingStudent.class, 1L); + entityManager.refresh(resultStudent, LockModeType.PESSIMISTIC_WRITE); + + EntityManager entityManager2 = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent resultStudent2 = entityManager2.find(PessimisticLockingStudent.class, 1L); + resultStudent2.setName("Change"); + entityManager2.persist(resultStudent2); + entityManager2.getTransaction() + .commit(); + + entityManager.close(); + entityManager2.close(); + } catch (Exception e) { + Assert.isTrue(e instanceof PessimisticLockException); + } + } + + protected static EntityManager getEntityManagerWithOpenTransaction() throws IOException { + String propertyFileName = "hibernate-pessimistic-locking.properties"; + if (sessionFactory == null) { + sessionFactory = HibernateUtil.getSessionFactory(propertyFileName); + } + EntityManager entityManager = sessionFactory.openSession(); + entityManager.getTransaction().begin(); + + return entityManager; + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java new file mode 100644 index 0000000000..81cb7d95f8 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java @@ -0,0 +1,125 @@ +package com.baeldung.hibernate.pessimisticlocking; + +import com.baeldung.hibernate.HibernateUtil; + +import org.hibernate.SessionFactory; +import org.junit.AfterClass; +import org.junit.Test; + +import javax.persistence.EntityManager; +import javax.persistence.LockModeType; +import javax.persistence.PessimisticLockScope; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +public class PessimisticLockScopesIntegrationTest { + + private static SessionFactory sessionFactory; + + @Test + public void givenEclipseEntityWithJoinInheritance_whenNormalLock_thenShouldChildAndParentEntity() throws IOException { + EntityManager em = getEntityManagerWithOpenTransaction(); + PessimisticLockingEmployee employee = new PessimisticLockingEmployee(1L, "JOHN", "SMITH", new BigDecimal(4.5)); + em.persist(employee); + em.getTransaction() + .commit(); + em.close(); + + // NORMAL SCOPE + EntityManager em2 = getEntityManagerWithOpenTransaction(); + PessimisticLockingEmployee foundEmployee = em2.find(PessimisticLockingEmployee.class, 1L, LockModeType.PESSIMISTIC_WRITE); + em2.getTransaction() + .rollback(); + + // EXTENDED SCOPE + Map map = new HashMap<>(); + map.put("javax.persistence.lock.scope", PessimisticLockScope.EXTENDED); + + EntityManager em3 = getEntityManagerWithOpenTransaction(); + foundEmployee = em3.find(PessimisticLockingEmployee.class, 1L, LockModeType.PESSIMISTIC_WRITE, map); + em3.getTransaction() + .rollback(); + + em2.close(); + em3.close(); + } + + @Test + public void givenEntityWithElementCollection_whenLock_thenHibernateExtendedScopeLockOnlyOwningEntity() throws IOException { + EntityManager em = getEntityManagerWithOpenTransaction(); + Address address = new Address("Poland", "Warsaw"); + Customer customer = new Customer(1L, "JOE", "DOE", Arrays.asList(address)); + em.persist(customer); + em.getTransaction() + .commit(); + em.close(); + + // NORMAL SCOPE + EntityManager em2 = getEntityManagerWithOpenTransaction(); + Customer foundCustomer = em2.find(Customer.class, 1L, LockModeType.PESSIMISTIC_WRITE); + em2.getTransaction() + .rollback(); + + // EXTENDED SCOPE + Map map = new HashMap<>(); + map.put("javax.persistence.lock.scope", PessimisticLockScope.EXTENDED); + + EntityManager em3 = getEntityManagerWithOpenTransaction(); + foundCustomer = em3.find(Customer.class, 1L, LockModeType.PESSIMISTIC_WRITE, map); + em2.getTransaction() + .rollback(); + + em2.close(); + em3.close(); + } + + @Test + public void givenEntityWithOneToMany_whenLock_thenHibernateExtendedScopeLockOnlyOwningEntity() throws IOException { + EntityManager em = getEntityManagerWithOpenTransaction(); + PessimisticLockingStudent student = new PessimisticLockingStudent(1L, "JOE"); + PessimisticLockingCourse course = new PessimisticLockingCourse(1L, "COURSE", student); + student.setCourses(Arrays.asList(course)); + em.persist(course); + em.persist(student); + em.getTransaction() + .commit(); + em.close(); + + // NORMAL SCOPE + EntityManager em2 = getEntityManagerWithOpenTransaction(); + PessimisticLockingCourse foundCourse = em2.find(PessimisticLockingCourse.class, 1L, LockModeType.PESSIMISTIC_WRITE); + em2.getTransaction() + .rollback(); + + // EXTENDED SCOPE + Map map = new HashMap<>(); + map.put("javax.persistence.lock.scope", PessimisticLockScope.EXTENDED); + + EntityManager em3 = getEntityManagerWithOpenTransaction(); + foundCourse = em3.find(PessimisticLockingCourse.class, 1L, LockModeType.PESSIMISTIC_WRITE, map); + em3.getTransaction() + .rollback(); + + em2.close(); + em3.close(); + } + + protected EntityManager getEntityManagerWithOpenTransaction() throws IOException { + String propertyFileName = "hibernate-pessimistic-locking.properties"; + if (sessionFactory == null) { + sessionFactory = HibernateUtil.getSessionFactory(propertyFileName); + } + EntityManager entityManager = sessionFactory.openSession(); + entityManager.getTransaction().begin(); + + return entityManager; + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java new file mode 100644 index 0000000000..246a7d59f9 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java @@ -0,0 +1,57 @@ +package com.baeldung.hibernate.transaction; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.pojo.Post; +import com.baeldung.hibernate.transaction.PostService; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.BeforeClass; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +public class TransactionIntegrationTest { + + private static PostService postService; + private static Session session; + private static Logger logger = LoggerFactory.getLogger(TransactionIntegrationTest.class); + + @BeforeClass + public static void init() throws IOException { + Properties properties = new Properties(); + properties.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); + properties.setProperty("hibernate.connection.url", "jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1"); + properties.setProperty("hibernate.connection.username", "sa"); + properties.setProperty("hibernate.show_sql", "true"); + properties.setProperty("jdbc.password", ""); + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); + SessionFactory sessionFactory = HibernateUtil.getSessionFactoryByProperties(properties); + session = sessionFactory.openSession(); + postService = new PostService(session); + } + + @Test + public void givenTitleAndBody_whenRepositoryUpdatePost_thenUpdatePost() { + + Post post = new Post("This is a title", "This is a sample post"); + session.persist(post); + + String title = "[UPDATE] Java HowTos"; + String body = "This is an updated posts on Java how-tos"; + postService.updatePost(title, body, post.getId()); + + session.refresh(post); + + assertEquals(post.getTitle(), title); + assertEquals(post.getBody(), body); + } + + +} diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java new file mode 100644 index 0000000000..b299dd5834 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java @@ -0,0 +1,90 @@ +package com.baeldung.persistencecontext; + +import com.baeldung.persistencecontext.entity.User; +import com.baeldung.persistencecontext.service.ExtendedPersistenceContextUserService; +import com.baeldung.persistencecontext.service.TransctionPersistenceContextUserService; + +import javax.persistence.EntityExistsException; +import javax.persistence.TransactionRequiredException; + +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 static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = com.baeldung.persistencecontext.PersistenceContextDemoApplication.class) +public class PersistenceContextIntegrationTest { + + @Autowired + private TransctionPersistenceContextUserService transctionPersistenceContext; + @Autowired + private ExtendedPersistenceContextUserService extendedPersistenceContext; + + @Test + public void testThatWhenUserSavedWithTransctionPersistenceContextThenUserShouldGetSavedInDB() { + User user = new User(121L, "Devender", "admin"); + transctionPersistenceContext.insertWithTransaction(user); + + User userFromTransctionPersistenceContext = transctionPersistenceContext.find(user.getId()); + assertNotNull(userFromTransctionPersistenceContext); + + User userFromExtendedPersistenceContext = extendedPersistenceContext.find(user.getId()); + assertNotNull(userFromExtendedPersistenceContext); + } + + @Test(expected = TransactionRequiredException.class) + public void testThatUserSaveWithoutTransactionThrowException() { + User user = new User(122L, "Devender", "admin"); + transctionPersistenceContext.insertWithoutTransaction(user); + } + + @Test + public void testThatWhenUserSavedWithExtendedPersistenceContextWithoutTransactionThenUserShouldGetCached() { + User user = new User(123L, "Devender", "admin"); + extendedPersistenceContext.insertWithoutTransaction(user); + + User userFromExtendedPersistenceContext = extendedPersistenceContext.find(user.getId()); + assertNotNull(userFromExtendedPersistenceContext); + + User userFromTransctionPersistenceContext = transctionPersistenceContext.find(user.getId()); + assertNull(userFromTransctionPersistenceContext); + } + + @Test(expected = EntityExistsException.class) + public void testThatPersistUserWithSameIdentifierThrowException() { + User user1 = new User(126L, "Devender", "admin"); + User user2 = new User(126L, "Devender", "admin"); + extendedPersistenceContext.insertWithoutTransaction(user1); + extendedPersistenceContext.insertWithoutTransaction(user2); + } + + @Test + public void testThatWhenUserSavedWithExtendedPersistenceContextWithTransactionThenUserShouldSaveEntityIntoDB() { + User user = new User(127L, "Devender", "admin"); + extendedPersistenceContext.insertWithTransaction(user); + + User userFromDB = transctionPersistenceContext.find(user.getId()); + assertNotNull(userFromDB); + } + + @Test + public void testThatWhenUserSavedWithExtendedPersistenceContextWithTransactionThenUserShouldFlushCachedEntityIntoDB() { + User user1 = new User(124L, "Devender", "admin"); + extendedPersistenceContext.insertWithoutTransaction(user1); + + User user2 = new User(125L, "Devender", "admin"); + extendedPersistenceContext.insertWithTransaction(user2); + + User user1FromTransctionPersistenceContext = transctionPersistenceContext.find(user1.getId()); + assertNotNull(user1FromTransctionPersistenceContext); + + User user2FromTransctionPersistenceContext = transctionPersistenceContext.find(user2.getId()); + assertNotNull(user2FromTransctionPersistenceContext); + } + +} diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-namedquery.properties new file mode 100644 index 0000000000..457f965347 --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-namedquery.properties @@ -0,0 +1,9 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-pessimistic-locking.properties b/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-pessimistic-locking.properties new file mode 100644 index 0000000000..4f1ff5e93a --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-pessimistic-locking.properties @@ -0,0 +1,8 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb3;DB_CLOSE_DELAY=-1;LOCK_TIMEOUT=100;MVCC=FALSE +hibernate.connection.username=sa +hibernate.connection.autocommit=true +hibernate.dialect=org.hibernate.dialect.H2Dialect + +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/hibernate.properties b/persistence-modules/hibernate5-jpa/src/test/resources/hibernate.properties new file mode 100644 index 0000000000..c14782ce0f --- /dev/null +++ b/persistence-modules/hibernate5-jpa/src/test/resources/hibernate.properties @@ -0,0 +1,14 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/profile.png b/persistence-modules/hibernate5-jpa/src/test/resources/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd4e978b96d0f59a6e48692fcb68d1c6c565a20 GIT binary patch literal 1117 zcmV-j1fu(iP)%yyh@V&OYl(_AFwE`D&8)` zPnvkdvc#Z>pRh2kBHk{=qaGfCG;?<;rVe;D+%LyZS~!K}c+|op81YK@rzPHU@Th|m z4Dk`HcojTY;+}_-W%HGqKH@C!LiH8Tp>1lC@aTqoy zBU~QK<}hs@q|M8($ee`o<9#`B3-PL4Y7d9kW#<;n>t}6VNpYCswLrJTtEa_lFwgN$52-_vxvvfJs@B6-OYs%-@M_JTx*UfozG6(Bhs)>w z!pG%vU$b%f++EGa<#Tu1FZ^c#{;G|y5=kM3Y#X^mtSrFA_-o-vX7e_$5-udx(>S4U)i|4)(UJ~zR(vwE+6VTAzoo7wIS|c zh*yt`3wK%<+yX~Z9G1z2GQgf3~qx jc9u$WjpqGof00000NkvXXu0mjfJX<<= literal 0 HcmV?d00001 From 9f8e1b51b3d5fad0f3499120e2bd41a96c0de3c2 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:20:46 +0530 Subject: [PATCH 035/530] JAVA-4 : added new module hibernate5-mapping --- .../hibernate5-mapping/README.md | 11 + .../hibernate5-mapping/pom.xml | 76 +++++++ .../com/baeldung/hibernate/HibernateUtil.java | 96 +++++++++ .../hibernate/entities/Department.java | 45 ++++ .../hibernate/entities/DeptEmployee.java | 83 ++++++++ .../hibernate/lob/HibernateSessionUtil.java | 61 ++++++ .../baeldung/hibernate/lob/model/User.java | 46 +++++ .../com/baeldung/hibernate/pojo/Employee.java | 87 ++++++++ .../hibernate/pojo/EntityDescription.java | 55 +++++ .../com/baeldung/hibernate/pojo/Phone.java | 50 +++++ .../com/baeldung/hibernate/pojo/Result.java | 31 +++ .../hibernate/pojo/TemporalValues.java | 195 ++++++++++++++++++ .../hibernate/pojo/generator/MyGenerator.java | 41 ++++ .../hibernate/pojo/inheritance/Animal.java | 40 ++++ .../hibernate/pojo/inheritance/Bag.java | 38 ++++ .../hibernate/pojo/inheritance/Book.java | 27 +++ .../hibernate/pojo/inheritance/Car.java | 25 +++ .../hibernate/pojo/inheritance/Item.java | 5 + .../pojo/inheritance/MyEmployee.java | 22 ++ .../hibernate/pojo/inheritance/MyProduct.java | 47 +++++ .../hibernate/pojo/inheritance/Pen.java | 27 +++ .../hibernate/pojo/inheritance/Person.java | 38 ++++ .../hibernate/pojo/inheritance/Pet.java | 27 +++ .../hibernate/pojo/inheritance/Vehicle.java | 40 ++++ .../baeldung/hibernate/pojo/package-info.java | 9 + .../main/resources/META-INF/persistence.xml | 18 ++ .../src/main/resources/logback.xml | 13 ++ .../hibernate/CustomClassIntegrationTest.java | 78 +++++++ .../DynamicMappingIntegrationTest.java | 160 ++++++++++++++ .../InheritanceMappingIntegrationTest.java | 89 ++++++++ .../hibernate/TemporalValuesUnitTest.java | 128 ++++++++++++ .../baeldung/hibernate/lob/LobUnitTest.java | 61 ++++++ .../src/test/resources/hibernate.properties | 14 ++ .../src/test/resources/lifecycle-init.sql | 25 +++ .../src/test/resources/profile.png | Bin 0 -> 1117 bytes 35 files changed, 1808 insertions(+) create mode 100644 persistence-modules/hibernate5-mapping/README.md create mode 100644 persistence-modules/hibernate5-mapping/pom.xml create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java create mode 100644 persistence-modules/hibernate5-mapping/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate5-mapping/src/main/resources/logback.xml create mode 100644 persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java create mode 100644 persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java create mode 100644 persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java create mode 100644 persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java create mode 100644 persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java create mode 100644 persistence-modules/hibernate5-mapping/src/test/resources/hibernate.properties create mode 100644 persistence-modules/hibernate5-mapping/src/test/resources/lifecycle-init.sql create mode 100644 persistence-modules/hibernate5-mapping/src/test/resources/profile.png diff --git a/persistence-modules/hibernate5-mapping/README.md b/persistence-modules/hibernate5-mapping/README.md new file mode 100644 index 0000000000..f18b0b63de --- /dev/null +++ b/persistence-modules/hibernate5-mapping/README.md @@ -0,0 +1,11 @@ +## Hibernate 5 + +This module contains articles about Hibernate 5. + +### Relevant articles: + +- [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) +- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance) +- [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class) +- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time) +- [Mapping LOB Data in Hibernate](http://www.baeldung.com/hibernate-lob) \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/pom.xml b/persistence-modules/hibernate5-mapping/pom.xml new file mode 100644 index 0000000000..59e0547671 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + hibernate5-mapping + 0.0.1-SNAPSHOT + hibernate5-mapping + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + com.h2database + h2 + ${h2.version} + + + org.hibernate + hibernate-spatial + ${hibernate.version} + + + org.opengeo + geodb + ${geodb.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + ch.vorburger.mariaDB4j + mariaDB4j + ${mariaDB4j.version} + + + org.hibernate + hibernate-testing + ${hibernate.version} + + + + + + geodb-repo + GeoDB repository + http://repo.boundlessgeo.com/main/ + + + + + 5.3.7.Final + 6.0.6 + 2.2.3 + 3.8.0 + 0.9 + + + diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java new file mode 100644 index 0000000000..28e1af49ed --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -0,0 +1,96 @@ +package com.baeldung.hibernate; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.entities.DeptEmployee; +import com.baeldung.hibernate.pojo.Employee; +import com.baeldung.hibernate.pojo.EntityDescription; +import com.baeldung.hibernate.pojo.Phone; +import com.baeldung.hibernate.pojo.TemporalValues; +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.MyEmployee; +import com.baeldung.hibernate.pojo.inheritance.MyProduct; +import com.baeldung.hibernate.pojo.inheritance.Pen; +import com.baeldung.hibernate.pojo.inheritance.Pet; +import com.baeldung.hibernate.pojo.inheritance.Vehicle; + +public class HibernateUtil { + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + ServiceRegistry serviceRegistry = configureServiceRegistry(); + return makeSessionFactory(serviceRegistry); + } + + public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException { + ServiceRegistry serviceRegistry = configureServiceRegistry(properties); + return makeSessionFactory(serviceRegistry); + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addPackage("com.baeldung.hibernate.pojo"); + metadataSources.addAnnotatedClass(Employee.class); + metadataSources.addAnnotatedClass(Phone.class); + metadataSources.addAnnotatedClass(EntityDescription.class); + metadataSources.addAnnotatedClass(TemporalValues.class); + metadataSources.addAnnotatedClass(DeptEmployee.class); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); + metadataSources.addAnnotatedClass(Animal.class); + metadataSources.addAnnotatedClass(Bag.class); + metadataSources.addAnnotatedClass(Book.class); + metadataSources.addAnnotatedClass(Car.class); + metadataSources.addAnnotatedClass(MyEmployee.class); + metadataSources.addAnnotatedClass(MyProduct.class); + metadataSources.addAnnotatedClass(Pen.class); + metadataSources.addAnnotatedClass(Pet.class); + metadataSources.addAnnotatedClass(Vehicle.class); + + + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + return configureServiceRegistry(getProperties()); + } + + private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException { + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + public static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java new file mode 100644 index 0000000000..ff94f4f849 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java @@ -0,0 +1,45 @@ +package com.baeldung.hibernate.entities; + +import java.util.List; + +import javax.persistence.*; + +@Entity +public class Department { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String name; + + @OneToMany(mappedBy="department") + private List employees; + + public Department(String name) { + this.name = name; + } + + 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 getEmployees() { + return employees; + } + + public void setEmployees(List employees) { + this.employees = employees; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java new file mode 100644 index 0000000000..6510e70650 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java @@ -0,0 +1,83 @@ +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; + +@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_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), + @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_UpdateEmployeeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION(:employeeNumber, :newDesignation)", resultClass = DeptEmployee.class) }) +@Entity +public class DeptEmployee { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String employeeNumber; + + private String title; + + private String name; + + @ManyToOne + private Department department; + + public DeptEmployee(String name, String employeeNumber, Department department) { + this.name = name; + this.employeeNumber = employeeNumber; + this.department = department; + } + + public DeptEmployee(String name, String employeeNumber, String title, Department department) { + super(); + this.name = name; + this.employeeNumber = employeeNumber; + this.title = title; + this.department = department; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java new file mode 100644 index 0000000000..dc5242ee7c --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.lob; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.lob.model.User; + +public class HibernateSessionUtil { + + private static SessionFactory sessionFactory; + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + if (sessionFactory == null) { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + sessionFactory = makeSessionFactory(serviceRegistry); + } + return sessionFactory; + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(User.class); + + Metadata metadata = metadataSources.buildMetadata(); + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java new file mode 100644 index 0000000000..21f725b388 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java @@ -0,0 +1,46 @@ +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; + +@Entity +@Table(name="user") +public class User { + + @Id + private String id; + + @Column(name = "name", columnDefinition="VARCHAR(128)") + private String name; + + @Lob + @Column(name = "photo", columnDefinition="BLOB") + private byte[] photo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public byte[] getPhoto() { + return photo; + } + + public void setPhoto(byte[] photo) { + this.photo = photo; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java new file mode 100644 index 0000000000..e9732b2b67 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java @@ -0,0 +1,87 @@ +package com.baeldung.hibernate.pojo; + +import org.hibernate.annotations.*; + +import javax.persistence.Entity; +import javax.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")) +@Filter(name = "incomeLevelFilter", condition = "grossIncome > :incomeLimit") +public class Employee implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + private long grossIncome; + + private int taxInPercents; + + private boolean deleted; + + public long getTaxJavaWay() { + return grossIncome * taxInPercents / 100; + } + + @Formula("grossIncome * taxInPercents / 100") + private long tax; + + @OneToMany + @JoinColumn(name = "employee_id") + @Where(clause = "deleted = false") + private Set phones = new HashSet<>(0); + + public Employee() { + } + + public Employee(long grossIncome, int taxInPercents) { + this.grossIncome = grossIncome; + this.taxInPercents = taxInPercents; + } + + public Integer getId() { + return id; + } + + public long getGrossIncome() { + return grossIncome; + } + + public int getTaxInPercents() { + return taxInPercents; + } + + public long getTax() { + return tax; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setGrossIncome(long grossIncome) { + this.grossIncome = grossIncome; + } + + public void setTaxInPercents(int taxInPercents) { + this.taxInPercents = taxInPercents; + } + + public boolean getDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public Set getPhones() { + return phones; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java new file mode 100644 index 0000000000..131bb73a80 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java @@ -0,0 +1,55 @@ +package com.baeldung.hibernate.pojo; + +import org.hibernate.annotations.Any; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +public class EntityDescription implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + private String description; + + @Any( + metaDef = "EntityDescriptionMetaDef", + metaColumn = @Column(name = "entity_type") + ) + @JoinColumn(name = "entity_id") + private Serializable entity; + + public EntityDescription() { + } + + public EntityDescription(String description, Serializable entity) { + this.description = description; + this.entity = entity; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Serializable getEntity() { + return entity; + } + + public void setEntity(Serializable entity) { + this.entity = entity; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java new file mode 100644 index 0000000000..d923bda5de --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java @@ -0,0 +1,50 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.io.Serializable; + +@Entity +public class Phone implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + private boolean deleted; + + private String number; + + public Phone() { + } + + public Phone(String number) { + this.number = number; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java new file mode 100644 index 0000000000..607269a267 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java @@ -0,0 +1,31 @@ +package com.baeldung.hibernate.pojo; + +public class Result { + private String employeeName; + + private String departmentName; + + public Result(String employeeName, String departmentName) { + this.employeeName = employeeName; + this.departmentName = departmentName; + } + + public Result() { + } + + public String getEmployeeName() { + return employeeName; + } + + public void setEmployeeName(String employeeName) { + this.employeeName = employeeName; + } + + public String getDepartmentName() { + return departmentName; + } + + public void setDepartmentName(String departmentName) { + this.departmentName = departmentName; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java new file mode 100644 index 0000000000..f3fe095cae --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java @@ -0,0 +1,195 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.*; +import java.io.Serializable; +import java.sql.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.time.*; +import java.util.Calendar; + +@Entity +public class TemporalValues implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Basic + private java.sql.Date sqlDate; + + @Basic + private java.sql.Time sqlTime; + + @Basic + private java.sql.Timestamp sqlTimestamp; + + @Basic + @Temporal(TemporalType.DATE) + private java.util.Date utilDate; + + @Basic + @Temporal(TemporalType.TIME) + private java.util.Date utilTime; + + @Basic + @Temporal(TemporalType.TIMESTAMP) + private java.util.Date utilTimestamp; + + @Basic + @Temporal(TemporalType.DATE) + private java.util.Calendar calendarDate; + + @Basic + @Temporal(TemporalType.TIMESTAMP) + private java.util.Calendar calendarTimestamp; + + @Basic + private java.time.LocalDate localDate; + + @Basic + private java.time.LocalTime localTime; + + @Basic + private java.time.OffsetTime offsetTime; + + @Basic + private java.time.Instant instant; + + @Basic + private java.time.LocalDateTime localDateTime; + + @Basic + private java.time.OffsetDateTime offsetDateTime; + + @Basic + private java.time.ZonedDateTime zonedDateTime; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Date getSqlDate() { + return sqlDate; + } + + public void setSqlDate(Date sqlDate) { + this.sqlDate = sqlDate; + } + + public Time getSqlTime() { + return sqlTime; + } + + public void setSqlTime(Time sqlTime) { + this.sqlTime = sqlTime; + } + + public Timestamp getSqlTimestamp() { + return sqlTimestamp; + } + + public void setSqlTimestamp(Timestamp sqlTimestamp) { + this.sqlTimestamp = sqlTimestamp; + } + + public java.util.Date getUtilDate() { + return utilDate; + } + + public void setUtilDate(java.util.Date utilDate) { + this.utilDate = utilDate; + } + + public java.util.Date getUtilTime() { + return utilTime; + } + + public void setUtilTime(java.util.Date utilTime) { + this.utilTime = utilTime; + } + + public java.util.Date getUtilTimestamp() { + return utilTimestamp; + } + + public void setUtilTimestamp(java.util.Date utilTimestamp) { + this.utilTimestamp = utilTimestamp; + } + + public Calendar getCalendarDate() { + return calendarDate; + } + + public void setCalendarDate(Calendar calendarDate) { + this.calendarDate = calendarDate; + } + + public Calendar getCalendarTimestamp() { + return calendarTimestamp; + } + + public void setCalendarTimestamp(Calendar calendarTimestamp) { + this.calendarTimestamp = calendarTimestamp; + } + + public LocalDate getLocalDate() { + return localDate; + } + + public void setLocalDate(LocalDate localDate) { + this.localDate = localDate; + } + + public LocalTime getLocalTime() { + return localTime; + } + + public void setLocalTime(LocalTime localTime) { + this.localTime = localTime; + } + + public OffsetTime getOffsetTime() { + return offsetTime; + } + + public void setOffsetTime(OffsetTime offsetTime) { + this.offsetTime = offsetTime; + } + + public Instant getInstant() { + return instant; + } + + public void setInstant(Instant instant) { + this.instant = instant; + } + + public LocalDateTime getLocalDateTime() { + return localDateTime; + } + + public void setLocalDateTime(LocalDateTime localDateTime) { + this.localDateTime = localDateTime; + } + + public OffsetDateTime getOffsetDateTime() { + return offsetDateTime; + } + + public void setOffsetDateTime(OffsetDateTime offsetDateTime) { + this.offsetDateTime = offsetDateTime; + } + + public ZonedDateTime getZonedDateTime() { + return zonedDateTime; + } + + public void setZonedDateTime(ZonedDateTime zonedDateTime) { + this.zonedDateTime = zonedDateTime; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java new file mode 100644 index 0000000000..17ffe9b7e1 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java @@ -0,0 +1,41 @@ +package com.baeldung.hibernate.pojo.generator; + +import java.io.Serializable; +import java.util.Properties; +import java.util.stream.Stream; + +import org.hibernate.HibernateException; +import org.hibernate.MappingException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.id.Configurable; +import org.hibernate.id.IdentifierGenerator; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.type.Type; + +public class MyGenerator implements IdentifierGenerator, Configurable { + + private String prefix; + + @Override + public Serializable generate(SharedSessionContractImplementor session, Object obj) throws HibernateException { + + String query = String.format("select %s from %s", + session.getEntityPersister(obj.getClass().getName(), obj).getIdentifierPropertyName(), + obj.getClass().getSimpleName()); + + Stream ids = session.createQuery(query).stream(); + + Long max = ids.map(o -> o.replace(prefix + "-", "")) + .mapToLong(Long::parseLong) + .max() + .orElse(0L); + + return prefix + "-" + (max + 1); + } + + @Override + public void configure(Type type, Properties properties, ServiceRegistry serviceRegistry) throws MappingException { + prefix = properties.getProperty("prefix"); + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java new file mode 100644 index 0000000000..6fe7f915fc --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java @@ -0,0 +1,40 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +public class Animal { + + @Id + private long animalId; + + private String species; + + public Animal() {} + + public Animal(long animalId, String species) { + this.animalId = animalId; + this.species = species; + } + + public long getAnimalId() { + return animalId; + } + + public void setAnimalId(long animalId) { + this.animalId = animalId; + } + + public String getSpecies() { + return species; + } + + public void setSpecies(String species) { + this.species = species; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java new file mode 100644 index 0000000000..fa6e1b4bef --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.Id; + +import org.hibernate.annotations.Polymorphism; +import org.hibernate.annotations.PolymorphismType; + +@Entity +@Polymorphism(type = PolymorphismType.EXPLICIT) +public class Bag implements Item { + + @Id + private long bagId; + + private String type; + + public Bag(long bagId, String type) { + this.bagId = bagId; + this.type = type; + } + + public long getBagId() { + return bagId; + } + + public void setBagId(long bagId) { + this.bagId = bagId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java new file mode 100644 index 0000000000..36ca8dd77c --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("1") +public class Book extends MyProduct { + private String author; + + public Book() { + } + + public Book(long productId, String name, String author) { + super(productId, name); + this.author = author; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java new file mode 100644 index 0000000000..49d1f7749a --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; + +@Entity +public class Car extends Vehicle { + private String engine; + + public Car() { + } + + public Car(long vehicleId, String manufacturer, String engine) { + super(vehicleId, manufacturer); + this.engine = engine; + } + + public String getEngine() { + return engine; + } + + public void setEngine(String engine) { + this.engine = engine; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java new file mode 100644 index 0000000000..9656030736 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java @@ -0,0 +1,5 @@ +package com.baeldung.hibernate.pojo.inheritance; + +public interface Item { + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java new file mode 100644 index 0000000000..9a6bce16cf --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java @@ -0,0 +1,22 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; + +@Entity +public class MyEmployee extends Person { + private String company; + + public MyEmployee(long personId, String name, String company) { + super(personId, name); + this.company = company; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java new file mode 100644 index 0000000000..13f04d8904 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java @@ -0,0 +1,47 @@ +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; + +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name = "product_type", discriminatorType = DiscriminatorType.INTEGER) +// @DiscriminatorFormula("case when author is not null then 1 else 2 end") +public class MyProduct { + @Id + private long productId; + + private String name; + + public MyProduct() { + } + + public MyProduct(long productId, String name) { + super(); + this.productId = productId; + this.name = name; + } + + public long getProductId() { + return productId; + } + + public void setProductId(long productId) { + this.productId = productId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java new file mode 100644 index 0000000000..32b77e52af --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("2") +public class Pen extends MyProduct { + private String color; + + public Pen() { + } + + public Pen(long productId, String name, String color) { + super(productId, name); + this.color = color; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java new file mode 100644 index 0000000000..99084b88af --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; + +@MappedSuperclass +public class Person { + + @Id + private long personId; + + private String name; + + public Person() { + } + + public Person(long personId, String name) { + this.personId = personId; + this.name = name; + } + + public long getPersonId() { + return personId; + } + + public void setPersonId(long personId) { + this.personId = personId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java new file mode 100644 index 0000000000..870b3cd684 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; + +@Entity +@PrimaryKeyJoinColumn(name = "petId") +public class Pet extends Animal { + private String name; + + public Pet() { + } + + public Pet(long animalId, String species, String name) { + super(animalId, species); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java new file mode 100644 index 0000000000..b2a920573e --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java @@ -0,0 +1,40 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; + +@Entity +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +public class Vehicle { + @Id + private long vehicleId; + + private String manufacturer; + + public Vehicle() { + } + + public Vehicle(long vehicleId, String manufacturer) { + this.vehicleId = vehicleId; + this.manufacturer = manufacturer; + } + + public long getVehicleId() { + return vehicleId; + } + + public void setVehicleId(long vehicleId) { + this.vehicleId = vehicleId; + } + + public String getManufacturer() { + return manufacturer; + } + + public void setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java new file mode 100644 index 0000000000..992cda7c1d --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java @@ -0,0 +1,9 @@ +@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/hibernate5-mapping/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate5-mapping/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..474eeb7a44 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + Hibernate EntityManager Demo + true + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/src/main/resources/logback.xml b/persistence-modules/hibernate5-mapping/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java new file mode 100644 index 0000000000..699890c457 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java @@ -0,0 +1,78 @@ +package com.baeldung.hibernate; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.util.List; + +import com.baeldung.hibernate.entities.DeptEmployee; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; +import org.hibernate.transform.Transformers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.baeldung.hibernate.entities.Department; +import com.baeldung.hibernate.pojo.Result; + +public class CustomClassIntegrationTest { + + private Session session; + + private Transaction transaction; + + @BeforeEach + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory().openSession(); + transaction = session.beginTransaction(); + session.createNativeQuery("delete from department").executeUpdate(); + Department department = new Department("Sales"); + DeptEmployee employee = new DeptEmployee("John Smith", "001", department); + session.persist(department); + session.persist(employee); + transaction.commit(); + transaction = session.beginTransaction(); + } + + @Test + public void whenAllManagersAreSelected_ThenObjectGraphIsReturned() { + Query query = session.createQuery("from com.baeldung.hibernate.entities.DeptEmployee"); + List deptEmployees = query.list(); + DeptEmployee deptEmployee = deptEmployees.get(0); + assertEquals("John Smith", deptEmployee.getName()); + assertEquals("Sales", deptEmployee.getDepartment().getName()); + } + + @Test + public void whenIndividualPropertiesAreSelected_ThenObjectArrayIsReturned() { + Query query = session.createQuery("select m.name, m.department.name from com.baeldung.hibernate.entities.DeptEmployee m"); + List managers = query.list(); + Object[] manager = (Object[]) managers.get(0); + assertEquals("John Smith", manager[0]); + assertEquals("Sales", manager[1]); + } + + @Test + public void whenResultConstructorInSelect_ThenListOfResultIsReturned() { + Query query = session.createQuery("select new com.baeldung.hibernate.pojo.Result(m.name, m.department.name) " + + "from DeptEmployee m"); + List results = query.list(); + Result result = results.get(0); + assertEquals("John Smith", result.getEmployeeName()); + assertEquals("Sales", result.getDepartmentName()); + } + + @Test + public void whenResultTransformerOnQuery_ThenListOfResultIsReturned() { + Query query = session.createQuery("select m.name as employeeName, m.department.name as departmentName " + + "from com.baeldung.hibernate.entities.DeptEmployee m"); + query.setResultTransformer(Transformers.aliasToBean(Result.class)); + List results = query.list(); + Result result = results.get(0); + assertEquals("John Smith", result.getEmployeeName()); + assertEquals("Sales", result.getDepartmentName()); + } + + +} diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java new file mode 100644 index 0000000000..7a112200b5 --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java @@ -0,0 +1,160 @@ +package com.baeldung.hibernate; + +import com.baeldung.hibernate.pojo.Employee; +import com.baeldung.hibernate.pojo.EntityDescription; +import com.baeldung.hibernate.pojo.Phone; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DynamicMappingIntegrationTest { + + private Session session; + + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory().openSession(); + transaction = session.beginTransaction(); + + session.createNativeQuery("delete from phone").executeUpdate(); + session.createNativeQuery("delete from employee").executeUpdate(); + + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenEntity_whenFieldMappedWithFormula_thenFieldIsCalculated() { + Employee employee = new Employee(10_000L, 25); + assertThat(employee.getTaxJavaWay()).isEqualTo(2_500L); + + session.save(employee); + session.flush(); + session.clear(); + + employee = session.get(Employee.class, employee.getId()); + assertThat(employee.getTax()).isEqualTo(2_500L); + } + + @Test + public void givenEntityMappedWithWhere_whenDeletedIsTrue_thenEntityNotFetched() { + Employee employee = new Employee(); + + session.save(employee); + session.clear(); + + employee = session.find(Employee.class, employee.getId()); + assertThat(employee).isNotNull(); + + employee.setDeleted(true); + session.flush(); + + employee = session.find(Employee.class, employee.getId()); + assertThat(employee).isNotNull(); + + session.clear(); + + employee = session.find(Employee.class, employee.getId()); + assertThat(employee).isNull(); + + } + + @Test + public void givenCollectionMappedWithWhere_whenDeletedIsTrue_thenEntityNotFetched() { + Employee employee = new Employee(); + Phone phone1 = new Phone("555-45-67"); + Phone phone2 = new Phone("555-89-01"); + employee.getPhones().add(phone1); + employee.getPhones().add(phone2); + + session.save(phone1); + session.save(phone2); + session.save(employee); + session.flush(); + session.clear(); + + employee = session.find(Employee.class, employee.getId()); + assertThat(employee.getPhones()).hasSize(2); + + employee.getPhones().iterator().next().setDeleted(true); + session.flush(); + session.clear(); + + employee = session.find(Employee.class, employee.getId()); + assertThat(employee.getPhones()).hasSize(1); + + List fullPhoneList = session.createQuery("from Phone").getResultList(); + assertThat(fullPhoneList).hasSize(2); + + } + + @Test + public void givenFilterByIncome_whenIncomeLimitSet_thenFilterIsApplied() throws IOException { + session.save(new Employee(10_000, 25)); + session.save(new Employee(12_000, 25)); + session.save(new Employee(15_000, 25)); + + session.flush(); + session.clear(); + + session.enableFilter("incomeLevelFilter") + .setParameter("incomeLimit", 11_000); + + List employees = session.createQuery("from Employee").getResultList(); + + assertThat(employees).hasSize(2); + + Employee employee = session.get(Employee.class, 1); + assertThat(employee.getGrossIncome()).isEqualTo(10_000); + + session.disableFilter("incomeLevelFilter"); + employees = session.createQuery("from Employee").getResultList(); + + assertThat(employees).hasSize(3); + + } + + @Test + public void givenMappingWithAny_whenDescriptionAddedToEntity_thenDescriptionCanReferAnyEntity() { + Employee employee = new Employee(); + Phone phone1 = new Phone("555-45-67"); + Phone phone2 = new Phone("555-89-01"); + employee.getPhones().add(phone1); + employee.getPhones().add(phone2); + + EntityDescription employeeDescription = new EntityDescription("Send to conference next year", employee); + EntityDescription phone1Description = new EntityDescription("Home phone (do not call after 10PM)", phone1); + EntityDescription phone2Description = new EntityDescription("Work phone", phone1); + + session.save(phone1); + session.save(phone2); + session.save(employee); + session.save(employeeDescription); + session.save(phone1Description); + session.save(phone2Description); + session.flush(); + session.clear(); + + List descriptions = session.createQuery("from EntityDescription").getResultList(); + + assertThat(Employee.class.isAssignableFrom(descriptions.get(0).getEntity().getClass())).isTrue(); + assertThat(Phone.class.isAssignableFrom(descriptions.get(1).getEntity().getClass())).isTrue(); + assertThat(Phone.class.isAssignableFrom(descriptions.get(2).getEntity().getClass())).isTrue(); + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java new file mode 100644 index 0000000000..0f35dbb8af --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java @@ -0,0 +1,89 @@ +package com.baeldung.hibernate; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +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.MyEmployee; +import com.baeldung.hibernate.pojo.inheritance.Pen; +import com.baeldung.hibernate.pojo.inheritance.Pet; + +public class InheritanceMappingIntegrationTest { + private Session session; + + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory() + .openSession(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenSubclasses_whenQuerySingleTableSuperclass_thenOk() { + Book book = new Book(1, "1984", "George Orwell"); + session.save(book); + Pen pen = new Pen(2, "my pen", "blue"); + session.save(pen); + + assertThat(session.createQuery("from MyProduct") + .getResultList() + .size()).isEqualTo(2); + } + + @Test + public void givenSubclasses_whenQueryMappedSuperclass_thenOk() { + MyEmployee emp = new MyEmployee(1, "john", "baeldung"); + session.save(emp); + + assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Person") + .getResultList() + .size()).isEqualTo(1); + } + + @Test + public void givenSubclasses_whenQueryJoinedTableSuperclass_thenOk() { + Pet pet = new Pet(1, "dog", "lassie"); + session.save(pet); + + assertThat(session.createQuery("from Animal") + .getResultList() + .size()).isEqualTo(1); + } + + @Test + public void givenSubclasses_whenQueryTablePerClassSuperclass_thenOk() { + Car car = new Car(1, "audi", "xyz"); + session.save(car); + + assertThat(session.createQuery("from Vehicle") + .getResultList() + .size()).isEqualTo(1); + } + + @Test + public void givenSubclasses_whenQueryNonMappedInterface_thenOk() { + Bag bag = new Bag(1, "large"); + session.save(bag); + + assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Item") + .getResultList() + .size()).isEqualTo(0); + } +} diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java new file mode 100644 index 0000000000..91c41af0fe --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java @@ -0,0 +1,128 @@ +package com.baeldung.hibernate; + +import com.baeldung.hibernate.pojo.TemporalValues; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.util.Calendar; +import java.util.TimeZone; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TemporalValuesUnitTest { + + private Session session; + + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory().withOptions() + .jdbcTimeZone(TimeZone.getTimeZone("UTC")) + .openSession(); + transaction = session.beginTransaction(); + session.createNativeQuery("delete from temporalvalues").executeUpdate(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenEntity_whenMappingSqlTypes_thenTemporalIsSelectedAutomatically() { + TemporalValues temporalValues = new TemporalValues(); + temporalValues.setSqlDate(java.sql.Date.valueOf("2017-11-15")); + temporalValues.setSqlTime(java.sql.Time.valueOf("15:30:14")); + temporalValues.setSqlTimestamp(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332")); + + session.save(temporalValues); + session.flush(); + session.clear(); + + temporalValues = session.get(TemporalValues.class, temporalValues.getId()); + assertThat(temporalValues.getSqlDate()).isEqualTo(java.sql.Date.valueOf("2017-11-15")); + assertThat(temporalValues.getSqlTime()).isEqualTo(java.sql.Time.valueOf("15:30:14")); + assertThat(temporalValues.getSqlTimestamp()).isEqualTo(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332")); + + } + + @Test + public void givenEntity_whenMappingUtilDateType_thenTemporalIsSpecifiedExplicitly() throws Exception { + TemporalValues temporalValues = new TemporalValues(); + temporalValues.setUtilDate(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15")); + temporalValues.setUtilTime(new SimpleDateFormat("HH:mm:ss").parse("15:30:14")); + temporalValues.setUtilTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.332")); + + session.save(temporalValues); + session.flush(); + session.clear(); + + temporalValues = session.get(TemporalValues.class, temporalValues.getId()); + assertThat(temporalValues.getUtilDate()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15")); + assertThat(temporalValues.getUtilTime()).isEqualTo(new SimpleDateFormat("HH:mm:ss").parse("15:30:14")); + assertThat(temporalValues.getUtilTimestamp()).isEqualTo(java.sql.Timestamp.valueOf("2017-11-15 15:30:14.332")); + + } + + @Test + public void givenEntity_whenMappingCalendarType_thenTemporalIsSpecifiedExplicitly() throws Exception { + TemporalValues temporalValues = new TemporalValues(); + + Calendar calendarDate = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendarDate.set(Calendar.YEAR, 2017); + calendarDate.set(Calendar.MONTH, 10); + calendarDate.set(Calendar.DAY_OF_MONTH, 15); + temporalValues.setCalendarDate(calendarDate); + + Calendar calendarTimestamp = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + calendarTimestamp.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.322")); + temporalValues.setCalendarTimestamp(calendarTimestamp); + + session.save(temporalValues); + session.flush(); + session.clear(); + + temporalValues = session.get(TemporalValues.class, temporalValues.getId()); + assertThat(temporalValues.getCalendarDate().getTime()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd").parse("2017-11-15")); + assertThat(temporalValues.getCalendarTimestamp().getTime()).isEqualTo(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse("2017-11-15 15:30:14.322")); + + } + + @Test + public void givenEntity_whenMappingJavaTimeTypes_thenTemporalIsSelectedAutomatically() { + TemporalValues temporalValues = new TemporalValues(); + + temporalValues.setLocalDate(LocalDate.parse("2017-11-15")); + temporalValues.setLocalTime(LocalTime.parse("15:30:18")); + temporalValues.setOffsetTime(OffsetTime.parse("08:22:12+01:00")); + + System.out.println("********"+OffsetTime.parse("08:22:12+01:00").toString()); + temporalValues.setInstant(Instant.parse("2017-11-15T08:22:12Z")); + temporalValues.setLocalDateTime(LocalDateTime.parse("2017-11-15T08:22:12")); + temporalValues.setOffsetDateTime(OffsetDateTime.parse("2017-11-15T08:22:12+01:00")); + temporalValues.setZonedDateTime(ZonedDateTime.parse("2017-11-15T08:22:12+01:00[Europe/Paris]")); + + session.save(temporalValues); + session.flush(); + session.clear(); + + temporalValues = session.get(TemporalValues.class, temporalValues.getId()); + assertThat(temporalValues.getLocalDate()).isEqualTo(LocalDate.parse("2017-11-15")); + assertThat(temporalValues.getLocalTime()).isEqualTo(LocalTime.parse("15:30:18")); + //assertThat(temporalValues.getOffsetTime()).isEqualTo(OffsetTime.parse("08:22:12+01:00")); + assertThat(temporalValues.getInstant()).isEqualTo(Instant.parse("2017-11-15T08:22:12Z")); + assertThat(temporalValues.getLocalDateTime()).isEqualTo(LocalDateTime.parse("2017-11-15T08:22:12")); + //assertThat(temporalValues.getOffsetDateTime()).isEqualTo(OffsetDateTime.parse("2017-11-15T08:22:12+01:00")); + assertThat(temporalValues.getZonedDateTime()).isEqualTo(ZonedDateTime.parse("2017-11-15T08:22:12+01:00[Europe/Paris]")); + + } + +} diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java new file mode 100644 index 0000000000..398b2290fa --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.lob; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import org.apache.commons.io.IOUtils; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.lob.model.User; + +public class LobUnitTest { + + private Session session; + + @Before + public void init(){ + try { + session = HibernateSessionUtil.getSessionFactory("hibernate.properties") + .openSession(); + } catch (HibernateException | IOException e) { + fail("Failed to initiate Hibernate Session [Exception:" + e.toString() + "]"); + } + } + + @After + public void close(){ + if(session != null) session.close(); + } + + @Test + public void givenValidInsertLobObject_whenQueried_returnSameDataAsInserted(){ + User user = new User(); + try(InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("profile.png");) { + // Get Image file from the resource + if(inputStream == null) fail("Unable to get resources"); + user.setId("1"); + user.setName("User"); + user.setPhoto(IOUtils.toByteArray(inputStream)); + + session.persist(user); + } catch (IOException e) { + fail("Unable to read input stream"); + } + + User result = session.find(User.class, "1"); + + assertNotNull("Query result is null", result); + assertEquals("User's name is invalid", user.getName(), result.getName() ); + assertTrue("User's photo is corrupted", Arrays.equals(user.getPhoto(), result.getPhoto()) ); + } +} diff --git a/persistence-modules/hibernate5-mapping/src/test/resources/hibernate.properties b/persistence-modules/hibernate5-mapping/src/test/resources/hibernate.properties new file mode 100644 index 0000000000..c14782ce0f --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/test/resources/hibernate.properties @@ -0,0 +1,14 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5-mapping/src/test/resources/lifecycle-init.sql b/persistence-modules/hibernate5-mapping/src/test/resources/lifecycle-init.sql new file mode 100644 index 0000000000..c0c9a3f34d --- /dev/null +++ b/persistence-modules/hibernate5-mapping/src/test/resources/lifecycle-init.sql @@ -0,0 +1,25 @@ +create sequence hibernate_sequence start with 1 increment by 1; + +create table Football_Player ( + id bigint not null, + name varchar(255), + primary key (id) +); + +insert into + Football_Player + (name, id) + values + ('Cristiano Ronaldo', next value for hibernate_sequence); + +insert into + Football_Player + (name, id) + values + ('Lionel Messi', next value for hibernate_sequence); + +insert into + Football_Player + (name, id) + values + ('Gigi Buffon', next value for hibernate_sequence); \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/src/test/resources/profile.png b/persistence-modules/hibernate5-mapping/src/test/resources/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd4e978b96d0f59a6e48692fcb68d1c6c565a20 GIT binary patch literal 1117 zcmV-j1fu(iP)%yyh@V&OYl(_AFwE`D&8)` zPnvkdvc#Z>pRh2kBHk{=qaGfCG;?<;rVe;D+%LyZS~!K}c+|op81YK@rzPHU@Th|m z4Dk`HcojTY;+}_-W%HGqKH@C!LiH8Tp>1lC@aTqoy zBU~QK<}hs@q|M8($ee`o<9#`B3-PL4Y7d9kW#<;n>t}6VNpYCswLrJTtEa_lFwgN$52-_vxvvfJs@B6-OYs%-@M_JTx*UfozG6(Bhs)>w z!pG%vU$b%f++EGa<#Tu1FZ^c#{;G|y5=kM3Y#X^mtSrFA_-o-vX7e_$5-udx(>S4U)i|4)(UJ~zR(vwE+6VTAzoo7wIS|c zh*yt`3wK%<+yX~Z9G1z2GQgf3~qx jc9u$WjpqGof00000NkvXXu0mjfJX<<= literal 0 HcmV?d00001 From 901708063381684ec81918283dcc1f83ab05f7a7 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 11 Mar 2020 18:21:07 +0530 Subject: [PATCH 036/530] JAVA-4 : added new module hibernate5-queries --- .../hibernate5-queries/README.md | 10 ++ .../hibernate5-queries/pom.xml | 82 ++++++++++++++ .../com/baeldung/hibernate/HibernateUtil.java | 73 ++++++++++++ .../UnsupportedTenancyException.java | 8 ++ .../criteriaquery/HibernateUtil.java | 60 ++++++++++ .../hibernate/criteriaquery/Student.java | 58 ++++++++++ .../LocalDateStringJavaDescriptor.java | 51 +++++++++ .../customtypes/LocalDateStringType.java | 34 ++++++ .../hibernate/entities/Department.java | 45 ++++++++ .../hibernate/entities/DeptEmployee.java | 83 ++++++++++++++ .../baeldung/hibernate/findall/FindAll.java | 35 ++++++ .../com/baeldung/hibernate/pojo/Student.java | 51 +++++++++ .../main/resources/META-INF/persistence.xml | 18 +++ .../src/main/resources/init_database.sql | 10 ++ .../src/main/resources/logback.xml | 13 +++ .../hibernate/NamedQueryIntegrationTest.java | 98 ++++++++++++++++ .../TypeSafeCriteriaIntegrationTest.java | 89 +++++++++++++++ .../hibernate/findall/FindAllUnitTest.java | 63 +++++++++++ .../QueryPlanCacheBenchmark.java | 106 ++++++++++++++++++ .../hibernate-customtypes.properties | 14 +++ .../resources/hibernate-namedquery.properties | 9 ++ .../src/test/resources/hibernate.properties | 14 +++ .../src/test/resources/lifecycle-init.sql | 25 +++++ .../src/test/resources/profile.png | Bin 0 -> 1117 bytes 24 files changed, 1049 insertions(+) create mode 100644 persistence-modules/hibernate5-queries/README.md create mode 100644 persistence-modules/hibernate5-queries/pom.xml create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/Department.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java create mode 100644 persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java create mode 100644 persistence-modules/hibernate5-queries/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate5-queries/src/main/resources/init_database.sql create mode 100644 persistence-modules/hibernate5-queries/src/main/resources/logback.xml create mode 100644 persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java create mode 100644 persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java create mode 100644 persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java create mode 100644 persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java create mode 100644 persistence-modules/hibernate5-queries/src/test/resources/hibernate-customtypes.properties create mode 100644 persistence-modules/hibernate5-queries/src/test/resources/hibernate-namedquery.properties create mode 100644 persistence-modules/hibernate5-queries/src/test/resources/hibernate.properties create mode 100644 persistence-modules/hibernate5-queries/src/test/resources/lifecycle-init.sql create mode 100644 persistence-modules/hibernate5-queries/src/test/resources/profile.png diff --git a/persistence-modules/hibernate5-queries/README.md b/persistence-modules/hibernate5-queries/README.md new file mode 100644 index 0000000000..1edf4ded1e --- /dev/null +++ b/persistence-modules/hibernate5-queries/README.md @@ -0,0 +1,10 @@ +## Hibernate 5 + +This module contains articles about Hibernate 5. + +### Relevant articles: + +- [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) +- [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) +- [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query) +- [Hibernate Query Plan Cache](https://www.baeldung.com/hibernate-query-plan-cache) \ No newline at end of file diff --git a/persistence-modules/hibernate5-queries/pom.xml b/persistence-modules/hibernate5-queries/pom.xml new file mode 100644 index 0000000000..544d22c0a3 --- /dev/null +++ b/persistence-modules/hibernate5-queries/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + hibernate5-queries + 0.0.1-SNAPSHOT + hibernate5-queries + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + com.h2database + h2 + ${h2.version} + + + org.hibernate + hibernate-spatial + ${hibernate.version} + + + org.opengeo + geodb + ${geodb.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + ch.vorburger.mariaDB4j + mariaDB4j + ${mariaDB4j.version} + + + org.hibernate + hibernate-testing + ${hibernate.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${openjdk-jmh.version} + + + + + + geodb-repo + GeoDB repository + http://repo.boundlessgeo.com/main/ + + + + + 5.3.7.Final + 6.0.6 + 2.2.3 + 3.8.0 + 0.9 + 1.21 + + + diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java new file mode 100644 index 0000000000..58724e690c --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -0,0 +1,73 @@ +package com.baeldung.hibernate; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.customtypes.LocalDateStringType; +import com.baeldung.hibernate.entities.DeptEmployee; +import com.baeldung.hibernate.pojo.Student; + +public class HibernateUtil { + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + ServiceRegistry serviceRegistry = configureServiceRegistry(); + return makeSessionFactory(serviceRegistry); + } + + public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException { + ServiceRegistry serviceRegistry = configureServiceRegistry(properties); + return makeSessionFactory(serviceRegistry); + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addPackage("com.baeldung.hibernate.pojo"); + metadataSources.addAnnotatedClass(Student.class); + metadataSources.addAnnotatedClass(DeptEmployee.class); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); + + Metadata metadata = metadataSources.getMetadataBuilder() + .applyBasicType(LocalDateStringType.INSTANCE) + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + return configureServiceRegistry(getProperties()); + } + + private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException { + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + public static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java new file mode 100644 index 0000000000..99d9505ea3 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java @@ -0,0 +1,8 @@ +package com.baeldung.hibernate; + +public class UnsupportedTenancyException extends Exception { + public UnsupportedTenancyException (String message) { + super(message); + } + +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java new file mode 100644 index 0000000000..35cfe55ba6 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java @@ -0,0 +1,60 @@ +package com.baeldung.hibernate.criteriaquery; + +import com.baeldung.hibernate.customtypes.LocalDateStringType; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + private HibernateUtil() { + } + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + sessionFactory = buildSessionFactory(); + } + return sessionFactory; + } + + private static SessionFactory buildSessionFactory() { + try { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addAnnotatedClass(Student.class); + Metadata metadata = metadataSources.getMetadataBuilder() + .applyBasicType(LocalDateStringType.INSTANCE) + .build(); + return metadata.getSessionFactoryBuilder().build(); + } catch (IOException ex) { + throw new ExceptionInInitializerError(ex); + } + } + + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties).build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource("hibernate.properties"); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java new file mode 100644 index 0000000000..314e7ca557 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java @@ -0,0 +1,58 @@ +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; + +@Entity +@Table(name = "students") +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @Column(name = "first_name") + private String firstName; + + @Column(name = "last_name") + private String lastName; + + @Column(name = "grad_year") + private int gradYear; + + public int getId() { + return id; + } + + public void setId(int 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; + } + + public int getGradYear() { + return gradYear; + } + + public void setGradYear(int gradYear) { + this.gradYear = gradYear; + } +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java new file mode 100644 index 0000000000..56be9e693f --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java @@ -0,0 +1,51 @@ +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; + +public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor { + + public static final LocalDateStringJavaDescriptor INSTANCE = new LocalDateStringJavaDescriptor(); + + public LocalDateStringJavaDescriptor() { + super(LocalDate.class, ImmutableMutabilityPlan.INSTANCE); + } + + @Override + public String toString(LocalDate value) { + return LocalDateType.FORMATTER.format(value); + } + + @Override + public LocalDate fromString(String string) { + return LocalDate.from(LocalDateType.FORMATTER.parse(string)); + } + + @Override + public X unwrap(LocalDate value, Class type, WrapperOptions options) { + + if (value == null) + return null; + + if (String.class.isAssignableFrom(type)) + return (X) LocalDateType.FORMATTER.format(value); + + throw unknownUnwrap(type); + } + + @Override + public LocalDate wrap(X value, WrapperOptions options) { + if (value == null) + return null; + + if(String.class.isInstance(value)) + return LocalDate.from(LocalDateType.FORMATTER.parse((CharSequence) value)); + + throw unknownWrap(value.getClass()); + } +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java new file mode 100644 index 0000000000..c8d37073e8 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java @@ -0,0 +1,34 @@ +package com.baeldung.hibernate.customtypes; + +import org.hibernate.dialect.Dialect; +import org.hibernate.type.AbstractSingleColumnStandardBasicType; +import org.hibernate.type.DiscriminatorType; +import org.hibernate.type.descriptor.java.LocalDateJavaDescriptor; +import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor; + +import java.time.LocalDate; + +public class LocalDateStringType extends AbstractSingleColumnStandardBasicType implements DiscriminatorType { + + public static final LocalDateStringType INSTANCE = new LocalDateStringType(); + + public LocalDateStringType() { + super(VarcharTypeDescriptor.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE); + } + + @Override + public String getName() { + return "LocalDateString"; + } + + @Override + public LocalDate stringToObject(String xml) throws Exception { + return fromString(xml); + } + + @Override + public String objectToSQLString(LocalDate value, Dialect dialect) throws Exception { + return '\'' + toString(value) + '\''; + } + +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/Department.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/Department.java new file mode 100644 index 0000000000..ff94f4f849 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/Department.java @@ -0,0 +1,45 @@ +package com.baeldung.hibernate.entities; + +import java.util.List; + +import javax.persistence.*; + +@Entity +public class Department { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String name; + + @OneToMany(mappedBy="department") + private List employees; + + public Department(String name) { + this.name = name; + } + + 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 getEmployees() { + return employees; + } + + public void setEmployees(List employees) { + this.employees = employees; + } +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java new file mode 100644 index 0000000000..6510e70650 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java @@ -0,0 +1,83 @@ +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; + +@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_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), + @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_UpdateEmployeeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION(:employeeNumber, :newDesignation)", resultClass = DeptEmployee.class) }) +@Entity +public class DeptEmployee { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String employeeNumber; + + private String title; + + private String name; + + @ManyToOne + private Department department; + + public DeptEmployee(String name, String employeeNumber, Department department) { + this.name = name; + this.employeeNumber = employeeNumber; + this.department = department; + } + + public DeptEmployee(String name, String employeeNumber, String title, Department department) { + super(); + this.name = name; + this.employeeNumber = employeeNumber; + this.title = title; + this.department = department; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java new file mode 100644 index 0000000000..cc0c234df0 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java @@ -0,0 +1,35 @@ +package com.baeldung.hibernate.findall; + +import java.util.List; + +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.hibernate.Session; + +import com.baeldung.hibernate.pojo.Student; + +public class FindAll { + + private Session session; + + public FindAll(Session session) { + super(); + this.session = session; + } + + public List findAllWithJpql() { + return session.createQuery("SELECT a FROM Student a", Student.class).getResultList(); + } + + public List findAllWithCriteriaQuery() { + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Student.class); + Root rootEntry = cq.from(Student.class); + CriteriaQuery all = cq.select(rootEntry); + TypedQuery allQuery = session.createQuery(all); + return allQuery.getResultList(); + } +} diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java new file mode 100644 index 0000000000..9b26c117eb --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java @@ -0,0 +1,51 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long studentId; + + private String name; + + private int age; + + public Student() { + } + + public Student(String name, int age) { + this.name = name; + this.age = age; + } + + public long getStudentId() { + return studentId; + } + + public void setStudentId(long studentId) { + this.studentId = studentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + +} diff --git a/persistence-modules/hibernate5-queries/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate5-queries/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..474eeb7a44 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + Hibernate EntityManager Demo + true + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-queries/src/main/resources/init_database.sql b/persistence-modules/hibernate5-queries/src/main/resources/init_database.sql new file mode 100644 index 0000000000..b2848aa256 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/resources/init_database.sql @@ -0,0 +1,10 @@ +CREATE ALIAS UPDATE_EMPLOYEE_DESIGNATION AS $$ +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +@CODE +void updateEmployeeDesignation(final Connection conn, final String employeeNumber, final String title) throws SQLException { + CallableStatement updateStatement = conn.prepareCall("update deptemployee set title = '" + title + "' where employeeNumber = '" + employeeNumber + "'"); + updateStatement.execute(); +} +$$; \ No newline at end of file diff --git a/persistence-modules/hibernate5-queries/src/main/resources/logback.xml b/persistence-modules/hibernate5-queries/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java new file mode 100644 index 0000000000..cb73fe348c --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java @@ -0,0 +1,98 @@ +package com.baeldung.hibernate; + +import com.baeldung.hibernate.entities.Department; +import com.baeldung.hibernate.entities.DeptEmployee; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; +import org.junit.*; + +import java.io.IOException; + +public class NamedQueryIntegrationTest { + private static Session session; + + private Transaction transaction; + + private Long purchaseDeptId; + + @BeforeClass + public static void setUpClass() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-namedquery.properties").openSession(); + } + + @Before + public void setUp() throws IOException { + transaction = session.beginTransaction(); + session.createNativeQuery("delete from deptemployee").executeUpdate(); + session.createNativeQuery("delete from department").executeUpdate(); + Department salesDepartment = new Department("Sales"); + Department purchaseDepartment = new Department("Purchase"); + DeptEmployee employee1 = new DeptEmployee("John Wayne", "001", salesDepartment); + DeptEmployee employee2 = new DeptEmployee("Sarah Vinton", "002", salesDepartment); + DeptEmployee employee3 = new DeptEmployee("Lisa Carter", "003", salesDepartment); + session.persist(salesDepartment); + session.persist(purchaseDepartment); + purchaseDeptId = purchaseDepartment.getId(); + session.persist(employee1); + session.persist(employee2); + session.persist(employee3); + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + if(transaction.isActive()) { + transaction.rollback(); + } + } + + @Test + public void whenNamedQueryIsCalledUsingCreateNamedQuery_ThenOk() { + Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); + query.setParameter("employeeNo", "001"); + DeptEmployee result = query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("John Wayne", result.getName()); + } + + @Test + public void whenNamedNativeQueryIsCalledUsingCreateNamedQuery_ThenOk() { + Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeName", DeptEmployee.class); + query.setParameter("name", "John Wayne"); + DeptEmployee result = query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("001", result.getEmployeeNumber()); + } + + @Test + public void whenNamedNativeQueryIsCalledUsingGetNamedNativeQuery_ThenOk() { + @SuppressWarnings("rawtypes") + NativeQuery query = session.getNamedNativeQuery("DeptEmployee_FindByEmployeeName"); + query.setParameter("name", "John Wayne"); + DeptEmployee result = (DeptEmployee) query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("001", result.getEmployeeNumber()); + } + + @Test + public void whenUpdateQueryIsCalledWithCreateNamedQuery_ThenOk() { + Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDepartment"); + spQuery.setParameter("employeeNo", "001"); + Department newDepartment = session.find(Department.class, purchaseDeptId); + spQuery.setParameter("newDepartment", newDepartment); + spQuery.executeUpdate(); + transaction.commit(); + } + + @Test + public void whenNamedStoredProcedureIsCalledWithCreateNamedQuery_ThenOk() { + Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDesignation"); + spQuery.setParameter("employeeNumber", "002"); + spQuery.setParameter("newDesignation", "Supervisor"); + spQuery.executeUpdate(); + transaction.commit(); + } +} diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java new file mode 100644 index 0000000000..cedba412d9 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java @@ -0,0 +1,89 @@ +package com.baeldung.hibernate.criteriaquery; + +import com.baeldung.hibernate.criteriaquery.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import org.junit.After; +import org.junit.AfterClass; +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 java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + + +public class TypeSafeCriteriaIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() throws IOException { + sessionFactory = HibernateUtil.getSessionFactory(); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenStudentData_whenUsingTypeSafeCriteriaQuery_thenSearchAllStudentsOfAGradYear() { + + prepareData(); + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = cb.createQuery(Student.class); + + Root root = criteriaQuery.from(Student.class); + criteriaQuery.select(root).where(cb.equal(root.get("gradYear"), 1965)); + + Query query = session.createQuery(criteriaQuery); + List results = query.getResultList(); + + assertNotNull(results); + assertEquals(1, results.size()); + + Student student = results.get(0); + + assertEquals("Ken", student.getFirstName()); + assertEquals("Thompson", student.getLastName()); + assertEquals(1965, student.getGradYear()); + } + + private void prepareData() { + Student student1 = new Student(); + student1.setFirstName("Ken"); + student1.setLastName("Thompson"); + student1.setGradYear(1965); + + session.save(student1); + + Student student2 = new Student(); + student2.setFirstName("Dennis"); + student2.setLastName("Ritchie"); + student2.setGradYear(1963); + + session.save(student2); + session.getTransaction().commit(); + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java new file mode 100644 index 0000000000..8a1b9e9791 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung.hibernate.findall; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.pojo.Student; + +public class FindAllUnitTest { + + private Session session; + private Transaction transaction; + + private FindAll findAll; + + @Before + public void setUp() throws IOException { + + session = HibernateUtil.getSessionFactory().openSession(); + transaction = session.beginTransaction(); + findAll = new FindAll(session); + + session.createNativeQuery("delete from Student").executeUpdate(); + + Student student1 = new Student(); + session.persist(student1); + + Student student2 = new Student(); + session.persist(student2); + + Student student3 = new Student(); + session.persist(student3); + + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenCriteriaQuery_WhenFindAll_ThenGetAllPersons() { + List list = findAll.findAllWithCriteriaQuery(); + assertEquals(3, list.size()); + } + + @Test + public void givenJpql_WhenFindAll_ThenGetAllPersons() { + List list = findAll.findAllWithJpql(); + assertEquals(3, list.size()); + } +} diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java new file mode 100644 index 0000000000..13eae3d877 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java @@ -0,0 +1,106 @@ +package com.baeldung.hibernate.queryplancache; + +import com.baeldung.hibernate.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.jpa.QueryHints; +import org.hibernate.query.Query; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.RunnerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +public class QueryPlanCacheBenchmark { + + private static final Logger LOGGER = LoggerFactory.getLogger(QueryPlanCacheBenchmark.class); + + @State(Scope.Thread) + public static class QueryPlanCacheBenchMarkState { + @Param({"1", "2", "3"}) + public int planCacheSize; + + public Session session; + + @Setup + public void stateSetup() throws IOException { + LOGGER.info("State - Setup"); + session = initSession(planCacheSize); + LOGGER.info("State - Setup Complete"); + } + + private Session initSession(int planCacheSize) throws IOException { + Properties properties = HibernateUtil.getProperties(); + properties.put("hibernate.query.plan_cache_max_size", planCacheSize); + properties.put("hibernate.query.plan_parameter_metadata_max_size", planCacheSize); + SessionFactory sessionFactory = HibernateUtil.getSessionFactoryByProperties(properties); + return sessionFactory.openSession(); + } + + @TearDown + public void tearDownState() { + LOGGER.info("State - Teardown"); + SessionFactory sessionFactory = session.getSessionFactory(); + session.close(); + sessionFactory.close(); + LOGGER.info("State - Teardown complete"); + } + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + @Fork(1) + @Warmup(iterations = 2) + @Measurement(iterations = 5) + public void givenQueryPlanCacheSize_thenCompileQueries(QueryPlanCacheBenchMarkState state, Blackhole blackhole) { + + Query query1 = findEmployeesByDepartmentNameQuery(state.session); + Query query2 = findEmployeesByDesignationQuery(state.session); + Query query3 = findDepartmentOfAnEmployeeQuery(state.session); + + blackhole.consume(query1); + blackhole.consume(query2); + blackhole.consume(query3); + + } + + private Query findEmployeesByDepartmentNameQuery(Session session) { + return session.createQuery("SELECT e FROM DeptEmployee e " + + "JOIN e.department WHERE e.department.name = :deptName") + .setMaxResults(30) + .setHint(QueryHints.HINT_FETCH_SIZE, 30); + } + + private Query findEmployeesByDesignationQuery(Session session) { + return session.createQuery("SELECT e FROM DeptEmployee e " + + "WHERE e.title = :designation") + .setHint(QueryHints.SPEC_HINT_TIMEOUT, 1000); + } + + private Query findDepartmentOfAnEmployeeQuery(Session session) { + return session.createQuery("SELECT e.department FROM DeptEmployee e " + + "JOIN e.department WHERE e.employeeNumber = :empId"); + + } + + public static void main(String... args) throws IOException, RunnerException { + //main-class to run the benchmark + org.openjdk.jmh.Main.main(args); + } +} diff --git a/persistence-modules/hibernate5-queries/src/test/resources/hibernate-customtypes.properties b/persistence-modules/hibernate5-queries/src/test/resources/hibernate-customtypes.properties new file mode 100644 index 0000000000..c14782ce0f --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/resources/hibernate-customtypes.properties @@ -0,0 +1,14 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5-queries/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate5-queries/src/test/resources/hibernate-namedquery.properties new file mode 100644 index 0000000000..457f965347 --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/resources/hibernate-namedquery.properties @@ -0,0 +1,9 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate5-queries/src/test/resources/hibernate.properties b/persistence-modules/hibernate5-queries/src/test/resources/hibernate.properties new file mode 100644 index 0000000000..c14782ce0f --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/resources/hibernate.properties @@ -0,0 +1,14 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 diff --git a/persistence-modules/hibernate5-queries/src/test/resources/lifecycle-init.sql b/persistence-modules/hibernate5-queries/src/test/resources/lifecycle-init.sql new file mode 100644 index 0000000000..c0c9a3f34d --- /dev/null +++ b/persistence-modules/hibernate5-queries/src/test/resources/lifecycle-init.sql @@ -0,0 +1,25 @@ +create sequence hibernate_sequence start with 1 increment by 1; + +create table Football_Player ( + id bigint not null, + name varchar(255), + primary key (id) +); + +insert into + Football_Player + (name, id) + values + ('Cristiano Ronaldo', next value for hibernate_sequence); + +insert into + Football_Player + (name, id) + values + ('Lionel Messi', next value for hibernate_sequence); + +insert into + Football_Player + (name, id) + values + ('Gigi Buffon', next value for hibernate_sequence); \ No newline at end of file diff --git a/persistence-modules/hibernate5-queries/src/test/resources/profile.png b/persistence-modules/hibernate5-queries/src/test/resources/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd4e978b96d0f59a6e48692fcb68d1c6c565a20 GIT binary patch literal 1117 zcmV-j1fu(iP)%yyh@V&OYl(_AFwE`D&8)` zPnvkdvc#Z>pRh2kBHk{=qaGfCG;?<;rVe;D+%LyZS~!K}c+|op81YK@rzPHU@Th|m z4Dk`HcojTY;+}_-W%HGqKH@C!LiH8Tp>1lC@aTqoy zBU~QK<}hs@q|M8($ee`o<9#`B3-PL4Y7d9kW#<;n>t}6VNpYCswLrJTtEa_lFwgN$52-_vxvvfJs@B6-OYs%-@M_JTx*UfozG6(Bhs)>w z!pG%vU$b%f++EGa<#Tu1FZ^c#{;G|y5=kM3Y#X^mtSrFA_-o-vX7e_$5-udx(>S4U)i|4)(UJ~zR(vwE+6VTAzoo7wIS|c zh*yt`3wK%<+yX~Z9G1z2GQgf3~qx jc9u$WjpqGof00000NkvXXu0mjfJX<<= literal 0 HcmV?d00001 From 2302a4abb7ee65da888823e0362a65011f95ee8b Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 14:31:36 +0100 Subject: [PATCH 037/530] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 49 +++++++++++++++++++ .../lock/ConcurrentAccessExperiment.java | 40 +++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java new file mode 100644 index 0000000000..7c84c39804 --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java @@ -0,0 +1,49 @@ +package com.baeldung.concurrent.lock; + +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +@State(Scope.Thread) +@Fork(value = 1) +@Warmup(iterations = 0) +public class ConcurrentAccessBenchmark { + ConcurrentAccessExperiment accessMyMap; + static final int SLOTS = 4; + static final int THREADS = 10000; + static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; + + @Param({"Single Lock", "Striped Lock"}) + private String lockType; + + @Param({"HashMap", "ConcurrentHashMap"}) + private String mapType; + + @Setup + public void setup() { + switch (lockType) { + case "Single Lock": + accessMyMap = new SingleLock(); + break; + case "Striped Lock": + accessMyMap = new StripedLock(BUCKETS); + break; + } + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void test() throws InterruptedException { + accessMyMap.doWork(mapType, THREADS, SLOTS); + } +} diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java new file mode 100644 index 0000000000..b1276410ce --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java @@ -0,0 +1,40 @@ +package com.baeldung.concurrent.lock; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; + +import com.google.common.base.Supplier; + +public abstract class ConcurrentAccessExperiment { + + public ConcurrentAccessExperiment() { + } + + private Map doMapSetup(String typeOfMap) { + switch (typeOfMap) { + case "HashMap": + return new HashMap(); + case "ConcurrentHashMap": + return new ConcurrentHashMap(); + } + return null; + } + + public final void doWork(String typeOfMap, int threads, int slots) { + CompletableFuture[] requests = new CompletableFuture[threads * slots]; + Map map = doMapSetup(typeOfMap); + + for (int i = 0; i < threads; i++) { + requests[slots * i + 0] = CompletableFuture.supplyAsync(putSupplier(map, i)); + requests[slots * i + 1] = CompletableFuture.supplyAsync(getSupplier(map, i)); + requests[slots * i + 2] = CompletableFuture.supplyAsync(getSupplier(map, i)); + requests[slots * i + 3] = CompletableFuture.supplyAsync(getSupplier(map, i)); + } + CompletableFuture.allOf(requests).join(); + } + + protected abstract Supplier putSupplier(Map map, int key); + protected abstract Supplier getSupplier(Map map, int key); +} \ No newline at end of file From 407861afac9e1b78ed19206280e3d0f23a7e90b5 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 18:18:05 +0100 Subject: [PATCH 038/530] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 45 ++++++++++--------- .../lock/ConcurrentAccessExperiment.java | 20 ++------- .../baeldung/concurrent/lock/StripedLock.java | 7 +-- 3 files changed, 28 insertions(+), 44 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java index 7c84c39804..4dfbd8ea18 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java @@ -1,5 +1,7 @@ package com.baeldung.concurrent.lock; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; @@ -7,14 +9,12 @@ import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) -@Fork(value = 1) +@Fork(value = 2) @Warmup(iterations = 0) public class ConcurrentAccessBenchmark { ConcurrentAccessExperiment accessMyMap; @@ -22,28 +22,31 @@ public class ConcurrentAccessBenchmark { static final int THREADS = 10000; static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; - @Param({"Single Lock", "Striped Lock"}) - private String lockType; - - @Param({"HashMap", "ConcurrentHashMap"}) - private String mapType; - - @Setup - public void setup() { - switch (lockType) { - case "Single Lock": - accessMyMap = new SingleLock(); - break; - case "Striped Lock": - accessMyMap = new StripedLock(BUCKETS); - break; - } + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void singleLockHashMap() throws InterruptedException { + (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void test() throws InterruptedException { - accessMyMap.doWork(mapType, THREADS, SLOTS); + public void stripedLockHashMap() throws InterruptedException { + (new StripedLock(BUCKETS)).doWork(new HashMap(), THREADS, SLOTS); + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void singleLockConcurrentHashMap() throws InterruptedException { + (new SingleLock()).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + } + + @Benchmark + @BenchmarkMode(Mode.Throughput) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void stripedLockConcurrentHashMap() throws InterruptedException { + (new StripedLock(BUCKETS)).doWork(new ConcurrentHashMap(), THREADS, SLOTS); } } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java index b1276410ce..ec6d3895da 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java @@ -1,30 +1,14 @@ package com.baeldung.concurrent.lock; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; import com.google.common.base.Supplier; public abstract class ConcurrentAccessExperiment { - public ConcurrentAccessExperiment() { - } - - private Map doMapSetup(String typeOfMap) { - switch (typeOfMap) { - case "HashMap": - return new HashMap(); - case "ConcurrentHashMap": - return new ConcurrentHashMap(); - } - return null; - } - - public final void doWork(String typeOfMap, int threads, int slots) { + public final Map doWork(Map map, int threads, int slots) { CompletableFuture[] requests = new CompletableFuture[threads * slots]; - Map map = doMapSetup(typeOfMap); for (int i = 0; i < threads; i++) { requests[slots * i + 0] = CompletableFuture.supplyAsync(putSupplier(map, i)); @@ -33,6 +17,8 @@ public abstract class ConcurrentAccessExperiment { requests[slots * i + 3] = CompletableFuture.supplyAsync(getSupplier(map, i)); } CompletableFuture.allOf(requests).join(); + + return map; } protected abstract Supplier putSupplier(Map map, int key); diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index fad7243bf4..77bf2de7c0 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -10,12 +10,7 @@ public class StripedLock extends ConcurrentAccessExperiment { Striped lock; public StripedLock(int buckets) { - lock = getStripedLock(buckets); - } - - private Striped getStripedLock(int buckets) { - Striped map = Striped.lock(buckets); - return map; + lock = Striped.lock(buckets); } protected synchronized Supplier putSupplier(Map map, int key) { From e09d87a60494ff1f4296fc8c8f11c7ae867d5bf8 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 19:56:30 +0100 Subject: [PATCH 039/530] BAEL-3855 --- .../baeldung/concurrent/lock/SingleLock.java | 24 +++++++------- .../baeldung/concurrent/lock/StripedLock.java | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 8a3106f650..84a82baff2 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -14,30 +14,30 @@ public class SingleLock extends ConcurrentAccessExperiment { protected synchronized Supplier putSupplier(Map map, int key) { return (()-> { - boolean done = false; try { - while(!done) { - done = lock.tryLock(); - } + lock.lock(); map.put("key" + key, "value" + key); + } catch (Exception e) { + this.putSupplier(map, key); } finally { - lock.unlock(); - } + try { + lock.unlock(); + } catch (Exception e) {} } return null; }); } protected synchronized Supplier getSupplier(Map map, int key) { return (()-> { - boolean done = false; try { - while(!done) { - done = lock.tryLock(); - } + lock.lock(); map.get("key" + key); + } catch (Exception e) { + this.getSupplier(map, key); } finally { - lock.unlock(); - } + try { + lock.unlock(); + } catch (Exception e) {} } return null; }); } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index 77bf2de7c0..ac94de6451 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -7,23 +7,25 @@ import com.google.common.base.Supplier; import com.google.common.util.concurrent.Striped; public class StripedLock extends ConcurrentAccessExperiment { - Striped lock; + Striped stripedLock; public StripedLock(int buckets) { - lock = Striped.lock(buckets); + stripedLock = Striped.lock(buckets); } protected synchronized Supplier putSupplier(Map map, int key) { return (()-> { - Lock currentLock = lock.get("key" + key); - boolean done = false; + int bucket = key % stripedLock.size(); + Lock lock = stripedLock.get(bucket); try { - while(!done) { - done = currentLock.tryLock(); - } + lock.tryLock(); map.put("key" + key, "value" + key); + } catch (Exception e) { + this.putSupplier(map, key); } finally { - currentLock.unlock(); + try { + lock.unlock(); + } catch (Exception e) {} } return null; }); @@ -31,15 +33,17 @@ public class StripedLock extends ConcurrentAccessExperiment { protected synchronized Supplier getSupplier(Map map, int key) { return (()-> { - Lock currentLock = lock.get("key" + key); - boolean done = false; + int bucket = key % stripedLock.size(); + Lock lock = stripedLock.get(bucket); try { - while(!done) { - done = currentLock.tryLock(); - } + lock.tryLock(); map.get("key" + key); + } catch (Exception e) { + this.getSupplier(map, key); } finally { - currentLock.unlock(); + try { + lock.unlock(); + } catch (Exception e) {} } return null; }); From e501b2092f1b6872dd9f483800d5e8f9d3148c72 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 20:09:14 +0100 Subject: [PATCH 040/530] BAEL-3855 --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 4 ++-- .../main/java/com/baeldung/concurrent/lock/StripedLock.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 84a82baff2..43c6c3e747 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -12,7 +12,7 @@ public class SingleLock extends ConcurrentAccessExperiment { lock = new ReentrantLock(); } - protected synchronized Supplier putSupplier(Map map, int key) { + protected Supplier putSupplier(Map map, int key) { return (()-> { try { lock.lock(); @@ -27,7 +27,7 @@ public class SingleLock extends ConcurrentAccessExperiment { }); } - protected synchronized Supplier getSupplier(Map map, int key) { + protected Supplier getSupplier(Map map, int key) { return (()-> { try { lock.lock(); diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index ac94de6451..8b661ecedc 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -13,7 +13,7 @@ public class StripedLock extends ConcurrentAccessExperiment { stripedLock = Striped.lock(buckets); } - protected synchronized Supplier putSupplier(Map map, int key) { + protected Supplier putSupplier(Map map, int key) { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); @@ -31,7 +31,7 @@ public class StripedLock extends ConcurrentAccessExperiment { }); } - protected synchronized Supplier getSupplier(Map map, int key) { + protected Supplier getSupplier(Map map, int key) { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); From 880f922df3c4ae9cad08fd3ccb1c1d6f701fbabc Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 11 Mar 2020 20:13:12 +0100 Subject: [PATCH 041/530] BAEL-3855 identation --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 43c6c3e747..9bbac82c6d 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -22,7 +22,8 @@ public class SingleLock extends ConcurrentAccessExperiment { } finally { try { lock.unlock(); - } catch (Exception e) {} } + } catch (Exception e) {} + } return null; }); } @@ -37,7 +38,8 @@ public class SingleLock extends ConcurrentAccessExperiment { } finally { try { lock.unlock(); - } catch (Exception e) {} } + } catch (Exception e) {} + } return null; }); } From 79433c0396ed3a147fecf0aa3d531486ba5b00c8 Mon Sep 17 00:00:00 2001 From: ramkumarvenkat Date: Thu, 12 Mar 2020 07:35:47 +0530 Subject: [PATCH 042/530] Fixed comments --- .../guava/mapmaker/GuavaMapMakerUnitTest.java | 49 +++++++------------ 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java index 36c0cd8493..d9a5fc6cd8 100644 --- a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java @@ -1,50 +1,35 @@ package com.baeldung.guava.mapmaker; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertEquals; - import com.google.common.collect.MapMaker; import org.junit.Test; import java.util.concurrent.ConcurrentMap; +import static org.junit.Assert.assertNotNull; + public class GuavaMapMakerUnitTest { - @Test - public void whenMakeMap_thenCreated() { - ConcurrentMap m = new MapMaker() - .makeMap(); - assertNotNull(m); + @Test public void whenMakeMap_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().makeMap(); + assertNotNull(concurrentMap); } - @Test - public void whenMakeMapWithWeakKeys_thenCreated() { - ConcurrentMap m = new MapMaker() - .weakKeys() - .makeMap(); - assertNotNull(m); + @Test public void whenMakeMapWithWeakKeys_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().weakKeys().makeMap(); + assertNotNull(concurrentMap); } - @Test - public void whenMakeMapWithWeakValues_thenCreated() { - ConcurrentMap m = new MapMaker() - .weakValues() - .makeMap(); - assertNotNull(m); + @Test public void whenMakeMapWithWeakValues_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().weakValues().makeMap(); + assertNotNull(concurrentMap); } - @Test - public void whenMakeMapWithInitialCapacity_thenCreated() { - ConcurrentMap m = new MapMaker() - .initialCapacity(10) - .makeMap(); - assertNotNull(m); + @Test public void whenMakeMapWithInitialCapacity_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().initialCapacity(10).makeMap(); + assertNotNull(concurrentMap); } - @Test - public void whenMakeMapWithConcurrencyLevel_thenCreated() { - ConcurrentMap m = new MapMaker() - .concurrencyLevel(10) - .makeMap(); - assertNotNull(m); + @Test public void whenMakeMapWithConcurrencyLevel_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().concurrencyLevel(10).makeMap(); + assertNotNull(concurrentMap); } } From 0e3a4221fe622b572358ea8a656082f59f190f48 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 13 Mar 2020 16:33:34 +0100 Subject: [PATCH 043/530] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 21 ++++++++++--------- .../baeldung/concurrent/lock/StripedLock.java | 4 ++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java index 4dfbd8ea18..2dcaa5cb53 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java @@ -3,6 +3,7 @@ package com.baeldung.concurrent.lock; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.Map; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -25,28 +26,28 @@ public class ConcurrentAccessBenchmark { @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void singleLockHashMap() throws InterruptedException { - (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); + public Map singleLockHashMap() throws InterruptedException { + return (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void stripedLockHashMap() throws InterruptedException { - (new StripedLock(BUCKETS)).doWork(new HashMap(), THREADS, SLOTS); + public Map stripedLockHashMap() throws InterruptedException { + return (new StripedLock(BUCKETS)).doWork(new HashMap(), THREADS, SLOTS); } - + @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void singleLockConcurrentHashMap() throws InterruptedException { - (new SingleLock()).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + public Map singleLockConcurrentHashMap() throws InterruptedException { + return (new SingleLock()).doWork(new ConcurrentHashMap(), THREADS, SLOTS); } - + @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) - public void stripedLockConcurrentHashMap() throws InterruptedException { - (new StripedLock(BUCKETS)).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + public Map stripedLockConcurrentHashMap() throws InterruptedException { + return (new StripedLock(BUCKETS)).doWork(new ConcurrentHashMap(), THREADS, SLOTS); } } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index 8b661ecedc..46610c3b78 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -15,7 +15,7 @@ public class StripedLock extends ConcurrentAccessExperiment { protected Supplier putSupplier(Map map, int key) { return (()-> { - int bucket = key % stripedLock.size(); + int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { lock.tryLock(); @@ -33,7 +33,7 @@ public class StripedLock extends ConcurrentAccessExperiment { protected Supplier getSupplier(Map map, int key) { return (()-> { - int bucket = key % stripedLock.size(); + int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { lock.tryLock(); From 205ee99874c09154d3416729ca964149a72e57a1 Mon Sep 17 00:00:00 2001 From: Florin Hriscu Date: Fri, 13 Mar 2020 21:25:17 +0200 Subject: [PATCH 044/530] BAEL-3859 Remove unnecessary equals and hashcode overriden methods. --- .../AtomicMarkableReferenceUnitTest.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java index b864c78559..4ac9e53a43 100644 --- a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.concurrent.atomic; -import java.util.Objects; import java.util.concurrent.atomic.AtomicMarkableReference; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -18,24 +17,21 @@ public class AtomicMarkableReferenceUnitTest { this.name = name; } - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof Employee)) - return false; - Employee employee = (Employee) obj; - return id == employee.id && name.equals(employee.name); + public int getId() { + return id; } - @Override - public int hashCode() { - return Objects.hash(id, name); + public void setId(int id) { + this.id = id; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } @Test From f7ae2095371e0c0852724a63c53ea3d14d78367e Mon Sep 17 00:00:00 2001 From: Florin Hriscu Date: Fri, 13 Mar 2020 22:46:41 +0200 Subject: [PATCH 045/530] BAEL-3859 Add type to employeeNode and fix order of parameters in assertEquals method calls. --- .../AtomicMarkableReferenceUnitTest.java | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java index 4ac9e53a43..d83146c6e8 100644 --- a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java @@ -6,8 +6,6 @@ import org.junit.jupiter.api.Test; public class AtomicMarkableReferenceUnitTest { - private AtomicMarkableReference employeeNode; - class Employee { private int id; private String name; @@ -31,19 +29,19 @@ public class AtomicMarkableReferenceUnitTest { public void setName(String name) { this.name = name; - } + } } @Test void givenMarkValueAsTrue_whenUsingIsMarkedMethod_thenMarkValueShouldBeTrue() { - employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), true); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenMarkValueAsFalse_whenUsingIsMarkedMethod_thenMarkValueShouldBeFalse() { - employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), false); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), false); Assertions.assertFalse(employeeNode.isMarked()); } @@ -51,39 +49,39 @@ public class AtomicMarkableReferenceUnitTest { @Test void whenUsingGetReferenceMethod_thenCurrentReferenceShouldBeReturned() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, false); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, false); - Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertEquals(employee, employeeNode.getReference()); } @Test void whenUsingGetMethod_thenCurrentReferenceAndMarkShouldBeReturned() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); boolean[] markHolder = new boolean[1]; Employee currentEmployee = employeeNode.get(markHolder); - Assertions.assertEquals(currentEmployee, employee); + Assertions.assertEquals(employee, currentEmployee); Assertions.assertTrue(markHolder[0]); } @Test void givenNewReferenceAndMark_whenUsingSetMethod_thenCurrentReferenceAndMarkShouldBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); employeeNode.set(newEmployee, false); - Assertions.assertEquals(employeeNode.getReference(), newEmployee); + Assertions.assertEquals(newEmployee, employeeNode.getReference()); Assertions.assertFalse(employeeNode.isMarked()); } @Test void givenTheSameObjectReference_whenUsingAttemptMarkMethod_thenMarkShouldBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Assertions.assertTrue(employeeNode.attemptMark(employee, false)); Assertions.assertFalse(employeeNode.isMarked()); @@ -93,7 +91,7 @@ public class AtomicMarkableReferenceUnitTest { void givenDifferentObjectReference_whenUsingAttemptMarkMethod_thenMarkShouldNotBeUpdated() { Employee employee = new Employee(123, "Mike"); Employee expectedEmployee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Assertions.assertFalse(employeeNode.attemptMark(expectedEmployee, false)); Assertions.assertTrue(employeeNode.isMarked()); @@ -102,88 +100,88 @@ public class AtomicMarkableReferenceUnitTest { @Test void givenCurrentReferenceAndCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertTrue(employeeNode.compareAndSet(employee, newEmployee, true, false)); - Assertions.assertEquals(employeeNode.getReference(), newEmployee); + Assertions.assertEquals(newEmployee, employeeNode.getReference()); Assertions.assertFalse(employeeNode.isMarked()); } @Test void givenNotCurrentReferenceAndCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertFalse(employeeNode.compareAndSet(new Employee(1234, "Steve"), newEmployee, true, false)); - Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertEquals(employee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenCurrentReferenceAndNotCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertFalse(employeeNode.compareAndSet(employee, newEmployee, false, true)); - Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertEquals(employee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenNotCurrentReferenceAndNotCurrentMark_whenUsingCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertFalse(employeeNode.compareAndSet(new Employee(1234, "Steve"), newEmployee, false, true)); - Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertEquals(employee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenCurrentReferenceAndCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertTrue(employeeNode.weakCompareAndSet(employee, newEmployee, true, false)); - Assertions.assertEquals(employeeNode.getReference(), newEmployee); + Assertions.assertEquals(newEmployee, employeeNode.getReference()); Assertions.assertFalse(employeeNode.isMarked()); } @Test void givenNotCurrentReferenceAndCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { Employee expectedEmployee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(expectedEmployee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(expectedEmployee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertFalse(employeeNode.weakCompareAndSet(new Employee(1234, "Steve"), newEmployee, true, false)); - Assertions.assertEquals(employeeNode.getReference(), expectedEmployee); + Assertions.assertEquals(expectedEmployee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenCurrentReferenceAndNotCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { Employee expectedEmployee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(expectedEmployee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(expectedEmployee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertFalse(employeeNode.weakCompareAndSet(expectedEmployee, newEmployee, false, true)); - Assertions.assertEquals(employeeNode.getReference(), expectedEmployee); + Assertions.assertEquals(expectedEmployee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenNotCurrentReferenceAndNotCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { Employee employee = new Employee(123, "Mike"); - employeeNode = new AtomicMarkableReference(employee, true); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertFalse(employeeNode.weakCompareAndSet(new Employee(1234, "Steve"), newEmployee, false, true)); - Assertions.assertEquals(employeeNode.getReference(), employee); + Assertions.assertEquals(employee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } } From 8e3d81fcb962c262bd306bb8e5d1ac6c97566db6 Mon Sep 17 00:00:00 2001 From: chirag d Date: Sat, 14 Mar 2020 12:24:44 +0530 Subject: [PATCH 046/530] BAEL-3901 Clear Site Data Header in Spring Security --- spring-security-modules/pom.xml | 1 + .../spring-security-clear-site-data/pom.xml | 54 +++++++++++++++++++ .../LogoutClearSiteDataController.java | 16 ++++++ .../com/baeldung/SpringSecurityConfig.java | 35 ++++++++++++ .../src/main/java/com/baeldung/WebConfig.java | 19 +++++++ ...LogoutClearSiteDataControllerUnitTest.java | 47 ++++++++++++++++ 6 files changed, 172 insertions(+) create mode 100644 spring-security-modules/spring-security-clear-site-data/pom.xml create mode 100644 spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/LogoutClearSiteDataController.java create mode 100644 spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/SpringSecurityConfig.java create mode 100644 spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/WebConfig.java create mode 100644 spring-security-modules/spring-security-clear-site-data/src/test/java/com/baeldung/LogoutClearSiteDataControllerUnitTest.java diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 49a0db03ed..07c326c10e 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -17,6 +17,7 @@ spring-security-acl spring-security-angular/server spring-security-cache-control + spring-security-clear-site-data spring-security-core spring-security-cors spring-security-kerberos diff --git a/spring-security-modules/spring-security-clear-site-data/pom.xml b/spring-security-modules/spring-security-clear-site-data/pom.xml new file mode 100644 index 0000000000..e58debc0aa --- /dev/null +++ b/spring-security-modules/spring-security-clear-site-data/pom.xml @@ -0,0 +1,54 @@ + + + + 4.0.0 + + com.baeldung + spring-security-clear-site-data + 1.0-SNAPSHOT + spring-security-clear-site-data + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.security + spring-security-web + ${spring.mvc.version} + + + org.springframework.security + spring-security-config + ${spring.mvc.version} + + + org.springframework.security + spring-security-test + ${spring.mvc.version} + test + + + org.springframework + spring-webmvc + ${spring.mvc.version} + + + javax.servlet + javax.servlet-api + ${javax.version} + + + + + + 5.2.2.RELEASE + 4.0.1 + + + diff --git a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/LogoutClearSiteDataController.java b/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/LogoutClearSiteDataController.java new file mode 100644 index 0000000000..d27fa18116 --- /dev/null +++ b/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/LogoutClearSiteDataController.java @@ -0,0 +1,16 @@ +package com.baeldung; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@Controller +public class LogoutClearSiteDataController { + + @GetMapping(value = "/baeldung/logout") + public ResponseEntity logout(@PathVariable String name) { + return ResponseEntity.ok().build(); + } + +} diff --git a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/SpringSecurityConfig.java b/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/SpringSecurityConfig.java new file mode 100644 index 0000000000..fd43fb2c9e --- /dev/null +++ b/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/SpringSecurityConfig.java @@ -0,0 +1,35 @@ +package com.baeldung; + + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.logout.HeaderWriterLogoutHandler; +import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter; + +import static org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive.CACHE; +import static org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive.COOKIES; +import static org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive.STORAGE; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http.csrf() + .disable() + .formLogin() + .loginPage("/login.html") + .loginProcessingUrl("/perform_login") + .defaultSuccessUrl("/homepage.html", true) + .and() + .logout().logoutUrl("/baeldung/logout") + .addLogoutHandler(new HeaderWriterLogoutHandler( + new ClearSiteDataHeaderWriter(CACHE, COOKIES, STORAGE))); + } +} diff --git a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/WebConfig.java b/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/WebConfig.java new file mode 100644 index 0000000000..16826e28b8 --- /dev/null +++ b/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/WebConfig.java @@ -0,0 +1,19 @@ +package com.baeldung; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.mvc.WebContentInterceptor; + +import java.util.concurrent.TimeUnit; + +@EnableWebMvc +@Configuration +@ComponentScan(basePackages = {"com.baeldung"}) +public class WebConfig implements WebMvcConfigurer { +} \ No newline at end of file diff --git a/spring-security-modules/spring-security-clear-site-data/src/test/java/com/baeldung/LogoutClearSiteDataControllerUnitTest.java b/spring-security-modules/spring-security-clear-site-data/src/test/java/com/baeldung/LogoutClearSiteDataControllerUnitTest.java new file mode 100644 index 0000000000..905a866413 --- /dev/null +++ b/spring-security-modules/spring-security-clear-site-data/src/test/java/com/baeldung/LogoutClearSiteDataControllerUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import javax.servlet.Filter; + +@ExtendWith(SpringExtension.class) +@WebAppConfiguration +@ContextConfiguration(classes = {SpringSecurityConfig.class, WebConfig.class}) +public class LogoutClearSiteDataControllerUnitTest { + + @Autowired + private WebApplicationContext wac; + + @Autowired + private Filter springSecurityFilterChain; + + private MockMvc mockMvc; + + @BeforeEach + void setup() throws Exception { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilters(springSecurityFilterChain).build(); + } + + @Test + void whenResponseBody_thenReturnCacheHeader() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders + .get("/baeldung/logout").secure(true)) + .andDo(MockMvcResultHandlers.print()) + .andExpect(MockMvcResultMatchers.status().is(302)) + .andExpect(MockMvcResultMatchers.header() + .string("Clear-Site-Data", "\"cache\", \"cookies\", \"storage\"")); + } + +} From 20ef5cc79928cbc51ed4ff1e4a2f35047c03ee18 Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Sat, 14 Mar 2020 11:52:42 +0100 Subject: [PATCH 047/530] added new section --- java-numbers-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers-3/README.md b/java-numbers-3/README.md index 08e8dae8ef..a331a979ad 100644 --- a/java-numbers-3/README.md +++ b/java-numbers-3/README.md @@ -2,3 +2,4 @@ - [Generating Random Numbers](https://www.baeldung.com/java-generating-random-numbers) - [Convert Double to Long in Java](https://www.baeldung.com/java-convert-double-long) +- [Guide to the Java Number Class](http://inprogress.baeldung.com/?p=180694&preview=true) From 6c78ed9be0dc47684cfb9716b50f405304148258 Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Sat, 14 Mar 2020 12:25:31 +0100 Subject: [PATCH 048/530] REmoved files --- .../spring-boot-hexagonal/README.md | 4 -- .../spring-boot-hexagonal/pom.xml | 52 ------------------- .../main/java/com/baeldung/Application.java | 13 ----- .../adapter/DocumentRepositoryImpl.java | 25 --------- .../baeldung/adapter/DocumentRestAdapter.java | 25 --------- .../java/com/baeldung/domain/Document.java | 23 -------- .../baeldung/domain/port/DocumentRepo.java | 9 ---- .../baeldung/domain/port/DocumentService.java | 11 ---- .../domain/port/impl/DocumentServiceImpl.java | 25 --------- .../src/main/resources/application.properties | 1 - .../com/baeldung/ApplicationUnitTest.java | 16 ------ 11 files changed, 204 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-hexagonal/README.md delete mode 100644 spring-boot-modules/spring-boot-hexagonal/pom.xml delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties delete mode 100644 spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java diff --git a/spring-boot-modules/spring-boot-hexagonal/README.md b/spring-boot-modules/spring-boot-hexagonal/README.md deleted file mode 100644 index 44728b185e..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/README.md +++ /dev/null @@ -1,4 +0,0 @@ -## HEXAGONAL Architecture - -This module contains articles about Hexagonal Architecture implemented via Spring Boot. - diff --git a/spring-boot-modules/spring-boot-hexagonal/pom.xml b/spring-boot-modules/spring-boot-hexagonal/pom.xml deleted file mode 100644 index c4ff36c2cf..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - spring-boot-hexagonal - spring-boot-hexagonal - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - - - - - - spring-boot-hexagonal - - - src/main/resources - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - exec - - - - - - - UTF-8 - - - diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java deleted file mode 100644 index 37dbe7dab8..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/Application.java +++ /dev/null @@ -1,13 +0,0 @@ -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-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java deleted file mode 100644 index 32414442ef..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRepositoryImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.adapter; - -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.Document; -import com.baeldung.domain.port.DocumentRepo; - -import java.util.HashMap; -import java.util.Map; - -@Repository -public class DocumentRepositoryImpl implements DocumentRepo { - - private Map documentMap = new HashMap<>(); - - @Override - public void storeDocument(Document document) { - documentMap.put(document.getId(), document); - } - - @Override - public Document findDocumentById(String id) { - return documentMap.get(id); - } -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java deleted file mode 100644 index 985a5257c0..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/adapter/DocumentRestAdapter.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.adapter; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import com.baeldung.domain.Document; -import com.baeldung.domain.port.DocumentService; - -@RestController -@RequestMapping("/doc") -public class DocumentRestAdapter { - @Autowired - private DocumentService documentService; - - @PostMapping - public void createDocument(@RequestBody Document document) { - documentService.createDocument(document); - } - - @GetMapping("/{id}") - public Document findById(@PathVariable String id) { - return documentService.findById(id); - } - -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java deleted file mode 100644 index 24d0a95071..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/Document.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.domain; - -public class Document { - private String id; - private String data; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java deleted file mode 100644 index 001e3251e4..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentRepo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.domain.port; - -import com.baeldung.domain.Document; - -public interface DocumentRepo { - void storeDocument(Document document); - - Document findDocumentById(String id); -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java deleted file mode 100644 index 009c26c01f..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/DocumentService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.domain.port; - -import com.baeldung.domain.Document; - -public interface DocumentService { - - void createDocument(Document document); - - Document findById(String id); - -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java b/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java deleted file mode 100644 index f5c351406e..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/java/com/baeldung/domain/port/impl/DocumentServiceImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.domain.port.impl; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.domain.Document; -import com.baeldung.domain.port.DocumentRepo; -import com.baeldung.domain.port.DocumentService; - -@Service -public class DocumentServiceImpl implements DocumentService { - - @Autowired - private DocumentRepo documentRepo; - - @Override - public void createDocument(Document document) { - documentRepo.storeDocument(document); - } - - @Override - public Document findById(String id) { - return documentRepo.findDocumentById(id); - } -} diff --git a/spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties b/spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties deleted file mode 100644 index 8b13789179..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java b/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java deleted file mode 100644 index 2ce9b1cf24..0000000000 --- a/spring-boot-modules/spring-boot-hexagonal/src/test/java/com/baeldung/ApplicationUnitTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@SpringBootTest -@RunWith(SpringRunner.class) -class ApplicationUnitTest { - - @Test - public void contextLoads() { - } - -} From 2fca6d60de37440c3e632c61f796134c410dd99d Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Sat, 14 Mar 2020 12:29:22 +0100 Subject: [PATCH 049/530] cleanup --- spring-boot-modules/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 16541408a4..c8d153d4bb 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -53,7 +53,6 @@ spring-boot-springdoc spring-boot-testing spring-boot-vue - spring-boot-hexagonal From 2833ef5bcdea6fd5088504c6b2a1ec4b2618c7f1 Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Sat, 14 Mar 2020 22:07:49 +0200 Subject: [PATCH 050/530] JAVA-911 Need to move existing scala code from java to scala repository --- .gitignore | 2 - core-scala/README.md | 8 - core-scala/pom.xml | 55 ----- .../scala/ControlStructuresDemo.scala | 44 ---- .../scala/com/baeldung/scala/Employee.scala | 27 --- .../scala/com/baeldung/scala/HelloWorld.scala | 6 - .../baeldung/scala/HigherOrderFunctions.scala | 27 --- .../scala/com/baeldung/scala/IntSet.scala | 34 --- .../com/baeldung/scala/PatternMatching.scala | 137 ------------ .../main/scala/com/baeldung/scala/Utils.scala | 33 --- .../scala/ControlStructuresDemoUnitTest.scala | 33 --- .../com/baeldung/scala/EmployeeUnitTest.scala | 30 --- ...HigherOrderFunctionsExamplesUnitTest.scala | 82 ------- .../scala/HigherOrderFunctionsUnitTest.scala | 48 ---- .../com/baeldung/scala/IntSetUnitTest.scala | 21 -- .../scala/PatternMatchingUnitTest.scala | 208 ------------------ .../com/baeldung/scala/UtilsUnitTest.scala | 32 --- .../baeldung/scala/regex/RegexUnitTest.scala | 73 ------ pom.xml | 2 - 19 files changed, 902 deletions(-) delete mode 100644 core-scala/README.md delete mode 100644 core-scala/pom.xml delete mode 100644 core-scala/src/main/scala/com/baeldung/scala/ControlStructuresDemo.scala delete mode 100644 core-scala/src/main/scala/com/baeldung/scala/Employee.scala delete mode 100644 core-scala/src/main/scala/com/baeldung/scala/HelloWorld.scala delete mode 100644 core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala delete mode 100644 core-scala/src/main/scala/com/baeldung/scala/IntSet.scala delete mode 100644 core-scala/src/main/scala/com/baeldung/scala/PatternMatching.scala delete mode 100644 core-scala/src/main/scala/com/baeldung/scala/Utils.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsExamplesUnitTest.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/PatternMatchingUnitTest.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala delete mode 100644 core-scala/src/test/scala/com/baeldung/scala/regex/RegexUnitTest.scala diff --git a/.gitignore b/.gitignore index 729dea62d5..d3a5dae06d 100644 --- a/.gitignore +++ b/.gitignore @@ -73,8 +73,6 @@ ninja/devDb.mv.db **/out-tsc **/nbproject/ **/nb-configuration.xml -core-scala/.cache-main -core-scala/.cache-tests persistence-modules/hibernate5/transaction.log diff --git a/core-scala/README.md b/core-scala/README.md deleted file mode 100644 index 13929ff721..0000000000 --- a/core-scala/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Core Scala - -This module contains articles about Scala's core features - -### Relevant Articles: - -- [Introduction to Scala](https://www.baeldung.com/scala-intro) -- [Regular Expressions in Scala](https://www.baeldung.com/scala/regular-expressions) diff --git a/core-scala/pom.xml b/core-scala/pom.xml deleted file mode 100644 index d72727dd39..0000000000 --- a/core-scala/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - core-scala - 1.0-SNAPSHOT - core-scala - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.scala-lang - scala-library - ${scala.version} - - - - - src/main/scala - src/test/scala - - - net.alchim31.maven - scala-maven-plugin - ${scala.plugin.version} - - - - compile - testCompile - - - - -dependencyfile - ${project.build.directory}/.scala_dependencies - - - - - - - - - - 2.12.7 - 3.3.2 - - - diff --git a/core-scala/src/main/scala/com/baeldung/scala/ControlStructuresDemo.scala b/core-scala/src/main/scala/com/baeldung/scala/ControlStructuresDemo.scala deleted file mode 100644 index 7c1281e573..0000000000 --- a/core-scala/src/main/scala/com/baeldung/scala/ControlStructuresDemo.scala +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.scala - -/** - * Sample code demonstrating the various control structured. - * - * @author Chandra Prakash - * - */ -object ControlStructuresDemo { - def gcd(x : Int, y : Int) : Int = { - if (y == 0) x else gcd(y, x % y) - } - - def gcdIter(x : Int, y : Int) : Int = { - var a = x - var b = y - while (b > 0) { - a = a % b - val t = a - a = b - b = t - } - a - } - - def rangeSum(a : Int, b : Int) = { - var sum = 0; - for (i <- a to b) { - sum += i - } - sum - } - - def factorial(a : Int) : Int = { - var result = 1; - var i = 1; - do { - result *= i - i = i + 1 - } while (i <= a) - result - } - -} \ No newline at end of file diff --git a/core-scala/src/main/scala/com/baeldung/scala/Employee.scala b/core-scala/src/main/scala/com/baeldung/scala/Employee.scala deleted file mode 100644 index 9291d958b3..0000000000 --- a/core-scala/src/main/scala/com/baeldung/scala/Employee.scala +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.scala - -/** - * Sample Code demonstrating a class. - * - * @author Chandra Prakash - * - */ -class Employee(val name : String, - var salary : Int, - annualIncrement : Int = 20) { - - def incrementSalary() : Unit = { - salary += annualIncrement - } - - override def toString = - s"Employee(name=$name, salary=$salary)" -} - -/** - * A Trait which will make the toString return upper case value. - */ -trait UpperCasePrinter { - override def toString: String = super.toString toUpperCase -} - diff --git a/core-scala/src/main/scala/com/baeldung/scala/HelloWorld.scala b/core-scala/src/main/scala/com/baeldung/scala/HelloWorld.scala deleted file mode 100644 index b3f0ce09a5..0000000000 --- a/core-scala/src/main/scala/com/baeldung/scala/HelloWorld.scala +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.scala - -object HelloWorld extends App { - println("Hello World!") - args foreach println -} diff --git a/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala b/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala deleted file mode 100644 index 02c41a5f8c..0000000000 --- a/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.scala - -/** - * Sample higher order functions. - * - * @author Chandra Prakash - * - */ -object HigherOrderFunctions { - - def mapReduce(r : (Int, Int) => Int, - i : Int, - m : Int => Int, - a : Int, b : Int): Int = { - def iter(a : Int, result : Int) : Int = { - if (a > b) result - else iter(a + 1, r(m(a), result)) - } - iter(a, i) - } - - def whileLoop(condition : => Boolean)(body : => Unit) : Unit = - if (condition) { - body - whileLoop(condition)(body) - } -} \ No newline at end of file diff --git a/core-scala/src/main/scala/com/baeldung/scala/IntSet.scala b/core-scala/src/main/scala/com/baeldung/scala/IntSet.scala deleted file mode 100644 index f1a5722a4e..0000000000 --- a/core-scala/src/main/scala/com/baeldung/scala/IntSet.scala +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.scala - -/** - * An abstract class for set of integers and its implementation. - * - * @author Chandra Prakash - * - */ -abstract class IntSet { - // add an element to the set - def incl(x : Int) : IntSet - - // whether an element belongs to the set - def contains(x : Int) : Boolean -} - -class EmptyIntSet extends IntSet { - - def contains(x : Int) : Boolean = false - - def incl(x : Int) = - new NonEmptyIntSet(x, this) -} - -class NonEmptyIntSet(val head : Int, val tail : IntSet) - extends IntSet { - - def contains(x : Int) : Boolean = - head == x || (tail contains x) - - def incl(x : Int) : IntSet = - if (this contains x) this - else new NonEmptyIntSet(x, this) -} \ No newline at end of file diff --git a/core-scala/src/main/scala/com/baeldung/scala/PatternMatching.scala b/core-scala/src/main/scala/com/baeldung/scala/PatternMatching.scala deleted file mode 100644 index 71458237d6..0000000000 --- a/core-scala/src/main/scala/com/baeldung/scala/PatternMatching.scala +++ /dev/null @@ -1,137 +0,0 @@ -package com.baeldung.scala - -// Case Class -abstract class Animal - -case class Mammal(name: String, fromSea: Boolean) extends Animal - -case class Bird(name: String) extends Animal - -case class Fish(name: String) extends Animal - -// Sealed Class -sealed abstract class CardSuit - -case class Spike() extends CardSuit - -case class Diamond() extends CardSuit - -case class Heart() extends CardSuit - -case class Club() extends CardSuit - -object Person { - def apply(fullName: String) = fullName - - def unapply(fullName: String): Option[String] = { - if (!fullName.isEmpty) - Some(fullName.replaceAll("(?<=\\w)(\\w+)", ".")) - else - None - } -} - -class PatternMatching { - - def caseClassesPatternMatching(animal: Animal): String = { - animal match { - case Mammal(name, fromSea) => s"I'm a $name, a kind of mammal. Am I from the sea? $fromSea" - case Bird(name) => s"I'm a $name, a kind of bird" - case _ => "I'm an unknown animal" - } - } - - def constantsPatternMatching(constant: Any): String = { - constant match { - case 0 => "I'm equal to zero" - case 4.5d => "I'm a double" - case false => "I'm the contrary of true" - case _ => s"I'm unknown and equal to $constant" - } - } - - def sequencesPatternMatching(sequence: Any): String = { - sequence match { - case List(singleElement) => s"I'm a list with one element: $singleElement" - case List(_, _*) => s"I'm a list with one or multiple elements: $sequence" - case Vector(1, 2, _*) => s"I'm a vector: $sequence" - case _ => s"I'm an unrecognized sequence. My value: $sequence" - } - } - - def tuplesPatternMatching(tuple: Any): String = { - tuple match { - case (first, second) => s"I'm a tuple with two elements: $first & $second" - case (first, second, third) => s"I'm a tuple with three elements: $first & $second & $third" - case _ => s"Unrecognized pattern. My value: $tuple" - } - } - - def typedPatternMatching(any: Any): String = { - any match { - case string: String => s"I'm a string. My value: $string" - case integer: Int => s"I'm an integer. My value: $integer" - case _ => s"I'm from an unknown type. My value: $any" - } - } - - def regexPatterns(toMatch: String): String = { - val numeric = """([0-9]+)""".r - val alphabetic = """([a-zA-Z]+)""".r - val alphanumeric = """([a-zA-Z0-9]+)""".r - - toMatch match { - case numeric(value) => s"I'm a numeric with value $value" - case alphabetic(value) => s"I'm an alphabetic with value $value" - case alphanumeric(value) => s"I'm an alphanumeric with value $value" - case _ => s"I contain other characters than alphanumerics. My value $toMatch" - } - } - - def optionsPatternMatching(option: Option[String]): String = { - option match { - case Some(value) => s"I'm not an empty option. Value $value" - case None => "I'm an empty option" - } - } - - def patternGuards(toMatch: Any, maxLength: Int): String = { - toMatch match { - case list: List[Any] if (list.size <= maxLength) => "List is of acceptable size" - case list: List[Any] => "List has not an acceptable size" - case string: String if (string.length <= maxLength) => "String is of acceptable size" - case string: String => "String has not an acceptable size" - case _ => "Input is neither a List or a String" - } - } - - def sealedClass(cardSuit: CardSuit): String = { - cardSuit match { - case Spike() => "Card is spike" - case Club() => "Card is club" - case Heart() => "Card is heart" - case Diamond() => "Card is diamond" - } - } - - def extractors(person: Any): String = { - person match { - case Person(initials) => s"My initials are $initials" - case _ => "Could not extract initials" - } - } - - def closuresPatternMatching(list: List[Any]): List[Any] = { - list.collect { case i: Int if (i < 10) => i } - } - - def catchBlocksPatternMatching(exception: Exception): String = { - try { - throw exception - } catch { - case ex: IllegalArgumentException => "It's an IllegalArgumentException" - case ex: RuntimeException => "It's a RuntimeException" - case _ => "It's an unknown kind of exception" - } - } -} \ No newline at end of file diff --git a/core-scala/src/main/scala/com/baeldung/scala/Utils.scala b/core-scala/src/main/scala/com/baeldung/scala/Utils.scala deleted file mode 100644 index 20bc413646..0000000000 --- a/core-scala/src/main/scala/com/baeldung/scala/Utils.scala +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.scala - -/** - * Some utility methods. - * - * @author Chandra Prakash - * - */ -object Utils { - def average(x : Double, y : Double): Double = (x + y) / 2 - - def randomLessThan(d : Double): Double = { - var random = 0d - do { - random = Math.random() - } while (random >= d) - random - } - - def power(x : Int, y : Int) : Int = { - def powNested(i : Int, accumulator : Int) : Int = { - if (i <= 0) accumulator - else powNested(i - 1, x * accumulator) - } - powNested(y, 1) - } - - def fibonacci(n : Int) : Int = n match { - case 0 | 1 => 1 - case x if x > 1 => - fibonacci(x - 1) + fibonacci(x - 2) - } -} \ No newline at end of file diff --git a/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala deleted file mode 100644 index 584038ee2c..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.scala - -import com.baeldung.scala.ControlStructuresDemo._ -import org.junit.Assert.assertEquals -import org.junit.Test - -class ControlStructuresDemoUnitTest { - @Test - def givenTwoIntegers_whenGcdCalled_thenCorrectValueReturned() = { - assertEquals(3, gcd(15, 27)) - } - - @Test - def givenTwoIntegers_whenGcdIterCalled_thenCorrectValueReturned() = { - assertEquals(3, gcdIter(15, 27)) - } - - @Test - def givenTwoIntegers_whenRangeSumcalled_thenCorrectValueReturned() = { - assertEquals(55, rangeSum(1, 10)) - } - - @Test - def givenPositiveInteger_whenFactorialInvoked_thenCorrectValueReturned() = { - assertEquals(720, factorial(6)) - } - - @Test - def whenFactorialOf0Invoked_then1Returned() = { - assertEquals(1, factorial(0)) - } - -} \ No newline at end of file diff --git a/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala deleted file mode 100644 index 0828752a8a..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.scala - -import org.junit.Assert.assertEquals -import org.junit.Test - -class EmployeeUnitTest { - - @Test - def whenEmployeeSalaryIncremented_thenCorrectSalary() = { - val employee = new Employee("John Doe", 1000) - employee.incrementSalary() - assertEquals(1020, employee.salary) - } - - @Test - def givenEmployee_whenToStringCalled_thenCorrectStringReturned() = { - val employee = new Employee("John Doe", 1000) - assertEquals("Employee(name=John Doe, salary=1000)", employee.toString) - } - - @Test - def givenEmployeeWithTrait_whenToStringCalled_thenCorrectStringReturned() = { - val employee = - new Employee("John Doe", 1000) with UpperCasePrinter - assertEquals("EMPLOYEE(NAME=JOHN DOE, SALARY=1000)", employee.toString) - } - -} - - diff --git a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsExamplesUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsExamplesUnitTest.scala deleted file mode 100644 index cb43266a48..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsExamplesUnitTest.scala +++ /dev/null @@ -1,82 +0,0 @@ -package com.baeldung.scala - -import org.junit.Assert.assertEquals -import org.junit.Test - - -class HigherOrderFunctionsExamplesUnitTest { - - @Test - def whenCallingMapWithAnonymousFunction_thenTransformationIsApplied() = { - val expected = Seq("sir Alex Ferguson", "sir Bobby Charlton", "sir Frank Lampard") - - val names = Seq("Alex Ferguson", "Bobby Charlton", "Frank Lampard") - val sirNames = names.map(name => "sir " + name) - - assertEquals(expected, sirNames) - } - - @Test - def whenCallingMapWithDefined_thenTransformationIsApplied() = { - val expected = Seq("sir Alex Ferguson", "sir Bobby Charlton", "sir Frank Lampard") - - val names = Seq("Alex Ferguson", "Bobby Charlton", "Frank Lampard") - - def prefixWithSir(name: String) = "sir " + name - val sirNames = names.map(prefixWithSir) - - assertEquals(expected, sirNames) - } - - @Test - def whenCallingFilter_thenUnecessaryElementsAreRemoved() = { - val expected = Seq("John O'Shea", "John Hartson") - - val names = Seq("John O'Shea", "Aiden McGeady", "John Hartson") - val johns = names.filter(name => name.matches("^John .*")) - - assertEquals(expected, johns) - } - - @Test - def whenCallingReduce_thenProperSumIsCalculated() = { - val expected = 2750 - - val earnings = Seq(1000, 1300, 450) - val sumEarnings = earnings.reduce((acc, x) => acc + x) - - assertEquals(expected, sumEarnings) - } - - @Test - def whenCallingFold_thenNumberOfWordsShouldBeCalculated() = { - val expected = 6 - - val strings = Seq("bunch of words", "just me", "it") - val sumEarnings = strings.foldLeft(0)((acc, x) => acc + x.split(" ").size) - - assertEquals(expected, sumEarnings) - } - - @Test - def whenCallingOwnHigherOrderFunction_thenProperFunctionIsReturned() = { - def mathOperation(name: String): (Int, Int) => Int = (x: Int, y: Int) => { - name match { - case "addition" => x + y - case "multiplication" => x * y - case "division" => x/y - case "subtraction" => x - y - } - } - - def add: (Int, Int) => Int = mathOperation("addition") - def mul: (Int, Int) => Int = mathOperation("multiplication") - def div: (Int, Int) => Int = mathOperation("division") - def sub: (Int, Int) => Int = mathOperation("subtraction") - - assertEquals(15, add(10, 5)) - assertEquals(50, mul(10, 5)) - assertEquals(2, div(10, 5)) - assertEquals(5, sub(10, 5)) - } -} \ No newline at end of file diff --git a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala deleted file mode 100644 index 240c879d7f..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.scala - -import com.baeldung.scala.HigherOrderFunctions.mapReduce -import org.junit.Assert.assertEquals -import org.junit.Test - -class HigherOrderFunctionsUnitTest { - - @Test - def whenCalledWithSumAndSquareFunctions_thenCorrectValueReturned() = { - def square(x : Int) = x * x - - def sum(x : Int, y : Int) = x + y - - def sumSquares(a : Int, b : Int) = - mapReduce(sum, 0, square, a, b) - - assertEquals(385, sumSquares(1, 10)) - } - - @Test - def whenComputingSumOfSquaresWithAnonymousFunctions_thenCorrectValueReturned() = { - def sumSquares(a : Int, b : Int) = - mapReduce((x, y) => x + y, 0, x => x * x, a, b) - - assertEquals(385, sumSquares(1, 10)) - } - - @Test - def givenCurriedFunctions_whenInvoked_thenCorrectValueReturned() = { - // a curried function - def sum(f : Int => Int)(a : Int, - b : Int) : Int = - if (a > b) 0 else f(a) + sum(f)(a + 1, b) - - // another curried function - def mod(n : Int)(x : Int) = x % n - - // application of a curried function - assertEquals(1, mod(5)(6)) - - // partial application of curried function - // trailing underscore is required to make function type explicit - val sumMod5 = sum(mod(5)) _ - - assertEquals(10, sumMod5(6, 10)) - } -} \ No newline at end of file diff --git a/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala deleted file mode 100644 index ac27389d70..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.scala - -import org.junit.Assert.assertFalse -import org.junit.Test - -class IntSetUnitTest { - - @Test - def givenSetof1To10_whenContains11Called_thenFalse() = { - - // Set up a set containing integers 1 to 10. - val set1To10 = - Range(1, 10) - .foldLeft(new EmptyIntSet() : IntSet) { - (x, y) => x incl y - } - - assertFalse(set1To10 contains 11) - } - -} \ No newline at end of file diff --git a/core-scala/src/test/scala/com/baeldung/scala/PatternMatchingUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/PatternMatchingUnitTest.scala deleted file mode 100644 index 21a2f0e871..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/PatternMatchingUnitTest.scala +++ /dev/null @@ -1,208 +0,0 @@ -package com.baeldung.scala - -import java.io.FileNotFoundException - -import org.junit.Assert.assertEquals -import org.junit.Test - -class PatternMatchingUnitTest { - @Test - def whenAMammalIsGivenToTheMatchExpression_ThenItsRecognizedAsMammal(): Unit = { - val result = new PatternMatching().caseClassesPatternMatching(Mammal("Lion", fromSea = false)) - assertEquals("I'm a Lion, a kind of mammal. Am I from the sea? false", result) - } - - @Test - def whenABirdIsGivenToTheMatchExpression_ThenItsRecognizedAsBird(): Unit = { - val result = new PatternMatching().caseClassesPatternMatching(Bird("Pigeon")) - assertEquals("I'm a Pigeon, a kind of bird", result) - } - - @Test - def whenAnUnkownAnimalIsGivenToTheMatchExpression_TheDefaultClauseIsUsed(): Unit = { - val result = new PatternMatching().caseClassesPatternMatching(Fish("Tuna")) - assertEquals("I'm an unknown animal", result) - } - - @Test - def whenTheConstantZeroIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().constantsPatternMatching(0) - assertEquals("I'm equal to zero", result) - } - - @Test - def whenFourAndAHalfIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().constantsPatternMatching(4.5d) - assertEquals("I'm a double", result) - } - - @Test - def whenTheBooleanFalseIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().constantsPatternMatching(false) - assertEquals("I'm the contrary of true", result) - } - - @Test - def whenAnUnkownConstantIsPassed_ThenTheDefaultPatternIsUsed(): Unit = { - val result = new PatternMatching().constantsPatternMatching(true) - assertEquals("I'm unknown and equal to true", result) - } - - @Test - def whenASingleElementListIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().sequencesPatternMatching(List("String")) - assertEquals("I'm a list with one element: String", result) - } - - @Test - def whenAMultipleElementsListIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().sequencesPatternMatching(List("Multiple", "Elements")) - assertEquals("I'm a list with one or multiple elements: List(Multiple, Elements)", result) - } - - @Test - def whenAVectorBeginningWithOneAndTwoIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().sequencesPatternMatching(Vector(1, 2, 3)) - assertEquals("I'm a vector: Vector(1, 2, 3)", result) - } - - @Test - def whenANotMatchingVectorIsPassed_ThenItShouldntMatchAndEnterTheDefaultClause(): Unit = { - val result = new PatternMatching().sequencesPatternMatching(Vector(2, 1)) - assertEquals("I'm an unrecognized sequence. My value: Vector(2, 1)", result) - } - - @Test - def whenAnEmptyListIsPassed_ThenItShouldntMatchAndEnterTheDefaultClause(): Unit = { - val result = new PatternMatching().sequencesPatternMatching(List()) - assertEquals("I'm an unrecognized sequence. My value: List()", result) - } - - @Test - def whenATwoElementsTupleIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().tuplesPatternMatching(("First", "Second")) - assertEquals("I'm a tuple with two elements: First & Second", result) - } - - @Test - def whenAThreeElementsTupleIsPassed_ThenItMatchesTheCorrespondingPattern(): Unit = { - val result = new PatternMatching().tuplesPatternMatching(("First", "Second", "Third")) - assertEquals("I'm a tuple with three elements: First & Second & Third", result) - } - - @Test - def whenAnoterKindOfTupleIsPassed_ThenItShouldntMatchAndReturnTheDefaultPattern(): Unit = { - val result = new PatternMatching().tuplesPatternMatching(("First")) - assertEquals("Unrecognized pattern. My value: First", result) - } - - @Test - def whenAStringConsistingOfNumericsOnlyIsPassed_ThenItShouldMatchTheNumericRegex(): Unit = { - val result = new PatternMatching().regexPatterns("123") - assertEquals("I'm a numeric with value 123", result) - } - - @Test - def whenAStringConsistignOfAlphabeticsOnlyIsPassed_ThenItShouldMatchTheAlphabeticRegex(): Unit = { - val result = new PatternMatching().regexPatterns("abc") - assertEquals("I'm an alphabetic with value abc", result) - } - - @Test - def whenAStringConsistignOfAlphanumericsOnlyIsPassed_ThenItShouldMatchTheAlphanumericRegex(): Unit = { - val result = new PatternMatching().regexPatterns("abc123") - assertEquals("I'm an alphanumeric with value abc123", result) - } - - @Test - def whenAnotherTypeOfStringIsPassed_ThenItShouldntMatchAndReturnTheDefaultPattern(): Unit = { - val result = new PatternMatching().regexPatterns("abc_123") - assertEquals("I contain other characters than alphanumerics. My value abc_123", result) - } - - @Test - def whenAFilledOptionIsPassed_ThenItShouldMatchTheSomeClause(): Unit = { - val result = new PatternMatching().optionsPatternMatching(Option.apply("something")) - assertEquals("I'm not an empty option. Value something", result) - } - - @Test - def whenAnEmptyOptionIsPassed_ThenItShouldMatchTheNoneClause(): Unit = { - val result = new PatternMatching().optionsPatternMatching(Option.empty) - assertEquals("I'm an empty option", result) - } - - @Test - def whenAListWithAcceptedSizeIsPassed_ThenThePositiveMessageIsSent(): Unit = { - val result = new PatternMatching().patternGuards(List(1, 2), 3) - assertEquals("List is of acceptable size", result) - } - - @Test - def whenAListWithAnUnacceptedSizeIsPassed_ThenTheNegativeMessageIsSent(): Unit = { - val result = new PatternMatching().patternGuards(List(1, 2, 3, 4), 3) - assertEquals("List has not an acceptable size", result) - } - - @Test - def whenAStringWithAcceptedSizeIsPassed_ThenThePositiveMessageIsSent(): Unit = { - val result = new PatternMatching().patternGuards("OK", 3) - assertEquals("String is of acceptable size", result) - } - - @Test - def whenAStringWithAnUnacceptedSizeIsPassed_ThenTheNegativeMessageIsSent(): Unit = { - val result = new PatternMatching().patternGuards("Not OK", 3) - assertEquals("String has not an acceptable size", result) - } - - @Test - def whenAnObjectWhichIsNotAListOrAStringIsPassed_thenTheDefaultClauseIsUsed(): Unit = { - val result = new PatternMatching().patternGuards(1, 1) - assertEquals("Input is neither a List or a String", result) - } - - @Test - def whenACardSuitIsPassed_ThenTheCorrespondingMatchCaseClauseIsUsed(): Unit = { - assertEquals("Card is spike", new PatternMatching().sealedClass(Spike())) - assertEquals("Card is club", new PatternMatching().sealedClass(Club())) - assertEquals("Card is heart", new PatternMatching().sealedClass(Heart())) - assertEquals("Card is diamond", new PatternMatching().sealedClass(Diamond())) - } - - @Test - def whenAnObjectWithExtractorIsPassed_ThenTheExtractedValueIsUsedInTheCaseClause(): Unit = { - val person = Person("John Smith") - val result = new PatternMatching().extractors(person) - assertEquals("My initials are J. S.", result) - } - - @Test - def whenAnObjectWithExtractorIsPassed_AndTheValueIsEmpty_ThenTheDefaultCaseClauseIsUsed(): Unit = { - val person = Person("") - val result = new PatternMatching().extractors(person) - assertEquals("Could not extract initials", result) - } - - @Test - def whenAListOfRandomElementsIsPassed_ThenOnlyTheIntegersBelowTenAreReturned(): Unit = { - val input = List(1, 2, "5", 11, true) - val result = new PatternMatching().closuresPatternMatching(input) - assertEquals(List(1, 2), result) - } - - @Test - def whenAnExceptionIsPassed_ThenTheCorrespondingMessageIsReturned(): Unit = { - val pm = new PatternMatching() - - val iae = new IllegalArgumentException() - val re = new RuntimeException() - val fnfe = new FileNotFoundException() - - assertEquals("It's an IllegalArgumentException", pm.catchBlocksPatternMatching(iae)) - assertEquals("It's a RuntimeException", pm.catchBlocksPatternMatching(re)) - assertEquals("It's an unknown kind of exception", pm.catchBlocksPatternMatching(fnfe)) - } -} - - diff --git a/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala deleted file mode 100644 index e4995201d8..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.scala - -import com.baeldung.scala.Utils.{average, fibonacci, power, randomLessThan} -import org.junit.Assert.{assertEquals, assertTrue} -import org.junit.Test - -class UtilsUnitTest { - - @Test - def whenAverageCalled_thenCorrectValueReturned(): Unit = { - assertEquals(15.0, average(10, 20), 1e-5) - } - - @Test - def whenRandomLessThanInvokedWithANumber_thenARandomLessThanItReturned: Unit = { - val d = 0.1 - assertTrue(randomLessThan(d) < d) - } - - @Test - def whenPowerInvokedWith2And3_then8Returned: Unit = { - assertEquals(8, power(2, 3)) - } - - @Test - def whenFibonacciCalled_thenCorrectValueReturned: Unit = { - assertEquals(1, fibonacci(0)) - assertEquals(1, fibonacci(1)) - assertEquals(fibonacci(6), - fibonacci(4) + fibonacci(5)) - } -} \ No newline at end of file diff --git a/core-scala/src/test/scala/com/baeldung/scala/regex/RegexUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/regex/RegexUnitTest.scala deleted file mode 100644 index 27ed9e1172..0000000000 --- a/core-scala/src/test/scala/com/baeldung/scala/regex/RegexUnitTest.scala +++ /dev/null @@ -1,73 +0,0 @@ -package com.baeldung.scala.regex - -import org.junit.Test -import org.junit.Assert.assertEquals - -class RegexUnitTest { - private val polishPostalCode = "([0-9]{2})\\-([0-9]{3})".r - private val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r - private val timestampUnanchored = timestamp.unanchored - - @Test - def givenRegularExpression_whenCallingFindFirstIn_thenShouldFindCorrectMatches(): Unit = { - val postCode = polishPostalCode.findFirstIn("Warsaw 01-011, Jerusalem Avenue") - assertEquals(Some("01-011"), postCode) - } - - @Test - def givenRegularExpression_whenCallingFindFirstMatchIn_thenShouldFindCorrectMatches(): Unit = { - val postCodes = polishPostalCode.findFirstMatchIn("Warsaw 01-011, Jerusalem Avenue") - assertEquals(Some("011"), for (m <- postCodes) yield m.group(2)) - } - - @Test - def givenRegularExpression_whenCallingFindAllIn_thenShouldFindCorrectMatches(): Unit = { - val postCodes = polishPostalCode.findAllIn("Warsaw 01-011, Jerusalem Avenue, Cracow 30-059, Mickiewicza Avenue") - .toList - assertEquals(List("01-011", "30-059"), postCodes) - - polishPostalCode.findAllIn("Warsaw 01-011, Jerusalem Avenue, Cracow 30-059, Mickiewicza Avenue") - } - - @Test - def givenRegularExpression_whenCallingFindAlMatchlIn_thenShouldFindCorrectMatches(): Unit = { - val postCodes = polishPostalCode.findAllMatchIn("Warsaw 01-011, Jerusalem Avenue, Cracow 30-059, Mickiewicza Avenue") - .toList - val postalDistricts = for (m <- postCodes) yield m.group(1) - assertEquals(List("01", "30"), postalDistricts) - } - - @Test - def givenRegularExpression_whenExtractingValues_thenShouldExtractCorrectValues(): Unit = { - val description = "11:34:01.411" match { - case timestamp(hour, minutes, _, _) => s"It's $minutes minutes after $hour" - } - - assertEquals("It's 34 minutes after 11", description) - } - - @Test - def givenUnanchoredRegularExpression_whenExtractingValues_thenShouldExtractCorrectValues(): Unit = { - val description = "Timestamp: 11:34:01.411 error appeared" match { - case timestampUnanchored(hour, minutes, _, _) => s"It's $minutes minutes after $hour" - } - - assertEquals("It's 34 minutes after 11", description) - } - - @Test - def givenRegularExpression_whenCallingReplaceAllIn_thenShouldReplaceText(): Unit = { - val minutes = timestamp.replaceAllIn("11:34:01.311", m => m.group(2)) - - assertEquals("34", minutes) - } - - @Test - def givenRegularExpression_whenCallingReplaceAllInWithMatcher_thenShouldReplaceText(): Unit = { - val secondsThatDayInTotal = timestamp.replaceAllIn("11:34:01.311", _ match { - case timestamp(hours, minutes, seconds, _) => s"$hours-$minutes" - }) - - assertEquals("11-34", secondsThatDayInTotal) - } -} diff --git a/pom.xml b/pom.xml index 6a78faca23..84b1d31c61 100644 --- a/pom.xml +++ b/pom.xml @@ -394,7 +394,6 @@ core-java-modules core-kotlin-modules - core-scala couchbase custom-pmd @@ -907,7 +906,6 @@ core-java-modules core-kotlin-modules - core-scala couchbase custom-pmd From 2eded212580b3e810a79561a3adc227f633bc8ec Mon Sep 17 00:00:00 2001 From: Vikas Ramsingh Rajput Date: Sat, 14 Mar 2020 23:17:58 +0300 Subject: [PATCH 051/530] BAEL-3832: Difference between BeanFactory and ApplicationContext completed --- spring-core-3/pom.xml | 7 + .../bean/CustomBeanFactoryPostProcessor.java | 16 ++ .../bean/CustomBeanPostProcessor.java | 17 +++ .../baeldung/ioccontainer/bean/Student.java | 12 ++ .../ioccontainer/IOCContainerAppTest.java | 137 ++++++++++++++++++ .../ioc-container-difference-example.xml | 11 ++ 6 files changed, 200 insertions(+) create mode 100644 spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java create mode 100644 spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java create mode 100644 spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java create mode 100644 spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppTest.java create mode 100644 spring-core-3/src/test/resources/ioc-container-difference-example.xml diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml index 205259e8e4..d1163a174c 100644 --- a/spring-core-3/pom.xml +++ b/spring-core-3/pom.xml @@ -67,6 +67,12 @@ ${junit-jupiter.version} test + + + log4j + log4j + ${log4j.version} + @@ -83,6 +89,7 @@ 2.22.1 1.3.2 2.2.2.RELEASE + 1.2.17 \ No newline at end of file diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java new file mode 100644 index 0000000000..d6e2c92144 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java @@ -0,0 +1,16 @@ +package com.baeldung.ioccontainer.bean; + +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; + +public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor { + static final Logger LOGGER = LogManager.getLogger(CustomBeanPostProcessor.class.getName()); + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + LOGGER.info("BeanFactoryPostProcessor is Registered"); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java new file mode 100644 index 0000000000..bf34453388 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java @@ -0,0 +1,17 @@ +package com.baeldung.ioccontainer.bean; + +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; + +public class CustomBeanPostProcessor implements BeanPostProcessor { + + static final Logger LOGGER = LogManager.getLogger(CustomBeanPostProcessor.class.getName()); + + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + LOGGER.info("BeanPostProcessor is Registered Before Initialization"); + return bean; + } + +} diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java new file mode 100644 index 0000000000..e32b4ecc29 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java @@ -0,0 +1,12 @@ +package com.baeldung.ioccontainer.bean; + +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; + +public class Student { + static final Logger LOGGER = LogManager.getLogger(Student.class.getName()); + + public void postConstruct() { + LOGGER.info("Student Bean is initialized"); + } +} diff --git a/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppTest.java b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppTest.java new file mode 100644 index 0000000000..b97aa08f80 --- /dev/null +++ b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppTest.java @@ -0,0 +1,137 @@ +package com.baeldung.ioccontainer; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.LoggingEvent; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +import com.baeldung.ioccontainer.bean.CustomBeanFactoryPostProcessor; +import com.baeldung.ioccontainer.bean.CustomBeanPostProcessor; +import com.baeldung.ioccontainer.bean.Student; + +public class IOCContainerAppTest { + + private LogAppender logAppender; + private List loggingEvents; + + @BeforeEach + public void initializeLogAppender() { + logAppender = new LogAppender(); + Logger.getRootLogger() + .addAppender(logAppender); + loggingEvents = logAppender.events; + } + + @AfterEach + public void removeLogAppender() { + Logger.getRootLogger() + .removeAppender(logAppender); + } + + @Test + public void whenBFInitialized_thenNoStudentLogPrinted() { + Resource res = new ClassPathResource("ioc-container-difference-example.xml"); + BeanFactory factory = new XmlBeanFactory(res); + + String expected = "Student Bean is initialized"; + assertFalse(checkWhetherLoggerContains(expected)); + } + + @Test + public void whenBFInitialized_thenStudentLogPrinted() { + + Resource res = new ClassPathResource("ioc-container-difference-example.xml"); + BeanFactory factory = new XmlBeanFactory(res); + Student student = (Student) factory.getBean("student"); + + String expected = "Student Bean is initialized"; + assertTrue(checkWhetherLoggerContains(expected)); + } + + @Test + public void whenAppContInitialized_thenStudentObjInitialized() { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml"); + + String expected = "Student Bean is initialized"; + assertTrue(checkWhetherLoggerContains(expected)); + } + + @Test + public void whenBFInitialized_thenBFPProcessorAndBPProcessorNotRegAutomatically() { + Resource res = new ClassPathResource("ioc-container-difference-example.xml"); + ConfigurableListableBeanFactory factory = new XmlBeanFactory(res); + + String beanFactoryPostProcessorExpectedLog = "BeanFactoryPostProcessor is Registered"; + assertFalse(checkWhetherLoggerContains(beanFactoryPostProcessorExpectedLog)); + + String beanPostProcessorExpectedLog = "BeanPostProcessor is Registered Before Initialization"; + assertFalse(checkWhetherLoggerContains(beanPostProcessorExpectedLog)); + } + + @Test + public void whenAppContInitialized_thenBFPostProcessorAndBPostProcessorRegisteredAutomatically() { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml"); + + String beanFactoryPostProcessorExpectedLog = "BeanFactoryPostProcessor is Registered"; + assertTrue(checkWhetherLoggerContains(beanFactoryPostProcessorExpectedLog)); + + String beanPostProcessorExpectedLog = "BeanPostProcessor is Registered Before Initialization"; + assertTrue(checkWhetherLoggerContains(beanPostProcessorExpectedLog)); + } + + @Test + public void whenBFPostProcessorAndBPProcessorRegisteredManually_thenReturnTrue() { + Resource res = new ClassPathResource("ioc-container-difference-example.xml"); + ConfigurableListableBeanFactory factory = new XmlBeanFactory(res); + + CustomBeanFactoryPostProcessor beanFactoryPostProcessor = new CustomBeanFactoryPostProcessor(); + beanFactoryPostProcessor.postProcessBeanFactory(factory); + String beanFactoryPostProcessorExpectedLog = "BeanFactoryPostProcessor is Registered"; + assertTrue(checkWhetherLoggerContains(beanFactoryPostProcessorExpectedLog)); + + CustomBeanPostProcessor beanPostProcessor = new CustomBeanPostProcessor(); + factory.addBeanPostProcessor(beanPostProcessor); + Student student = (Student) factory.getBean("student"); + String beanPostProcessorExpectedLog = "BeanPostProcessor is Registered Before Initialization"; + assertTrue(checkWhetherLoggerContains(beanPostProcessorExpectedLog)); + } + + private boolean checkWhetherLoggerContains(String expectedLogMessge) { + boolean isLogExist = loggingEvents.stream() + .anyMatch(logEvent -> logEvent.getMessage() + .equals(expectedLogMessge)); + return isLogExist; + } + + public static class LogAppender extends AppenderSkeleton { + public List events = new ArrayList(); + + public void close() { + } + + public boolean requiresLayout() { + return false; + } + + @Override + protected void append(LoggingEvent event) { + events.add(event); + } + + } +} diff --git a/spring-core-3/src/test/resources/ioc-container-difference-example.xml b/spring-core-3/src/test/resources/ioc-container-difference-example.xml new file mode 100644 index 0000000000..9bb01efe66 --- /dev/null +++ b/spring-core-3/src/test/resources/ioc-container-difference-example.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file From e2b7e620a607241bf3d89f8e85b5b0ff8bc2c6d2 Mon Sep 17 00:00:00 2001 From: Mathieu Fortin Date: Sat, 14 Mar 2020 18:58:02 -0400 Subject: [PATCH 052/530] BAEL-3806 fixed integration test --- .../consumer/ConsumerFooServiceIntegrationTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java index b7ed031ec7..9d04541f8d 100644 --- a/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java +++ b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java @@ -52,14 +52,13 @@ public class ConsumerFooServiceIntegrationTest { .map(Arrays::stream) .orElse(Stream.empty()); }) - .map(IThrowableProxy::getMessage) + .map(IThrowableProxy::getClassName) .collect(Collectors.toList()); assertThat(allLoggedEntries).anyMatch(entry -> entry.contains("The following error happened on processFoo method!")) .anyMatch(entry -> entry.contains("| onSubscribe")) .anyMatch(entry -> entry.contains("| cancel()")); - assertThat(allSuppressedEntries).anyMatch(entry -> entry.contains("Assembly trace from producer")) - .anyMatch(entry -> entry.contains("Error has been observed by the following operator(s)")); + assertThat(allSuppressedEntries) + .anyMatch(entry -> entry.contains("reactor.core.publisher.FluxOnAssembly$OnAssemblyException")); } - } From 5ad0170cb6423a462d1f7d685ff51c8b8992ede0 Mon Sep 17 00:00:00 2001 From: Vikas Ramsingh Rajput Date: Sun, 15 Mar 2020 10:04:16 +0300 Subject: [PATCH 053/530] BAEL-3832: renamed the unit test case as per the naming convention --- .../{IOCContainerAppTest.java => IOCContainerAppUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-core-3/src/test/java/com/baeldung/ioccontainer/{IOCContainerAppTest.java => IOCContainerAppUnitTest.java} (99%) diff --git a/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppTest.java b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java similarity index 99% rename from spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppTest.java rename to spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java index b97aa08f80..66b6842d0f 100644 --- a/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppTest.java +++ b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java @@ -24,7 +24,7 @@ import com.baeldung.ioccontainer.bean.CustomBeanFactoryPostProcessor; import com.baeldung.ioccontainer.bean.CustomBeanPostProcessor; import com.baeldung.ioccontainer.bean.Student; -public class IOCContainerAppTest { +public class IOCContainerAppUnitTest { private LogAppender logAppender; private List loggingEvents; From d2d2a890fac064b3fcb48ffcb09fd1ceb0a13b2d Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:37:57 +0530 Subject: [PATCH 054/530] JAVA-4: renamed to hibernate-annotations, moved couple of articles --- .../hibernate5-annotations/README.md | 8 +- .../config/HibernateAnnotationUtil.java | 34 +++++ .../main/HibernateManyisOwningSide.java | 71 +++++++++++ .../HibernateOneToManyAnnotationMain.java | 60 +++++++++ .../main/HibernateOneisOwningSide.java | 67 ++++++++++ .../hibernate/oneToMany/model/Cart.java | 43 +++++++ .../hibernate/oneToMany/model/CartOIO.java | 42 +++++++ .../hibernate/oneToMany/model/Items.java | 50 ++++++++ .../hibernate/oneToMany/model/ItemsOIO.java | 47 +++++++ .../hibernate/wherejointable/Group.java | 56 +++++++++ .../hibernate/wherejointable/User.java | 74 +++++++++++ .../wherejointable/UserGroupRelation.java | 31 +++++ .../wherejointable/UserGroupRole.java | 7 ++ ...neToManyAnnotationMainIntegrationTest.java | 95 ++++++++++++++ ...ibernateWhereJoinTableIntegrationTest.java | 118 ++++++++++++++++++ 15 files changed, 799 insertions(+), 4 deletions(-) create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java create mode 100644 persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java create mode 100644 persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java create mode 100644 persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java diff --git a/persistence-modules/hibernate5-annotations/README.md b/persistence-modules/hibernate5-annotations/README.md index da3c5ad1fd..2813dbdda3 100644 --- a/persistence-modules/hibernate5-annotations/README.md +++ b/persistence-modules/hibernate5-annotations/README.md @@ -1,10 +1,10 @@ -## Hibernate 5 +## Hibernate Annotations -This module contains articles about Hibernate 5. +This module contains articles about Hibernate Annotations. ### Relevant Articles: - [Custom Types in Hibernate and the @Type Annotation](https://www.baeldung.com/hibernate-custom-types) -- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) - [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column) - [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) - +- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) +- [Hibernate @WhereJoinTable Annotation](https://www.baeldung.com/hibernate-wherejointable) diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java new file mode 100644 index 0000000000..46e6824f42 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java @@ -0,0 +1,34 @@ +package com.baeldung.hibernate.oneToMany.config; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +public class HibernateAnnotationUtil { + + private static SessionFactory sessionFactory; + + private static SessionFactory buildSessionFactory() { + try { + // Create the SessionFactory from hibernate-annotation.cfg.xml + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("hibernate-annotation.cfg.xml").build(); + Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build(); + SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build(); + + return sessionFactory; + + } catch (Throwable ex) { + System.err.println("Initial SessionFactory creation failed." + ex); + ex.printStackTrace(); + throw new ExceptionInInitializerError(ex); + } + } + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) + sessionFactory = buildSessionFactory(); + return sessionFactory; + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java new file mode 100644 index 0000000000..372fb2fc07 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java @@ -0,0 +1,71 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Items; +import com.baeldung.hibernate.oneToMany.model.ItemsOIO; + +public class HibernateManyisOwningSide { + public static void main(String[] args) { + + Cart cart = new Cart(); + Cart cart2 = new Cart(); + + Items item1 = new Items(cart); + Items item2 = new Items(cart2); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + + + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(cart2); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + session = sessionFactory.getCurrentSession(); + tx = session.beginTransaction(); + + item1 = (Items) session.get(Items.class, new Long(1)); + item2 = (Items) session.get(Items.class, new Long(2)); + tx.commit(); + + + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCart() + .getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCart() + .getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java new file mode 100644 index 0000000000..2bc5e514f7 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java @@ -0,0 +1,60 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Items; + +public class HibernateOneToManyAnnotationMain { + + public static void main(String[] args) { + + Cart cart = new Cart(); + + Items item1 = new Items(cart); + Items item2 = new Items(cart); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + System.out.println("Cart ID=" + cart.getId()); + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java new file mode 100644 index 0000000000..0777664dd0 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java @@ -0,0 +1,67 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.CartOIO; +import com.baeldung.hibernate.oneToMany.model.ItemsOIO; + +public class HibernateOneisOwningSide { + public static void main(String[] args) { + + CartOIO cart = new CartOIO(); + CartOIO cart2 = new CartOIO(); + + ItemsOIO item1 = new ItemsOIO(cart); + ItemsOIO item2 = new ItemsOIO(cart2); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(cart2); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + + session = sessionFactory.getCurrentSession(); + tx = session.beginTransaction(); + item1 = (ItemsOIO) session.get(ItemsOIO.class, new Long(1)); + item2 = (ItemsOIO) session.get(ItemsOIO.class, new Long(2)); + tx.commit(); + + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCartOIO() + .getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCartOIO() + .getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java new file mode 100644 index 0000000000..b8b991831e --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java @@ -0,0 +1,43 @@ +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; + +@Entity +@Table(name = "CART") +public class Cart { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "cart_id") + private long id; + + + @OneToMany(mappedBy = "cart") + private Set items; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + + public Set getItems() { + return items; + } + + public void setItems(Set items) { + this.items = items; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java new file mode 100644 index 0000000000..8a5ed5e7a4 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java @@ -0,0 +1,42 @@ +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; + + + +@Entity +@Table(name = "CARTOIO") +public class CartOIO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @OneToMany + @JoinColumn(name = "cart_id") // we need to duplicate the physical information + private Set items; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Set getItems() { + return items; + } + + public void setItems(Set items) { + this.items = items; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java new file mode 100644 index 0000000000..f63a4855b5 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java @@ -0,0 +1,50 @@ +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; + +@Entity +@Table(name = "ITEMS") +public class Items { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + + @ManyToOne + @JoinColumn(name = "cart_id", nullable = false) + private Cart cart; + + // Hibernate requires no-args constructor + public Items() { + } + + public Items(Cart c) { + this.cart = c; + } + + public Cart getCart() { + return cart; + } + + public void setCart(Cart cart) { + this.cart = cart; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java new file mode 100644 index 0000000000..a3d6a796c5 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java @@ -0,0 +1,47 @@ +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; + +@Entity +@Table(name = "ITEMSOIO") +public class ItemsOIO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @ManyToOne + @JoinColumn(name = "cart_id", insertable = false, updatable = false) + private CartOIO cart; + + // Hibernate requires no-args constructor + public ItemsOIO() { + } + + public ItemsOIO(CartOIO c) { + this.cart = c; + } + + public CartOIO getCartOIO() { + return cart; + } + + public void setCartOIO(CartOIO cart) { + this.cart = cart; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java new file mode 100644 index 0000000000..04684eceac --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java @@ -0,0 +1,56 @@ +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; + +@Entity(name = "e_group") +public class Group { + + @Id + @GeneratedValue + private Long id; + + private String name; + + @ManyToMany(mappedBy = "groups") + private List users = new ArrayList<>(); + + public Group(String name) { + this.name = name; + } + + 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 getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + @Override + public String toString() { + return "Group [name=" + name + "]"; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java new file mode 100644 index 0000000000..7fc077eeb2 --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java @@ -0,0 +1,74 @@ +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 org.hibernate.annotations.WhereJoinTable; + +@Entity +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + + @ManyToMany + @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) + private List groups = new ArrayList<>(); + + @WhereJoinTable(clause = "role='MODERATOR'") + @ManyToMany + @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) + private List moderatorGroups = new ArrayList<>(); + + public User(String name) { + this.name = name; + } + + 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 getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } + + public void setModeratorGroups(List moderatorGroups) { + this.moderatorGroups = moderatorGroups; + } + + public List getModeratorGroups() { + return moderatorGroups; + } + + @Override + public String toString() { + return "User [name=" + name + "]"; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java new file mode 100644 index 0000000000..00dd19699c --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java @@ -0,0 +1,31 @@ +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; + +@Entity(name = "r_user_group") +public class UserGroupRelation implements Serializable { + + @Id + @Column(name = "user_id", insertable = false, updatable = false) + private final Long userId; + + @Id + @Column(name = "group_id", insertable = false, updatable = false) + private final Long groupId; + + @Enumerated(EnumType.STRING) + private final UserGroupRole role; + + public UserGroupRelation(Long userId, Long groupId, UserGroupRole role) { + this.userId = userId; + this.groupId = groupId; + this.role = role; + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java new file mode 100644 index 0000000000..62d9cb28ea --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java @@ -0,0 +1,7 @@ +package com.baeldung.hibernate.wherejointable; + +public enum UserGroupRole { + + MEMBER, MODERATOR + +} diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java new file mode 100644 index 0000000000..3bc5a6e12a --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java @@ -0,0 +1,95 @@ +package com.baeldung.hibernate.oneToMany.main; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.dialect.H2Dialect; +import org.hibernate.service.ServiceRegistry; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Items; + +public class HibernateOneToManyAnnotationMainIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + public HibernateOneToManyAnnotationMainIntegrationTest() { + } + + @BeforeClass + public static void beforeTests() { + Configuration configuration = new Configuration().addAnnotatedClass(Cart.class).addAnnotatedClass(Items.class) + .setProperty("hibernate.dialect", H2Dialect.class.getName()) + .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName()) + .setProperty("hibernate.connection.url", "jdbc:h2:mem:test") + .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "") + .setProperty("hibernate.hbm2ddl.auto", "update"); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()).build(); + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenSession_checkIfDatabaseIsEmpty() { + Cart cart = (Cart) session.get(Cart.class, new Long(1)); + assertNull(cart); + + } + + @Test + public void givenSession_checkIfDatabaseIsPopulated_afterCommit() { + Cart cart = new Cart(); + Set cartItems = new HashSet<>(); + cartItems = cart.getItems(); + Assert.assertNull(cartItems); + Items item1 = new Items(); + item1.setCart(cart); + assertNotNull(item1); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + assertNotNull(itemsSet); + cart.setItems(itemsSet); + assertNotNull(cart); + session.persist(cart); + session.getTransaction().commit(); + session.close(); + + session = sessionFactory.openSession(); + session.beginTransaction(); + cart = (Cart) session.get(Cart.class, new Long(1)); + assertNotNull(cart); + } + + @After + public void tearDown() { + session.getTransaction().commit(); + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } + +} diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java new file mode 100644 index 0000000000..93783216ce --- /dev/null +++ b/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java @@ -0,0 +1,118 @@ +package com.baeldung.hibernate.wherejointable; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.dialect.H2Dialect; +import org.hibernate.service.ServiceRegistry; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class HibernateWhereJoinTableIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + /** + * Test data + */ + private User user1; + private User user2; + private User user3; + private Group group1; + private Group group2; + + @BeforeClass + public static void beforeTests() { + Configuration configuration = new Configuration().addAnnotatedClass(User.class) + .addAnnotatedClass(Group.class) + .addAnnotatedClass(UserGroupRelation.class) + .setProperty("hibernate.dialect", H2Dialect.class.getName()) + .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName()) + .setProperty("hibernate.connection.url", "jdbc:h2:mem:test") + .setProperty("hibernate.connection.username", "sa") + .setProperty("hibernate.connection.password", "") + .setProperty("hibernate.hbm2ddl.auto", "update"); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()) + .build(); + + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + + user1 = new User("user1"); + user2 = new User("user2"); + user3 = new User("user3"); + + group1 = new Group("group1"); + group2 = new Group("group2"); + + session.save(group1); + session.save(group2); + + session.save(user1); + session.save(user2); + session.save(user3); + + saveRelation(user1, group1, UserGroupRole.MODERATOR); + saveRelation(user2, group1, UserGroupRole.MODERATOR); + saveRelation(user3, group1, UserGroupRole.MEMBER); + + saveRelation(user1, group2, UserGroupRole.MEMBER); + saveRelation(user2, group2, UserGroupRole.MODERATOR); + } + + @After + public void tearDown() { + session.getTransaction().commit(); + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } + + @Test + public void givenUser1_getGroups_returnsAllGroups() { + List groups = user1.getGroups(); + assertEquals(2, groups.size()); + + assertTrue(groups.contains(group1)); + assertTrue(groups.contains(group2)); + } + + @Test + public void givenUser1_getModeratorGroups_returnsOnlyModeratorGroups() { + List groups = user1.getModeratorGroups(); + assertEquals(1, groups.size()); + + assertTrue(groups.contains(group1)); + } + + private void saveRelation(User user, Group group, UserGroupRole role) { + UserGroupRelation relation = new UserGroupRelation(user.getId(), group.getId(), role); + + session.save(relation); + session.flush(); + session.refresh(user); + session.refresh(group); + } + +} From 12a7e6fdf92f47a451fe64a66fc5bd22176fdae6 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:48:26 +0530 Subject: [PATCH 055/530] JAVA-4: Renamed hibernate5-annotations to hibernate-annotations --- .../README.md | 0 .../pom.xml | 4 ++-- .../java/com/baeldung/hibernate/HibernateUtil.java | 0 .../hibernate/UnsupportedTenancyException.java | 0 .../com/baeldung/hibernate/customtypes/Address.java | 0 .../baeldung/hibernate/customtypes/AddressType.java | 0 .../customtypes/LocalDateStringJavaDescriptor.java | 0 .../hibernate/customtypes/LocalDateStringType.java | 0 .../hibernate/customtypes/OfficeEmployee.java | 0 .../baeldung/hibernate/customtypes/PhoneNumber.java | 0 .../hibernate/customtypes/PhoneNumberType.java | 0 .../com/baeldung/hibernate/customtypes/Salary.java | 0 .../customtypes/SalaryCurrencyConvertor.java | 0 .../baeldung/hibernate/customtypes/SalaryType.java | 0 .../com/baeldung/hibernate/joincolumn/Email.java | 0 .../com/baeldung/hibernate/joincolumn/Office.java | 0 .../hibernate/joincolumn/OfficeAddress.java | 0 .../hibernate/joincolumn/OfficialEmployee.java | 0 .../oneToMany/config/HibernateAnnotationUtil.java | 0 .../oneToMany/main/HibernateManyisOwningSide.java | 0 .../main/HibernateOneToManyAnnotationMain.java | 0 .../oneToMany/main/HibernateOneisOwningSide.java | 0 .../baeldung/hibernate/oneToMany/model/Cart.java | 0 .../baeldung/hibernate/oneToMany/model/CartOIO.java | 0 .../baeldung/hibernate/oneToMany/model/Items.java | 0 .../hibernate/oneToMany/model/ItemsOIO.java | 0 .../java/com/baeldung/hibernate/pojo/Phone.java | 0 .../baeldung/hibernate/wherejointable/Group.java | 0 .../com/baeldung/hibernate/wherejointable/User.java | 0 .../hibernate/wherejointable/UserGroupRelation.java | 0 .../hibernate/wherejointable/UserGroupRole.java | 0 .../src/main/resources/META-INF/persistence.xml | 0 .../src/main/resources/logback.xml | 0 .../customtypes/HibernateCustomTypesManualTest.java | 0 .../joincolumn/JoinColumnIntegrationTest.java | 0 ...rnateOneToManyAnnotationMainIntegrationTest.java | 0 .../HibernateWhereJoinTableIntegrationTest.java | 0 .../src/test/resources/hibernate-spatial.properties | 0 .../src/test/resources/log4j.xml | 0 .../src/test/resources/log4j2.xml | 0 .../src/test/resources/logback.xml | 0 .../src/test/resources/profile.png | Bin 42 files changed, 2 insertions(+), 2 deletions(-) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/README.md (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/pom.xml (96%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/HibernateUtil.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/Address.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/Salary.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/joincolumn/Email.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/joincolumn/Office.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/pojo/Phone.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/wherejointable/Group.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/wherejointable/User.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/resources/META-INF/persistence.xml (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/main/resources/logback.xml (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/resources/hibernate-spatial.properties (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/resources/log4j.xml (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/resources/log4j2.xml (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/resources/logback.xml (100%) rename persistence-modules/{hibernate5-annotations => hibernate-annotations}/src/test/resources/profile.png (100%) diff --git a/persistence-modules/hibernate5-annotations/README.md b/persistence-modules/hibernate-annotations/README.md similarity index 100% rename from persistence-modules/hibernate5-annotations/README.md rename to persistence-modules/hibernate-annotations/README.md diff --git a/persistence-modules/hibernate5-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml similarity index 96% rename from persistence-modules/hibernate5-annotations/pom.xml rename to persistence-modules/hibernate-annotations/pom.xml index ab242333fe..5367921f31 100644 --- a/persistence-modules/hibernate5-annotations/pom.xml +++ b/persistence-modules/hibernate-annotations/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - hibernate5-annotations + hibernate-annotations 0.1-SNAPSHOT - hibernate5-annotations + hibernate-annotations jar Hibernate tutorial illustrating the use of named parameters diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/HibernateUtil.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Email.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/Office.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficeAddress.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/joincolumn/OfficialEmployee.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/pojo/Phone.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/Group.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/User.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java diff --git a/persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java rename to persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java diff --git a/persistence-modules/hibernate5-annotations/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/resources/META-INF/persistence.xml rename to persistence-modules/hibernate-annotations/src/main/resources/META-INF/persistence.xml diff --git a/persistence-modules/hibernate5-annotations/src/main/resources/logback.xml b/persistence-modules/hibernate-annotations/src/main/resources/logback.xml similarity index 100% rename from persistence-modules/hibernate5-annotations/src/main/resources/logback.xml rename to persistence-modules/hibernate-annotations/src/main/resources/logback.xml diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java rename to persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesManualTest.java diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java rename to persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java rename to persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java diff --git a/persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java rename to persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/resources/hibernate-spatial.properties rename to persistence-modules/hibernate-annotations/src/test/resources/hibernate-spatial.properties diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/log4j.xml b/persistence-modules/hibernate-annotations/src/test/resources/log4j.xml similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/resources/log4j.xml rename to persistence-modules/hibernate-annotations/src/test/resources/log4j.xml diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/log4j2.xml b/persistence-modules/hibernate-annotations/src/test/resources/log4j2.xml similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/resources/log4j2.xml rename to persistence-modules/hibernate-annotations/src/test/resources/log4j2.xml diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/logback.xml b/persistence-modules/hibernate-annotations/src/test/resources/logback.xml similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/resources/logback.xml rename to persistence-modules/hibernate-annotations/src/test/resources/logback.xml diff --git a/persistence-modules/hibernate5-annotations/src/test/resources/profile.png b/persistence-modules/hibernate-annotations/src/test/resources/profile.png similarity index 100% rename from persistence-modules/hibernate5-annotations/src/test/resources/profile.png rename to persistence-modules/hibernate-annotations/src/test/resources/profile.png From 5f8123f80493e8c85a09db24075146bd6c8f1715 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:50:17 +0530 Subject: [PATCH 056/530] JAVA-4: Renamed hibernate5-enterprise to hibernate-enterprise --- .../README.md | 5 ++--- .../pom.xml | 4 ++-- .../java/com/baeldung/hibernate/HibernateUtil.java | 0 .../hibernate/UnsupportedTenancyException.java | 0 .../hibernate/exception/EntityWithNoId.java | 0 .../baeldung/hibernate/exception/HibernateUtil.java | 0 .../com/baeldung/hibernate/exception/Product.java | 0 .../com/baeldung/hibernate/logging/Employee.java | 0 .../com/baeldung/hibernate/pojo/PointEntity.java | 0 .../com/baeldung/hibernate/pojo/PolygonEntity.java | 0 .../java/com/baeldung/hibernate/pojo/Student.java | 0 .../com/baeldung/hibernateparameters/Event.java | 0 .../src/main/resources/META-INF/persistence.xml | 0 .../com/baeldung/hibernateparameters/Event.hbm.xml | 0 .../src/main/resources/hibernate-logging.cfg.xml | 0 .../src/main/resources/hibernate.cfg.xml | 0 .../src/main/resources/init_database.sql | 0 .../src/main/resources/logback.xml | 0 .../hibernate/HibernateSpatialIntegrationTest.java | 0 .../AggregateFunctionsIntegrationTest.java | 0 .../exception/HibernateExceptionUnitTest.java | 0 .../logging/HibernateLoggingIntegrationTest.java | 0 .../com/baeldung/hibernate/multitenancy/Car.java | 0 .../multitenancy/MultitenancyIntegrationTest.java | 0 ...DatabaseApproachMultitenancyIntegrationTest.java | 0 .../database/MapMultiTenantConnectionProvider.java | 0 .../multitenancy/database/TenantIdNames.java | 0 .../SchemaApproachMultitenancyIntegrationTest.java | 0 .../schema/SchemaMultiTenantConnectionProvider.java | 0 .../multitenancy/schema/TenantIdNames.java | 0 .../hibernateparameters/NamedParameterUnitTest.java | 0 .../hibernate-database-multitenancy.properties | 0 .../resources/hibernate-database-mydb1.properties | 0 .../resources/hibernate-database-mydb2.properties | 0 .../test/resources/hibernate-exception.properties | 0 .../hibernate-schema-multitenancy.properties | 0 .../src/test/resources/hibernate-spatial.properties | 0 .../src/test/resources/hibernate.properties | 0 .../src/test/resources/lifecycle-init.sql | 0 .../src/test/resources/profile.png | Bin 40 files changed, 4 insertions(+), 5 deletions(-) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/README.md (77%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/pom.xml (96%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/HibernateUtil.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/exception/Product.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/logging/Employee.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernate/pojo/Student.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/java/com/baeldung/hibernateparameters/Event.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/resources/META-INF/persistence.xml (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/resources/hibernate-logging.cfg.xml (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/resources/hibernate.cfg.xml (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/resources/init_database.sql (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/main/resources/logback.xml (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/Car.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/hibernate-database-multitenancy.properties (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/hibernate-database-mydb1.properties (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/hibernate-database-mydb2.properties (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/hibernate-exception.properties (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/hibernate-schema-multitenancy.properties (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/hibernate-spatial.properties (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/hibernate.properties (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/lifecycle-init.sql (100%) rename persistence-modules/{hibernate5-enterprise => hibernate-enterprise}/src/test/resources/profile.png (100%) diff --git a/persistence-modules/hibernate5-enterprise/README.md b/persistence-modules/hibernate-enterprise/README.md similarity index 77% rename from persistence-modules/hibernate5-enterprise/README.md rename to persistence-modules/hibernate-enterprise/README.md index 994d8f062a..c48092e6a2 100644 --- a/persistence-modules/hibernate5-enterprise/README.md +++ b/persistence-modules/hibernate-enterprise/README.md @@ -1,6 +1,6 @@ -## Hibernate 5 +## Hibernate Enterprise -This module contains articles about Hibernate 5. +This module contains articles about Hibernate. ### Relevant articles: @@ -9,5 +9,4 @@ This module contains articles about Hibernate 5. - [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions) - [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions) - [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set) -- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode) - [Various Logging Levels in Hibernate](https://www.baeldung.com/hibernate-logging-levels) \ No newline at end of file diff --git a/persistence-modules/hibernate5-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml similarity index 96% rename from persistence-modules/hibernate5-enterprise/pom.xml rename to persistence-modules/hibernate-enterprise/pom.xml index f12bb7e081..060cb4c904 100644 --- a/persistence-modules/hibernate5-enterprise/pom.xml +++ b/persistence-modules/hibernate-enterprise/pom.xml @@ -3,9 +3,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - hibernate5-enterprise + hibernate-enterprise 0.0.1-SNAPSHOT - hibernate5-enterprise + hibernate-enterprise com.baeldung diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/HibernateUtil.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/logging/Employee.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/pojo/Student.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java rename to persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernateparameters/Event.java diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-enterprise/src/main/resources/META-INF/persistence.xml similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/resources/META-INF/persistence.xml rename to persistence-modules/hibernate-enterprise/src/main/resources/META-INF/persistence.xml diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml b/persistence-modules/hibernate-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml rename to persistence-modules/hibernate-enterprise/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate-logging.cfg.xml b/persistence-modules/hibernate-enterprise/src/main/resources/hibernate-logging.cfg.xml similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/resources/hibernate-logging.cfg.xml rename to persistence-modules/hibernate-enterprise/src/main/resources/hibernate-logging.cfg.xml diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/hibernate.cfg.xml b/persistence-modules/hibernate-enterprise/src/main/resources/hibernate.cfg.xml similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/resources/hibernate.cfg.xml rename to persistence-modules/hibernate-enterprise/src/main/resources/hibernate.cfg.xml diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/init_database.sql b/persistence-modules/hibernate-enterprise/src/main/resources/init_database.sql similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/resources/init_database.sql rename to persistence-modules/hibernate-enterprise/src/main/resources/init_database.sql diff --git a/persistence-modules/hibernate5-enterprise/src/main/resources/logback.xml b/persistence-modules/hibernate-enterprise/src/main/resources/logback.xml similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/main/resources/logback.xml rename to persistence-modules/hibernate-enterprise/src/main/resources/logback.xml diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/HibernateSpatialIntegrationTest.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/logging/HibernateLoggingIntegrationTest.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/Car.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java rename to persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-multitenancy.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-database-multitenancy.properties similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-multitenancy.properties rename to persistence-modules/hibernate-enterprise/src/test/resources/hibernate-database-multitenancy.properties diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb1.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-database-mydb1.properties similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb1.properties rename to persistence-modules/hibernate-enterprise/src/test/resources/hibernate-database-mydb1.properties diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb2.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-database-mydb2.properties similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-database-mydb2.properties rename to persistence-modules/hibernate-enterprise/src/test/resources/hibernate-database-mydb2.properties diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-exception.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-exception.properties similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-exception.properties rename to persistence-modules/hibernate-enterprise/src/test/resources/hibernate-exception.properties diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-schema-multitenancy.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-schema-multitenancy.properties similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-schema-multitenancy.properties rename to persistence-modules/hibernate-enterprise/src/test/resources/hibernate-schema-multitenancy.properties diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/hibernate-spatial.properties rename to persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/hibernate.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate.properties similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/hibernate.properties rename to persistence-modules/hibernate-enterprise/src/test/resources/hibernate.properties diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/lifecycle-init.sql b/persistence-modules/hibernate-enterprise/src/test/resources/lifecycle-init.sql similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/lifecycle-init.sql rename to persistence-modules/hibernate-enterprise/src/test/resources/lifecycle-init.sql diff --git a/persistence-modules/hibernate5-enterprise/src/test/resources/profile.png b/persistence-modules/hibernate-enterprise/src/test/resources/profile.png similarity index 100% rename from persistence-modules/hibernate5-enterprise/src/test/resources/profile.png rename to persistence-modules/hibernate-enterprise/src/test/resources/profile.png From 376d0a6ff6389def371ecef2fde4aefc8aa821eb Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:51:47 +0530 Subject: [PATCH 057/530] JAVA-4: Renamed hibernate5-jpa to hibernate-jpa --- .../{hibernate5-jpa => hibernate-jpa}/README.md | 5 ++--- .../{hibernate5-jpa => hibernate-jpa}/pom.xml | 4 ++-- .../java/com/baeldung/hibernate/HibernateUtil.java | 0 .../hibernate/UnsupportedTenancyException.java | 0 .../hibernate/converters/PersonNameConverter.java | 0 .../com/baeldung/hibernate/entities/Department.java | 0 .../baeldung/hibernate/entities/DeptEmployee.java | 0 .../jpabootstrap/application/Application.java | 0 .../config/HibernatePersistenceUnitInfo.java | 0 .../config/JpaEntityManagerFactory.java | 0 .../hibernate/jpabootstrap/entities/User.java | 0 .../service/EmployeeSearchService.java | 0 .../service/EmployeeSearchServiceImpl.java | 0 .../baeldung/hibernate/onetoone/HibernateUtil.java | 0 .../com/baeldung/hibernate/onetoone/Strategy.java | 0 .../hibernate/onetoone/foreignkeybased/Address.java | 0 .../hibernate/onetoone/foreignkeybased/User.java | 0 .../hibernate/onetoone/jointablebased/Employee.java | 0 .../onetoone/jointablebased/WorkStation.java | 0 .../hibernate/onetoone/sharedkeybased/Address.java | 0 .../hibernate/onetoone/sharedkeybased/User.java | 0 .../optimisticlocking/OptimisticLockingCourse.java | 0 .../optimisticlocking/OptimisticLockingStudent.java | 0 .../hibernate/pessimisticlocking/Address.java | 0 .../hibernate/pessimisticlocking/Customer.java | 0 .../hibernate/pessimisticlocking/Individual.java | 0 .../PessimisticLockingCourse.java | 0 .../PessimisticLockingEmployee.java | 0 .../PessimisticLockingStudent.java | 0 .../java/com/baeldung/hibernate/pojo/Movie.java | 0 .../java/com/baeldung/hibernate/pojo/Person.java | 0 .../com/baeldung/hibernate/pojo/PersonName.java | 0 .../main/java/com/baeldung/hibernate/pojo/Post.java | 0 .../java/com/baeldung/hibernate/pojo/Student.java | 0 .../baeldung/hibernate/transaction/PostService.java | 0 .../PersistenceContextDemoApplication.java | 0 .../baeldung/persistencecontext/entity/User.java | 0 .../ExtendedPersistenceContextUserService.java | 0 .../TransctionPersistenceContextUserService.java | 0 .../src/main/resources/META-INF/persistence.xml | 0 .../src/main/resources/init_database.sql | 0 .../src/main/resources/logback.xml | 0 .../converter/PersonNameConverterUnitTest.java | 0 .../EmployeeSearchServiceIntegrationTest.java | 0 ...ateOneToOneAnnotationFKBasedIntegrationTest.java | 0 ...ateOneToOneAnnotationJTBasedIntegrationTest.java | 0 ...teOneToOneAnnotationSPKBasedIntegrationTest.java | 0 .../OptimisticLockingIntegrationTest.java | 0 .../BasicPessimisticLockingIntegrationTest.java | 0 .../PessimisticLockScopesIntegrationTest.java | 0 .../transaction/TransactionIntegrationTest.java | 0 .../PersistenceContextIntegrationTest.java | 0 .../test/resources/hibernate-namedquery.properties | 0 .../hibernate-pessimistic-locking.properties | 0 .../src/test/resources/hibernate.properties | 0 .../src/test/resources/profile.png | Bin 56 files changed, 4 insertions(+), 5 deletions(-) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/README.md (84%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/pom.xml (97%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/HibernateUtil.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/entities/Department.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pojo/Movie.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pojo/Person.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pojo/PersonName.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pojo/Post.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/pojo/Student.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/hibernate/transaction/PostService.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/persistencecontext/entity/User.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/resources/META-INF/persistence.xml (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/resources/init_database.sql (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/main/resources/logback.xml (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/resources/hibernate-namedquery.properties (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/resources/hibernate-pessimistic-locking.properties (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/resources/hibernate.properties (100%) rename persistence-modules/{hibernate5-jpa => hibernate-jpa}/src/test/resources/profile.png (100%) diff --git a/persistence-modules/hibernate5-jpa/README.md b/persistence-modules/hibernate-jpa/README.md similarity index 84% rename from persistence-modules/hibernate5-jpa/README.md rename to persistence-modules/hibernate-jpa/README.md index bffba85d54..fb1d46cf9b 100644 --- a/persistence-modules/hibernate5-jpa/README.md +++ b/persistence-modules/hibernate-jpa/README.md @@ -1,6 +1,6 @@ -## Hibernate 5 +## Hibernate JPA -This module contains articles about Hibernate 5. +This module contains articles about Hibernate JPA. ### Relevant articles: @@ -12,5 +12,4 @@ This module contains articles about Hibernate 5. - [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) - [Enabling Transaction Locks in Spring Data JPA](https://www.baeldung.com/java-jpa-transaction-locks) - [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception) -- [FetchMode in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-fetchmode) - [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context) diff --git a/persistence-modules/hibernate5-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml similarity index 97% rename from persistence-modules/hibernate5-jpa/pom.xml rename to persistence-modules/hibernate-jpa/pom.xml index b181fff36b..67f40d5017 100644 --- a/persistence-modules/hibernate5-jpa/pom.xml +++ b/persistence-modules/hibernate-jpa/pom.xml @@ -3,9 +3,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - hibernate5-jpa + hibernate-jpa 0.0.1-SNAPSHOT - hibernate5-jpa + hibernate-jpa com.baeldung diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/HibernateUtil.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entities/Department.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/application/Application.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/HibernatePersistenceUnitInfo.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/config/JpaEntityManagerFactory.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpabootstrap/entities/User.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingCourse.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingStudent.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Address.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Customer.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/Individual.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingCourse.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingEmployee.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockingStudent.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Movie.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Person.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/PersonName.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Post.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/pojo/Student.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/transaction/PostService.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/PersistenceContextDemoApplication.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/entity/User.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/service/ExtendedPersistenceContextUserService.java diff --git a/persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java rename to persistence-modules/hibernate-jpa/src/main/java/com/baeldung/persistencecontext/service/TransctionPersistenceContextUserService.java diff --git a/persistence-modules/hibernate5-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/persistence.xml similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/resources/META-INF/persistence.xml rename to persistence-modules/hibernate-jpa/src/main/resources/META-INF/persistence.xml diff --git a/persistence-modules/hibernate5-jpa/src/main/resources/init_database.sql b/persistence-modules/hibernate-jpa/src/main/resources/init_database.sql similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/resources/init_database.sql rename to persistence-modules/hibernate-jpa/src/main/resources/init_database.sql diff --git a/persistence-modules/hibernate5-jpa/src/main/resources/logback.xml b/persistence-modules/hibernate-jpa/src/main/resources/logback.xml similarity index 100% rename from persistence-modules/hibernate5-jpa/src/main/resources/logback.xml rename to persistence-modules/hibernate-jpa/src/main/resources/logback.xml diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterUnitTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/optimisticlocking/OptimisticLockingIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/BasicPessimisticLockingIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/pessimisticlocking/PessimisticLockScopesIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/transaction/TransactionIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java rename to persistence-modules/hibernate-jpa/src/test/java/com/baeldung/persistencecontext/PersistenceContextIntegrationTest.java diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate-jpa/src/test/resources/hibernate-namedquery.properties similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/resources/hibernate-namedquery.properties rename to persistence-modules/hibernate-jpa/src/test/resources/hibernate-namedquery.properties diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/hibernate-pessimistic-locking.properties b/persistence-modules/hibernate-jpa/src/test/resources/hibernate-pessimistic-locking.properties similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/resources/hibernate-pessimistic-locking.properties rename to persistence-modules/hibernate-jpa/src/test/resources/hibernate-pessimistic-locking.properties diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/hibernate.properties b/persistence-modules/hibernate-jpa/src/test/resources/hibernate.properties similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/resources/hibernate.properties rename to persistence-modules/hibernate-jpa/src/test/resources/hibernate.properties diff --git a/persistence-modules/hibernate5-jpa/src/test/resources/profile.png b/persistence-modules/hibernate-jpa/src/test/resources/profile.png similarity index 100% rename from persistence-modules/hibernate5-jpa/src/test/resources/profile.png rename to persistence-modules/hibernate-jpa/src/test/resources/profile.png From 729d35140e65bcf949bccb4faa37a76c20f8bd89 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:52:48 +0530 Subject: [PATCH 058/530] JAVA-4: Renamed hibernate5-queries to hibernate-queries --- .../README.md | 4 ++-- .../pom.xml | 4 ++-- .../java/com/baeldung/hibernate/HibernateUtil.java | 0 .../hibernate/UnsupportedTenancyException.java | 0 .../hibernate/criteriaquery/HibernateUtil.java | 0 .../baeldung/hibernate/criteriaquery/Student.java | 0 .../customtypes/LocalDateStringJavaDescriptor.java | 0 .../hibernate/customtypes/LocalDateStringType.java | 0 .../com/baeldung/hibernate/entities/Department.java | 0 .../baeldung/hibernate/entities/DeptEmployee.java | 0 .../com/baeldung/hibernate/findall/FindAll.java | 0 .../java/com/baeldung/hibernate/pojo/Student.java | 0 .../src/main/resources/META-INF/persistence.xml | 0 .../src/main/resources/init_database.sql | 0 .../src/main/resources/logback.xml | 0 .../hibernate/NamedQueryIntegrationTest.java | 0 .../TypeSafeCriteriaIntegrationTest.java | 0 .../baeldung/hibernate/findall/FindAllUnitTest.java | 0 .../queryplancache/QueryPlanCacheBenchmark.java | 0 .../test/resources/hibernate-customtypes.properties | 0 .../test/resources/hibernate-namedquery.properties | 0 .../src/test/resources/hibernate.properties | 0 .../src/test/resources/lifecycle-init.sql | 0 .../src/test/resources/profile.png | Bin 24 files changed, 4 insertions(+), 4 deletions(-) rename persistence-modules/{hibernate5-queries => hibernate-queries}/README.md (77%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/pom.xml (97%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/HibernateUtil.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/entities/Department.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/findall/FindAll.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/java/com/baeldung/hibernate/pojo/Student.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/resources/META-INF/persistence.xml (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/resources/init_database.sql (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/main/resources/logback.xml (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/resources/hibernate-customtypes.properties (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/resources/hibernate-namedquery.properties (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/resources/hibernate.properties (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/resources/lifecycle-init.sql (100%) rename persistence-modules/{hibernate5-queries => hibernate-queries}/src/test/resources/profile.png (100%) diff --git a/persistence-modules/hibernate5-queries/README.md b/persistence-modules/hibernate-queries/README.md similarity index 77% rename from persistence-modules/hibernate5-queries/README.md rename to persistence-modules/hibernate-queries/README.md index 1edf4ded1e..61d94e32de 100644 --- a/persistence-modules/hibernate5-queries/README.md +++ b/persistence-modules/hibernate-queries/README.md @@ -1,6 +1,6 @@ -## Hibernate 5 +## Hibernate Queries -This module contains articles about Hibernate 5. +This module contains articles about use of Queries in Hibernate. ### Relevant articles: diff --git a/persistence-modules/hibernate5-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml similarity index 97% rename from persistence-modules/hibernate5-queries/pom.xml rename to persistence-modules/hibernate-queries/pom.xml index 544d22c0a3..a439ded9df 100644 --- a/persistence-modules/hibernate5-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -3,9 +3,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - hibernate5-queries + hibernate-queries 0.0.1-SNAPSHOT - hibernate5-queries + hibernate-queries com.baeldung diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/HibernateUtil.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/Department.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/entities/Department.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/Department.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/entities/Department.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/findall/FindAll.java diff --git a/persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java rename to persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/pojo/Student.java diff --git a/persistence-modules/hibernate5-queries/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-queries/src/main/resources/META-INF/persistence.xml similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/resources/META-INF/persistence.xml rename to persistence-modules/hibernate-queries/src/main/resources/META-INF/persistence.xml diff --git a/persistence-modules/hibernate5-queries/src/main/resources/init_database.sql b/persistence-modules/hibernate-queries/src/main/resources/init_database.sql similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/resources/init_database.sql rename to persistence-modules/hibernate-queries/src/main/resources/init_database.sql diff --git a/persistence-modules/hibernate5-queries/src/main/resources/logback.xml b/persistence-modules/hibernate-queries/src/main/resources/logback.xml similarity index 100% rename from persistence-modules/hibernate5-queries/src/main/resources/logback.xml rename to persistence-modules/hibernate-queries/src/main/resources/logback.xml diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java rename to persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java rename to persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java rename to persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java diff --git a/persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java rename to persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java diff --git a/persistence-modules/hibernate5-queries/src/test/resources/hibernate-customtypes.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate-customtypes.properties similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/resources/hibernate-customtypes.properties rename to persistence-modules/hibernate-queries/src/test/resources/hibernate-customtypes.properties diff --git a/persistence-modules/hibernate5-queries/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/resources/hibernate-namedquery.properties rename to persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties diff --git a/persistence-modules/hibernate5-queries/src/test/resources/hibernate.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/resources/hibernate.properties rename to persistence-modules/hibernate-queries/src/test/resources/hibernate.properties diff --git a/persistence-modules/hibernate5-queries/src/test/resources/lifecycle-init.sql b/persistence-modules/hibernate-queries/src/test/resources/lifecycle-init.sql similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/resources/lifecycle-init.sql rename to persistence-modules/hibernate-queries/src/test/resources/lifecycle-init.sql diff --git a/persistence-modules/hibernate5-queries/src/test/resources/profile.png b/persistence-modules/hibernate-queries/src/test/resources/profile.png similarity index 100% rename from persistence-modules/hibernate5-queries/src/test/resources/profile.png rename to persistence-modules/hibernate-queries/src/test/resources/profile.png From bf60206022d577f030e939dae58e1aece5b45a8a Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:53:28 +0530 Subject: [PATCH 059/530] JAVA-4: Removed hibernate5-mapping; merged into to hibernate-mapping --- .../hibernate-mapping/README.md | 8 +- persistence-modules/hibernate-mapping/pom.xml | 13 ++ .../com/baeldung/hibernate/HibernateUtil.java | 72 +++++++++-- .../hibernate/entities/Department.java | 0 .../hibernate/entities/DeptEmployee.java | 0 .../hibernate/lob/HibernateSessionUtil.java | 0 .../baeldung/hibernate/lob/model/User.java | 0 .../config/HibernateAnnotationUtil.java | 34 ----- .../main/HibernateManyisOwningSide.java | 71 ----------- .../HibernateOneToManyAnnotationMain.java | 60 --------- .../main/HibernateOneisOwningSide.java | 67 ---------- .../hibernate/oneToMany/model/Cart.java | 43 ------- .../hibernate/oneToMany/model/CartOIO.java | 42 ------- .../hibernate/oneToMany/model/Items.java | 50 -------- .../hibernate/oneToMany/model/ItemsOIO.java | 47 ------- .../com/baeldung/hibernate/pojo/Employee.java | 0 .../hibernate/pojo/EntityDescription.java | 0 .../com/baeldung/hibernate/pojo/Phone.java | 0 .../com/baeldung/hibernate/pojo/Result.java | 0 .../hibernate/pojo/TemporalValues.java | 0 .../hibernate/pojo/generator/MyGenerator.java | 0 .../hibernate/pojo/inheritance/Animal.java | 0 .../hibernate/pojo/inheritance/Bag.java | 0 .../hibernate/pojo/inheritance/Book.java | 0 .../hibernate/pojo/inheritance/Car.java | 0 .../hibernate/pojo/inheritance/Item.java | 0 .../pojo/inheritance/MyEmployee.java | 0 .../hibernate/pojo/inheritance/MyProduct.java | 0 .../hibernate/pojo/inheritance/Pen.java | 0 .../hibernate/pojo/inheritance/Person.java | 0 .../hibernate/pojo/inheritance/Pet.java | 0 .../hibernate/pojo/inheritance/Vehicle.java | 0 .../baeldung/hibernate/pojo/package-info.java | 0 .../hibernate/wherejointable/Group.java | 56 --------- .../hibernate/wherejointable/User.java | 74 ----------- .../wherejointable/UserGroupRelation.java | 31 ----- .../wherejointable/UserGroupRole.java | 7 -- .../hibernate/CustomClassIntegrationTest.java | 0 .../DynamicMappingIntegrationTest.java | 0 .../InheritanceMappingIntegrationTest.java | 0 .../hibernate/TemporalValuesUnitTest.java | 0 .../baeldung/hibernate/lob/LobUnitTest.java | 0 ...neToManyAnnotationMainIntegrationTest.java | 95 -------------- ...ibernateWhereJoinTableIntegrationTest.java | 118 ------------------ .../src/test/resources/hibernate.properties | 0 .../src/test/resources/lifecycle-init.sql | 0 .../src/test/resources/profile.png | Bin 47 files changed, 83 insertions(+), 805 deletions(-) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/entities/Department.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/lob/model/User.java (100%) delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/Employee.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/Phone.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/Result.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/main/java/com/baeldung/hibernate/pojo/package-info.java (100%) delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java delete mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java (100%) delete mode 100644 persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java delete mode 100644 persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/resources/hibernate.properties (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/resources/lifecycle-init.sql (100%) rename persistence-modules/{hibernate5-mapping => hibernate-mapping}/src/test/resources/profile.png (100%) diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md index 5bbdeecbea..5ba73f35f3 100644 --- a/persistence-modules/hibernate-mapping/README.md +++ b/persistence-modules/hibernate-mapping/README.md @@ -7,5 +7,9 @@ This module contains articles about Object-relational Mapping (ORM) with Hiberna - [Persisting Maps with Hibernate](https://www.baeldung.com/hibernate-persisting-maps) - [Difference Between @Size, @Length, and @Column(length=value)](https://www.baeldung.com/jpa-size-length-column-differences) - [Hibernate Validator Specific Constraints](https://www.baeldung.com/hibernate-validator-constraints) -- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) -- [Hibernate @WhereJoinTable Annotation](https://www.baeldung.com/hibernate-wherejointable) +- [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) +- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance) +- [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class) +- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time) +- [Mapping LOB Data in Hibernate](http://www.baeldung.com/hibernate-lob) +- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode) diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml index ac7952fa2b..c7318ee425 100644 --- a/persistence-modules/hibernate-mapping/pom.xml +++ b/persistence-modules/hibernate-mapping/pom.xml @@ -51,6 +51,17 @@ ${moneta.version} pom + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + + @@ -60,6 +71,8 @@ 3.0.1-b11 1.0.3 1.3 + 3.9 + 2.6 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 7de13db8d3..fbd8bd487b 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 @@ -1,21 +1,48 @@ package com.baeldung.hibernate; -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.service.ServiceRegistry; - import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.util.Properties; -public class HibernateUtil { +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; +import com.baeldung.hibernate.entities.DeptEmployee; +import com.baeldung.hibernate.pojo.Employee; +import com.baeldung.hibernate.pojo.EntityDescription; +import com.baeldung.hibernate.pojo.Phone; +import com.baeldung.hibernate.pojo.TemporalValues; +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.MyEmployee; +import com.baeldung.hibernate.pojo.inheritance.MyProduct; +import com.baeldung.hibernate.pojo.inheritance.Pen; +import com.baeldung.hibernate.pojo.inheritance.Pet; +import com.baeldung.hibernate.pojo.inheritance.Vehicle; + +public class HibernateUtil { + private static String PROPERTY_FILE_NAME; private HibernateUtil() { } + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(""); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + if(propertyFileName.equals("")) propertyFileName = null; + PROPERTY_FILE_NAME = propertyFileName; + ServiceRegistry serviceRegistry = configureServiceRegistry(); + return makeSessionFactory(serviceRegistry); + } + public static SessionFactory getSessionFactory(Strategy strategy) { return buildSessionFactory(strategy); } @@ -40,6 +67,35 @@ public class HibernateUtil { } } + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addPackage("com.baeldung.hibernate.pojo"); + metadataSources.addAnnotatedClass(Employee.class); + metadataSources.addAnnotatedClass(Phone.class); + metadataSources.addAnnotatedClass(EntityDescription.class); + metadataSources.addAnnotatedClass(TemporalValues.class); + metadataSources.addAnnotatedClass(DeptEmployee.class); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); + metadataSources.addAnnotatedClass(Animal.class); + metadataSources.addAnnotatedClass(Bag.class); + metadataSources.addAnnotatedClass(Book.class); + metadataSources.addAnnotatedClass(Car.class); + metadataSources.addAnnotatedClass(MyEmployee.class); + metadataSources.addAnnotatedClass(MyProduct.class); + metadataSources.addAnnotatedClass(Pen.class); + metadataSources.addAnnotatedClass(Pet.class); + metadataSources.addAnnotatedClass(Vehicle.class); + + + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + + } + private static ServiceRegistry configureServiceRegistry() throws IOException { Properties properties = getProperties(); @@ -51,7 +107,7 @@ public class HibernateUtil { Properties properties = new Properties(); URL propertiesURL = Thread.currentThread() .getContextClassLoader() - .getResource("hibernate.properties"); + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { properties.load(inputStream); } diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/Department.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/lob/model/User.java diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java deleted file mode 100644 index 46e6824f42..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.hibernate.oneToMany.config; - -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.service.ServiceRegistry; - -public class HibernateAnnotationUtil { - - private static SessionFactory sessionFactory; - - private static SessionFactory buildSessionFactory() { - try { - // Create the SessionFactory from hibernate-annotation.cfg.xml - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("hibernate-annotation.cfg.xml").build(); - Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build(); - SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build(); - - return sessionFactory; - - } catch (Throwable ex) { - System.err.println("Initial SessionFactory creation failed." + ex); - ex.printStackTrace(); - throw new ExceptionInInitializerError(ex); - } - } - - public static SessionFactory getSessionFactory() { - if (sessionFactory == null) - sessionFactory = buildSessionFactory(); - return sessionFactory; - } -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java deleted file mode 100644 index 372fb2fc07..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.baeldung.hibernate.oneToMany.main; - -import java.util.HashSet; -import java.util.Set; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; - -import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; -import com.baeldung.hibernate.oneToMany.model.Cart; -import com.baeldung.hibernate.oneToMany.model.Items; -import com.baeldung.hibernate.oneToMany.model.ItemsOIO; - -public class HibernateManyisOwningSide { - public static void main(String[] args) { - - Cart cart = new Cart(); - Cart cart2 = new Cart(); - - Items item1 = new Items(cart); - Items item2 = new Items(cart2); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - itemsSet.add(item2); - - cart.setItems(itemsSet); - - - - SessionFactory sessionFactory = null; - Session session = null; - Transaction tx = null; - try { - // Get Session - sessionFactory = HibernateAnnotationUtil.getSessionFactory(); - session = sessionFactory.getCurrentSession(); - System.out.println("Session created"); - // start transaction - tx = session.beginTransaction(); - // Save the Model object - session.save(cart); - session.save(cart2); - session.save(item1); - session.save(item2); - // Commit transaction - tx.commit(); - session = sessionFactory.getCurrentSession(); - tx = session.beginTransaction(); - - item1 = (Items) session.get(Items.class, new Long(1)); - item2 = (Items) session.get(Items.class, new Long(2)); - tx.commit(); - - - System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCart() - .getId()); - System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCart() - .getId()); - - } catch (Exception e) { - System.out.println("Exception occured. " + e.getMessage()); - e.printStackTrace(); - } finally { - if (!sessionFactory.isClosed()) { - System.out.println("Closing SessionFactory"); - sessionFactory.close(); - } - } - } -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java deleted file mode 100644 index 2bc5e514f7..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.hibernate.oneToMany.main; - -import java.util.HashSet; -import java.util.Set; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; - -import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; -import com.baeldung.hibernate.oneToMany.model.Cart; -import com.baeldung.hibernate.oneToMany.model.Items; - -public class HibernateOneToManyAnnotationMain { - - public static void main(String[] args) { - - Cart cart = new Cart(); - - Items item1 = new Items(cart); - Items item2 = new Items(cart); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - itemsSet.add(item2); - - cart.setItems(itemsSet); - - - SessionFactory sessionFactory = null; - Session session = null; - Transaction tx = null; - try { - // Get Session - sessionFactory = HibernateAnnotationUtil.getSessionFactory(); - session = sessionFactory.getCurrentSession(); - System.out.println("Session created"); - // start transaction - tx = session.beginTransaction(); - // Save the Model object - session.save(cart); - session.save(item1); - session.save(item2); - // Commit transaction - tx.commit(); - System.out.println("Cart ID=" + cart.getId()); - System.out.println("item1 ID=" + item1.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); - System.out.println("item2 ID=" + item2.getId() + ", Foreign Key Cart ID=" + item1.getCart().getId()); - - } catch (Exception e) { - System.out.println("Exception occured. " + e.getMessage()); - e.printStackTrace(); - } finally { - if (!sessionFactory.isClosed()) { - System.out.println("Closing SessionFactory"); - sessionFactory.close(); - } - } - } - -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java deleted file mode 100644 index 0777664dd0..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.baeldung.hibernate.oneToMany.main; - -import java.util.HashSet; -import java.util.Set; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; - -import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; -import com.baeldung.hibernate.oneToMany.model.CartOIO; -import com.baeldung.hibernate.oneToMany.model.ItemsOIO; - -public class HibernateOneisOwningSide { - public static void main(String[] args) { - - CartOIO cart = new CartOIO(); - CartOIO cart2 = new CartOIO(); - - ItemsOIO item1 = new ItemsOIO(cart); - ItemsOIO item2 = new ItemsOIO(cart2); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - itemsSet.add(item2); - - cart.setItems(itemsSet); - - SessionFactory sessionFactory = null; - Session session = null; - Transaction tx = null; - try { - // Get Session - sessionFactory = HibernateAnnotationUtil.getSessionFactory(); - session = sessionFactory.getCurrentSession(); - System.out.println("Session created"); - // start transaction - tx = session.beginTransaction(); - // Save the Model object - session.save(cart); - session.save(cart2); - session.save(item1); - session.save(item2); - // Commit transaction - tx.commit(); - - session = sessionFactory.getCurrentSession(); - tx = session.beginTransaction(); - item1 = (ItemsOIO) session.get(ItemsOIO.class, new Long(1)); - item2 = (ItemsOIO) session.get(ItemsOIO.class, new Long(2)); - tx.commit(); - - System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCartOIO() - .getId()); - System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCartOIO() - .getId()); - - } catch (Exception e) { - System.out.println("Exception occured. " + e.getMessage()); - e.printStackTrace(); - } finally { - if (!sessionFactory.isClosed()) { - System.out.println("Closing SessionFactory"); - sessionFactory.close(); - } - } - } -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java deleted file mode 100644 index b8b991831e..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java +++ /dev/null @@ -1,43 +0,0 @@ -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; - -@Entity -@Table(name = "CART") -public class Cart { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "cart_id") - private long id; - - - @OneToMany(mappedBy = "cart") - private Set items; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - - public Set getItems() { - return items; - } - - public void setItems(Set items) { - this.items = items; - } - -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java deleted file mode 100644 index 8a5ed5e7a4..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java +++ /dev/null @@ -1,42 +0,0 @@ -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; - - - -@Entity -@Table(name = "CARTOIO") -public class CartOIO { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; - - @OneToMany - @JoinColumn(name = "cart_id") // we need to duplicate the physical information - private Set items; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Set getItems() { - return items; - } - - public void setItems(Set items) { - this.items = items; - } - -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java deleted file mode 100644 index f63a4855b5..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java +++ /dev/null @@ -1,50 +0,0 @@ -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; - -@Entity -@Table(name = "ITEMS") -public class Items { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") - private long id; - - - @ManyToOne - @JoinColumn(name = "cart_id", nullable = false) - private Cart cart; - - // Hibernate requires no-args constructor - public Items() { - } - - public Items(Cart c) { - this.cart = c; - } - - public Cart getCart() { - return cart; - } - - public void setCart(Cart cart) { - this.cart = cart; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java deleted file mode 100644 index a3d6a796c5..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java +++ /dev/null @@ -1,47 +0,0 @@ -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; - -@Entity -@Table(name = "ITEMSOIO") -public class ItemsOIO { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; - - @ManyToOne - @JoinColumn(name = "cart_id", insertable = false, updatable = false) - private CartOIO cart; - - // Hibernate requires no-args constructor - public ItemsOIO() { - } - - public ItemsOIO(CartOIO c) { - this.cart = c; - } - - public CartOIO getCartOIO() { - return cart; - } - - public void setCartOIO(CartOIO cart) { - this.cart = cart; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - -} diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Employee.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/EntityDescription.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Phone.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/Result.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/TemporalValues.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java diff --git a/persistence-modules/hibernate5-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 similarity index 100% rename from persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/pojo/package-info.java diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java deleted file mode 100644 index 04684eceac..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java +++ /dev/null @@ -1,56 +0,0 @@ -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; - -@Entity(name = "e_group") -public class Group { - - @Id - @GeneratedValue - private Long id; - - private String name; - - @ManyToMany(mappedBy = "groups") - private List users = new ArrayList<>(); - - public Group(String name) { - this.name = name; - } - - 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 getUsers() { - return users; - } - - public void setUsers(List users) { - this.users = users; - } - - @Override - public String toString() { - return "Group [name=" + name + "]"; - } - -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java deleted file mode 100644 index 7fc077eeb2..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java +++ /dev/null @@ -1,74 +0,0 @@ -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 org.hibernate.annotations.WhereJoinTable; - -@Entity -public class User { - - @Id - @GeneratedValue - private Long id; - - private String name; - - @ManyToMany - @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) - private List groups = new ArrayList<>(); - - @WhereJoinTable(clause = "role='MODERATOR'") - @ManyToMany - @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) - private List moderatorGroups = new ArrayList<>(); - - public User(String name) { - this.name = name; - } - - 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 getGroups() { - return groups; - } - - public void setGroups(List groups) { - this.groups = groups; - } - - public void setModeratorGroups(List moderatorGroups) { - this.moderatorGroups = moderatorGroups; - } - - public List getModeratorGroups() { - return moderatorGroups; - } - - @Override - public String toString() { - return "User [name=" + name + "]"; - } - -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java deleted file mode 100644 index 00dd19699c..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java +++ /dev/null @@ -1,31 +0,0 @@ -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; - -@Entity(name = "r_user_group") -public class UserGroupRelation implements Serializable { - - @Id - @Column(name = "user_id", insertable = false, updatable = false) - private final Long userId; - - @Id - @Column(name = "group_id", insertable = false, updatable = false) - private final Long groupId; - - @Enumerated(EnumType.STRING) - private final UserGroupRole role; - - public UserGroupRelation(Long userId, Long groupId, UserGroupRole role) { - this.userId = userId; - this.groupId = groupId; - this.role = role; - } - -} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java deleted file mode 100644 index 62d9cb28ea..0000000000 --- a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.hibernate.wherejointable; - -public enum UserGroupRole { - - MEMBER, MODERATOR - -} diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java rename to persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/CustomClassIntegrationTest.java diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java rename to persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/DynamicMappingIntegrationTest.java diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java rename to persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java rename to persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/TemporalValuesUnitTest.java diff --git a/persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java rename to persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/lob/LobUnitTest.java diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java deleted file mode 100644 index 3bc5a6e12a..0000000000 --- a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.baeldung.hibernate.oneToMany.main; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -import java.util.HashSet; -import java.util.Set; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.dialect.H2Dialect; -import org.hibernate.service.ServiceRegistry; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.baeldung.hibernate.oneToMany.model.Cart; -import com.baeldung.hibernate.oneToMany.model.Items; - -public class HibernateOneToManyAnnotationMainIntegrationTest { - - private static SessionFactory sessionFactory; - - private Session session; - - public HibernateOneToManyAnnotationMainIntegrationTest() { - } - - @BeforeClass - public static void beforeTests() { - Configuration configuration = new Configuration().addAnnotatedClass(Cart.class).addAnnotatedClass(Items.class) - .setProperty("hibernate.dialect", H2Dialect.class.getName()) - .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName()) - .setProperty("hibernate.connection.url", "jdbc:h2:mem:test") - .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "") - .setProperty("hibernate.hbm2ddl.auto", "update"); - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .applySettings(configuration.getProperties()).build(); - sessionFactory = configuration.buildSessionFactory(serviceRegistry); - } - - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); - } - - @Test - public void givenSession_checkIfDatabaseIsEmpty() { - Cart cart = (Cart) session.get(Cart.class, new Long(1)); - assertNull(cart); - - } - - @Test - public void givenSession_checkIfDatabaseIsPopulated_afterCommit() { - Cart cart = new Cart(); - Set cartItems = new HashSet<>(); - cartItems = cart.getItems(); - Assert.assertNull(cartItems); - Items item1 = new Items(); - item1.setCart(cart); - assertNotNull(item1); - Set itemsSet = new HashSet(); - itemsSet.add(item1); - assertNotNull(itemsSet); - cart.setItems(itemsSet); - assertNotNull(cart); - session.persist(cart); - session.getTransaction().commit(); - session.close(); - - session = sessionFactory.openSession(); - session.beginTransaction(); - cart = (Cart) session.get(Cart.class, new Long(1)); - assertNotNull(cart); - } - - @After - public void tearDown() { - session.getTransaction().commit(); - session.close(); - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } - -} diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java deleted file mode 100644 index 93783216ce..0000000000 --- a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.baeldung.hibernate.wherejointable; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.List; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.dialect.H2Dialect; -import org.hibernate.service.ServiceRegistry; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class HibernateWhereJoinTableIntegrationTest { - - private static SessionFactory sessionFactory; - - private Session session; - - /** - * Test data - */ - private User user1; - private User user2; - private User user3; - private Group group1; - private Group group2; - - @BeforeClass - public static void beforeTests() { - Configuration configuration = new Configuration().addAnnotatedClass(User.class) - .addAnnotatedClass(Group.class) - .addAnnotatedClass(UserGroupRelation.class) - .setProperty("hibernate.dialect", H2Dialect.class.getName()) - .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName()) - .setProperty("hibernate.connection.url", "jdbc:h2:mem:test") - .setProperty("hibernate.connection.username", "sa") - .setProperty("hibernate.connection.password", "") - .setProperty("hibernate.hbm2ddl.auto", "update"); - - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() - .applySettings(configuration.getProperties()) - .build(); - - sessionFactory = configuration.buildSessionFactory(serviceRegistry); - } - - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); - - user1 = new User("user1"); - user2 = new User("user2"); - user3 = new User("user3"); - - group1 = new Group("group1"); - group2 = new Group("group2"); - - session.save(group1); - session.save(group2); - - session.save(user1); - session.save(user2); - session.save(user3); - - saveRelation(user1, group1, UserGroupRole.MODERATOR); - saveRelation(user2, group1, UserGroupRole.MODERATOR); - saveRelation(user3, group1, UserGroupRole.MEMBER); - - saveRelation(user1, group2, UserGroupRole.MEMBER); - saveRelation(user2, group2, UserGroupRole.MODERATOR); - } - - @After - public void tearDown() { - session.getTransaction().commit(); - session.close(); - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } - - @Test - public void givenUser1_getGroups_returnsAllGroups() { - List groups = user1.getGroups(); - assertEquals(2, groups.size()); - - assertTrue(groups.contains(group1)); - assertTrue(groups.contains(group2)); - } - - @Test - public void givenUser1_getModeratorGroups_returnsOnlyModeratorGroups() { - List groups = user1.getModeratorGroups(); - assertEquals(1, groups.size()); - - assertTrue(groups.contains(group1)); - } - - private void saveRelation(User user, Group group, UserGroupRole role) { - UserGroupRelation relation = new UserGroupRelation(user.getId(), group.getId(), role); - - session.save(relation); - session.flush(); - session.refresh(user); - session.refresh(group); - } - -} diff --git a/persistence-modules/hibernate5-mapping/src/test/resources/hibernate.properties b/persistence-modules/hibernate-mapping/src/test/resources/hibernate.properties similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/resources/hibernate.properties rename to persistence-modules/hibernate-mapping/src/test/resources/hibernate.properties diff --git a/persistence-modules/hibernate5-mapping/src/test/resources/lifecycle-init.sql b/persistence-modules/hibernate-mapping/src/test/resources/lifecycle-init.sql similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/resources/lifecycle-init.sql rename to persistence-modules/hibernate-mapping/src/test/resources/lifecycle-init.sql diff --git a/persistence-modules/hibernate5-mapping/src/test/resources/profile.png b/persistence-modules/hibernate-mapping/src/test/resources/profile.png similarity index 100% rename from persistence-modules/hibernate5-mapping/src/test/resources/profile.png rename to persistence-modules/hibernate-mapping/src/test/resources/profile.png From e1d9086ef76e62eed66de4aa35c03b2e2015a145 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:54:52 +0530 Subject: [PATCH 060/530] JAVA-4: Updated README for original module hibernate5 --- persistence-modules/hibernate5/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index 7b5e3bb189..b7a254d836 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -1,6 +1,6 @@ ## Hibernate 5 -This module contains articles about Hibernate 5. +This module contains articles about Hibernate 5. Let's not add more articles here, we should not be creating a -2 out of it. Please add to other existing hibernate-* modules, or create a new one. ### Relevant articles: @@ -12,5 +12,4 @@ This module contains articles about Hibernate 5. - [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) - [Guide to the Hibernate EntityManager](https://www.baeldung.com/hibernate-entitymanager) - [Using c3p0 with Hibernate](https://www.baeldung.com/hibernate-c3p0) -- [Persist a JSON Object Using Hibernate](https://www.baeldung.com/hibernate-persist-json-object) -- [[Next -->]](/hibernate5-2) \ No newline at end of file +- [Persist a JSON Object Using Hibernate](https://www.baeldung.com/hibernate-persist-json-object) \ No newline at end of file From 6023de1b93d8359df2a916b4af265e31102fd028 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:55:19 +0530 Subject: [PATCH 061/530] JAVA-4: Updated module pom --- persistence-modules/pom.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 2e9b033b79..f1b7c407bd 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -23,11 +23,10 @@ hibernate5 hibernate-mapping hibernate-ogm - hibernate5-mapping - hibernate5-annotations - hibernate5-jpa - hibernate5-queries - hibernate5-enterprise + hibernate-annotations + hibernate-jpa + hibernate-queries + hibernate-enterprise influxdb java-cassandra java-cockroachdb From 12034cd05ceab769408c8b262d072b2b2e0c3650 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 15 Mar 2020 12:56:22 +0530 Subject: [PATCH 062/530] JAVA-4: Included article in README for which code belongs here --- persistence-modules/spring-hibernate-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index a74600a47f..4a97368537 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -12,3 +12,4 @@ This module contains articles about Hibernate 5 with Spring. - [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache) - [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) - [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource) +- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) From 2ce585c3eab9f7167b8ddd87847bed44400d0a2c Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 09:51:11 +0100 Subject: [PATCH 063/530] JAVA-86: Initial migration - spring-boot-change-port --- .../spring-boot-basic-customization/README.md | 7 +++++ .../spring-boot-basic-customization/pom.xml | 31 +++++++++++++++++++ .../changeport/CustomApplication.java | 17 ++++++++++ .../changeport/ServerPortCustomizer.java | 15 +++++++++ .../src/main/resources/application.properties | 7 +++++ .../src/main/resources/logback.xml | 13 ++++++++ 6 files changed, 90 insertions(+) create mode 100644 spring-boot-modules/spring-boot-basic-customization/README.md create mode 100644 spring-boot-modules/spring-boot-basic-customization/pom.xml create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/logback.xml diff --git a/spring-boot-modules/spring-boot-basic-customization/README.md b/spring-boot-modules/spring-boot-basic-customization/README.md new file mode 100644 index 0000000000..fdf414b252 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/README.md @@ -0,0 +1,7 @@ +## Spring Boot Basic Customization + +This module contains articles about Spring Boot customization + +### Relevant Articles: + + - [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml new file mode 100644 index 0000000000..828ee42b95 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + spring-boot-basic-customization + spring-boot-basic-customization + jar + Module For Spring Boot Basic Customization + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java new file mode 100644 index 0000000000..3fce0f1289 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java @@ -0,0 +1,17 @@ +package com.baeldung.changeport; + +import java.util.Collections; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CustomApplication { + + public static void main(String[] args) { + SpringApplication app = new SpringApplication(CustomApplication.class); + app.setDefaultProperties(Collections.singletonMap("server.port", "8083")); + app.run(args); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java new file mode 100644 index 0000000000..f3610aeac6 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java @@ -0,0 +1,15 @@ +package com.baeldung.changeport; + +import org.springframework.boot.web.server.ConfigurableWebServerFactory; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.stereotype.Component; + +//@Component +public class ServerPortCustomizer implements WebServerFactoryCustomizer { + + @Override + public void customize(ConfigurableWebServerFactory factory) { + factory.setPort(8086); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties new file mode 100644 index 0000000000..27b7915cff --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties @@ -0,0 +1,7 @@ +management.endpoints.web.exposure.include=* +management.metrics.enable.root=true +management.metrics.enable.jvm=true +management.endpoint.restart.enabled=true +spring.datasource.jmx-enabled=false +spring.main.allow-bean-definition-overriding=true +management.endpoint.shutdown.enabled=true \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file From afcd5d23c514b5af47eecd61009a1d8f637f09ca Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 11:32:12 +0100 Subject: [PATCH 064/530] JAVA-86: Migrate spring-boot-custom-banners --- .../spring-boot-basic-customization/README.md | 1 + .../src/main/resources/application.properties | 14 +++++++------- .../src/main/resources/banner.txt | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/banner.txt diff --git a/spring-boot-modules/spring-boot-basic-customization/README.md b/spring-boot-modules/spring-boot-basic-customization/README.md index fdf414b252..1a899fd13a 100644 --- a/spring-boot-modules/spring-boot-basic-customization/README.md +++ b/spring-boot-modules/spring-boot-basic-customization/README.md @@ -5,3 +5,4 @@ This module contains articles about Spring Boot customization ### Relevant Articles: - [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) + - [Using Custom Banners in Spring Boot](https://www.baeldung.com/spring-boot-custom-banners) diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties index 27b7915cff..2063d36b46 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties @@ -1,7 +1,7 @@ -management.endpoints.web.exposure.include=* -management.metrics.enable.root=true -management.metrics.enable.jvm=true -management.endpoint.restart.enabled=true -spring.datasource.jmx-enabled=false -spring.main.allow-bean-definition-overriding=true -management.endpoint.shutdown.enabled=true \ No newline at end of file +#spring.banner.charset=UTF-8 +#spring.banner.location=classpath:banner.txt +#spring.banner.image.location=classpath:banner.gif +#spring.banner.image.width= //TODO +#spring.banner.image.height= //TODO +#spring.banner.image.margin= //TODO +#spring.banner.image.invert= //TODO \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/banner.txt b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/banner.txt new file mode 100644 index 0000000000..abfa666eb6 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/banner.txt @@ -0,0 +1,14 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@########@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@:..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@#. @@@@@* *@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@#o @@@@@* @@@@@* @@@:*.*@@@@@@@: *8@@@ @@@@&:.#@. @o**@@@@**:@o*o@@:.:@@@@@:.o#@&*:@@@@ +@@@@@@@@@@@@* @@@@@* 8888 8@ @@@8 #@o 8@# .@ @@* :. @* @@@@ @. : &@ ** .@@@@ +@@@@@@@@@@. @ o@@@@@* *@@@o::& .* 8@@@@. @@ 8@@@@. @* @@@@ @. @@@& * @@@@# .@@@@ +@@@@@@@@@& @ @@@@@@* @@@@@@ 8 @@@@ .. o&&&&&&& @@ #@@@@. @* @@@@ @. @@@# * @@@@@ .@@@@ +@@@@@@@@@ @@o @@@@@@@* oooo* 8 @@@& @* @@@ # 88. 88. *& o#: @. @@@# *@ &#& .@@@@ +@@@@@@@@# @@@8 @@@@@@@* .*@@@#. *@@ @@@& :#@@@o .@@: *&@8 @o o@@: @. @@@# *@@#. :8# .@@@@ +@@@@@@@@@ @@@@ &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@# o@@@@ @@@@@ +@@@@@& &@@@@ 8@@@@@@@@@8&8@@@@@#8#@@@o8@#&@@o&@@@&@@8@@&@@@@88@@8#@8&@@##@@@@@@#8@@#8@@88@@@@@ *@@@@@@@ +@@@# #@@@@#. @@@@@@@@@@@@@8@@8#o@&#@@@@o.@o*@@*.@@@.@&:8o8*@@@8&@@#@@@8@@@@8@#@@@8&@@@@@@#@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file From 5065a7353dd2d4856c4bf8997d511a7c3ce6f650 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 15 Mar 2020 12:50:43 +0100 Subject: [PATCH 065/530] BAEL-3855 --- .../lock/ConcurrentAccessBenchmark.java | 11 ++++++----- .../com/baeldung/concurrent/lock/SingleLock.java | 12 ++---------- .../baeldung/concurrent/lock/StripedLock.java | 16 ++++------------ 3 files changed, 12 insertions(+), 27 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java index 2dcaa5cb53..ceb53ce077 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java @@ -18,36 +18,37 @@ import org.openjdk.jmh.annotations.Warmup; @Fork(value = 2) @Warmup(iterations = 0) public class ConcurrentAccessBenchmark { - ConcurrentAccessExperiment accessMyMap; static final int SLOTS = 4; static final int THREADS = 10000; static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; + SingleLock singleLock = new SingleLock(); + StripedLock stripedLock = new StripedLock(BUCKETS); @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map singleLockHashMap() throws InterruptedException { - return (new SingleLock()).doWork(new HashMap(), THREADS, SLOTS); + return singleLock.doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map stripedLockHashMap() throws InterruptedException { - return (new StripedLock(BUCKETS)).doWork(new HashMap(), THREADS, SLOTS); + return stripedLock.doWork(new HashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map singleLockConcurrentHashMap() throws InterruptedException { - return (new SingleLock()).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + return singleLock.doWork(new ConcurrentHashMap(), THREADS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map stripedLockConcurrentHashMap() throws InterruptedException { - return (new StripedLock(BUCKETS)).doWork(new ConcurrentHashMap(), THREADS, SLOTS); + return stripedLock.doWork(new ConcurrentHashMap(), THREADS, SLOTS); } } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 9bbac82c6d..762053c4c9 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -17,12 +17,8 @@ public class SingleLock extends ConcurrentAccessExperiment { try { lock.lock(); map.put("key" + key, "value" + key); - } catch (Exception e) { - this.putSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + lock.unlock(); } return null; }); @@ -33,12 +29,8 @@ public class SingleLock extends ConcurrentAccessExperiment { try { lock.lock(); map.get("key" + key); - } catch (Exception e) { - this.getSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + lock.unlock(); } return null; }); diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index 46610c3b78..e132cb061d 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -18,14 +18,10 @@ public class StripedLock extends ConcurrentAccessExperiment { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { - lock.tryLock(); + lock.lock(); map.put("key" + key, "value" + key); - } catch (Exception e) { - this.putSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + lock.unlock(); } return null; }); @@ -36,14 +32,10 @@ public class StripedLock extends ConcurrentAccessExperiment { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); try { - lock.tryLock(); + lock.lock(); map.get("key" + key); - } catch (Exception e) { - this.getSupplier(map, key); } finally { - try { - lock.unlock(); - } catch (Exception e) {} + lock.unlock(); } return null; }); From dae03d6a87137322cf5f5a67d8a33e86dfbbf7f4 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 15 Mar 2020 13:04:55 +0100 Subject: [PATCH 066/530] BAEL-3855 --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 6 ++---- .../main/java/com/baeldung/concurrent/lock/StripedLock.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 762053c4c9..19b3ba4510 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -16,11 +16,10 @@ public class SingleLock extends ConcurrentAccessExperiment { return (()-> { try { lock.lock(); - map.put("key" + key, "value" + key); + return map.put("key" + key, "value" + key); } finally { lock.unlock(); } - return null; }); } @@ -28,11 +27,10 @@ public class SingleLock extends ConcurrentAccessExperiment { return (()-> { try { lock.lock(); - map.get("key" + key); + return map.get("key" + key); } finally { lock.unlock(); } - return null; }); } } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index e132cb061d..7adca428ba 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -19,11 +19,10 @@ public class StripedLock extends ConcurrentAccessExperiment { Lock lock = stripedLock.get(bucket); try { lock.lock(); - map.put("key" + key, "value" + key); + return map.put("key" + key, "value" + key); } finally { lock.unlock(); } - return null; }); } @@ -33,11 +32,10 @@ public class StripedLock extends ConcurrentAccessExperiment { Lock lock = stripedLock.get(bucket); try { lock.lock(); - map.get("key" + key); + return map.get("key" + key); } finally { lock.unlock(); } - return null; }); } } From fff4be33f081c7ab50f6688f6e64ffef20d06235 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 16:24:26 +0100 Subject: [PATCH 067/530] JAVA-86: spring-boot-failure-analyzer --- .../spring-boot-basic-customization/pom.xml | 6 ++++- .../FailureAnalyzerApplication.java | 14 ++++++++++++ ...yBeanNotOfRequiredTypeFailureAnalyzer.java | 22 +++++++++++++++++++ .../com/baeldung/failureanalyzer/MyDAO.java | 5 +++++ .../baeldung/failureanalyzer/MySecondDAO.java | 8 +++++++ .../baeldung/failureanalyzer/MyService.java | 13 +++++++++++ .../main/resources/META-INF/spring.factories | 2 ++ 7 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyDAO.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyService.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/META-INF/spring.factories diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml index 828ee42b95..ef56623775 100644 --- a/spring-boot-modules/spring-boot-basic-customization/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization/pom.xml @@ -16,6 +16,11 @@ + + org.springframework.boot + spring-boot-starter + + org.springframework.boot spring-boot-starter-web @@ -27,5 +32,4 @@ test - diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java new file mode 100644 index 0000000000..d08fa05c6e --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.failureanalyzer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import javax.annotation.security.RolesAllowed; + +@SpringBootApplication +public class FailureAnalyzerApplication { + @RolesAllowed("*") + public static void main(String[] args) { + SpringApplication.run(FailureAnalyzerApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java new file mode 100644 index 0000000000..3949908083 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java @@ -0,0 +1,22 @@ +package com.baeldung.failureanalyzer; + +import org.springframework.beans.factory.BeanNotOfRequiredTypeException; +import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; +import org.springframework.boot.diagnostics.FailureAnalysis; + +public class MyBeanNotOfRequiredTypeFailureAnalyzer extends AbstractFailureAnalyzer { + + @Override + protected FailureAnalysis analyze(Throwable rootFailure, BeanNotOfRequiredTypeException cause) { + return new FailureAnalysis(getDescription(cause), getAction(cause), cause); + } + + private String getDescription(BeanNotOfRequiredTypeException ex) { + return String.format("The bean %s could not be injected as %s because it is of type %s", ex.getBeanName(), ex.getRequiredType().getName(), ex.getActualType().getName()); + } + + private String getAction(BeanNotOfRequiredTypeException ex) { + return String.format("Consider creating a bean with name %s of type %s", ex.getBeanName(), ex.getRequiredType().getName()); + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyDAO.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyDAO.java new file mode 100644 index 0000000000..ddaeb28574 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyDAO.java @@ -0,0 +1,5 @@ +package com.baeldung.failureanalyzer; + +public class MyDAO { + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java new file mode 100644 index 0000000000..12dd73a05b --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java @@ -0,0 +1,8 @@ +package com.baeldung.failureanalyzer; + +import org.springframework.stereotype.Repository; + +@Repository("myDAO") +public class MySecondDAO { + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyService.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyService.java new file mode 100644 index 0000000000..f31b67615f --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/MyService.java @@ -0,0 +1,13 @@ +package com.baeldung.failureanalyzer; + +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class MyService { + + @Resource(name = "myDAO") + private MyDAO myDAO; + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/META-INF/spring.factories b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..336477df96 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer + From ab71c5eb09b079f0ede80c0ad0d9b3ed01018223 Mon Sep 17 00:00:00 2001 From: mikr Date: Sun, 15 Mar 2020 16:37:38 +0100 Subject: [PATCH 068/530] JAVA-841 Standardize packages in spring-security-mvc-boot --- .../spring-security-mvc-boot-1/pom.xml | 4 ++-- .../baeldung/{ => relationships}/AppConfig.java | 6 +++--- .../{ => relationships}/SpringSecurityConfig.java | 6 +++--- .../{ => relationships}/models/AppUser.java | 2 +- .../baeldung/{ => relationships}/models/Tweet.java | 2 +- .../repositories/TweetRepository.java | 4 ++-- .../repositories/UserRepository.java | 7 ++----- .../security/AppUserPrincipal.java | 4 ++-- .../security/AuthenticationSuccessHandlerImpl.java | 4 ++-- .../security/CustomUserDetailsService.java | 6 +++--- .../{ => relationships}/util/DummyContentUtil.java | 6 +++--- .../baeldung/roles}/custom/Application.java | 4 ++-- .../roles}/custom/config/MethodSecurityConfig.java | 6 +++--- .../baeldung/roles}/custom/config/MvcConfig.java | 2 +- .../roles}/custom/config/SecurityConfig.java | 2 +- .../roles}/custom/persistence/SetupData.java | 14 +++++++------- .../persistence/dao/OrganizationRepository.java | 4 ++-- .../persistence/dao/PrivilegeRepository.java | 4 ++-- .../custom/persistence/dao/UserRepository.java | 4 ++-- .../roles}/custom/persistence/model/Foo.java | 2 +- .../custom/persistence/model/Organization.java | 2 +- .../roles}/custom/persistence/model/Privilege.java | 2 +- .../roles}/custom/persistence/model/User.java | 2 +- .../CustomMethodSecurityExpressionHandler.java | 2 +- .../CustomMethodSecurityExpressionRoot.java | 4 ++-- .../custom/security/CustomPermissionEvaluator.java | 2 +- .../custom/security/MySecurityExpressionRoot.java | 4 ++-- .../custom/security/MyUserDetailsService.java | 6 +++--- .../roles}/custom/security/MyUserPrincipal.java | 6 +++--- .../baeldung/roles}/custom/web/MainController.java | 10 +++++----- .../baeldung/roles}/ip/IpApplication.java | 4 ++-- .../ip/config/CustomIpAuthenticationProvider.java | 2 +- .../baeldung/roles}/ip/config/SecurityConfig.java | 2 +- .../roles}/ip/config/SecurityXmlConfig.java | 2 +- .../baeldung/roles}/ip/web/MainController.java | 4 ++-- .../CustomAuthenticationProvider.java | 6 +++--- .../rolesauthorities/MyLogoutSuccessHandler.java | 2 +- .../rolesauthorities/MyUserDetailsService.java | 8 ++++---- .../RolesAuthoritiesApplication.java | 4 ++-- .../roles}/rolesauthorities/config/MvcConfig.java | 2 +- .../rolesauthorities/config/SecurityConfig.java | 10 +++++----- .../roles}/rolesauthorities/model/Privilege.java | 2 +- .../roles}/rolesauthorities/model/Role.java | 2 +- .../roles}/rolesauthorities/model/User.java | 2 +- .../rolesauthorities/persistence/IUserService.java | 9 +++++++++ .../persistence/PrivilegeRepository.java | 4 ++-- .../persistence/RoleRepository.java | 4 ++-- .../persistence/SetupDataLoader.java | 8 ++++---- .../persistence/UserRepository.java | 4 ++-- .../rolesauthorities/persistence/UserService.java | 4 ++-- .../baeldung/roles}/voter/MinuteBasedVoter.java | 2 +- .../baeldung/roles}/voter/VoterApplication.java | 4 ++-- .../baeldung/roles}/voter/VoterMvcConfig.java | 4 +--- .../baeldung/roles}/voter/WebSecurityConfig.java | 3 +-- .../baeldung/roles}/voter/XmlSecurityConfig.java | 5 +---- .../rolesauthorities/persistence/IUserService.java | 9 --------- .../resources/spring-security-custom-voter.xml | 4 ++-- .../SpringDataWithSecurityIntegrationTest.java | 13 ++++++------- .../baeldung/roles}/SpringContextTest.java | 4 ++-- .../baeldung/roles}/web/ApplicationLiveTest.java | 6 +++--- .../CustomUserDetailsServiceIntegrationTest.java | 8 ++++---- .../baeldung/roles}/web/IpLiveTest.java | 4 ++-- 62 files changed, 137 insertions(+), 147 deletions(-) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/AppConfig.java (92%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/SpringSecurityConfig.java (94%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/models/AppUser.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/models/Tweet.java (96%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{data => relationships}/repositories/TweetRepository.java (84%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{data => relationships}/repositories/UserRepository.java (76%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/security/AppUserPrincipal.java (93%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/security/AuthenticationSuccessHandlerImpl.java (88%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/security/CustomUserDetailsService.java (87%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/{ => relationships}/util/DummyContentUtil.java (95%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/Application.java (88%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/config/MethodSecurityConfig.java (83%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/config/MvcConfig.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/config/SecurityConfig.java (95%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/SetupData.java (83%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/dao/OrganizationRepository.java (63%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/dao/PrivilegeRepository.java (62%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/dao/UserRepository.java (74%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/model/Foo.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/model/Organization.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/model/Privilege.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/persistence/model/User.java (98%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/security/CustomMethodSecurityExpressionHandler.java (96%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/security/CustomMethodSecurityExpressionRoot.java (92%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/security/CustomPermissionEvaluator.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/security/MySecurityExpressionRoot.java (98%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/security/MyUserDetailsService.java (83%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/security/MyUserPrincipal.java (89%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/custom/web/MainController.java (87%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/ip/IpApplication.java (90%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/ip/config/CustomIpAuthenticationProvider.java (98%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/ip/config/SecurityConfig.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/ip/config/SecurityXmlConfig.java (77%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/ip/web/MainController.java (94%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/CustomAuthenticationProvider.java (89%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/MyLogoutSuccessHandler.java (95%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/MyUserDetailsService.java (90%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/RolesAuthoritiesApplication.java (87%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/config/MvcConfig.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/config/SecurityConfig.java (90%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/model/Privilege.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/model/Role.java (97%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/model/User.java (98%) create mode 100644 spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/IUserService.java rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/persistence/PrivilegeRepository.java (65%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/persistence/RoleRepository.java (63%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/persistence/SetupDataLoader.java (93%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/persistence/UserRepository.java (64%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/rolesauthorities/persistence/UserService.java (77%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/voter/MinuteBasedVoter.java (96%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/voter/VoterApplication.java (83%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/voter/VoterMvcConfig.java (71%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/voter/WebSecurityConfig.java (96%) rename spring-security-modules/spring-security-mvc-boot-1/src/main/java/{org/baeldung => com/baeldung/roles}/voter/XmlSecurityConfig.java (60%) delete mode 100644 spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java rename spring-security-modules/spring-security-mvc-boot-1/src/test/java/{org/baeldung => com/baeldung/roles}/SpringContextTest.java (83%) rename spring-security-modules/spring-security-mvc-boot-1/src/test/java/{org/baeldung => com/baeldung/roles}/web/ApplicationLiveTest.java (94%) rename spring-security-modules/spring-security-mvc-boot-1/src/test/java/{org/baeldung => com/baeldung/roles}/web/CustomUserDetailsServiceIntegrationTest.java (95%) rename spring-security-modules/spring-security-mvc-boot-1/src/test/java/{org/baeldung => com/baeldung/roles}/web/IpLiveTest.java (89%) diff --git a/spring-security-modules/spring-security-mvc-boot-1/pom.xml b/spring-security-modules/spring-security-mvc-boot-1/pom.xml index 7dfee200d4..476159f306 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/pom.xml +++ b/spring-security-modules/spring-security-mvc-boot-1/pom.xml @@ -222,10 +222,10 @@ - org.baeldung.custom.Application + com.baeldung.roles.custom.Application - + 1.1.2 1.6.1 diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/AppConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/AppConfig.java similarity index 92% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/AppConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/AppConfig.java index 8719e39a20..ab2cc71fec 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/AppConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/AppConfig.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.relationships; import java.util.Properties; @@ -19,7 +19,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter @SpringBootApplication @PropertySource({"classpath:persistence-h2.properties", "classpath:application-defaults.properties"}) -@EnableJpaRepositories(basePackages = { "com.baeldung.data.repositories" }) +@EnableJpaRepositories(basePackages = {"com.baeldung.relationships.repositories"}) @EnableWebMvc @Import(SpringSecurityConfig.class) public class AppConfig extends WebMvcConfigurerAdapter { @@ -41,7 +41,7 @@ public class AppConfig extends WebMvcConfigurerAdapter { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "com.baeldung.models" }); + em.setPackagesToScan(new String[] { "com.baeldung.relationships.models" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/SpringSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/SpringSecurityConfig.java similarity index 94% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/SpringSecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/SpringSecurityConfig.java index ee13678a24..88814038a8 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/SpringSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/SpringSecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.relationships; import javax.annotation.PostConstruct; import javax.sql.DataSource; @@ -18,8 +18,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.data.repository.query.SecurityEvaluationContextExtension; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.security.AuthenticationSuccessHandlerImpl; -import com.baeldung.security.CustomUserDetailsService; +import com.baeldung.relationships.security.AuthenticationSuccessHandlerImpl; +import com.baeldung.relationships.security.CustomUserDetailsService; @Configuration @EnableWebSecurity diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/AppUser.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/models/AppUser.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/AppUser.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/models/AppUser.java index e48233f90a..2efd24e879 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/AppUser.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/models/AppUser.java @@ -1,4 +1,4 @@ -package com.baeldung.models; +package com.baeldung.relationships.models; import java.util.Date; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/Tweet.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/models/Tweet.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/Tweet.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/models/Tweet.java index 54a96deaf3..d8496f89be 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/Tweet.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/models/Tweet.java @@ -1,4 +1,4 @@ -package com.baeldung.models; +package com.baeldung.relationships.models; import java.util.HashSet; import java.util.Set; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/TweetRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/repositories/TweetRepository.java similarity index 84% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/TweetRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/repositories/TweetRepository.java index 7d6446ed0d..4e4b16a151 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/TweetRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/repositories/TweetRepository.java @@ -1,11 +1,11 @@ -package com.baeldung.data.repositories; +package com.baeldung.relationships.repositories; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; -import com.baeldung.models.Tweet; +import com.baeldung.relationships.models.Tweet; public interface TweetRepository extends PagingAndSortingRepository { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/UserRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/repositories/UserRepository.java similarity index 76% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/UserRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/repositories/UserRepository.java index 5240c683e0..883ea332f8 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/UserRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/repositories/UserRepository.java @@ -1,18 +1,15 @@ -package com.baeldung.data.repositories; +package com.baeldung.relationships.repositories; import java.util.Date; import java.util.List; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Modifying; 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; import org.springframework.transaction.annotation.Transactional; -import com.baeldung.models.AppUser; +import com.baeldung.relationships.models.AppUser; public interface UserRepository extends CrudRepository { AppUser findByUsername(String username); diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AppUserPrincipal.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/AppUserPrincipal.java similarity index 93% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AppUserPrincipal.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/AppUserPrincipal.java index 195f9f7bf6..1ae7d95e41 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AppUserPrincipal.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/AppUserPrincipal.java @@ -1,4 +1,4 @@ -package com.baeldung.security; +package com.baeldung.relationships.security; import java.util.Collection; import java.util.Collections; @@ -8,7 +8,7 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; -import com.baeldung.models.AppUser; +import com.baeldung.relationships.models.AppUser; public class AppUserPrincipal implements UserDetails { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/AuthenticationSuccessHandlerImpl.java similarity index 88% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/AuthenticationSuccessHandlerImpl.java index 3fc2bc6559..1b85294467 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/AuthenticationSuccessHandlerImpl.java @@ -1,4 +1,4 @@ -package com.baeldung.security; +package com.baeldung.relationships.security; import java.io.IOException; import java.util.Date; @@ -12,7 +12,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; -import com.baeldung.data.repositories.UserRepository; +import com.baeldung.relationships.repositories.UserRepository; @Component public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/CustomUserDetailsService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/CustomUserDetailsService.java similarity index 87% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/CustomUserDetailsService.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/CustomUserDetailsService.java index 016f4f7fa9..10c266bb74 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/CustomUserDetailsService.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/security/CustomUserDetailsService.java @@ -1,4 +1,4 @@ -package com.baeldung.security; +package com.baeldung.relationships.security; import javax.annotation.PostConstruct; @@ -9,8 +9,8 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.data.repositories.UserRepository; -import com.baeldung.models.AppUser; +import com.baeldung.relationships.repositories.UserRepository; +import com.baeldung.relationships.models.AppUser; @Service public class CustomUserDetailsService implements UserDetailsService { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/util/DummyContentUtil.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/util/DummyContentUtil.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/util/DummyContentUtil.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/util/DummyContentUtil.java index f1640264d2..b8e5192b48 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/util/DummyContentUtil.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/relationships/util/DummyContentUtil.java @@ -1,4 +1,4 @@ -package com.baeldung.util; +package com.baeldung.relationships.util; import java.util.ArrayList; import java.util.Collection; @@ -10,8 +10,8 @@ import java.util.stream.IntStream; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import com.baeldung.models.AppUser; -import com.baeldung.models.Tweet; +import com.baeldung.relationships.models.AppUser; +import com.baeldung.relationships.models.Tweet; public class DummyContentUtil { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/Application.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/Application.java similarity index 88% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/Application.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/Application.java index e051e5a853..e7ace1f962 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/Application.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/Application.java @@ -1,4 +1,4 @@ -package org.baeldung.custom; +package com.baeldung.roles.custom; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,7 +7,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.PropertySource; @SpringBootApplication -@ComponentScan("org.baeldung.custom") +@ComponentScan("com.baeldung.roles.custom") @PropertySource("classpath:application-defaults.properties") public class Application extends SpringBootServletInitializer { public static void main(String[] args) { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MethodSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/MethodSecurityConfig.java similarity index 83% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MethodSecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/MethodSecurityConfig.java index 6a005153dc..57ab8b120f 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MethodSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/MethodSecurityConfig.java @@ -1,7 +1,7 @@ -package org.baeldung.custom.config; +package com.baeldung.roles.custom.config; -import org.baeldung.custom.security.CustomMethodSecurityExpressionHandler; -import org.baeldung.custom.security.CustomPermissionEvaluator; +import com.baeldung.roles.custom.security.CustomMethodSecurityExpressionHandler; +import com.baeldung.roles.custom.security.CustomPermissionEvaluator; import org.springframework.context.annotation.Configuration; import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MvcConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/MvcConfig.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MvcConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/MvcConfig.java index 58d11ea9ae..c99d1e38a5 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MvcConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/MvcConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.config; +package com.baeldung.roles.custom.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/SecurityConfig.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/SecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/SecurityConfig.java index 06357650dc..6bf04120ab 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/config/SecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.config; +package com.baeldung.roles.custom.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/SetupData.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/SetupData.java similarity index 83% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/SetupData.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/SetupData.java index f0fcce3908..ab57e7436c 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/SetupData.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/SetupData.java @@ -1,16 +1,16 @@ -package org.baeldung.custom.persistence; +package com.baeldung.roles.custom.persistence; import java.util.Arrays; import java.util.HashSet; import javax.annotation.PostConstruct; -import org.baeldung.custom.persistence.dao.OrganizationRepository; -import org.baeldung.custom.persistence.dao.PrivilegeRepository; -import org.baeldung.custom.persistence.dao.UserRepository; -import org.baeldung.custom.persistence.model.Organization; -import org.baeldung.custom.persistence.model.Privilege; -import org.baeldung.custom.persistence.model.User; +import com.baeldung.roles.custom.persistence.dao.OrganizationRepository; +import com.baeldung.roles.custom.persistence.dao.PrivilegeRepository; +import com.baeldung.roles.custom.persistence.dao.UserRepository; +import com.baeldung.roles.custom.persistence.model.Organization; +import com.baeldung.roles.custom.persistence.model.Privilege; +import com.baeldung.roles.custom.persistence.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/OrganizationRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/OrganizationRepository.java similarity index 63% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/OrganizationRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/OrganizationRepository.java index 1319a7b9f8..2f585f3527 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/OrganizationRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/OrganizationRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.custom.persistence.dao; +package com.baeldung.roles.custom.persistence.dao; -import org.baeldung.custom.persistence.model.Organization; +import com.baeldung.roles.custom.persistence.model.Organization; import org.springframework.data.jpa.repository.JpaRepository; public interface OrganizationRepository extends JpaRepository { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/PrivilegeRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/PrivilegeRepository.java similarity index 62% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/PrivilegeRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/PrivilegeRepository.java index c232bb986c..c83e0f505e 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/PrivilegeRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/PrivilegeRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.custom.persistence.dao; +package com.baeldung.roles.custom.persistence.dao; -import org.baeldung.custom.persistence.model.Privilege; +import com.baeldung.roles.custom.persistence.model.Privilege; import org.springframework.data.jpa.repository.JpaRepository; public interface PrivilegeRepository extends JpaRepository { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/UserRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/UserRepository.java similarity index 74% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/UserRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/UserRepository.java index 68dd1d756c..884a998219 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/UserRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/UserRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.custom.persistence.dao; +package com.baeldung.roles.custom.persistence.dao; -import org.baeldung.custom.persistence.model.User; +import com.baeldung.roles.custom.persistence.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.transaction.annotation.Transactional; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Foo.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Foo.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Foo.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Foo.java index f139382eea..3dbf48f7ce 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Foo.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.persistence.model; +package com.baeldung.roles.custom.persistence.model; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Organization.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Organization.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Organization.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Organization.java index 1fdb88e320..0d0220b6b2 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Organization.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Organization.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.persistence.model; +package com.baeldung.roles.custom.persistence.model; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Privilege.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Privilege.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Privilege.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Privilege.java index ed3edd5085..60e0506641 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Privilege.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Privilege.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.persistence.model; +package com.baeldung.roles.custom.persistence.model; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/User.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/User.java similarity index 98% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/User.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/User.java index c14ef034b4..219f40a3df 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/User.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/User.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.persistence.model; +package com.baeldung.roles.custom.persistence.model; import java.util.Set; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionHandler.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionHandler.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionHandler.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionHandler.java index 646f5a387f..76e94a9dd4 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionHandler.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.security; +package com.baeldung.roles.custom.security; import org.aopalliance.intercept.MethodInvocation; import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionRoot.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionRoot.java similarity index 92% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionRoot.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionRoot.java index b2f2be8cf5..dd9f6a5786 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionRoot.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionRoot.java @@ -1,6 +1,6 @@ -package org.baeldung.custom.security; +package com.baeldung.roles.custom.security; -import org.baeldung.custom.persistence.model.User; +import com.baeldung.roles.custom.persistence.model.User; import org.springframework.security.access.expression.SecurityExpressionRoot; import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; import org.springframework.security.core.Authentication; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomPermissionEvaluator.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomPermissionEvaluator.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomPermissionEvaluator.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomPermissionEvaluator.java index f436b4488b..d69e405b28 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomPermissionEvaluator.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomPermissionEvaluator.java @@ -1,4 +1,4 @@ -package org.baeldung.custom.security; +package com.baeldung.roles.custom.security; import java.io.Serializable; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MySecurityExpressionRoot.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MySecurityExpressionRoot.java similarity index 98% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MySecurityExpressionRoot.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MySecurityExpressionRoot.java index 03d18cb755..8448ad9075 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MySecurityExpressionRoot.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MySecurityExpressionRoot.java @@ -1,11 +1,11 @@ -package org.baeldung.custom.security; +package com.baeldung.roles.custom.security; import java.io.Serializable; import java.util.Collection; import java.util.HashSet; import java.util.Set; -import org.baeldung.custom.persistence.model.User; +import com.baeldung.roles.custom.persistence.model.User; import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations; import org.springframework.security.access.hierarchicalroles.RoleHierarchy; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserDetailsService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserDetailsService.java similarity index 83% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserDetailsService.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserDetailsService.java index b9b40fbcb9..c6514d6c05 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserDetailsService.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserDetailsService.java @@ -1,7 +1,7 @@ -package org.baeldung.custom.security; +package com.baeldung.roles.custom.security; -import org.baeldung.custom.persistence.dao.UserRepository; -import org.baeldung.custom.persistence.model.User; +import com.baeldung.roles.custom.persistence.dao.UserRepository; +import com.baeldung.roles.custom.persistence.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserPrincipal.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserPrincipal.java similarity index 89% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserPrincipal.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserPrincipal.java index 7d57227316..41741c64f4 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserPrincipal.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserPrincipal.java @@ -1,11 +1,11 @@ -package org.baeldung.custom.security; +package com.baeldung.roles.custom.security; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.baeldung.custom.persistence.model.Privilege; -import org.baeldung.custom.persistence.model.User; +import com.baeldung.roles.custom.persistence.model.Privilege; +import com.baeldung.roles.custom.persistence.model.User; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/web/MainController.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/web/MainController.java similarity index 87% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/web/MainController.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/web/MainController.java index 74de45d1a8..beb12f7749 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/web/MainController.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/custom/web/MainController.java @@ -1,9 +1,9 @@ -package org.baeldung.custom.web; +package com.baeldung.roles.custom.web; -import org.baeldung.custom.persistence.dao.OrganizationRepository; -import org.baeldung.custom.persistence.model.Foo; -import org.baeldung.custom.persistence.model.Organization; -import org.baeldung.custom.security.MyUserPrincipal; +import com.baeldung.roles.custom.persistence.dao.OrganizationRepository; +import com.baeldung.roles.custom.persistence.model.Foo; +import com.baeldung.roles.custom.persistence.model.Organization; +import com.baeldung.roles.custom.security.MyUserPrincipal; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/IpApplication.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/IpApplication.java similarity index 90% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/IpApplication.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/IpApplication.java index d77414c54e..b9a86fee3e 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/IpApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/IpApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.ip; +package com.baeldung.roles.ip; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,7 +7,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.PropertySource; @SpringBootApplication -@ComponentScan("org.baeldung.ip") +@ComponentScan("com.baeldung.ip") @PropertySource("classpath:application-defaults.properties") public class IpApplication extends SpringBootServletInitializer { public static void main(String[] args) { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/CustomIpAuthenticationProvider.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/CustomIpAuthenticationProvider.java similarity index 98% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/CustomIpAuthenticationProvider.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/CustomIpAuthenticationProvider.java index 078dd81259..adcadb65e8 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/CustomIpAuthenticationProvider.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/CustomIpAuthenticationProvider.java @@ -1,4 +1,4 @@ -package org.baeldung.ip.config; +package com.baeldung.roles.ip.config; import java.util.ArrayList; import java.util.HashSet; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityConfig.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityConfig.java index 3a8032a734..46ba62afb3 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.ip.config; +package com.baeldung.roles.ip.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityXmlConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityXmlConfig.java similarity index 77% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityXmlConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityXmlConfig.java index 1d22ca4c67..4b2cf43f6a 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityXmlConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityXmlConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.ip.config; +package com.baeldung.roles.ip.config; //@Configuration diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/web/MainController.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/web/MainController.java similarity index 94% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/web/MainController.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/web/MainController.java index 940194c421..438b668c5f 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/web/MainController.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/ip/web/MainController.java @@ -1,11 +1,11 @@ -package org.baeldung.ip.web; +package com.baeldung.roles.ip.web; import java.util.List; import javax.servlet.Filter; import javax.servlet.http.HttpServletRequest; -import org.baeldung.custom.persistence.model.Foo; +import com.baeldung.roles.custom.persistence.model.Foo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.web.FilterChainProxy; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/CustomAuthenticationProvider.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/CustomAuthenticationProvider.java similarity index 89% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/CustomAuthenticationProvider.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/CustomAuthenticationProvider.java index d7195ac358..5168e64b4a 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/CustomAuthenticationProvider.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/CustomAuthenticationProvider.java @@ -1,7 +1,7 @@ -package org.baeldung.rolesauthorities; +package com.baeldung.roles.rolesauthorities; -import org.baeldung.rolesauthorities.model.User; -import org.baeldung.rolesauthorities.persistence.UserRepository; +import com.baeldung.roles.rolesauthorities.model.User; +import com.baeldung.roles.rolesauthorities.persistence.UserRepository; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyLogoutSuccessHandler.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyLogoutSuccessHandler.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyLogoutSuccessHandler.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyLogoutSuccessHandler.java index b0dc0b7537..23104e5292 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyLogoutSuccessHandler.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyLogoutSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.rolesauthorities; +package com.baeldung.roles.rolesauthorities; import java.io.IOException; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyUserDetailsService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyUserDetailsService.java similarity index 90% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyUserDetailsService.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyUserDetailsService.java index f38b867a75..18230ba794 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyUserDetailsService.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyUserDetailsService.java @@ -1,13 +1,13 @@ -package org.baeldung.rolesauthorities; +package com.baeldung.roles.rolesauthorities; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -import org.baeldung.rolesauthorities.model.Role; -import org.baeldung.rolesauthorities.model.User; -import org.baeldung.rolesauthorities.persistence.UserRepository; +import com.baeldung.roles.rolesauthorities.model.Role; +import com.baeldung.roles.rolesauthorities.model.User; +import com.baeldung.roles.rolesauthorities.persistence.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/RolesAuthoritiesApplication.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/RolesAuthoritiesApplication.java similarity index 87% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/RolesAuthoritiesApplication.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/RolesAuthoritiesApplication.java index 3c4e6f7b5a..d3e54b4303 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/RolesAuthoritiesApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/RolesAuthoritiesApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.rolesauthorities; +package com.baeldung.roles.rolesauthorities; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -8,7 +8,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration -@ComponentScan("org.baeldung.rolesauthorities") +@ComponentScan("com.baeldung.rolesauthorities") public class RolesAuthoritiesApplication extends SpringBootServletInitializer { public static void main(String[] args) { System.setProperty("spring.profiles.default", "rolesauthorities"); diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/MvcConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/MvcConfig.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/MvcConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/MvcConfig.java index c42958457e..61394b6178 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/MvcConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/MvcConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.rolesauthorities.config; +package com.baeldung.roles.rolesauthorities.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/SecurityConfig.java similarity index 90% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/SecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/SecurityConfig.java index 7624dd7d39..cb8476fcc7 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/SecurityConfig.java @@ -1,7 +1,7 @@ -package org.baeldung.rolesauthorities.config; +package com.baeldung.roles.rolesauthorities.config; -import org.baeldung.rolesauthorities.CustomAuthenticationProvider; -import org.baeldung.rolesauthorities.persistence.UserRepository; +import com.baeldung.roles.rolesauthorities.CustomAuthenticationProvider; +import com.baeldung.roles.rolesauthorities.persistence.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -18,7 +18,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; @Configuration -@ComponentScan(basePackages = { "org.baeldung.rolesauthorities" }) +@ComponentScan(basePackages = {"com.baeldung.rolesauthorities"}) @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @@ -76,7 +76,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public DaoAuthenticationProvider authProvider() { - final CustomAuthenticationProvider authProvider + final CustomAuthenticationProvider authProvider = new CustomAuthenticationProvider(userRepository, userDetailsService); authProvider.setPasswordEncoder(encoder()); return authProvider; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Privilege.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Privilege.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Privilege.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Privilege.java index ab2cd08610..507beaffa8 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Privilege.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Privilege.java @@ -1,4 +1,4 @@ -package org.baeldung.rolesauthorities.model; +package com.baeldung.roles.rolesauthorities.model; import java.util.Collection; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Role.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Role.java similarity index 97% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Role.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Role.java index ac33e32fcf..a284d92090 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Role.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Role.java @@ -1,4 +1,4 @@ -package org.baeldung.rolesauthorities.model; +package com.baeldung.roles.rolesauthorities.model; import java.util.Collection; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/User.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/User.java similarity index 98% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/User.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/User.java index dc1096541d..ebf0c9b310 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/User.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/User.java @@ -1,4 +1,4 @@ -package org.baeldung.rolesauthorities.model; +package com.baeldung.roles.rolesauthorities.model; import java.util.Collection; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/IUserService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/IUserService.java new file mode 100644 index 0000000000..be9cb911d7 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/IUserService.java @@ -0,0 +1,9 @@ +package com.baeldung.roles.rolesauthorities.persistence; + +import com.baeldung.roles.rolesauthorities.model.User; + +public interface IUserService { + + User findUserByEmail(String email); + +} diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/PrivilegeRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/PrivilegeRepository.java similarity index 65% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/PrivilegeRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/PrivilegeRepository.java index 05d5f2b870..f8ba7def49 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/PrivilegeRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/PrivilegeRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.rolesauthorities.persistence; +package com.baeldung.roles.rolesauthorities.persistence; -import org.baeldung.rolesauthorities.model.Privilege; +import com.baeldung.roles.rolesauthorities.model.Privilege; import org.springframework.data.jpa.repository.JpaRepository; public interface PrivilegeRepository extends JpaRepository { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/RoleRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/RoleRepository.java similarity index 63% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/RoleRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/RoleRepository.java index 25e3b3a1f6..e5833712fe 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/RoleRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/RoleRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.rolesauthorities.persistence; +package com.baeldung.roles.rolesauthorities.persistence; -import org.baeldung.rolesauthorities.model.Role; +import com.baeldung.roles.rolesauthorities.model.Role; import org.springframework.data.jpa.repository.JpaRepository; public interface RoleRepository extends JpaRepository { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/SetupDataLoader.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/SetupDataLoader.java similarity index 93% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/SetupDataLoader.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/SetupDataLoader.java index 46dad4f06d..140fc56e53 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/SetupDataLoader.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/SetupDataLoader.java @@ -1,13 +1,13 @@ -package org.baeldung.rolesauthorities.persistence; +package com.baeldung.roles.rolesauthorities.persistence; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; -import org.baeldung.rolesauthorities.model.Privilege; -import org.baeldung.rolesauthorities.model.Role; -import org.baeldung.rolesauthorities.model.User; +import com.baeldung.roles.rolesauthorities.model.Privilege; +import com.baeldung.roles.rolesauthorities.model.Role; +import com.baeldung.roles.rolesauthorities.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/UserRepository.java similarity index 64% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserRepository.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/UserRepository.java index bca2953153..6801eec01d 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserRepository.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/UserRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.rolesauthorities.persistence; +package com.baeldung.roles.rolesauthorities.persistence; -import org.baeldung.rolesauthorities.model.User; +import com.baeldung.roles.rolesauthorities.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/UserService.java similarity index 77% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserService.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/UserService.java index 3b16c78898..17770e5cd0 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserService.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/UserService.java @@ -1,8 +1,8 @@ -package org.baeldung.rolesauthorities.persistence; +package com.baeldung.roles.rolesauthorities.persistence; import javax.transaction.Transactional; -import org.baeldung.rolesauthorities.model.User; +import com.baeldung.roles.rolesauthorities.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/MinuteBasedVoter.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/MinuteBasedVoter.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/MinuteBasedVoter.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/MinuteBasedVoter.java index 2beda1e557..6970441a4e 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/MinuteBasedVoter.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/MinuteBasedVoter.java @@ -1,4 +1,4 @@ -package org.baeldung.voter; +package com.baeldung.roles.voter; import java.time.LocalDateTime; import java.util.Collection; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterApplication.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterApplication.java similarity index 83% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterApplication.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterApplication.java index d2078e6115..d3e0652ae9 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.voter; +package com.baeldung.roles.voter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -7,7 +7,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration -@ComponentScan(basePackages = { "org.baeldung.voter" }) +@ComponentScan(basePackages = {"com.baeldung.voter"}) public class VoterApplication { public static void main(String[] args) { diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterMvcConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java similarity index 71% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterMvcConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java index 8f41153f06..f11a4ae06c 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterMvcConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java @@ -1,10 +1,8 @@ -package org.baeldung.voter; +package com.baeldung.roles.voter; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * Created by ambrusadrianz on 30/09/2016. diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/WebSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java similarity index 96% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/WebSecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java index 84ed070e8e..8a0f438b49 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.voter; +package com.baeldung.roles.voter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -15,7 +15,6 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.access.expression.WebExpressionVoter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import java.util.Arrays; import java.util.List; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/XmlSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/XmlSecurityConfig.java similarity index 60% rename from spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/XmlSecurityConfig.java rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/XmlSecurityConfig.java index 8041585f42..0ef2ef51c7 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/XmlSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/roles/voter/XmlSecurityConfig.java @@ -1,7 +1,4 @@ -package org.baeldung.voter; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.ImportResource; +package com.baeldung.roles.voter; /** * Created by ambrusadrianz on 09/10/2016. diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java deleted file mode 100644 index 2c508cbd20..0000000000 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.baeldung.rolesauthorities.persistence; - -import org.baeldung.rolesauthorities.model.User; - -public interface IUserService { - - User findUserByEmail(String email); - -} diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-custom-voter.xml b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-custom-voter.xml index 0b334a3694..9f510280a1 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-custom-voter.xml +++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-custom-voter.xml @@ -22,12 +22,12 @@ - + - + diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java index b2def82c51..54120650d9 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java @@ -1,12 +1,11 @@ package com.baeldung.relationships; -import com.baeldung.AppConfig; -import com.baeldung.data.repositories.TweetRepository; -import com.baeldung.data.repositories.UserRepository; -import com.baeldung.models.AppUser; -import com.baeldung.models.Tweet; -import com.baeldung.security.AppUserPrincipal; -import com.baeldung.util.DummyContentUtil; +import com.baeldung.relationships.repositories.TweetRepository; +import com.baeldung.relationships.repositories.UserRepository; +import com.baeldung.relationships.models.AppUser; +import com.baeldung.relationships.models.Tweet; +import com.baeldung.relationships.security.AppUserPrincipal; +import com.baeldung.relationships.util.DummyContentUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/SpringContextTest.java similarity index 83% rename from spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/SpringContextTest.java index 2041249b71..7b23b878c8 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/SpringContextTest.java @@ -1,6 +1,6 @@ -package org.baeldung; +package com.baeldung.roles; -import org.baeldung.custom.Application; +import com.baeldung.roles.custom.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/ApplicationLiveTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java similarity index 94% rename from spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/ApplicationLiveTest.java rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java index e199411e58..5a040b8dea 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/ApplicationLiveTest.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java @@ -1,9 +1,9 @@ -package org.baeldung.web; +package com.baeldung.roles.web; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.baeldung.custom.persistence.model.Foo; +import com.baeldung.roles.custom.persistence.model.Foo; import io.restassured.RestAssured; import io.restassured.authentication.FormAuthConfig; @@ -13,7 +13,7 @@ import io.restassured.specification.RequestSpecification; import org.junit.Test; import org.springframework.http.MediaType; -// In order to execute these tests, org.baeldung.custom.Application needs to be running. +// In order to execute these tests, com.baeldung.custom.Application needs to be running. public class ApplicationLiveTest { @Test diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/CustomUserDetailsServiceIntegrationTest.java similarity index 95% rename from spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/CustomUserDetailsServiceIntegrationTest.java index d16acc729a..df7645150f 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/CustomUserDetailsServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package com.baeldung.roles.web; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -7,8 +7,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.apache.http.HttpHeaders; -import org.baeldung.custom.Application; -import org.baeldung.custom.persistence.model.Foo; +import com.baeldung.roles.custom.Application; +import com.baeldung.roles.custom.persistence.model.Foo; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -59,7 +59,7 @@ public class CustomUserDetailsServiceIntegrationTest { @WithAnonymousUser public void givenAnonymous_whenRequestFoo_thenRetrieveUnauthorized() throws Exception { this.mvc.perform(get("/foos/1").with(csrf())) - .andExpect(status().isUnauthorized()); + .andExpect(status().isFound()); } @Test diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/IpLiveTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/IpLiveTest.java similarity index 89% rename from spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/IpLiveTest.java rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/IpLiveTest.java index 761f5450f7..2d0e2e5402 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/IpLiveTest.java +++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/roles/web/IpLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package com.baeldung.roles.web; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -8,7 +8,7 @@ import io.restassured.response.Response; import org.junit.Test; -// In order to execute these tests, org.baeldung.ip.IpApplication needs to be running. +// In order to execute these tests, com.baeldung.ip.IpApplication needs to be running. public class IpLiveTest { @Test From 9a4f4e47dc1a6a282bf676183150e5890cc5591f Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 16:55:18 +0100 Subject: [PATCH 069/530] JAVA-86: spring-boot-custom-error-page --- .../spring-boot-basic-customization/README.md | 3 ++ .../spring-boot-basic-customization/pom.xml | 5 +++ .../ErrorHandlingApplication.java | 15 +++++++ .../controllers/IndexController.java | 26 ++++++++++++ .../controllers/MyErrorController.java | 40 +++++++++++++++++++ .../application-errorhandling.properties | 10 +++++ .../main/resources/templates/error-404.html | 7 ++++ .../main/resources/templates/error-500.html | 9 +++++ .../src/main/resources/templates/error.html | 8 ++++ .../main/resources/templates/error/404.html | 8 ++++ .../src/main/resources/templates/index.html | 6 +++ 11 files changed, 137 insertions(+) create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-404.html create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-500.html create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error.html create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error/404.html create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/index.html diff --git a/spring-boot-modules/spring-boot-basic-customization/README.md b/spring-boot-modules/spring-boot-basic-customization/README.md index 1a899fd13a..98d1402631 100644 --- a/spring-boot-modules/spring-boot-basic-customization/README.md +++ b/spring-boot-modules/spring-boot-basic-customization/README.md @@ -6,3 +6,6 @@ This module contains articles about Spring Boot customization - [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) - [Using Custom Banners in Spring Boot](https://www.baeldung.com/spring-boot-custom-banners) + - [Create a Custom FailureAnalyzer with Spring Boot](https://www.baeldung.com/spring-boot-failure-analyzer) + - [Spring Boot: Customize Whitelabel Error Page](https://www.baeldung.com/spring-boot-custom-error-page) + diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml index ef56623775..4a45c548dd 100644 --- a/spring-boot-modules/spring-boot-basic-customization/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization/pom.xml @@ -26,6 +26,11 @@ spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-thymeleaf + + org.springframework.boot spring-boot-starter-test diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java new file mode 100644 index 0000000000..5dd55ef077 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.errorhandling; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.errorhandling") +public class ErrorHandlingApplication { + + public static void main(String [] args) { + System.setProperty("spring.profiles.active", "errorhandling"); + SpringApplication.run(ErrorHandlingApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java new file mode 100644 index 0000000000..1a8761e96b --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java @@ -0,0 +1,26 @@ +package com.baeldung.errorhandling.controllers; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +@Controller +public class IndexController { + + @GetMapping(value = {"/", ""}) + public String index() { + return "index"; + } + + @GetMapping(value = {"/server_error"}) + public String triggerServerError() { + "ser".charAt(30); + return "index"; + } + + @PostMapping(value = {"/general_error"}) + public String triggerGeneralError() { + return "index"; + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java new file mode 100644 index 0000000000..e002ac045d --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java @@ -0,0 +1,40 @@ +package com.baeldung.errorhandling.controllers; + +import org.springframework.boot.web.servlet.error.ErrorController; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.servlet.RequestDispatcher; +import javax.servlet.http.HttpServletRequest; + +@Controller +public class MyErrorController implements ErrorController { + + public MyErrorController() {} + + @GetMapping(value = "/error") + public String handleError(HttpServletRequest request) { + + Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); + + if (status != null) { + + Integer statusCode = Integer.valueOf(status.toString()); + + if(statusCode == HttpStatus.NOT_FOUND.value()) { + return "error-404"; + } + else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { + return "error-500"; + } + } + return "error"; + } + + @Override + public String getErrorPath() { + return "/error"; + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties new file mode 100644 index 0000000000..fba5c21cd4 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties @@ -0,0 +1,10 @@ +#server +server.port=9000 +server.servlet-path=/ +server.context-path=/ +server.error.whitelabel.enabled=false + +#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration + +#for Spring Boot 2.0+ +#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-404.html b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-404.html new file mode 100644 index 0000000000..555cf52de4 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-404.html @@ -0,0 +1,7 @@ + + + +

Sorry, we couldn't find the page you were looking for.

+

Go Home

+ + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-500.html b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-500.html new file mode 100644 index 0000000000..fc64c7e180 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error-500.html @@ -0,0 +1,9 @@ + + + +

Sorry, something went wrong!

+ +

We're fixing it.

+

Go Home

+ + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error.html b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error.html new file mode 100644 index 0000000000..4e953059e2 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error.html @@ -0,0 +1,8 @@ + + + +

Something went wrong!

+

Our Engineers are on it.

+

Go Home

+ + diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error/404.html b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error/404.html new file mode 100644 index 0000000000..df83ce219b --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/error/404.html @@ -0,0 +1,8 @@ + + + RESOURCE NOT FOUND + + +

404 RESOURCE NOT FOUND

+ + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/index.html b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/index.html new file mode 100644 index 0000000000..95c68c8600 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/templates/index.html @@ -0,0 +1,6 @@ + + +

Welcome Home

+

Success! It is working as we expected.

+ + From 2c0cf3e2e02de86f36e65212248f8625657c8c28 Mon Sep 17 00:00:00 2001 From: mike b Date: Sun, 15 Mar 2020 14:14:46 -0400 Subject: [PATCH 070/530] [BAEL-3646] Conditional Flow in Spring Batch --- .../ConditionalFlowApplication.java | 18 ++++ .../conditionalflow/NumberInfoDecider.java | 19 +++++ .../config/NumberInfoConfig.java | 85 +++++++++++++++++++ .../conditionalflow/model/NumberInfo.java | 47 ++++++++++ .../conditionalflow/step/NotifierTasklet.java | 14 +++ .../step/NumberInfoClassifier.java | 31 +++++++ .../step/NumberInfoClassifierWithDecider.java | 15 ++++ .../step/NumberInfoGenerator.java | 23 +++++ .../step/NumberInfoProcessor.java | 17 ++++ .../step/PrependingStdoutWriter.java | 30 +++++++ .../model/NumberInfoUnitTest.java | 44 ++++++++++ .../step/NumberInfoClassifierUnitTest.java | 17 ++++ .../step/NumberInfoGeneratorUnitTest.java | 20 +++++ 13 files changed, 380 insertions(+) create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java create mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java create mode 100644 spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java create mode 100644 spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java create mode 100644 spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java new file mode 100644 index 0000000000..8b6c841b6e --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java @@ -0,0 +1,18 @@ +package org.baeldung.conditionalflow; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ConditionalFlowApplication implements CommandLineRunner { + + public static void main(String[] args) { + SpringApplication.run(ConditionalFlowApplication.class, args); + } + + @Override + public void run(String... args) throws Exception { + System.out.println("Running and exiting"); + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java new file mode 100644 index 0000000000..017980f1a4 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java @@ -0,0 +1,19 @@ +package org.baeldung.conditionalflow; + +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.flow.FlowExecutionStatus; +import org.springframework.batch.core.job.flow.JobExecutionDecider; + +public class NumberInfoDecider implements JobExecutionDecider { + + @Override + public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) { + if(jobExecution.getExitStatus().equals("UNKNOWN")) { + return new FlowExecutionStatus("NOTIFY"); + } else { + return null; + } + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java new file mode 100644 index 0000000000..fd28c2291f --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java @@ -0,0 +1,85 @@ +package org.baeldung.conditionalflow.config; + +import org.baeldung.conditionalflow.NumberInfoDecider; +import org.baeldung.conditionalflow.model.NumberInfo; +import org.baeldung.conditionalflow.step.*; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableBatchProcessing +public class NumberInfoConfig { + + @Bean + @Qualifier("NotificationStep") + public Step notificationStep(StepBuilderFactory sbf) { + return sbf.get("Billing step").tasklet(new NotifierTasklet()).build(); + } + + public Step numberGeneratorStep(StepBuilderFactory sbf, int[] values, String prepend) { + return sbf.get("Number generator") + .chunk(1) + .reader(new NumberInfoGenerator(values)) + .processor(new NumberInfoClassifier()) + .writer(new PrependingStdoutWriter<>(prepend)) + .build(); + } + + public Step numberGeneratorStepDecider(StepBuilderFactory sbf, int[] values, String prepend) { + return sbf.get("Number generator") + .chunk(1) + .reader(new NumberInfoGenerator(values)) + .processor(new NumberInfoClassifierWithDecider()) + .writer(new PrependingStdoutWriter<>(prepend)) + .build(); + } + + @Bean + public Job numberGeneratorNonNotifierJob(JobBuilderFactory jobBuilderFactory, + StepBuilderFactory stepBuilderFactory, + @Qualifier("NotificationStep") Step notificationStep + ) { + int[] nonNotifierData = {-1, -2, -3}; + Step step = numberGeneratorStep(stepBuilderFactory, nonNotifierData, "First Dataset Processor"); + return jobBuilderFactory.get("Number generator - first dataset") + .start(step) + .on("NOTIFY").to(notificationStep) + .from(step).on("*").stop() + .end() + .build(); + } + + @Bean + public Job numberGeneratorNotifierJob(JobBuilderFactory jobBuilderFactory, + StepBuilderFactory stepBuilderFactory, + @Qualifier("NotificationStep") Step notificationStep + ) { + int[] billableData = {11, -2, -3}; + Step dataProviderStep = numberGeneratorStep(stepBuilderFactory, billableData, "Second Dataset Processor"); + return jobBuilderFactory.get("Number generator - second dataset") + .start(dataProviderStep) + .on("NOTIFY").to(notificationStep) + .end() + .build(); + } + + @Bean + public Job numberGeneratorNotifierJobWithDecider(JobBuilderFactory jobBuilderFactory, + StepBuilderFactory stepBuilderFactory, + @Qualifier("NotificationStep") Step notificationStep + ) { + int[] billableData = {11, -2, -3}; + Step dataProviderStep = numberGeneratorStepDecider(stepBuilderFactory, billableData, "Third Dataset Processor"); + return jobBuilderFactory.get("Number generator - third dataset") + .start(dataProviderStep) + .next(new NumberInfoDecider()).on("NOTIFY").to(notificationStep) + .end() + .build(); + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java new file mode 100644 index 0000000000..81bd67d2a1 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java @@ -0,0 +1,47 @@ +package org.baeldung.conditionalflow.model; + +import java.util.Objects; + +public class NumberInfo { + private int number; + + public static NumberInfo from(int number){ + return new NumberInfo(number); + } + + public NumberInfo(int number) { + this.number = number; + } + + public boolean isPositive() { + return number > 0; + } + + public boolean isEven() { + return number % 2 == 0; + } + + public int getNumber() { + return number; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NumberInfo that = (NumberInfo) o; + return number == that.number; + } + + @Override + public int hashCode() { + return Objects.hash(number); + } + + @Override + public String toString() { + return "NumberInfo{" + + "number=" + number + + '}'; + } +} \ No newline at end of file diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java new file mode 100644 index 0000000000..6a88edcbbe --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java @@ -0,0 +1,14 @@ +package org.baeldung.conditionalflow.step; + +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; + +public class NotifierTasklet implements Tasklet { + @Override + public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { + System.err.println("[" + chunkContext.getStepContext().getJobName() + "] contains interesting data!!"); + return RepeatStatus.FINISHED; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java new file mode 100644 index 0000000000..95b1e4d155 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java @@ -0,0 +1,31 @@ +package org.baeldung.conditionalflow.step; + +import org.baeldung.conditionalflow.model.NumberInfo; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.listener.ItemListenerSupport; +import org.springframework.batch.item.ItemProcessor; + +public class NumberInfoClassifier extends ItemListenerSupport + implements ItemProcessor { + private StepExecution stepExecution; + + @BeforeStep + public void beforeStep(StepExecution stepExecution) { + this.stepExecution = stepExecution; + } + + @Override + public void afterProcess(NumberInfo item, Integer result) { + super.afterProcess(item, result); + if (item.isPositive()) { + stepExecution.setExitStatus(new ExitStatus("NOTIFY")); + } + } + + @Override + public Integer process(NumberInfo numberInfo) throws Exception { + return Integer.valueOf(numberInfo.getNumber()); + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java new file mode 100644 index 0000000000..0ba7fde279 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java @@ -0,0 +1,15 @@ +package org.baeldung.conditionalflow.step; + +import org.baeldung.conditionalflow.model.NumberInfo; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.item.ItemProcessor; + +public class NumberInfoClassifierWithDecider + implements ItemProcessor { + private StepExecution stepExecution; + + @Override + public Integer process(NumberInfo numberInfo) throws Exception { + return Integer.valueOf(numberInfo.getNumber()); + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java new file mode 100644 index 0000000000..35f6c39778 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java @@ -0,0 +1,23 @@ +package org.baeldung.conditionalflow.step; + +import org.baeldung.conditionalflow.model.NumberInfo; +import org.springframework.batch.item.ItemReader; + +public class NumberInfoGenerator implements ItemReader { + private int[] values; + private int counter; + + public NumberInfoGenerator(int[] values){ + this.values = values; + counter = 0; + } + + @Override + public NumberInfo read() { + if(counter == values.length){ + return null; + } else { + return new NumberInfo(values[counter++]); + } + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java new file mode 100644 index 0000000000..fe566221de --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java @@ -0,0 +1,17 @@ +package org.baeldung.conditionalflow.step; + +import org.baeldung.conditionalflow.model.NumberInfo; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.listener.ItemListenerSupport; +import org.springframework.batch.item.ItemProcessor; + +public class NumberInfoProcessor implements ItemProcessor { + private StepExecution stepExecution; + + @Override + public Integer process(NumberInfo numberInfo) throws Exception { + return Integer.valueOf(numberInfo.getNumber()); + } +} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java new file mode 100644 index 0000000000..8b8959d249 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java @@ -0,0 +1,30 @@ +package org.baeldung.conditionalflow.step; + +import org.springframework.batch.item.ItemWriter; + +import java.io.OutputStream; +import java.util.List; + +public class PrependingStdoutWriter implements ItemWriter { + private String prependText; + private OutputStream writeTo; + + private PrependingStdoutWriter() { + } + + public PrependingStdoutWriter(String prependText, OutputStream os){ + this.prependText = prependText; + this.writeTo = os; + } + + public PrependingStdoutWriter(String prependText) { + this(prependText, System.out); + } + + @Override + public void write(List list) throws Exception { + for (T listItem : list) { + System.out.println(prependText + " " + listItem.toString()); + } + } +} diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java new file mode 100644 index 0000000000..cf3d361412 --- /dev/null +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java @@ -0,0 +1,44 @@ +package org.baeldung.conditionalflow.model; + +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.jupiter.api.Assertions.*; + +@RunWith(SpringJUnit4ClassRunner.class) +class NumberInfoUnitTest { + + @Test + void isPositive() { + assertTrue(NumberInfo.from(1).isPositive()); + assertTrue(NumberInfo.from(11).isPositive()); + assertFalse(NumberInfo.from(0).isPositive()); + assertFalse(NumberInfo.from(-1).isPositive()); + assertFalse(NumberInfo.from(-10).isPositive()); + } + + @Test + void isEven() { + assertTrue(NumberInfo.from(0).isEven()); + assertTrue(NumberInfo.from(-2).isEven()); + assertTrue(NumberInfo.from(2).isEven()); + assertTrue(NumberInfo.from(-22).isEven()); + assertTrue(NumberInfo.from(22).isEven()); + + assertFalse(NumberInfo.from(1).isEven()); + assertFalse(NumberInfo.from(-1).isEven()); + + assertFalse(NumberInfo.from(13).isEven()); + assertFalse(NumberInfo.from(-13).isEven()); + assertFalse(NumberInfo.from(31).isEven()); + assertFalse(NumberInfo.from(-51).isEven()); + } + + @Test + void getNumber() { + for(int i = -100 ; i < 100 ; i++){ + assertEquals(i, NumberInfo.from(i).getNumber()); + } + } +} \ No newline at end of file diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java new file mode 100644 index 0000000000..c195740caa --- /dev/null +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java @@ -0,0 +1,17 @@ +package org.baeldung.conditionalflow.step; + +import org.baeldung.conditionalflow.model.NumberInfo; +import org.baeldung.conditionalflow.step.NumberInfoClassifier; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class NumberInfoClassifierUnitTest { + + @Test + void process() throws Exception { + NumberInfoClassifier nic = new NumberInfoClassifier(); + assertEquals(Integer.valueOf(4), nic.process(NumberInfo.from(4))); + assertEquals(Integer.valueOf(-4), nic.process(NumberInfo.from(-4))); + } +} \ No newline at end of file diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java new file mode 100644 index 0000000000..3fc240bcbf --- /dev/null +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java @@ -0,0 +1,20 @@ +package org.baeldung.conditionalflow.step; + +import org.baeldung.conditionalflow.model.NumberInfo; +import org.junit.jupiter.api.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class NumberInfoGeneratorUnitTest { + @Test + public void testGenerateNumbers() { + int[] numbers = new int[]{1, -2, 4, -10}; + NumberInfoGenerator numberGenerator = new NumberInfoGenerator(numbers); + assertEquals(new NumberInfo(numbers[0]), numberGenerator.read()); + assertEquals(new NumberInfo(numbers[1]), numberGenerator.read()); + assertEquals(new NumberInfo(numbers[2]), numberGenerator.read()); + assertEquals(new NumberInfo(numbers[3]), numberGenerator.read()); + assertNull(numberGenerator.read()); + } +} \ No newline at end of file From e2b2efa72dd36091e8b238923b9571f496dd739e Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 20:10:28 +0100 Subject: [PATCH 071/530] JAVA-86: Refactor spring-boot-custom-error-page --- .../com/baeldung/errorhandling/ErrorHandlingApplication.java | 4 +--- .../src/main/resources/application-errorhandling.properties | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java index 5dd55ef077..9f6c209deb 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java @@ -2,10 +2,8 @@ package com.baeldung.errorhandling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.errorhandling") +@SpringBootApplication(scanBasePackages = "com.baeldung.errorhandling") public class ErrorHandlingApplication { public static void main(String [] args) { diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties index fba5c21cd4..0a6d68763c 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application-errorhandling.properties @@ -1,7 +1,7 @@ #server server.port=9000 -server.servlet-path=/ -server.context-path=/ +spring.mvc.servlet.path=/ +server.servlet.context-path=/ server.error.whitelabel.enabled=false #spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration From c79e927ddde6f50f91424e64beb57fe3f1aae4bd Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 20:19:33 +0100 Subject: [PATCH 072/530] JAVA-86: Add tests for spring-boot-failure-analyzer --- .../FailureAnalyzerAppIntegrationTest.java | 45 +++++++++++++++++++ .../failureanalyzer/utils/ListAppender.java | 25 +++++++++++ .../src/test/resources/logback-test.xml | 15 +++++++ 3 files changed, 85 insertions(+) create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml diff --git a/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java new file mode 100644 index 0000000000..2d9fb56217 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java @@ -0,0 +1,45 @@ +package com.baeldung.failureanalyzer; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.baeldung.failureanalyzer.utils.ListAppender; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.boot.SpringApplication; + +import java.util.Collection; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +public class FailureAnalyzerAppIntegrationTest { + + private static final String EXPECTED_ANALYSIS_DESCRIPTION_TITLE = "Description:"; + private static final String EXPECTED_ANALYSIS_DESCRIPTION_CONTENT = "The bean myDAO could not be injected as com.baeldung.failureanalyzer.MyDAO because it is of type com.baeldung.failureanalyzer.MySecondDAO"; + private static final String EXPECTED_ANALYSIS_ACTION_TITLE = "Action:"; + private static final String EXPECTED_ANALYSIS_ACTION_CONTENT = "Consider creating a bean with name myDAO of type com.baeldung.failureanalyzer.MyDAO"; + + @BeforeEach + public void clearLogList() { + ListAppender.clearEventList(); + } + + @Test + public void givenBeanCreationErrorInContext_whenContextLoaded_thenFailureAnalyzerLogsReport() { + try { + SpringApplication.run(FailureAnalyzerApplication.class); + } catch (BeanCreationException e) { + Collection allLoggedEntries = ListAppender.getEvents() + .stream() + .map(ILoggingEvent::getFormattedMessage) + .collect(Collectors.toList()); + assertThat(allLoggedEntries).anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_DESCRIPTION_TITLE)) + .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_DESCRIPTION_CONTENT)) + .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_ACTION_TITLE)) + .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_ACTION_CONTENT)); + return; + } + throw new IllegalStateException("Context load should be failing due to a BeanCreationException!"); + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java new file mode 100644 index 0000000000..091cd687f1 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java @@ -0,0 +1,25 @@ +package com.baeldung.failureanalyzer.utils; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; + +import java.util.ArrayList; +import java.util.List; + +public class ListAppender extends AppenderBase { + + static private List events = new ArrayList<>(); + + @Override + protected void append(ILoggingEvent eventObject) { + events.add(eventObject); + } + + public static List getEvents() { + return events; + } + + public static void clearEventList() { + events.clear(); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..6919a457cb --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file From 7b7f988f88175e7d7bc657fce32c6406a9d08664 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 20:30:42 +0100 Subject: [PATCH 073/530] JAVA-86: spring-boot-main-class --- .../spring-boot-basic-customization/README.md | 2 +- spring-boot-modules/spring-boot-basic-customization/pom.xml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-basic-customization/README.md b/spring-boot-modules/spring-boot-basic-customization/README.md index 98d1402631..1bfe539a36 100644 --- a/spring-boot-modules/spring-boot-basic-customization/README.md +++ b/spring-boot-modules/spring-boot-basic-customization/README.md @@ -8,4 +8,4 @@ This module contains articles about Spring Boot customization - [Using Custom Banners in Spring Boot](https://www.baeldung.com/spring-boot-custom-banners) - [Create a Custom FailureAnalyzer with Spring Boot](https://www.baeldung.com/spring-boot-failure-analyzer) - [Spring Boot: Customize Whitelabel Error Page](https://www.baeldung.com/spring-boot-custom-error-page) - + - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml index 4a45c548dd..7c2c89def4 100644 --- a/spring-boot-modules/spring-boot-basic-customization/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization/pom.xml @@ -37,4 +37,9 @@ test
+ + + + com.baeldung.changeport.CustomApplication + From b19dbb9c20f19f318cf0f71bbb147434afd40158 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 20:36:28 +0100 Subject: [PATCH 074/530] JAVA-86: spring-boot-add-filter --- .../spring-boot-basic-customization/README.md | 1 + .../bootcustomfilters/FilterConfig.java | 23 ++++++++++ .../SpringBootFiltersApplication.java | 17 +++++++ .../controller/UserController.java | 34 ++++++++++++++ .../filters/RequestResponseLoggingFilter.java | 44 ++++++++++++++++++ .../filters/TransactionFilter.java | 41 +++++++++++++++++ .../bootcustomfilters/model/User.java | 45 +++++++++++++++++++ 7 files changed, 205 insertions(+) create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/model/User.java diff --git a/spring-boot-modules/spring-boot-basic-customization/README.md b/spring-boot-modules/spring-boot-basic-customization/README.md index 1bfe539a36..ce4e29001c 100644 --- a/spring-boot-modules/spring-boot-basic-customization/README.md +++ b/spring-boot-modules/spring-boot-basic-customization/README.md @@ -9,3 +9,4 @@ This module contains articles about Spring Boot customization - [Create a Custom FailureAnalyzer with Spring Boot](https://www.baeldung.com/spring-boot-failure-analyzer) - [Spring Boot: Customize Whitelabel Error Page](https://www.baeldung.com/spring-boot-custom-error-page) - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) + - [How to Define a Spring Boot Filter?](https://www.baeldung.com/spring-boot-add-filter) diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java new file mode 100644 index 0000000000..42da61fe14 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java @@ -0,0 +1,23 @@ +package com.baeldung.bootcustomfilters; + +import com.baeldung.bootcustomfilters.filters.RequestResponseLoggingFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FilterConfig { + + // uncomment this and comment the @Component in the filter class definition to register only for a url pattern + // @Bean + public FilterRegistrationBean loggingFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + + registrationBean.setFilter(new RequestResponseLoggingFilter()); + + registrationBean.addUrlPatterns("/users/*"); + + return registrationBean; + + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java new file mode 100644 index 0000000000..c4653932c0 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java @@ -0,0 +1,17 @@ +package com.baeldung.bootcustomfilters; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Boot application + * @author hemant + * + */ +@SpringBootApplication +public class SpringBootFiltersApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootFiltersApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java new file mode 100644 index 0000000000..50d5f4ea71 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java @@ -0,0 +1,34 @@ +package com.baeldung.bootcustomfilters.controller; + +import com.baeldung.bootcustomfilters.model.User; +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.util.Arrays; +import java.util.List; +import java.util.UUID; + +/** + * Rest controller for User + * @author hemant + * + */ +@RestController +@RequestMapping("/users") +public class UserController { + + private static final Logger LOG = LoggerFactory.getLogger(UserController.class); + + @GetMapping("") + public List getAllUsers() { + LOG.info("Fetching all the users"); + return Arrays.asList( + new User(UUID.randomUUID().toString(), "User1", "user1@test.com"), + new User(UUID.randomUUID().toString(), "User1", "user1@test.com"), + new User(UUID.randomUUID().toString(), "User1", "user1@test.com")); + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java new file mode 100644 index 0000000000..3924354932 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java @@ -0,0 +1,44 @@ +package com.baeldung.bootcustomfilters.filters; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * A servlet filter to log request and response + * The logging implementation is pretty native and for demonstration only + * @author hemant + * + */ +@Component +@Order(2) +public class RequestResponseLoggingFilter implements Filter { + + private final static Logger LOG = LoggerFactory.getLogger(RequestResponseLoggingFilter.class); + + @Override + public void init(final FilterConfig filterConfig) throws ServletException { + LOG.info("Initializing filter :{}", this); + } + + @Override + public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) + throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse res = (HttpServletResponse) response; + LOG.info("Logging Request {} : {}", req.getMethod(), req.getRequestURI()); + chain.doFilter(request, response); + LOG.info("Logging Response :{}", res.getContentType()); + } + + @Override + public void destroy() { + LOG.warn("Destructing filter :{}", this); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java new file mode 100644 index 0000000000..604829c3d3 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java @@ -0,0 +1,41 @@ +package com.baeldung.bootcustomfilters.filters; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * A filter to create transaction before and commit it once request completes + * The current implemenatation is just for demo + * @author hemant + * + */ +@Component +@Order(1) +public class TransactionFilter implements Filter { + + private final static Logger LOG = LoggerFactory.getLogger(TransactionFilter.class); + + @Override + public void init(final FilterConfig filterConfig) throws ServletException { + LOG.info("Initializing filter :{}", this); + } + + @Override + public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + LOG.info("Starting Transaction for req :{}", req.getRequestURI()); + chain.doFilter(request, response); + LOG.info("Committing Transaction for req :{}", req.getRequestURI()); + } + + @Override + public void destroy() { + LOG.warn("Destructing filter :{}", this); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/model/User.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/model/User.java new file mode 100644 index 0000000000..ab8e6c8206 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/model/User.java @@ -0,0 +1,45 @@ +package com.baeldung.bootcustomfilters.model; + +/** + * User model + * @author hemant + * + */ +public class User { + + private String id; + private String name; + private String email; + + public User(String id, String name, String email) { + super(); + this.id = id; + this.name = name; + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + +} From e8eba5fe3d2c121cabd771c81419e9b8944d32e6 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 15 Mar 2020 21:46:59 +0100 Subject: [PATCH 075/530] JAVA-86: spring-boot-favicon --- .../spring-boot-basic-customization/README.md | 1 + .../baeldung/favicon/FaviconApplication.java | 12 +++++ .../favicon/config/FaviconConfiguration.java | 45 ++++++++++++++++++ .../src/main/resources/application.properties | 2 +- .../resources/com/baeldung/images/favicon.ico | Bin 0 -> 15086 bytes .../src/main/resources/favicon.ico | Bin 0 -> 15086 bytes .../src/main/resources/static/favicon.ico | Bin 0 -> 15086 bytes 7 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/com/baeldung/images/favicon.ico create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/favicon.ico create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/resources/static/favicon.ico diff --git a/spring-boot-modules/spring-boot-basic-customization/README.md b/spring-boot-modules/spring-boot-basic-customization/README.md index ce4e29001c..a3d9f1b1fc 100644 --- a/spring-boot-modules/spring-boot-basic-customization/README.md +++ b/spring-boot-modules/spring-boot-basic-customization/README.md @@ -10,3 +10,4 @@ This module contains articles about Spring Boot customization - [Spring Boot: Customize Whitelabel Error Page](https://www.baeldung.com/spring-boot-custom-error-page) - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) - [How to Define a Spring Boot Filter?](https://www.baeldung.com/spring-boot-add-filter) + - [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java new file mode 100644 index 0000000000..f94549b988 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.favicon; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FaviconApplication { + + public static void main(String[] args) { + SpringApplication.run(FaviconApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java new file mode 100644 index 0000000000..d1809199d6 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/config/FaviconConfiguration.java @@ -0,0 +1,45 @@ +package com.baeldung.favicon.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; +import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@Configuration +public class FaviconConfiguration { + + @Bean + public SimpleUrlHandlerMapping myFaviconHandlerMapping() { + SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); + mapping.setOrder(Integer.MIN_VALUE); + mapping.setUrlMap(Collections.singletonMap("/favicon.ico", faviconRequestHandler())); + return mapping; + } + + @Bean + protected ResourceHttpRequestHandler faviconRequestHandler() { + ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler(); + ClassPathResource classPathResource = new ClassPathResource("com/baeldung/images"); + List locations = Arrays.asList(classPathResource); + requestHandler.setLocations(locations); + return requestHandler; + } + + // @Controller + static class FaviconController { + + @RequestMapping(value = "favicon.ico", method = RequestMethod.GET) + @ResponseBody + void favicon() { + } + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties index 2063d36b46..4d4a6ec7bd 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/application.properties @@ -4,4 +4,4 @@ #spring.banner.image.width= //TODO #spring.banner.image.height= //TODO #spring.banner.image.margin= //TODO -#spring.banner.image.invert= //TODO \ No newline at end of file +#spring.banner.image.invert= //TODO diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/com/baeldung/images/favicon.ico b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/com/baeldung/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..64105ac11c6186e380a724416ceb77ab5c263fef GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/favicon.ico b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..64105ac11c6186e380a724416ceb77ab5c263fef GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/resources/static/favicon.ico b/spring-boot-modules/spring-boot-basic-customization/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..64105ac11c6186e380a724416ceb77ab5c263fef GIT binary patch literal 15086 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 literal 0 HcmV?d00001 From 02ce642cbdf71e4fdf5fcb047f8c50f0cd2bed74 Mon Sep 17 00:00:00 2001 From: mikr Date: Sun, 15 Mar 2020 23:00:55 +0100 Subject: [PATCH 076/530] JAVA-877 Update "Redirect after login" article --- ...SimpleUrlAuthenticationSuccessHandler.java | 35 +++++++------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java index 19f49ea59d..73c186cae3 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java @@ -2,6 +2,8 @@ package org.baeldung.security; import java.io.IOException; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -47,26 +49,21 @@ public class MySimpleUrlAuthenticationSuccessHandler implements AuthenticationSu } protected String determineTargetUrl(final Authentication authentication) { - boolean isUser = false; - boolean isAdmin = false; + + Map roleTargetUrlMap = new HashMap<>(); + roleTargetUrlMap.put("ROLE_USER", "/homepage.html"); + roleTargetUrlMap.put("ROLE_ADMIN", "/console.html"); + final Collection authorities = authentication.getAuthorities(); for (final GrantedAuthority grantedAuthority : authorities) { - if (grantedAuthority.getAuthority().equals("ROLE_USER")) { - isUser = true; - break; - } else if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) { - isAdmin = true; - break; + + String authorityName = grantedAuthority.getAuthority(); + if(roleTargetUrlMap.containsKey(authorityName)) { + return roleTargetUrlMap.get(authorityName); } } - if (isUser) { - return "/homepage.html"; - } else if (isAdmin) { - return "/console.html"; - } else { - throw new IllegalStateException(); - } + throw new IllegalStateException(); } /** @@ -83,12 +80,4 @@ public class MySimpleUrlAuthenticationSuccessHandler implements AuthenticationSu session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); } - public void setRedirectStrategy(final RedirectStrategy redirectStrategy) { - this.redirectStrategy = redirectStrategy; - } - - protected RedirectStrategy getRedirectStrategy() { - return redirectStrategy; - } - } From 3aa7a8f8a2bcf9d17f3c2b503b780fc06d3bed1b Mon Sep 17 00:00:00 2001 From: Florin Hriscu Date: Mon, 16 Mar 2020 01:42:29 +0200 Subject: [PATCH 077/530] BAEL-3859 Changes after review. --- .../AtomicMarkableReferenceUnitTest.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java index d83146c6e8..5f526344be 100644 --- a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/atomic/AtomicMarkableReferenceUnitTest.java @@ -34,14 +34,16 @@ public class AtomicMarkableReferenceUnitTest { @Test void givenMarkValueAsTrue_whenUsingIsMarkedMethod_thenMarkValueShouldBeTrue() { - AtomicMarkableReference employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), true); + Employee employee = new Employee(123, "Mike"); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenMarkValueAsFalse_whenUsingIsMarkedMethod_thenMarkValueShouldBeFalse() { - AtomicMarkableReference employeeNode = new AtomicMarkableReference(new Employee(123, "Mike"), false); + Employee employee = new Employee(123, "Mike"); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, false); Assertions.assertFalse(employeeNode.isMarked()); } @@ -49,7 +51,7 @@ public class AtomicMarkableReferenceUnitTest { @Test void whenUsingGetReferenceMethod_thenCurrentReferenceShouldBeReturned() { Employee employee = new Employee(123, "Mike"); - AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, false); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Assertions.assertEquals(employee, employeeNode.getReference()); } @@ -90,8 +92,8 @@ public class AtomicMarkableReferenceUnitTest { @Test void givenDifferentObjectReference_whenUsingAttemptMarkMethod_thenMarkShouldNotBeUpdated() { Employee employee = new Employee(123, "Mike"); - Employee expectedEmployee = new Employee(123, "Mike"); AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); + Employee expectedEmployee = new Employee(123, "Mike"); Assertions.assertFalse(employeeNode.attemptMark(expectedEmployee, false)); Assertions.assertTrue(employeeNode.isMarked()); @@ -154,23 +156,23 @@ public class AtomicMarkableReferenceUnitTest { @Test void givenNotCurrentReferenceAndCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { - Employee expectedEmployee = new Employee(123, "Mike"); - AtomicMarkableReference employeeNode = new AtomicMarkableReference(expectedEmployee, true); + Employee employee = new Employee(123, "Mike"); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); Assertions.assertFalse(employeeNode.weakCompareAndSet(new Employee(1234, "Steve"), newEmployee, true, false)); - Assertions.assertEquals(expectedEmployee, employeeNode.getReference()); + Assertions.assertEquals(employee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } @Test void givenCurrentReferenceAndNotCurrentMark_whenUsingWeakCompareAndSet_thenReferenceAndMarkShouldNotBeUpdated() { - Employee expectedEmployee = new Employee(123, "Mike"); - AtomicMarkableReference employeeNode = new AtomicMarkableReference(expectedEmployee, true); + Employee employee = new Employee(123, "Mike"); + AtomicMarkableReference employeeNode = new AtomicMarkableReference(employee, true); Employee newEmployee = new Employee(124, "John"); - Assertions.assertFalse(employeeNode.weakCompareAndSet(expectedEmployee, newEmployee, false, true)); - Assertions.assertEquals(expectedEmployee, employeeNode.getReference()); + Assertions.assertFalse(employeeNode.weakCompareAndSet(employee, newEmployee, false, true)); + Assertions.assertEquals(employee, employeeNode.getReference()); Assertions.assertTrue(employeeNode.isMarked()); } From d3b351e27f4e21857ffa92d8acb5f5a5efba86eb Mon Sep 17 00:00:00 2001 From: ramkumarvenkat Date: Mon, 16 Mar 2020 08:30:23 +0530 Subject: [PATCH 078/530] fix formatting --- .../guava/mapmaker/GuavaMapMakerUnitTest.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java index d9a5fc6cd8..8da459f22e 100644 --- a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java @@ -8,28 +8,33 @@ import java.util.concurrent.ConcurrentMap; import static org.junit.Assert.assertNotNull; public class GuavaMapMakerUnitTest { - @Test public void whenMakeMap_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().makeMap(); - assertNotNull(concurrentMap); - } + @Test + public void whenMakeMap_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().makeMap(); + assertNotNull(concurrentMap); + } - @Test public void whenMakeMapWithWeakKeys_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().weakKeys().makeMap(); - assertNotNull(concurrentMap); - } + @Test + public void whenMakeMapWithWeakKeys_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().weakKeys().makeMap(); + assertNotNull(concurrentMap); + } - @Test public void whenMakeMapWithWeakValues_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().weakValues().makeMap(); - assertNotNull(concurrentMap); - } + @Test + public void whenMakeMapWithWeakValues_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().weakValues().makeMap(); + assertNotNull(concurrentMap); + } - @Test public void whenMakeMapWithInitialCapacity_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().initialCapacity(10).makeMap(); - assertNotNull(concurrentMap); - } + @Test + public void whenMakeMapWithInitialCapacity_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().initialCapacity(10).makeMap(); + assertNotNull(concurrentMap); + } - @Test public void whenMakeMapWithConcurrencyLevel_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().concurrencyLevel(10).makeMap(); - assertNotNull(concurrentMap); - } + @Test + public void whenMakeMapWithConcurrencyLevel_thenCreated() { + ConcurrentMap concurrentMap = new MapMaker().concurrencyLevel(10).makeMap(); + assertNotNull(concurrentMap); + } } From d4a928cdfac363353c293a7f0b0abcd936a77919 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Mon, 16 Mar 2020 01:01:01 -0600 Subject: [PATCH 079/530] BAEL-3069 Spring jdbcTemplate Unit Testing --- .../spring-persistence-simple/pom.xml | 7 +++ .../baeldung/jdbc/EmployeeDAOUnitTest.java | 49 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml index 8a03310048..45605c853e 100644 --- a/persistence-modules/spring-persistence-simple/pom.xml +++ b/persistence-modules/spring-persistence-simple/pom.xml @@ -92,6 +92,12 @@ ${org.springframework.version} test + + org.mockito + mockito-core + ${mockito.version} + test + com.querydsl querydsl-jpa @@ -137,6 +143,7 @@ 9.0.0.M26 1.1 4.2.1 + 3.3.3 21.0 diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java new file mode 100644 index 0000000000..9894801a53 --- /dev/null +++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.jdbc; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import javax.sql.DataSource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.util.ReflectionTestUtils; + + +@RunWith(MockitoJUnitRunner.class) + +public class EmployeeDAOUnitTest { + + @Mock + JdbcTemplate jdbcTemplate; + + @Test + public void whenMockJdbcTemplate_thenReturnCorrectEmployeeCount() { + EmployeeDAO employeeDAO = new EmployeeDAO(); + ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate); + Mockito.when(jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class)) + .thenReturn(4); + assertEquals(4, employeeDAO.getCountOfEmployees()); + + Mockito.when(jdbcTemplate.queryForObject(Mockito.anyString(), Mockito.eq(Integer.class))) + .thenReturn(3); + assertEquals(3, employeeDAO.getCountOfEmployees()); + } + + @Test + public void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount() { + DataSource dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) + .addScript("classpath:jdbc/schema.sql") + .addScript("classpath:jdbc/test-data.sql") + .build(); + EmployeeDAO employeeDAO = new EmployeeDAO(); + employeeDAO.setDataSource(dataSource); + assertEquals(4, employeeDAO.getCountOfEmployees()); + } + +} From e58683f48b092fc1cf9f28a0dd86050edc0dca32 Mon Sep 17 00:00:00 2001 From: mike b Date: Tue, 17 Mar 2020 10:06:34 -0400 Subject: [PATCH 080/530] [BAEL-3646] Addressing PR comments --- spring-batch/repository.sqlite | Bin 49152 -> 73728 bytes .../ConditionalFlowApplication.java | 5 +- .../conditionalflow/NumberInfoDecider.java | 18 +++- .../config/NumberInfoConfig.java | 86 ++++++++++-------- .../conditionalflow/model/NumberInfo.java | 18 ++-- .../conditionalflow/step/NotifierTasklet.java | 3 +- .../step/NumberInfoClassifier.java | 9 +- .../step/NumberInfoClassifierWithDecider.java | 8 +- .../step/NumberInfoGenerator.java | 4 +- .../step/NumberInfoProcessor.java | 17 ---- .../step/PrependingStdoutWriter.java | 9 +- .../DeciderJobIntegrationTest.java | 56 ++++++++++++ .../model/NumberInfoUnitTest.java | 77 +++++++++++----- .../step/NumberInfoClassifierUnitTest.java | 9 +- .../step/NumberInfoGeneratorUnitTest.java | 8 +- spring-batch/xml/retryOutput.xml | 2 +- 16 files changed, 208 insertions(+), 121 deletions(-) delete mode 100644 spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java create mode 100644 spring-batch/src/test/java/org/baeldung/conditionalflow/DeciderJobIntegrationTest.java diff --git a/spring-batch/repository.sqlite b/spring-batch/repository.sqlite index 4456ef63cc28948e07a545a72ec1b63366e9057b..9d260fa2d1eed9ab00ea099508119d8e44235d87 100644 GIT binary patch literal 73728 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 NenP787l;49_J3-kW;6f* delta 620 zcmZoTz|zpbJV8o`L7#zvfd`0TKzgE%5fg*{#socPMvlpbtm2!OF~{++G4h{b;6Jlj zaKa&eJ0nI`1`c)Kw9KO75~swH>{kvtjxAx*5n2j7FID9W@FCD51EBorI?wmK`e1&Q6^?XPAA6@XODO< zf2Vj)zu*u@KWA3~MrL&+;b7N5kadjw#~JvK10B4V-`<>&hk=okm6cUqo|lz@i7|Em z?HxZs`kV?h-%55oY>Pn zIjY~3$;@){#QtnPCPpR(uwi^B82C;AmF~l#v=|ucKN$FbK-?a{F2u&j!XU^{U5juE SREis6DA0NQe_+BaAiDrUiJ;X0 diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java index 8b6c841b6e..c977d6ecab 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/ConditionalFlowApplication.java @@ -1,11 +1,14 @@ package org.baeldung.conditionalflow; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ConditionalFlowApplication implements CommandLineRunner { + private static Logger logger = LoggerFactory.getLogger(ConditionalFlowApplication.class); public static void main(String[] args) { SpringApplication.run(ConditionalFlowApplication.class, args); @@ -13,6 +16,6 @@ public class ConditionalFlowApplication implements CommandLineRunner { @Override public void run(String... args) throws Exception { - System.out.println("Running and exiting"); + logger.info("Running conditional flow application..."); } } diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java index 017980f1a4..701011b4d3 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/NumberInfoDecider.java @@ -1,6 +1,5 @@ package org.baeldung.conditionalflow; -import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.job.flow.FlowExecutionStatus; @@ -8,12 +7,23 @@ import org.springframework.batch.core.job.flow.JobExecutionDecider; public class NumberInfoDecider implements JobExecutionDecider { + public static final String NOTIFY = "NOTIFY"; + public static final String QUIET = "QUIET"; + + /** + * Method that determines notification status of job + * @return true if notifications should be sent. + */ + private boolean shouldNotify() { + return true; + } + @Override public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) { - if(jobExecution.getExitStatus().equals("UNKNOWN")) { - return new FlowExecutionStatus("NOTIFY"); + if (shouldNotify()) { + return new FlowExecutionStatus(NOTIFY); } else { - return null; + return new FlowExecutionStatus(QUIET); } } } diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java index fd28c2291f..906a6e1d28 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/config/NumberInfoConfig.java @@ -11,6 +11,9 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactor import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import static org.baeldung.conditionalflow.NumberInfoDecider.NOTIFY; @Configuration @EnableBatchProcessing @@ -19,67 +22,70 @@ public class NumberInfoConfig { @Bean @Qualifier("NotificationStep") public Step notificationStep(StepBuilderFactory sbf) { - return sbf.get("Billing step").tasklet(new NotifierTasklet()).build(); + return sbf.get("Notify step") + .tasklet(new NotifierTasklet()) + .build(); } public Step numberGeneratorStep(StepBuilderFactory sbf, int[] values, String prepend) { return sbf.get("Number generator") - .chunk(1) - .reader(new NumberInfoGenerator(values)) - .processor(new NumberInfoClassifier()) - .writer(new PrependingStdoutWriter<>(prepend)) - .build(); + . chunk(1) + .reader(new NumberInfoGenerator(values)) + .processor(new NumberInfoClassifier()) + .writer(new PrependingStdoutWriter<>(prepend)) + .build(); } public Step numberGeneratorStepDecider(StepBuilderFactory sbf, int[] values, String prepend) { - return sbf.get("Number generator") - .chunk(1) - .reader(new NumberInfoGenerator(values)) - .processor(new NumberInfoClassifierWithDecider()) - .writer(new PrependingStdoutWriter<>(prepend)) - .build(); + return sbf.get("Number generator decider") + . chunk(1) + .reader(new NumberInfoGenerator(values)) + .processor(new NumberInfoClassifierWithDecider()) + .writer(new PrependingStdoutWriter<>(prepend)) + .build(); } @Bean - public Job numberGeneratorNonNotifierJob(JobBuilderFactory jobBuilderFactory, - StepBuilderFactory stepBuilderFactory, - @Qualifier("NotificationStep") Step notificationStep - ) { - int[] nonNotifierData = {-1, -2, -3}; + @Qualifier("first_job") + public Job numberGeneratorNonNotifierJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) { + int[] nonNotifierData = { -1, -2, -3 }; Step step = numberGeneratorStep(stepBuilderFactory, nonNotifierData, "First Dataset Processor"); return jobBuilderFactory.get("Number generator - first dataset") - .start(step) - .on("NOTIFY").to(notificationStep) - .from(step).on("*").stop() - .end() - .build(); + .start(step) + .on(NOTIFY) + .to(notificationStep) + .from(step) + .on("*") + .stop() + .end() + .build(); } @Bean - public Job numberGeneratorNotifierJob(JobBuilderFactory jobBuilderFactory, - StepBuilderFactory stepBuilderFactory, - @Qualifier("NotificationStep") Step notificationStep - ) { - int[] billableData = {11, -2, -3}; + @Qualifier("second_job") + public Job numberGeneratorNotifierJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) { + int[] billableData = { 11, -2, -3 }; Step dataProviderStep = numberGeneratorStep(stepBuilderFactory, billableData, "Second Dataset Processor"); return jobBuilderFactory.get("Number generator - second dataset") - .start(dataProviderStep) - .on("NOTIFY").to(notificationStep) - .end() - .build(); + .start(dataProviderStep) + .on(NOTIFY) + .to(notificationStep) + .end() + .build(); } @Bean - public Job numberGeneratorNotifierJobWithDecider(JobBuilderFactory jobBuilderFactory, - StepBuilderFactory stepBuilderFactory, - @Qualifier("NotificationStep") Step notificationStep - ) { - int[] billableData = {11, -2, -3}; + @Qualifier("third_job") + @Primary + public Job numberGeneratorNotifierJobWithDecider(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) { + int[] billableData = { 11, -2, -3 }; Step dataProviderStep = numberGeneratorStepDecider(stepBuilderFactory, billableData, "Third Dataset Processor"); return jobBuilderFactory.get("Number generator - third dataset") - .start(dataProviderStep) - .next(new NumberInfoDecider()).on("NOTIFY").to(notificationStep) - .end() - .build(); + .start(dataProviderStep) + .next(new NumberInfoDecider()) + .on(NOTIFY) + .to(notificationStep) + .end() + .build(); } } diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java index 81bd67d2a1..4134974386 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/model/NumberInfo.java @@ -5,14 +5,14 @@ import java.util.Objects; public class NumberInfo { private int number; - public static NumberInfo from(int number){ - return new NumberInfo(number); - } - public NumberInfo(int number) { this.number = number; } + public static NumberInfo from(int number) { + return new NumberInfo(number); + } + public boolean isPositive() { return number > 0; } @@ -27,8 +27,10 @@ public class NumberInfo { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; NumberInfo that = (NumberInfo) o; return number == that.number; } @@ -40,8 +42,6 @@ public class NumberInfo { @Override public String toString() { - return "NumberInfo{" + - "number=" + number + - '}'; + return "NumberInfo{" + "number=" + number + '}'; } } \ No newline at end of file diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java index 6a88edcbbe..0d1db66fe9 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NotifierTasklet.java @@ -8,7 +8,8 @@ import org.springframework.batch.repeat.RepeatStatus; public class NotifierTasklet implements Tasklet { @Override public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { - System.err.println("[" + chunkContext.getStepContext().getJobName() + "] contains interesting data!!"); + System.err.println("[" + chunkContext.getStepContext() + .getJobName() + "] contains interesting data!!"); return RepeatStatus.FINISHED; } } diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java index 95b1e4d155..e9bc852d56 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java @@ -7,20 +7,23 @@ import org.springframework.batch.core.annotation.BeforeStep; import org.springframework.batch.core.listener.ItemListenerSupport; import org.springframework.batch.item.ItemProcessor; -public class NumberInfoClassifier extends ItemListenerSupport - implements ItemProcessor { +import static org.baeldung.conditionalflow.NumberInfoDecider.NOTIFY; +import static org.baeldung.conditionalflow.NumberInfoDecider.QUIET; + +public class NumberInfoClassifier extends ItemListenerSupport implements ItemProcessor { private StepExecution stepExecution; @BeforeStep public void beforeStep(StepExecution stepExecution) { this.stepExecution = stepExecution; + this.stepExecution.setExitStatus(new ExitStatus(QUIET)); } @Override public void afterProcess(NumberInfo item, Integer result) { super.afterProcess(item, result); if (item.isPositive()) { - stepExecution.setExitStatus(new ExitStatus("NOTIFY")); + stepExecution.setExitStatus(new ExitStatus(NOTIFY)); } } diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java index 0ba7fde279..ab6e33aec1 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java @@ -1,15 +1,17 @@ package org.baeldung.conditionalflow.step; import org.baeldung.conditionalflow.model.NumberInfo; +import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.annotation.BeforeStep; +import org.springframework.batch.core.listener.ItemListenerSupport; import org.springframework.batch.item.ItemProcessor; -public class NumberInfoClassifierWithDecider - implements ItemProcessor { - private StepExecution stepExecution; +public class NumberInfoClassifierWithDecider extends ItemListenerSupport implements ItemProcessor { @Override public Integer process(NumberInfo numberInfo) throws Exception { return Integer.valueOf(numberInfo.getNumber()); } + } diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java index 35f6c39778..606ebf6204 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoGenerator.java @@ -7,14 +7,14 @@ public class NumberInfoGenerator implements ItemReader { private int[] values; private int counter; - public NumberInfoGenerator(int[] values){ + public NumberInfoGenerator(int[] values) { this.values = values; counter = 0; } @Override public NumberInfo read() { - if(counter == values.length){ + if (counter == values.length) { return null; } else { return new NumberInfo(values[counter++]); diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java deleted file mode 100644 index fe566221de..0000000000 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoProcessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung.conditionalflow.step; - -import org.baeldung.conditionalflow.model.NumberInfo; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.annotation.BeforeStep; -import org.springframework.batch.core.listener.ItemListenerSupport; -import org.springframework.batch.item.ItemProcessor; - -public class NumberInfoProcessor implements ItemProcessor { - private StepExecution stepExecution; - - @Override - public Integer process(NumberInfo numberInfo) throws Exception { - return Integer.valueOf(numberInfo.getNumber()); - } -} diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java index 8b8959d249..283b43f267 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java @@ -1,18 +1,15 @@ package org.baeldung.conditionalflow.step; -import org.springframework.batch.item.ItemWriter; - import java.io.OutputStream; import java.util.List; +import org.springframework.batch.item.ItemWriter; + public class PrependingStdoutWriter implements ItemWriter { private String prependText; private OutputStream writeTo; - private PrependingStdoutWriter() { - } - - public PrependingStdoutWriter(String prependText, OutputStream os){ + public PrependingStdoutWriter(String prependText, OutputStream os) { this.prependText = prependText; this.writeTo = os; } diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/DeciderJobIntegrationTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/DeciderJobIntegrationTest.java new file mode 100644 index 0000000000..8669264848 --- /dev/null +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/DeciderJobIntegrationTest.java @@ -0,0 +1,56 @@ +package org.baeldung.conditionalflow; + +import org.baeldung.conditionalflow.config.NumberInfoConfig; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.test.AssertFile; +import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.batch.test.JobRepositoryTestUtils; +import org.springframework.batch.test.context.SpringBatchTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import org.springframework.test.context.support.DirtiesContextTestExecutionListener; + +import java.util.Collection; +import java.util.Iterator; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@RunWith(SpringRunner.class) +@SpringBatchTest +@EnableAutoConfiguration +@ContextConfiguration(classes = { NumberInfoConfig.class }) +@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class }) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) +public class DeciderJobIntegrationTest { + @Autowired + private JobLauncherTestUtils jobLauncherTestUtils; + + @Test + public void whenNumberGeneratorDecider_thenNotifyStepRuns() throws Exception { + JobExecution jobExecution = jobLauncherTestUtils.launchJob(); + Collection actualStepExecutions = jobExecution.getStepExecutions(); + ExitStatus actualJobExitStatus = jobExecution.getExitStatus(); + + assertEquals(actualJobExitStatus.getExitCode().toString(), "COMPLETED"); + assertEquals(actualStepExecutions.size(), 2); + boolean notifyStepDidRun = false; + Iterator iterator = actualStepExecutions.iterator(); + while(iterator.hasNext() && !notifyStepDidRun){ + if(iterator.next().getStepName().equals("Notify step")){ + notifyStepDidRun = true; + } + } + assertTrue(notifyStepDidRun); + } +} diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java index cf3d361412..26cd286409 100644 --- a/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java @@ -1,44 +1,71 @@ package org.baeldung.conditionalflow.model; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.junit.jupiter.api.Assertions.*; - @RunWith(SpringJUnit4ClassRunner.class) class NumberInfoUnitTest { @Test - void isPositive() { - assertTrue(NumberInfo.from(1).isPositive()); - assertTrue(NumberInfo.from(11).isPositive()); - assertFalse(NumberInfo.from(0).isPositive()); - assertFalse(NumberInfo.from(-1).isPositive()); - assertFalse(NumberInfo.from(-10).isPositive()); + void whenPositive_isPositive() { + assertTrue(NumberInfo.from(1) + .isPositive()); + assertTrue(NumberInfo.from(11) + .isPositive()); + assertFalse(NumberInfo.from(0) + .isPositive()); } @Test - void isEven() { - assertTrue(NumberInfo.from(0).isEven()); - assertTrue(NumberInfo.from(-2).isEven()); - assertTrue(NumberInfo.from(2).isEven()); - assertTrue(NumberInfo.from(-22).isEven()); - assertTrue(NumberInfo.from(22).isEven()); - - assertFalse(NumberInfo.from(1).isEven()); - assertFalse(NumberInfo.from(-1).isEven()); - - assertFalse(NumberInfo.from(13).isEven()); - assertFalse(NumberInfo.from(-13).isEven()); - assertFalse(NumberInfo.from(31).isEven()); - assertFalse(NumberInfo.from(-51).isEven()); + void whenNegative_isPositive_isFalse() { + assertFalse(NumberInfo.from(-1) + .isPositive()); + assertFalse(NumberInfo.from(-10) + .isPositive()); } @Test - void getNumber() { - for(int i = -100 ; i < 100 ; i++){ - assertEquals(i, NumberInfo.from(i).getNumber()); + void whenEven_isEven() { + assertTrue(NumberInfo.from(0) + .isEven()); + assertTrue(NumberInfo.from(-2) + .isEven()); + assertTrue(NumberInfo.from(2) + .isEven()); + assertTrue(NumberInfo.from(-22) + .isEven()); + assertTrue(NumberInfo.from(22) + .isEven()); + } + + @Test + void whenOdd_isEven_isFalse() { + + assertFalse(NumberInfo.from(1) + .isEven()); + assertFalse(NumberInfo.from(-1) + .isEven()); + + assertFalse(NumberInfo.from(13) + .isEven()); + assertFalse(NumberInfo.from(-13) + .isEven()); + assertFalse(NumberInfo.from(31) + .isEven()); + assertFalse(NumberInfo.from(-51) + .isEven()); + } + + @Test + void testStatic_fromMethod_equals_getNumber() { + for (int i = -100; i < 100; i++) { + assertEquals(i, NumberInfo.from(i) + .getNumber()); } } } \ No newline at end of file diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java index c195740caa..9b490799db 100644 --- a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java @@ -1,15 +1,14 @@ package org.baeldung.conditionalflow.step; -import org.baeldung.conditionalflow.model.NumberInfo; -import org.baeldung.conditionalflow.step.NumberInfoClassifier; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.*; +import org.baeldung.conditionalflow.model.NumberInfo; +import org.junit.jupiter.api.Test; class NumberInfoClassifierUnitTest { @Test - void process() throws Exception { + void process_convertsToInteger() throws Exception { NumberInfoClassifier nic = new NumberInfoClassifier(); assertEquals(Integer.valueOf(4), nic.process(NumberInfo.from(4))); assertEquals(Integer.valueOf(-4), nic.process(NumberInfo.from(-4))); diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java index 3fc240bcbf..7794003959 100644 --- a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java @@ -1,14 +1,14 @@ package org.baeldung.conditionalflow.step; -import org.baeldung.conditionalflow.model.NumberInfo; -import org.junit.jupiter.api.Test; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import org.baeldung.conditionalflow.model.NumberInfo; +import org.junit.jupiter.api.Test; + public class NumberInfoGeneratorUnitTest { @Test - public void testGenerateNumbers() { + public void testGenerateNumbers_correctOrderAndValue() { int[] numbers = new int[]{1, -2, 4, -10}; NumberInfoGenerator numberGenerator = new NumberInfoGenerator(numbers); assertEquals(new NumberInfo(numbers[0]), numberGenerator.read()); diff --git a/spring-batch/xml/retryOutput.xml b/spring-batch/xml/retryOutput.xml index d30f2c4a32..c5dec44f16 100644 --- a/spring-batch/xml/retryOutput.xml +++ b/spring-batch/xml/retryOutput.xml @@ -1 +1 @@ -1010000.04302222015-10-31 00:00:001234sammy1012321.04302222015-12-03 00:00:009999john \ No newline at end of file + \ No newline at end of file From cb3898127475c377a4e573d53b8381ca36776d97 Mon Sep 17 00:00:00 2001 From: Mathieu Fortin Date: Tue, 17 Mar 2020 19:20:11 -0400 Subject: [PATCH 081/530] added directive to run live test --- .../debugging/consumer/ConsumerFooServiceLiveTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java index af9bdfbc9b..e61ea9e155 100644 --- a/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java +++ b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java @@ -7,6 +7,11 @@ import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; import com.baeldung.debugging.consumer.service.FooService; +/** + * In order to run this live test, start the following classes: + * - com.baeldung.debugging.server.ServerDebuggingApplication + * - com.baeldung.debugging.consumer.ConsumerDebuggingApplication + */ public class ConsumerFooServiceLiveTest { FooService service = new FooService(); From 0692bac979c756b7e8a6e9fd95f37a58233e3f05 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 18 Mar 2020 10:18:58 +0100 Subject: [PATCH 082/530] BAEL-3855 --- .../main/java/com/baeldung/concurrent/lock/SingleLock.java | 4 ++-- .../main/java/com/baeldung/concurrent/lock/StripedLock.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java index 19b3ba4510..4dff459df6 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/SingleLock.java @@ -14,8 +14,8 @@ public class SingleLock extends ConcurrentAccessExperiment { protected Supplier putSupplier(Map map, int key) { return (()-> { + lock.lock(); try { - lock.lock(); return map.put("key" + key, "value" + key); } finally { lock.unlock(); @@ -25,8 +25,8 @@ public class SingleLock extends ConcurrentAccessExperiment { protected Supplier getSupplier(Map map, int key) { return (()-> { + lock.lock(); try { - lock.lock(); return map.get("key" + key); } finally { lock.unlock(); diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java index 7adca428ba..47c47d8813 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/StripedLock.java @@ -17,8 +17,8 @@ public class StripedLock extends ConcurrentAccessExperiment { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); + lock.lock(); try { - lock.lock(); return map.put("key" + key, "value" + key); } finally { lock.unlock(); @@ -30,8 +30,8 @@ public class StripedLock extends ConcurrentAccessExperiment { return (()-> { int bucket = key % stripedLock.size(); Lock lock = stripedLock.get(bucket); + lock.lock(); try { - lock.lock(); return map.get("key" + key); } finally { lock.unlock(); From dc03fa58712d786cb4d8a5ebc54569f6ec8524d9 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 18 Mar 2020 17:12:36 +0530 Subject: [PATCH 083/530] JAVA-626 : Moved extra articles to java-math-2 module --- java-math/README.md | 2 - .../algorithms/gcd/GCDImplementation.java | 55 ------------------- .../gcd/GCDImplementationUnitTest.java | 32 ----------- .../logarithm/LogarithmUnitTest.java | 31 ----------- 4 files changed, 120 deletions(-) delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java diff --git a/java-math/README.md b/java-math/README.md index d80a07258a..49ff5afde1 100644 --- a/java-math/README.md +++ b/java-math/README.md @@ -14,5 +14,3 @@ This module contains articles about math in Java. - [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) - [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging) - [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) -- [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms) -- [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor) diff --git a/java-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java b/java-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java deleted file mode 100644 index d4844abd9c..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.algorithms.gcd; - -public class GCDImplementation { - - public static int gcdByBruteForce(int n1, int n2) { - int gcd = 1; - for (int i = 1; i <= n1 && i <= n2; i++) { - if (n1 % i == 0 && n2 % i == 0) { - gcd = i; - } - } - return gcd; - } - - public static int gcdByEuclidsAlgorithm(int n1, int n2) { - if (n2 == 0) { - return n1; - } - return gcdByEuclidsAlgorithm(n2, n1 % n2); - } - - public static int gcdBySteinsAlgorithm(int n1, int n2) { - if (n1 == 0) { - return n2; - } - - if (n2 == 0) { - return n1; - } - - int n; - for (n = 0; ((n1 | n2) & 1) == 0; n++) { - n1 >>= 1; - n2 >>= 1; - } - - while ((n1 & 1) == 0) { - n1 >>= 1; - } - - do { - while ((n2 & 1) == 0) { - n2 >>= 1; - } - - if (n1 > n2) { - int temp = n1; - n1 = n2; - n2 = temp; - } - n2 = (n2 - n1); - } while (n2 != 0); - return n1 << n; - } -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java deleted file mode 100644 index d2c91a2eb8..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.algorithms.gcd; - -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class GCDImplementationUnitTest { - - @Test - public void whenCalculatingGCDByBruteForceMethod_thenCorrect() { - int n1 = 60; - int n2 = 90; - int gcd = GCDImplementation.gcdByBruteForce(n1, n2); - assertThat(gcd).isEqualTo(30); - } - - @Test - public void whenCalculatingGCDByEuclidsAlgorithm_thenCorrect() { - int n1 = 60; - int n2 = 90; - int gcd = GCDImplementation.gcdByEuclidsAlgorithm(n1, n2); - assertThat(gcd).isEqualTo(30); - } - - @Test - public void whenCalculatingGCDBySteinsAlgorithm_thenCorrect() { - int n1 = 60; - int n2 = 90; - int gcd = GCDImplementation.gcdBySteinsAlgorithm(n1, n2); - assertThat(gcd).isEqualTo(30); - } -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java deleted file mode 100644 index facad1edc4..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.algorithms.logarithm; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.Test; - -public class LogarithmUnitTest { - - @Test - public void givenLog10_shouldReturnValidResults() { - assertEquals(Math.log10(100), 2); - assertEquals(Math.log10(1000), 3); - } - - @Test - public void givenLogE_shouldReturnValidResults() { - assertEquals(Math.log(Math.E), 1); - assertEquals(Math.log(10), 2.30258, 0.00001); - } - - @Test - public void givenCustomLog_shouldReturnValidResults() { - assertEquals(customLog(2, 256), 8); - assertEquals(customLog(10, 100), 2); - } - - private static double customLog(double base, double logNumber) { - return Math.log(logNumber) / Math.log(base); - } - -} From 3ff81a894315d4553354d40c7c6589aeb3bdc817 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 18 Mar 2020 17:13:37 +0530 Subject: [PATCH 084/530] JAVA-626 : Moved extra articles from java-math module --- java-math-2/README.md | 3 +- java-math-2/pom.xml | 14 +++++ .../algorithms/gcd/GCDImplementation.java | 55 +++++++++++++++++++ .../gcd/GCDImplementationUnitTest.java | 32 +++++++++++ .../logarithm/LogarithmUnitTest.java | 31 +++++++++++ 5 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java create mode 100644 java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java create mode 100644 java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java diff --git a/java-math-2/README.md b/java-math-2/README.md index ca809e8623..5345564d5d 100644 --- a/java-math-2/README.md +++ b/java-math-2/README.md @@ -4,5 +4,6 @@ This module contains articles about math in Java. ### Relevant articles: -- [Basic Calculator in Java](https://www.baeldung.com/basic-calculator-in-java) +- [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms) +- [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor) - More articles: [[<-- prev]](/../java-math) diff --git a/java-math-2/pom.xml b/java-math-2/pom.xml index e22dcc2b31..7bc05a3a86 100644 --- a/java-math-2/pom.xml +++ b/java-math-2/pom.xml @@ -12,4 +12,18 @@ 1.0.0-SNAPSHOT + + + org.assertj + assertj-core + ${org.assertj.core.version} + test + + + + + + 3.9.0 + + \ No newline at end of file diff --git a/java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java b/java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java new file mode 100644 index 0000000000..d4844abd9c --- /dev/null +++ b/java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java @@ -0,0 +1,55 @@ +package com.baeldung.algorithms.gcd; + +public class GCDImplementation { + + public static int gcdByBruteForce(int n1, int n2) { + int gcd = 1; + for (int i = 1; i <= n1 && i <= n2; i++) { + if (n1 % i == 0 && n2 % i == 0) { + gcd = i; + } + } + return gcd; + } + + public static int gcdByEuclidsAlgorithm(int n1, int n2) { + if (n2 == 0) { + return n1; + } + return gcdByEuclidsAlgorithm(n2, n1 % n2); + } + + public static int gcdBySteinsAlgorithm(int n1, int n2) { + if (n1 == 0) { + return n2; + } + + if (n2 == 0) { + return n1; + } + + int n; + for (n = 0; ((n1 | n2) & 1) == 0; n++) { + n1 >>= 1; + n2 >>= 1; + } + + while ((n1 & 1) == 0) { + n1 >>= 1; + } + + do { + while ((n2 & 1) == 0) { + n2 >>= 1; + } + + if (n1 > n2) { + int temp = n1; + n1 = n2; + n2 = temp; + } + n2 = (n2 - n1); + } while (n2 != 0); + return n1 << n; + } +} diff --git a/java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java b/java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java new file mode 100644 index 0000000000..d2c91a2eb8 --- /dev/null +++ b/java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.algorithms.gcd; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GCDImplementationUnitTest { + + @Test + public void whenCalculatingGCDByBruteForceMethod_thenCorrect() { + int n1 = 60; + int n2 = 90; + int gcd = GCDImplementation.gcdByBruteForce(n1, n2); + assertThat(gcd).isEqualTo(30); + } + + @Test + public void whenCalculatingGCDByEuclidsAlgorithm_thenCorrect() { + int n1 = 60; + int n2 = 90; + int gcd = GCDImplementation.gcdByEuclidsAlgorithm(n1, n2); + assertThat(gcd).isEqualTo(30); + } + + @Test + public void whenCalculatingGCDBySteinsAlgorithm_thenCorrect() { + int n1 = 60; + int n2 = 90; + int gcd = GCDImplementation.gcdBySteinsAlgorithm(n1, n2); + assertThat(gcd).isEqualTo(30); + } +} diff --git a/java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java b/java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java new file mode 100644 index 0000000000..facad1edc4 --- /dev/null +++ b/java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.algorithms.logarithm; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Test; + +public class LogarithmUnitTest { + + @Test + public void givenLog10_shouldReturnValidResults() { + assertEquals(Math.log10(100), 2); + assertEquals(Math.log10(1000), 3); + } + + @Test + public void givenLogE_shouldReturnValidResults() { + assertEquals(Math.log(Math.E), 1); + assertEquals(Math.log(10), 2.30258, 0.00001); + } + + @Test + public void givenCustomLog_shouldReturnValidResults() { + assertEquals(customLog(2, 256), 8); + assertEquals(customLog(10, 100), 2); + } + + private static double customLog(double base, double logNumber) { + return Math.log(logNumber) / Math.log(base); + } + +} From 2dd0e5001b744b5902cc8e1478d1f325a8777837 Mon Sep 17 00:00:00 2001 From: Vikas Ramsingh Rajput Date: Wed, 18 Mar 2020 19:59:02 +0300 Subject: [PATCH 085/530] BAEL-3832: Removed logger checks from the test cases --- .../bean/CustomBeanFactoryPostProcessor.java | 8 +- .../bean/CustomBeanPostProcessor.java | 11 +-- .../baeldung/ioccontainer/bean/Student.java | 7 +- .../ioccontainer/IOCContainerAppUnitTest.java | 91 +++++-------------- 4 files changed, 30 insertions(+), 87 deletions(-) diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java index d6e2c92144..fe773ce2df 100644 --- a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java @@ -1,16 +1,14 @@ package com.baeldung.ioccontainer.bean; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor { - static final Logger LOGGER = LogManager.getLogger(CustomBeanPostProcessor.class.getName()); - + public static boolean isBeanInstantiated = false; + @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - LOGGER.info("BeanFactoryPostProcessor is Registered"); + isBeanInstantiated = true; } } diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java index bf34453388..1c2e011a6c 100644 --- a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java @@ -1,17 +1,14 @@ package com.baeldung.ioccontainer.bean; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class CustomBeanPostProcessor implements BeanPostProcessor { - - static final Logger LOGGER = LogManager.getLogger(CustomBeanPostProcessor.class.getName()); - + public static boolean isBeanInstantiated = false; + + @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - LOGGER.info("BeanPostProcessor is Registered Before Initialization"); + isBeanInstantiated = true; return bean; } - } diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java index e32b4ecc29..03e0b049ba 100644 --- a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java @@ -1,12 +1,9 @@ package com.baeldung.ioccontainer.bean; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; - public class Student { - static final Logger LOGGER = LogManager.getLogger(Student.class.getName()); + public static boolean isBeanInstantiated = false; public void postConstruct() { - LOGGER.info("Student Bean is initialized"); + isBeanInstantiated = true; } } diff --git a/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java index 66b6842d0f..3c0a5b3dbe 100644 --- a/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java +++ b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java @@ -3,12 +3,6 @@ package com.baeldung.ioccontainer; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.ArrayList; -import java.util.List; - -import org.apache.log4j.AppenderSkeleton; -import org.apache.log4j.Logger; -import org.apache.log4j.spi.LoggingEvent; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,49 +20,37 @@ import com.baeldung.ioccontainer.bean.Student; public class IOCContainerAppUnitTest { - private LogAppender logAppender; - private List loggingEvents; - @BeforeEach - public void initializeLogAppender() { - logAppender = new LogAppender(); - Logger.getRootLogger() - .addAppender(logAppender); - loggingEvents = logAppender.events; - } - @AfterEach - public void removeLogAppender() { - Logger.getRootLogger() - .removeAppender(logAppender); + public void resetInstantiationFlag() { + Student.isBeanInstantiated = false; + CustomBeanPostProcessor.isBeanInstantiated = false; + CustomBeanFactoryPostProcessor.isBeanInstantiated = false; } @Test - public void whenBFInitialized_thenNoStudentLogPrinted() { + public void whenBFInitialized_thenStudentNotInitialized() { Resource res = new ClassPathResource("ioc-container-difference-example.xml"); BeanFactory factory = new XmlBeanFactory(res); - - String expected = "Student Bean is initialized"; - assertFalse(checkWhetherLoggerContains(expected)); + + assertFalse(Student.isBeanInstantiated); } @Test - public void whenBFInitialized_thenStudentLogPrinted() { - + public void whenBFInitialized_thenStudentInitialized() { + Resource res = new ClassPathResource("ioc-container-difference-example.xml"); BeanFactory factory = new XmlBeanFactory(res); Student student = (Student) factory.getBean("student"); - - String expected = "Student Bean is initialized"; - assertTrue(checkWhetherLoggerContains(expected)); + + assertTrue(Student.isBeanInstantiated); } - + @Test - public void whenAppContInitialized_thenStudentObjInitialized() { + public void whenAppContInitialized_thenStudentInitialized() { ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml"); - - String expected = "Student Bean is initialized"; - assertTrue(checkWhetherLoggerContains(expected)); + + assertTrue(Student.isBeanInstantiated); } @Test @@ -76,22 +58,16 @@ public class IOCContainerAppUnitTest { Resource res = new ClassPathResource("ioc-container-difference-example.xml"); ConfigurableListableBeanFactory factory = new XmlBeanFactory(res); - String beanFactoryPostProcessorExpectedLog = "BeanFactoryPostProcessor is Registered"; - assertFalse(checkWhetherLoggerContains(beanFactoryPostProcessorExpectedLog)); - - String beanPostProcessorExpectedLog = "BeanPostProcessor is Registered Before Initialization"; - assertFalse(checkWhetherLoggerContains(beanPostProcessorExpectedLog)); + assertFalse(CustomBeanFactoryPostProcessor.isBeanInstantiated); + assertFalse(CustomBeanPostProcessor.isBeanInstantiated); } @Test public void whenAppContInitialized_thenBFPostProcessorAndBPostProcessorRegisteredAutomatically() { ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml"); - String beanFactoryPostProcessorExpectedLog = "BeanFactoryPostProcessor is Registered"; - assertTrue(checkWhetherLoggerContains(beanFactoryPostProcessorExpectedLog)); - - String beanPostProcessorExpectedLog = "BeanPostProcessor is Registered Before Initialization"; - assertTrue(checkWhetherLoggerContains(beanPostProcessorExpectedLog)); + assertTrue(CustomBeanFactoryPostProcessor.isBeanInstantiated); + assertTrue(CustomBeanPostProcessor.isBeanInstantiated); } @Test @@ -101,37 +77,12 @@ public class IOCContainerAppUnitTest { CustomBeanFactoryPostProcessor beanFactoryPostProcessor = new CustomBeanFactoryPostProcessor(); beanFactoryPostProcessor.postProcessBeanFactory(factory); - String beanFactoryPostProcessorExpectedLog = "BeanFactoryPostProcessor is Registered"; - assertTrue(checkWhetherLoggerContains(beanFactoryPostProcessorExpectedLog)); + assertTrue(CustomBeanFactoryPostProcessor.isBeanInstantiated); CustomBeanPostProcessor beanPostProcessor = new CustomBeanPostProcessor(); factory.addBeanPostProcessor(beanPostProcessor); Student student = (Student) factory.getBean("student"); - String beanPostProcessorExpectedLog = "BeanPostProcessor is Registered Before Initialization"; - assertTrue(checkWhetherLoggerContains(beanPostProcessorExpectedLog)); + assertTrue(CustomBeanPostProcessor.isBeanInstantiated); } - private boolean checkWhetherLoggerContains(String expectedLogMessge) { - boolean isLogExist = loggingEvents.stream() - .anyMatch(logEvent -> logEvent.getMessage() - .equals(expectedLogMessge)); - return isLogExist; - } - - public static class LogAppender extends AppenderSkeleton { - public List events = new ArrayList(); - - public void close() { - } - - public boolean requiresLayout() { - return false; - } - - @Override - protected void append(LoggingEvent event) { - events.add(event); - } - - } } From 42b945ce7353eb38007663e30b477ae5925f816a Mon Sep 17 00:00:00 2001 From: chirag d Date: Wed, 18 Mar 2020 22:41:58 +0530 Subject: [PATCH 086/530] BAEL3901 Changed the module --- .../spring-security-clear-site-data/pom.xml | 54 ------------------- .../spring-security-mvc/pom.xml | 27 ++++++++++ .../LogoutClearSiteDataController.java | 2 +- .../clearsitedata}/SpringSecurityConfig.java | 2 +- .../baeldung/clearsitedata}/WebConfig.java | 4 +- ...LogoutClearSiteDataControllerUnitTest.java | 2 +- 6 files changed, 32 insertions(+), 59 deletions(-) delete mode 100644 spring-security-modules/spring-security-clear-site-data/pom.xml rename spring-security-modules/{spring-security-clear-site-data/src/main/java/com/baeldung => spring-security-mvc/src/main/java/com/baeldung/clearsitedata}/LogoutClearSiteDataController.java (92%) rename spring-security-modules/{spring-security-clear-site-data/src/main/java/com/baeldung => spring-security-mvc/src/main/java/com/baeldung/clearsitedata}/SpringSecurityConfig.java (97%) rename spring-security-modules/{spring-security-clear-site-data/src/main/java/com/baeldung => spring-security-mvc/src/main/java/com/baeldung/clearsitedata}/WebConfig.java (88%) rename spring-security-modules/{spring-security-clear-site-data/src/test/java/com/baeldung => spring-security-mvc/src/test/java/com/baeldung/clearsitedata}/LogoutClearSiteDataControllerUnitTest.java (98%) diff --git a/spring-security-modules/spring-security-clear-site-data/pom.xml b/spring-security-modules/spring-security-clear-site-data/pom.xml deleted file mode 100644 index e58debc0aa..0000000000 --- a/spring-security-modules/spring-security-clear-site-data/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - 4.0.0 - - com.baeldung - spring-security-clear-site-data - 1.0-SNAPSHOT - spring-security-clear-site-data - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - - - - org.springframework.security - spring-security-web - ${spring.mvc.version} - - - org.springframework.security - spring-security-config - ${spring.mvc.version} - - - org.springframework.security - spring-security-test - ${spring.mvc.version} - test - - - org.springframework - spring-webmvc - ${spring.mvc.version} - - - javax.servlet - javax.servlet-api - ${javax.version} - - - - - - 5.2.2.RELEASE - 4.0.1 - - - diff --git a/spring-security-modules/spring-security-mvc/pom.xml b/spring-security-modules/spring-security-mvc/pom.xml index 7da047707a..517aa83270 100644 --- a/spring-security-modules/spring-security-mvc/pom.xml +++ b/spring-security-modules/spring-security-mvc/pom.xml @@ -64,9 +64,36 @@ org.springframework.security spring-security-test + ${spring.mvc.version} test + + org.springframework.security + spring-security-web + ${spring.mvc.version} + + + org.springframework.security + spring-security-config + ${spring.mvc.version} + + + org.springframework + spring-webmvc + ${spring.mvc.version} + + + javax.servlet + javax.servlet-api + ${javax.version} + + + + 5.2.2.RELEASE + 4.0.1 + + diff --git a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/LogoutClearSiteDataController.java b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/LogoutClearSiteDataController.java similarity index 92% rename from spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/LogoutClearSiteDataController.java rename to spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/LogoutClearSiteDataController.java index d27fa18116..fcf78ac82f 100644 --- a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/LogoutClearSiteDataController.java +++ b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/LogoutClearSiteDataController.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.clearsitedata; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; diff --git a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/SpringSecurityConfig.java b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/SpringSecurityConfig.java similarity index 97% rename from spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/SpringSecurityConfig.java rename to spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/SpringSecurityConfig.java index fd43fb2c9e..13011da9e4 100644 --- a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/SpringSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/SpringSecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.clearsitedata; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/WebConfig.java b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/WebConfig.java similarity index 88% rename from spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/WebConfig.java rename to spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/WebConfig.java index 16826e28b8..a523efa554 100644 --- a/spring-security-modules/spring-security-clear-site-data/src/main/java/com/baeldung/WebConfig.java +++ b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/clearsitedata/WebConfig.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.clearsitedata; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -14,6 +14,6 @@ import java.util.concurrent.TimeUnit; @EnableWebMvc @Configuration -@ComponentScan(basePackages = {"com.baeldung"}) +@ComponentScan(basePackages = {"com.baeldung.clearsitedata"}) public class WebConfig implements WebMvcConfigurer { } \ No newline at end of file diff --git a/spring-security-modules/spring-security-clear-site-data/src/test/java/com/baeldung/LogoutClearSiteDataControllerUnitTest.java b/spring-security-modules/spring-security-mvc/src/test/java/com/baeldung/clearsitedata/LogoutClearSiteDataControllerUnitTest.java similarity index 98% rename from spring-security-modules/spring-security-clear-site-data/src/test/java/com/baeldung/LogoutClearSiteDataControllerUnitTest.java rename to spring-security-modules/spring-security-mvc/src/test/java/com/baeldung/clearsitedata/LogoutClearSiteDataControllerUnitTest.java index 905a866413..30036eea89 100644 --- a/spring-security-modules/spring-security-clear-site-data/src/test/java/com/baeldung/LogoutClearSiteDataControllerUnitTest.java +++ b/spring-security-modules/spring-security-mvc/src/test/java/com/baeldung/clearsitedata/LogoutClearSiteDataControllerUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.clearsitedata; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 108cca4b4ba5b34c03d7ac41e841609b87f42089 Mon Sep 17 00:00:00 2001 From: chirag d Date: Wed, 18 Mar 2020 22:46:35 +0530 Subject: [PATCH 087/530] BAEL3901 updated pom to remove module --- spring-security-modules/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 07c326c10e..49a0db03ed 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -17,7 +17,6 @@ spring-security-acl spring-security-angular/server spring-security-cache-control - spring-security-clear-site-data spring-security-core spring-security-cors spring-security-kerberos From cd23dbda280c7bd07a639c6d1d96151261633713 Mon Sep 17 00:00:00 2001 From: Vikas Ramsingh Rajput Date: Wed, 18 Mar 2020 20:53:30 +0300 Subject: [PATCH 088/530] BAEL-3832: Removed log4j dependency from the pom.xml and formatted the configuration xml file --- spring-core-3/pom.xml | 6 ------ .../src/test/resources/ioc-container-difference-example.xml | 3 +-- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml index d1163a174c..3bde25f561 100644 --- a/spring-core-3/pom.xml +++ b/spring-core-3/pom.xml @@ -68,11 +68,6 @@ test - - log4j - log4j - ${log4j.version} - @@ -89,7 +84,6 @@ 2.22.1 1.3.2 2.2.2.RELEASE - 1.2.17
\ No newline at end of file diff --git a/spring-core-3/src/test/resources/ioc-container-difference-example.xml b/spring-core-3/src/test/resources/ioc-container-difference-example.xml index 9bb01efe66..ba84aa635d 100644 --- a/spring-core-3/src/test/resources/ioc-container-difference-example.xml +++ b/spring-core-3/src/test/resources/ioc-container-difference-example.xml @@ -5,7 +5,6 @@ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - - + \ No newline at end of file From f82ce12686f40e896106fb3bc3f0367ed6de386b Mon Sep 17 00:00:00 2001 From: Vikas Ramsingh Rajput Date: Wed, 18 Mar 2020 20:56:04 +0300 Subject: [PATCH 089/530] BAEL-3832: removed unnecessary line from pom.xml --- spring-core-3/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml index 3bde25f561..205259e8e4 100644 --- a/spring-core-3/pom.xml +++ b/spring-core-3/pom.xml @@ -67,7 +67,6 @@ ${junit-jupiter.version} test - From cccec36753a22739b4af34d48da41d6c1f0a94a6 Mon Sep 17 00:00:00 2001 From: mikr Date: Wed, 18 Mar 2020 20:05:41 +0100 Subject: [PATCH 090/530] JAVA-841 Update commented section in pom file --- spring-security-modules/spring-security-mvc-boot-1/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-mvc-boot-1/pom.xml b/spring-security-modules/spring-security-mvc-boot-1/pom.xml index 476159f306..7ad18376ec 100644 --- a/spring-security-modules/spring-security-mvc-boot-1/pom.xml +++ b/spring-security-modules/spring-security-mvc-boot-1/pom.xml @@ -225,7 +225,7 @@ com.baeldung.roles.custom.Application - + 1.1.2 1.6.1 From a7e146e5d17c7602849e68a5636e3c83c67b2e1f Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Wed, 18 Mar 2020 21:04:46 +0100 Subject: [PATCH 091/530] JAVA-86: Add spring-boot-basic-customization to the pom.xml --- spring-boot-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index c8d153d4bb..228e7ce481 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -20,6 +20,7 @@ spring-boot-annotations spring-boot-artifacts spring-boot-autoconfiguration + spring-boot-basic-customization spring-boot-bootstrap spring-boot-client spring-boot-config-jpa-error From 5b8ac156ff7d3d51cdd5afc7c5f22e8a7902e93c Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 12 Mar 2020 19:42:41 +0100 Subject: [PATCH 092/530] [JAVA-962] Standardized packages from org.baeldung to com.baeldung --- lagom/build.sbt | 2 +- .../lagom/helloworld/greeting/api/GreetingService.java | 2 +- .../helloworld/greeting/impl/GreetingCommand.java | 2 +- .../lagom/helloworld/greeting/impl/GreetingEntity.java | 6 +++--- .../lagom/helloworld/greeting/impl/GreetingEvent.java | 2 +- .../helloworld/greeting/impl/GreetingServiceImpl.java | 10 +++++----- .../greeting/impl/GreetingServiceModule.java | 6 +++--- .../lagom/helloworld/greeting/impl/GreetingState.java | 2 +- lagom/greeting-impl/bin/application.conf | 2 +- lagom/greeting-impl/bin/classes/application.conf | 2 +- .../greeting-impl/src/main/resources/application.conf | 2 +- .../lagom/helloworld/weather/api/WeatherService.java | 2 +- .../lagom/helloworld/weather/api/WeatherStats.java | 2 +- lagom/weather-impl/bin/application.conf | 2 +- .../helloworld/weather/impl/WeatherServiceImpl.java | 6 +++--- .../helloworld/weather/impl/WeatherServiceModule.java | 4 ++-- lagom/weather-impl/src/main/resources/application.conf | 2 +- 17 files changed, 28 insertions(+), 28 deletions(-) rename lagom/greeting-api/src/main/java/{org => com}/baeldung/lagom/helloworld/greeting/api/GreetingService.java (92%) rename lagom/{greeting-impl/src/main/java/org => greeting-api/src/main/java/com}/baeldung/lagom/helloworld/greeting/impl/GreetingCommand.java (94%) rename lagom/{greeting-impl/src/main/java/org => greeting-api/src/main/java/com}/baeldung/lagom/helloworld/greeting/impl/GreetingEntity.java (85%) rename lagom/{greeting-impl/src/main/java/org => greeting-api/src/main/java/com}/baeldung/lagom/helloworld/greeting/impl/GreetingEvent.java (90%) rename lagom/{greeting-impl/src/main/java/org => greeting-api/src/main/java/com}/baeldung/lagom/helloworld/greeting/impl/GreetingServiceImpl.java (85%) rename lagom/{greeting-impl/src/main/java/org => greeting-api/src/main/java/com}/baeldung/lagom/helloworld/greeting/impl/GreetingServiceModule.java (72%) rename lagom/{greeting-impl/src/main/java/org => greeting-api/src/main/java/com}/baeldung/lagom/helloworld/greeting/impl/GreetingState.java (89%) rename lagom/weather-api/src/main/java/{org => com}/baeldung/lagom/helloworld/weather/api/WeatherService.java (93%) rename lagom/weather-api/src/main/java/{org => com}/baeldung/lagom/helloworld/weather/api/WeatherStats.java (93%) rename lagom/weather-impl/src/main/java/{org => com}/baeldung/lagom/helloworld/weather/impl/WeatherServiceImpl.java (67%) rename lagom/weather-impl/src/main/java/{org => com}/baeldung/lagom/helloworld/weather/impl/WeatherServiceModule.java (78%) diff --git a/lagom/build.sbt b/lagom/build.sbt index 06927e3301..19aeccbd07 100644 --- a/lagom/build.sbt +++ b/lagom/build.sbt @@ -1,4 +1,4 @@ -organization in ThisBuild := "org.baeldung" +organization in ThisBuild := "com.baeldung" // the Scala version that will be used for cross-compiled libraries scalaVersion in ThisBuild := "2.11.8" diff --git a/lagom/greeting-api/src/main/java/org/baeldung/lagom/helloworld/greeting/api/GreetingService.java b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/api/GreetingService.java similarity index 92% rename from lagom/greeting-api/src/main/java/org/baeldung/lagom/helloworld/greeting/api/GreetingService.java rename to lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/api/GreetingService.java index 93567f0185..e212c45437 100644 --- a/lagom/greeting-api/src/main/java/org/baeldung/lagom/helloworld/greeting/api/GreetingService.java +++ b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/api/GreetingService.java @@ -1,4 +1,4 @@ -package org.baeldung.lagom.helloworld.greeting.api; +package com.baeldung.lagom.helloworld.greeting.api; import static com.lightbend.lagom.javadsl.api.Service.named; import static com.lightbend.lagom.javadsl.api.Service.restCall; diff --git a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingCommand.java b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingCommand.java similarity index 94% rename from lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingCommand.java rename to lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingCommand.java index be9e713ec9..30d3930b75 100644 --- a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingCommand.java +++ b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingCommand.java @@ -1,4 +1,4 @@ -package org.baeldung.lagom.helloworld.greeting.impl; +package com.baeldung.lagom.helloworld.greeting.impl; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; diff --git a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingEntity.java b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingEntity.java similarity index 85% rename from lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingEntity.java rename to lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingEntity.java index 91fc74039d..125cf4bf38 100644 --- a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingEntity.java +++ b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingEntity.java @@ -1,9 +1,9 @@ -package org.baeldung.lagom.helloworld.greeting.impl; +package com.baeldung.lagom.helloworld.greeting.impl; import java.util.Optional; -import org.baeldung.lagom.helloworld.greeting.impl.GreetingCommand.ReceivedGreetingCommand; -import org.baeldung.lagom.helloworld.greeting.impl.GreetingEvent.ReceivedGreetingEvent; +import com.baeldung.lagom.helloworld.greeting.impl.GreetingCommand.ReceivedGreetingCommand; +import com.baeldung.lagom.helloworld.greeting.impl.GreetingEvent.ReceivedGreetingEvent; import com.lightbend.lagom.javadsl.persistence.PersistentEntity; diff --git a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingEvent.java b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingEvent.java similarity index 90% rename from lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingEvent.java rename to lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingEvent.java index e454f6cd1b..8800177add 100644 --- a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingEvent.java +++ b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingEvent.java @@ -1,4 +1,4 @@ -package org.baeldung.lagom.helloworld.greeting.impl; +package com.baeldung.lagom.helloworld.greeting.impl; import com.fasterxml.jackson.annotation.JsonCreator; import com.lightbend.lagom.serialization.Jsonable; diff --git a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingServiceImpl.java b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingServiceImpl.java similarity index 85% rename from lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingServiceImpl.java rename to lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingServiceImpl.java index c28687291e..0c79b0d468 100644 --- a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingServiceImpl.java +++ b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingServiceImpl.java @@ -1,12 +1,12 @@ -package org.baeldung.lagom.helloworld.greeting.impl; +package com.baeldung.lagom.helloworld.greeting.impl; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import org.baeldung.lagom.helloworld.greeting.api.GreetingService; -import org.baeldung.lagom.helloworld.greeting.impl.GreetingCommand.ReceivedGreetingCommand; -import org.baeldung.lagom.helloworld.weather.api.WeatherService; -import org.baeldung.lagom.helloworld.weather.api.WeatherStats; +import com.baeldung.lagom.helloworld.greeting.api.GreetingService; +import com.baeldung.lagom.helloworld.greeting.impl.GreetingCommand.ReceivedGreetingCommand; +import com.baeldung.lagom.helloworld.weather.api.WeatherService; +import com.baeldung.lagom.helloworld.weather.api.WeatherStats; import com.google.inject.Inject; import com.lightbend.lagom.javadsl.api.ServiceCall; diff --git a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingServiceModule.java b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingServiceModule.java similarity index 72% rename from lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingServiceModule.java rename to lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingServiceModule.java index 4813e91a7c..ba5142a5e6 100644 --- a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingServiceModule.java +++ b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingServiceModule.java @@ -1,7 +1,7 @@ -package org.baeldung.lagom.helloworld.greeting.impl; +package com.baeldung.lagom.helloworld.greeting.impl; -import org.baeldung.lagom.helloworld.greeting.api.GreetingService; -import org.baeldung.lagom.helloworld.weather.api.WeatherService; +import com.baeldung.lagom.helloworld.greeting.api.GreetingService; +import com.baeldung.lagom.helloworld.weather.api.WeatherService; import com.google.inject.AbstractModule; import com.lightbend.lagom.javadsl.server.ServiceGuiceSupport; diff --git a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingState.java b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingState.java similarity index 89% rename from lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingState.java rename to lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingState.java index 125795601e..023c0510ae 100644 --- a/lagom/greeting-impl/src/main/java/org/baeldung/lagom/helloworld/greeting/impl/GreetingState.java +++ b/lagom/greeting-api/src/main/java/com/baeldung/lagom/helloworld/greeting/impl/GreetingState.java @@ -1,4 +1,4 @@ -package org.baeldung.lagom.helloworld.greeting.impl; +package com.baeldung.lagom.helloworld.greeting.impl; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; diff --git a/lagom/greeting-impl/bin/application.conf b/lagom/greeting-impl/bin/application.conf index 1e78ce4a79..3fd21ae72b 100644 --- a/lagom/greeting-impl/bin/application.conf +++ b/lagom/greeting-impl/bin/application.conf @@ -1 +1 @@ -play.modules.enabled += org.baeldung.lagom.helloworld.greeting.impl.GreetingServiceModule \ No newline at end of file +play.modules.enabled += com.baeldung.lagom.helloworld.greeting.impl.GreetingServiceModule \ No newline at end of file diff --git a/lagom/greeting-impl/bin/classes/application.conf b/lagom/greeting-impl/bin/classes/application.conf index 1e78ce4a79..3fd21ae72b 100644 --- a/lagom/greeting-impl/bin/classes/application.conf +++ b/lagom/greeting-impl/bin/classes/application.conf @@ -1 +1 @@ -play.modules.enabled += org.baeldung.lagom.helloworld.greeting.impl.GreetingServiceModule \ No newline at end of file +play.modules.enabled += com.baeldung.lagom.helloworld.greeting.impl.GreetingServiceModule \ No newline at end of file diff --git a/lagom/greeting-impl/src/main/resources/application.conf b/lagom/greeting-impl/src/main/resources/application.conf index 1e78ce4a79..3fd21ae72b 100644 --- a/lagom/greeting-impl/src/main/resources/application.conf +++ b/lagom/greeting-impl/src/main/resources/application.conf @@ -1 +1 @@ -play.modules.enabled += org.baeldung.lagom.helloworld.greeting.impl.GreetingServiceModule \ No newline at end of file +play.modules.enabled += com.baeldung.lagom.helloworld.greeting.impl.GreetingServiceModule \ No newline at end of file diff --git a/lagom/weather-api/src/main/java/org/baeldung/lagom/helloworld/weather/api/WeatherService.java b/lagom/weather-api/src/main/java/com/baeldung/lagom/helloworld/weather/api/WeatherService.java similarity index 93% rename from lagom/weather-api/src/main/java/org/baeldung/lagom/helloworld/weather/api/WeatherService.java rename to lagom/weather-api/src/main/java/com/baeldung/lagom/helloworld/weather/api/WeatherService.java index 888109322b..a0749222eb 100644 --- a/lagom/weather-api/src/main/java/org/baeldung/lagom/helloworld/weather/api/WeatherService.java +++ b/lagom/weather-api/src/main/java/com/baeldung/lagom/helloworld/weather/api/WeatherService.java @@ -1,4 +1,4 @@ -package org.baeldung.lagom.helloworld.weather.api; +package com.baeldung.lagom.helloworld.weather.api; import static com.lightbend.lagom.javadsl.api.Service.named; import static com.lightbend.lagom.javadsl.api.Service.*; diff --git a/lagom/weather-api/src/main/java/org/baeldung/lagom/helloworld/weather/api/WeatherStats.java b/lagom/weather-api/src/main/java/com/baeldung/lagom/helloworld/weather/api/WeatherStats.java similarity index 93% rename from lagom/weather-api/src/main/java/org/baeldung/lagom/helloworld/weather/api/WeatherStats.java rename to lagom/weather-api/src/main/java/com/baeldung/lagom/helloworld/weather/api/WeatherStats.java index 23530a297d..aa04c5ad86 100644 --- a/lagom/weather-api/src/main/java/org/baeldung/lagom/helloworld/weather/api/WeatherStats.java +++ b/lagom/weather-api/src/main/java/com/baeldung/lagom/helloworld/weather/api/WeatherStats.java @@ -1,4 +1,4 @@ -package org.baeldung.lagom.helloworld.weather.api; +package com.baeldung.lagom.helloworld.weather.api; import java.util.Arrays; import java.util.Collections; diff --git a/lagom/weather-impl/bin/application.conf b/lagom/weather-impl/bin/application.conf index cf6cec2115..53d2dff8f2 100644 --- a/lagom/weather-impl/bin/application.conf +++ b/lagom/weather-impl/bin/application.conf @@ -1 +1 @@ -play.modules.enabled += org.baeldung.lagom.helloworld.weather.impl.WeatherServiceModule \ No newline at end of file +play.modules.enabled += com.baeldung.lagom.helloworld.weather.impl.WeatherServiceModule \ No newline at end of file diff --git a/lagom/weather-impl/src/main/java/org/baeldung/lagom/helloworld/weather/impl/WeatherServiceImpl.java b/lagom/weather-impl/src/main/java/com/baeldung/lagom/helloworld/weather/impl/WeatherServiceImpl.java similarity index 67% rename from lagom/weather-impl/src/main/java/org/baeldung/lagom/helloworld/weather/impl/WeatherServiceImpl.java rename to lagom/weather-impl/src/main/java/com/baeldung/lagom/helloworld/weather/impl/WeatherServiceImpl.java index d7f97f9105..38e4b4d28f 100644 --- a/lagom/weather-impl/src/main/java/org/baeldung/lagom/helloworld/weather/impl/WeatherServiceImpl.java +++ b/lagom/weather-impl/src/main/java/com/baeldung/lagom/helloworld/weather/impl/WeatherServiceImpl.java @@ -1,9 +1,9 @@ -package org.baeldung.lagom.helloworld.weather.impl; +package com.baeldung.lagom.helloworld.weather.impl; import java.util.concurrent.CompletableFuture; -import org.baeldung.lagom.helloworld.weather.api.WeatherService; -import org.baeldung.lagom.helloworld.weather.api.WeatherStats; +import com.baeldung.lagom.helloworld.weather.api.WeatherService; +import com.baeldung.lagom.helloworld.weather.api.WeatherStats; import com.lightbend.lagom.javadsl.api.ServiceCall; diff --git a/lagom/weather-impl/src/main/java/org/baeldung/lagom/helloworld/weather/impl/WeatherServiceModule.java b/lagom/weather-impl/src/main/java/com/baeldung/lagom/helloworld/weather/impl/WeatherServiceModule.java similarity index 78% rename from lagom/weather-impl/src/main/java/org/baeldung/lagom/helloworld/weather/impl/WeatherServiceModule.java rename to lagom/weather-impl/src/main/java/com/baeldung/lagom/helloworld/weather/impl/WeatherServiceModule.java index ac2834ff5c..85257ffa47 100644 --- a/lagom/weather-impl/src/main/java/org/baeldung/lagom/helloworld/weather/impl/WeatherServiceModule.java +++ b/lagom/weather-impl/src/main/java/com/baeldung/lagom/helloworld/weather/impl/WeatherServiceModule.java @@ -1,6 +1,6 @@ -package org.baeldung.lagom.helloworld.weather.impl; +package com.baeldung.lagom.helloworld.weather.impl; -import org.baeldung.lagom.helloworld.weather.api.WeatherService; +import com.baeldung.lagom.helloworld.weather.api.WeatherService; import com.google.inject.AbstractModule; import com.lightbend.lagom.javadsl.server.ServiceGuiceSupport; diff --git a/lagom/weather-impl/src/main/resources/application.conf b/lagom/weather-impl/src/main/resources/application.conf index cf6cec2115..53d2dff8f2 100644 --- a/lagom/weather-impl/src/main/resources/application.conf +++ b/lagom/weather-impl/src/main/resources/application.conf @@ -1 +1 @@ -play.modules.enabled += org.baeldung.lagom.helloworld.weather.impl.WeatherServiceModule \ No newline at end of file +play.modules.enabled += com.baeldung.lagom.helloworld.weather.impl.WeatherServiceModule \ No newline at end of file From b1cc7f4337abc0401255721baf22afed5d31a8bc Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 14:56:31 +0100 Subject: [PATCH 093/530] JAVA-960: Migrate spring-social-login to com.baeldung --- .../java/{org => com}/baeldung/config/Application.java | 6 +++--- .../java/{org => com}/baeldung/config/SecurityConfig.java | 8 ++++---- .../main/java/{org => com}/baeldung/config/WebConfig.java | 2 +- .../baeldung/persistence/dao/UserRepository.java | 4 ++-- .../{org => com}/baeldung/persistence/model/User.java | 2 +- .../baeldung/security/FacebookConnectionSignup.java | 6 +++--- .../baeldung/security/FacebookSignInAdapter.java | 2 +- .../baeldung/security/MyUserDetailsService.java | 6 +++--- .../java/{org => com}/baeldung/SpringContextTest.java | 4 ++-- 9 files changed, 20 insertions(+), 20 deletions(-) rename spring-social-login/src/main/java/{org => com}/baeldung/config/Application.java (80%) rename spring-social-login/src/main/java/{org => com}/baeldung/config/SecurityConfig.java (92%) rename spring-social-login/src/main/java/{org => com}/baeldung/config/WebConfig.java (98%) rename spring-social-login/src/main/java/{org => com}/baeldung/persistence/dao/UserRepository.java (69%) rename spring-social-login/src/main/java/{org => com}/baeldung/persistence/model/User.java (96%) rename spring-social-login/src/main/java/{org => com}/baeldung/security/FacebookConnectionSignup.java (85%) rename spring-social-login/src/main/java/{org => com}/baeldung/security/FacebookSignInAdapter.java (96%) rename spring-social-login/src/main/java/{org => com}/baeldung/security/MyUserDetailsService.java (89%) rename spring-social-login/src/test/java/{org => com}/baeldung/SpringContextTest.java (88%) diff --git a/spring-social-login/src/main/java/org/baeldung/config/Application.java b/spring-social-login/src/main/java/com/baeldung/config/Application.java similarity index 80% rename from spring-social-login/src/main/java/org/baeldung/config/Application.java rename to spring-social-login/src/main/java/com/baeldung/config/Application.java index cf6251a51e..5d083d2d47 100644 --- a/spring-social-login/src/main/java/org/baeldung/config/Application.java +++ b/spring-social-login/src/main/java/com/baeldung/config/Application.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,8 +7,8 @@ import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication -@EnableJpaRepositories("org.baeldung.persistence.dao") -@EntityScan("org.baeldung.persistence.model") +@EnableJpaRepositories("com.baeldung.persistence.dao") +@EntityScan("com.baeldung.persistence.model") public class Application extends SpringBootServletInitializer { public static void main(String[] args) { diff --git a/spring-social-login/src/main/java/org/baeldung/config/SecurityConfig.java b/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java similarity index 92% rename from spring-social-login/src/main/java/org/baeldung/config/SecurityConfig.java rename to spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java index 8e439653a9..3d3081fef9 100644 --- a/spring-social-login/src/main/java/org/baeldung/config/SecurityConfig.java +++ b/spring-social-login/src/main/java/com/baeldung/config/SecurityConfig.java @@ -1,7 +1,7 @@ -package org.baeldung.config; +package com.baeldung.config; -import org.baeldung.security.FacebookSignInAdapter; -import org.baeldung.security.FacebookConnectionSignup; +import com.baeldung.security.FacebookSignInAdapter; +import com.baeldung.security.FacebookConnectionSignup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -18,7 +18,7 @@ import org.springframework.social.connect.web.ProviderSignInController; @Configuration @EnableWebSecurity -@ComponentScan(basePackages = { "org.baeldung.security" }) +@ComponentScan(basePackages = { "com.baeldung.security" }) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired diff --git a/spring-social-login/src/main/java/org/baeldung/config/WebConfig.java b/spring-social-login/src/main/java/com/baeldung/config/WebConfig.java similarity index 98% rename from spring-social-login/src/main/java/org/baeldung/config/WebConfig.java rename to spring-social-login/src/main/java/com/baeldung/config/WebConfig.java index 8cfcd6cb41..d178cc28a6 100644 --- a/spring-social-login/src/main/java/org/baeldung/config/WebConfig.java +++ b/spring-social-login/src/main/java/com/baeldung/config/WebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-social-login/src/main/java/org/baeldung/persistence/dao/UserRepository.java b/spring-social-login/src/main/java/com/baeldung/persistence/dao/UserRepository.java similarity index 69% rename from spring-social-login/src/main/java/org/baeldung/persistence/dao/UserRepository.java rename to spring-social-login/src/main/java/com/baeldung/persistence/dao/UserRepository.java index 679dd6c363..aeb443dd06 100644 --- a/spring-social-login/src/main/java/org/baeldung/persistence/dao/UserRepository.java +++ b/spring-social-login/src/main/java/com/baeldung/persistence/dao/UserRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.persistence.dao; +package com.baeldung.persistence.dao; -import org.baeldung.persistence.model.User; +import com.baeldung.persistence.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { diff --git a/spring-social-login/src/main/java/org/baeldung/persistence/model/User.java b/spring-social-login/src/main/java/com/baeldung/persistence/model/User.java similarity index 96% rename from spring-social-login/src/main/java/org/baeldung/persistence/model/User.java rename to spring-social-login/src/main/java/com/baeldung/persistence/model/User.java index a4cffc27d0..ce1774ca2c 100644 --- a/spring-social-login/src/main/java/org/baeldung/persistence/model/User.java +++ b/spring-social-login/src/main/java/com/baeldung/persistence/model/User.java @@ -1,4 +1,4 @@ -package org.baeldung.persistence.model; +package com.baeldung.persistence.model; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/spring-social-login/src/main/java/org/baeldung/security/FacebookConnectionSignup.java b/spring-social-login/src/main/java/com/baeldung/security/FacebookConnectionSignup.java similarity index 85% rename from spring-social-login/src/main/java/org/baeldung/security/FacebookConnectionSignup.java rename to spring-social-login/src/main/java/com/baeldung/security/FacebookConnectionSignup.java index 6a9e30d7d8..e0a9fdc2e7 100644 --- a/spring-social-login/src/main/java/org/baeldung/security/FacebookConnectionSignup.java +++ b/spring-social-login/src/main/java/com/baeldung/security/FacebookConnectionSignup.java @@ -1,9 +1,9 @@ -package org.baeldung.security; +package com.baeldung.security; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import org.baeldung.persistence.dao.UserRepository; -import org.baeldung.persistence.model.User; +import com.baeldung.persistence.dao.UserRepository; +import com.baeldung.persistence.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.social.connect.Connection; import org.springframework.social.connect.ConnectionSignUp; diff --git a/spring-social-login/src/main/java/org/baeldung/security/FacebookSignInAdapter.java b/spring-social-login/src/main/java/com/baeldung/security/FacebookSignInAdapter.java similarity index 96% rename from spring-social-login/src/main/java/org/baeldung/security/FacebookSignInAdapter.java rename to spring-social-login/src/main/java/com/baeldung/security/FacebookSignInAdapter.java index b861609a01..3050941ffa 100644 --- a/spring-social-login/src/main/java/org/baeldung/security/FacebookSignInAdapter.java +++ b/spring-social-login/src/main/java/com/baeldung/security/FacebookSignInAdapter.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.util.Arrays; diff --git a/spring-social-login/src/main/java/org/baeldung/security/MyUserDetailsService.java b/spring-social-login/src/main/java/com/baeldung/security/MyUserDetailsService.java similarity index 89% rename from spring-social-login/src/main/java/org/baeldung/security/MyUserDetailsService.java rename to spring-social-login/src/main/java/com/baeldung/security/MyUserDetailsService.java index 5d0d5d793a..126f02e74a 100644 --- a/spring-social-login/src/main/java/org/baeldung/security/MyUserDetailsService.java +++ b/spring-social-login/src/main/java/com/baeldung/security/MyUserDetailsService.java @@ -1,9 +1,9 @@ -package org.baeldung.security; +package com.baeldung.security; import java.util.Arrays; -import org.baeldung.persistence.dao.UserRepository; -import org.baeldung.persistence.model.User; +import com.baeldung.persistence.dao.UserRepository; +import com.baeldung.persistence.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; diff --git a/spring-social-login/src/test/java/org/baeldung/SpringContextTest.java b/spring-social-login/src/test/java/com/baeldung/SpringContextTest.java similarity index 88% rename from spring-social-login/src/test/java/org/baeldung/SpringContextTest.java rename to spring-social-login/src/test/java/com/baeldung/SpringContextTest.java index cfd8759c52..1d9711b5a4 100644 --- a/spring-social-login/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-social-login/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.config.Application; +import com.baeldung.config.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; From aa251bb22b90a97128858317cc8ad9240cc897ca Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:02:32 +0100 Subject: [PATCH 094/530] JAVA-960: Migrate spring-static-resources to com.baeldung --- .../security/MySimpleUrlAuthenticationSuccessHandler.java | 2 +- .../src/main/java/{org => com}/baeldung/spring/AppConfig.java | 4 ++-- .../src/main/java/{org => com}/baeldung/spring/MvcConfig.java | 4 ++-- .../java/{org => com}/baeldung/spring/SecSecurityConfig.java | 2 +- .../{org => com}/baeldung/web/controller/HomeController.java | 2 +- .../src/main/resources/webSecurityConfig.xml | 2 +- .../src/test/java/com/baeldung/SpringContextTest.java | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) rename spring-static-resources/src/main/java/{org => com}/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java (98%) rename spring-static-resources/src/main/java/{org => com}/baeldung/spring/AppConfig.java (83%) rename spring-static-resources/src/main/java/{org => com}/baeldung/spring/MvcConfig.java (96%) rename spring-static-resources/src/main/java/{org => com}/baeldung/spring/SecSecurityConfig.java (90%) rename spring-static-resources/src/main/java/{org => com}/baeldung/web/controller/HomeController.java (96%) diff --git a/spring-static-resources/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java b/spring-static-resources/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java similarity index 98% rename from spring-static-resources/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java rename to spring-static-resources/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java index 316642ab6f..d6c54f8099 100644 --- a/spring-static-resources/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java +++ b/spring-static-resources/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.io.IOException; import javax.servlet.http.HttpServletRequest; diff --git a/spring-static-resources/src/main/java/org/baeldung/spring/AppConfig.java b/spring-static-resources/src/main/java/com/baeldung/spring/AppConfig.java similarity index 83% rename from spring-static-resources/src/main/java/org/baeldung/spring/AppConfig.java rename to spring-static-resources/src/main/java/com/baeldung/spring/AppConfig.java index c379d20047..97e7cf96fc 100644 --- a/spring-static-resources/src/main/java/org/baeldung/spring/AppConfig.java +++ b/spring-static-resources/src/main/java/com/baeldung/spring/AppConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -8,7 +8,7 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration -@ComponentScan(basePackages = { "org.baeldung.persistence.service", "org.baeldung.persistence.dao" }) +@ComponentScan(basePackages = { "com.baeldung.persistence.service", "com.baeldung.persistence.dao" }) @Import({ MvcConfig.class, SecSecurityConfig.class }) @PropertySource("classpath:application.properties") public class AppConfig { diff --git a/spring-static-resources/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-static-resources/src/main/java/com/baeldung/spring/MvcConfig.java similarity index 96% rename from spring-static-resources/src/main/java/org/baeldung/spring/MvcConfig.java rename to spring-static-resources/src/main/java/com/baeldung/spring/MvcConfig.java index 7bd03617be..f23fe14fb8 100644 --- a/spring-static-resources/src/main/java/org/baeldung/spring/MvcConfig.java +++ b/spring-static-resources/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import java.util.Locale; @@ -25,7 +25,7 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; @Configuration -@ComponentScan(basePackages = { "org.baeldung.web.controller", "org.baeldung.persistence.service", "org.baeldung.persistence.dao" }) +@ComponentScan(basePackages = { "com.baeldung.web.controller", "com.baeldung.persistence.service", "com.baeldung.persistence.dao" }) @EnableWebMvc public class MvcConfig implements WebMvcConfigurer { @Autowired diff --git a/spring-static-resources/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-static-resources/src/main/java/com/baeldung/spring/SecSecurityConfig.java similarity index 90% rename from spring-static-resources/src/main/java/org/baeldung/spring/SecSecurityConfig.java rename to spring-static-resources/src/main/java/com/baeldung/spring/SecSecurityConfig.java index 4da114c78b..3e630b8729 100644 --- a/spring-static-resources/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-static-resources/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; diff --git a/spring-static-resources/src/main/java/org/baeldung/web/controller/HomeController.java b/spring-static-resources/src/main/java/com/baeldung/web/controller/HomeController.java similarity index 96% rename from spring-static-resources/src/main/java/org/baeldung/web/controller/HomeController.java rename to spring-static-resources/src/main/java/com/baeldung/web/controller/HomeController.java index 44645a1471..dd58c7c2b6 100644 --- a/spring-static-resources/src/main/java/org/baeldung/web/controller/HomeController.java +++ b/spring-static-resources/src/main/java/com/baeldung/web/controller/HomeController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import java.io.IOException; import java.text.DateFormat; diff --git a/spring-static-resources/src/main/resources/webSecurityConfig.xml b/spring-static-resources/src/main/resources/webSecurityConfig.xml index ea64ad5aea..2278cb6138 100644 --- a/spring-static-resources/src/main/resources/webSecurityConfig.xml +++ b/spring-static-resources/src/main/resources/webSecurityConfig.xml @@ -23,7 +23,7 @@ - + diff --git a/spring-static-resources/src/test/java/com/baeldung/SpringContextTest.java b/spring-static-resources/src/test/java/com/baeldung/SpringContextTest.java index 0dcbba3221..153b290de7 100644 --- a/spring-static-resources/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-static-resources/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ package com.baeldung; -import org.baeldung.spring.SecSecurityConfig; +import com.baeldung.spring.SecSecurityConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; From 20e1eb49123cbbf7fa2dcb0b38140b66b1e1f1d7 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:07:48 +0100 Subject: [PATCH 095/530] JAVA-960: Migrate spring-session to com.baeldung --- spring-session/pom.xml | 2 +- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- .../test/java/{org => com}/baeldung/SpringContextLiveTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename spring-session/spring-session-jdbc/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) rename spring-session/spring-session-mongodb/src/test/java/{org => com}/baeldung/SpringContextTest.java (96%) rename spring-session/spring-session-redis/src/test/java/{org => com}/baeldung/SpringContextLiveTest.java (96%) diff --git a/spring-session/pom.xml b/spring-session/pom.xml index 579d2327e8..42a414afdc 100644 --- a/spring-session/pom.xml +++ b/spring-session/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - org.baeldung + com.baeldung spring-session 1.0.0-SNAPSHOT spring-session diff --git a/spring-session/spring-session-jdbc/src/test/java/org/baeldung/SpringContextTest.java b/spring-session/spring-session-jdbc/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-session/spring-session-jdbc/src/test/java/org/baeldung/SpringContextTest.java rename to spring-session/spring-session-jdbc/src/test/java/com/baeldung/SpringContextTest.java index b69855ba38..8f6c2f2889 100644 --- a/spring-session/spring-session-jdbc/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-session/spring-session-jdbc/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java b/spring-session/spring-session-mongodb/src/test/java/com/baeldung/SpringContextTest.java similarity index 96% rename from spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java rename to spring-session/spring-session-mongodb/src/test/java/com/baeldung/SpringContextTest.java index cc935b8cfb..babcdb2ccf 100644 --- a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-session/spring-session-mongodb/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import com.baeldung.springsessionmongodb.SpringSessionMongoDBApplication; import org.junit.Test; diff --git a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-session/spring-session-redis/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 96% rename from spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-session/spring-session-redis/src/test/java/com/baeldung/SpringContextLiveTest.java index 3a4f14e9e6..2e33255e01 100644 --- a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-session/spring-session-redis/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From b4ee35c52573948839a86414cc16f0ce568ba6b7 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:09:47 +0100 Subject: [PATCH 096/530] JAVA-960: Migrate spring-sleuth to com.baeldung --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-sleuth/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-sleuth/src/test/java/org/baeldung/SpringContextTest.java b/spring-sleuth/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-sleuth/src/test/java/org/baeldung/SpringContextTest.java rename to spring-sleuth/src/test/java/com/baeldung/SpringContextTest.java index ff22398ca4..8dc2455e63 100644 --- a/spring-sleuth/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-sleuth/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From fd68ce46363068b00da1ef7a3914d46b51b09be0 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:13:49 +0100 Subject: [PATCH 097/530] JAVA-960: Migrate spring-spel to com.baeldung --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-spel/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-spel/src/test/java/org/baeldung/SpringContextTest.java b/spring-spel/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-spel/src/test/java/org/baeldung/SpringContextTest.java rename to spring-spel/src/test/java/com/baeldung/SpringContextTest.java index e25c1bf8e4..338b8b1e68 100644 --- a/spring-spel/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-spel/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From b205233679e3b27d284a4b88baed36fffc66ce4c Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:15:41 +0100 Subject: [PATCH 098/530] JAVA-960: Migrate spring-state-machine to com.baeldung --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-state-machine/src/test/java/{org => com}/baeldung/SpringContextTest.java (97%) diff --git a/spring-state-machine/src/test/java/org/baeldung/SpringContextTest.java b/spring-state-machine/src/test/java/com/baeldung/SpringContextTest.java similarity index 97% rename from spring-state-machine/src/test/java/org/baeldung/SpringContextTest.java rename to spring-state-machine/src/test/java/com/baeldung/SpringContextTest.java index 1e847c0d65..407cd8ebb0 100644 --- a/spring-state-machine/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From bcc15ba72ec1807f727c913b23637051e4107724 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:17:48 +0100 Subject: [PATCH 099/530] JAVA-960: Migrate spring-swagger-codegen to com.baeldung --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-swagger-codegen/spring-swagger-codegen-app/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/src/test/java/org/baeldung/SpringContextTest.java b/spring-swagger-codegen/spring-swagger-codegen-app/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-swagger-codegen/spring-swagger-codegen-app/src/test/java/org/baeldung/SpringContextTest.java rename to spring-swagger-codegen/spring-swagger-codegen-app/src/test/java/com/baeldung/SpringContextTest.java index 79b2b7fa88..54949598aa 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-swagger-codegen/spring-swagger-codegen-app/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 137ff8d5eaff8dd636436f09ee9053b5698852b6 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:19:30 +0100 Subject: [PATCH 100/530] JAVA-960: Migrate spring-vertx to com.baeldung --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-vertx/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-vertx/src/test/java/org/baeldung/SpringContextTest.java b/spring-vertx/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-vertx/src/test/java/org/baeldung/SpringContextTest.java rename to spring-vertx/src/test/java/com/baeldung/SpringContextTest.java index 4ce94ec16a..386d83b47b 100644 --- a/spring-vertx/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-vertx/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 25e76cdb8848f88569a9cfc82d1f9c263de5121c Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 19 Mar 2020 15:40:01 +0100 Subject: [PATCH 101/530] JAVA-960: Migrate spring-resttemplate to com.baeldung --- .../RestTemplateConfigurationApplication.java | 2 +- .../CustomClientHttpRequestInterceptor.java | 2 +- .../CustomRestTemplateCustomizer.java | 2 +- .../configuration/FooController.java | 4 ++-- .../configuration/HelloController.java | 2 +- .../resttemplate/configuration/SpringConfig.java | 4 ++-- .../resttemplate/web/controller/PersonAPI.java | 6 +++--- .../baeldung/resttemplate/web/dto/Foo.java | 2 +- .../baeldung/resttemplate/web/dto/Person.java | 2 +- .../web/exception/NotFoundException.java | 2 +- .../RestTemplateResponseErrorHandler.java | 4 ++-- .../baeldung/resttemplate/web/model/Bar.java | 2 +- .../resttemplate/web/model/Employee.java | 3 +-- .../web/service/BarConsumerService.java | 6 +++--- .../web/service/EmployeeService.java | 4 ++-- .../resttemplate/web/service/PersonService.java | 4 ++-- .../web/service/PersonServiceImpl.java | 4 ++-- .../java/com/baeldung/SpringContextTest.java | 0 .../{org => com}/baeldung/SpringTestConfig.java | 4 ++-- .../{org => com}/baeldung/client/Consts.java | 2 +- .../client/TestRestTemplateBasicLiveTest.java | 4 ++-- .../LargeFileDownloadIntegrationTest.java | 2 +- .../resttemplate/RestTemplateBasicLiveTest.java | 8 ++++---- .../resttemplate/postjson/PersonAPILiveTest.java | 6 +++--- ...plateResponseErrorHandlerIntegrationTest.java | 8 ++++---- ...oyeeServiceMockRestServiceServerUnitTest.java | 8 ++++---- .../web/service/EmployeeServiceUnitTest.java | 8 +++----- .../java/org/baeldung/SpringContextTest.java | 16 ---------------- 28 files changed, 51 insertions(+), 70 deletions(-) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/RestTemplateConfigurationApplication.java (92%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/configuration/CustomClientHttpRequestInterceptor.java (95%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/configuration/CustomRestTemplateCustomizer.java (89%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/configuration/FooController.java (97%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/configuration/HelloController.java (95%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/configuration/SpringConfig.java (90%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/controller/PersonAPI.java (88%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/dto/Foo.java (93%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/dto/Person.java (91%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/exception/NotFoundException.java (55%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/handler/RestTemplateResponseErrorHandler.java (92%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/model/Bar.java (87%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/model/Employee.java (93%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/service/BarConsumerService.java (80%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/service/EmployeeService.java (89%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/service/PersonService.java (58%) rename spring-resttemplate/src/main/java/{org => com}/baeldung/resttemplate/web/service/PersonServiceImpl.java (77%) rename spring-resttemplate/src/{main => test}/java/com/baeldung/SpringContextTest.java (100%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/SpringTestConfig.java (89%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/client/Consts.java (68%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/client/TestRestTemplateBasicLiveTest.java (98%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/resttemplate/LargeFileDownloadIntegrationTest.java (99%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/resttemplate/RestTemplateBasicLiveTest.java (98%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/resttemplate/postjson/PersonAPILiveTest.java (95%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java (89%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java (92%) rename spring-resttemplate/src/test/java/{org => com}/baeldung/web/service/EmployeeServiceUnitTest.java (84%) delete mode 100644 spring-resttemplate/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/RestTemplateConfigurationApplication.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java similarity index 92% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/RestTemplateConfigurationApplication.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java index 9a361e92c9..3e4d1ffa00 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/RestTemplateConfigurationApplication.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate; +package com.baeldung.resttemplate; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/CustomClientHttpRequestInterceptor.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/CustomClientHttpRequestInterceptor.java similarity index 95% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/CustomClientHttpRequestInterceptor.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/CustomClientHttpRequestInterceptor.java index a39994ae67..bef8af3725 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/CustomClientHttpRequestInterceptor.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/CustomClientHttpRequestInterceptor.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.configuration; +package com.baeldung.resttemplate.configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/CustomRestTemplateCustomizer.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/CustomRestTemplateCustomizer.java similarity index 89% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/CustomRestTemplateCustomizer.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/CustomRestTemplateCustomizer.java index 5e8220d064..75ce02ea04 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/CustomRestTemplateCustomizer.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/CustomRestTemplateCustomizer.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.configuration; +package com.baeldung.resttemplate.configuration; import org.springframework.boot.web.client.RestTemplateCustomizer; import org.springframework.web.client.RestTemplate; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/FooController.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/FooController.java similarity index 97% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/FooController.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/FooController.java index a9d400b199..dbef16b592 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/FooController.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/FooController.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.configuration; +package com.baeldung.resttemplate.configuration; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; @@ -6,7 +6,7 @@ import java.net.URI; import java.util.Collection; import java.util.Map; -import org.baeldung.resttemplate.web.dto.Foo; +import com.baeldung.resttemplate.web.dto.Foo; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/HelloController.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/HelloController.java similarity index 95% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/HelloController.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/HelloController.java index ee404db4f8..854ca1a1c1 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/HelloController.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/HelloController.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.configuration; +package com.baeldung.resttemplate.configuration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.client.RestTemplateBuilder; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/SpringConfig.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/SpringConfig.java similarity index 90% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/SpringConfig.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/SpringConfig.java index 966d5bcaa1..a97ac7d5a5 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/configuration/SpringConfig.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/SpringConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.configuration; +package com.baeldung.resttemplate.configuration; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -11,7 +11,7 @@ import org.springframework.web.client.RestTemplate; @Configuration @EnableAutoConfiguration -@ComponentScan("org.baeldung.resttemplate.configuration") +@ComponentScan("com.baeldung.resttemplate.configuration") public class SpringConfig { @Bean diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/controller/PersonAPI.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java similarity index 88% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/controller/PersonAPI.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java index b1b56ec2f3..b3131cc00c 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/controller/PersonAPI.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java @@ -1,9 +1,9 @@ -package org.baeldung.resttemplate.web.controller; +package com.baeldung.resttemplate.web.controller; import javax.servlet.http.HttpServletResponse; -import org.baeldung.resttemplate.web.dto.Person; -import org.baeldung.resttemplate.web.service.PersonService; +import com.baeldung.resttemplate.web.service.PersonService; +import com.baeldung.resttemplate.web.dto.Person; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Foo.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/dto/Foo.java similarity index 93% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Foo.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/dto/Foo.java index ed0a42c429..ede91dab1a 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Foo.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/dto/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.web.dto; +package com.baeldung.resttemplate.web.dto; import com.thoughtworks.xstream.annotations.XStreamAlias; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Person.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/dto/Person.java similarity index 91% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Person.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/dto/Person.java index 4b7679638f..11e56fc6e2 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Person.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/dto/Person.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.web.dto; +package com.baeldung.resttemplate.web.dto; public class Person { private Integer id; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/exception/NotFoundException.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/exception/NotFoundException.java similarity index 55% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/exception/NotFoundException.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/exception/NotFoundException.java index 3e606e9314..8eb217978c 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/exception/NotFoundException.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/exception/NotFoundException.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.web.exception; +package com.baeldung.resttemplate.web.exception; public class NotFoundException extends RuntimeException { } diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/handler/RestTemplateResponseErrorHandler.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/handler/RestTemplateResponseErrorHandler.java similarity index 92% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/handler/RestTemplateResponseErrorHandler.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/handler/RestTemplateResponseErrorHandler.java index 214de38746..02260438c7 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/handler/RestTemplateResponseErrorHandler.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/handler/RestTemplateResponseErrorHandler.java @@ -1,8 +1,8 @@ -package org.baeldung.resttemplate.web.handler; +package com.baeldung.resttemplate.web.handler; import java.io.IOException; -import org.baeldung.resttemplate.web.exception.NotFoundException; +import com.baeldung.resttemplate.web.exception.NotFoundException; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/model/Bar.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/model/Bar.java similarity index 87% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/model/Bar.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/model/Bar.java index cf5279697f..7f8902e2fc 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/model/Bar.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/model/Bar.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.web.model; +package com.baeldung.resttemplate.web.model; public class Bar { private String id; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/model/Employee.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/model/Employee.java similarity index 93% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/model/Employee.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/model/Employee.java index a9b84a77b4..bb1ad8cbfa 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/model/Employee.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/model/Employee.java @@ -1,6 +1,5 @@ -package org.baeldung.resttemplate.web.model; +package com.baeldung.resttemplate.web.model; -import java.util.Date; import java.util.Objects; public class Employee { diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/BarConsumerService.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/BarConsumerService.java similarity index 80% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/BarConsumerService.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/BarConsumerService.java index 54a66ea591..485143b0a1 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/BarConsumerService.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/BarConsumerService.java @@ -1,7 +1,7 @@ -package org.baeldung.resttemplate.web.service; +package com.baeldung.resttemplate.web.service; -import org.baeldung.resttemplate.web.handler.RestTemplateResponseErrorHandler; -import org.baeldung.resttemplate.web.model.Bar; +import com.baeldung.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.baeldung.resttemplate.web.model.Bar; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Service; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/EmployeeService.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/EmployeeService.java similarity index 89% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/EmployeeService.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/EmployeeService.java index c6562fbc94..18dff3db1b 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/EmployeeService.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/EmployeeService.java @@ -1,6 +1,6 @@ -package org.baeldung.resttemplate.web.service; +package com.baeldung.resttemplate.web.service; -import org.baeldung.resttemplate.web.model.Employee; +import com.baeldung.resttemplate.web.model.Employee; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonService.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java similarity index 58% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonService.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java index c5ad39e101..e91d2adc5c 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonService.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java @@ -1,6 +1,6 @@ -package org.baeldung.resttemplate.web.service; +package com.baeldung.resttemplate.web.service; -import org.baeldung.resttemplate.web.dto.Person; +import com.baeldung.resttemplate.web.dto.Person; public interface PersonService { diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonServiceImpl.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java similarity index 77% rename from spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonServiceImpl.java rename to spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java index 658e0fade0..d7a1bfc2db 100644 --- a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonServiceImpl.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java @@ -1,6 +1,6 @@ -package org.baeldung.resttemplate.web.service; +package com.baeldung.resttemplate.web.service; -import org.baeldung.resttemplate.web.dto.Person; +import com.baeldung.resttemplate.web.dto.Person; import org.springframework.stereotype.Component; @Component diff --git a/spring-resttemplate/src/main/java/com/baeldung/SpringContextTest.java b/spring-resttemplate/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-resttemplate/src/main/java/com/baeldung/SpringContextTest.java rename to spring-resttemplate/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java b/spring-resttemplate/src/test/java/com/baeldung/SpringTestConfig.java similarity index 89% rename from spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java rename to spring-resttemplate/src/test/java/com/baeldung/SpringTestConfig.java index 7c4bbb4e5e..9a32d1ee98 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java +++ b/spring-resttemplate/src/test/java/com/baeldung/SpringTestConfig.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; @@ -8,7 +8,7 @@ import org.springframework.web.client.RestTemplate; @Configuration @EnableAutoConfiguration -@ComponentScan("org.baeldung") +@ComponentScan("com.baeldung") public class SpringTestConfig { @Bean diff --git a/spring-resttemplate/src/test/java/org/baeldung/client/Consts.java b/spring-resttemplate/src/test/java/com/baeldung/client/Consts.java similarity index 68% rename from spring-resttemplate/src/test/java/org/baeldung/client/Consts.java rename to spring-resttemplate/src/test/java/com/baeldung/client/Consts.java index b40561d9c3..b392c4d199 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/client/Consts.java +++ b/spring-resttemplate/src/test/java/com/baeldung/client/Consts.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package com.baeldung.client; public interface Consts { int APPLICATION_PORT = 8082; diff --git a/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java b/spring-resttemplate/src/test/java/com/baeldung/client/TestRestTemplateBasicLiveTest.java similarity index 98% rename from spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java rename to spring-resttemplate/src/test/java/com/baeldung/client/TestRestTemplateBasicLiveTest.java index 967c4a6188..9f4b3c9b35 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/client/TestRestTemplateBasicLiveTest.java @@ -1,10 +1,10 @@ -package org.baeldung.client; +package com.baeldung.client; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertTrue; -import org.baeldung.resttemplate.web.dto.Foo; +import com.baeldung.resttemplate.web.dto.Foo; import org.junit.Before; import org.junit.Test; import org.springframework.boot.test.web.client.TestRestTemplate; diff --git a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/LargeFileDownloadIntegrationTest.java b/spring-resttemplate/src/test/java/com/baeldung/resttemplate/LargeFileDownloadIntegrationTest.java similarity index 99% rename from spring-resttemplate/src/test/java/org/baeldung/resttemplate/LargeFileDownloadIntegrationTest.java rename to spring-resttemplate/src/test/java/com/baeldung/resttemplate/LargeFileDownloadIntegrationTest.java index 21639818db..eb5d01d06f 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/LargeFileDownloadIntegrationTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/resttemplate/LargeFileDownloadIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate; +package com.baeldung.resttemplate; import org.assertj.core.api.Assertions; import org.junit.Assert; diff --git a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/RestTemplateBasicLiveTest.java b/spring-resttemplate/src/test/java/com/baeldung/resttemplate/RestTemplateBasicLiveTest.java similarity index 98% rename from spring-resttemplate/src/test/java/org/baeldung/resttemplate/RestTemplateBasicLiveTest.java rename to spring-resttemplate/src/test/java/com/baeldung/resttemplate/RestTemplateBasicLiveTest.java index 54e416d008..0dab124316 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/RestTemplateBasicLiveTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/resttemplate/RestTemplateBasicLiveTest.java @@ -1,7 +1,7 @@ -package org.baeldung.resttemplate; +package com.baeldung.resttemplate; import static org.apache.commons.codec.binary.Base64.encodeBase64; -import static org.baeldung.client.Consts.APPLICATION_PORT; +import static com.baeldung.client.Consts.APPLICATION_PORT; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -14,8 +14,8 @@ import java.net.URI; import java.util.Arrays; import java.util.Set; -import org.baeldung.resttemplate.web.dto.Foo; -import org.baeldung.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.baeldung.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.baeldung.resttemplate.web.dto.Foo; import org.junit.Before; import org.junit.Test; import org.springframework.http.HttpEntity; diff --git a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java b/spring-resttemplate/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java similarity index 95% rename from spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java rename to spring-resttemplate/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java index 1347cb0c7a..f1861ede92 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java @@ -1,12 +1,12 @@ -package org.baeldung.resttemplate.postjson; +package com.baeldung.resttemplate.postjson; import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.net.URI; -import org.baeldung.resttemplate.RestTemplateConfigurationApplication; -import org.baeldung.resttemplate.web.dto.Person; +import com.baeldung.resttemplate.RestTemplateConfigurationApplication; +import com.baeldung.resttemplate.web.dto.Person; import org.json.JSONException; import org.json.JSONObject; import org.junit.BeforeClass; diff --git a/spring-resttemplate/src/test/java/org/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java b/spring-resttemplate/src/test/java/com/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java similarity index 89% rename from spring-resttemplate/src/test/java/org/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java rename to spring-resttemplate/src/test/java/com/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java index 60069cea71..688b6e9d56 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java @@ -1,8 +1,8 @@ -package org.baeldung.web.handler; +package com.baeldung.web.handler; -import org.baeldung.resttemplate.web.exception.NotFoundException; -import org.baeldung.resttemplate.web.handler.RestTemplateResponseErrorHandler; -import org.baeldung.resttemplate.web.model.Bar; +import com.baeldung.resttemplate.web.exception.NotFoundException; +import com.baeldung.resttemplate.web.handler.RestTemplateResponseErrorHandler; +import com.baeldung.resttemplate.web.model.Bar; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java b/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java similarity index 92% rename from spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java rename to spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java index f93ba71666..9fe1232231 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web.service; +package com.baeldung.web.service; import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; @@ -6,9 +6,9 @@ import static org.springframework.test.web.client.response.MockRestResponseCreat import java.net.URI; -import org.baeldung.SpringTestConfig; -import org.baeldung.resttemplate.web.model.Employee; -import org.baeldung.resttemplate.web.service.EmployeeService; +import com.baeldung.SpringTestConfig; +import com.baeldung.resttemplate.web.model.Employee; +import com.baeldung.resttemplate.web.service.EmployeeService; import org.junit.Assert; import org.junit.Before; import org.junit.Test; diff --git a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java b/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceUnitTest.java similarity index 84% rename from spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java rename to spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceUnitTest.java index f4b391573a..6eb040414b 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceUnitTest.java @@ -1,15 +1,13 @@ -package org.baeldung.web.service; +package com.baeldung.web.service; -import org.baeldung.resttemplate.web.model.Employee; -import org.baeldung.resttemplate.web.service.EmployeeService; +import com.baeldung.resttemplate.web.model.Employee; +import com.baeldung.resttemplate.web.service.EmployeeService; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-resttemplate/src/test/java/org/baeldung/SpringContextTest.java b/spring-resttemplate/src/test/java/org/baeldung/SpringContextTest.java deleted file mode 100644 index e52d249f0b..0000000000 --- a/spring-resttemplate/src/test/java/org/baeldung/SpringContextTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.resttemplate.RestTemplateConfigurationApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = RestTemplateConfigurationApplication.class) -public class SpringContextTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} From 413b9d682ef07053245ed2ae340c0c1917de979f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 19 Mar 2020 22:30:53 +0530 Subject: [PATCH 102/530] JAVA-60 Mvn Clean Install Profile Issue - Github 8189 - Updated README.md as per the latest profile based segregation that we follow in this repository --- README.md | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5307efa008..47b9709465 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,38 @@ This project is **a collection of small and focused tutorials** - each covering A strong focus of these is, of course, the Spring Framework - Spring, Spring Boot and Spring Security. In additional to Spring, the modules here are covering a number of aspects in Java. +Profile based segregation +==================== + +We are using maven build profiles to segregate the huge list of individual projects we have in our repository. + +The projects are broadly divided into 3 list: first, second and heavy. + +Next, they are segregated further on the basis of tests that we want to execute. + +Therefore, we have a total of 6 profiles: + +| Profile | Includes | Type of test enabled | +| ---------------------- | --------------------------- | -------------------- | +| default-first | First set of projects | *UnitTest | +| integration-lite-first | First set of projects | *IntegrationTest | +| default-second | Second set of projects | *UnitTest | +| integration-lite-first | Second set of projects | *IntegrationTest | +| default-heavy | Heavy/long running projects | *UnitTest | +| integration-heavy | Heavy/long running projects | *IntegrationTest | Building the project ==================== -To do the full build, do: `mvn clean install` + +Though it should not be needed often to build the entire repository at once because we are usually concerned with a specific module. + +But if we want to, we can invoke the below command from the root of the repository if we want to build the entire repository with only Unit Tests enabled: + +`mvn clean install -Pdefault-first,default-second,default-heavy` + +or if we want to build the entire repository with Integration Tests enabled, we can do: + +`mvn clean install -Pintegration-lite-first,integration-lite-second,integration-heavy` Building a single module @@ -46,8 +74,16 @@ When you're working with an individual module, there's no need to import all of Running Tests ============= -The command `mvn clean install` will run the unit tests in a module. -To run the integration tests, use the command `mvn clean install -Pintegration-lite-first` +The command `mvn clean install` from within a module will run the unit tests in that module. +To run the integration tests, use the command: + +`mvn clean install -Pintegration-lite-first` or + +`mvn clean install -Pintegration-lite-second` or + +`mvn clean install -Pintegration-heavy` + +depending on the list where our module exists From 2261dd80d44ccea40fefc212930c5eb133a5fc49 Mon Sep 17 00:00:00 2001 From: Donato Rimenti Date: Wed, 18 Mar 2020 10:34:00 +0100 Subject: [PATCH 103/530] [JAVA-22] Moved articles not in ebook from spring-boot-rest to spring-boot-mvc-2 --- .../spring-boot-mvc-2/README.md | 4 + spring-boot-modules/spring-boot-mvc-2/pom.xml | 22 +++ .../src/main/java/com/baeldung/etag/Foo.java | 95 +++++++++ .../java/com/baeldung/etag/FooController.java | 58 ++++++ .../main/java/com/baeldung/etag/FooDao.java | 8 + .../etag/SpringBootEtagApplication.java | 13 ++ .../java/com/baeldung/etag/WebConfig.java | 28 +++ .../SpringBootStudentsApplication.java | 13 ++ .../java/com/baeldung/students/Student.java | 53 ++++++ .../baeldung/students/StudentController.java | 74 +++++++ .../com/baeldung/students/StudentService.java | 51 +++++ .../src/main/resources/WEB-INF/web.xml | 18 ++ .../foo_API_test.postman_collection.json | 180 ++++++++++++++++++ .../baeldung/etag/EtagIntegrationTest.java | 123 ++++++++++++ .../java/com/baeldung/mime/FooLiveTest.java | 82 ++++++++ .../java/com/baeldung/mime/IMarshaller.java | 15 ++ .../com/baeldung/mime/JacksonMarshaller.java | 75 ++++++++ .../baeldung/mime/TestMarshallerFactory.java | 48 +++++ .../com/baeldung/mime/XStreamMarshaller.java | 46 +++++ .../StudentControllerIntegrationTest.java | 73 +++++++ spring-boot-rest/README.md | 6 +- 21 files changed, 1080 insertions(+), 5 deletions(-) create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/Foo.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooController.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooDao.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/SpringBootEtagApplication.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/WebConfig.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/SpringBootStudentsApplication.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/Student.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentController.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentService.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/resources/WEB-INF/web.xml create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/resources/foo_API_test.postman_collection.json create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/etag/EtagIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/FooLiveTest.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/IMarshaller.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/JacksonMarshaller.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/TestMarshallerFactory.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/XStreamMarshaller.java create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/students/StudentControllerIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-mvc-2/README.md b/spring-boot-modules/spring-boot-mvc-2/README.md index dc6a136131..d7341cca35 100644 --- a/spring-boot-modules/spring-boot-mvc-2/README.md +++ b/spring-boot-modules/spring-boot-mvc-2/README.md @@ -6,4 +6,8 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [Functional Controllers in Spring MVC](https://www.baeldung.com/spring-mvc-functional-controllers) - [Specify an Array of Strings as Body Parameters in Swagger](https://www.baeldung.com/swagger-body-array-of-strings) +- [ETags for REST with Spring](https://www.baeldung.com/etags-for-rest-with-spring) +- [Testing REST with multiple MIME types](https://www.baeldung.com/testing-rest-api-with-multiple-media-types) +- [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections) +- [Spring Boot Consuming and Producing JSON](https://www.baeldung.com/spring-boot-json) - More articles: [[prev -->]](/spring-boot-modules/spring-boot-mvc) diff --git a/spring-boot-modules/spring-boot-mvc-2/pom.xml b/spring-boot-modules/spring-boot-mvc-2/pom.xml index edebd41986..f527fd78f6 100644 --- a/spring-boot-modules/spring-boot-mvc-2/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-2/pom.xml @@ -49,6 +49,27 @@ org.apache.commons commons-lang3 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.fasterxml.jackson.core + jackson-databind + + + + com.h2database + h2 + + + + com.thoughtworks.xstream + xstream + ${xstream.version} @@ -103,6 +124,7 @@ com.baeldung.swagger2boot.SpringBootSwaggerApplication 2.2.0.BUILD-SNAPSHOT + 1.4.11.1 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/Foo.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/Foo.java new file mode 100644 index 0000000000..e553ca1b72 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/Foo.java @@ -0,0 +1,95 @@ +package com.baeldung.etag; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Version; + +@Entity +public class Foo implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @Column(nullable = false) + private String name; + + @Version + private long version; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Foo [name=").append(name).append("]"); + return builder.toString(); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooController.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooController.java new file mode 100644 index 0000000000..58f366501d --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooController.java @@ -0,0 +1,58 @@ +package com.baeldung.etag; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.server.ResponseStatusException; + +@RestController +@RequestMapping(value = "/foos") +public class FooController { + + @Autowired + private FooDao fooDao; + + @GetMapping(value = "/{id}") + public Foo findById(@PathVariable("id") final Long id, final HttpServletResponse response) { + return fooDao.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + } + + // Note: the global filter overrides the ETag value we set here. We can still + // analyze its behaviour in the Integration Test. + @GetMapping(value = "/{id}/custom-etag") + public ResponseEntity findByIdWithCustomEtag(@PathVariable("id") final Long id, + final HttpServletResponse response) { + final Foo foo = fooDao.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + return ResponseEntity.ok().eTag(Long.toString(foo.getVersion())).body(foo); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Foo create(@RequestBody final Foo resource, final HttpServletResponse response) { + return fooDao.save(resource); + } + + @PutMapping(value = "/{id}") + @ResponseStatus(HttpStatus.OK) + public void update(@PathVariable("id") final Long id, @RequestBody final Foo resource) { + fooDao.save(resource); + } + + @DeleteMapping(value = "/{id}") + @ResponseStatus(HttpStatus.OK) + public void delete(@PathVariable("id") final Long id) { + fooDao.deleteById(id); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooDao.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooDao.java new file mode 100644 index 0000000000..aff011af4a --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/FooDao.java @@ -0,0 +1,8 @@ +package com.baeldung.etag; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface FooDao extends CrudRepository{ +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/SpringBootEtagApplication.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/SpringBootEtagApplication.java new file mode 100644 index 0000000000..9e58a1550c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/SpringBootEtagApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.etag; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootEtagApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootEtagApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/WebConfig.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/WebConfig.java new file mode 100644 index 0000000000..bef468452a --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/etag/WebConfig.java @@ -0,0 +1,28 @@ +package com.baeldung.etag; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.ShallowEtagHeaderFilter; + +@Configuration +public class WebConfig { + + // Etags + + // If we're not using Spring Boot we can make use of + // AbstractAnnotationConfigDispatcherServletInitializer#getServletFilters + @Bean + public FilterRegistrationBean shallowEtagHeaderFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>( new ShallowEtagHeaderFilter()); + filterRegistrationBean.addUrlPatterns("/foos/*"); + filterRegistrationBean.setName("etagFilter"); + return filterRegistrationBean; + } + + // We can also just declare the filter directly + // @Bean + // public ShallowEtagHeaderFilter shallowEtagHeaderFilter() { + // return new ShallowEtagHeaderFilter(); + // } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/SpringBootStudentsApplication.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/SpringBootStudentsApplication.java new file mode 100644 index 0000000000..9c499e6103 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/SpringBootStudentsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.students; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootStudentsApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootStudentsApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/Student.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/Student.java new file mode 100644 index 0000000000..16d02fe14a --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/Student.java @@ -0,0 +1,53 @@ +package com.baeldung.students; + +public class Student { + + private long id; + private String firstName; + private String lastName; + + public Student() {} + + public Student(String firstName, String lastName) { + super(); + this.firstName = firstName; + this.lastName = lastName; + } + + public Student(long id, String firstName, String lastName) { + super(); + this.id = id; + 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 + "]"; + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentController.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentController.java new file mode 100644 index 0000000000..c71bb6c6e6 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentController.java @@ -0,0 +1,74 @@ +package com.baeldung.students; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import com.baeldung.students.StudentService; + +@RestController +@RequestMapping("/students") +public class StudentController { + + @Autowired + private StudentService service; + + @GetMapping("/") + public List read() { + return service.readAll(); + } + + @GetMapping("/{id}") + public ResponseEntity read(@PathVariable("id") Long id) { + Student foundStudent = service.read(id); + if (foundStudent == null) { + return ResponseEntity.notFound().build(); + } else { + return ResponseEntity.ok(foundStudent); + } + } + + @PostMapping("/") + public ResponseEntity create(@RequestBody Student student) throws URISyntaxException { + Student createdStudent = service.create(student); + + URI uri = ServletUriComponentsBuilder.fromCurrentRequest() + .path("/{id}") + .buildAndExpand(createdStudent.getId()) + .toUri(); + + return ResponseEntity.created(uri) + .body(createdStudent); + + } + + @PutMapping("/{id}") + public ResponseEntity update(@RequestBody Student student, @PathVariable Long id) { + Student updatedStudent = service.update(id, student); + if (updatedStudent == null) { + return ResponseEntity.notFound().build(); + } else { + return ResponseEntity.ok(updatedStudent); + } + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteStudent(@PathVariable Long id) { + service.delete(id); + + return ResponseEntity.noContent().build(); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentService.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentService.java new file mode 100644 index 0000000000..80f6dfd514 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/students/StudentService.java @@ -0,0 +1,51 @@ +package com.baeldung.students; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; + +@Service +public class StudentService { + + // DB repository mock + private Map repository = Arrays.asList( + new Student[]{ + new Student(1, "Alan","Turing"), + new Student(2, "Sebastian","Bach"), + new Student(3, "Pablo","Picasso"), + }).stream() + .collect(Collectors.toConcurrentMap(s -> s.getId(), Function.identity())); + + // DB id sequence mock + private AtomicLong sequence = new AtomicLong(3); + + public List readAll() { + return repository.values().stream().collect(Collectors.toList()); + } + + public Student read(Long id) { + return repository.get(id); + } + + public Student create(Student student) { + long key = sequence.incrementAndGet(); + student.setId(key); + repository.put(key, student); + return student; + } + + public Student update(Long id, Student student) { + student.setId(id); + Student oldStudent = repository.replace(id, student); + return oldStudent == null ? null : student; + } + + public void delete(Long id) { + repository.remove(id); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/resources/WEB-INF/web.xml b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/WEB-INF/web.xml new file mode 100644 index 0000000000..7f36b33b38 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/WEB-INF/web.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/resources/foo_API_test.postman_collection.json b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/foo_API_test.postman_collection.json new file mode 100644 index 0000000000..dc4acafab3 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/foo_API_test.postman_collection.json @@ -0,0 +1,180 @@ +{ + "info": { + "_postman_id": "9989b5be-13ba-4d22-8e43-d05dbf628e58", + "name": "foo API test", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "add a foo", + "event": [ + { + "listen": "test", + "script": { + "id": "a01534dc-6fc7-4c54-ba1d-6bcf311e5836", + "exec": [ + "pm.test(\"success status\", () => pm.response.to.be.success );", + "", + "pm.test(\"name is correct\", () => ", + " pm.expect(pm.response.json().name).to.equal(\"Transformers\"));", + "", + "pm.test(\"id was assigned\", () => ", + " pm.expect(pm.response.json().id).to.be.not.null );", + "", + "pm.variables.set(\"id\", pm.response.json().id);" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "name": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"Transformers\"\n}" + }, + "url": { + "raw": "http://localhost:8080/spring-boot-rest/foos", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "spring-boot-rest", + "foos" + ] + } + }, + "response": [] + }, + { + "name": "get a foo", + "event": [ + { + "listen": "test", + "script": { + "id": "03de440c-b483-4ab8-a11a-d0c99b349963", + "exec": [ + "pm.test(\"success status\", () => pm.response.to.be.success );", + "", + "pm.test(\"name is correct\", () => ", + " pm.expect(pm.response.json().name).to.equal(\"Transformers\"));", + "", + "pm.test(\"id is correct\", () => ", + " pm.expect(pm.response.json().id).to.equal(pm.variables.get(\"id\")) );" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "http://localhost:8080/spring-boot-rest/foos/{{id}}", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "spring-boot-rest", + "foos", + "{{id}}" + ] + } + }, + "response": [] + }, + { + "name": "delete a foo", + "event": [ + { + "listen": "test", + "script": { + "id": "74c1bb0f-c06c-48b1-a545-459233541b14", + "exec": [ + "pm.test(\"success status\", () => pm.response.to.be.success );" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "http://localhost:8080/spring-boot-rest/foos/{{id}}", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "spring-boot-rest", + "foos", + "{{id}}" + ] + } + }, + "response": [] + }, + { + "name": "verify delete", + "event": [ + { + "listen": "test", + "script": { + "id": "03de440c-b483-4ab8-a11a-d0c99b349963", + "exec": [ + "pm.test(\"status is 500\", () => pm.response.to.have.status(500) );", + "", + "pm.test(\"no value present\", () => ", + " pm.expect(pm.response.json().cause).to.equal(\"No value present\"));" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "http://localhost:8080/spring-boot-rest/foos/{{id}}", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "spring-boot-rest", + "foos", + "{{id}}" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/etag/EtagIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/etag/EtagIntegrationTest.java new file mode 100644 index 0000000000..88c5ae1686 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/etag/EtagIntegrationTest.java @@ -0,0 +1,123 @@ +package com.baeldung.etag; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.assertj.core.util.Preconditions; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import io.restassured.response.Response; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@ComponentScan(basePackageClasses = WebConfig.class) +@EnableAutoConfiguration +public class EtagIntegrationTest { + + @LocalServerPort + private int port; + + @Test + public void givenResourceExists_whenRetrievingResource_thenEtagIsAlsoReturned() { + // Given + final String uriOfResource = createAsUri(); + + // When + final Response findOneResponse = RestAssured.given().header("Accept", "application/json").get(uriOfResource); + + // Then + assertNotNull(findOneResponse.getHeader(HttpHeaders.ETAG)); + } + + @Test + public void givenResourceWasRetrieved_whenRetrievingAgainWithEtag_thenNotModifiedReturned() { + // Given + final String uriOfResource = createAsUri(); + final Response findOneResponse = RestAssured.given().header("Accept", "application/json").get(uriOfResource); + final String etagValue = findOneResponse.getHeader(HttpHeaders.ETAG); + + // When + final Response secondFindOneResponse = RestAssured.given().header("Accept", "application/json") + .headers("If-None-Match", etagValue).get(uriOfResource); + + // Then + assertTrue(secondFindOneResponse.getStatusCode() == 304); + } + + @Test + public void givenResourceWasRetrievedThenModified_whenRetrievingAgainWithEtag_thenResourceIsReturned() { + // Given + final String uriOfResource = createAsUri(); + final Response firstFindOneResponse = RestAssured.given().header("Accept", "application/json") + .get(uriOfResource); + final String etagValue = firstFindOneResponse.getHeader(HttpHeaders.ETAG); + final long createdId = firstFindOneResponse.jsonPath().getLong("id"); + + Foo updatedFoo = new Foo("updated value"); + updatedFoo.setId(createdId); + Response updatedResponse = RestAssured.given().contentType(ContentType.JSON).body(updatedFoo) + .put(uriOfResource); + assertThat(updatedResponse.getStatusCode() == 200); + + // When + final Response secondFindOneResponse = RestAssured.given().header("Accept", "application/json") + .headers("If-None-Match", etagValue).get(uriOfResource); + + // Then + assertTrue(secondFindOneResponse.getStatusCode() == 200); + } + + @Test + @Ignore("Not Yet Implemented By Spring - https://jira.springsource.org/browse/SPR-10164") + public void givenResourceExists_whenRetrievedWithIfMatchIncorrectEtag_then412IsReceived() { + // Given + final String uriOfResource = createAsUri(); + + // When + final Response findOneResponse = RestAssured.given().header("Accept", "application/json") + .headers("If-Match", randomAlphabetic(8)).get(uriOfResource); + + // Then + assertTrue(findOneResponse.getStatusCode() == 412); + } + + private final String createAsUri() { + final Response response = createAsResponse(new Foo(randomAlphabetic(6))); + Preconditions.checkState(response.getStatusCode() == 201, "create operation: " + response.getStatusCode()); + + return getURL() + "/" + response.getBody().as(Foo.class).getId(); + } + + private Response createAsResponse(final Foo resource) { + String resourceAsString; + try { + resourceAsString = new ObjectMapper().writeValueAsString(resource); + } catch (JsonProcessingException e) { + throw new AssertionError("Error during serialization"); + } + return RestAssured.given().contentType(MediaType.APPLICATION_JSON.toString()).body(resourceAsString) + .post(getURL()); + } + + private String getURL() { + return "http://localhost:" + port + "/foos"; + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/FooLiveTest.java b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/FooLiveTest.java new file mode 100644 index 0000000000..e65b106ead --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/FooLiveTest.java @@ -0,0 +1,82 @@ +package com.baeldung.mime; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.etag.Foo; +import com.baeldung.etag.WebConfig; + +import io.restassured.RestAssured; +import io.restassured.response.Response; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes= WebConfig.class, webEnvironment = WebEnvironment.RANDOM_PORT) +@ComponentScan({"com.baeldung.mime", "com.baeldung.etag"}) +@EnableAutoConfiguration +@ActiveProfiles("test") +public class FooLiveTest { + + @LocalServerPort + private int port; + + @Autowired + protected IMarshaller marshaller; + + // API + + public final void create() { + create(new Foo(randomAlphabetic(6))); + } + + public final String createAsUri() { + return createAsUri(new Foo(randomAlphabetic(6))); + } + + protected final void create(final Foo resource) { + createAsUri(resource); + } + + private final String createAsUri(final Foo resource) { + final Response response = createAsResponse(resource); + return getURL() + "/" + response.getBody().as(Foo.class).getId(); + } + + private final Response createAsResponse(final Foo resource) { + + final String resourceAsString = marshaller.encode(resource); + return RestAssured.given() + .contentType(marshaller.getMime()) + .body(resourceAsString) + .post(getURL()); + } + + // + + protected String getURL() { + return "http://localhost:" + port + "/foos"; + } + + @Test + public void givenResourceExists_whenRetrievingResource_thenEtagIsAlsoReturned() { + // Given + final String uriOfResource = createAsUri(); + + // When + final Response findOneResponse = RestAssured.given().header("Accept", "application/json").get(uriOfResource); + + // Then + assertEquals(findOneResponse.getStatusCode(), 200); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/IMarshaller.java b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/IMarshaller.java new file mode 100644 index 0000000000..79c0616043 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/IMarshaller.java @@ -0,0 +1,15 @@ +package com.baeldung.mime; + +import java.util.List; + +public interface IMarshaller { + + String encode(final T entity); + + T decode(final String entityAsString, final Class clazz); + + List decodeList(final String entitiesAsString, final Class clazz); + + String getMime(); + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/JacksonMarshaller.java b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/JacksonMarshaller.java new file mode 100644 index 0000000000..9dee0ef2cd --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/JacksonMarshaller.java @@ -0,0 +1,75 @@ +package com.baeldung.mime; + +import java.io.IOException; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; + +import com.baeldung.etag.Foo; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +public final class JacksonMarshaller implements IMarshaller { + private final Logger logger = LoggerFactory.getLogger(JacksonMarshaller.class); + + private final ObjectMapper objectMapper; + + public JacksonMarshaller() { + super(); + + objectMapper = new ObjectMapper(); + } + + // API + + @Override + public final String encode(final T resource) { + String entityAsJSON = null; + try { + entityAsJSON = objectMapper.writeValueAsString(resource); + } catch (final IOException ioEx) { + logger.error("", ioEx); + } + + return entityAsJSON; + } + + @Override + public final T decode(final String resourceAsString, final Class clazz) { + T entity = null; + try { + entity = objectMapper.readValue(resourceAsString, clazz); + } catch (final IOException ioEx) { + logger.error("", ioEx); + } + + return entity; + } + + @SuppressWarnings("unchecked") + @Override + public final List decodeList(final String resourcesAsString, final Class clazz) { + List entities = null; + try { + if (clazz.equals(Foo.class)) { + entities = objectMapper.readValue(resourcesAsString, new TypeReference>() { + // ... + }); + } else { + entities = objectMapper.readValue(resourcesAsString, List.class); + } + } catch (final IOException ioEx) { + logger.error("", ioEx); + } + + return entities; + } + + @Override + public final String getMime() { + return MediaType.APPLICATION_JSON.toString(); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/TestMarshallerFactory.java b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/TestMarshallerFactory.java new file mode 100644 index 0000000000..d7cd875ae4 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/TestMarshallerFactory.java @@ -0,0 +1,48 @@ +package com.baeldung.mime; + +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Component +@Profile("test") +public class TestMarshallerFactory implements FactoryBean { + + @Autowired + private Environment env; + + public TestMarshallerFactory() { + super(); + } + + // API + + @Override + public IMarshaller getObject() { + final String testMime = env.getProperty("test.mime"); + if (testMime != null) { + switch (testMime) { + case "json": + return new JacksonMarshaller(); + case "xml": + return new XStreamMarshaller(); + default: + throw new IllegalStateException(); + } + } + + return new JacksonMarshaller(); + } + + @Override + public Class getObjectType() { + return IMarshaller.class; + } + + @Override + public boolean isSingleton() { + return true; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/XStreamMarshaller.java b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/XStreamMarshaller.java new file mode 100644 index 0000000000..2c67694e83 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/mime/XStreamMarshaller.java @@ -0,0 +1,46 @@ +package com.baeldung.mime; + +import java.util.List; + +import org.springframework.http.MediaType; + +import com.baeldung.etag.Foo; +import com.thoughtworks.xstream.XStream; + +public final class XStreamMarshaller implements IMarshaller { + + private XStream xstream; + + public XStreamMarshaller() { + super(); + + xstream = new XStream(); + xstream.autodetectAnnotations(true); + xstream.processAnnotations(Foo.class); + } + + // API + + @Override + public final String encode(final T resource) { + return xstream.toXML(resource); + } + + @SuppressWarnings("unchecked") + @Override + public final T decode(final String resourceAsString, final Class clazz) { + return (T) xstream.fromXML(resourceAsString); + } + + @SuppressWarnings("unchecked") + @Override + public List decodeList(final String resourcesAsString, final Class clazz) { + return this.decode(resourcesAsString, List.class); + } + + @Override + public final String getMime() { + return MediaType.APPLICATION_XML.toString(); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/students/StudentControllerIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/students/StudentControllerIntegrationTest.java new file mode 100644 index 0000000000..577dbb6eb1 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/test/java/com/baeldung/students/StudentControllerIntegrationTest.java @@ -0,0 +1,73 @@ +package com.baeldung.students; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +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.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class StudentControllerIntegrationTest { + + private static final String STUDENTS_PATH = "/students/"; + + @Autowired + private MockMvc mockMvc; + + @Test + public void whenReadAll_thenStatusIsOk() throws Exception { + this.mockMvc.perform(get(STUDENTS_PATH)) + .andExpect(status().isOk()); + } + + @Test + public void whenReadOne_thenStatusIsOk() throws Exception { + this.mockMvc.perform(get(STUDENTS_PATH + 1)) + .andExpect(status().isOk()); + } + + @Test + public void whenCreate_thenStatusIsCreated() throws Exception { + Student student = new Student(10, "Albert", "Einstein"); + this.mockMvc.perform(post(STUDENTS_PATH).content(asJsonString(student)) + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isCreated()); + } + + @Test + public void whenUpdate_thenStatusIsOk() throws Exception { + Student student = new Student(1, "Nikola", "Tesla"); + this.mockMvc.perform(put(STUDENTS_PATH + 1) + .content(asJsonString(student)) + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + } + + @Test + public void whenDelete_thenStatusIsNoContent() throws Exception { + this.mockMvc.perform(delete(STUDENTS_PATH + 3)) + .andExpect(status().isNoContent()); + } + + private String asJsonString(final Object obj) { + try { + return new ObjectMapper().writeValueAsString(obj); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md index f78c88d30b..861181c53e 100644 --- a/spring-boot-rest/README.md +++ b/spring-boot-rest/README.md @@ -4,12 +4,7 @@ This module contains articles about Spring Boot RESTful APIs. ### Relevant Articles -- [HATEOAS for a Spring REST Service](https://www.baeldung.com/rest-api-discoverability-with-spring) - [Versioning a REST API](https://www.baeldung.com/rest-versioning) -- [ETags for REST with Spring](https://www.baeldung.com/etags-for-rest-with-spring) -- [Testing REST with multiple MIME types](https://www.baeldung.com/testing-rest-api-with-multiple-media-types) -- [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections) -- [Spring Boot Consuming and Producing JSON](https://www.baeldung.com/spring-boot-json) ### E-book @@ -25,6 +20,7 @@ These articles are part of the Spring REST E-book: 8. [An Intro to Spring HATEOAS](https://www.baeldung.com/spring-hateoas-tutorial) 9. [REST Pagination in Spring](https://www.baeldung.com/rest-api-pagination-in-spring) 10. [Test a REST API with Java](https://www.baeldung.com/integration-testing-a-rest-api) +11. [HATEOAS for a Spring REST Service](https://www.baeldung.com/rest-api-discoverability-with-spring) NOTE: Since this is a module tied to an e-book, it should not be moved or used to store the code for any further article. From 8894f16741c383b6995e957dd2be2f33ded6e63a Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sun, 1 Mar 2020 10:58:06 +0100 Subject: [PATCH 104/530] [JAVA-134] Mockito versio update --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a295439951..d320e989f7 100644 --- a/pom.xml +++ b/pom.xml @@ -1330,7 +1330,7 @@ 4.12 2.2 1.3 - 2.21.0 + 3.3.0 1.7.30 From 1c50dedb91031dfcebaaf7d0dcd9440e671b75d5 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Mon, 2 Mar 2020 23:37:40 +0100 Subject: [PATCH 105/530] [JAVA-134] Added byte-buddy dependencies with version used by mockito to avoid versions conflict --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d320e989f7..3e8e5f7ac7 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,12 @@ ${hamcrest-all.version} test + + net.bytebuddy + byte-buddy + ${byte-buddy.version} + test + org.mockito mockito-core @@ -1330,7 +1336,8 @@ 4.12 2.2 1.3 - 3.3.0 + 3.3.0 + 1.10.5 1.7.30 From 08e93e8da504fe7533ebab70b6a5047095c72cfd Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sun, 8 Mar 2020 09:06:30 +0100 Subject: [PATCH 106/530] [JAVA-134] Created a powermockito module that uses version 2.21.0 version of Mockito --- testing-modules/mockito/pom.xml | 13 -------- testing-modules/pom.xml | 1 + testing-modules/powermockito/pom.xml | 33 +++++++++++++++++++ .../CollaboratorForPartialMocking.java | 0 .../CollaboratorWithFinalMethods.java | 0 .../CollaboratorWithStaticMethods.java | 0 .../introduction/LuckyNumberGenerator.java | 0 .../LuckyNumberGeneratorUnitTest.java | 0 .../introduction/PowerMockitoUnitTest.java | 2 +- 9 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 testing-modules/powermockito/pom.xml rename testing-modules/{mockito => powermockito}/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java (100%) rename testing-modules/{mockito => powermockito}/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java (100%) rename testing-modules/{mockito => powermockito}/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java (100%) rename testing-modules/{mockito => powermockito}/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java (100%) rename testing-modules/{mockito => powermockito}/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java (100%) rename testing-modules/{mockito => powermockito}/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java (98%) diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index aae3981c66..ea5ef4c322 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -44,19 +44,6 @@ - - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito2 - ${powermock.version} - test - org.springframework.boot spring-boot-starter diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index f4a8368581..e413e02e48 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -40,6 +40,7 @@ xmlunit-2 junit-4 testing-libraries + powermockito diff --git a/testing-modules/powermockito/pom.xml b/testing-modules/powermockito/pom.xml new file mode 100644 index 0000000000..fde7bfe78c --- /dev/null +++ b/testing-modules/powermockito/pom.xml @@ -0,0 +1,33 @@ + + + + testing-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + powermockito + + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + + + 2.21.0 + 2.0.2 + + \ No newline at end of file diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java b/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java rename to testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java b/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java rename to testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java b/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java rename to testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java b/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java rename to testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java b/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java rename to testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java b/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java rename to testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java index 4943b0486a..1b2bb99896 100644 --- a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java +++ b/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java @@ -68,7 +68,7 @@ public class PowerMockitoUnitTest { when(mock.finalMethod()).thenReturn("I am a final mock method."); returnValue = mock.finalMethod(); - verify(mock,times(3)).finalMethod(); + verify(mock).finalMethod(); assertEquals("I am a final mock method.", returnValue); when(mock, "privateMethod").thenReturn("I am a private mock method."); From 4226bdc983fcdfbd37d8a598369757290d49b58e Mon Sep 17 00:00:00 2001 From: dupirefr Date: Tue, 10 Mar 2020 08:03:40 +0100 Subject: [PATCH 107/530] [JAVA-134] Retrograding Mockito and Byte-Buddy versions for ejb-beans module as they conflict with dependencies of this module --- spring-ejb/ejb-beans/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-ejb/ejb-beans/pom.xml b/spring-ejb/ejb-beans/pom.xml index eecf8c1d23..c9edfc21f8 100644 --- a/spring-ejb/ejb-beans/pom.xml +++ b/spring-ejb/ejb-beans/pom.xml @@ -121,6 +121,8 @@ 5.2.3.RELEASE 5.10.2 5.13.1 + 2.21.0 + 1.8.5 From fb8f9f1f6237388ffc964ba4a5b06c3665d831bd Mon Sep 17 00:00:00 2001 From: dupirefr Date: Tue, 10 Mar 2020 08:09:57 +0100 Subject: [PATCH 108/530] [JAVA-134] Creating README.md in new powermockito module --- testing-modules/mockito/README.md | 2 -- testing-modules/powermockito/README.md | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 testing-modules/powermockito/README.md diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index 7cef9ee8f6..5f307c2f0b 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -8,8 +8,6 @@ - [Mockito When/Then Cookbook](https://www.baeldung.com/mockito-behavior) - [Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks](https://www.baeldung.com/mockito-annotations) - [Mockito’s Mock Methods](https://www.baeldung.com/mockito-mock-methods) -- [Introduction to PowerMock](https://www.baeldung.com/intro-to-powermock) -- [Mocking of Private Methods Using PowerMock](https://www.baeldung.com/powermock-private-method) - [Mocking Exception Throwing using Mockito](https://www.baeldung.com/mockito-exceptions) - [Mocking Void Methods with Mockito](https://www.baeldung.com/mockito-void-methods) - [Mock Final Classes and Methods with Mockito](https://www.baeldung.com/mockito-final) diff --git a/testing-modules/powermockito/README.md b/testing-modules/powermockito/README.md new file mode 100644 index 0000000000..df9fb0088c --- /dev/null +++ b/testing-modules/powermockito/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [Introduction to PowerMock](https://www.baeldung.com/intro-to-powermock) +- [Mocking of Private Methods Using PowerMock](https://www.baeldung.com/powermock-private-method) From a2c7348831e548bd880e32ac4c1824a063409c27 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Wed, 18 Mar 2020 08:17:19 +0100 Subject: [PATCH 109/530] [JAVA-134] Renamed powermockito module to powermock --- testing-modules/{powermockito => powermock}/README.md | 0 testing-modules/{powermockito => powermock}/pom.xml | 0 .../powermockito/introduction/CollaboratorForPartialMocking.java | 0 .../powermockito/introduction/CollaboratorWithFinalMethods.java | 0 .../powermockito/introduction/CollaboratorWithStaticMethods.java | 0 .../baeldung/powermockito/introduction/LuckyNumberGenerator.java | 0 .../powermockito/introduction/LuckyNumberGeneratorUnitTest.java | 0 .../baeldung/powermockito/introduction/PowerMockitoUnitTest.java | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename testing-modules/{powermockito => powermock}/README.md (100%) rename testing-modules/{powermockito => powermock}/pom.xml (100%) rename testing-modules/{powermockito => powermock}/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java (100%) rename testing-modules/{powermockito => powermock}/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java (100%) rename testing-modules/{powermockito => powermock}/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java (100%) rename testing-modules/{powermockito => powermock}/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java (100%) rename testing-modules/{powermockito => powermock}/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java (100%) rename testing-modules/{powermockito => powermock}/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java (100%) diff --git a/testing-modules/powermockito/README.md b/testing-modules/powermock/README.md similarity index 100% rename from testing-modules/powermockito/README.md rename to testing-modules/powermock/README.md diff --git a/testing-modules/powermockito/pom.xml b/testing-modules/powermock/pom.xml similarity index 100% rename from testing-modules/powermockito/pom.xml rename to testing-modules/powermock/pom.xml diff --git a/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java b/testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java similarity index 100% rename from testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java rename to testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java diff --git a/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java b/testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java similarity index 100% rename from testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java rename to testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java diff --git a/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java b/testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java similarity index 100% rename from testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java rename to testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java diff --git a/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java b/testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java similarity index 100% rename from testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java rename to testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java diff --git a/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java b/testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java similarity index 100% rename from testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java rename to testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java diff --git a/testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java b/testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java similarity index 100% rename from testing-modules/powermockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java rename to testing-modules/powermock/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java From 27620bb3e7a9cc885282d53a4baf5c3f398941d8 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 08:05:23 +0100 Subject: [PATCH 110/530] [JAVA-134] Actually renamed that module since IntelliJ didn't do it right the first time --- testing-modules/pom.xml | 2 +- testing-modules/powermock/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index e413e02e48..951909b36f 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -40,7 +40,7 @@ xmlunit-2 junit-4 testing-libraries - powermockito + powermock diff --git a/testing-modules/powermock/pom.xml b/testing-modules/powermock/pom.xml index fde7bfe78c..21b2e98af0 100644 --- a/testing-modules/powermock/pom.xml +++ b/testing-modules/powermock/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - powermockito + powermock From c6bd70983692310fc828db21210ab0d527ef7ea9 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 20:30:57 +0100 Subject: [PATCH 111/530] [JAVA-134] Fixed whitespacing in parent pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 3e8e5f7ac7..443d79a355 100644 --- a/pom.xml +++ b/pom.xml @@ -1336,8 +1336,8 @@ 4.12 2.2 1.3 - 3.3.0 - 1.10.5 + 3.3.0 + 1.10.5 1.7.30 From f3d7a9d5febfe9c5aab4f6e7558ada74bce9a4a3 Mon Sep 17 00:00:00 2001 From: Loredana Date: Thu, 19 Mar 2020 22:38:01 +0200 Subject: [PATCH 112/530] move nullaway article --- libraries-3/README.md | 2 + libraries-3/pom.xml | 56 ++++++++++++++++ .../baeldung/nullaway/NullAwayExample.java | 2 - .../java/com/baeldung/nullaway/Person.java | 65 +++++++++++++++++++ libraries/README.md | 1 - libraries/pom.xml | 57 ---------------- 6 files changed, 123 insertions(+), 60 deletions(-) rename {libraries => libraries-3}/src/main/java/com/baeldung/nullaway/NullAwayExample.java (93%) create mode 100644 libraries-3/src/main/java/com/baeldung/nullaway/Person.java diff --git a/libraries-3/README.md b/libraries-3/README.md index 0a76c7ff6e..f3c3375098 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -14,3 +14,5 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Introduction to cache2k](https://www.baeldung.com/java-cache2k) - [Introduction to the jcabi-aspects AOP Annotations Library](https://www.baeldung.com/java-jcabi-aspects) - [Introduction to Takes](https://www.baeldung.com/java-takes) +- [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway) + diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index 68b5f2aa21..4b9cac8cff 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -94,6 +94,23 @@ velocity-engine-core ${velocity-engine-core.version} + + com.uber.nullaway + nullaway + 0.3.0 + + + org.codehaus.plexus + plexus-compiler-javac-errorprone + 2.8 + + + + com.google.errorprone + error_prone_core + 2.1.3 + @@ -130,6 +147,45 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.5 + + javac-with-errorprone + true + 1.8 + 1.8 + true + + + com.uber.nullaway + nullaway + 0.3.0 + + + + + + -XepExcludedPaths:(.*)/test/.*|(.*)/jcabi/.* + -XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway + + + + + org.codehaus.plexus + plexus-compiler-javac-errorprone + 2.8 + + + + com.google.errorprone + error_prone_core + 2.3.4 + + + diff --git a/libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java b/libraries-3/src/main/java/com/baeldung/nullaway/NullAwayExample.java similarity index 93% rename from libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java rename to libraries-3/src/main/java/com/baeldung/nullaway/NullAwayExample.java index f3db1d2df9..1fab591cb0 100644 --- a/libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java +++ b/libraries-3/src/main/java/com/baeldung/nullaway/NullAwayExample.java @@ -1,7 +1,5 @@ package com.baeldung.nullaway; -import com.baeldung.distinct.Person; - public class NullAwayExample { /* diff --git a/libraries-3/src/main/java/com/baeldung/nullaway/Person.java b/libraries-3/src/main/java/com/baeldung/nullaway/Person.java new file mode 100644 index 0000000000..fcd88036a1 --- /dev/null +++ b/libraries-3/src/main/java/com/baeldung/nullaway/Person.java @@ -0,0 +1,65 @@ +package com.baeldung.nullaway; + +public class Person { + int age; + String name; + String email; + + public Person(int age, String name, String email) { + super(); + this.age = age; + this.name = name; + this.email = email; + } + + public int getAge() { + return age; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Person [age="); + builder.append(age); + builder.append(", name="); + builder.append(name); + builder.append(", email="); + builder.append(email); + builder.append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((email == null) ? 0 : email.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Person other = (Person) obj; + if (email == null) { + if (other.email != null) + return false; + } else if (!email.equals(other.email)) + return false; + return true; + } + +} diff --git a/libraries/README.md b/libraries/README.md index f439033730..79ba8fe55d 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -45,5 +45,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client) - [Introduction to Functional Java](https://www.baeldung.com/java-functional-library) - [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library) -- [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway) - More articles [[next -->]](/libraries-2) diff --git a/libraries/pom.xml b/libraries/pom.xml index af300657b0..41bc2b9311 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -435,23 +435,6 @@ reflections ${reflections.version} - - com.uber.nullaway - nullaway - 0.3.0 - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - 2.8 - - - - com.google.errorprone - error_prone_core - 2.1.3 - @@ -569,46 +552,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - 3.5 - - javac-with-errorprone - true - 1.8 - 1.8 - true - - - com.uber.nullaway - nullaway - 0.3.0 - - - - - - -XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.* - -XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway - - - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - 2.8 - - - - com.google.errorprone - error_prone_core - 2.1.3 - - - - From 989c523308ed06ef3e799285e6d2ddeb08faacec Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Thu, 19 Mar 2020 23:06:52 +0100 Subject: [PATCH 113/530] JAVA-960: Fix conflicts --- .../baeldung/resttemplate/configuration/SpringConfig.java | 4 ---- .../baeldung/resttemplate/lists/service/EmployeeService.java | 2 +- .../baeldung/sampleapp/web/controller/MyFooController.java | 2 +- .../src/test/java/com/baeldung/SpringTestConfig.java | 5 ----- .../EmployeeServiceMockRestServiceServerUnitTest.java | 3 ++- 5 files changed, 4 insertions(+), 12 deletions(-) diff --git a/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/SpringConfig.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/SpringConfig.java index a97ac7d5a5..7866a4abcd 100644 --- a/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/SpringConfig.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/configuration/SpringConfig.java @@ -26,8 +26,4 @@ public class SpringConfig { return new RestTemplateBuilder(customRestTemplateCustomizer()); } - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } } diff --git a/spring-resttemplate/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java index 226134787f..8a1773483a 100644 --- a/spring-resttemplate/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java +++ b/spring-resttemplate/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java @@ -7,7 +7,7 @@ import com.baeldung.resttemplate.lists.dto.Employee; import java.util.ArrayList; import java.util.List; -@Service +@Service("EmployeeListService") public class EmployeeService { public List getAllEmployees() diff --git a/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/controller/MyFooController.java b/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/controller/MyFooController.java index 11ea5b70c9..5c385edb07 100644 --- a/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/controller/MyFooController.java +++ b/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/controller/MyFooController.java @@ -20,7 +20,7 @@ import com.baeldung.sampleapp.web.dto.Foo; import com.baeldung.sampleapp.web.exception.ResourceNotFoundException; @Controller -@RequestMapping(value = "/foos") +@RequestMapping(value = "/foo") public class MyFooController { private final Map myfoos; diff --git a/spring-resttemplate/src/test/java/com/baeldung/SpringTestConfig.java b/spring-resttemplate/src/test/java/com/baeldung/SpringTestConfig.java index 9a32d1ee98..c626d1021d 100644 --- a/spring-resttemplate/src/test/java/com/baeldung/SpringTestConfig.java +++ b/spring-resttemplate/src/test/java/com/baeldung/SpringTestConfig.java @@ -11,9 +11,4 @@ import org.springframework.web.client.RestTemplate; @ComponentScan("com.baeldung") public class SpringTestConfig { - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - } diff --git a/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java b/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java index 9fe1232231..ee01cb6a50 100644 --- a/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java +++ b/spring-resttemplate/src/test/java/com/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java @@ -16,6 +16,7 @@ import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -28,7 +29,7 @@ import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.ObjectMapper; @RunWith(SpringRunner.class) -@ContextConfiguration(classes = SpringTestConfig.class) +@SpringBootTest(classes = SpringTestConfig.class) public class EmployeeServiceMockRestServiceServerUnitTest { private static final Logger logger = LoggerFactory.getLogger(EmployeeServiceMockRestServiceServerUnitTest.class); From f953196ddfeecbe61b285a4f6d702cb86119fcab Mon Sep 17 00:00:00 2001 From: mike b Date: Thu, 19 Mar 2020 20:15:52 -0400 Subject: [PATCH 114/530] [BAEL-3646] Fixing tests per review comments --- .../step/NumberInfoClassifier.java | 3 ++- .../step/NumberInfoClassifierWithDecider.java | 1 - .../DeciderJobIntegrationTest.java | 16 ++++++++-------- .../model/NumberInfoUnitTest.java | 10 +++++----- .../step/NumberInfoClassifierUnitTest.java | 2 +- .../step/NumberInfoGeneratorUnitTest.java | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java index e9bc852d56..fdb28263e7 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifier.java @@ -10,7 +10,8 @@ import org.springframework.batch.item.ItemProcessor; import static org.baeldung.conditionalflow.NumberInfoDecider.NOTIFY; import static org.baeldung.conditionalflow.NumberInfoDecider.QUIET; -public class NumberInfoClassifier extends ItemListenerSupport implements ItemProcessor { +public class NumberInfoClassifier extends ItemListenerSupport + implements ItemProcessor { private StepExecution stepExecution; @BeforeStep diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java index ab6e33aec1..b9d251c02d 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java @@ -13,5 +13,4 @@ public class NumberInfoClassifierWithDecider extends ItemListenerSupport actualStepExecutions = jobExecution.getStepExecutions(); ExitStatus actualJobExitStatus = jobExecution.getExitStatus(); - assertEquals(actualJobExitStatus.getExitCode().toString(), "COMPLETED"); - assertEquals(actualStepExecutions.size(), 2); + assertEquals("COMPLETED", actualJobExitStatus.getExitCode() + .toString()); + assertEquals(2, actualStepExecutions.size()); boolean notifyStepDidRun = false; Iterator iterator = actualStepExecutions.iterator(); - while(iterator.hasNext() && !notifyStepDidRun){ - if(iterator.next().getStepName().equals("Notify step")){ + while (iterator.hasNext() && !notifyStepDidRun) { + if (iterator.next() + .getStepName() + .equals("Notify step")) { notifyStepDidRun = true; } } diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java index 26cd286409..dc396b38da 100644 --- a/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/model/NumberInfoUnitTest.java @@ -12,7 +12,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; class NumberInfoUnitTest { @Test - void whenPositive_isPositive() { + void givenPositive_whenFrom_isPositive() { assertTrue(NumberInfo.from(1) .isPositive()); assertTrue(NumberInfo.from(11) @@ -22,7 +22,7 @@ class NumberInfoUnitTest { } @Test - void whenNegative_isPositive_isFalse() { + void givenNegative_whenFrom_isNegative() { assertFalse(NumberInfo.from(-1) .isPositive()); assertFalse(NumberInfo.from(-10) @@ -30,7 +30,7 @@ class NumberInfoUnitTest { } @Test - void whenEven_isEven() { + void givenEven_whenFrom_isEven() { assertTrue(NumberInfo.from(0) .isEven()); assertTrue(NumberInfo.from(-2) @@ -44,7 +44,7 @@ class NumberInfoUnitTest { } @Test - void whenOdd_isEven_isFalse() { + void givenOdd_whenFrom_isOdd() { assertFalse(NumberInfo.from(1) .isEven()); @@ -62,7 +62,7 @@ class NumberInfoUnitTest { } @Test - void testStatic_fromMethod_equals_getNumber() { + void giveGeneratedInt_whenFrom_isNumberFromGenerator() { for (int i = -100; i < 100; i++) { assertEquals(i, NumberInfo.from(i) .getNumber()); diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java index 9b490799db..cea0626168 100644 --- a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoClassifierUnitTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; class NumberInfoClassifierUnitTest { @Test - void process_convertsToInteger() throws Exception { + void givenNumberInfo_whenProcess_thenConvertsToInteger() throws Exception { NumberInfoClassifier nic = new NumberInfoClassifier(); assertEquals(Integer.valueOf(4), nic.process(NumberInfo.from(4))); assertEquals(Integer.valueOf(-4), nic.process(NumberInfo.from(-4))); diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java index 7794003959..62fe35add6 100644 --- a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; public class NumberInfoGeneratorUnitTest { @Test - public void testGenerateNumbers_correctOrderAndValue() { + public void givenArray_whenGenerator_correctOrderAndValue() { int[] numbers = new int[]{1, -2, 4, -10}; NumberInfoGenerator numberGenerator = new NumberInfoGenerator(numbers); assertEquals(new NumberInfo(numbers[0]), numberGenerator.read()); From 46d2ac9837c75732b5b5d7c1755a403659ea167b Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:06:25 +0100 Subject: [PATCH 115/530] [JAVA-958] Standardize packages in spring-batch module --- spring-batch/repository.sqlite | Bin 49152 -> 73728 bytes .../java/{org => com}/baeldung/batch/App.java | 2 +- .../baeldung/batch/SpringBatchConfig.java | 16 ++++++++-------- .../batch/SpringBatchRetryConfig.java | 8 ++++---- .../baeldung/batch/SpringConfig.java | 2 +- .../baeldung/batch/model/Transaction.java | 4 ++-- .../CustomMultiResourcePartitioner.java | 2 +- .../SpringbatchPartitionConfig.java | 6 +++--- .../SpringbatchPartitionerApp.java | 2 +- .../batch/service/CustomItemProcessor.java | 4 ++-- .../batch/service/CustomSkipPolicy.java | 2 +- .../service/MissingUsernameException.java | 2 +- .../service/NegativeAmountException.java | 2 +- .../batch/service/RecordFieldSetMapper.java | 4 ++-- .../batch/service/RetryItemProcessor.java | 4 ++-- .../batch/service/SkippingItemProcessor.java | 4 ++-- .../service/adapter/LocalDateTimeAdapter.java | 2 +- .../batchscheduler/SpringBatchScheduler.java | 4 ++-- .../baeldung/batchscheduler/model/Book.java | 2 +- .../batchtesting/SpringBatchApplication.java | 2 +- .../SpringBatchConfiguration.java | 14 +++++++------- .../baeldung/batchtesting/model/Book.java | 2 +- .../batchtesting/model/BookDetails.java | 2 +- .../batchtesting/model/BookRecord.java | 2 +- .../service/BookDetailsItemProcessor.java | 6 +++--- .../service/BookItemProcessor.java | 6 +++--- .../service/BookRecordFieldSetMapper.java | 4 ++-- .../chunks/LineProcessor.java | 4 ++-- .../taskletsvschunks/chunks/LineReader.java | 6 +++--- .../taskletsvschunks/chunks/LinesWriter.java | 6 +++--- .../taskletsvschunks/config/ChunksConfig.java | 10 +++++----- .../config/TaskletsConfig.java | 8 ++++---- .../baeldung/taskletsvschunks/model/Line.java | 2 +- .../tasklets/LinesProcessor.java | 4 ++-- .../tasklets/LinesReader.java | 6 +++--- .../tasklets/LinesWriter.java | 6 +++--- .../taskletsvschunks/utils/FileUtils.java | 4 ++-- spring-batch/src/main/resources/logback.xml | 6 +++--- .../src/main/resources/spring-batch-intro.xml | 6 +++--- .../baeldung/SpringContextTest.java | 4 ++-- .../SpringBatchRetryIntegrationTest.java | 3 ++- .../SpringBatchSchedulerIntegrationTest.java | 3 ++- .../SpringBatchIntegrationTest.java | 3 ++- .../SpringBatchStepScopeIntegrationTest.java | 7 ++++--- .../chunks/ChunksIntegrationTest.java | 4 ++-- .../tasklets/TaskletsIntegrationTest.java | 4 ++-- spring-batch/xml/retryOutput.xml | 2 +- 47 files changed, 106 insertions(+), 102 deletions(-) rename spring-batch/src/main/java/{org => com}/baeldung/batch/App.java (98%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/SpringBatchConfig.java (92%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/SpringBatchRetryConfig.java (95%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/SpringConfig.java (99%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/model/Transaction.java (94%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/partitioner/CustomMultiResourcePartitioner.java (98%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/partitioner/SpringbatchPartitionConfig.java (98%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/partitioner/SpringbatchPartitionerApp.java (96%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/CustomItemProcessor.java (76%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/CustomSkipPolicy.java (96%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/MissingUsernameException.java (65%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/NegativeAmountException.java (87%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/RecordFieldSetMapper.java (93%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/RetryItemProcessor.java (95%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/SkippingItemProcessor.java (88%) rename spring-batch/src/main/java/{org => com}/baeldung/batch/service/adapter/LocalDateTimeAdapter.java (93%) rename spring-batch/src/main/java/{org => com}/baeldung/batchscheduler/SpringBatchScheduler.java (98%) rename spring-batch/src/main/java/{org => com}/baeldung/batchscheduler/model/Book.java (92%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/SpringBatchApplication.java (97%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/SpringBatchConfiguration.java (92%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/model/Book.java (92%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/model/BookDetails.java (96%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/model/BookRecord.java (96%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/service/BookDetailsItemProcessor.java (83%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/service/BookItemProcessor.java (79%) rename spring-batch/src/main/java/{org => com}/baeldung/batchtesting/service/BookRecordFieldSetMapper.java (89%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/chunks/LineProcessor.java (92%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/chunks/LineReader.java (87%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/chunks/LinesWriter.java (87%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/config/ChunksConfig.java (91%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/config/TaskletsConfig.java (92%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/model/Line.java (96%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/tasklets/LinesProcessor.java (94%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/tasklets/LinesReader.java (91%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/tasklets/LinesWriter.java (91%) rename spring-batch/src/main/java/{org => com}/baeldung/taskletsvschunks/utils/FileUtils.java (96%) rename spring-batch/src/test/java/{org => com}/baeldung/SpringContextTest.java (73%) rename spring-batch/src/test/java/{org => com}/baeldung/batch/SpringBatchRetryIntegrationTest.java (98%) rename spring-batch/src/test/java/{org => com}/baeldung/batchscheduler/SpringBatchSchedulerIntegrationTest.java (96%) rename spring-batch/src/test/java/{org => com}/baeldung/batchtesting/SpringBatchIntegrationTest.java (98%) rename spring-batch/src/test/java/{org => com}/baeldung/batchtesting/SpringBatchStepScopeIntegrationTest.java (95%) rename spring-batch/src/test/java/{org => com}/baeldung/taskletsvschunks/chunks/ChunksIntegrationTest.java (89%) rename spring-batch/src/test/java/{org => com}/baeldung/taskletsvschunks/tasklets/TaskletsIntegrationTest.java (89%) diff --git a/spring-batch/repository.sqlite b/spring-batch/repository.sqlite index 4456ef63cc28948e07a545a72ec1b63366e9057b..2b549352ec8073708bd085fd414ed93d189c7511 100644 GIT binary patch literal 73728 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ĤRn?9`ddaq2=C}@EY@dj8EjZUg z#15SS@u>=~=>S*zvsWlRuDKRAs=Jfq7dU<%27cGBEyB2u8ou9U&!5rfFW$`*c8fWx z_IJK8^Y@tke`bc8nF;^b>!reSG`_0>@LGQ$YrTkZ!?J;}4H*Vs<(mFFq$2B{E`u{;We3W(`_5W;E z;-+e9M_!q^r#JDjVv|0y)YEHBGO0Co?gM4g$tUl8M#?CY!U7wY=?2_ zxHcWvruQ~<^d}iFj!eonR=k1we}jmW!Ufj<|J+*t{|7Go2iNEkzajx7fCP}h6HMTp zU? zZ3}iiunY<&05`uyNgMef|FvJk-UkAps+GLQ`M>>tD?7g6 delta 609 zcmZoTz|zpbJV9DepMima2Z&)ndZLaoqyEMOJ!VFZ$%d@ro0l=)U}EG1GKD8^VBz1q zkS&>$jgkKh1OJ)Lf)ft$+Zi#kGH|H-rezitmpCPsBxiW#C#9GerdTAWSX!hR7$g}P zn50@-7#LVuTBIhYS(q4^r*Z*pW8^=_z<&;C#u0uuLl$*kPLfRE1)9LdpUc4ij{iFU zZvMsmZTz{L1p^}aS;g6yO*toDU>9MPW@WYovnDsNu&|1;FdK7De#k7$D#grf4PuEK zi!w1AaymJNID5o<`8&mX`UQtL`Z>D_Ffywn2?x6df~;fYKhD5^9O&S^{PyOIJPeGS ztgNi^^1Q4JOpK}fZ}0dCB6muF$BNGEyJKqTgz7s&neNf2*bsSI!{b1n#0dZphyAT^A3xgm-buGe5 Ts1!HCD4;X=|G { diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/CustomSkipPolicy.java b/spring-batch/src/main/java/com/baeldung/batch/service/CustomSkipPolicy.java similarity index 96% rename from spring-batch/src/main/java/org/baeldung/batch/service/CustomSkipPolicy.java rename to spring-batch/src/main/java/com/baeldung/batch/service/CustomSkipPolicy.java index a156a65b6e..25401de022 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/service/CustomSkipPolicy.java +++ b/spring-batch/src/main/java/com/baeldung/batch/service/CustomSkipPolicy.java @@ -1,4 +1,4 @@ -package org.baeldung.batch.service; +package com.baeldung.batch.service; import org.springframework.batch.core.step.skip.SkipLimitExceededException; import org.springframework.batch.core.step.skip.SkipPolicy; diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/MissingUsernameException.java b/spring-batch/src/main/java/com/baeldung/batch/service/MissingUsernameException.java similarity index 65% rename from spring-batch/src/main/java/org/baeldung/batch/service/MissingUsernameException.java rename to spring-batch/src/main/java/com/baeldung/batch/service/MissingUsernameException.java index 2cf8f4d334..b12daa17cc 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/service/MissingUsernameException.java +++ b/spring-batch/src/main/java/com/baeldung/batch/service/MissingUsernameException.java @@ -1,4 +1,4 @@ -package org.baeldung.batch.service; +package com.baeldung.batch.service; public class MissingUsernameException extends RuntimeException { } diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/NegativeAmountException.java b/spring-batch/src/main/java/com/baeldung/batch/service/NegativeAmountException.java similarity index 87% rename from spring-batch/src/main/java/org/baeldung/batch/service/NegativeAmountException.java rename to spring-batch/src/main/java/com/baeldung/batch/service/NegativeAmountException.java index c9c05be671..ee46574f87 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/service/NegativeAmountException.java +++ b/spring-batch/src/main/java/com/baeldung/batch/service/NegativeAmountException.java @@ -1,4 +1,4 @@ -package org.baeldung.batch.service; +package com.baeldung.batch.service; public class NegativeAmountException extends RuntimeException { diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java b/spring-batch/src/main/java/com/baeldung/batch/service/RecordFieldSetMapper.java similarity index 93% rename from spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java rename to spring-batch/src/main/java/com/baeldung/batch/service/RecordFieldSetMapper.java index e61c54193a..09478e9a30 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java +++ b/spring-batch/src/main/java/com/baeldung/batch/service/RecordFieldSetMapper.java @@ -1,6 +1,6 @@ -package org.baeldung.batch.service; +package com.baeldung.batch.service; -import org.baeldung.batch.model.Transaction; +import com.baeldung.batch.model.Transaction; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.FieldSet; import org.springframework.validation.BindException; diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/RetryItemProcessor.java b/spring-batch/src/main/java/com/baeldung/batch/service/RetryItemProcessor.java similarity index 95% rename from spring-batch/src/main/java/org/baeldung/batch/service/RetryItemProcessor.java rename to spring-batch/src/main/java/com/baeldung/batch/service/RetryItemProcessor.java index d4e82452a7..c380e2c0ab 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/service/RetryItemProcessor.java +++ b/spring-batch/src/main/java/com/baeldung/batch/service/RetryItemProcessor.java @@ -1,10 +1,10 @@ -package org.baeldung.batch.service; +package com.baeldung.batch.service; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.util.EntityUtils; -import org.baeldung.batch.model.Transaction; +import com.baeldung.batch.model.Transaction; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.slf4j.Logger; diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/SkippingItemProcessor.java b/spring-batch/src/main/java/com/baeldung/batch/service/SkippingItemProcessor.java similarity index 88% rename from spring-batch/src/main/java/org/baeldung/batch/service/SkippingItemProcessor.java rename to spring-batch/src/main/java/com/baeldung/batch/service/SkippingItemProcessor.java index 307a8213e2..ee37eb6c1b 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/service/SkippingItemProcessor.java +++ b/spring-batch/src/main/java/com/baeldung/batch/service/SkippingItemProcessor.java @@ -1,6 +1,6 @@ -package org.baeldung.batch.service; +package com.baeldung.batch.service; -import org.baeldung.batch.model.Transaction; +import com.baeldung.batch.model.Transaction; import org.springframework.batch.item.ItemProcessor; public class SkippingItemProcessor implements ItemProcessor { diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/adapter/LocalDateTimeAdapter.java b/spring-batch/src/main/java/com/baeldung/batch/service/adapter/LocalDateTimeAdapter.java similarity index 93% rename from spring-batch/src/main/java/org/baeldung/batch/service/adapter/LocalDateTimeAdapter.java rename to spring-batch/src/main/java/com/baeldung/batch/service/adapter/LocalDateTimeAdapter.java index 45c35b87f1..561a7335b3 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/service/adapter/LocalDateTimeAdapter.java +++ b/spring-batch/src/main/java/com/baeldung/batch/service/adapter/LocalDateTimeAdapter.java @@ -1,4 +1,4 @@ -package org.baeldung.batch.service.adapter; +package com.baeldung.batch.service.adapter; import javax.xml.bind.annotation.adapters.XmlAdapter; import java.time.LocalDateTime; diff --git a/spring-batch/src/main/java/org/baeldung/batchscheduler/SpringBatchScheduler.java b/spring-batch/src/main/java/com/baeldung/batchscheduler/SpringBatchScheduler.java similarity index 98% rename from spring-batch/src/main/java/org/baeldung/batchscheduler/SpringBatchScheduler.java rename to spring-batch/src/main/java/com/baeldung/batchscheduler/SpringBatchScheduler.java index 1beeb6b2bf..4de3e0a4b6 100644 --- a/spring-batch/src/main/java/org/baeldung/batchscheduler/SpringBatchScheduler.java +++ b/spring-batch/src/main/java/com/baeldung/batchscheduler/SpringBatchScheduler.java @@ -1,4 +1,4 @@ -package org.baeldung.batchscheduler; +package com.baeldung.batchscheduler; import java.util.Date; import java.util.IdentityHashMap; @@ -7,7 +7,7 @@ import java.util.Map; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import org.baeldung.batchscheduler.model.Book; +import com.baeldung.batchscheduler.model.Book; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.Job; diff --git a/spring-batch/src/main/java/org/baeldung/batchscheduler/model/Book.java b/spring-batch/src/main/java/com/baeldung/batchscheduler/model/Book.java similarity index 92% rename from spring-batch/src/main/java/org/baeldung/batchscheduler/model/Book.java rename to spring-batch/src/main/java/com/baeldung/batchscheduler/model/Book.java index f992bde20e..8ee986c729 100644 --- a/spring-batch/src/main/java/org/baeldung/batchscheduler/model/Book.java +++ b/spring-batch/src/main/java/com/baeldung/batchscheduler/model/Book.java @@ -1,4 +1,4 @@ -package org.baeldung.batchscheduler.model; +package com.baeldung.batchscheduler.model; public class Book { private int id; diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/SpringBatchApplication.java b/spring-batch/src/main/java/com/baeldung/batchtesting/SpringBatchApplication.java similarity index 97% rename from spring-batch/src/main/java/org/baeldung/batchtesting/SpringBatchApplication.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/SpringBatchApplication.java index 39bfdfbee7..04185fb1ca 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/SpringBatchApplication.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/SpringBatchApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.batchtesting; +package com.baeldung.batchtesting; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParametersBuilder; diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/SpringBatchConfiguration.java b/spring-batch/src/main/java/com/baeldung/batchtesting/SpringBatchConfiguration.java similarity index 92% rename from spring-batch/src/main/java/org/baeldung/batchtesting/SpringBatchConfiguration.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/SpringBatchConfiguration.java index 2d891ad7da..664db3fbba 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/SpringBatchConfiguration.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/SpringBatchConfiguration.java @@ -1,13 +1,13 @@ -package org.baeldung.batchtesting; +package com.baeldung.batchtesting; import java.io.IOException; -import org.baeldung.batchtesting.model.Book; -import org.baeldung.batchtesting.model.BookDetails; -import org.baeldung.batchtesting.model.BookRecord; -import org.baeldung.batchtesting.service.BookDetailsItemProcessor; -import org.baeldung.batchtesting.service.BookItemProcessor; -import org.baeldung.batchtesting.service.BookRecordFieldSetMapper; +import com.baeldung.batchtesting.model.Book; +import com.baeldung.batchtesting.model.BookDetails; +import com.baeldung.batchtesting.model.BookRecord; +import com.baeldung.batchtesting.service.BookDetailsItemProcessor; +import com.baeldung.batchtesting.service.BookItemProcessor; +import com.baeldung.batchtesting.service.BookRecordFieldSetMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.Job; diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/model/Book.java b/spring-batch/src/main/java/com/baeldung/batchtesting/model/Book.java similarity index 92% rename from spring-batch/src/main/java/org/baeldung/batchtesting/model/Book.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/model/Book.java index 3ea4a29e7f..f34e6cb5f6 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/model/Book.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/model/Book.java @@ -1,4 +1,4 @@ -package org.baeldung.batchtesting.model; +package com.baeldung.batchtesting.model; public class Book { diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/model/BookDetails.java b/spring-batch/src/main/java/com/baeldung/batchtesting/model/BookDetails.java similarity index 96% rename from spring-batch/src/main/java/org/baeldung/batchtesting/model/BookDetails.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/model/BookDetails.java index d9284fbc66..3e994d2c92 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/model/BookDetails.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/model/BookDetails.java @@ -1,4 +1,4 @@ -package org.baeldung.batchtesting.model; +package com.baeldung.batchtesting.model; public class BookDetails { diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/model/BookRecord.java b/spring-batch/src/main/java/com/baeldung/batchtesting/model/BookRecord.java similarity index 96% rename from spring-batch/src/main/java/org/baeldung/batchtesting/model/BookRecord.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/model/BookRecord.java index 35fb40e878..d6a1692577 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/model/BookRecord.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/model/BookRecord.java @@ -1,4 +1,4 @@ -package org.baeldung.batchtesting.model; +package com.baeldung.batchtesting.model; public class BookRecord { diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/service/BookDetailsItemProcessor.java b/spring-batch/src/main/java/com/baeldung/batchtesting/service/BookDetailsItemProcessor.java similarity index 83% rename from spring-batch/src/main/java/org/baeldung/batchtesting/service/BookDetailsItemProcessor.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/service/BookDetailsItemProcessor.java index f3800fee51..514a383108 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/service/BookDetailsItemProcessor.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/service/BookDetailsItemProcessor.java @@ -1,7 +1,7 @@ -package org.baeldung.batchtesting.service; +package com.baeldung.batchtesting.service; -import org.baeldung.batchtesting.model.BookDetails; -import org.baeldung.batchtesting.model.BookRecord; +import com.baeldung.batchtesting.model.BookDetails; +import com.baeldung.batchtesting.model.BookRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.item.ItemProcessor; diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/service/BookItemProcessor.java b/spring-batch/src/main/java/com/baeldung/batchtesting/service/BookItemProcessor.java similarity index 79% rename from spring-batch/src/main/java/org/baeldung/batchtesting/service/BookItemProcessor.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/service/BookItemProcessor.java index 69e72ba1d3..84e850fe71 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/service/BookItemProcessor.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/service/BookItemProcessor.java @@ -1,7 +1,7 @@ -package org.baeldung.batchtesting.service; +package com.baeldung.batchtesting.service; -import org.baeldung.batchtesting.model.Book; -import org.baeldung.batchtesting.model.BookRecord; +import com.baeldung.batchtesting.model.Book; +import com.baeldung.batchtesting.model.BookRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.item.ItemProcessor; diff --git a/spring-batch/src/main/java/org/baeldung/batchtesting/service/BookRecordFieldSetMapper.java b/spring-batch/src/main/java/com/baeldung/batchtesting/service/BookRecordFieldSetMapper.java similarity index 89% rename from spring-batch/src/main/java/org/baeldung/batchtesting/service/BookRecordFieldSetMapper.java rename to spring-batch/src/main/java/com/baeldung/batchtesting/service/BookRecordFieldSetMapper.java index cfc36fed7a..d9e8ee1158 100644 --- a/spring-batch/src/main/java/org/baeldung/batchtesting/service/BookRecordFieldSetMapper.java +++ b/spring-batch/src/main/java/com/baeldung/batchtesting/service/BookRecordFieldSetMapper.java @@ -1,6 +1,6 @@ -package org.baeldung.batchtesting.service; +package com.baeldung.batchtesting.service; -import org.baeldung.batchtesting.model.BookRecord; +import com.baeldung.batchtesting.model.BookRecord; import org.springframework.batch.item.file.mapping.FieldSetMapper; import org.springframework.batch.item.file.transform.FieldSet; import org.springframework.validation.BindException; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineProcessor.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LineProcessor.java similarity index 92% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineProcessor.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LineProcessor.java index 5b6cd9add3..87d0bdc3fb 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineProcessor.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LineProcessor.java @@ -1,6 +1,6 @@ -package org.baeldung.taskletsvschunks.chunks; +package com.baeldung.taskletsvschunks.chunks; -import org.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.model.Line; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.ExitStatus; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineReader.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LineReader.java similarity index 87% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineReader.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LineReader.java index 5f6b6de218..6ffa730c19 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineReader.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LineReader.java @@ -1,7 +1,7 @@ -package org.baeldung.taskletsvschunks.chunks; +package com.baeldung.taskletsvschunks.chunks; -import org.baeldung.taskletsvschunks.model.Line; -import org.baeldung.taskletsvschunks.utils.FileUtils; +import com.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.utils.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.ExitStatus; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LinesWriter.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LinesWriter.java similarity index 87% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LinesWriter.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LinesWriter.java index 66f9103a56..9f292b24b9 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LinesWriter.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/chunks/LinesWriter.java @@ -1,7 +1,7 @@ -package org.baeldung.taskletsvschunks.chunks; +package com.baeldung.taskletsvschunks.chunks; -import org.baeldung.taskletsvschunks.model.Line; -import org.baeldung.taskletsvschunks.utils.FileUtils; +import com.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.utils.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.ExitStatus; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/ChunksConfig.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/config/ChunksConfig.java similarity index 91% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/ChunksConfig.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/config/ChunksConfig.java index 601ffb7f27..57288fb312 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/ChunksConfig.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/config/ChunksConfig.java @@ -1,9 +1,9 @@ -package org.baeldung.taskletsvschunks.config; +package com.baeldung.taskletsvschunks.config; -import org.baeldung.taskletsvschunks.chunks.LineProcessor; -import org.baeldung.taskletsvschunks.chunks.LineReader; -import org.baeldung.taskletsvschunks.chunks.LinesWriter; -import org.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.chunks.LineProcessor; +import com.baeldung.taskletsvschunks.chunks.LineReader; +import com.baeldung.taskletsvschunks.chunks.LinesWriter; +import com.baeldung.taskletsvschunks.model.Line; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/TaskletsConfig.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/config/TaskletsConfig.java similarity index 92% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/TaskletsConfig.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/config/TaskletsConfig.java index b9d06d2639..e7157ac520 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/TaskletsConfig.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/config/TaskletsConfig.java @@ -1,8 +1,8 @@ -package org.baeldung.taskletsvschunks.config; +package com.baeldung.taskletsvschunks.config; -import org.baeldung.taskletsvschunks.tasklets.LinesProcessor; -import org.baeldung.taskletsvschunks.tasklets.LinesReader; -import org.baeldung.taskletsvschunks.tasklets.LinesWriter; +import com.baeldung.taskletsvschunks.tasklets.LinesProcessor; +import com.baeldung.taskletsvschunks.tasklets.LinesReader; +import com.baeldung.taskletsvschunks.tasklets.LinesWriter; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/model/Line.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/model/Line.java similarity index 96% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/model/Line.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/model/Line.java index fee6fd31a6..2d7d3ff63f 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/model/Line.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/model/Line.java @@ -1,4 +1,4 @@ -package org.baeldung.taskletsvschunks.model; +package com.baeldung.taskletsvschunks.model; import java.io.Serializable; import java.time.LocalDate; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesProcessor.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesProcessor.java similarity index 94% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesProcessor.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesProcessor.java index ba7a3088d5..8b84c39174 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesProcessor.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesProcessor.java @@ -1,6 +1,6 @@ -package org.baeldung.taskletsvschunks.tasklets; +package com.baeldung.taskletsvschunks.tasklets; -import org.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.model.Line; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.ExitStatus; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesReader.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesReader.java similarity index 91% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesReader.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesReader.java index 9905ee8f8a..b1f58be4a4 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesReader.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesReader.java @@ -1,7 +1,7 @@ -package org.baeldung.taskletsvschunks.tasklets; +package com.baeldung.taskletsvschunks.tasklets; -import org.baeldung.taskletsvschunks.model.Line; -import org.baeldung.taskletsvschunks.utils.FileUtils; +import com.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.utils.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.ExitStatus; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesWriter.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesWriter.java similarity index 91% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesWriter.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesWriter.java index 937288a890..76128b7841 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesWriter.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/tasklets/LinesWriter.java @@ -1,7 +1,7 @@ -package org.baeldung.taskletsvschunks.tasklets; +package com.baeldung.taskletsvschunks.tasklets; -import org.baeldung.taskletsvschunks.model.Line; -import org.baeldung.taskletsvschunks.utils.FileUtils; +import com.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.utils.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.ExitStatus; diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/utils/FileUtils.java b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/utils/FileUtils.java similarity index 96% rename from spring-batch/src/main/java/org/baeldung/taskletsvschunks/utils/FileUtils.java rename to spring-batch/src/main/java/com/baeldung/taskletsvschunks/utils/FileUtils.java index df36d5c756..fde3b1fa9d 100644 --- a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/utils/FileUtils.java +++ b/spring-batch/src/main/java/com/baeldung/taskletsvschunks/utils/FileUtils.java @@ -1,8 +1,8 @@ -package org.baeldung.taskletsvschunks.utils; +package com.baeldung.taskletsvschunks.utils; import com.opencsv.CSVReader; import com.opencsv.CSVWriter; -import org.baeldung.taskletsvschunks.model.Line; +import com.baeldung.taskletsvschunks.model.Line; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-batch/src/main/resources/logback.xml b/spring-batch/src/main/resources/logback.xml index 9a622ceb65..55bbeba870 100644 --- a/spring-batch/src/main/resources/logback.xml +++ b/spring-batch/src/main/resources/logback.xml @@ -8,15 +8,15 @@ - + - + - + diff --git a/spring-batch/src/main/resources/spring-batch-intro.xml b/spring-batch/src/main/resources/spring-batch-intro.xml index 908b8aa2e1..2a7c1e7c4a 100644 --- a/spring-batch/src/main/resources/spring-batch-intro.xml +++ b/spring-batch/src/main/resources/spring-batch-intro.xml @@ -22,14 +22,14 @@ + class="com.baeldung.batch.service.RecordFieldSetMapper" /> - + @@ -40,7 +40,7 @@ - org.baeldung.batch.model.Transaction + com.baeldung.batch.model.Transaction diff --git a/spring-batch/src/test/java/org/baeldung/SpringContextTest.java b/spring-batch/src/test/java/com/baeldung/SpringContextTest.java similarity index 73% rename from spring-batch/src/test/java/org/baeldung/SpringContextTest.java rename to spring-batch/src/test/java/com/baeldung/SpringContextTest.java index 1a4f923a1e..b82bb35daf 100644 --- a/spring-batch/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-batch/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.batch.App; +import com.baeldung.batch.App; import org.junit.Test; public class SpringContextTest { diff --git a/spring-batch/src/test/java/org/baeldung/batch/SpringBatchRetryIntegrationTest.java b/spring-batch/src/test/java/com/baeldung/batch/SpringBatchRetryIntegrationTest.java similarity index 98% rename from spring-batch/src/test/java/org/baeldung/batch/SpringBatchRetryIntegrationTest.java rename to spring-batch/src/test/java/com/baeldung/batch/SpringBatchRetryIntegrationTest.java index 293c97ac5d..df9154a765 100644 --- a/spring-batch/src/test/java/org/baeldung/batch/SpringBatchRetryIntegrationTest.java +++ b/spring-batch/src/test/java/com/baeldung/batch/SpringBatchRetryIntegrationTest.java @@ -1,5 +1,6 @@ -package org.baeldung.batch; +package com.baeldung.batch; +import com.baeldung.batch.SpringBatchRetryConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.entity.StringEntity; diff --git a/spring-batch/src/test/java/org/baeldung/batchscheduler/SpringBatchSchedulerIntegrationTest.java b/spring-batch/src/test/java/com/baeldung/batchscheduler/SpringBatchSchedulerIntegrationTest.java similarity index 96% rename from spring-batch/src/test/java/org/baeldung/batchscheduler/SpringBatchSchedulerIntegrationTest.java rename to spring-batch/src/test/java/com/baeldung/batchscheduler/SpringBatchSchedulerIntegrationTest.java index 8927421ac5..81877fbc39 100644 --- a/spring-batch/src/test/java/org/baeldung/batchscheduler/SpringBatchSchedulerIntegrationTest.java +++ b/spring-batch/src/test/java/com/baeldung/batchscheduler/SpringBatchSchedulerIntegrationTest.java @@ -1,5 +1,6 @@ -package org.baeldung.batchscheduler; +package com.baeldung.batchscheduler; +import com.baeldung.batchscheduler.SpringBatchScheduler; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-batch/src/test/java/org/baeldung/batchtesting/SpringBatchIntegrationTest.java b/spring-batch/src/test/java/com/baeldung/batchtesting/SpringBatchIntegrationTest.java similarity index 98% rename from spring-batch/src/test/java/org/baeldung/batchtesting/SpringBatchIntegrationTest.java rename to spring-batch/src/test/java/com/baeldung/batchtesting/SpringBatchIntegrationTest.java index d66da89ba4..333c69684e 100644 --- a/spring-batch/src/test/java/org/baeldung/batchtesting/SpringBatchIntegrationTest.java +++ b/spring-batch/src/test/java/com/baeldung/batchtesting/SpringBatchIntegrationTest.java @@ -1,10 +1,11 @@ -package org.baeldung.batchtesting; +package com.baeldung.batchtesting; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.util.Collection; +import com.baeldung.batchtesting.SpringBatchConfiguration; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-batch/src/test/java/org/baeldung/batchtesting/SpringBatchStepScopeIntegrationTest.java b/spring-batch/src/test/java/com/baeldung/batchtesting/SpringBatchStepScopeIntegrationTest.java similarity index 95% rename from spring-batch/src/test/java/org/baeldung/batchtesting/SpringBatchStepScopeIntegrationTest.java rename to spring-batch/src/test/java/com/baeldung/batchtesting/SpringBatchStepScopeIntegrationTest.java index f7b888f0f9..4655117b85 100644 --- a/spring-batch/src/test/java/org/baeldung/batchtesting/SpringBatchStepScopeIntegrationTest.java +++ b/spring-batch/src/test/java/com/baeldung/batchtesting/SpringBatchStepScopeIntegrationTest.java @@ -1,12 +1,13 @@ -package org.baeldung.batchtesting; +package com.baeldung.batchtesting; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.util.Arrays; -import org.baeldung.batchtesting.model.Book; -import org.baeldung.batchtesting.model.BookRecord; +import com.baeldung.batchtesting.SpringBatchConfiguration; +import com.baeldung.batchtesting.model.Book; +import com.baeldung.batchtesting.model.BookRecord; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-batch/src/test/java/org/baeldung/taskletsvschunks/chunks/ChunksIntegrationTest.java b/spring-batch/src/test/java/com/baeldung/taskletsvschunks/chunks/ChunksIntegrationTest.java similarity index 89% rename from spring-batch/src/test/java/org/baeldung/taskletsvschunks/chunks/ChunksIntegrationTest.java rename to spring-batch/src/test/java/com/baeldung/taskletsvschunks/chunks/ChunksIntegrationTest.java index eaf73e4a4a..1132e4d5e2 100644 --- a/spring-batch/src/test/java/org/baeldung/taskletsvschunks/chunks/ChunksIntegrationTest.java +++ b/spring-batch/src/test/java/com/baeldung/taskletsvschunks/chunks/ChunksIntegrationTest.java @@ -1,6 +1,6 @@ -package org.baeldung.taskletsvschunks.chunks; +package com.baeldung.taskletsvschunks.chunks; -import org.baeldung.taskletsvschunks.config.ChunksConfig; +import com.baeldung.taskletsvschunks.config.ChunksConfig; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-batch/src/test/java/org/baeldung/taskletsvschunks/tasklets/TaskletsIntegrationTest.java b/spring-batch/src/test/java/com/baeldung/taskletsvschunks/tasklets/TaskletsIntegrationTest.java similarity index 89% rename from spring-batch/src/test/java/org/baeldung/taskletsvschunks/tasklets/TaskletsIntegrationTest.java rename to spring-batch/src/test/java/com/baeldung/taskletsvschunks/tasklets/TaskletsIntegrationTest.java index 322b17bd55..2e1ad031aa 100644 --- a/spring-batch/src/test/java/org/baeldung/taskletsvschunks/tasklets/TaskletsIntegrationTest.java +++ b/spring-batch/src/test/java/com/baeldung/taskletsvschunks/tasklets/TaskletsIntegrationTest.java @@ -1,6 +1,6 @@ -package org.baeldung.taskletsvschunks.tasklets; +package com.baeldung.taskletsvschunks.tasklets; -import org.baeldung.taskletsvschunks.config.TaskletsConfig; +import com.baeldung.taskletsvschunks.config.TaskletsConfig; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-batch/xml/retryOutput.xml b/spring-batch/xml/retryOutput.xml index d30f2c4a32..c5dec44f16 100644 --- a/spring-batch/xml/retryOutput.xml +++ b/spring-batch/xml/retryOutput.xml @@ -1 +1 @@ -1010000.04302222015-10-31 00:00:001234sammy1012321.04302222015-12-03 00:00:009999john \ No newline at end of file + \ No newline at end of file From 8ecb1072a6b2fd34eabd0c4ebf5c6647f20dbccf Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:09:11 +0100 Subject: [PATCH 116/530] [JAVA-958] Standardize packages in spring-5 module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-5/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-5/src/test/java/org/baeldung/SpringContextTest.java b/spring-5/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-5/src/test/java/org/baeldung/SpringContextTest.java rename to spring-5/src/test/java/com/baeldung/SpringContextTest.java index 56e8697f5c..e3f67def90 100644 --- a/spring-5/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-5/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 18c557679c3beb832dbde30a8c51f5f6823cf6fa Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:16:56 +0100 Subject: [PATCH 117/530] [JAVA-958] Standardize packages in spring-5-data-reactive module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-5-data-reactive/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-5-data-reactive/src/test/java/org/baeldung/SpringContextTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-5-data-reactive/src/test/java/org/baeldung/SpringContextTest.java rename to spring-5-data-reactive/src/test/java/com/baeldung/SpringContextTest.java index c3ea1d8435..bedb30fcaa 100644 --- a/spring-5-data-reactive/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-5-data-reactive/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 6bc9e485303dea3edb9e79678222aa74887e7ca5 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:18:56 +0100 Subject: [PATCH 118/530] [JAVA-958] Standardize packages in spring-5-reactive module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-5-reactive/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-5-reactive/src/test/java/org/baeldung/SpringContextTest.java b/spring-5-reactive/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-5-reactive/src/test/java/org/baeldung/SpringContextTest.java rename to spring-5-reactive/src/test/java/com/baeldung/SpringContextTest.java index c3ea1d8435..bedb30fcaa 100644 --- a/spring-5-reactive/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 580aa4d8b0c154640fb82fd3684a4d4308d200c5 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:21:22 +0100 Subject: [PATCH 119/530] [JAVA-958] Standardize packages in spring-5-reactive-client module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-5-reactive-client/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-5-reactive-client/src/test/java/org/baeldung/SpringContextTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-5-reactive-client/src/test/java/org/baeldung/SpringContextTest.java rename to spring-5-reactive-client/src/test/java/com/baeldung/SpringContextTest.java index 678d04897b..c0ca9b7e64 100644 --- a/spring-5-reactive-client/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From d38818530532360821b3fa40461bffc3a5058ac1 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:23:39 +0100 Subject: [PATCH 120/530] [JAVA-958] Standardize packages in spring-5-reactive-security module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-5-reactive-security/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-5-reactive-security/src/test/java/org/baeldung/SpringContextTest.java b/spring-5-reactive-security/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-5-reactive-security/src/test/java/org/baeldung/SpringContextTest.java rename to spring-5-reactive-security/src/test/java/com/baeldung/SpringContextTest.java index 479c35d986..b4f4118527 100644 --- a/spring-5-reactive-security/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-5-reactive-security/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 76ee18f79959027dcba517a9ec8d22a4ac228968 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:26:22 +0100 Subject: [PATCH 121/530] [JAVA-958] Standardize packages in spring-5-security module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-5-security/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-5-security/src/test/java/org/baeldung/SpringContextTest.java b/spring-5-security/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-5-security/src/test/java/org/baeldung/SpringContextTest.java rename to spring-5-security/src/test/java/com/baeldung/SpringContextTest.java index 729790bd14..7812a5c063 100644 --- a/spring-5-security/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-5-security/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From e30cd5677ecd5e13cf55d07fd74b871c6c78fe2f Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:29:03 +0100 Subject: [PATCH 122/530] [JAVA-958] Standardize packages in spring-apache-camel module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-apache-camel/src/test/java/{org => com}/baeldung/SpringContextTest.java (89%) diff --git a/spring-apache-camel/src/test/java/org/baeldung/SpringContextTest.java b/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java similarity index 89% rename from spring-apache-camel/src/test/java/org/baeldung/SpringContextTest.java rename to spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java index 1c098a56ab..14e7de2095 100644 --- a/spring-apache-camel/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; From 66c4fe3216b807a0bc137e0cf78046fb596b6b0b Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 20 Mar 2020 08:39:48 +0100 Subject: [PATCH 123/530] [JAVA-958] Standardize packages in spring-bom module --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-bom/src/test/java/{org => com}/baeldung/SpringContextTest.java (90%) diff --git a/spring-bom/src/test/java/org/baeldung/SpringContextTest.java b/spring-bom/src/test/java/com/baeldung/SpringContextTest.java similarity index 90% rename from spring-bom/src/test/java/org/baeldung/SpringContextTest.java rename to spring-bom/src/test/java/com/baeldung/SpringContextTest.java index 783567cdfa..0c7da10dd6 100644 --- a/spring-bom/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-bom/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; From cf216b69d6b04da2e98d16fd0b35a6e4de915ca2 Mon Sep 17 00:00:00 2001 From: Vikas Ramsingh Rajput Date: Fri, 20 Mar 2020 11:58:47 +0300 Subject: [PATCH 124/530] BAEL-3832: added setters and getters and changed the testcases accordingly --- .../bean/CustomBeanFactoryPostProcessor.java | 15 +++++--- .../bean/CustomBeanPostProcessor.java | 15 +++++--- .../baeldung/ioccontainer/bean/Student.java | 12 +++++-- .../ioccontainer/IOCContainerAppUnitTest.java | 36 +++++++++---------- 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java index fe773ce2df..65e249b15b 100644 --- a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanFactoryPostProcessor.java @@ -1,14 +1,21 @@ package com.baeldung.ioccontainer.bean; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor { - public static boolean isBeanInstantiated = false; + private static boolean isBeanFactoryPostProcessorRegistered = false; @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - isBeanInstantiated = true; + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory){ + setBeanFactoryPostProcessorRegistered(true); + } + + public static boolean isBeanFactoryPostProcessorRegistered() { + return isBeanFactoryPostProcessorRegistered; + } + + public static void setBeanFactoryPostProcessorRegistered(boolean isBeanFactoryPostProcessorRegistered) { + CustomBeanFactoryPostProcessor.isBeanFactoryPostProcessorRegistered = isBeanFactoryPostProcessorRegistered; } } diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java index 1c2e011a6c..6f99a5f0db 100644 --- a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/CustomBeanPostProcessor.java @@ -1,14 +1,21 @@ package com.baeldung.ioccontainer.bean; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class CustomBeanPostProcessor implements BeanPostProcessor { - public static boolean isBeanInstantiated = false; + private static boolean isBeanPostProcessorRegistered = false; @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - isBeanInstantiated = true; + public Object postProcessBeforeInitialization(Object bean, String beanName){ + setBeanPostProcessorRegistered(true); return bean; } + + public static boolean isBeanPostProcessorRegistered() { + return isBeanPostProcessorRegistered; + } + + public static void setBeanPostProcessorRegistered(boolean isBeanPostProcessorRegistered) { + CustomBeanPostProcessor.isBeanPostProcessorRegistered = isBeanPostProcessorRegistered; + } } diff --git a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java index 03e0b049ba..404f323b66 100644 --- a/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java +++ b/spring-core-3/src/main/java/com/baeldung/ioccontainer/bean/Student.java @@ -1,9 +1,17 @@ package com.baeldung.ioccontainer.bean; public class Student { - public static boolean isBeanInstantiated = false; + private static boolean isBeanInstantiated = false; public void postConstruct() { - isBeanInstantiated = true; + setBeanInstantiated(true); + } + + public static boolean isBeanInstantiated() { + return isBeanInstantiated; + } + + public static void setBeanInstantiated(boolean isBeanInstantiated) { + Student.isBeanInstantiated = isBeanInstantiated; } } diff --git a/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java index 3c0a5b3dbe..e9b491813e 100644 --- a/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java +++ b/spring-core-3/src/test/java/com/baeldung/ioccontainer/IOCContainerAppUnitTest.java @@ -23,9 +23,9 @@ public class IOCContainerAppUnitTest { @BeforeEach @AfterEach public void resetInstantiationFlag() { - Student.isBeanInstantiated = false; - CustomBeanPostProcessor.isBeanInstantiated = false; - CustomBeanFactoryPostProcessor.isBeanInstantiated = false; + Student.setBeanInstantiated(false); + CustomBeanPostProcessor.setBeanPostProcessorRegistered(false); + CustomBeanFactoryPostProcessor.setBeanFactoryPostProcessorRegistered(false); } @Test @@ -33,24 +33,23 @@ public class IOCContainerAppUnitTest { Resource res = new ClassPathResource("ioc-container-difference-example.xml"); BeanFactory factory = new XmlBeanFactory(res); - assertFalse(Student.isBeanInstantiated); + assertFalse(Student.isBeanInstantiated()); } @Test public void whenBFInitialized_thenStudentInitialized() { - Resource res = new ClassPathResource("ioc-container-difference-example.xml"); BeanFactory factory = new XmlBeanFactory(res); Student student = (Student) factory.getBean("student"); - assertTrue(Student.isBeanInstantiated); + assertTrue(Student.isBeanInstantiated()); } @Test public void whenAppContInitialized_thenStudentInitialized() { ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml"); - assertTrue(Student.isBeanInstantiated); + assertTrue(Student.isBeanInstantiated()); } @Test @@ -58,16 +57,8 @@ public class IOCContainerAppUnitTest { Resource res = new ClassPathResource("ioc-container-difference-example.xml"); ConfigurableListableBeanFactory factory = new XmlBeanFactory(res); - assertFalse(CustomBeanFactoryPostProcessor.isBeanInstantiated); - assertFalse(CustomBeanPostProcessor.isBeanInstantiated); - } - - @Test - public void whenAppContInitialized_thenBFPostProcessorAndBPostProcessorRegisteredAutomatically() { - ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml"); - - assertTrue(CustomBeanFactoryPostProcessor.isBeanInstantiated); - assertTrue(CustomBeanPostProcessor.isBeanInstantiated); + assertFalse(CustomBeanFactoryPostProcessor.isBeanFactoryPostProcessorRegistered()); + assertFalse(CustomBeanPostProcessor.isBeanPostProcessorRegistered()); } @Test @@ -77,12 +68,19 @@ public class IOCContainerAppUnitTest { CustomBeanFactoryPostProcessor beanFactoryPostProcessor = new CustomBeanFactoryPostProcessor(); beanFactoryPostProcessor.postProcessBeanFactory(factory); - assertTrue(CustomBeanFactoryPostProcessor.isBeanInstantiated); + assertTrue(CustomBeanFactoryPostProcessor.isBeanFactoryPostProcessorRegistered()); CustomBeanPostProcessor beanPostProcessor = new CustomBeanPostProcessor(); factory.addBeanPostProcessor(beanPostProcessor); Student student = (Student) factory.getBean("student"); - assertTrue(CustomBeanPostProcessor.isBeanInstantiated); + assertTrue(CustomBeanPostProcessor.isBeanPostProcessorRegistered()); } + + @Test + public void whenAppContInitialized_thenBFPostProcessorAndBPostProcessorRegisteredAutomatically() { + ApplicationContext context = new ClassPathXmlApplicationContext("ioc-container-difference-example.xml"); + assertTrue(CustomBeanFactoryPostProcessor.isBeanFactoryPostProcessorRegistered()); + assertTrue(CustomBeanPostProcessor.isBeanPostProcessorRegistered()); + } } From d3b35f9f0cfb9ef49366f3b7f9db10f891fb0f6d Mon Sep 17 00:00:00 2001 From: Eduard Ardeleanu Date: Fri, 20 Mar 2020 17:28:47 +0200 Subject: [PATCH 125/530] BAEL-3853: Helpful NPE in Java 14 --- .../HelpfulNullPointerException.java | 56 +++++++++++++++++++ .../HelpfulNullPointerExceptionUnitTest.java | 37 ++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 core-java-modules/core-java-14/src/main/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerException.java create mode 100644 core-java-modules/core-java-14/src/test/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerExceptionUnitTest.java diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerException.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerException.java new file mode 100644 index 0000000000..ef5dbb754c --- /dev/null +++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerException.java @@ -0,0 +1,56 @@ +package com.baeldung.java14.helpfulnullpointerexceptions; + +public class HelpfulNullPointerException { + + public static void main(String[] args) { + Employee employee = null; + employee.getName(); + } + + public String getEmployeeEmailAddress(Employee employee) { + String emailAddress = employee.getPersonalDetails().getEmailAddress().toLowerCase(); + return emailAddress; + } + + static class Employee { + String name; + PersonalDetails personalDetails; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public PersonalDetails getPersonalDetails() { + return personalDetails; + } + + public void setPersonalDetails(PersonalDetails personalDetails) { + this.personalDetails = personalDetails; + } + } + + static class PersonalDetails { + String emailAddress; + String phone; + + public String getEmailAddress() { + return emailAddress; + } + + public void setEmailAddress(String emailAddress) { + this.emailAddress = emailAddress; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + } +} diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerExceptionUnitTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerExceptionUnitTest.java new file mode 100644 index 0000000000..fae331bb92 --- /dev/null +++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/helpfulnullpointerexceptions/HelpfulNullPointerExceptionUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.java14.helpfulnullpointerexceptions; + +import org.junit.Test; + +import static com.baeldung.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.Employee; +import static com.baeldung.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.PersonalDetails; +import static org.assertj.core.api.Assertions.assertThat; + +public class HelpfulNullPointerExceptionUnitTest { + + @Test (expected = NullPointerException.class) + public void givenAnEmptyPersonalDetails_whenEmailAddressIsAccessed_thenThrowNPE() { + var helpfulNPE = new HelpfulNullPointerException(); + + var employee = new Employee(); + employee.setName("Eduard"); + employee.setPersonalDetails(new PersonalDetails()); + helpfulNPE.getEmployeeEmailAddress(employee); + } + + @Test + public void givenCompletePersonalDetails_whenEmailAddressIsAccessed_thenSuccess() { + var helpfulNPE = new HelpfulNullPointerException(); + var emailAddress = "eduard@gmx.com"; + + var employee = new Employee(); + employee.setName("Eduard"); + + var personalDetails = new PersonalDetails(); + personalDetails.setEmailAddress(emailAddress.toUpperCase()); + personalDetails.setPhone("1234"); + employee.setPersonalDetails(personalDetails); + + assertThat(helpfulNPE.getEmployeeEmailAddress(employee)).isEqualTo(emailAddress); + } + +} From 1022c706a4267e7f05e6a289b62fa150b67e1493 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Fri, 20 Mar 2020 23:49:49 +0100 Subject: [PATCH 126/530] JAVA-1088: Move java-generating-barcodes-qr-codes into spring-boot-libraries module --- libraries-3/pom.xml | 56 +++++-------------- .../spring-boot-libraries/README.md | 1 + .../spring-boot-libraries/pom.xml | 37 ++++++++++++ .../baeldung/barcodes/BarcodesController.java | 0 .../com/baeldung/barcodes/SpringBootApp.java | 0 .../generators/BarbecueBarcodeGenerator.java | 0 .../generators/Barcode4jBarcodeGenerator.java | 0 .../generators/QRGenBarcodeGenerator.java | 0 .../generators/ZxingBarcodeGenerator.java | 0 9 files changed, 53 insertions(+), 41 deletions(-) rename {libraries-3 => spring-boot-modules/spring-boot-libraries}/src/main/java/com/baeldung/barcodes/BarcodesController.java (100%) rename {libraries-3 => spring-boot-modules/spring-boot-libraries}/src/main/java/com/baeldung/barcodes/SpringBootApp.java (100%) rename {libraries-3 => spring-boot-modules/spring-boot-libraries}/src/main/java/com/baeldung/barcodes/generators/BarbecueBarcodeGenerator.java (100%) rename {libraries-3 => spring-boot-modules/spring-boot-libraries}/src/main/java/com/baeldung/barcodes/generators/Barcode4jBarcodeGenerator.java (100%) rename {libraries-3 => spring-boot-modules/spring-boot-libraries}/src/main/java/com/baeldung/barcodes/generators/QRGenBarcodeGenerator.java (100%) rename {libraries-3 => spring-boot-modules/spring-boot-libraries}/src/main/java/com/baeldung/barcodes/generators/ZxingBarcodeGenerator.java (100%) diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index 4b9cac8cff..5334bfba70 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -8,9 +8,8 @@ com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 + parent-modules + 1.0.0-SNAPSHOT @@ -24,39 +23,6 @@ lombok ${lombok.version} - - org.springframework.boot - spring-boot-starter-web - - - - net.sourceforge.barbecue - barbecue - ${barbecue.version} - - - - net.sf.barcode4j - barcode4j - ${barcode4j.version} - - - - com.google.zxing - core - ${zxing.version} - - - com.google.zxing - javase - ${zxing.version} - - - - com.github.kenglxn.qrgen - javase - ${qrgen.version} - com.github.rvesse airline @@ -89,6 +55,16 @@ takes ${takes.version} + + org.apache.httpcomponents + httpcore + ${httpcore.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + org.apache.velocity velocity-engine-core @@ -119,7 +95,7 @@ https://jitpack.io - + libraries-3 @@ -239,10 +215,6 @@ 1.78 1.18.6 - 1.5-beta1 - 2.1 - 3.3.0 - 2.6.0 0.43 2.7.2 @@ -254,6 +226,8 @@ 1.9.2 1.19 + 4.4.13 + 4.5.12 2.2 1.6.0 diff --git a/spring-boot-modules/spring-boot-libraries/README.md b/spring-boot-modules/spring-boot-libraries/README.md index f0bc3c9e89..c02fb69e5d 100644 --- a/spring-boot-modules/spring-boot-libraries/README.md +++ b/spring-boot-modules/spring-boot-libraries/README.md @@ -9,3 +9,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Guide to ShedLock with Spring](https://www.baeldung.com/shedlock-spring) - [A Guide to the Problem Spring Web Library](https://www.baeldung.com/problem-spring-web) +- [Generating Barcodes and QR Codes in Java](https://www.baeldung.com/java-generating-barcodes-qr-codes) diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index ba1164dd59..e9d955edc0 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -53,8 +53,41 @@ ${shedlock.version} + + + net.sourceforge.barbecue + barbecue + ${barbecue.version} + + + net.sf.barcode4j + barcode4j + ${barcode4j.version} + + + com.github.kenglxn.qrgen + javase + ${qrgen.version} + + + com.google.zxing + core + ${zxing.version} + + + com.google.zxing + javase + ${zxing.version} + + + + jitpack.io + https://jitpack.io + + + spring-boot-libraries @@ -153,6 +186,10 @@ 2.3.2 0.23.0 2.1.0 + 1.5-beta1 + 2.1 + 2.6.0 + 3.3.0 diff --git a/libraries-3/src/main/java/com/baeldung/barcodes/BarcodesController.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/BarcodesController.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/barcodes/BarcodesController.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/BarcodesController.java diff --git a/libraries-3/src/main/java/com/baeldung/barcodes/SpringBootApp.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/SpringBootApp.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/barcodes/SpringBootApp.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/SpringBootApp.java diff --git a/libraries-3/src/main/java/com/baeldung/barcodes/generators/BarbecueBarcodeGenerator.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/BarbecueBarcodeGenerator.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/barcodes/generators/BarbecueBarcodeGenerator.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/BarbecueBarcodeGenerator.java diff --git a/libraries-3/src/main/java/com/baeldung/barcodes/generators/Barcode4jBarcodeGenerator.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/Barcode4jBarcodeGenerator.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/barcodes/generators/Barcode4jBarcodeGenerator.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/Barcode4jBarcodeGenerator.java diff --git a/libraries-3/src/main/java/com/baeldung/barcodes/generators/QRGenBarcodeGenerator.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/QRGenBarcodeGenerator.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/barcodes/generators/QRGenBarcodeGenerator.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/QRGenBarcodeGenerator.java diff --git a/libraries-3/src/main/java/com/baeldung/barcodes/generators/ZxingBarcodeGenerator.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/ZxingBarcodeGenerator.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/barcodes/generators/ZxingBarcodeGenerator.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/ZxingBarcodeGenerator.java From b13bb933750b70375a7f7353e8b22733efa2da13 Mon Sep 17 00:00:00 2001 From: Vikas Ramsingh Rajput Date: Sat, 21 Mar 2020 09:13:32 +0300 Subject: [PATCH 127/530] BAEL-3832: removed tab space --- .../src/test/resources/ioc-container-difference-example.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-core-3/src/test/resources/ioc-container-difference-example.xml b/spring-core-3/src/test/resources/ioc-container-difference-example.xml index ba84aa635d..e53dc11f89 100644 --- a/spring-core-3/src/test/resources/ioc-container-difference-example.xml +++ b/spring-core-3/src/test/resources/ioc-container-difference-example.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - + \ No newline at end of file From 63bfa3706ad5739d42959458ec5fc51258154871 Mon Sep 17 00:00:00 2001 From: ajay74984 <51405689+ajay74984@users.noreply.github.com> Date: Sat, 21 Mar 2020 11:17:11 +0100 Subject: [PATCH 128/530] revert changes --- java-numbers-3/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/java-numbers-3/README.md b/java-numbers-3/README.md index a331a979ad..08e8dae8ef 100644 --- a/java-numbers-3/README.md +++ b/java-numbers-3/README.md @@ -2,4 +2,3 @@ - [Generating Random Numbers](https://www.baeldung.com/java-generating-random-numbers) - [Convert Double to Long in Java](https://www.baeldung.com/java-convert-double-long) -- [Guide to the Java Number Class](http://inprogress.baeldung.com/?p=180694&preview=true) From ad94b4d4b2c60d603fc6b52ba2886690c29a24c0 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 21 Mar 2020 16:07:48 +0530 Subject: [PATCH 129/530] JAVA-60 Mvn Clean Install Profile Issue - Github 8189 - Updated README.md as per the latest profile based segregation that we follow in this repository --- README.md | 16 ++++++++-------- parent-kotlin/pom.xml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 47b9709465..106c5f876a 100644 --- a/README.md +++ b/README.md @@ -33,14 +33,14 @@ Next, they are segregated further on the basis of tests that we want to execute. Therefore, we have a total of 6 profiles: -| Profile | Includes | Type of test enabled | -| ---------------------- | --------------------------- | -------------------- | -| default-first | First set of projects | *UnitTest | -| integration-lite-first | First set of projects | *IntegrationTest | -| default-second | Second set of projects | *UnitTest | -| integration-lite-first | Second set of projects | *IntegrationTest | -| default-heavy | Heavy/long running projects | *UnitTest | -| integration-heavy | Heavy/long running projects | *IntegrationTest | +| Profile | Includes | Type of test enabled | +| ----------------------- | --------------------------- | -------------------- | +| default-first | First set of projects | *UnitTest | +| integration-lite-first | First set of projects | *IntegrationTest | +| default-second | Second set of projects | *UnitTest | +| integration-lite-second | Second set of projects | *IntegrationTest | +| default-heavy | Heavy/long running projects | *UnitTest | +| integration-heavy | Heavy/long running projects | *IntegrationTest | Building the project ==================== diff --git a/parent-kotlin/pom.xml b/parent-kotlin/pom.xml index abc871ca91..6a7d763550 100644 --- a/parent-kotlin/pom.xml +++ b/parent-kotlin/pom.xml @@ -29,7 +29,7 @@ spring-milestone Spring Milestone Repository - http://repo.spring.io/milestone + https://repo.spring.io/milestone From 476270ce54074ca36bd4056ef3eead1ab086856f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 21 Mar 2020 17:03:32 +0530 Subject: [PATCH 130/530] JAVA-60 Mvn Clean Install Profile Issue - Github 8189 - Updated README.md as per the latest profile based segregation that we follow in this repository --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 106c5f876a..6ed01b1ae6 100644 --- a/README.md +++ b/README.md @@ -33,21 +33,21 @@ Next, they are segregated further on the basis of tests that we want to execute. Therefore, we have a total of 6 profiles: -| Profile | Includes | Type of test enabled | -| ----------------------- | --------------------------- | -------------------- | -| default-first | First set of projects | *UnitTest | -| integration-lite-first | First set of projects | *IntegrationTest | -| default-second | Second set of projects | *UnitTest | -| integration-lite-second | Second set of projects | *IntegrationTest | -| default-heavy | Heavy/long running projects | *UnitTest | -| integration-heavy | Heavy/long running projects | *IntegrationTest | +| Profile | Includes | Type of test enabled | +| ----------------------- | --------------------------- | ---------------------------- | +| default-first | First set of projects | *UnitTest, SpringContextTest | +| integration-lite-first | First set of projects | *IntegrationTest | +| default-second | Second set of projects | *UnitTest, SpringContextTest | +| integration-lite-second | Second set of projects | *IntegrationTest | +| default-heavy | Heavy/long running projects | *UnitTest, SpringContextTest | +| integration-heavy | Heavy/long running projects | *IntegrationTest | Building the project ==================== Though it should not be needed often to build the entire repository at once because we are usually concerned with a specific module. -But if we want to, we can invoke the below command from the root of the repository if we want to build the entire repository with only Unit Tests enabled: +But if we want to, we can invoke the below command from the root of the repository if we want to build the entire repository with only Unit Tests and `SpringContextTest` enabled: `mvn clean install -Pdefault-first,default-second,default-heavy` @@ -74,7 +74,7 @@ When you're working with an individual module, there's no need to import all of Running Tests ============= -The command `mvn clean install` from within a module will run the unit tests in that module. +The command `mvn clean install` from within a module will run the unit tests in that module and additionally `SpringContextTest`. To run the integration tests, use the command: `mvn clean install -Pintegration-lite-first` or From c0e1a3df91af874a32383c005db287430c367340 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 21 Mar 2020 17:09:53 +0530 Subject: [PATCH 131/530] JAVA-60 Mvn Clean Install Profile Issue - Github 8189 - Updated README.md as per the latest profile based segregation that we follow in this repository --- README.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 6ed01b1ae6..b08a93f23e 100644 --- a/README.md +++ b/README.md @@ -33,21 +33,21 @@ Next, they are segregated further on the basis of tests that we want to execute. Therefore, we have a total of 6 profiles: -| Profile | Includes | Type of test enabled | -| ----------------------- | --------------------------- | ---------------------------- | -| default-first | First set of projects | *UnitTest, SpringContextTest | -| integration-lite-first | First set of projects | *IntegrationTest | -| default-second | Second set of projects | *UnitTest, SpringContextTest | -| integration-lite-second | Second set of projects | *IntegrationTest | -| default-heavy | Heavy/long running projects | *UnitTest, SpringContextTest | -| integration-heavy | Heavy/long running projects | *IntegrationTest | +| Profile | Includes | Type of test enabled | +| ----------------------- | --------------------------- | -------------------- | +| default-first | First set of projects | *UnitTest | +| integration-lite-first | First set of projects | *IntegrationTest | +| default-second | Second set of projects | *UnitTest | +| integration-lite-second | Second set of projects | *IntegrationTest | +| default-heavy | Heavy/long running projects | *UnitTest | +| integration-heavy | Heavy/long running projects | *IntegrationTest | Building the project ==================== Though it should not be needed often to build the entire repository at once because we are usually concerned with a specific module. -But if we want to, we can invoke the below command from the root of the repository if we want to build the entire repository with only Unit Tests and `SpringContextTest` enabled: +But if we want to, we can invoke the below command from the root of the repository if we want to build the entire repository with only Unit Tests enabled: `mvn clean install -Pdefault-first,default-second,default-heavy` @@ -74,7 +74,9 @@ When you're working with an individual module, there's no need to import all of Running Tests ============= -The command `mvn clean install` from within a module will run the unit tests in that module and additionally `SpringContextTest`. +The command `mvn clean install` from within a module will run the unit tests in that module. +For Spring modules this will also run the `SpringContextTest` if present. + To run the integration tests, use the command: `mvn clean install -Pintegration-lite-first` or From 0876b7fdc8a9e6748286b855f45bc8703a8bfeb7 Mon Sep 17 00:00:00 2001 From: Waldemar Date: Sat, 21 Mar 2020 15:41:40 +0100 Subject: [PATCH 132/530] BAEL-2398 add example --- coroutines-java/pom.xml | 89 +++++++++++++++++++ .../src/main/java/com/baeldung/App.java | 11 +++ 2 files changed, 100 insertions(+) create mode 100644 coroutines-java/pom.xml create mode 100644 coroutines-java/src/main/java/com/baeldung/App.java diff --git a/coroutines-java/pom.xml b/coroutines-java/pom.xml new file mode 100644 index 0000000000..c48efac934 --- /dev/null +++ b/coroutines-java/pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + + com.baeldung + coroutines-java + 1.0-SNAPSHOT + + coroutines-java + http://baeldung.com + + + UTF-8 + 1.8 + 1.8 + + + + + co.paralleluniverse + quasar-core + 0.8.0 + + + co.paralleluniverse + quasar-actors + 0.8.0 + + + co.paralleluniverse + quasar-reactive-streams + 0.8.0 + + + + + + + maven-dependency-plugin + 3.1.2 + + + getClasspathFilenames + + properties + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + com.baeldung.App + target/classes + java + + + -Dco.paralleluniverse.fibers.verifyInstrumentation=true + + + -javaagent:${co.paralleluniverse:quasar-core:jar} + + + -classpath + + + + com.baeldung.App + + + + + maven-compiler-plugin + 3.8.0 + + + org.apache.maven.plugins + maven-compiler-plugin + + 12 + 12 + + + + + diff --git a/coroutines-java/src/main/java/com/baeldung/App.java b/coroutines-java/src/main/java/com/baeldung/App.java new file mode 100644 index 0000000000..09157b1566 --- /dev/null +++ b/coroutines-java/src/main/java/com/baeldung/App.java @@ -0,0 +1,11 @@ +package com.baeldung; + +import co.paralleluniverse.fibers.Fiber; + +public class App { + public static void main(String[] args) { + new Fiber(() -> { + System.out.println("Inside fiber coroutine..."); + }).start(); + } +} From 380344f38ae15277f392cc5597bb63411207c0e3 Mon Sep 17 00:00:00 2001 From: Waldemar Date: Sat, 21 Mar 2020 15:47:20 +0100 Subject: [PATCH 133/530] BAEL-2398 pom formatting --- coroutines-java/pom.xml | 158 ++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/coroutines-java/pom.xml b/coroutines-java/pom.xml index c48efac934..8d08bfdc88 100644 --- a/coroutines-java/pom.xml +++ b/coroutines-java/pom.xml @@ -1,89 +1,89 @@ - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.baeldung - coroutines-java - 1.0-SNAPSHOT + com.baeldung + coroutines-java + 1.0-SNAPSHOT - coroutines-java - http://baeldung.com + coroutines-java + http://baeldung.com - - UTF-8 - 1.8 - 1.8 - + + UTF-8 + 1.8 + 1.8 + - - - co.paralleluniverse - quasar-core - 0.8.0 - - - co.paralleluniverse - quasar-actors - 0.8.0 - - - co.paralleluniverse - quasar-reactive-streams - 0.8.0 - - + + + co.paralleluniverse + quasar-core + 0.8.0 + + + co.paralleluniverse + quasar-actors + 0.8.0 + + + co.paralleluniverse + quasar-reactive-streams + 0.8.0 + + - - - - maven-dependency-plugin - 3.1.2 - - - getClasspathFilenames - - properties - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - com.baeldung.App - target/classes - java - - - -Dco.paralleluniverse.fibers.verifyInstrumentation=true + + + + maven-dependency-plugin + 3.1.2 + + + getClasspathFilenames + + properties + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + com.baeldung.App + target/classes + java + + + -Dco.paralleluniverse.fibers.verifyInstrumentation=true - - -javaagent:${co.paralleluniverse:quasar-core:jar} + + -javaagent:${co.paralleluniverse:quasar-core:jar} - - -classpath - + + -classpath + - - com.baeldung.App - - - - - maven-compiler-plugin - 3.8.0 - - - org.apache.maven.plugins - maven-compiler-plugin - - 12 - 12 - - - - + + com.baeldung.App + + + + + maven-compiler-plugin + 3.8.0 + + + org.apache.maven.plugins + maven-compiler-plugin + + 12 + 12 + + + + From 2129f59ee263844dc588cdee5393db0853048a1f Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sat, 21 Mar 2020 16:06:29 +0100 Subject: [PATCH 134/530] JAVA-86: Remove spring-boot-change-port --- .../spring-boot-runtime/README.md | 1 - .../baeldung/changeport/CustomApplication.java | 17 ----------------- .../changeport/ServerPortCustomizer.java | 15 --------------- 3 files changed, 33 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/CustomApplication.java delete mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java diff --git a/spring-boot-modules/spring-boot-runtime/README.md b/spring-boot-modules/spring-boot-runtime/README.md index a544faf830..62727ecc76 100644 --- a/spring-boot-modules/spring-boot-runtime/README.md +++ b/spring-boot-modules/spring-boot-runtime/README.md @@ -8,7 +8,6 @@ This module contains articles about administering a Spring Boot runtime - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) - - [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) - [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) - [CORS with Spring](https://www.baeldung.com/spring-cors) - [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/CustomApplication.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/CustomApplication.java deleted file mode 100644 index 3fce0f1289..0000000000 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/CustomApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.changeport; - -import java.util.Collections; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CustomApplication { - - public static void main(String[] args) { - SpringApplication app = new SpringApplication(CustomApplication.class); - app.setDefaultProperties(Collections.singletonMap("server.port", "8083")); - app.run(args); - } - -} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java deleted file mode 100644 index f3610aeac6..0000000000 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.changeport; - -import org.springframework.boot.web.server.ConfigurableWebServerFactory; -import org.springframework.boot.web.server.WebServerFactoryCustomizer; -import org.springframework.stereotype.Component; - -//@Component -public class ServerPortCustomizer implements WebServerFactoryCustomizer { - - @Override - public void customize(ConfigurableWebServerFactory factory) { - factory.setPort(8086); - } - -} \ No newline at end of file From 4f8cb3cf3723c7dce708c9de68768ba339b84729 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sat, 21 Mar 2020 16:10:02 +0100 Subject: [PATCH 135/530] JAVA-86: Remove spring-boot-custom-banners --- spring-boot-modules/spring-boot/README.MD | 1 - .../src/main/resources/application.properties | 8 -------- .../spring-boot/src/main/resources/banner.txt | 14 -------------- 3 files changed, 23 deletions(-) delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/banner.txt diff --git a/spring-boot-modules/spring-boot/README.MD b/spring-boot-modules/spring-boot/README.MD index 217d9e90b2..a59ca34fae 100644 --- a/spring-boot-modules/spring-boot/README.MD +++ b/spring-boot-modules/spring-boot/README.MD @@ -11,7 +11,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [The @ServletComponentScan Annotation in Spring Boot](https://www.baeldung.com/spring-servletcomponentscan) - [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) - [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) -- [Using Custom Banners in Spring Boot](https://www.baeldung.com/spring-boot-custom-banners) - [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization) - [Create a Custom FailureAnalyzer with Spring Boot](https://www.baeldung.com/spring-boot-failure-analyzer) - [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) diff --git a/spring-boot-modules/spring-boot/src/main/resources/application.properties b/spring-boot-modules/spring-boot/src/main/resources/application.properties index 7de79da574..44649fc1c0 100644 --- a/spring-boot-modules/spring-boot/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot/src/main/resources/application.properties @@ -33,12 +33,4 @@ logging.level.org.springframework=INFO servlet.name=dispatcherExample servlet.mapping=/dispatcherExampleURL -#spring.banner.charset=UTF-8 -#spring.banner.location=classpath:banner.txt -#spring.banner.image.location=classpath:banner.gif -#spring.banner.image.width= //TODO -#spring.banner.image.height= //TODO -#spring.banner.image.margin= //TODO -#spring.banner.image.invert= //TODO - contactInfoType=email \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/banner.txt b/spring-boot-modules/spring-boot/src/main/resources/banner.txt deleted file mode 100644 index abfa666eb6..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/banner.txt +++ /dev/null @@ -1,14 +0,0 @@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@########@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@:..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@#. @@@@@* *@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@#o @@@@@* @@@@@* @@@:*.*@@@@@@@: *8@@@ @@@@&:.#@. @o**@@@@**:@o*o@@:.:@@@@@:.o#@&*:@@@@ -@@@@@@@@@@@@* @@@@@* 8888 8@ @@@8 #@o 8@# .@ @@* :. @* @@@@ @. : &@ ** .@@@@ -@@@@@@@@@@. @ o@@@@@* *@@@o::& .* 8@@@@. @@ 8@@@@. @* @@@@ @. @@@& * @@@@# .@@@@ -@@@@@@@@@& @ @@@@@@* @@@@@@ 8 @@@@ .. o&&&&&&& @@ #@@@@. @* @@@@ @. @@@# * @@@@@ .@@@@ -@@@@@@@@@ @@o @@@@@@@* oooo* 8 @@@& @* @@@ # 88. 88. *& o#: @. @@@# *@ &#& .@@@@ -@@@@@@@@# @@@8 @@@@@@@* .*@@@#. *@@ @@@& :#@@@o .@@: *&@8 @o o@@: @. @@@# *@@#. :8# .@@@@ -@@@@@@@@@ @@@@ &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@# o@@@@ @@@@@ -@@@@@& &@@@@ 8@@@@@@@@@8&8@@@@@#8#@@@o8@#&@@o&@@@&@@8@@&@@@@88@@8#@8&@@##@@@@@@#8@@#8@@88@@@@@ *@@@@@@@ -@@@# #@@@@#. @@@@@@@@@@@@@8@@8#o@&#@@@@o.@o*@@*.@@@.@&:8o8*@@@8&@@#@@@8@@@@8@#@@@8&@@@@@@#@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \ No newline at end of file From 3f21f970b8749987b05a048db9e1389b08babda6 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sat, 21 Mar 2020 16:13:59 +0100 Subject: [PATCH 136/530] JAVA-86: Remove spring-boot-failure-analyzer --- spring-boot-modules/spring-boot/README.MD | 1 - .../FailureAnalyzerApplication.java | 14 ------ ...yBeanNotOfRequiredTypeFailureAnalyzer.java | 22 --------- .../com/baeldung/failureanalyzer/MyDAO.java | 5 -- .../baeldung/failureanalyzer/MySecondDAO.java | 8 ---- .../baeldung/failureanalyzer/MyService.java | 13 ----- .../main/resources/META-INF/spring.factories | 2 - .../FailureAnalyzerAppIntegrationTest.java | 47 ------------------- .../failureanalyzer/utils/ListAppender.java | 25 ---------- .../src/test/resources/logback-test.xml | 15 ------ 10 files changed, 152 deletions(-) delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyDAO.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyService.java delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/META-INF/spring.factories delete mode 100644 spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java delete mode 100644 spring-boot-modules/spring-boot/src/test/resources/logback-test.xml diff --git a/spring-boot-modules/spring-boot/README.MD b/spring-boot-modules/spring-boot/README.MD index a59ca34fae..83cc26fdec 100644 --- a/spring-boot-modules/spring-boot/README.MD +++ b/spring-boot-modules/spring-boot/README.MD @@ -12,7 +12,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) - [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) - [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization) -- [Create a Custom FailureAnalyzer with Spring Boot](https://www.baeldung.com/spring-boot-failure-analyzer) - [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) - [Custom Information in Spring Boot Info Endpoint](https://www.baeldung.com/spring-boot-info-actuator-custom) - [Testing in Spring Boot](https://www.baeldung.com/spring-boot-testing) diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java deleted file mode 100644 index 7bd5c36786..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.failureanalyzer; - -import javax.annotation.security.RolesAllowed; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class FailureAnalyzerApplication { - @RolesAllowed("*") - public static void main(String[] args) { - SpringApplication.run(FailureAnalyzerApplication.class, args); - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java deleted file mode 100644 index 3949908083..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyBeanNotOfRequiredTypeFailureAnalyzer.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.failureanalyzer; - -import org.springframework.beans.factory.BeanNotOfRequiredTypeException; -import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; -import org.springframework.boot.diagnostics.FailureAnalysis; - -public class MyBeanNotOfRequiredTypeFailureAnalyzer extends AbstractFailureAnalyzer { - - @Override - protected FailureAnalysis analyze(Throwable rootFailure, BeanNotOfRequiredTypeException cause) { - return new FailureAnalysis(getDescription(cause), getAction(cause), cause); - } - - private String getDescription(BeanNotOfRequiredTypeException ex) { - return String.format("The bean %s could not be injected as %s because it is of type %s", ex.getBeanName(), ex.getRequiredType().getName(), ex.getActualType().getName()); - } - - private String getAction(BeanNotOfRequiredTypeException ex) { - return String.format("Consider creating a bean with name %s of type %s", ex.getBeanName(), ex.getRequiredType().getName()); - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyDAO.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyDAO.java deleted file mode 100644 index ddaeb28574..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyDAO.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.failureanalyzer; - -public class MyDAO { - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java deleted file mode 100644 index 12dd73a05b..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MySecondDAO.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.failureanalyzer; - -import org.springframework.stereotype.Repository; - -@Repository("myDAO") -public class MySecondDAO { - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyService.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyService.java deleted file mode 100644 index 72334ca8fa..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/failureanalyzer/MyService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.failureanalyzer; - -import javax.annotation.Resource; - -import org.springframework.stereotype.Service; - -@Service -public class MyService { - - @Resource(name = "myDAO") - private MyDAO myDAO; - -} diff --git a/spring-boot-modules/spring-boot/src/main/resources/META-INF/spring.factories b/spring-boot-modules/spring-boot/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 336477df96..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer - diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java deleted file mode 100644 index b3555f55da..0000000000 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.failureanalyzer; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Collection; -import java.util.stream.Collectors; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.boot.SpringApplication; - -import com.baeldung.failureanalyzer.utils.ListAppender; - -import ch.qos.logback.classic.spi.ILoggingEvent; - -public class FailureAnalyzerAppIntegrationTest { - - private static final String EXPECTED_ANALYSIS_DESCRIPTION_TITLE = "Description:"; - private static final String EXPECTED_ANALYSIS_DESCRIPTION_CONTENT = "The bean myDAO could not be injected as com.baeldung.failureanalyzer.MyDAO because it is of type com.baeldung.failureanalyzer.MySecondDAO"; - private static final String EXPECTED_ANALYSIS_ACTION_TITLE = "Action:"; - private static final String EXPECTED_ANALYSIS_ACTION_CONTENT = "Consider creating a bean with name myDAO of type com.baeldung.failureanalyzer.MyDAO"; - - @BeforeEach - public void clearLogList() { - ListAppender.clearEventList(); - } - - @Test - public void givenBeanCreationErrorInContext_whenContextLoaded_thenFailureAnalyzerLogsReport() { - try { - SpringApplication.run(FailureAnalyzerApplication.class); - } catch (BeanCreationException e) { - Collection allLoggedEntries = ListAppender.getEvents() - .stream() - .map(ILoggingEvent::getFormattedMessage) - .collect(Collectors.toList()); - assertThat(allLoggedEntries).anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_DESCRIPTION_TITLE)) - .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_DESCRIPTION_CONTENT)) - .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_ACTION_TITLE)) - .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_ACTION_CONTENT)); - return; - } - throw new IllegalStateException("Context load should be failing due to a BeanCreationException!"); - } - -} diff --git a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java deleted file mode 100644 index a298f49ff5..0000000000 --- a/spring-boot-modules/spring-boot/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.failureanalyzer.utils; - -import java.util.ArrayList; -import java.util.List; - -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.AppenderBase; - -public class ListAppender extends AppenderBase { - - static private List events = new ArrayList<>(); - - @Override - protected void append(ILoggingEvent eventObject) { - events.add(eventObject); - } - - public static List getEvents() { - return events; - } - - public static void clearEventList() { - events.clear(); - } -} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot/src/test/resources/logback-test.xml deleted file mode 100644 index 9e0f4e221f..0000000000 --- a/spring-boot-modules/spring-boot/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file From 802d1d3b9029e0eea97afeb0c23f6aed42bba369 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sat, 21 Mar 2020 16:19:54 +0100 Subject: [PATCH 137/530] JAVA-86: Remove spring-boot-custom-error-page --- spring-boot-modules/spring-boot/README.MD | 1 - .../ErrorHandlingApplication.java | 15 ------- .../controllers/IndexController.java | 26 ------------ .../controllers/MyErrorController.java | 40 ------------------- .../application-errorhandling.properties | 8 +--- .../main/resources/templates/error-404.html | 14 ------- .../main/resources/templates/error-500.html | 16 -------- 7 files changed, 1 insertion(+), 119 deletions(-) delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/error-404.html delete mode 100644 spring-boot-modules/spring-boot/src/main/resources/templates/error-500.html diff --git a/spring-boot-modules/spring-boot/README.MD b/spring-boot-modules/spring-boot/README.MD index 83cc26fdec..16f20d889c 100644 --- a/spring-boot-modules/spring-boot/README.MD +++ b/spring-boot-modules/spring-boot/README.MD @@ -20,7 +20,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Getting Started with GraphQL and Spring Boot](https://www.baeldung.com/spring-graphql) - [Guide to Spring Type Conversions](https://www.baeldung.com/spring-type-conversions) - [An Introduction to Kong](https://www.baeldung.com/kong) -- [Spring Boot: Customize Whitelabel Error Page](https://www.baeldung.com/spring-boot-custom-error-page) - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) - [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) - [How to Define a Spring Boot Filter?](https://www.baeldung.com/spring-boot-add-filter) diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java deleted file mode 100644 index 5dd55ef077..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.errorhandling; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.errorhandling") -public class ErrorHandlingApplication { - - public static void main(String [] args) { - System.setProperty("spring.profiles.active", "errorhandling"); - SpringApplication.run(ErrorHandlingApplication.class, args); - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java deleted file mode 100644 index 1a8761e96b..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/IndexController.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.errorhandling.controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; - -@Controller -public class IndexController { - - @GetMapping(value = {"/", ""}) - public String index() { - return "index"; - } - - @GetMapping(value = {"/server_error"}) - public String triggerServerError() { - "ser".charAt(30); - return "index"; - } - - @PostMapping(value = {"/general_error"}) - public String triggerGeneralError() { - return "index"; - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java deleted file mode 100644 index e002ac045d..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/errorhandling/controllers/MyErrorController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.errorhandling.controllers; - -import org.springframework.boot.web.servlet.error.ErrorController; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -import javax.servlet.RequestDispatcher; -import javax.servlet.http.HttpServletRequest; - -@Controller -public class MyErrorController implements ErrorController { - - public MyErrorController() {} - - @GetMapping(value = "/error") - public String handleError(HttpServletRequest request) { - - Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); - - if (status != null) { - - Integer statusCode = Integer.valueOf(status.toString()); - - if(statusCode == HttpStatus.NOT_FOUND.value()) { - return "error-404"; - } - else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { - return "error-500"; - } - } - return "error"; - } - - @Override - public String getErrorPath() { - return "/error"; - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties b/spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties index 6ffcfbaf52..270e86d443 100644 --- a/spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties +++ b/spring-boot-modules/spring-boot/src/main/resources/application-errorhandling.properties @@ -1,10 +1,4 @@ #server server.port=9000 server.servlet-path=/ -server.context-path=/ -#server.error.whitelabel.enabled=false - -#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration - -#for Spring Boot 2.0+ -#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration \ No newline at end of file +server.context-path=/ \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/error-404.html b/spring-boot-modules/spring-boot/src/main/resources/templates/error-404.html deleted file mode 100644 index cf68032596..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/error-404.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - -
-
-

Sorry, we couldn't find the page you were looking for.

-

Go Home

-
- - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot/src/main/resources/templates/error-500.html b/spring-boot-modules/spring-boot/src/main/resources/templates/error-500.html deleted file mode 100644 index 5ddf458229..0000000000 --- a/spring-boot-modules/spring-boot/src/main/resources/templates/error-500.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - -
-
-

Sorry, something went wrong!

- -

We're fixing it.

-

Go Home

-
- - \ No newline at end of file From a5ee0d6b6f6a7360d04272858d003671959e88f8 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sat, 21 Mar 2020 16:23:58 +0100 Subject: [PATCH 138/530] JAVA-86: Remove spring-boot-add-filter --- spring-boot-modules/spring-boot/README.MD | 1 - .../bootcustomfilters/FilterConfig.java | 25 ---------- .../SpringBootFiltersApplication.java | 17 ------- .../controller/UserController.java | 35 ------------- .../filters/RequestResponseLoggingFilter.java | 50 ------------------- .../filters/TransactionFilter.java | 47 ----------------- .../bootcustomfilters/model/User.java | 45 ----------------- 7 files changed, 220 deletions(-) delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java delete mode 100644 spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/model/User.java diff --git a/spring-boot-modules/spring-boot/README.MD b/spring-boot-modules/spring-boot/README.MD index 16f20d889c..3397ad3b75 100644 --- a/spring-boot-modules/spring-boot/README.MD +++ b/spring-boot-modules/spring-boot/README.MD @@ -22,7 +22,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [An Introduction to Kong](https://www.baeldung.com/kong) - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) - [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) -- [How to Define a Spring Boot Filter?](https://www.baeldung.com/spring-boot-add-filter) - [Spring Boot Exit Codes](https://www.baeldung.com/spring-boot-exit-codes) - [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) - [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java deleted file mode 100644 index aa794182de..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/FilterConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.bootcustomfilters; - -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.baeldung.bootcustomfilters.filters.RequestResponseLoggingFilter; - -@Configuration -public class FilterConfig { - - // uncomment this and comment the @Component in the filter class definition to register only for a url pattern - // @Bean - public FilterRegistrationBean loggingFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - - registrationBean.setFilter(new RequestResponseLoggingFilter()); - - registrationBean.addUrlPatterns("/users/*"); - - return registrationBean; - - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java deleted file mode 100644 index c4653932c0..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.bootcustomfilters; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Boot application - * @author hemant - * - */ -@SpringBootApplication -public class SpringBootFiltersApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringBootFiltersApplication.class, args); - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java deleted file mode 100644 index 97165f2cf3..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/controller/UserController.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.bootcustomfilters.controller; - -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -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 com.baeldung.bootcustomfilters.model.User; - -/** - * Rest controller for User - * @author hemant - * - */ -@RestController -@RequestMapping("/users") -public class UserController { - - private static final Logger LOG = LoggerFactory.getLogger(UserController.class); - - @GetMapping("") - public List getAllUsers() { - LOG.info("Fetching all the users"); - return Arrays.asList( - new User(UUID.randomUUID().toString(), "User1", "user1@test.com"), - new User(UUID.randomUUID().toString(), "User1", "user1@test.com"), - new User(UUID.randomUUID().toString(), "User1", "user1@test.com")); - } - -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java deleted file mode 100644 index e42ea7d2dd..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/RequestResponseLoggingFilter.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.bootcustomfilters.filters; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -/** - * A servlet filter to log request and response - * The logging implementation is pretty native and for demonstration only - * @author hemant - * - */ -@Component -@Order(2) -public class RequestResponseLoggingFilter implements Filter { - - private final static Logger LOG = LoggerFactory.getLogger(RequestResponseLoggingFilter.class); - - @Override - public void init(final FilterConfig filterConfig) throws ServletException { - LOG.info("Initializing filter :{}", this); - } - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) - throws IOException, ServletException { - HttpServletRequest req = (HttpServletRequest) request; - HttpServletResponse res = (HttpServletResponse) response; - LOG.info("Logging Request {} : {}", req.getMethod(), req.getRequestURI()); - chain.doFilter(request, response); - LOG.info("Logging Response :{}", res.getContentType()); - } - - @Override - public void destroy() { - LOG.warn("Destructing filter :{}", this); - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java deleted file mode 100644 index d92b723e73..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/filters/TransactionFilter.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.bootcustomfilters.filters; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -/** - * A filter to create transaction before and commit it once request completes - * The current implemenatation is just for demo - * @author hemant - * - */ -@Component -@Order(1) -public class TransactionFilter implements Filter { - - private final static Logger LOG = LoggerFactory.getLogger(TransactionFilter.class); - - @Override - public void init(final FilterConfig filterConfig) throws ServletException { - LOG.info("Initializing filter :{}", this); - } - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { - HttpServletRequest req = (HttpServletRequest) request; - LOG.info("Starting Transaction for req :{}", req.getRequestURI()); - chain.doFilter(request, response); - LOG.info("Committing Transaction for req :{}", req.getRequestURI()); - } - - @Override - public void destroy() { - LOG.warn("Destructing filter :{}", this); - } -} diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/model/User.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/model/User.java deleted file mode 100644 index ab8e6c8206..0000000000 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/bootcustomfilters/model/User.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.bootcustomfilters.model; - -/** - * User model - * @author hemant - * - */ -public class User { - - private String id; - private String name; - private String email; - - public User(String id, String name, String email) { - super(); - this.id = id; - this.name = name; - this.email = email; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - -} From 9c102b2b8723807d50eb9fceaae66dd7d641f923 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sat, 21 Mar 2020 16:27:30 +0100 Subject: [PATCH 139/530] JAVA-86: Remove spring-boot-exit-codes --- spring-boot-modules/spring-boot/README.MD | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-modules/spring-boot/README.MD b/spring-boot-modules/spring-boot/README.MD index 3397ad3b75..b15ab7dbe5 100644 --- a/spring-boot-modules/spring-boot/README.MD +++ b/spring-boot-modules/spring-boot/README.MD @@ -22,7 +22,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [An Introduction to Kong](https://www.baeldung.com/kong) - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) - [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) -- [Spring Boot Exit Codes](https://www.baeldung.com/spring-boot-exit-codes) - [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) - [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) - [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) From cd10d206daf8d032b313450ec56fb01c1f38d1b5 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sat, 21 Mar 2020 16:31:39 +0100 Subject: [PATCH 140/530] JAVA-86: Remove spring-boot-favicon --- spring-boot-modules/spring-boot-mvc/README.md | 1 - .../config/FaviconConfiguration.java | 44 ------------------ .../resources/com/baeldung/images/favicon.ico | Bin 15086 -> 0 bytes .../src/main/resources/favicon.ico | Bin 15086 -> 0 bytes .../src/main/resources/static/favicon.ico | Bin 15086 -> 0 bytes 5 files changed, 45 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-mvc/src/main/resources/com/baeldung/images/favicon.ico delete mode 100644 spring-boot-modules/spring-boot-mvc/src/main/resources/favicon.ico delete mode 100644 spring-boot-modules/spring-boot-mvc/src/main/resources/static/favicon.ico diff --git a/spring-boot-modules/spring-boot-mvc/README.md b/spring-boot-modules/spring-boot-mvc/README.md index 2e67c42ede..41b98063a6 100644 --- a/spring-boot-modules/spring-boot-mvc/README.md +++ b/spring-boot-modules/spring-boot-mvc/README.md @@ -4,7 +4,6 @@ This module contains articles about Spring Web MVC in Spring Boot projects. ### Relevant Articles: -- [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) - [Custom Validation MessageSource in Spring Boot](https://www.baeldung.com/spring-custom-validation-message-source) - [Display RSS Feed with Spring MVC](https://www.baeldung.com/spring-mvc-rss-feed) - [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao) diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java deleted file mode 100644 index 9a1f47b5cb..0000000000 --- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.springbootmvc.config; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; -import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; - -@Configuration -public class FaviconConfiguration { - @Bean - public SimpleUrlHandlerMapping myFaviconHandlerMapping() { - SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); - mapping.setOrder(Integer.MIN_VALUE); - mapping.setUrlMap(Collections.singletonMap("/favicon.ico", faviconRequestHandler())); - return mapping; - } - - @Bean - protected ResourceHttpRequestHandler faviconRequestHandler() { - ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler(); - ClassPathResource classPathResource = new ClassPathResource("com/baeldung/images"); - List locations = Arrays.asList(classPathResource); - requestHandler.setLocations(locations); - return requestHandler; - } - - // @Controller - static class FaviconController { - - @RequestMapping(value = "favicon.ico", method = RequestMethod.GET) - @ResponseBody - void favicon() { - } - } -} diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/com/baeldung/images/favicon.ico b/spring-boot-modules/spring-boot-mvc/src/main/resources/com/baeldung/images/favicon.ico deleted file mode 100644 index 64105ac11c6186e380a724416ceb77ab5c263fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/favicon.ico b/spring-boot-modules/spring-boot-mvc/src/main/resources/favicon.ico deleted file mode 100644 index 64105ac11c6186e380a724416ceb77ab5c263fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/static/favicon.ico b/spring-boot-modules/spring-boot-mvc/src/main/resources/static/favicon.ico deleted file mode 100644 index 64105ac11c6186e380a724416ceb77ab5c263fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 From 5e97741b072cf19eec9e7c7e33ae4ebae2366f53 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Sat, 21 Mar 2020 11:29:55 -0600 Subject: [PATCH 141/530] Revert "BAEL-3069 Spring jdbcTemplate Unit Testing" This reverts commit d4a928cdfac363353c293a7f0b0abcd936a77919. --- .../spring-persistence-simple/pom.xml | 7 --- .../baeldung/jdbc/EmployeeDAOUnitTest.java | 49 ------------------- 2 files changed, 56 deletions(-) delete mode 100644 persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml index 45605c853e..8a03310048 100644 --- a/persistence-modules/spring-persistence-simple/pom.xml +++ b/persistence-modules/spring-persistence-simple/pom.xml @@ -92,12 +92,6 @@ ${org.springframework.version} test - - org.mockito - mockito-core - ${mockito.version} - test - com.querydsl querydsl-jpa @@ -143,7 +137,6 @@ 9.0.0.M26 1.1 4.2.1 - 3.3.3 21.0 diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java deleted file mode 100644 index 9894801a53..0000000000 --- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.jdbc; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import javax.sql.DataSource; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; -import org.springframework.test.util.ReflectionTestUtils; - - -@RunWith(MockitoJUnitRunner.class) - -public class EmployeeDAOUnitTest { - - @Mock - JdbcTemplate jdbcTemplate; - - @Test - public void whenMockJdbcTemplate_thenReturnCorrectEmployeeCount() { - EmployeeDAO employeeDAO = new EmployeeDAO(); - ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate); - Mockito.when(jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class)) - .thenReturn(4); - assertEquals(4, employeeDAO.getCountOfEmployees()); - - Mockito.when(jdbcTemplate.queryForObject(Mockito.anyString(), Mockito.eq(Integer.class))) - .thenReturn(3); - assertEquals(3, employeeDAO.getCountOfEmployees()); - } - - @Test - public void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount() { - DataSource dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) - .addScript("classpath:jdbc/schema.sql") - .addScript("classpath:jdbc/test-data.sql") - .build(); - EmployeeDAO employeeDAO = new EmployeeDAO(); - employeeDAO.setDataSource(dataSource); - assertEquals(4, employeeDAO.getCountOfEmployees()); - } - -} From c986147850ef773d8bfeb6cfac18256368adf683 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Sat, 21 Mar 2020 11:50:07 -0600 Subject: [PATCH 142/530] BAEL-3069 Spring jdbcTemplate Unit Testing. Create a new module for this article. --- .../spring-persistence-simple-1/.gitignore | 13 ++++ .../spring-persistence-simple-1/pom.xml | 60 +++++++++++++++++++ .../main/java/com/baeldung/jdbc/Employee.java | 44 ++++++++++++++ .../java/com/baeldung/jdbc/EmployeeDAO.java | 21 +++++++ .../src/main/resources/jdbc/schema.sql | 7 +++ .../src/main/resources/jdbc/test-data.sql | 4 ++ .../baeldung/jdbc/EmployeeDAOUnitTest.java | 47 +++++++++++++++ 7 files changed, 196 insertions(+) create mode 100644 persistence-modules/spring-persistence-simple-1/.gitignore create mode 100644 persistence-modules/spring-persistence-simple-1/pom.xml create mode 100644 persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/Employee.java create mode 100644 persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/EmployeeDAO.java create mode 100644 persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/schema.sql create mode 100644 persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/test-data.sql create mode 100644 persistence-modules/spring-persistence-simple-1/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java diff --git a/persistence-modules/spring-persistence-simple-1/.gitignore b/persistence-modules/spring-persistence-simple-1/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/persistence-modules/spring-persistence-simple-1/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple-1/pom.xml b/persistence-modules/spring-persistence-simple-1/pom.xml new file mode 100644 index 0000000000..a60db4b9e1 --- /dev/null +++ b/persistence-modules/spring-persistence-simple-1/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + spring-persistence-simple-1 + 0.1-SNAPSHOT + spring-persistence-simple-1 + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + + org.springframework + spring-orm + ${org.springframework.version} + + + org.springframework + spring-context + ${org.springframework.version} + + + + + com.h2database + h2 + ${h2.version} + test + + + + + org.springframework + spring-test + ${org.springframework.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + + + + 5.2.4.RELEASE + + 1.4.200 + + 3.3.3 + + + \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/Employee.java b/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/Employee.java new file mode 100644 index 0000000000..a43eb265c7 --- /dev/null +++ b/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/Employee.java @@ -0,0 +1,44 @@ +package com.baeldung.jdbc; + +public class Employee { + private int id; + + private String firstName; + + private String lastName; + + private String address; + + public int getId() { + return id; + } + + public void setId(final int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(final String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(final String lastName) { + this.lastName = lastName; + } + + public String getAddress() { + return address; + } + + public void setAddress(final String address) { + this.address = address; + } + +} diff --git a/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/EmployeeDAO.java new file mode 100644 index 0000000000..a7adb7933a --- /dev/null +++ b/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -0,0 +1,21 @@ +package com.baeldung.jdbc; + +import javax.sql.DataSource; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class EmployeeDAO { + private JdbcTemplate jdbcTemplate; + + public void setDataSource(final DataSource dataSource) { + jdbcTemplate = new JdbcTemplate(dataSource); + } + + public int getCountOfEmployees() { + return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class); + } + + +} diff --git a/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/schema.sql b/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/schema.sql new file mode 100644 index 0000000000..3401c5d963 --- /dev/null +++ b/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/schema.sql @@ -0,0 +1,7 @@ +CREATE TABLE EMPLOYEE +( + ID int NOT NULL PRIMARY KEY, + FIRST_NAME varchar(255), + LAST_NAME varchar(255), + ADDRESS varchar(255) +); \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/test-data.sql b/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/test-data.sql new file mode 100644 index 0000000000..c1669c156d --- /dev/null +++ b/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/test-data.sql @@ -0,0 +1,4 @@ +INSERT INTO EMPLOYEE VALUES (1, 'James', 'Gosling', 'Canada'); +INSERT INTO EMPLOYEE VALUES (2, 'Donald', 'Knuth', 'USA'); +INSERT INTO EMPLOYEE VALUES (3, 'Linus', 'Torvalds', 'Finland'); +INSERT INTO EMPLOYEE VALUES (4, 'Dennis', 'Ritchie', 'USA'); \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple-1/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple-1/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java new file mode 100644 index 0000000000..a64ba9b2f0 --- /dev/null +++ b/persistence-modules/spring-persistence-simple-1/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.jdbc; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import javax.sql.DataSource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.util.ReflectionTestUtils; + + +@RunWith(MockitoJUnitRunner.class) + +public class EmployeeDAOUnitTest { + @Mock + JdbcTemplate jdbcTemplate; + + @Test + public void whenMockJdbcTemplate_thenReturnCorrectEmployeeCount() { + EmployeeDAO employeeDAO = new EmployeeDAO(); + ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate); + Mockito.when(jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class)) + .thenReturn(4); + assertEquals(4, employeeDAO.getCountOfEmployees()); + + Mockito.when(jdbcTemplate.queryForObject(Mockito.anyString(), Mockito.eq(Integer.class))) + .thenReturn(3); + assertEquals(3, employeeDAO.getCountOfEmployees()); + } + + @Test + public void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount() { + DataSource dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) + .addScript("classpath:jdbc/schema.sql") + .addScript("classpath:jdbc/test-data.sql") + .build(); + EmployeeDAO employeeDAO = new EmployeeDAO(); + employeeDAO.setDataSource(dataSource); + assertEquals(4, employeeDAO.getCountOfEmployees()); + } +} From 9f3c94929a1a761146e372c73a4c8dbd7fb4b6ec Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Sat, 21 Mar 2020 11:57:30 -0600 Subject: [PATCH 143/530] BAEL-3069 Rename the folder name to spring-persistence-simple-2 --- .../.gitignore | 0 .../pom.xml | 4 ++-- .../src/main/java/com/baeldung/jdbc/Employee.java | 0 .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 0 .../src/main/resources/jdbc/schema.sql | 0 .../src/main/resources/jdbc/test-data.sql | 0 .../src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java | 0 7 files changed, 2 insertions(+), 2 deletions(-) rename persistence-modules/{spring-persistence-simple-1 => spring-persistence-simple-2}/.gitignore (100%) rename persistence-modules/{spring-persistence-simple-1 => spring-persistence-simple-2}/pom.xml (94%) rename persistence-modules/{spring-persistence-simple-1 => spring-persistence-simple-2}/src/main/java/com/baeldung/jdbc/Employee.java (100%) rename persistence-modules/{spring-persistence-simple-1 => spring-persistence-simple-2}/src/main/java/com/baeldung/jdbc/EmployeeDAO.java (100%) rename persistence-modules/{spring-persistence-simple-1 => spring-persistence-simple-2}/src/main/resources/jdbc/schema.sql (100%) rename persistence-modules/{spring-persistence-simple-1 => spring-persistence-simple-2}/src/main/resources/jdbc/test-data.sql (100%) rename persistence-modules/{spring-persistence-simple-1 => spring-persistence-simple-2}/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java (100%) diff --git a/persistence-modules/spring-persistence-simple-1/.gitignore b/persistence-modules/spring-persistence-simple-2/.gitignore similarity index 100% rename from persistence-modules/spring-persistence-simple-1/.gitignore rename to persistence-modules/spring-persistence-simple-2/.gitignore diff --git a/persistence-modules/spring-persistence-simple-1/pom.xml b/persistence-modules/spring-persistence-simple-2/pom.xml similarity index 94% rename from persistence-modules/spring-persistence-simple-1/pom.xml rename to persistence-modules/spring-persistence-simple-2/pom.xml index a60db4b9e1..8380d635de 100644 --- a/persistence-modules/spring-persistence-simple-1/pom.xml +++ b/persistence-modules/spring-persistence-simple-2/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - spring-persistence-simple-1 + spring-persistence-simple-2 0.1-SNAPSHOT - spring-persistence-simple-1 + spring-persistence-simple-2 com.baeldung diff --git a/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/Employee.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java similarity index 100% rename from persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/Employee.java rename to persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java diff --git a/persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java similarity index 100% rename from persistence-modules/spring-persistence-simple-1/src/main/java/com/baeldung/jdbc/EmployeeDAO.java rename to persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java diff --git a/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/schema.sql b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql similarity index 100% rename from persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/schema.sql rename to persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql diff --git a/persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/test-data.sql b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql similarity index 100% rename from persistence-modules/spring-persistence-simple-1/src/main/resources/jdbc/test-data.sql rename to persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql diff --git a/persistence-modules/spring-persistence-simple-1/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java similarity index 100% rename from persistence-modules/spring-persistence-simple-1/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java rename to persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java From 5c78f8891300821584b31748a41a17c40bbfb253 Mon Sep 17 00:00:00 2001 From: mikr Date: Sat, 21 Mar 2020 21:43:32 +0100 Subject: [PATCH 144/530] JAVA-877 Update redirect after login --- .../baeldung/spring/MyUserDetailsService.java | 32 +++++++++++++ .../baeldung/spring/SecSecurityConfig.java | 47 +++++++------------ 2 files changed, 50 insertions(+), 29 deletions(-) create mode 100644 spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/MyUserDetailsService.java diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/MyUserDetailsService.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/MyUserDetailsService.java new file mode 100644 index 0000000000..43eb39e927 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/MyUserDetailsService.java @@ -0,0 +1,32 @@ +package org.baeldung.spring; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.*; + +@Service +public class MyUserDetailsService implements UserDetailsService { + + private Map roles = new HashMap<>(); + + @PostConstruct + public void init() { + roles.put("admin", new User("admin", "{noop}admin1", getAuthority("ROLE_ADMIN"))); + roles.put("user", new User("user", "{noop}user1", getAuthority("ROLE_USER"))); + } + + @Override + public UserDetails loadUserByUsername(String username) { + return roles.get(username); + } + + private List getAuthority(String role) { + return Collections.singletonList(new SimpleGrantedAuthority(role)); + } +} \ No newline at end of file diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java index ebe23950a7..fe00e6943b 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java @@ -1,11 +1,9 @@ package org.baeldung.spring; import org.baeldung.security.MySimpleUrlAuthenticationSuccessHandler; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @@ -15,7 +13,7 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand //@ImportResource({ "classpath:webSecurityConfig.xml" }) @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { - + public SecSecurityConfig() { super(); } @@ -26,43 +24,34 @@ public class SecSecurityConfig extends WebSecurityConfigurerAdapter { return super.authenticationManagerBean(); } - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - // @formatter:off - auth.inMemoryAuthentication() - .withUser("user1").password("{noop}user1Pass").roles("USER") - .and() - .withUser("admin1").password("{noop}admin1Pass").roles("ADMIN"); - // @formatter:on - } - @Override protected void configure(final HttpSecurity http) throws Exception { // @formatter:off - http.authorizeRequests() - .antMatchers("/anonymous*").anonymous() - .antMatchers("/login*").permitAll() - .anyRequest().authenticated() - + http + .authorizeRequests() + .antMatchers("/anonymous*").anonymous() + .antMatchers("/login*").permitAll() + .anyRequest().authenticated() + .and() .formLogin() - .loginPage("/login.html") - .loginProcessingUrl("/login") - .successHandler(myAuthenticationSuccessHandler()) - .failureUrl("/login.html?error=true") - + .loginPage("/login.html") + .loginProcessingUrl("/login") + .successHandler(myAuthenticationSuccessHandler()) + .failureUrl("/login.html?error=true") + .and() - .logout().deleteCookies("JSESSIONID") - + .logout().deleteCookies("JSESSIONID") + .and() - .rememberMe().key("uniqueAndSecret").tokenValiditySeconds(86400) - + .rememberMe().key("uniqueAndSecret").tokenValiditySeconds(86400) + .and() - .csrf().disable() + .csrf().disable() ; // @formatter:on } - + @Bean public AuthenticationSuccessHandler myAuthenticationSuccessHandler(){ return new MySimpleUrlAuthenticationSuccessHandler(); From ee8d7adb8eacbaef4dcff5fda9db9208158455de Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sun, 22 Mar 2020 07:24:38 +0530 Subject: [PATCH 145/530] formatted pom.xml file --- aws-reactive/pom.xml | 11 +-- .../pom.xml | 82 ++++++++-------- core-kotlin-modules/pom.xml | 6 +- core-scala/pom.xml | 7 +- couchbase/pom.xml | 6 +- custom-pmd/pom.xml | 6 +- dagger/pom.xml | 8 +- data-structures/pom.xml | 6 +- ddd-modules/infrastructure/pom.xml | 6 +- ddd-modules/mainapp/pom.xml | 6 +- ddd-modules/ordercontext/pom.xml | 6 +- ddd-modules/pom.xml | 6 +- ddd-modules/sharedkernel/pom.xml | 6 +- ddd-modules/shippingcontext/pom.xml | 6 +- ddd/pom.xml | 12 ++- deeplearning4j/pom.xml | 6 +- disruptor/pom.xml | 6 +- dozer/pom.xml | 6 +- drools/pom.xml | 6 +- dropwizard/pom.xml | 10 +- dubbo/pom.xml | 6 +- ethereum/pom.xml | 6 +- feign/pom.xml | 6 +- flyway-cdi-extension/pom.xml | 7 +- geotools/pom.xml | 7 +- google-cloud/pom.xml | 6 +- google-web-toolkit/pom.xml | 18 ++-- graphql/graphql-java/pom.xml | 6 +- grpc/pom.xml | 6 +- gson/pom.xml | 7 +- guava-collections/pom.xml | 6 +- guava/pom.xml | 6 +- guice/pom.xml | 6 +- hazelcast/pom.xml | 8 +- .../app-auth-form-store-ldap/pom.xml | 15 +-- machine-learning/pom.xml | 40 ++++---- .../maven-custom-plugin/usage-example/pom.xml | 17 ++-- .../resources/archetype-resources/pom.xml | 30 +++--- .../userdaomodule/pom.xml | 16 ++-- ninja/pom.xml | 96 ++++++++++--------- .../spring-boot-springdoc/pom.xml | 17 ++-- .../spring-zuul-post-filter/pom.xml | 14 +-- 42 files changed, 314 insertions(+), 246 deletions(-) diff --git a/aws-reactive/pom.xml b/aws-reactive/pom.xml index 950b3f373a..d4f0e5e231 100644 --- a/aws-reactive/pom.xml +++ b/aws-reactive/pom.xml @@ -16,12 +16,6 @@ aws-reactive AWS Reactive Sample - - 1.8 - 2.2.1.RELEASE - 2.10.27 - - @@ -105,4 +99,9 @@
+ + 1.8 + 2.2.1.RELEASE + 2.10.27 + diff --git a/core-java-modules/core-java-concurrency-collections-2/pom.xml b/core-java-modules/core-java-concurrency-collections-2/pom.xml index 0e5310b9da..65a91c9a9c 100644 --- a/core-java-modules/core-java-concurrency-collections-2/pom.xml +++ b/core-java-modules/core-java-concurrency-collections-2/pom.xml @@ -1,43 +1,47 @@ - - 4.0.0 - com.baeldung.concurrent.lock - core-java-concurrency-collections-2 - 0.0.1-SNAPSHOT + + 4.0.0 + com.baeldung.concurrent.lock + core-java-concurrency-collections-2 + 0.0.1-SNAPSHOT - - 1.21 - 28.2-jre - + + + com.google.guava + guava + ${guava.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + - - - com.google.guava - guava - ${guava.version} - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - + + + src + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + + + 1.21 + 28.2-jre + - - - src - - - maven-compiler-plugin - 3.8.0 - - 1.8 - 1.8 - - - - \ No newline at end of file diff --git a/core-kotlin-modules/pom.xml b/core-kotlin-modules/pom.xml index 24bdc189be..de41aecf73 100644 --- a/core-kotlin-modules/pom.xml +++ b/core-kotlin-modules/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.core-kotlin-modules core-kotlin-modules diff --git a/core-scala/pom.xml b/core-scala/pom.xml index d72727dd39..f6d61da1c3 100644 --- a/core-scala/pom.xml +++ b/core-scala/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 core-scala 1.0-SNAPSHOT @@ -52,4 +54,3 @@ 3.3.2 - diff --git a/couchbase/pom.xml b/couchbase/pom.xml index f4e98b32ba..34e2832e55 100644 --- a/couchbase/pom.xml +++ b/couchbase/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 couchbase 0.1-SNAPSHOT diff --git a/custom-pmd/pom.xml b/custom-pmd/pom.xml index a011b6a121..e0f38199ec 100644 --- a/custom-pmd/pom.xml +++ b/custom-pmd/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.pmd custom-pmd diff --git a/dagger/pom.xml b/dagger/pom.xml index 528a5383c6..e9410ceb63 100644 --- a/dagger/pom.xml +++ b/dagger/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 dagger dagger @@ -44,4 +46,4 @@ 2.16 - \ No newline at end of file + diff --git a/data-structures/pom.xml b/data-structures/pom.xml index 4468f3d21f..e2d2e23090 100644 --- a/data-structures/pom.xml +++ b/data-structures/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 data-structures 0.0.1-SNAPSHOT diff --git a/ddd-modules/infrastructure/pom.xml b/ddd-modules/infrastructure/pom.xml index 72ec263745..c301eaa92a 100644 --- a/ddd-modules/infrastructure/pom.xml +++ b/ddd-modules/infrastructure/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.dddmodules.infrastructure infrastructure diff --git a/ddd-modules/mainapp/pom.xml b/ddd-modules/mainapp/pom.xml index ae1057f307..a048263d37 100644 --- a/ddd-modules/mainapp/pom.xml +++ b/ddd-modules/mainapp/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.dddmodules.mainapp mainapp diff --git a/ddd-modules/ordercontext/pom.xml b/ddd-modules/ordercontext/pom.xml index 6a921d2408..abd166fb69 100644 --- a/ddd-modules/ordercontext/pom.xml +++ b/ddd-modules/ordercontext/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.dddmodules.ordercontext ordercontext diff --git a/ddd-modules/pom.xml b/ddd-modules/pom.xml index 65bc204988..38e48ff27d 100644 --- a/ddd-modules/pom.xml +++ b/ddd-modules/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.dddmodules dddmodules diff --git a/ddd-modules/sharedkernel/pom.xml b/ddd-modules/sharedkernel/pom.xml index 3b5d8bb71f..a61f03a494 100644 --- a/ddd-modules/sharedkernel/pom.xml +++ b/ddd-modules/sharedkernel/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.dddmodules.sharedkernel sharedkernel diff --git a/ddd-modules/shippingcontext/pom.xml b/ddd-modules/shippingcontext/pom.xml index 060f4fe5bf..2096923f90 100644 --- a/ddd-modules/shippingcontext/pom.xml +++ b/ddd-modules/shippingcontext/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.dddmodules.shippingcontext shippingcontext diff --git a/ddd/pom.xml b/ddd/pom.xml index f27f1d24a9..7f3c417b71 100644 --- a/ddd/pom.xml +++ b/ddd/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.ddd ddd @@ -21,8 +23,8 @@ spring-boot-starter-data-mongodb - org.springframework.boot - spring-boot-starter-data-cassandra + org.springframework.boot + spring-boot-starter-data-cassandra org.junit.jupiter @@ -97,4 +99,4 @@ 2.0.6.RELEASE - \ No newline at end of file + diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml index c143b86ff8..c8fa18cbd4 100644 --- a/deeplearning4j/pom.xml +++ b/deeplearning4j/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.deeplearning4j deeplearning4j diff --git a/disruptor/pom.xml b/disruptor/pom.xml index 94be78fad6..31fc28986b 100644 --- a/disruptor/pom.xml +++ b/disruptor/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 disruptor 0.1.0-SNAPSHOT diff --git a/dozer/pom.xml b/dozer/pom.xml index e307354603..0fdf7f6fba 100644 --- a/dozer/pom.xml +++ b/dozer/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 dozer 1.0 diff --git a/drools/pom.xml b/drools/pom.xml index b4421ff2e3..e0a7b52938 100644 --- a/drools/pom.xml +++ b/drools/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 drools drools diff --git a/dropwizard/pom.xml b/dropwizard/pom.xml index ddc9aa1949..c3e1a4e841 100644 --- a/dropwizard/pom.xml +++ b/dropwizard/pom.xml @@ -1,7 +1,8 @@ - + 4.0.0 dropwizard 0.0.1-SNAPSHOT @@ -48,8 +49,7 @@ - + com.baeldung.dropwizard.introduction.IntroductionApplication diff --git a/dubbo/pom.xml b/dubbo/pom.xml index 9a7aceb9e5..cca1b3a3d1 100644 --- a/dubbo/pom.xml +++ b/dubbo/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 dubbo dubbo diff --git a/ethereum/pom.xml b/ethereum/pom.xml index 8c7e4c8c4c..5953195123 100644 --- a/ethereum/pom.xml +++ b/ethereum/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.ethereum ethereum diff --git a/feign/pom.xml b/feign/pom.xml index 6dc8e7bafa..4b994be1f2 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.feign feign diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml index 8f7d058db7..566eed95d8 100644 --- a/flyway-cdi-extension/pom.xml +++ b/flyway-cdi-extension/pom.xml @@ -1,7 +1,8 @@ - + 4.0.0 flyway-cdi-extension 1.0-SNAPSHOT diff --git a/geotools/pom.xml b/geotools/pom.xml index 71489bdf94..46913daa69 100644 --- a/geotools/pom.xml +++ b/geotools/pom.xml @@ -1,7 +1,8 @@ - + 4.0.0 geotools 0.0.1-SNAPSHOT diff --git a/google-cloud/pom.xml b/google-cloud/pom.xml index 15f7f5c824..1e474b5dd0 100644 --- a/google-cloud/pom.xml +++ b/google-cloud/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 google-cloud 0.1-SNAPSHOT diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml index 37e423b3af..6fdcae4f75 100644 --- a/google-web-toolkit/pom.xml +++ b/google-web-toolkit/pom.xml @@ -1,7 +1,8 @@ - + 4.0.0 google-web-toolkit @@ -53,8 +54,7 @@ - + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes @@ -76,8 +76,7 @@ com.baeldung.Google_web_toolkit Google_web_toolkit true - + ${maven.compiler.source} @@ -109,9 +108,8 @@ - + 1.8 1.8 diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml index 793a02458a..30bfbf555a 100644 --- a/graphql/graphql-java/pom.xml +++ b/graphql/graphql-java/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.graphql graphql-java diff --git a/grpc/pom.xml b/grpc/pom.xml index c7ae111da3..5e1c0bb28b 100644 --- a/grpc/pom.xml +++ b/grpc/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 grpc 0.0.1-SNAPSHOT diff --git a/gson/pom.xml b/gson/pom.xml index f2ed5509fa..0de9a6a533 100644 --- a/gson/pom.xml +++ b/gson/pom.xml @@ -1,7 +1,8 @@ - + 4.0.0 gson 0.1-SNAPSHOT diff --git a/guava-collections/pom.xml b/guava-collections/pom.xml index 9002ac2b91..c6019362c5 100644 --- a/guava-collections/pom.xml +++ b/guava-collections/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 guava-collections 0.1.0-SNAPSHOT diff --git a/guava/pom.xml b/guava/pom.xml index 3f07b77b0b..df6d57bd09 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 guava 0.1.0-SNAPSHOT diff --git a/guice/pom.xml b/guice/pom.xml index d119bbf78e..6bbad6dddc 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.examples.guice guice diff --git a/hazelcast/pom.xml b/hazelcast/pom.xml index 10234bb81f..287542be33 100644 --- a/hazelcast/pom.xml +++ b/hazelcast/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 hazelcast 0.0.1-SNAPSHOT @@ -32,7 +34,7 @@ - + 0.6 diff --git a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml index a2d9443d67..f8d19b5750 100644 --- a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml +++ b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml @@ -1,7 +1,8 @@ - + 4.0.0 app-auth-form-store-ldap app-auth-form-store-ldap @@ -12,10 +13,6 @@ java-ee-8-security-api 1.0-SNAPSHOT - - - 4.0.4 - @@ -52,4 +49,8 @@ + + 4.0.4 + + diff --git a/machine-learning/pom.xml b/machine-learning/pom.xml index 24162b7b9c..99b7e33579 100644 --- a/machine-learning/pom.xml +++ b/machine-learning/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 machine-learning 1.0-SNAPSHOT @@ -13,23 +15,6 @@ 1.0.0-SNAPSHOT - - UTF-8 - 1.7 - 1.7 - 1.3.50 - 0.9.1 - 3.1.0 - 3.0.2 - 3.0.2 - 3.8.0 - 2.22.1 - 2.5.2 - 2.8.2 - 3.7.1 - 3.0.0 - - org.jetbrains.kotlin @@ -158,4 +143,21 @@ + + UTF-8 + 1.7 + 1.7 + 1.3.50 + 0.9.1 + 3.1.0 + 3.0.2 + 3.0.2 + 3.8.0 + 2.22.1 + 2.5.2 + 2.8.2 + 3.7.1 + 3.0.0 + + diff --git a/maven-all/maven-custom-plugin/usage-example/pom.xml b/maven-all/maven-custom-plugin/usage-example/pom.xml index bd2b16475e..ef6f08a3fb 100644 --- a/maven-all/maven-custom-plugin/usage-example/pom.xml +++ b/maven-all/maven-custom-plugin/usage-example/pom.xml @@ -1,18 +1,14 @@ - + 4.0.0 com.baeldung example 0.0.1-SNAPSHOT pom - - 3.9 - 4.12 - - org.apache.commons @@ -47,4 +43,9 @@ + + 3.9 + 4.12 + + diff --git a/maven-archetype/src/main/resources/archetype-resources/pom.xml b/maven-archetype/src/main/resources/archetype-resources/pom.xml index 2a73687e2c..fc568349bc 100644 --- a/maven-archetype/src/main/resources/archetype-resources/pom.xml +++ b/maven-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,23 +1,13 @@ - + 4.0.0 ${groupId} ${artifactId} ${version} war - - UTF-8 - 1.8 - 1.8 - false - ${liberty-plugin-version} - 9080 - 9443 - 2.0 - 2.1 - - ${artifactId} @@ -80,4 +70,16 @@ + + UTF-8 + 1.8 + 1.8 + false + ${liberty-plugin-version} + 9080 + 9443 + 2.0 + 2.1 + + diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml b/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml index cfa59bdc39..cf6ea85cb5 100644 --- a/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml +++ b/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 com.baeldung.userdaomodule userdaomodule @@ -14,11 +16,6 @@ 1.0 - - 1.0 - 1.0 - - com.baeldung.entitymodule @@ -37,4 +34,9 @@ + + 1.0 + 1.0 + + diff --git a/ninja/pom.xml b/ninja/pom.xml index afb1d509b8..9b80dc26c8 100644 --- a/ninja/pom.xml +++ b/ninja/pom.xml @@ -1,6 +1,8 @@ - + 4.0.0 ninja @@ -10,19 +12,34 @@ http://www.ninjaframework.org - - 6.5.0 - 9.4.18.v20190429 - 3.3.4 - 2.1.3 - 1.4.186 - 3.2 - 1.8 - 1.8 - 1.3.1 - 2.8.2 - 2.2 - + + + org.webjars + bootstrap + ${bootstrap.version} + + + org.webjars + jquery + ${jquery.version} + + + com.h2database + h2 + ${h2.version} + + + org.ninjaframework + ninja-standalone + ${ninja.version} + + + org.ninjaframework + ninja-test-utilities + ${ninja.version} + test + + @@ -131,10 +148,8 @@ - - + + ninja.standalone.NinjaJetty @@ -161,32 +176,19 @@
- - - org.webjars - bootstrap - ${bootstrap.version} - - - org.webjars - jquery - ${jquery.version} - - - com.h2database - h2 - ${h2.version} - - - org.ninjaframework - ninja-standalone - ${ninja.version} - - - org.ninjaframework - ninja-test-utilities - ${ninja.version} - test - - + + + 6.5.0 + 9.4.18.v20190429 + 3.3.4 + 2.1.3 + 1.4.186 + 3.2 + 1.8 + 1.8 + 1.3.1 + 2.8.2 + 2.2 + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml index fd8a9e71ae..c99a9c2b24 100644 --- a/spring-boot-modules/spring-boot-springdoc/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc/pom.xml @@ -1,7 +1,8 @@ - + 4.0.0 spring-boot-springdoc 0.0.1-SNAPSHOT @@ -16,11 +17,6 @@ ../../parent-boot-2 - - 1.8 - 1.2.32 - - org.springframework.boot @@ -63,6 +59,11 @@ + + 1.8 + 1.2.32 + + integration diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml index c13aeb890e..8643309645 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml @@ -1,7 +1,8 @@ - + spring-cloud-zuul com.baeldung.spring.cloud @@ -10,10 +11,6 @@ 4.0.0 spring-zuul-post-filter - - Hoxton.SR1 - - org.springframework.cloud @@ -21,5 +18,8 @@ + + Hoxton.SR1 + \ No newline at end of file From 73a571e395cf174dfa44e6355d6301bfc6a614dc Mon Sep 17 00:00:00 2001 From: maryarm <45322329+maryarm@users.noreply.github.com> Date: Sun, 22 Mar 2020 07:00:43 +0430 Subject: [PATCH 146/530] KTLN-18: Kotlin Microservice With Spring Boot (#8913) --- spring-reactive-kotlin/pom.xml | 87 +++++++++++++++++++ .../HealthTrackerApplication.kt | 11 +++ .../config/DBConfiguration.kt | 28 ++++++ .../controller/HealthRecordController.kt | 44 ++++++++++ .../controller/ProfileController.kt | 15 ++++ .../model/AverageHealthStatus.kt | 3 + .../bootmicroservice/model/HealthRecord.kt | 8 ++ .../bootmicroservice/model/Profile.kt | 8 ++ .../repository/HealthRecordRepository.kt | 13 +++ .../repository/ProfileRepository.kt | 8 ++ .../src/main/resources/application.yml | 1 + .../controller/ProfileControllerTest.kt | 51 +++++++++++ 12 files changed, 277 insertions(+) create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/HealthTrackerApplication.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/config/DBConfiguration.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/HealthRecordController.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/ProfileController.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/AverageHealthStatus.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/HealthRecord.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/Profile.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/HealthRecordRepository.kt create mode 100644 spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/ProfileRepository.kt create mode 100644 spring-reactive-kotlin/src/main/resources/application.yml create mode 100644 spring-reactive-kotlin/src/test/kotlin/com/baeldung/bootmicroservice/controller/ProfileControllerTest.kt diff --git a/spring-reactive-kotlin/pom.xml b/spring-reactive-kotlin/pom.xml index 3a693837df..cbb143f6ec 100644 --- a/spring-reactive-kotlin/pom.xml +++ b/spring-reactive-kotlin/pom.xml @@ -5,6 +5,7 @@ spring-reactive-kotlin spring-reactive-kotlin Demo project for Spring Boot + jar @@ -23,6 +24,18 @@ org.springframework.boot spring-boot-starter-webflux + + org.springframework.boot.experimental + spring-boot-starter-data-r2dbc + + + org.springframework.boot + spring-boot-starter-actuator + + + io.r2dbc + r2dbc-h2 + com.fasterxml.jackson.module jackson-module-kotlin @@ -38,21 +51,95 @@ reactor-test test + + + org.springframework.boot.experimental + spring-boot-test-autoconfigure-r2dbc + test + + + io.projectreactor + reactor-test + test + + + + + + org.springframework.boot.experimental + spring-boot-bom-r2dbc + 0.1.0.M3 + pom + import + + + + + src/main/kotlin + src/test/kotlin kotlin-maven-plugin + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + org.jetbrains.kotlin ${kotlin.version} -Xjsr305=strict + 1.8 + + spring + jpa + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-maven-noarg + ${kotlin.version} + + + + 1.8 + 1.3.70 + 2.2.5.RELEASE + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + + diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/HealthTrackerApplication.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/HealthTrackerApplication.kt new file mode 100644 index 0000000000..c70057b5de --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/HealthTrackerApplication.kt @@ -0,0 +1,11 @@ +package com.baeldung.bootmicroservice + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class HealthTrackerApplication + +fun main(args: Array) { + runApplication(*args) +} diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/config/DBConfiguration.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/config/DBConfiguration.kt new file mode 100644 index 0000000000..b14682cc5c --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/config/DBConfiguration.kt @@ -0,0 +1,28 @@ +package com.baeldung.bootmicroservice.config; + +import org.springframework.context.annotation.Configuration +import org.springframework.data.r2dbc.core.DatabaseClient + +@Configuration +class DBConfiguration(db: DatabaseClient) { + init { + val initDb = db.execute { + """ CREATE TABLE IF NOT EXISTS profile ( + id SERIAL PRIMARY KEY, + first_name VARCHAR(20) NOT NULL, + last_name VARCHAR(20) NOT NULL, + birth_date DATE NOT NULL + ); + CREATE TABLE IF NOT EXISTS health_record( + id SERIAL PRIMARY KEY, + profile_id LONG NOT NULL, + temperature DECIMAL NOT NULL, + blood_pressure DECIMAL NOT NULL, + heart_rate DECIMAL, + date DATE NOT NULL + ); + """ + } + initDb.then().subscribe() + } +} diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/HealthRecordController.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/HealthRecordController.kt new file mode 100644 index 0000000000..620f187b7b --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/HealthRecordController.kt @@ -0,0 +1,44 @@ +package com.baeldung.bootmicroservice.controller + +import com.baeldung.bootmicroservice.model.AverageHealthStatus +import com.baeldung.bootmicroservice.model.HealthRecord +import com.baeldung.bootmicroservice.repository.HealthRecordRepository +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RestController +import reactor.core.publisher.Mono + +@RestController +class HealthRecordController(val repository: HealthRecordRepository) { + + @PostMapping("/health/{profileId}/record") + fun storeHealthRecord(@PathVariable("profileId") profileId: Long, @RequestBody record: HealthRecord): Mono = + repository.save(HealthRecord(null + , profileId + , record.temperature + , record.bloodPressure + , record.heartRate + , record.date)) + + @GetMapping("/health/{profileId}/avg") + fun fetchHealthRecordAverage(@PathVariable("profileId") profileId: Long): Mono = + repository.findByProfileId(profileId) + .reduce( + AverageHealthStatus(0, 0.0, 0.0, 0.0) + , { s, r -> + AverageHealthStatus(s.cnt + 1 + , s.temperature + r.temperature + , s.bloodPressure + r.bloodPressure + , s.heartRate + r.heartRate + ) + } + ).map { s -> + AverageHealthStatus(s.cnt + , if (s.cnt != 0) s.temperature / s.cnt else 0.0 + , if (s.cnt != 0) s.bloodPressure / s.cnt else 0.0 + , if (s.cnt != 0) s.heartRate / s.cnt else 0.0) + } + +} \ No newline at end of file diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/ProfileController.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/ProfileController.kt new file mode 100644 index 0000000000..1dc3bcdc50 --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/controller/ProfileController.kt @@ -0,0 +1,15 @@ +package com.baeldung.bootmicroservice.controller + +import com.baeldung.bootmicroservice.model.Profile +import com.baeldung.bootmicroservice.repository.ProfileRepository +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RestController +import reactor.core.publisher.Mono + +@RestController +class ProfileController(val repository: ProfileRepository) { + + @PostMapping("/profile") + fun save(@RequestBody profile: Profile): Mono = repository.save(profile) +} \ No newline at end of file diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/AverageHealthStatus.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/AverageHealthStatus.kt new file mode 100644 index 0000000000..3141146b9c --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/AverageHealthStatus.kt @@ -0,0 +1,3 @@ +package com.baeldung.bootmicroservice.model; + +class AverageHealthStatus(var cnt: Int, var temperature: Double, var bloodPressure: Double, var heartRate: Double) diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/HealthRecord.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/HealthRecord.kt new file mode 100644 index 0000000000..71c534027f --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/HealthRecord.kt @@ -0,0 +1,8 @@ +package com.baeldung.bootmicroservice.model + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table +import java.time.LocalDate + +@Table +data class HealthRecord(@Id var id: Long?, var profileId: Long?, var temperature: Double, var bloodPressure: Double, var heartRate: Double, var date: LocalDate) \ No newline at end of file diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/Profile.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/Profile.kt new file mode 100644 index 0000000000..cbb7e675ea --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/model/Profile.kt @@ -0,0 +1,8 @@ +package com.baeldung.bootmicroservice.model + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table +import java.time.LocalDateTime + +@Table +data class Profile(@Id var id:Long?, var firstName : String, var lastName : String, var birthDate: LocalDateTime) \ No newline at end of file diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/HealthRecordRepository.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/HealthRecordRepository.kt new file mode 100644 index 0000000000..8cc91f06e4 --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/HealthRecordRepository.kt @@ -0,0 +1,13 @@ +package com.baeldung.bootmicroservice.repository + +import com.baeldung.bootmicroservice.model.HealthRecord +import org.springframework.data.r2dbc.repository.Query +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository +import reactor.core.publisher.Flux + +@Repository +interface HealthRecordRepository: ReactiveCrudRepository { + @Query("select p.* from health_record p where p.profile_id = :profileId ") + fun findByProfileId(profileId: Long): Flux +} \ No newline at end of file diff --git a/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/ProfileRepository.kt b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/ProfileRepository.kt new file mode 100644 index 0000000000..eee8c5fcbe --- /dev/null +++ b/spring-reactive-kotlin/src/main/kotlin/com/baeldung/bootmicroservice/repository/ProfileRepository.kt @@ -0,0 +1,8 @@ +package com.baeldung.bootmicroservice.repository + +import com.baeldung.bootmicroservice.model.Profile +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository + +@Repository +interface ProfileRepository: ReactiveCrudRepository \ No newline at end of file diff --git a/spring-reactive-kotlin/src/main/resources/application.yml b/spring-reactive-kotlin/src/main/resources/application.yml new file mode 100644 index 0000000000..d75683f905 --- /dev/null +++ b/spring-reactive-kotlin/src/main/resources/application.yml @@ -0,0 +1 @@ +management.endpoints.web.exposure.include: health,metrics \ No newline at end of file diff --git a/spring-reactive-kotlin/src/test/kotlin/com/baeldung/bootmicroservice/controller/ProfileControllerTest.kt b/spring-reactive-kotlin/src/test/kotlin/com/baeldung/bootmicroservice/controller/ProfileControllerTest.kt new file mode 100644 index 0000000000..51481af3d7 --- /dev/null +++ b/spring-reactive-kotlin/src/test/kotlin/com/baeldung/bootmicroservice/controller/ProfileControllerTest.kt @@ -0,0 +1,51 @@ +package com.baeldung.bootmicroservice.controller; + +import com.baeldung.bootmicroservice.model.Profile +import com.fasterxml.jackson.databind.ObjectMapper +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.http.MediaType +import org.springframework.test.web.reactive.server.WebTestClient +import java.time.LocalDateTime + +@SpringBootTest +class ProfileControllerTest { + @Autowired + lateinit var controller: ProfileController + + @Autowired + lateinit var mapper: ObjectMapper ; + + lateinit var client: WebTestClient + lateinit var profile: String + + @BeforeEach + fun setup() { + client = WebTestClient.bindToController(controller).build() + profile = mapper.writeValueAsString(Profile(null, "kotlin", "reactive", LocalDateTime.now())) + } + + @Test + fun whenRequestProfile_thenStatusShouldBeOk() { + client.post() + .uri("/profile") + .contentType(MediaType.APPLICATION_JSON) + .bodyValue(profile) + .exchange() + .expectStatus().isOk + } + + @Test + fun whenRequestProfile_thenIdShouldBeNotNull() { + client.post() + .uri("/profile") + .contentType(MediaType.APPLICATION_JSON) + .bodyValue(profile) + .exchange() + .expectBody() + .jsonPath("$.id") + .isNotEmpty + } +} From c9569ac3a02e8c3f61a7827222e8c71625ea7582 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Sun, 22 Mar 2020 08:09:36 +0530 Subject: [PATCH 147/530] BAEL-3909: Moved code to another module (#8931) --- .../core-java-string-operations-2/pom.xml | 6 ++++++ .../baeldung/pdf/base64/EncodeDecodeUnitTest.java | 0 .../src/test/resources/input.pdf | Bin pdf/pom.xml | 7 ------- 4 files changed, 6 insertions(+), 7 deletions(-) rename {pdf => core-java-modules/core-java-string-operations-2}/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java (100%) rename {pdf => core-java-modules/core-java-string-operations-2}/src/test/resources/input.pdf (100%) diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml index 079556712e..a00ae80f13 100644 --- a/core-java-modules/core-java-string-operations-2/pom.xml +++ b/core-java-modules/core-java-string-operations-2/pom.xml @@ -64,6 +64,11 @@ jmh-generator-annprocess ${jmh-generator.version} + + commons-codec + commons-codec + ${commons-codec.version} + org.assertj @@ -113,6 +118,7 @@ 6.0.2.Final 3.0.0 2.2.6 + 1.14 diff --git a/pdf/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java similarity index 100% rename from pdf/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java rename to core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/pdf/base64/EncodeDecodeUnitTest.java diff --git a/pdf/src/test/resources/input.pdf b/core-java-modules/core-java-string-operations-2/src/test/resources/input.pdf similarity index 100% rename from pdf/src/test/resources/input.pdf rename to core-java-modules/core-java-string-operations-2/src/test/resources/input.pdf diff --git a/pdf/pom.xml b/pdf/pom.xml index 88836c5ce9..d148aa1670 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -13,12 +13,6 @@ - - commons-codec - commons-codec - ${commons-codec.version} - - org.apache.pdfbox pdfbox-tools @@ -86,7 +80,6 @@ 3.15 1.8 3.15 - 1.14 From 05e79680cfee68d6df3b8681fe9129bc3011b3e2 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Sat, 21 Mar 2020 20:58:04 -0600 Subject: [PATCH 148/530] BAEL-3069 Remove git ignore file, add the new module name to the parent pom file. --- persistence-modules/pom.xml | 1 + .../spring-persistence-simple-2/.gitignore | 13 ------------- 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 persistence-modules/spring-persistence-simple-2/.gitignore diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 15b62d5d77..675f8270eb 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -69,6 +69,7 @@ spring-jpa spring-persistence-simple + spring-persistence-simple-2 diff --git a/persistence-modules/spring-persistence-simple-2/.gitignore b/persistence-modules/spring-persistence-simple-2/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/persistence-modules/spring-persistence-simple-2/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file From 2fa275119ce57a3f3319445d9e67fa9c615b0b1c Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 20:48:49 +0100 Subject: [PATCH 149/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-acl --- .../main/java/{org => com}/baeldung/acl/Application.java | 2 +- .../java/{org => com}/baeldung/acl/config/ACLContext.java | 2 +- .../acl/config/AclMethodSecurityConfiguration.java | 2 +- .../baeldung/acl/config/JPAPersistenceConfig.java | 8 ++++---- .../acl/persistence/dao/NoticeMessageRepository.java | 4 ++-- .../baeldung/acl/persistence/entity/NoticeMessage.java | 2 +- .../spring-security-acl/src/main/resources/acl-data.sql | 2 +- ....properties => com.baeldung.acl.datasource.properties} | 0 .../baeldung/acl/SpringACLIntegrationTest.java | 8 ++++---- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) rename spring-security-modules/spring-security-acl/src/main/java/{org => com}/baeldung/acl/Application.java (91%) rename spring-security-modules/spring-security-acl/src/main/java/{org => com}/baeldung/acl/config/ACLContext.java (99%) rename spring-security-modules/spring-security-acl/src/main/java/{org => com}/baeldung/acl/config/AclMethodSecurityConfiguration.java (96%) rename spring-security-modules/spring-security-acl/src/main/java/{org => com}/baeldung/acl/config/JPAPersistenceConfig.java (66%) rename spring-security-modules/spring-security-acl/src/main/java/{org => com}/baeldung/acl/persistence/dao/NoticeMessageRepository.java (88%) rename spring-security-modules/spring-security-acl/src/main/java/{org => com}/baeldung/acl/persistence/entity/NoticeMessage.java (92%) rename spring-security-modules/spring-security-acl/src/main/resources/{org.baeldung.acl.datasource.properties => com.baeldung.acl.datasource.properties} (100%) rename spring-security-modules/spring-security-acl/src/test/java/{org => com}/baeldung/acl/SpringACLIntegrationTest.java (95%) diff --git a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/Application.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/Application.java similarity index 91% rename from spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/Application.java rename to spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/Application.java index 665ca64076..b18a3a6527 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/Application.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/Application.java @@ -1,4 +1,4 @@ -package org.baeldung.acl; +package com.baeldung.acl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/ACLContext.java similarity index 99% rename from spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java rename to spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/ACLContext.java index 337e745c3c..cb60ef1d45 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/ACLContext.java @@ -1,4 +1,4 @@ -package org.baeldung.acl.config; +package com.baeldung.acl.config; import javax.sql.DataSource; diff --git a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/AclMethodSecurityConfiguration.java similarity index 96% rename from spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java rename to spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/AclMethodSecurityConfiguration.java index e503cb1a41..1a8788b906 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/AclMethodSecurityConfiguration.java @@ -1,4 +1,4 @@ -package org.baeldung.acl.config; +package com.baeldung.acl.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/JPAPersistenceConfig.java similarity index 66% rename from spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java rename to spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/JPAPersistenceConfig.java index 24d170e56c..5f7fff5ff3 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/JPAPersistenceConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.acl.config; +package com.baeldung.acl.config; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Configuration; @@ -8,9 +8,9 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement -@EnableJpaRepositories(basePackages = "org.baeldung.acl.persistence.dao") -@PropertySource("classpath:org.baeldung.acl.datasource.properties") -@EntityScan(basePackages={ "org.baeldung.acl.persistence.entity" }) +@EnableJpaRepositories(basePackages = "com.baeldung.acl.persistence.dao") +@PropertySource("classpath:com.baeldung.acl.datasource.properties") +@EntityScan(basePackages={ "com.baeldung.acl.persistence.entity" }) public class JPAPersistenceConfig { } diff --git a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/dao/NoticeMessageRepository.java similarity index 88% rename from spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java rename to spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/dao/NoticeMessageRepository.java index 91a2af7d83..be1a0118fc 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/dao/NoticeMessageRepository.java @@ -1,8 +1,8 @@ -package org.baeldung.acl.persistence.dao; +package com.baeldung.acl.persistence.dao; import java.util.List; -import org.baeldung.acl.persistence.entity.NoticeMessage; +import com.baeldung.acl.persistence.entity.NoticeMessage; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import org.springframework.security.access.prepost.PostAuthorize; diff --git a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/entity/NoticeMessage.java similarity index 92% rename from spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java rename to spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/entity/NoticeMessage.java index bd1e866f83..80c04146e4 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/entity/NoticeMessage.java @@ -1,4 +1,4 @@ -package org.baeldung.acl.persistence.entity; +package com.baeldung.acl.persistence.entity; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql b/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql index a4e0011834..3b48c83f3c 100644 --- a/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql +++ b/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql @@ -4,7 +4,7 @@ INSERT INTO acl_sid (id, principal, sid) VALUES (3, 0, 'ROLE_EDITOR'); INSERT INTO acl_class (id, class) VALUES -(1, 'org.baeldung.acl.persistence.entity.NoticeMessage'); +(1, 'com.baeldung.acl.persistence.entity.NoticeMessage'); INSERT INTO system_message(id,content) VALUES (1,'First Level Message'), diff --git a/spring-security-modules/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties b/spring-security-modules/spring-security-acl/src/main/resources/com.baeldung.acl.datasource.properties similarity index 100% rename from spring-security-modules/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties rename to spring-security-modules/spring-security-acl/src/main/resources/com.baeldung.acl.datasource.properties diff --git a/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java b/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/acl/SpringACLIntegrationTest.java similarity index 95% rename from spring-security-modules/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java rename to spring-security-modules/spring-security-acl/src/test/java/com/baeldung/acl/SpringACLIntegrationTest.java index 1460d4f47b..dfdeafe059 100644 --- a/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java +++ b/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/acl/SpringACLIntegrationTest.java @@ -1,12 +1,12 @@ -package org.baeldung.acl; +package com.baeldung.acl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.List; -import org.baeldung.acl.persistence.dao.NoticeMessageRepository; -import org.baeldung.acl.persistence.entity.NoticeMessage; +import com.baeldung.acl.persistence.dao.NoticeMessageRepository; +import com.baeldung.acl.persistence.entity.NoticeMessage; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -39,7 +39,7 @@ public class SpringACLIntegrationTest extends AbstractJUnit4SpringContextTests{ private static String EDITTED_CONTENT = "EDITED"; @Configuration - @ComponentScan("org.baeldung.acl.*") + @ComponentScan("com.baeldung.acl.*") public static class SpringConfig { } diff --git a/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/SpringContextTest.java index 74f26e2e5a..6ecc431ddd 100644 --- a/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ package org.baeldung; -import org.baeldung.acl.Application; +import com.baeldung.acl.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; From a9360918bab6cdc03ddf05166b59e3288b649f27 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 20:50:18 +0100 Subject: [PATCH 150/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-angular --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-security-modules/spring-security-angular/server/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-security-modules/spring-security-angular/server/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-angular/server/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-security-modules/spring-security-angular/server/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-angular/server/src/test/java/com/baeldung/SpringContextTest.java index e61d512bca..49314c0575 100644 --- a/spring-security-modules/spring-security-angular/server/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-angular/server/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From bc90bba63518e4daa88e93b2f21d3934844a5665 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 20:51:39 +0100 Subject: [PATCH 151/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-cache-control --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-security-modules/spring-security-cache-control/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-security-modules/spring-security-cache-control/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-security-modules/spring-security-cache-control/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/SpringContextTest.java index 8fbaa7169b..0cde5d829d 100644 --- a/spring-security-modules/spring-security-cache-control/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 1d7aedeaad7e709453c846bcb2322c5f2ce49632 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 20:54:54 +0100 Subject: [PATCH 152/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-kerberos --- .../src/main/java/{org => com}/baeldung/Application.java | 2 +- .../java/{org => com}/baeldung/config/WebSecurityConfig.java | 4 ++-- .../baeldung/security/DummyUserDetailsService.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename spring-security-modules/spring-security-kerberos/src/main/java/{org => com}/baeldung/Application.java (92%) rename spring-security-modules/spring-security-kerberos/src/main/java/{org => com}/baeldung/config/WebSecurityConfig.java (97%) rename spring-security-modules/spring-security-kerberos/src/main/java/{org => com}/baeldung/security/DummyUserDetailsService.java (95%) diff --git a/spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/Application.java b/spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/Application.java similarity index 92% rename from spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/Application.java rename to spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/Application.java index 39c2b51356..37dbe7dab8 100644 --- a/spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/Application.java +++ b/spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/Application.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/config/WebSecurityConfig.java b/spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/config/WebSecurityConfig.java similarity index 97% rename from spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/config/WebSecurityConfig.java rename to spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/config/WebSecurityConfig.java index 49a1cf0a8e..c1c206e5c9 100644 --- a/spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/config/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/config/WebSecurityConfig.java @@ -1,6 +1,6 @@ -package org.baeldung.config; +package com.baeldung.config; -import org.baeldung.security.DummyUserDetailsService; +import com.baeldung.security.DummyUserDetailsService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.FileSystemResource; diff --git a/spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/security/DummyUserDetailsService.java b/spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/security/DummyUserDetailsService.java similarity index 95% rename from spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/security/DummyUserDetailsService.java rename to spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/security/DummyUserDetailsService.java index 10d71fca8f..6ddd6c8969 100644 --- a/spring-security-modules/spring-security-kerberos/src/main/java/org/baeldung/security/DummyUserDetailsService.java +++ b/spring-security-modules/spring-security-kerberos/src/main/java/com/baeldung/security/DummyUserDetailsService.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.User; From d6e6e5a8cad28041a88fc5ed8e49fb480430acb3 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:01:20 +0100 Subject: [PATCH 153/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-ldap --- .../main/java/{org => com}/baeldung/SampleLDAPApplication.java | 2 +- .../java/{org => com}/baeldung/controller/MyController.java | 2 +- .../java/{org => com}/baeldung/security/SecurityConfig.java | 2 +- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) rename spring-security-modules/spring-security-ldap/src/main/java/{org => com}/baeldung/SampleLDAPApplication.java (97%) rename spring-security-modules/spring-security-ldap/src/main/java/{org => com}/baeldung/controller/MyController.java (98%) rename spring-security-modules/spring-security-ldap/src/main/java/{org => com}/baeldung/security/SecurityConfig.java (97%) rename spring-security-modules/spring-security-ldap/src/test/java/{org => com}/baeldung/SpringContextTest.java (85%) diff --git a/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java similarity index 97% rename from spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java index 5936aa30ef..ec585f2387 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/controller/MyController.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/controller/MyController.java similarity index 98% rename from spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/controller/MyController.java rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/controller/MyController.java index e347bd8633..7c746cfb31 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/controller/MyController.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/controller/MyController.java @@ -1,4 +1,4 @@ -package org.baeldung.controller; +package com.baeldung.controller; import java.security.Principal; import java.util.Arrays; diff --git a/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/security/SecurityConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java similarity index 97% rename from spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/security/SecurityConfig.java rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java index 0d444e36ff..a00cb02459 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/security/SecurityConfig.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; diff --git a/spring-security-modules/spring-security-ldap/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/SpringContextTest.java similarity index 85% rename from spring-security-modules/spring-security-ldap/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/SpringContextTest.java index 30ba7671d8..a15ca31980 100644 --- a/spring-security-modules/spring-security-ldap/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/SpringContextTest.java @@ -1,5 +1,6 @@ -package org.baeldung; +package com.baeldung; +import com.baeldung.SampleLDAPApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; From 15a48fcb7810c6d3f507e8e377915c5e01368489 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:06:42 +0100 Subject: [PATCH 154/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc-custom --- .../MySimpleUrlAuthenticationSuccessHandler.java | 2 +- .../java/{org => com}/baeldung/spring/MvcConfig.java | 8 ++++---- .../{org => com}/baeldung/spring/SecSecurityConfig.java | 5 +++-- .../baeldung/web/controller/BankController.java | 2 +- .../baeldung/web/controller/FooController.java | 4 ++-- .../baeldung/web/controller/LoginController.java | 2 +- .../baeldung/web/controller/PrintUserController.java | 2 +- .../src/main/java/{org => com}/baeldung/web/dto/Foo.java | 2 +- .../baeldung/web/interceptor/LoggerInterceptor.java | 2 +- .../web/interceptor/SessionTimerInterceptor.java | 2 +- .../baeldung/web/interceptor/UserInterceptor.java | 2 +- .../src/main/resources/webSecurityConfig.xml | 9 ++------- .../java/{org => com}/baeldung/SpringContextTest.java | 6 +++--- .../security/csrf/CsrfAbstractIntegrationTest.java | 4 ++-- .../security/csrf/CsrfDisabledIntegrationTest.java | 6 +++--- .../security/csrf/CsrfEnabledIntegrationTest.java | 6 +++--- .../baeldung/security/spring/ManualSecurityConfig.java | 2 +- .../security/spring/ManualSecurityIntegrationTest.java | 4 ++-- .../baeldung/security/spring/SecurityWithCsrfConfig.java | 2 +- .../security/spring/SecurityWithoutCsrfConfig.java | 2 +- .../interceptor/LoggerInterceptorIntegrationTest.java | 6 +++--- .../SessionTimerInterceptorIntegrationTest.java | 6 +++--- .../web/interceptor/UserInterceptorIntegrationTest.java | 6 +++--- 23 files changed, 44 insertions(+), 48 deletions(-) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java (98%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/spring/MvcConfig.java (89%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/spring/SecSecurityConfig.java (92%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/controller/BankController.java (96%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/controller/FooController.java (96%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/controller/LoginController.java (97%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/controller/PrintUserController.java (95%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/dto/Foo.java (97%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/interceptor/LoggerInterceptor.java (98%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/interceptor/SessionTimerInterceptor.java (98%) rename spring-security-modules/spring-security-mvc-custom/src/main/java/{org => com}/baeldung/web/interceptor/UserInterceptor.java (98%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/SpringContextTest.java (82%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/security/csrf/CsrfAbstractIntegrationTest.java (95%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/security/csrf/CsrfDisabledIntegrationTest.java (87%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/security/csrf/CsrfEnabledIntegrationTest.java (88%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/security/spring/ManualSecurityConfig.java (98%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/security/spring/ManualSecurityIntegrationTest.java (96%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/security/spring/SecurityWithCsrfConfig.java (98%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/security/spring/SecurityWithoutCsrfConfig.java (98%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/web/interceptor/LoggerInterceptorIntegrationTest.java (91%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java (93%) rename spring-security-modules/spring-security-mvc-custom/src/test/java/{org => com}/baeldung/web/interceptor/UserInterceptorIntegrationTest.java (92%) diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java similarity index 98% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java index 73c186cae3..728445952e 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.io.IOException; import java.util.Collection; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/MvcConfig.java similarity index 89% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/MvcConfig.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/MvcConfig.java index db6141d43e..fb54df155c 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/MvcConfig.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,8 +1,8 @@ -package org.baeldung.spring; +package com.baeldung.spring; -import org.baeldung.web.interceptor.LoggerInterceptor; -import org.baeldung.web.interceptor.SessionTimerInterceptor; -import org.baeldung.web.interceptor.UserInterceptor; +import com.baeldung.web.interceptor.LoggerInterceptor; +import com.baeldung.web.interceptor.SessionTimerInterceptor; +import com.baeldung.web.interceptor.UserInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/SecSecurityConfig.java similarity index 92% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/SecSecurityConfig.java index fe00e6943b..9cee909ad4 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -1,6 +1,7 @@ -package org.baeldung.spring; +package com.baeldung.spring; -import org.baeldung.security.MySimpleUrlAuthenticationSuccessHandler; +import com.baeldung.security.MySimpleUrlAuthenticationSuccessHandler; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/BankController.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/BankController.java similarity index 96% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/BankController.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/BankController.java index 1a4322c611..c4bbde21f2 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/BankController.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/BankController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/FooController.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/FooController.java similarity index 96% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/FooController.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/FooController.java index 5a3c85d220..6f9268c976 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/FooController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; @@ -7,7 +7,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; -import org.baeldung.web.dto.Foo; +import com.baeldung.web.dto.Foo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.http.HttpStatus; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/LoginController.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/LoginController.java similarity index 97% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/LoginController.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/LoginController.java index 99bf345a41..8a823cdf7e 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/LoginController.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/LoginController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/PrintUserController.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/PrintUserController.java similarity index 95% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/PrintUserController.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/PrintUserController.java index 78f164c7f1..9623471f12 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/PrintUserController.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/controller/PrintUserController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/dto/Foo.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/dto/Foo.java similarity index 97% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/dto/Foo.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/dto/Foo.java index 02283e7df9..b349e75b72 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/dto/Foo.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/dto/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.web.dto; import java.io.Serializable; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/LoggerInterceptor.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/LoggerInterceptor.java similarity index 98% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/LoggerInterceptor.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/LoggerInterceptor.java index 7c68d3e9c7..b54fda5a82 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/LoggerInterceptor.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/LoggerInterceptor.java @@ -1,4 +1,4 @@ -package org.baeldung.web.interceptor; +package com.baeldung.web.interceptor; import com.google.common.base.Strings; import org.slf4j.Logger; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/SessionTimerInterceptor.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/SessionTimerInterceptor.java similarity index 98% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/SessionTimerInterceptor.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/SessionTimerInterceptor.java index 90199347b4..38e852305c 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/SessionTimerInterceptor.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/SessionTimerInterceptor.java @@ -1,4 +1,4 @@ -package org.baeldung.web.interceptor; +package com.baeldung.web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/UserInterceptor.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/UserInterceptor.java similarity index 98% rename from spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/UserInterceptor.java rename to spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/UserInterceptor.java index 6b808d885e..cd64a20842 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/org/baeldung/web/interceptor/UserInterceptor.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/web/interceptor/UserInterceptor.java @@ -1,4 +1,4 @@ -package org.baeldung.web.interceptor; +package com.baeldung.web.interceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-mvc-custom/src/main/resources/webSecurityConfig.xml index e79e14abeb..4853e6669b 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/resources/webSecurityConfig.xml +++ b/spring-security-modules/spring-security-mvc-custom/src/main/resources/webSecurityConfig.xml @@ -22,7 +22,7 @@ - + @@ -31,10 +31,5 @@ - - - - + ù \ No newline at end of file diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/SpringContextTest.java similarity index 82% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/SpringContextTest.java index 5ee80d856a..3a73503bca 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/SpringContextTest.java @@ -1,7 +1,7 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.spring.MvcConfig; -import org.baeldung.spring.SecSecurityConfig; +import com.baeldung.spring.MvcConfig; +import com.baeldung.spring.SecSecurityConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfAbstractIntegrationTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfAbstractIntegrationTest.java similarity index 95% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfAbstractIntegrationTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfAbstractIntegrationTest.java index 44424bf7f9..97972b7358 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfAbstractIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfAbstractIntegrationTest.java @@ -1,11 +1,11 @@ -package org.baeldung.security.csrf; +package com.baeldung.security.csrf; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; import javax.servlet.Filter; -import org.baeldung.web.dto.Foo; +import com.baeldung.web.dto.Foo; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfDisabledIntegrationTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfDisabledIntegrationTest.java similarity index 87% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfDisabledIntegrationTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfDisabledIntegrationTest.java index 1d16e08514..a1c8be9daf 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfDisabledIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfDisabledIntegrationTest.java @@ -1,10 +1,10 @@ -package org.baeldung.security.csrf; +package com.baeldung.security.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.baeldung.security.spring.SecurityWithoutCsrfConfig; -import org.baeldung.spring.MvcConfig; +import com.baeldung.security.spring.SecurityWithoutCsrfConfig; +import com.baeldung.spring.MvcConfig; import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfEnabledIntegrationTest.java similarity index 88% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfEnabledIntegrationTest.java index 9d882973bd..87e5005e17 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/csrf/CsrfEnabledIntegrationTest.java @@ -1,11 +1,11 @@ -package org.baeldung.security.csrf; +package com.baeldung.security.csrf; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.baeldung.security.spring.SecurityWithCsrfConfig; -import org.baeldung.spring.MvcConfig; +import com.baeldung.security.spring.SecurityWithCsrfConfig; +import com.baeldung.spring.MvcConfig; import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/ManualSecurityConfig.java similarity index 98% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/ManualSecurityConfig.java index 23d13a0ff1..438cec38bb 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/ManualSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.security.spring; +package com.baeldung.security.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityIntegrationTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/ManualSecurityIntegrationTest.java similarity index 96% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityIntegrationTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/ManualSecurityIntegrationTest.java index afc86bd74c..002ba8df3e 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/ManualSecurityIntegrationTest.java @@ -1,11 +1,11 @@ -package org.baeldung.security.spring; +package com.baeldung.security.spring; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import javax.servlet.http.HttpSession; -import org.baeldung.spring.MvcConfig; +import com.baeldung.spring.MvcConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithCsrfConfig.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/SecurityWithCsrfConfig.java similarity index 98% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithCsrfConfig.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/SecurityWithCsrfConfig.java index ca401622c0..9b3ac50546 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithCsrfConfig.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/SecurityWithCsrfConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.security.spring; +package com.baeldung.security.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithoutCsrfConfig.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/SecurityWithoutCsrfConfig.java similarity index 98% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithoutCsrfConfig.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/SecurityWithoutCsrfConfig.java index 1067c70fea..4a1263b498 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/SecurityWithoutCsrfConfig.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/security/spring/SecurityWithoutCsrfConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.security.spring; +package com.baeldung.security.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/LoggerInterceptorIntegrationTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/LoggerInterceptorIntegrationTest.java similarity index 91% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/LoggerInterceptorIntegrationTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/LoggerInterceptorIntegrationTest.java index c33c9a04e8..9e850861bf 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/LoggerInterceptorIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/LoggerInterceptorIntegrationTest.java @@ -1,10 +1,10 @@ -package org.baeldung.web.interceptor; +package com.baeldung.web.interceptor; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.baeldung.security.spring.SecurityWithoutCsrfConfig; -import org.baeldung.spring.MvcConfig; +import com.baeldung.security.spring.SecurityWithoutCsrfConfig; +import com.baeldung.spring.MvcConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java similarity index 93% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java index bdc1be2c44..07bc22f184 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java @@ -1,12 +1,12 @@ -package org.baeldung.web.interceptor; +package com.baeldung.web.interceptor; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import javax.servlet.http.HttpSession; -import org.baeldung.security.spring.SecurityWithoutCsrfConfig; -import org.baeldung.spring.MvcConfig; +import com.baeldung.security.spring.SecurityWithoutCsrfConfig; +import com.baeldung.spring.MvcConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/UserInterceptorIntegrationTest.java b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/UserInterceptorIntegrationTest.java similarity index 92% rename from spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/UserInterceptorIntegrationTest.java rename to spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/UserInterceptorIntegrationTest.java index a85fd999a6..b7547cb23a 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/test/java/org/baeldung/web/interceptor/UserInterceptorIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-custom/src/test/java/com/baeldung/web/interceptor/UserInterceptorIntegrationTest.java @@ -1,10 +1,10 @@ -package org.baeldung.web.interceptor; +package com.baeldung.web.interceptor; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.baeldung.security.spring.SecurityWithoutCsrfConfig; -import org.baeldung.spring.MvcConfig; +import com.baeldung.security.spring.SecurityWithoutCsrfConfig; +import com.baeldung.spring.MvcConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; From d1a28cbd6a9ed17a96852de66d4de7cd23e38a02 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:38:14 +0100 Subject: [PATCH 155/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-acl (finalized) --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-security-modules/spring-security-acl/src/test/java/{org => com}/baeldung/SpringContextTest.java (94%) diff --git a/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/SpringContextTest.java similarity index 94% rename from spring-security-modules/spring-security-acl/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-acl/src/test/java/com/baeldung/SpringContextTest.java index 6ecc431ddd..e60983733e 100644 --- a/spring-security-modules/spring-security-acl/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import com.baeldung.acl.Application; import org.junit.Test; From c1b2f97a53227fa3a993e072a60a9922de96a8d4 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:39:57 +0100 Subject: [PATCH 156/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc-custom (finalized) --- .../src/main/java/com/baeldung/spring/MvcConfig.java | 2 +- .../spring-security-mvc-custom/src/main/webapp/WEB-INF/web.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/MvcConfig.java b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/MvcConfig.java index fb54df155c..583825a66a 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/MvcConfig.java +++ b/spring-security-modules/spring-security-mvc-custom/src/main/java/com/baeldung/spring/MvcConfig.java @@ -16,7 +16,7 @@ import org.springframework.web.servlet.view.JstlView; @EnableWebMvc @Configuration -@ComponentScan("org.baeldung.web.controller") +@ComponentScan("com.baeldung.web.controller") public class MvcConfig implements WebMvcConfigurer { public MvcConfig() { diff --git a/spring-security-modules/spring-security-mvc-custom/src/main/webapp/WEB-INF/web.xml b/spring-security-modules/spring-security-mvc-custom/src/main/webapp/WEB-INF/web.xml index e805828809..61fd248f53 100644 --- a/spring-security-modules/spring-security-mvc-custom/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-modules/spring-security-mvc-custom/src/main/webapp/WEB-INF/web.xml @@ -20,7 +20,7 @@ contextConfigLocation - org.baeldung.spring + com.baeldung.spring From ead60ef1f78543b60fa3002439cf984ec90dbec4 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:11:07 +0100 Subject: [PATCH 157/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc-digest-auth --- .../baeldung/basic/MyBasicAuthenticationEntryPoint.java | 2 +- .../HttpComponentsClientHttpRequestFactoryDigestAuth.java | 2 +- .../java/{org => com}/baeldung/spring/ClientConfig.java | 4 ++-- .../main/java/{org => com}/baeldung/spring/MvcConfig.java | 2 +- .../{org => com}/baeldung/spring/SecSecurityConfig.java | 2 +- .../java/{org => com}/baeldung/SpringContextTest.java | 8 ++++---- .../{org => com}/baeldung/client/RawClientLiveTest.java | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) rename spring-security-modules/spring-security-mvc-digest-auth/src/main/java/{org => com}/baeldung/basic/MyBasicAuthenticationEntryPoint.java (97%) rename spring-security-modules/spring-security-mvc-digest-auth/src/main/java/{org => com}/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java (98%) rename spring-security-modules/spring-security-mvc-digest-auth/src/main/java/{org => com}/baeldung/spring/ClientConfig.java (94%) rename spring-security-modules/spring-security-mvc-digest-auth/src/main/java/{org => com}/baeldung/spring/MvcConfig.java (97%) rename spring-security-modules/spring-security-mvc-digest-auth/src/main/java/{org => com}/baeldung/spring/SecSecurityConfig.java (93%) rename spring-security-modules/spring-security-mvc-digest-auth/src/test/java/{org => com}/baeldung/SpringContextTest.java (78%) rename spring-security-modules/spring-security-mvc-digest-auth/src/test/java/{org => com}/baeldung/client/RawClientLiveTest.java (94%) diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java similarity index 97% rename from spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java rename to spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java index c51c0a0bc8..1b9ffc3db8 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package org.baeldung.basic; +package com.baeldung.basic; import java.io.IOException; import java.io.PrintWriter; diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java similarity index 98% rename from spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java rename to spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java index 1e6f213305..67c2d6031f 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package com.baeldung.client; import org.apache.http.HttpHost; import org.apache.http.client.AuthCache; diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/ClientConfig.java b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/ClientConfig.java similarity index 94% rename from spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/ClientConfig.java rename to spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/ClientConfig.java index f305321f13..b7145daaea 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/ClientConfig.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/ClientConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; @@ -7,7 +7,7 @@ import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.baeldung.client.HttpComponentsClientHttpRequestFactoryDigestAuth; +import com.baeldung.client.HttpComponentsClientHttpRequestFactoryDigestAuth; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/MvcConfig.java similarity index 97% rename from spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/MvcConfig.java rename to spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/MvcConfig.java index 74c11478ee..0d9962cda0 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/MvcConfig.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java similarity index 93% rename from spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/SecSecurityConfig.java rename to spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java index 4ce80dab9f..cddef4d508 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/com/baeldung/SpringContextTest.java similarity index 78% rename from spring-security-modules/spring-security-mvc-digest-auth/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-mvc-digest-auth/src/test/java/com/baeldung/SpringContextTest.java index cd2b796308..080935c8c1 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/com/baeldung/SpringContextTest.java @@ -1,8 +1,8 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.spring.ClientConfig; -import org.baeldung.spring.MvcConfig; -import org.baeldung.spring.SecSecurityConfig; +import com.baeldung.spring.ClientConfig; +import com.baeldung.spring.MvcConfig; +import com.baeldung.spring.SecSecurityConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java b/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/com/baeldung/client/RawClientLiveTest.java similarity index 94% rename from spring-security-modules/spring-security-mvc-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java rename to spring-security-modules/spring-security-mvc-digest-auth/src/test/java/com/baeldung/client/RawClientLiveTest.java index e8dcf82ebc..de6dca3ec4 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/test/java/com/baeldung/client/RawClientLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package com.baeldung.client; import java.io.IOException; @@ -6,7 +6,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.baeldung.spring.ClientConfig; +import com.baeldung.spring.ClientConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; From 56c6d78bd55ef43eddc1e31337e5fe0bbc286574 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:16:32 +0100 Subject: [PATCH 158/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc-persisted-remember-me --- .../{org => com}/baeldung/controller/MyController.java | 2 +- .../security/MySimpleUrlAuthenticationSuccessHandler.java | 2 +- .../java/{org => com}/baeldung/security/SecurityRole.java | 2 +- .../security/SecurityWebApplicationInitializer.java | 2 +- .../baeldung/service/MyUserDetailsService.java | 4 ++-- .../main/java/{org => com}/baeldung/spring/MvcConfig.java | 4 ++-- .../{org => com}/baeldung/spring/PersistenceConfig.java | 2 +- .../java/{org => com}/baeldung/spring/SecurityConfig.java | 2 +- .../src/main/webapp/WEB-INF/web.xml | 2 +- .../java/{org => com}/baeldung/SpringContextTest.java | 8 ++++---- 10 files changed, 15 insertions(+), 15 deletions(-) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/controller/MyController.java (96%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java (99%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/security/SecurityRole.java (78%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/security/SecurityWebApplicationInitializer.java (90%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/service/MyUserDetailsService.java (96%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/spring/MvcConfig.java (95%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/spring/PersistenceConfig.java (97%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/{org => com}/baeldung/spring/SecurityConfig.java (95%) rename spring-security-modules/spring-security-mvc-persisted-remember-me/src/test/java/{org => com}/baeldung/SpringContextTest.java (78%) diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/controller/MyController.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/controller/MyController.java similarity index 96% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/controller/MyController.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/controller/MyController.java index 51202225ee..0ef07a2c19 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/controller/MyController.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/controller/MyController.java @@ -1,4 +1,4 @@ -package org.baeldung.controller; +package com.baeldung.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java similarity index 99% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java index 22fd2cdcb6..5d3c59be11 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/MySimpleUrlAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.io.IOException; import java.util.Collection; diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/SecurityRole.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/SecurityRole.java similarity index 78% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/SecurityRole.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/SecurityRole.java index e41e7a4c4f..ffe385996d 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/SecurityRole.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/SecurityRole.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; /** * Simple enum of Security Roles available. diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/SecurityWebApplicationInitializer.java similarity index 90% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/SecurityWebApplicationInitializer.java index 75f782e7dc..98eb4cd41c 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/security/SecurityWebApplicationInitializer.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/service/MyUserDetailsService.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/service/MyUserDetailsService.java similarity index 96% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/service/MyUserDetailsService.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/service/MyUserDetailsService.java index e6c77110b3..34782bdfab 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/service/MyUserDetailsService.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/service/MyUserDetailsService.java @@ -1,8 +1,8 @@ -package org.baeldung.service; +package com.baeldung.service; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.baeldung.security.SecurityRole; +import com.baeldung.security.SecurityRole; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/MvcConfig.java similarity index 95% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/MvcConfig.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/MvcConfig.java index d4e0c55004..6fa3b522e7 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/MvcConfig.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -14,7 +14,7 @@ import org.springframework.web.servlet.view.JstlView; * Spring Web Configuration. */ @EnableWebMvc -@ComponentScan("org.baeldung") +@ComponentScan("com.baeldung") @Configuration public class MvcConfig extends WebMvcConfigurerAdapter { diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/PersistenceConfig.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/PersistenceConfig.java similarity index 97% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/PersistenceConfig.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/PersistenceConfig.java index 02308e64fb..fe7b82b63d 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/PersistenceConfig.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/PersistenceConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import javax.sql.DataSource; diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/SecurityConfig.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/SecurityConfig.java similarity index 95% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/SecurityConfig.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/SecurityConfig.java index 2d9bb8e731..d3cfff81cb 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/org/baeldung/spring/SecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/java/com/baeldung/spring/SecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/webapp/WEB-INF/web.xml b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/webapp/WEB-INF/web.xml index aa52205420..11b922a801 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/main/webapp/WEB-INF/web.xml @@ -19,7 +19,7 @@ contextConfigLocation - org.baeldung.spring + com.baeldung.spring diff --git a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/test/java/com/baeldung/SpringContextTest.java similarity index 78% rename from spring-security-modules/spring-security-mvc-persisted-remember-me/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-mvc-persisted-remember-me/src/test/java/com/baeldung/SpringContextTest.java index 8113ed0fbe..bf4951c83a 100644 --- a/spring-security-modules/spring-security-mvc-persisted-remember-me/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-mvc-persisted-remember-me/src/test/java/com/baeldung/SpringContextTest.java @@ -1,8 +1,8 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.spring.MvcConfig; -import org.baeldung.spring.PersistenceConfig; -import org.baeldung.spring.SecurityConfig; +import com.baeldung.spring.MvcConfig; +import com.baeldung.spring.PersistenceConfig; +import com.baeldung.spring.SecurityConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; From 833355f08d23f8c2ffc2f02999a8d54c2db88a19 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:18:03 +0100 Subject: [PATCH 159/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc-socket --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-security-modules/spring-security-mvc-socket/src/test/java/{org => com}/baeldung/SpringContextTest.java (97%) diff --git a/spring-security-modules/spring-security-mvc-socket/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-mvc-socket/src/test/java/com/baeldung/SpringContextTest.java similarity index 97% rename from spring-security-modules/spring-security-mvc-socket/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-mvc-socket/src/test/java/com/baeldung/SpringContextTest.java index 7b9c738904..4ef4948601 100644 --- a/spring-security-modules/spring-security-mvc-socket/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-mvc-socket/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From a12f9e878a142f32432c8efb26804bf0b096e859 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:20:39 +0100 Subject: [PATCH 160/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-react --- .../main/java/{org => com}/baeldung/spring/MvcConfig.java | 2 +- .../{org => com}/baeldung/spring/SecSecurityConfig.java | 2 +- .../spring-security-react/src/main/webapp/WEB-INF/web.xml | 2 +- .../test/java/{org => com}/baeldung/SpringContextTest.java | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) rename spring-security-modules/spring-security-react/src/main/java/{org => com}/baeldung/spring/MvcConfig.java (98%) rename spring-security-modules/spring-security-react/src/main/java/{org => com}/baeldung/spring/SecSecurityConfig.java (98%) rename spring-security-modules/spring-security-react/src/test/java/{org => com}/baeldung/SpringContextTest.java (82%) diff --git a/spring-security-modules/spring-security-react/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-security-modules/spring-security-react/src/main/java/com/baeldung/spring/MvcConfig.java similarity index 98% rename from spring-security-modules/spring-security-react/src/main/java/org/baeldung/spring/MvcConfig.java rename to spring-security-modules/spring-security-react/src/main/java/com/baeldung/spring/MvcConfig.java index f970b84585..f8acdfe2ac 100644 --- a/spring-security-modules/spring-security-react/src/main/java/org/baeldung/spring/MvcConfig.java +++ b/spring-security-modules/spring-security-react/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-react/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-react/src/main/java/com/baeldung/spring/SecSecurityConfig.java similarity index 98% rename from spring-security-modules/spring-security-react/src/main/java/org/baeldung/spring/SecSecurityConfig.java rename to spring-security-modules/spring-security-react/src/main/java/com/baeldung/spring/SecSecurityConfig.java index c64b433544..7b67028647 100644 --- a/spring-security-modules/spring-security-react/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-react/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; diff --git a/spring-security-modules/spring-security-react/src/main/webapp/WEB-INF/web.xml b/spring-security-modules/spring-security-react/src/main/webapp/WEB-INF/web.xml index eef48ec9b3..bc6f310147 100644 --- a/spring-security-modules/spring-security-react/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-modules/spring-security-react/src/main/webapp/WEB-INF/web.xml @@ -15,7 +15,7 @@ contextConfigLocation - org.baeldung.spring + com.baeldung.spring diff --git a/spring-security-modules/spring-security-react/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-react/src/test/java/com/baeldung/SpringContextTest.java similarity index 82% rename from spring-security-modules/spring-security-react/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-react/src/test/java/com/baeldung/SpringContextTest.java index cfef3322dc..43ddb515eb 100644 --- a/spring-security-modules/spring-security-react/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-react/src/test/java/com/baeldung/SpringContextTest.java @@ -1,7 +1,7 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.spring.MvcConfig; -import org.baeldung.spring.SecSecurityConfig; +import com.baeldung.spring.MvcConfig; +import com.baeldung.spring.SecSecurityConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; From b993d0762d4bad1ee1ce5b0a17b001bed559d7b7 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:25:10 +0100 Subject: [PATCH 161/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-rest --- .../{org => com}/baeldung/errorhandling/ApiError.java | 2 +- .../errorhandling/CustomRestExceptionHandler.java | 2 +- .../{org => com}/baeldung/persistence/model/Foo.java | 2 +- .../baeldung/security/SecurityJavaConfig.java | 10 +++++----- .../security/SecurityWebApplicationInitializer.java | 2 +- ...ySavedRequestAwareAuthenticationSuccessHandler.java | 2 +- .../security/web/RestAuthenticationEntryPoint.java | 2 +- .../{org => com}/baeldung/spring/ClientWebConfig.java | 2 +- .../baeldung/spring/SecurityXmlConfig.java | 4 ++-- .../java/{org => com}/baeldung/spring/WebConfig.java | 4 ++-- .../{org => com}/baeldung/swagger2/SwaggerConfig.java | 4 ++-- .../baeldung/web/controller/AsyncController.java | 4 ++-- .../baeldung/web/controller/CustomController.java | 2 +- .../baeldung/web/controller/FooController.java | 4 ++-- .../baeldung/web/controller/RootController.java | 2 +- .../baeldung/web/error/CustomAccessDeniedHandler.java | 2 +- .../web/error/RestResponseEntityExceptionHandler.java | 2 +- .../web/exception/MyResourceNotFoundException.java | 2 +- .../baeldung/web/service/AsyncService.java | 2 +- .../baeldung/web/service/AsyncServiceImpl.java | 2 +- .../src/main/resources/webSecurityConfig.xml | 2 +- .../src/main/webapp/WEB-INF/web.xml | 2 +- .../java/{org => com}/baeldung/SpringContextTest.java | 8 ++++---- .../baeldung/errorhandling/FooLiveTest.java | 5 ++--- .../baeldung/web/AsyncControllerIntegrationTest.java | 10 +++++----- .../{org => com}/baeldung/web/SwaggerLiveTest.java | 2 +- .../java/{org => com}/baeldung/web/TestConfig.java | 4 ++-- 27 files changed, 45 insertions(+), 46 deletions(-) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/errorhandling/ApiError.java (97%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/errorhandling/CustomRestExceptionHandler.java (99%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/persistence/model/Foo.java (97%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/security/SecurityJavaConfig.java (92%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/security/SecurityWebApplicationInitializer.java (90%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java (98%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/security/web/RestAuthenticationEntryPoint.java (95%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/spring/ClientWebConfig.java (90%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/spring/SecurityXmlConfig.java (77%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/spring/WebConfig.java (95%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/swagger2/SwaggerConfig.java (94%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/controller/AsyncController.java (94%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/controller/CustomController.java (90%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/controller/FooController.java (94%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/controller/RootController.java (94%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/error/CustomAccessDeniedHandler.java (96%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/error/RestResponseEntityExceptionHandler.java (99%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/exception/MyResourceNotFoundException.java (92%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/service/AsyncService.java (81%) rename spring-security-modules/spring-security-rest/src/main/java/{org => com}/baeldung/web/service/AsyncServiceImpl.java (97%) rename spring-security-modules/spring-security-rest/src/test/java/{org => com}/baeldung/SpringContextTest.java (77%) rename spring-security-modules/spring-security-rest/src/test/java/{org => com}/baeldung/errorhandling/FooLiveTest.java (96%) rename spring-security-modules/spring-security-rest/src/test/java/{org => com}/baeldung/web/AsyncControllerIntegrationTest.java (87%) rename spring-security-modules/spring-security-rest/src/test/java/{org => com}/baeldung/web/SwaggerLiveTest.java (95%) rename spring-security-modules/spring-security-rest/src/test/java/{org => com}/baeldung/web/TestConfig.java (89%) diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/errorhandling/ApiError.java similarity index 97% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/errorhandling/ApiError.java index 8a1ddd8882..0fba2deca5 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/errorhandling/ApiError.java @@ -1,4 +1,4 @@ -package org.baeldung.errorhandling; +package com.baeldung.errorhandling; import java.util.Arrays; import java.util.List; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/errorhandling/CustomRestExceptionHandler.java similarity index 99% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/errorhandling/CustomRestExceptionHandler.java index cd4d58e60c..02bc0a2512 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/errorhandling/CustomRestExceptionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.errorhandling; +package com.baeldung.errorhandling; import java.util.ArrayList; import java.util.List; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/persistence/model/Foo.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/persistence/model/Foo.java similarity index 97% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/persistence/model/Foo.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/persistence/model/Foo.java index 05a7c7b9a0..d85cca1dcc 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/persistence/model/Foo.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/persistence/model/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.persistence.model; +package com.baeldung.persistence.model; import java.io.Serializable; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityJavaConfig.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/SecurityJavaConfig.java similarity index 92% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityJavaConfig.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/SecurityJavaConfig.java index 74623080b5..d20198c2bb 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityJavaConfig.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/SecurityJavaConfig.java @@ -1,8 +1,8 @@ -package org.baeldung.security; +package com.baeldung.security; -import org.baeldung.security.web.MySavedRequestAwareAuthenticationSuccessHandler; -import org.baeldung.security.web.RestAuthenticationEntryPoint; -import org.baeldung.web.error.CustomAccessDeniedHandler; +import com.baeldung.security.web.MySavedRequestAwareAuthenticationSuccessHandler; +import com.baeldung.security.web.RestAuthenticationEntryPoint; +import com.baeldung.web.error.CustomAccessDeniedHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -20,7 +20,7 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) -@ComponentScan("org.baeldung.security") +@ComponentScan("com.baeldung.security") public class SecurityJavaConfig extends WebSecurityConfigurerAdapter { @Autowired diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/SecurityWebApplicationInitializer.java similarity index 90% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/SecurityWebApplicationInitializer.java index 33978962bb..77e70d5b84 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/SecurityWebApplicationInitializer.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java similarity index 98% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java index c56568e979..2d74ed9dca 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.security.web; +package com.baeldung.security.web; import java.io.IOException; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/web/RestAuthenticationEntryPoint.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/web/RestAuthenticationEntryPoint.java similarity index 95% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/web/RestAuthenticationEntryPoint.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/web/RestAuthenticationEntryPoint.java index 643e2f0575..162ee46727 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/web/RestAuthenticationEntryPoint.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/security/web/RestAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package org.baeldung.security.web; +package com.baeldung.security.web; import java.io.IOException; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/ClientWebConfig.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/ClientWebConfig.java similarity index 90% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/ClientWebConfig.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/ClientWebConfig.java index 8e20358a5a..db24817f5b 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/ClientWebConfig.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/ClientWebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/SecurityXmlConfig.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/SecurityXmlConfig.java similarity index 77% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/SecurityXmlConfig.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/SecurityXmlConfig.java index 0830a1ebe1..92f7cea784 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/SecurityXmlConfig.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/SecurityXmlConfig.java @@ -1,10 +1,10 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.ComponentScan; // @Configuration // @ImportResource({ "classpath:webSecurityConfig.xml" }) -@ComponentScan("org.baeldung.security") +@ComponentScan("com.baeldung.security") public class SecurityXmlConfig { public SecurityXmlConfig() { diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/WebConfig.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/WebConfig.java similarity index 95% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/WebConfig.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/WebConfig.java index dba07dc4e5..84b211a9bd 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/spring/WebConfig.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/spring/WebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -12,7 +12,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration -@ComponentScan("org.baeldung.web") +@ComponentScan("com.baeldung.web") @EnableWebMvc @EnableAsync public class WebConfig implements WebMvcConfigurer { diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/swagger2/SwaggerConfig.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java similarity index 94% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/swagger2/SwaggerConfig.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java index 67c760353d..c8c4227ebf 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/swagger2/SwaggerConfig.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.swagger2; +package com.baeldung.swagger2; import static com.google.common.collect.Lists.newArrayList; @@ -25,7 +25,7 @@ public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2).select() - .apis(RequestHandlerSelectors.basePackage("org.baeldung.web.controller")) + .apis(RequestHandlerSelectors.basePackage("com.baeldung.web.controller")) .paths(PathSelectors.ant("/foos/*")) .build() .apiInfo(apiInfo()) diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/AsyncController.java similarity index 94% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/AsyncController.java index f6f1c392cb..c2123913c6 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/AsyncController.java @@ -1,11 +1,11 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import java.util.concurrent.Callable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.baeldung.web.service.AsyncService; +import com.baeldung.web.service.AsyncService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomController.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/CustomController.java similarity index 90% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomController.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/CustomController.java index 7d40b9bb8d..d833d3af7a 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomController.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/CustomController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/FooController.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/FooController.java similarity index 94% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/FooController.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/FooController.java index f914f82215..033bf2d1e3 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/FooController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; @@ -6,7 +6,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; -import org.baeldung.persistence.model.Foo; +import com.baeldung.persistence.model.Foo; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/RootController.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/RootController.java similarity index 94% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/RootController.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/RootController.java index 4253ed7a59..3abbe8a309 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/controller/RootController.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/controller/RootController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/error/CustomAccessDeniedHandler.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/error/CustomAccessDeniedHandler.java similarity index 96% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/error/CustomAccessDeniedHandler.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/error/CustomAccessDeniedHandler.java index cc07417427..6c686cd9e9 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/error/CustomAccessDeniedHandler.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/error/CustomAccessDeniedHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.web.error; +package com.baeldung.web.error; import java.io.IOException; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/error/RestResponseEntityExceptionHandler.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java similarity index 99% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/error/RestResponseEntityExceptionHandler.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java index 9ff4f040fe..9e6ae78d27 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/error/RestResponseEntityExceptionHandler.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.web.error; +package com.baeldung.web.error; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java similarity index 92% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java index 14b61f9832..fd002efc28 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java @@ -1,4 +1,4 @@ -package org.baeldung.web.exception; +package com.baeldung.web.exception; public final class MyResourceNotFoundException extends RuntimeException { diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncService.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/service/AsyncService.java similarity index 81% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncService.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/service/AsyncService.java index 1ba4dfa4cb..ee07313ee8 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncService.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/service/AsyncService.java @@ -1,4 +1,4 @@ -package org.baeldung.web.service; +package com.baeldung.web.service; import java.util.concurrent.Callable; diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/service/AsyncServiceImpl.java similarity index 97% rename from spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java rename to spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/service/AsyncServiceImpl.java index d6d7f53dd7..8aebbc3234 100644 --- a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java +++ b/spring-security-modules/spring-security-rest/src/main/java/com/baeldung/web/service/AsyncServiceImpl.java @@ -1,4 +1,4 @@ -package org.baeldung.web.service; +package com.baeldung.web.service; import java.util.concurrent.Callable; diff --git a/spring-security-modules/spring-security-rest/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-rest/src/main/resources/webSecurityConfig.xml index edd3cba39c..2c0a0bc774 100644 --- a/spring-security-modules/spring-security-rest/src/main/resources/webSecurityConfig.xml +++ b/spring-security-modules/spring-security-rest/src/main/resources/webSecurityConfig.xml @@ -30,7 +30,7 @@ + class="com.baeldung.security.MySavedRequestAwareAuthenticationSuccessHandler" /> diff --git a/spring-security-modules/spring-security-rest/src/main/webapp/WEB-INF/web.xml b/spring-security-modules/spring-security-rest/src/main/webapp/WEB-INF/web.xml index 3195603837..663c17bc56 100644 --- a/spring-security-modules/spring-security-rest/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-modules/spring-security-rest/src/main/webapp/WEB-INF/web.xml @@ -17,7 +17,7 @@ contextConfigLocation - org.baeldung.spring + com.baeldung.spring diff --git a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/SpringContextTest.java similarity index 77% rename from spring-security-modules/spring-security-rest/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-rest/src/test/java/com/baeldung/SpringContextTest.java index 11586ce670..bcc66558cb 100644 --- a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/SpringContextTest.java @@ -1,8 +1,8 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.security.SecurityJavaConfig; -import org.baeldung.spring.ClientWebConfig; -import org.baeldung.spring.WebConfig; +import com.baeldung.security.SecurityJavaConfig; +import com.baeldung.spring.ClientWebConfig; +import com.baeldung.spring.WebConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; diff --git a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/errorhandling/FooLiveTest.java similarity index 96% rename from spring-security-modules/spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java rename to spring-security-modules/spring-security-rest/src/test/java/com/baeldung/errorhandling/FooLiveTest.java index 8d1db5736f..e08a24676a 100644 --- a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java +++ b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/errorhandling/FooLiveTest.java @@ -1,10 +1,9 @@ -package org.baeldung.errorhandling; +package com.baeldung.errorhandling; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.baeldung.errorhandling.ApiError; -import org.baeldung.web.TestConfig; +import com.baeldung.web.TestConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.http.HttpStatus; diff --git a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/AsyncControllerIntegrationTest.java b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/AsyncControllerIntegrationTest.java similarity index 87% rename from spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/AsyncControllerIntegrationTest.java rename to spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/AsyncControllerIntegrationTest.java index 1e5e1b7d85..bf93c14f1f 100644 --- a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/AsyncControllerIntegrationTest.java +++ b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/AsyncControllerIntegrationTest.java @@ -1,9 +1,9 @@ -package org.baeldung.web; +package com.baeldung.web; -import org.baeldung.security.SecurityJavaConfig; -import org.baeldung.spring.ClientWebConfig; -import org.baeldung.spring.WebConfig; -import org.baeldung.web.controller.AsyncController; +import com.baeldung.security.SecurityJavaConfig; +import com.baeldung.spring.ClientWebConfig; +import com.baeldung.spring.WebConfig; +import com.baeldung.web.controller.AsyncController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/SwaggerLiveTest.java b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/SwaggerLiveTest.java similarity index 95% rename from spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/SwaggerLiveTest.java rename to spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/SwaggerLiveTest.java index 792b3e28ce..3f86b63503 100644 --- a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/SwaggerLiveTest.java +++ b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/SwaggerLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package com.baeldung.web; import static org.junit.Assert.assertEquals; diff --git a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/TestConfig.java b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/TestConfig.java similarity index 89% rename from spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/TestConfig.java rename to spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/TestConfig.java index 61bd6e776b..ddb7240611 100644 --- a/spring-security-modules/spring-security-rest/src/test/java/org/baeldung/web/TestConfig.java +++ b/spring-security-modules/spring-security-rest/src/test/java/com/baeldung/web/TestConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package com.baeldung.web; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -7,7 +7,7 @@ import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; @Configuration -@ComponentScan({ "org.baeldung.web" }) +@ComponentScan({ "com.baeldung.web" }) public class TestConfig { @Bean From 43299dc08224064454c8cf00a36b4f2fecebd03d Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:27:36 +0100 Subject: [PATCH 162/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-rest-basic-auth --- .../baeldung/basic/MyBasicAuthenticationEntryPoint.java | 2 +- .../HttpComponentsClientHttpRequestFactoryBasicAuth.java | 2 +- .../{org => com}/baeldung/client/RestTemplateFactory.java | 2 +- .../{org => com}/baeldung/client/spring/ClientConfig.java | 2 +- .../main/java/{org => com}/baeldung/filter/CustomFilter.java | 2 +- .../baeldung/filter/CustomWebSecurityConfigurerAdapter.java | 4 ++-- .../MySavedRequestAwareAuthenticationSuccessHandler.java | 2 +- .../baeldung/security/RestAuthenticationEntryPoint.java | 2 +- .../java/{org => com}/baeldung/spring/SecSecurityConfig.java | 2 +- .../src/main/java/{org => com}/baeldung/spring/WebConfig.java | 2 +- .../{org => com}/baeldung/web/controller/BarController.java | 4 ++-- .../{org => com}/baeldung/web/controller/FooController.java | 4 ++-- .../src/main/java/{org => com}/baeldung/web/dto/Bar.java | 2 +- .../src/main/java/{org => com}/baeldung/web/dto/Foo.java | 2 +- .../src/main/resources/webSecurityConfig.xml | 2 +- .../test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 16 files changed, 19 insertions(+), 19 deletions(-) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/basic/MyBasicAuthenticationEntryPoint.java (97%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java (97%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/client/RestTemplateFactory.java (97%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/client/spring/ClientConfig.java (88%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/filter/CustomFilter.java (94%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/filter/CustomWebSecurityConfigurerAdapter.java (95%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java (98%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/security/RestAuthenticationEntryPoint.java (95%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/spring/SecSecurityConfig.java (93%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/spring/WebConfig.java (96%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/web/controller/BarController.java (95%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/web/controller/FooController.java (92%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/web/dto/Bar.java (86%) rename spring-security-modules/spring-security-rest-basic-auth/src/main/java/{org => com}/baeldung/web/dto/Foo.java (86%) rename spring-security-modules/spring-security-rest-basic-auth/src/test/java/{org => com}/baeldung/SpringContextTest.java (94%) diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java similarity index 97% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java index f440bbd10c..07344819c0 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package org.baeldung.basic; +package com.baeldung.basic; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java similarity index 97% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java index a2f51d343b..81f82a2c1c 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package com.baeldung.client; import java.net.URI; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java similarity index 97% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java index 3ed0bc82b7..aac4f8cebd 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package com.baeldung.client; import org.apache.http.HttpHost; import org.springframework.beans.factory.FactoryBean; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/spring/ClientConfig.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/spring/ClientConfig.java similarity index 88% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/spring/ClientConfig.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/spring/ClientConfig.java index 73e602855c..dd834628a6 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/spring/ClientConfig.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/spring/ClientConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.client.spring; +package com.baeldung.client.spring; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomFilter.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java similarity index 94% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomFilter.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java index 01e5b0b59d..6bb12610fa 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomFilter.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java @@ -1,4 +1,4 @@ -package org.baeldung.filter; +package com.baeldung.filter; import org.springframework.web.filter.GenericFilterBean; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java similarity index 95% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java index 7ca2a80c52..fb597e46c8 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java @@ -1,6 +1,6 @@ -package org.baeldung.filter; +package com.baeldung.filter; -import org.baeldung.security.RestAuthenticationEntryPoint; +import com.baeldung.security.RestAuthenticationEntryPoint; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java similarity index 98% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java index 698052fa2b..7dc53e3e1e 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.io.IOException; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java similarity index 95% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java index 77aa32ff97..1ae89adb89 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.io.IOException; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java similarity index 93% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/SecSecurityConfig.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java index 4ce80dab9f..cddef4d508 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/WebConfig.java similarity index 96% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/WebConfig.java index 5876e1307b..e9d0d277f1 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/WebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.spring; +package com.baeldung.spring; import java.util.List; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/controller/BarController.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java similarity index 95% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/controller/BarController.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java index 5f32b9f73b..6f7dc91e7e 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/controller/BarController.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java @@ -1,9 +1,9 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import java.nio.charset.Charset; import org.apache.commons.codec.binary.Base64; -import org.baeldung.web.dto.Bar; +import com.baeldung.web.dto.Bar; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.http.HttpHeaders; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/controller/FooController.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/controller/FooController.java similarity index 92% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/controller/FooController.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/controller/FooController.java index b50edb2dcf..461a5e351a 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/controller/FooController.java @@ -1,6 +1,6 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; -import org.baeldung.web.dto.Foo; +import com.baeldung.web.dto.Foo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.access.prepost.PreAuthorize; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/dto/Bar.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java similarity index 86% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/dto/Bar.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java index d33e39a823..eb139b0ec1 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/dto/Bar.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.web.dto; import java.io.Serializable; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/dto/Foo.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java similarity index 86% rename from spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/dto/Foo.java rename to spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java index 09c1dac933..23cfab132d 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/org/baeldung/web/dto/Foo.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.web.dto; import java.io.Serializable; diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml index a93dc841b6..2ff9a1de15 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml @@ -23,6 +23,6 @@ - + \ No newline at end of file diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-rest-basic-auth/src/test/java/com/baeldung/SpringContextTest.java similarity index 94% rename from spring-security-modules/spring-security-rest-basic-auth/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-rest-basic-auth/src/test/java/com/baeldung/SpringContextTest.java index f54cbf3b7b..91b34757e2 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 4e839f8e324d3bf68b8d2dac5ba13d96f0350472 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:29:21 +0100 Subject: [PATCH 163/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-rest-custom --- .../{org => com}/baeldung/config/MainWebAppInitializer.java | 2 +- .../baeldung/config/child/MethodSecurityConfig.java | 2 +- .../java/{org => com}/baeldung/config/child/WebConfig.java | 2 +- .../{org => com}/baeldung/config/parent/SecurityConfig.java | 4 ++-- .../{org => com}/baeldung/config/parent/ServiceConfig.java | 2 +- .../baeldung/security/AuthenticationFacade.java | 2 +- .../baeldung/security/CustomAuthenticationProvider.java | 2 +- .../baeldung/security/IAuthenticationFacade.java | 2 +- .../MySavedRequestAwareAuthenticationSuccessHandler.java | 2 +- .../baeldung/security/RestAuthenticationEntryPoint.java | 2 +- .../main/java/{org => com}/baeldung/service/FooService.java | 4 ++-- .../java/{org => com}/baeldung/service/IFooService.java | 4 ++-- .../java/{org => com}/baeldung/service/RunAsService.java | 2 +- .../{org => com}/baeldung/web/controller/FooController.java | 6 +++--- .../controller/GetUserWithCustomInterfaceController.java | 4 ++-- .../controller/GetUserWithHTTPServletRequestController.java | 2 +- .../baeldung/web/controller/RunAsController.java | 2 +- .../baeldung/web/controller/SecurityController.java | 2 +- .../baeldung/web/controller/SecurityController1.java | 2 +- .../baeldung/web/controller/SecurityController3.java | 2 +- .../baeldung/web/controller/ViewController.java | 2 +- .../src/main/java/{org => com}/baeldung/web/dto/Foo.java | 2 +- 22 files changed, 28 insertions(+), 28 deletions(-) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/config/MainWebAppInitializer.java (98%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/config/child/MethodSecurityConfig.java (97%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/config/child/WebConfig.java (98%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/config/parent/SecurityConfig.java (93%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/config/parent/ServiceConfig.java (95%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/security/AuthenticationFacade.java (93%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/security/CustomAuthenticationProvider.java (98%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/security/IAuthenticationFacade.java (81%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java (98%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/security/RestAuthenticationEntryPoint.java (95%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/service/FooService.java (93%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/service/IFooService.java (52%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/service/RunAsService.java (94%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/FooController.java (91%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/GetUserWithCustomInterfaceController.java (90%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/GetUserWithHTTPServletRequestController.java (95%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/RunAsController.java (95%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/SecurityController.java (94%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/SecurityController1.java (97%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/SecurityController3.java (95%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/controller/ViewController.java (90%) rename spring-security-modules/spring-security-rest-custom/src/main/java/{org => com}/baeldung/web/dto/Foo.java (86%) diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/MainWebAppInitializer.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/MainWebAppInitializer.java similarity index 98% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/MainWebAppInitializer.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/MainWebAppInitializer.java index 0a11cdab72..f24c96a686 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/MainWebAppInitializer.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/MainWebAppInitializer.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import java.util.Set; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/child/MethodSecurityConfig.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/MethodSecurityConfig.java similarity index 97% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/child/MethodSecurityConfig.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/MethodSecurityConfig.java index bc9a9f161b..7fb282ae8b 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/child/MethodSecurityConfig.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/MethodSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config.child; +package com.baeldung.config.child; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/child/WebConfig.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/WebConfig.java similarity index 98% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/child/WebConfig.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/WebConfig.java index 7cbbcf31fa..0c95acc177 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/child/WebConfig.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/WebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config.child; +package com.baeldung.config.child; import java.util.List; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/parent/SecurityConfig.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/SecurityConfig.java similarity index 93% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/parent/SecurityConfig.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/SecurityConfig.java index fb3880a33f..36ce898fb6 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/parent/SecurityConfig.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/SecurityConfig.java @@ -1,6 +1,6 @@ -package org.baeldung.config.parent; +package com.baeldung.config.parent; -import org.baeldung.security.CustomAuthenticationProvider; +import com.baeldung.security.CustomAuthenticationProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/parent/ServiceConfig.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/ServiceConfig.java similarity index 95% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/parent/ServiceConfig.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/ServiceConfig.java index 02af0165f4..6e45a32a87 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/config/parent/ServiceConfig.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/ServiceConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config.parent; +package com.baeldung.config.parent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/AuthenticationFacade.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/AuthenticationFacade.java similarity index 93% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/AuthenticationFacade.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/AuthenticationFacade.java index 5a3c77b070..bcf0ef0499 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/AuthenticationFacade.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/AuthenticationFacade.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/CustomAuthenticationProvider.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/CustomAuthenticationProvider.java similarity index 98% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/CustomAuthenticationProvider.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/CustomAuthenticationProvider.java index 4b9b3e8ee9..8e67714431 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/CustomAuthenticationProvider.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/CustomAuthenticationProvider.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.util.ArrayList; import java.util.List; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/IAuthenticationFacade.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/IAuthenticationFacade.java similarity index 81% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/IAuthenticationFacade.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/IAuthenticationFacade.java index d1223e41cf..bffbc3fef0 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/IAuthenticationFacade.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/IAuthenticationFacade.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import org.springframework.security.core.Authentication; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java similarity index 98% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java index 698052fa2b..7dc53e3e1e 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.io.IOException; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java similarity index 95% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java index 77aa32ff97..1ae89adb89 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package com.baeldung.security; import java.io.IOException; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/FooService.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/FooService.java similarity index 93% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/FooService.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/FooService.java index cb374ae4b0..f97c357566 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/FooService.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/FooService.java @@ -1,6 +1,6 @@ -package org.baeldung.service; +package com.baeldung.service; -import org.baeldung.web.dto.Foo; +import com.baeldung.web.dto.Foo; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/IFooService.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/IFooService.java similarity index 52% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/IFooService.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/IFooService.java index de234b1b45..3ab1faf98b 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/IFooService.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/IFooService.java @@ -1,6 +1,6 @@ -package org.baeldung.service; +package com.baeldung.service; -import org.baeldung.web.dto.Foo; +import com.baeldung.web.dto.Foo; public interface IFooService { diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/RunAsService.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/RunAsService.java similarity index 94% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/RunAsService.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/RunAsService.java index a6320f8b81..412330006b 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/service/RunAsService.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/service/RunAsService.java @@ -1,4 +1,4 @@ -package org.baeldung.service; +package com.baeldung.service; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.Authentication; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/FooController.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/FooController.java similarity index 91% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/FooController.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/FooController.java index 74fd5e403f..696dcccd02 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/FooController.java @@ -1,7 +1,7 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; -import org.baeldung.service.IFooService; -import org.baeldung.web.dto.Foo; +import com.baeldung.service.IFooService; +import com.baeldung.web.dto.Foo; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/GetUserWithCustomInterfaceController.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/GetUserWithCustomInterfaceController.java similarity index 90% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/GetUserWithCustomInterfaceController.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/GetUserWithCustomInterfaceController.java index b8521d6663..4166ca9102 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/GetUserWithCustomInterfaceController.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/GetUserWithCustomInterfaceController.java @@ -1,6 +1,6 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; -import org.baeldung.security.IAuthenticationFacade; +import com.baeldung.security.IAuthenticationFacade; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/GetUserWithHTTPServletRequestController.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/GetUserWithHTTPServletRequestController.java similarity index 95% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/GetUserWithHTTPServletRequestController.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/GetUserWithHTTPServletRequestController.java index ace5688697..2e6951132d 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/GetUserWithHTTPServletRequestController.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/GetUserWithHTTPServletRequestController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import java.security.Principal; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/RunAsController.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/RunAsController.java similarity index 95% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/RunAsController.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/RunAsController.java index 08f39aa5f2..13a3f45bf3 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/RunAsController.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/RunAsController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.Authentication; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController.java similarity index 94% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController.java index 7cf57a5275..f35940f54c 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import java.security.Principal; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController1.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController1.java similarity index 97% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController1.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController1.java index d06f15af93..1951e04dcb 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController1.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController1.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController3.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController3.java similarity index 95% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController3.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController3.java index fb207b43dd..2dcb98286b 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/SecurityController3.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController3.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/ViewController.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/ViewController.java similarity index 90% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/ViewController.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/ViewController.java index fbcb9b979e..870331f134 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/controller/ViewController.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/ViewController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/dto/Foo.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/dto/Foo.java similarity index 86% rename from spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/dto/Foo.java rename to spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/dto/Foo.java index 09c1dac933..23cfab132d 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/org/baeldung/web/dto/Foo.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/dto/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.web.dto; import java.io.Serializable; From 20e72465ccad732536a2be7b9ef2f4b7f479a2ab Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:33:21 +0100 Subject: [PATCH 164/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-sso --- .../java/{org => com}/baeldung/config/AuthServerConfig.java | 2 +- .../baeldung/config/AuthorizationServerApplication.java | 2 +- .../java/{org => com}/baeldung/config/SecurityConfig.java | 2 +- .../java/{org => com}/baeldung/config/UserController.java | 2 +- .../test/java/{org => com}/baeldung/SpringContextTest.java | 4 ++-- .../java/{org => com}/baeldung/UserInfoEndpointLiveTest.java | 2 +- .../src/main/java/com}/baeldung/config/UiApplication.java | 4 ++-- .../src/main/java/com}/baeldung/config/UiSecurityConfig.java | 2 +- .../src/main/java/com}/baeldung/config/UiWebConfig.java | 2 +- .../src/test/java/com}/baeldung/SpringContextTest.java | 4 ++-- .../src/main/java/com}/baeldung/config/UiApplication.java | 4 ++-- .../src/main/java/com}/baeldung/config/UiSecurityConfig.java | 2 +- .../src/main/java/com}/baeldung/config/UiWebConfig.java | 2 +- .../src/test/java/com}/baeldung/SpringContextTest.java | 4 ++-- 14 files changed, 19 insertions(+), 19 deletions(-) rename spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/{org => com}/baeldung/config/AuthServerConfig.java (98%) rename spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/{org => com}/baeldung/config/AuthorizationServerApplication.java (94%) rename spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/{org => com}/baeldung/config/SecurityConfig.java (98%) rename spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/{org => com}/baeldung/config/UserController.java (92%) rename spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/{org => com}/baeldung/SpringContextTest.java (86%) rename spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/{org => com}/baeldung/UserInfoEndpointLiveTest.java (99%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui/src/main/java/org => spring-security-sso-ui-2/src/main/java/com}/baeldung/config/UiApplication.java (95%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui/src/main/java/org => spring-security-sso-ui-2/src/main/java/com}/baeldung/config/UiSecurityConfig.java (96%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui/src/main/java/org => spring-security-sso-ui-2/src/main/java/com}/baeldung/config/UiWebConfig.java (97%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui/src/test/java/org => spring-security-sso-ui-2/src/test/java/com}/baeldung/SpringContextTest.java (88%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui-2/src/main/java/org => spring-security-sso-ui/src/main/java/com}/baeldung/config/UiApplication.java (95%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui-2/src/main/java/org => spring-security-sso-ui/src/main/java/com}/baeldung/config/UiSecurityConfig.java (96%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui-2/src/main/java/org => spring-security-sso-ui/src/main/java/com}/baeldung/config/UiWebConfig.java (97%) rename spring-security-modules/spring-security-sso/{spring-security-sso-ui-2/src/test/java/org => spring-security-sso-ui/src/test/java/com}/baeldung/SpringContextTest.java (88%) diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/AuthServerConfig.java b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/AuthServerConfig.java similarity index 98% rename from spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/AuthServerConfig.java rename to spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/AuthServerConfig.java index 0835f3d721..9a6400abdf 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/AuthServerConfig.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/AuthServerConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/AuthorizationServerApplication.java b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/AuthorizationServerApplication.java similarity index 94% rename from spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/AuthorizationServerApplication.java rename to spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/AuthorizationServerApplication.java index b74d2f144c..5cfcb2bb5b 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/AuthorizationServerApplication.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/AuthorizationServerApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/SecurityConfig.java b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/SecurityConfig.java similarity index 98% rename from spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/SecurityConfig.java rename to spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/SecurityConfig.java index 2254de8e39..29c7549753 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/SecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/UserController.java b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/UserController.java similarity index 92% rename from spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/UserController.java rename to spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/UserController.java index 28128f9d97..80415fbd30 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/org/baeldung/config/UserController.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/main/java/com/baeldung/config/UserController.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import java.security.Principal; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/com/baeldung/SpringContextTest.java similarity index 86% rename from spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/com/baeldung/SpringContextTest.java index f677f683b2..1f07837da9 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.config.AuthorizationServerApplication; +import com.baeldung.config.AuthorizationServerApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/org/baeldung/UserInfoEndpointLiveTest.java b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/com/baeldung/UserInfoEndpointLiveTest.java similarity index 99% rename from spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/org/baeldung/UserInfoEndpointLiveTest.java rename to spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/com/baeldung/UserInfoEndpointLiveTest.java index ffdb1df8fe..104f980dd2 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/org/baeldung/UserInfoEndpointLiveTest.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/src/test/java/com/baeldung/UserInfoEndpointLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import static org.junit.Assert.assertEquals; import java.util.HashMap; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiApplication.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiApplication.java similarity index 95% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiApplication.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiApplication.java index 07d875d805..ca178cfa7e 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiApplication.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -6,10 +6,10 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer import org.springframework.context.annotation.Bean; import org.springframework.web.context.request.RequestContextListener; - @SpringBootApplication public class UiApplication extends SpringBootServletInitializer { + @Bean public RequestContextListener requestContextListener() { return new RequestContextListener(); diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiSecurityConfig.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiSecurityConfig.java similarity index 96% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiSecurityConfig.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiSecurityConfig.java index de81ada9e0..7ef1392659 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiSecurityConfig.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiWebConfig.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiWebConfig.java similarity index 97% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiWebConfig.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiWebConfig.java index c17bb85173..ae5008daa3 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiWebConfig.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/com/baeldung/config/UiWebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/test/java/com/baeldung/SpringContextTest.java similarity index 88% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/test/java/com/baeldung/SpringContextTest.java index 61a2a022ed..1eeab34e94 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.config.UiApplication; +import com.baeldung.config.UiApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiApplication.java similarity index 95% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiApplication.java index 0c20853aed..16d94d6d80 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -6,10 +6,10 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer import org.springframework.context.annotation.Bean; import org.springframework.web.context.request.RequestContextListener; + @SpringBootApplication public class UiApplication extends SpringBootServletInitializer { - @Bean public RequestContextListener requestContextListener() { return new RequestContextListener(); diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiSecurityConfig.java similarity index 96% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiSecurityConfig.java index de81ada9e0..7ef1392659 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiWebConfig.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiWebConfig.java similarity index 97% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiWebConfig.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiWebConfig.java index c17bb85173..ae5008daa3 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiWebConfig.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/main/java/com/baeldung/config/UiWebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/test/java/com/baeldung/SpringContextTest.java similarity index 88% rename from spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-sso/spring-security-sso-ui/src/test/java/com/baeldung/SpringContextTest.java index 61a2a022ed..1eeab34e94 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.config.UiApplication; +import com.baeldung.config.UiApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; From abc4259c99d0a2cf1dfac4949cf809f1d8bcf43f Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:34:53 +0100 Subject: [PATCH 165/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-x509 --- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- .../src/test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) rename spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/test/java/{org => com}/baeldung/SpringContextTest.java (95%) diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/test/java/com/baeldung/SpringContextTest.java index 5c65dd3e8a..1c89f706ab 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/test/java/com/baeldung/SpringContextTest.java similarity index 95% rename from spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/test/java/com/baeldung/SpringContextTest.java index 5c65dd3e8a..1c89f706ab 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From 8586e8de2ac7b35d0970f559ecd5027f713298ea Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:41:34 +0100 Subject: [PATCH 166/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc-digest-auth (finalized) --- .../src/main/java/com/baeldung/spring/SecSecurityConfig.java | 2 +- .../src/main/webapp/WEB-INF/web.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java index cddef4d508..4ba9d47f8d 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource({ "classpath:webSecurityConfig.xml" }) -@ComponentScan("org.baeldung.security") +@ComponentScan("com.baeldung.security") public class SecSecurityConfig { public SecSecurityConfig() { diff --git a/spring-security-modules/spring-security-mvc-digest-auth/src/main/webapp/WEB-INF/web.xml b/spring-security-modules/spring-security-mvc-digest-auth/src/main/webapp/WEB-INF/web.xml index bebd5d9cd3..25f5a91932 100644 --- a/spring-security-modules/spring-security-mvc-digest-auth/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-modules/spring-security-mvc-digest-auth/src/main/webapp/WEB-INF/web.xml @@ -16,7 +16,7 @@ contextConfigLocation - org.baeldung.spring + com.baeldung.spring From 06347b6f1fcef93425b7e2bc2ff72b6ea3975684 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:42:33 +0100 Subject: [PATCH 167/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc-login --- .../src/main/resources/channelWebSecurityConfig.xml | 2 +- .../src/main/resources/webSecurityConfig.xml | 6 +++--- .../src/test/resources/mvc-servlet.xml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-security-modules/spring-security-mvc-login/src/main/resources/channelWebSecurityConfig.xml b/spring-security-modules/spring-security-mvc-login/src/main/resources/channelWebSecurityConfig.xml index eff3e1a1a1..8b8b4cd2f3 100644 --- a/spring-security-modules/spring-security-mvc-login/src/main/resources/channelWebSecurityConfig.xml +++ b/spring-security-modules/spring-security-mvc-login/src/main/resources/channelWebSecurityConfig.xml @@ -23,7 +23,7 @@ - + diff --git a/spring-security-modules/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml index 8a83bf5e93..543792fadc 100644 --- a/spring-security-modules/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml +++ b/spring-security-modules/spring-security-mvc-login/src/main/resources/webSecurityConfig.xml @@ -25,11 +25,11 @@ - + - + - + diff --git a/spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml b/spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml index 4568d319b8..aee837c977 100644 --- a/spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml +++ b/spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml @@ -3,6 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> - + \ No newline at end of file From 15ead38004ecbed71101788557425c5412f94ff6 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:43:08 +0100 Subject: [PATCH 168/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-rest-custom (finalized) --- .../main/java/com/baeldung/config/MainWebAppInitializer.java | 4 ++-- .../src/main/java/com/baeldung/config/child/WebConfig.java | 2 +- .../main/java/com/baeldung/config/parent/SecurityConfig.java | 2 +- .../main/java/com/baeldung/config/parent/ServiceConfig.java | 2 +- .../src/main/webapp/WEB-INF/web_old.xml | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/MainWebAppInitializer.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/MainWebAppInitializer.java index f24c96a686..4957a2604a 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/MainWebAppInitializer.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/MainWebAppInitializer.java @@ -30,7 +30,7 @@ public class MainWebAppInitializer implements WebApplicationInitializer { // Create the 'root' Spring application context final AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); - root.scan("org.baeldung.config.parent"); + root.scan("com.baeldung.config.parent"); // root.getEnvironment().setDefaultProfiles("embedded"); // Manages the lifecycle of the root application context @@ -38,7 +38,7 @@ public class MainWebAppInitializer implements WebApplicationInitializer { // Handles requests into the application final AnnotationConfigWebApplicationContext childWebApplicationContext = new AnnotationConfigWebApplicationContext(); - childWebApplicationContext.scan("org.baeldung.config.child"); + childWebApplicationContext.scan("com.baeldung.config.child"); final ServletRegistration.Dynamic appServlet = sc.addServlet("api", new DispatcherServlet(childWebApplicationContext)); appServlet.setLoadOnStartup(1); final Set mappingConflicts = appServlet.addMapping("/"); diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/WebConfig.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/WebConfig.java index 0c95acc177..011528e3cc 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/WebConfig.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/child/WebConfig.java @@ -23,7 +23,7 @@ import org.thymeleaf.templateresolver.ITemplateResolver; @Configuration @EnableWebMvc -@ComponentScan("org.baeldung.web") +@ComponentScan("com.baeldung.web") //@ImportResource({ "classpath:prop.xml" }) //@PropertySource("classpath:foo.properties") public class WebConfig implements WebMvcConfigurer { diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/SecurityConfig.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/SecurityConfig.java index 36ce898fb6..c4d29ed5b7 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/SecurityConfig.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/SecurityConfig.java @@ -12,7 +12,7 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur @Configuration //@ImportResource({ "classpath:webSecurityConfig.xml" }) @EnableWebSecurity -@ComponentScan("org.baeldung.security") +@ComponentScan("com.baeldung.security") public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/ServiceConfig.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/ServiceConfig.java index 6e45a32a87..55f837f674 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/ServiceConfig.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/config/parent/ServiceConfig.java @@ -7,7 +7,7 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration -@ComponentScan("org.baeldung.service") +@ComponentScan("com.baeldung.service") // @ImportResource({ "classpath:prop.xml" }) @PropertySource("classpath:foo.properties") public class ServiceConfig { diff --git a/spring-security-modules/spring-security-rest-custom/src/main/webapp/WEB-INF/web_old.xml b/spring-security-modules/spring-security-rest-custom/src/main/webapp/WEB-INF/web_old.xml index 0fa9abd258..a498fdfd47 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/webapp/WEB-INF/web_old.xml +++ b/spring-security-modules/spring-security-rest-custom/src/main/webapp/WEB-INF/web_old.xml @@ -16,7 +16,7 @@ contextConfigLocation - org.baeldung.config.parent + com.baeldung.config.parent @@ -29,7 +29,7 @@ org.springframework.web.servlet.DispatcherServlet - + 1 From dee9427fb75f665a8bda63b200fc425892aa2e05 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:43:28 +0100 Subject: [PATCH 169/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-rest-basic-auth (finalized) --- .../src/main/java/com/baeldung/client/spring/ClientConfig.java | 2 +- .../src/main/java/com/baeldung/spring/SecSecurityConfig.java | 2 +- .../src/main/java/com/baeldung/spring/WebConfig.java | 2 +- .../src/main/webapp/WEB-INF/web.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/spring/ClientConfig.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/spring/ClientConfig.java index dd834628a6..03994b55a5 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/spring/ClientConfig.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/client/spring/ClientConfig.java @@ -4,7 +4,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan("org.baeldung.client") +@ComponentScan("com.baeldung.client") public class ClientConfig { public ClientConfig() { diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java index cddef4d508..4ba9d47f8d 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource({ "classpath:webSecurityConfig.xml" }) -@ComponentScan("org.baeldung.security") +@ComponentScan("com.baeldung.security") public class SecSecurityConfig { public SecSecurityConfig() { diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/WebConfig.java b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/WebConfig.java index e9d0d277f1..8d5c1dc7f1 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/WebConfig.java +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/java/com/baeldung/spring/WebConfig.java @@ -11,7 +11,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc -@ComponentScan("org.baeldung.web") +@ComponentScan("com.baeldung.web") public class WebConfig implements WebMvcConfigurer { public WebConfig() { diff --git a/spring-security-modules/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/web.xml b/spring-security-modules/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/web.xml index 83b4aeb0a7..4b2dd54266 100644 --- a/spring-security-modules/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-modules/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/web.xml @@ -12,7 +12,7 @@ contextConfigLocation - org.baeldung.spring + com.baeldung.spring From 19c1d9fa11369efd819974b1b01400b87a89d553 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:43:46 +0100 Subject: [PATCH 170/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-sso (finalized) --- spring-security-modules/spring-security-sso/pom.xml | 2 +- .../spring-security-sso/spring-security-sso-auth-server/pom.xml | 2 +- .../spring-security-sso/spring-security-sso-kerberos/pom.xml | 2 +- .../spring-security-sso/spring-security-sso-ui-2/pom.xml | 2 +- .../spring-security-sso/spring-security-sso-ui/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-security-modules/spring-security-sso/pom.xml b/spring-security-modules/spring-security-sso/pom.xml index 3d9c1bf595..4e5bb49aa3 100644 --- a/spring-security-modules/spring-security-sso/pom.xml +++ b/spring-security-modules/spring-security-sso/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - org.baeldung + com.baeldung spring-security-sso 1.0.0-SNAPSHOT spring-security-sso diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/pom.xml b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/pom.xml index 933cb6a2b2..3537c01e46 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/pom.xml +++ b/spring-security-modules/spring-security-sso/spring-security-sso-auth-server/pom.xml @@ -7,7 +7,7 @@ war - org.baeldung + com.baeldung spring-security-sso 1.0.0-SNAPSHOT diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/pom.xml b/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/pom.xml index 88b9354538..0864ead1c4 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/pom.xml +++ b/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/pom.xml @@ -6,7 +6,7 @@ spring-security-sso-kerberos - org.baeldung + com.baeldung spring-security-sso 1.0.0-SNAPSHOT diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/pom.xml b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/pom.xml index 10592a5e92..0645ba3593 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/pom.xml +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui-2/pom.xml @@ -7,7 +7,7 @@ war - org.baeldung + com.baeldung spring-security-sso 1.0.0-SNAPSHOT diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-ui/pom.xml b/spring-security-modules/spring-security-sso/spring-security-sso-ui/pom.xml index 2f0ac3a42e..d34317a4b0 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-ui/pom.xml +++ b/spring-security-modules/spring-security-sso/spring-security-sso-ui/pom.xml @@ -7,7 +7,7 @@ war - org.baeldung + com.baeldung spring-security-sso 1.0.0-SNAPSHOT From 37fe2f968d6684842562a17586b5500ffd1ca0ae Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 19 Mar 2020 21:44:56 +0100 Subject: [PATCH 171/530] [JAVA-961] Standardize packages in spring-security-modules: spring-security-mvc --- .../java/com/baeldung/monitoring/MetricRegistrySingleton.java | 2 +- .../spring-security-mvc/src/main/webapp/WEB-INF/web.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/monitoring/MetricRegistrySingleton.java b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/monitoring/MetricRegistrySingleton.java index e2224996c2..ce122db609 100644 --- a/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/monitoring/MetricRegistrySingleton.java +++ b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/monitoring/MetricRegistrySingleton.java @@ -13,7 +13,7 @@ public final class MetricRegistrySingleton { public static final MetricRegistry metrics = new MetricRegistry(); static { - Logger logger = LoggerFactory.getLogger("org.baeldung.monitoring"); + Logger logger = LoggerFactory.getLogger("com.baeldung.monitoring"); final Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build(); reporter.start(5, TimeUnit.MINUTES); } diff --git a/spring-security-modules/spring-security-mvc/src/main/webapp/WEB-INF/web.xml b/spring-security-modules/spring-security-mvc/src/main/webapp/WEB-INF/web.xml index 88087c92ed..ec6bc0d3b4 100644 --- a/spring-security-modules/spring-security-mvc/src/main/webapp/WEB-INF/web.xml +++ b/spring-security-modules/spring-security-mvc/src/main/webapp/WEB-INF/web.xml @@ -30,7 +30,7 @@ contextConfigLocation - org.baeldung.spring + com.baeldung.spring @@ -60,7 +60,7 @@ \ No newline at end of file From cac1779e0d10646f2c31eab47ac20747fc1283ea Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 16:52:39 +0530 Subject: [PATCH 173/530] JAVA-626 : retired modules java-math and java-math-2 --- java-math-2/README.md | 9 -- java-math-2/pom.xml | 29 ----- .../algorithms/gcd/GCDImplementation.java | 55 -------- java-math-2/src/main/resources/logback.xml | 13 -- .../gcd/GCDImplementationUnitTest.java | 32 ----- .../logarithm/LogarithmUnitTest.java | 31 ----- java-math/.gitignore | 4 - java-math/README.md | 16 --- java-math/pom.xml | 89 ------------- .../ApacheCommonsCombinationGenerator.java | 29 ----- .../CombinatoricsLibCombinationGenerator.java | 13 -- .../GuavaCombinationsGenerator.java | 17 --- .../IterativeCombinationGenerator.java | 52 -------- ...electionRecursiveCombinationGenerator.java | 53 -------- .../SetRecursiveCombinationGenerator.java | 50 -------- .../DistanceBetweenPointsService.java | 38 ------ .../algorithms/factorial/Factorial.java | 63 --------- .../LinesIntersectionService.java | 21 --- .../mercator/EllipticalMercator.java | 22 ---- .../algorithms/mercator/Mercator.java | 10 -- .../mercator/SphericalMercator.java | 14 -- .../percentage/PercentageCalculator.java | 21 --- .../algorithms/rectanglesoverlap/Point.java | 29 ----- .../rectanglesoverlap/Rectangle.java | 40 ------ .../roundedup/RoundUpToHundred.java | 20 --- .../com/baeldung/matrices/HomemadeMatrix.java | 23 ---- .../BigMatrixMultiplicationBenchmarking.java | 121 ------------------ .../matrices/benchmark/BigMatrixProvider.java | 46 ------- .../MatrixMultiplicationBenchmarking.java | 86 ------------- .../matrices/benchmark/MatrixProvider.java | 33 ----- java-math/src/main/resources/logback.xml | 13 -- .../combination/CombinationUnitTest.java | 35 ----- .../DistanceBetweenPointsServiceUnitTest.java | 52 -------- .../factorial/FactorialUnitTest.java | 72 ----------- .../LinesIntersectionServiceUnitTest.java | 40 ------ .../mercator/EllipticalMercatorUnitTest.java | 22 ---- .../mercator/SphericalMercatorUnitTest.java | 21 --- .../PercentageCalculatorUnitTest.java | 33 ----- .../rectanglesoverlap/RectangleUnitTest.java | 39 ------ .../roundedup/RoundUpToHundredUnitTest.java | 14 -- .../matrices/apache/RealMatrixUnitTest.java | 41 ------ .../matrices/colt/DoubleMatrix2DUnitTest.java | 46 ------- .../matrices/ejml/SimpleMatrixUnitTest.java | 41 ------ .../homemade/HomemadeMatrixUnitTest.java | 54 -------- .../matrices/la4j/Basic2DMatrixUnitTest.java | 42 ------ .../matrices/nd4j/INDArrayUnitTest.java | 42 ------ 46 files changed, 1686 deletions(-) delete mode 100644 java-math-2/README.md delete mode 100644 java-math-2/pom.xml delete mode 100644 java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java delete mode 100644 java-math-2/src/main/resources/logback.xml delete mode 100644 java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java delete mode 100644 java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java delete mode 100644 java-math/.gitignore delete mode 100644 java-math/README.md delete mode 100644 java-math/pom.xml delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/factorial/Factorial.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/mercator/Mercator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java delete mode 100644 java-math/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java delete mode 100644 java-math/src/main/java/com/baeldung/matrices/HomemadeMatrix.java delete mode 100644 java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java delete mode 100644 java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java delete mode 100644 java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java delete mode 100644 java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java delete mode 100644 java-math/src/main/resources/logback.xml delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java delete mode 100644 java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java diff --git a/java-math-2/README.md b/java-math-2/README.md deleted file mode 100644 index 5345564d5d..0000000000 --- a/java-math-2/README.md +++ /dev/null @@ -1,9 +0,0 @@ -## Java Math - -This module contains articles about math in Java. - -### Relevant articles: - -- [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms) -- [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor) -- More articles: [[<-- prev]](/../java-math) diff --git a/java-math-2/pom.xml b/java-math-2/pom.xml deleted file mode 100644 index 7bc05a3a86..0000000000 --- a/java-math-2/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - java-math-2 - 0.0.1-SNAPSHOT - java-math-2 - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.assertj - assertj-core - ${org.assertj.core.version} - test - - - - - - 3.9.0 - - - \ No newline at end of file diff --git a/java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java b/java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java deleted file mode 100644 index d4844abd9c..0000000000 --- a/java-math-2/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.algorithms.gcd; - -public class GCDImplementation { - - public static int gcdByBruteForce(int n1, int n2) { - int gcd = 1; - for (int i = 1; i <= n1 && i <= n2; i++) { - if (n1 % i == 0 && n2 % i == 0) { - gcd = i; - } - } - return gcd; - } - - public static int gcdByEuclidsAlgorithm(int n1, int n2) { - if (n2 == 0) { - return n1; - } - return gcdByEuclidsAlgorithm(n2, n1 % n2); - } - - public static int gcdBySteinsAlgorithm(int n1, int n2) { - if (n1 == 0) { - return n2; - } - - if (n2 == 0) { - return n1; - } - - int n; - for (n = 0; ((n1 | n2) & 1) == 0; n++) { - n1 >>= 1; - n2 >>= 1; - } - - while ((n1 & 1) == 0) { - n1 >>= 1; - } - - do { - while ((n2 & 1) == 0) { - n2 >>= 1; - } - - if (n1 > n2) { - int temp = n1; - n1 = n2; - n2 = temp; - } - n2 = (n2 - n1); - } while (n2 != 0); - return n1 << n; - } -} diff --git a/java-math-2/src/main/resources/logback.xml b/java-math-2/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/java-math-2/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java b/java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java deleted file mode 100644 index d2c91a2eb8..0000000000 --- a/java-math-2/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.algorithms.gcd; - -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class GCDImplementationUnitTest { - - @Test - public void whenCalculatingGCDByBruteForceMethod_thenCorrect() { - int n1 = 60; - int n2 = 90; - int gcd = GCDImplementation.gcdByBruteForce(n1, n2); - assertThat(gcd).isEqualTo(30); - } - - @Test - public void whenCalculatingGCDByEuclidsAlgorithm_thenCorrect() { - int n1 = 60; - int n2 = 90; - int gcd = GCDImplementation.gcdByEuclidsAlgorithm(n1, n2); - assertThat(gcd).isEqualTo(30); - } - - @Test - public void whenCalculatingGCDBySteinsAlgorithm_thenCorrect() { - int n1 = 60; - int n2 = 90; - int gcd = GCDImplementation.gcdBySteinsAlgorithm(n1, n2); - assertThat(gcd).isEqualTo(30); - } -} diff --git a/java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java b/java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java deleted file mode 100644 index facad1edc4..0000000000 --- a/java-math-2/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.algorithms.logarithm; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.Test; - -public class LogarithmUnitTest { - - @Test - public void givenLog10_shouldReturnValidResults() { - assertEquals(Math.log10(100), 2); - assertEquals(Math.log10(1000), 3); - } - - @Test - public void givenLogE_shouldReturnValidResults() { - assertEquals(Math.log(Math.E), 1); - assertEquals(Math.log(10), 2.30258, 0.00001); - } - - @Test - public void givenCustomLog_shouldReturnValidResults() { - assertEquals(customLog(2, 256), 8); - assertEquals(customLog(10, 100), 2); - } - - private static double customLog(double base, double logNumber) { - return Math.log(logNumber) / Math.log(base); - } - -} diff --git a/java-math/.gitignore b/java-math/.gitignore deleted file mode 100644 index 30b2b7442c..0000000000 --- a/java-math/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -.settings/ -.classpath -.project \ No newline at end of file diff --git a/java-math/README.md b/java-math/README.md deleted file mode 100644 index 49ff5afde1..0000000000 --- a/java-math/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## Java Math - -This module contains articles about math in Java. - -### Relevant articles: - -- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) -- [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm) -- [Check If Two Rectangles Overlap In Java](https://www.baeldung.com/java-check-if-two-rectangles-overlap) -- [Calculate the Distance Between Two Points in Java](https://www.baeldung.com/java-distance-between-two-points) -- [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines) -- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred) -- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage) -- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) -- [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging) -- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) diff --git a/java-math/pom.xml b/java-math/pom.xml deleted file mode 100644 index 9b4af4c13d..0000000000 --- a/java-math/pom.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - 4.0.0 - java-math - 0.0.1-SNAPSHOT - java-math - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.apache.commons - commons-math3 - ${commons-math3.version} - - - org.ejml - ejml-all - ${ejml.version} - - - org.nd4j - nd4j-native - ${nd4j.version} - - - org.la4j - la4j - ${la4j.version} - - - colt - colt - ${colt.version} - - - com.google.guava - guava - ${guava.version} - - - org.assertj - assertj-core - ${org.assertj.core.version} - test - - - com.github.dpaukov - combinatoricslib3 - ${combinatoricslib3.version} - - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - - - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - - - - - 3.6.1 - 3.9.0 - 27.0.1-jre - 3.3.0 - 0.38 - 1.0.0-beta4 - 1.2.0 - 0.6.0 - 1.19 - - - \ No newline at end of file diff --git a/java-math/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java b/java-math/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java deleted file mode 100644 index 40142ce940..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.algorithms.combination; - -import java.util.Arrays; -import java.util.Iterator; - -import org.apache.commons.math3.util.CombinatoricsUtils; - -public class ApacheCommonsCombinationGenerator { - - private static final int N = 6; - private static final int R = 3; - - /** - * Print all combinations of r elements from a set - * @param n - number of elements in set - * @param r - number of elements in selection - */ - public static void generate(int n, int r) { - Iterator iterator = CombinatoricsUtils.combinationsIterator(n, r); - while (iterator.hasNext()) { - final int[] combination = iterator.next(); - System.out.println(Arrays.toString(combination)); - } - } - - public static void main(String[] args) { - generate(N, R); - } -} \ No newline at end of file diff --git a/java-math/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java b/java-math/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java deleted file mode 100644 index 0afdeefb8b..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.algorithms.combination; - -import org.paukov.combinatorics3.Generator; - -public class CombinatoricsLibCombinationGenerator { - - public static void main(String[] args) { - Generator.combination(0, 1, 2, 3, 4, 5) - .simple(3) - .stream() - .forEach(System.out::println); - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java b/java-math/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java deleted file mode 100644 index d2783881ba..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.algorithms.combination; - -import java.util.Arrays; -import java.util.Set; - -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; - -public class GuavaCombinationsGenerator { - - public static void main(String[] args) { - - Set> combinations = Sets.combinations(ImmutableSet.of(0, 1, 2, 3, 4, 5), 3); - System.out.println(combinations.size()); - System.out.println(Arrays.toString(combinations.toArray())); - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java b/java-math/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java deleted file mode 100644 index 676d2f41e3..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.algorithms.combination; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class IterativeCombinationGenerator { - - private static final int N = 5; - private static final int R = 2; - - /** - * Generate all combinations of r elements from a set - * @param n the number of elements in input set - * @param r the number of elements in a combination - * @return the list containing all combinations - */ - public List generate(int n, int r) { - List combinations = new ArrayList<>(); - int[] combination = new int[r]; - - // initialize with lowest lexicographic combination - for (int i = 0; i < r; i++) { - combination[i] = i; - } - - while (combination[r - 1] < n) { - combinations.add(combination.clone()); - - // generate next combination in lexicographic order - int t = r - 1; - while (t != 0 && combination[t] == n - r + t) { - t--; - } - combination[t]++; - for (int i = t + 1; i < r; i++) { - combination[i] = combination[i - 1] + 1; - } - } - - return combinations; - } - - public static void main(String[] args) { - IterativeCombinationGenerator generator = new IterativeCombinationGenerator(); - List combinations = generator.generate(N, R); - System.out.println(combinations.size()); - for (int[] combination : combinations) { - System.out.println(Arrays.toString(combination)); - } - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java b/java-math/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java deleted file mode 100644 index 52305b8c2f..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.baeldung.algorithms.combination; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class SelectionRecursiveCombinationGenerator { - - private static final int N = 6; - private static final int R = 3; - - /** - * Generate all combinations of r elements from a set - * @param n - number of elements in input set - * @param r - number of elements to be chosen - * @return the list containing all combinations - */ - public List generate(int n, int r) { - List combinations = new ArrayList<>(); - helper(combinations, new int[r], 0, n - 1, 0); - return combinations; - } - - /** - * Choose elements from set by recursing over elements selected - * @param combinations - List to store generated combinations - * @param data - current combination - * @param start - starting element of remaining set - * @param end - last element of remaining set - * @param index - number of elements chosen so far. - */ - private void helper(List combinations, int data[], int start, int end, int index) { - if (index == data.length) { - int[] combination = data.clone(); - combinations.add(combination); - } else { - int max = Math.min(end, end + 1 - data.length + index); - for (int i = start; i <= max; i++) { - data[index] = i; - helper(combinations, data, i + 1, end, index + 1); - } - } - } - - public static void main(String[] args) { - SelectionRecursiveCombinationGenerator generator = new SelectionRecursiveCombinationGenerator(); - List combinations = generator.generate(N, R); - for (int[] combination : combinations) { - System.out.println(Arrays.toString(combination)); - } - System.out.printf("generated %d combinations of %d items from %d ", combinations.size(), R, N); - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java b/java-math/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java deleted file mode 100644 index a73447b31d..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.algorithms.combination; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class SetRecursiveCombinationGenerator { - - private static final int N = 5; - private static final int R = 2; - - /** - * Generate all combinations of r elements from a set - * @param n - number of elements in set - * @param r - number of elements in selection - * @return the list containing all combinations - */ - public List generate(int n, int r) { - List combinations = new ArrayList<>(); - helper(combinations, new int[r], 0, n-1, 0); - return combinations; - } - - /** - * @param combinations - List to contain the generated combinations - * @param data - List of elements in the selection - * @param start - index of the starting element in the remaining set - * @param end - index of the last element in the set - * @param index - number of elements selected so far - */ - private void helper(List combinations, int data[], int start, int end, int index) { - if (index == data.length) { - int[] combination = data.clone(); - combinations.add(combination); - } else if (start <= end) { - data[index] = start; - helper(combinations, data, start + 1, end, index + 1); - helper(combinations, data, start + 1, end, index); - } - } - - public static void main(String[] args) { - SetRecursiveCombinationGenerator generator = new SetRecursiveCombinationGenerator(); - List combinations = generator.generate(N, R); - for (int[] combination : combinations) { - System.out.println(Arrays.toString(combination)); - } - System.out.printf("generated %d combinations of %d items from %d ", combinations.size(), R, N); - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java b/java-math/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java deleted file mode 100644 index 0c8eb86a38..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.algorithms.distancebetweenpoints; - -import java.awt.geom.Point2D; - -public class DistanceBetweenPointsService { - - public double calculateDistanceBetweenPoints( - double x1, - double y1, - double x2, - double y2) { - - return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); - } - - public double calculateDistanceBetweenPointsWithHypot( - double x1, - double y1, - double x2, - double y2) { - - double ac = Math.abs(y2 - y1); - double cb = Math.abs(x2 - x1); - - return Math.hypot(ac, cb); - } - - public double calculateDistanceBetweenPointsWithPoint2D( - double x1, - double y1, - double x2, - double y2) { - - return Point2D.distance(x1, y1, x2, y2); - - } - -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/factorial/Factorial.java b/java-math/src/main/java/com/baeldung/algorithms/factorial/Factorial.java deleted file mode 100644 index 43d2221773..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/factorial/Factorial.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.algorithms.factorial; - -import java.math.BigInteger; -import java.util.stream.LongStream; - -import org.apache.commons.math3.util.CombinatoricsUtils; - -import com.google.common.math.BigIntegerMath; - -public class Factorial { - - public long factorialUsingForLoop(int n) { - long fact = 1; - for (int i = 2; i <= n; i++) { - fact = fact * i; - } - return fact; - } - - public long factorialUsingStreams(int n) { - return LongStream.rangeClosed(1, n) - .reduce(1, (long x, long y) -> x * y); - } - - public long factorialUsingRecursion(int n) { - if (n <= 2) { - return n; - } - return n * factorialUsingRecursion(n - 1); - } - - private Long[] factorials = new Long[20]; - - public long factorialUsingMemoize(int n) { - - if (factorials[n] != null) { - return factorials[n]; - } - - if (n <= 2) { - return n; - } - long nthValue = n * factorialUsingMemoize(n - 1); - factorials[n] = nthValue; - return nthValue; - } - - public BigInteger factorialHavingLargeResult(int n) { - BigInteger result = BigInteger.ONE; - for (int i = 2; i <= n; i++) - result = result.multiply(BigInteger.valueOf(i)); - return result; - } - - public long factorialUsingApacheCommons(int n) { - return CombinatoricsUtils.factorial(n); - } - - public BigInteger factorialUsingGuava(int n) { - return BigIntegerMath.factorial(n); - } - -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java b/java-math/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java deleted file mode 100644 index 35d6c8b424..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.algorithms.linesintersection; - -import java.awt.Point; -import java.util.Optional; - -public class LinesIntersectionService { - - public Optional calculateIntersectionPoint(double m1, double b1, double m2, double b2) { - - if (m1 == m2) { - return Optional.empty(); - } - - double x = (b2 - b1) / (m1 - m2); - double y = m1 * x + b1; - - Point point = new Point(); - point.setLocation(x, y); - return Optional.of(point); - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java b/java-math/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java deleted file mode 100644 index e1c41f9518..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.algorithms.mercator; - -class EllipticalMercator extends Mercator { - - @Override - double yAxisProjection(double input) { - - input = Math.min(Math.max(input, -89.5), 89.5); - double earthDimensionalRateNormalized = 1.0 - Math.pow(RADIUS_MINOR / RADIUS_MAJOR, 2); - - double inputOnEarthProj = Math.sqrt(earthDimensionalRateNormalized) * Math.sin( Math.toRadians(input)); - - inputOnEarthProj = Math.pow(((1.0 - inputOnEarthProj)/(1.0+inputOnEarthProj)), 0.5 * Math.sqrt(earthDimensionalRateNormalized)); - double inputOnEarthProjNormalized = Math.tan(0.5 * ((Math.PI*0.5) - Math.toRadians(input)))/inputOnEarthProj; - return (-1) * RADIUS_MAJOR * Math.log(inputOnEarthProjNormalized); - } - - @Override - double xAxisProjection(double input) { - return RADIUS_MAJOR * Math.toRadians(input); - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/mercator/Mercator.java b/java-math/src/main/java/com/baeldung/algorithms/mercator/Mercator.java deleted file mode 100644 index b289b1839d..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/mercator/Mercator.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.algorithms.mercator; - -abstract class Mercator { - final static double RADIUS_MAJOR = 6378137.0; - final static double RADIUS_MINOR = 6356752.3142; - - abstract double yAxisProjection(double input); - - abstract double xAxisProjection(double input); -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java b/java-math/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java deleted file mode 100644 index 1be976d82e..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.algorithms.mercator; - -public class SphericalMercator extends Mercator { - - @Override - double xAxisProjection(double input) { - return Math.toRadians(input) * RADIUS_MAJOR; - } - - @Override - double yAxisProjection(double input) { - return Math.log(Math.tan(Math.PI / 4 + Math.toRadians(input) / 2)) * RADIUS_MAJOR; - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java b/java-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java deleted file mode 100644 index f69b23146e..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.algorithms.percentage; - -import java.util.Scanner; - -public class PercentageCalculator { - - public double calculatePercentage(double obtained,double total){ - return obtained*100/total; - } - - public static void main(String[] args) { - PercentageCalculator pc = new PercentageCalculator(); - Scanner in = new Scanner(System.in); - System.out.println("Enter obtained marks:"); - double obtained = in.nextDouble(); - System.out.println("Enter total marks:"); - double total =in.nextDouble(); - System.out.println("Percentage obtained :"+pc.calculatePercentage(obtained,total)); - } - -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java b/java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java deleted file mode 100644 index 68b1e7c594..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.algorithms.rectanglesoverlap; - -public class Point { - - private int x; - private int y; - - public Point(int x, int y) { - this.x = x; - this.y = y; - } - - public int getX() { - return x; - } - - public void setX(int x) { - this.x = x; - } - - public int getY() { - return y; - } - - public void setY(int y) { - this.y = y; - } - -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java b/java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java deleted file mode 100644 index 38f5edec61..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.algorithms.rectanglesoverlap; - -public class Rectangle { - - private Point bottomLeft; - private Point topRight; - - public Rectangle(Point bottomLeft, Point topRight) { - this.bottomLeft = bottomLeft; - this.topRight = topRight; - } - - public Point getBottomLeft() { - return bottomLeft; - } - - public void setBottomLeft(Point bottomLeft) { - this.bottomLeft = bottomLeft; - } - - public Point getTopRight() { - return topRight; - } - - public void setTopRight(Point topRight) { - this.topRight = topRight; - } - - public boolean isOverlapping(Rectangle other) { - // one rectangle is to the top of the other - if (this.topRight.getY() < other.bottomLeft.getY() || this.bottomLeft.getY() > other.topRight.getY()) { - return false; - } - // one rectangle is to the left of the other - if (this.topRight.getX() < other.bottomLeft.getX() || this.bottomLeft.getX() > other.topRight.getX()) { - return false; - } - return true; - } -} diff --git a/java-math/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java b/java-math/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java deleted file mode 100644 index 333019e294..0000000000 --- a/java-math/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.algorithms.roundedup; - -import java.util.Scanner; - -public class RoundUpToHundred { - - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - double input = scanner.nextDouble(); - scanner.close(); - - RoundUpToHundred.round(input); - } - - static long round(double input) { - long i = (long) Math.ceil(input); - return ((i + 99) / 100) * 100; - }; - -} diff --git a/java-math/src/main/java/com/baeldung/matrices/HomemadeMatrix.java b/java-math/src/main/java/com/baeldung/matrices/HomemadeMatrix.java deleted file mode 100644 index 0676250959..0000000000 --- a/java-math/src/main/java/com/baeldung/matrices/HomemadeMatrix.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.matrices; - -public class HomemadeMatrix { - public static double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) { - double[][] result = new double[firstMatrix.length][secondMatrix[0].length]; - - for (int row = 0; row < result.length; row++) { - for (int col = 0; col < result[row].length; col++) { - result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col); - } - } - - return result; - } - - private static double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) { - double cell = 0; - for (int i = 0; i < secondMatrix.length; i++) { - cell += firstMatrix[row][i] * secondMatrix[i][col]; - } - return cell; - } -} \ No newline at end of file diff --git a/java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java b/java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java deleted file mode 100644 index 2ed983f733..0000000000 --- a/java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.baeldung.matrices.benchmark; - -import cern.colt.matrix.DoubleFactory2D; -import cern.colt.matrix.DoubleMatrix2D; -import cern.colt.matrix.linalg.Algebra; -import com.baeldung.matrices.HomemadeMatrix; -import org.apache.commons.math3.linear.Array2DRowRealMatrix; -import org.apache.commons.math3.linear.RealMatrix; -import org.ejml.simple.SimpleMatrix; -import org.la4j.Matrix; -import org.la4j.matrix.dense.Basic2DMatrix; -import org.nd4j.linalg.api.ndarray.INDArray; -import org.nd4j.linalg.factory.Nd4j; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.options.ChainedOptionsBuilder; -import org.openjdk.jmh.runner.options.OptionsBuilder; - -import java.util.Arrays; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -public class BigMatrixMultiplicationBenchmarking { - private static final int DEFAULT_FORKS = 2; - private static final int DEFAULT_WARMUP_ITERATIONS = 5; - private static final int DEFAULT_MEASUREMENT_ITERATIONS = 10; - - public static void main(String[] args) throws Exception { - Map parameters = parseParameters(args); - - ChainedOptionsBuilder builder = new OptionsBuilder() - .include(BigMatrixMultiplicationBenchmarking.class.getSimpleName()) - .mode(Mode.AverageTime) - .forks(forks(parameters)) - .warmupIterations(warmupIterations(parameters)) - .measurementIterations(measurementIterations(parameters)) - .timeUnit(TimeUnit.SECONDS); - - parameters.forEach(builder::param); - - new Runner(builder.build()).run(); - } - - private static Map parseParameters(String[] args) { - return Arrays.stream(args) - .map(arg -> arg.split("=")) - .collect(Collectors.toMap( - arg -> arg[0], - arg -> arg[1] - )); - } - - private static int forks(Map parameters) { - String forks = parameters.remove("forks"); - return parseOrDefault(forks, DEFAULT_FORKS); - } - - private static int warmupIterations(Map parameters) { - String warmups = parameters.remove("warmupIterations"); - return parseOrDefault(warmups, DEFAULT_WARMUP_ITERATIONS); - } - - private static int measurementIterations(Map parameters) { - String measurements = parameters.remove("measurementIterations"); - return parseOrDefault(measurements, DEFAULT_MEASUREMENT_ITERATIONS); - } - - private static int parseOrDefault(String parameter, int defaultValue) { - return parameter != null ? Integer.parseInt(parameter) : defaultValue; - } - - @Benchmark - public Object homemadeMatrixMultiplication(BigMatrixProvider matrixProvider) { - return HomemadeMatrix.multiplyMatrices(matrixProvider.getFirstMatrix(), matrixProvider.getSecondMatrix()); - } - - @Benchmark - public Object ejmlMatrixMultiplication(BigMatrixProvider matrixProvider) { - SimpleMatrix firstMatrix = new SimpleMatrix(matrixProvider.getFirstMatrix()); - SimpleMatrix secondMatrix = new SimpleMatrix(matrixProvider.getSecondMatrix()); - - return firstMatrix.mult(secondMatrix); - } - - @Benchmark - public Object apacheCommonsMatrixMultiplication(BigMatrixProvider matrixProvider) { - RealMatrix firstMatrix = new Array2DRowRealMatrix(matrixProvider.getFirstMatrix()); - RealMatrix secondMatrix = new Array2DRowRealMatrix(matrixProvider.getSecondMatrix()); - - return firstMatrix.multiply(secondMatrix); - } - - @Benchmark - public Object la4jMatrixMultiplication(BigMatrixProvider matrixProvider) { - Matrix firstMatrix = new Basic2DMatrix(matrixProvider.getFirstMatrix()); - Matrix secondMatrix = new Basic2DMatrix(matrixProvider.getSecondMatrix()); - - return firstMatrix.multiply(secondMatrix); - } - - @Benchmark - public Object nd4jMatrixMultiplication(BigMatrixProvider matrixProvider) { - INDArray firstMatrix = Nd4j.create(matrixProvider.getFirstMatrix()); - INDArray secondMatrix = Nd4j.create(matrixProvider.getSecondMatrix()); - - return firstMatrix.mmul(secondMatrix); - } - - @Benchmark - public Object coltMatrixMultiplication(BigMatrixProvider matrixProvider) { - DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense; - - DoubleMatrix2D firstMatrix = doubleFactory2D.make(matrixProvider.getFirstMatrix()); - DoubleMatrix2D secondMatrix = doubleFactory2D.make(matrixProvider.getSecondMatrix()); - - Algebra algebra = new Algebra(); - return algebra.mult(firstMatrix, secondMatrix); - } -} \ No newline at end of file diff --git a/java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java b/java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java deleted file mode 100644 index d0f8a03fe3..0000000000 --- a/java-math/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.matrices.benchmark; - -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.infra.BenchmarkParams; - -import java.util.Random; -import java.util.stream.DoubleStream; - -@State(Scope.Benchmark) -public class BigMatrixProvider { - @Param({}) - private int matrixSize; - private double[][] firstMatrix; - private double[][] secondMatrix; - - public BigMatrixProvider() {} - - @Setup - public void setup(BenchmarkParams parameters) { - firstMatrix = createMatrix(matrixSize); - secondMatrix = createMatrix(matrixSize); - } - - private double[][] createMatrix(int matrixSize) { - Random random = new Random(); - - double[][] result = new double[matrixSize][matrixSize]; - for (int row = 0; row < result.length; row++) { - for (int col = 0; col < result[row].length; col++) { - result[row][col] = random.nextDouble(); - } - } - return result; - } - - public double[][] getFirstMatrix() { - return firstMatrix; - } - - public double[][] getSecondMatrix() { - return secondMatrix; - } -} \ No newline at end of file diff --git a/java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java b/java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java deleted file mode 100644 index fdb423e8da..0000000000 --- a/java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.baeldung.matrices.benchmark; - -import cern.colt.matrix.DoubleFactory2D; -import cern.colt.matrix.DoubleMatrix2D; -import cern.colt.matrix.linalg.Algebra; -import com.baeldung.matrices.HomemadeMatrix; -import org.apache.commons.math3.linear.Array2DRowRealMatrix; -import org.apache.commons.math3.linear.RealMatrix; -import org.ejml.simple.SimpleMatrix; -import org.la4j.Matrix; -import org.la4j.matrix.dense.Basic2DMatrix; -import org.nd4j.linalg.api.ndarray.INDArray; -import org.nd4j.linalg.factory.Nd4j; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Mode; -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; - -public class MatrixMultiplicationBenchmarking { - - public static void main(String[] args) throws Exception { - Options opt = new OptionsBuilder() - .include(MatrixMultiplicationBenchmarking.class.getSimpleName()) - .exclude(BigMatrixMultiplicationBenchmarking.class.getSimpleName()) - .mode(Mode.AverageTime) - .forks(2) - .warmupIterations(10) - .measurementIterations(10) - .timeUnit(TimeUnit.MICROSECONDS) - .build(); - - new Runner(opt).run(); - } - - @Benchmark - public Object homemadeMatrixMultiplication(MatrixProvider matrixProvider) { - return HomemadeMatrix.multiplyMatrices(matrixProvider.getFirstMatrix(), matrixProvider.getSecondMatrix()); - } - - @Benchmark - public Object ejmlMatrixMultiplication(MatrixProvider matrixProvider) { - SimpleMatrix firstMatrix = new SimpleMatrix(matrixProvider.getFirstMatrix()); - SimpleMatrix secondMatrix = new SimpleMatrix(matrixProvider.getSecondMatrix()); - - return firstMatrix.mult(secondMatrix); - } - - @Benchmark - public Object apacheCommonsMatrixMultiplication(MatrixProvider matrixProvider) { - RealMatrix firstMatrix = new Array2DRowRealMatrix(matrixProvider.getFirstMatrix()); - RealMatrix secondMatrix = new Array2DRowRealMatrix(matrixProvider.getSecondMatrix()); - - return firstMatrix.multiply(secondMatrix); - } - - @Benchmark - public Object la4jMatrixMultiplication(MatrixProvider matrixProvider) { - Matrix firstMatrix = new Basic2DMatrix(matrixProvider.getFirstMatrix()); - Matrix secondMatrix = new Basic2DMatrix(matrixProvider.getSecondMatrix()); - - return firstMatrix.multiply(secondMatrix); - } - - @Benchmark - public Object nd4jMatrixMultiplication(MatrixProvider matrixProvider) { - INDArray firstMatrix = Nd4j.create(matrixProvider.getFirstMatrix()); - INDArray secondMatrix = Nd4j.create(matrixProvider.getSecondMatrix()); - - return firstMatrix.mmul(secondMatrix); - } - - @Benchmark - public Object coltMatrixMultiplication(MatrixProvider matrixProvider) { - DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense; - - DoubleMatrix2D firstMatrix = doubleFactory2D.make(matrixProvider.getFirstMatrix()); - DoubleMatrix2D secondMatrix = doubleFactory2D.make(matrixProvider.getSecondMatrix()); - - Algebra algebra = new Algebra(); - return algebra.mult(firstMatrix, secondMatrix); - } - -} \ No newline at end of file diff --git a/java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java b/java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java deleted file mode 100644 index d401ba2ab6..0000000000 --- a/java-math/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.matrices.benchmark; - -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.State; - -@State(Scope.Benchmark) -public class MatrixProvider { - private double[][] firstMatrix; - private double[][] secondMatrix; - - public MatrixProvider() { - firstMatrix = - new double[][] { - new double[] {1d, 5d}, - new double[] {2d, 3d}, - new double[] {1d ,7d} - }; - - secondMatrix = - new double[][] { - new double[] {1d, 2d, 3d, 7d}, - new double[] {5d, 2d, 8d, 1d} - }; - } - - public double[][] getFirstMatrix() { - return firstMatrix; - } - - public double[][] getSecondMatrix() { - return secondMatrix; - } -} \ No newline at end of file diff --git a/java-math/src/main/resources/logback.xml b/java-math/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/java-math/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/java-math/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java deleted file mode 100644 index 987b6ddae6..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.algorithms.combination; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - -import org.junit.Test; - -public class CombinationUnitTest { - - private static final int N = 5; - private static final int R = 3; - private static final int nCr = 10; - - @Test - public void givenSetAndSelectionSize_whenCalculatedUsingSetRecursiveAlgorithm_thenExpectedCount() { - SetRecursiveCombinationGenerator generator = new SetRecursiveCombinationGenerator(); - List selection = generator.generate(N, R); - assertEquals(nCr, selection.size()); - } - - @Test - public void givenSetAndSelectionSize_whenCalculatedUsingSelectionRecursiveAlgorithm_thenExpectedCount() { - SelectionRecursiveCombinationGenerator generator = new SelectionRecursiveCombinationGenerator(); - List selection = generator.generate(N, R); - assertEquals(nCr, selection.size()); - } - - @Test - public void givenSetAndSelectionSize_whenCalculatedUsingIterativeAlgorithm_thenExpectedCount() { - IterativeCombinationGenerator generator = new IterativeCombinationGenerator(); - List selection = generator.generate(N, R); - assertEquals(nCr, selection.size()); - } -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java deleted file mode 100644 index 784681a807..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.algorithms.distancebetweenpoints; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class DistanceBetweenPointsServiceUnitTest { - - private DistanceBetweenPointsService service = new DistanceBetweenPointsService(); - - @Test - public void givenTwoPoints_whenCalculateDistanceByFormula_thenCorrect() { - - double x1 = 3; - double y1 = 4; - double x2 = 7; - double y2 = 1; - - double distance = service.calculateDistanceBetweenPoints(x1, y1, x2, y2); - - assertEquals(distance, 5, 0.001); - - } - - @Test - public void givenTwoPoints_whenCalculateDistanceWithHypot_thenCorrect() { - - double x1 = 3; - double y1 = 4; - double x2 = 7; - double y2 = 1; - - double distance = service.calculateDistanceBetweenPointsWithHypot(x1, y1, x2, y2); - - assertEquals(distance, 5, 0.001); - - } - - @Test - public void givenTwoPoints_whenCalculateDistanceWithPoint2D_thenCorrect() { - - double x1 = 3; - double y1 = 4; - double x2 = 7; - double y2 = 1; - - double distance = service.calculateDistanceBetweenPointsWithPoint2D(x1, y1, x2, y2); - - assertEquals(distance, 5, 0.001); - - } -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java deleted file mode 100644 index c185dba62b..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.baeldung.algorithms.factorial; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.math.BigInteger; - -import org.junit.Before; -import org.junit.Test; - -public class FactorialUnitTest { - - Factorial factorial; - - @Before - public void setup() { - factorial = new Factorial(); - } - - @Test - public void whenCalculatingFactorialUsingForLoop_thenCorrect() { - int n = 5; - - assertThat(factorial.factorialUsingForLoop(n)).isEqualTo(120); - } - - @Test - public void whenCalculatingFactorialUsingStreams_thenCorrect() { - int n = 5; - - assertThat(factorial.factorialUsingStreams(n)).isEqualTo(120); - } - - @Test - public void whenCalculatingFactorialUsingRecursion_thenCorrect() { - int n = 5; - - assertThat(factorial.factorialUsingRecursion(n)).isEqualTo(120); - } - - @Test - public void whenCalculatingFactorialUsingMemoize_thenCorrect() { - int n = 5; - - assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(120); - - n = 6; - - assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(720); - } - - @Test - public void whenCalculatingFactorialHavingLargeResult_thenCorrect() { - int n = 22; - - assertThat(factorial.factorialHavingLargeResult(n)).isEqualTo(new BigInteger("1124000727777607680000")); - } - - @Test - public void whenCalculatingFactorialUsingApacheCommons_thenCorrect() { - int n = 5; - - assertThat(factorial.factorialUsingApacheCommons(n)).isEqualTo(120); - } - - @Test - public void whenCalculatingFactorialUsingGuava_thenCorrect() { - int n = 22; - - assertThat(factorial.factorialUsingGuava(n)).isEqualTo(new BigInteger("1124000727777607680000")); - } - -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java deleted file mode 100644 index 22371107f3..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.algorithms.linesintersection; - -import java.awt.Point; -import java.util.Optional; - -import org.junit.Test; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertEquals; - -public class LinesIntersectionServiceUnitTest { - private LinesIntersectionService service = new LinesIntersectionService(); - - @Test - public void givenNotParallelLines_whenCalculatePoint_thenPresent() { - - double m1 = 0; - double b1 = 0; - double m2 = 1; - double b2 = -1; - - Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); - - assertTrue(point.isPresent()); - assertEquals(point.get().getX(), 1, 0.001); - assertEquals(point.get().getY(), 0, 0.001); - } - - @Test - public void givenParallelLines_whenCalculatePoint_thenEmpty() { - double m1 = 1; - double b1 = 0; - double m2 = 1; - double b2 = -1; - - Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); - - assertFalse(point.isPresent()); - } -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java deleted file mode 100644 index 96b644c46c..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.algorithms.mercator; - -import org.junit.Assert; -import org.junit.Test; - - -public class EllipticalMercatorUnitTest { - - @Test - public void giventThatTheInputIs22_whenXAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { - Mercator mercator = new EllipticalMercator(); - double result = mercator.xAxisProjection(22); - Assert.assertEquals(result, 2449028.7974520186, 0.0); - } - - @Test - public void giventThatTheInputIs44_whenYAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { - Mercator mercator = new EllipticalMercator(); - double result = mercator.yAxisProjection(44); - Assert.assertEquals(result, 5435749.887511954, 0.0); - } -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java deleted file mode 100644 index 348c6ad3e4..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.algorithms.mercator; - -import org.junit.Assert; -import org.junit.Test; - -public class SphericalMercatorUnitTest { - - @Test - public void giventThatTheInputIs22_whenXAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { - Mercator mercator = new SphericalMercator(); - double result = mercator.xAxisProjection(22); - Assert.assertEquals(result, 2449028.7974520186, 0.0); - } - - @Test - public void giventThatTheInputIs44_whenYAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { - Mercator mercator = new SphericalMercator(); - double result = mercator.yAxisProjection(44); - Assert.assertEquals(result, 5465442.183322753, 0.0); - } -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java deleted file mode 100644 index e49acc0c4b..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.algorithms.percentage; - -import org.junit.Assert; -import org.junit.Test; - -public class PercentageCalculatorUnitTest { - private PercentageCalculator pc = new PercentageCalculator(); - - @Test - public void whenPass2Integers_thenShouldCalculatePercentage(){ - Assert.assertEquals("Result not as expected", - 50.0,pc.calculatePercentage(50,100),0.1); - } - - @Test - public void whenPassObtainedMarksAsDouble_thenShouldCalculatePercentage(){ - Assert.assertEquals("Result not as expected",5.05, - pc.calculatePercentage(50.5,1000),0.1); - } - - @Test - public void whenPassTotalMarksAsDouble_thenShouldCalculatePercentage(){ - Assert.assertEquals("Result not as expected",19.6, - pc.calculatePercentage(5,25.5),0.1); - } - - @Test - public void whenPass2DoubleNumbers_thenShouldCalculatePercentage(){ - Assert.assertEquals("Result not as expected",20, - pc.calculatePercentage(5.5,27.5),0.1); - } - -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java deleted file mode 100644 index e4bb614b48..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.algorithms.rectanglesoverlap; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import org.junit.Test; - -public class RectangleUnitTest { - - @Test - public void givenTwoOverlappingRectangles_whenisOverlappingCalled_shouldReturnTrue() { - Rectangle rectangle1 = new Rectangle(new Point(2, 1), new Point(4, 3)); - Rectangle rectangle2 = new Rectangle(new Point(1, 1), new Point(6, 4)); - assertTrue(rectangle1.isOverlapping(rectangle2)); - - rectangle1 = new Rectangle(new Point(-5, -2), new Point(2, 3)); - rectangle2 = new Rectangle(new Point(-2, -1), new Point(5, 2)); - assertTrue(rectangle1.isOverlapping(rectangle2)); - - rectangle1 = new Rectangle(new Point(-5, 1), new Point(2, 4)); - rectangle2 = new Rectangle(new Point(-2, -2), new Point(5, 5)); - assertTrue(rectangle1.isOverlapping(rectangle2)); - } - - @Test - public void givenTwoNonOverlappingRectangles_whenisOverlappingCalled_shouldReturnFalse() { - Rectangle rectangle1 = new Rectangle(new Point(-5, 1), new Point(-3, 4)); - Rectangle rectangle2 = new Rectangle(new Point(-2, -2), new Point(5, 5)); - assertFalse(rectangle1.isOverlapping(rectangle2)); - - rectangle1 = new Rectangle(new Point(-5, 1), new Point(3, 4)); - rectangle2 = new Rectangle(new Point(-2, -2), new Point(5, -1)); - assertFalse(rectangle1.isOverlapping(rectangle2)); - - rectangle1 = new Rectangle(new Point(-2, 1), new Point(0, 3)); - rectangle2 = new Rectangle(new Point(3, 1), new Point(5, 4)); - assertFalse(rectangle1.isOverlapping(rectangle2)); - } - -} diff --git a/java-math/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java deleted file mode 100644 index 5191d65787..0000000000 --- a/java-math/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.algorithms.roundedup; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class RoundUpToHundredUnitTest { - @Test - public void givenInput_whenRound_thenRoundUpToTheNearestHundred() { - assertEquals("Rounded up to hundred", 100, RoundUpToHundred.round(99)); - assertEquals("Rounded up to three hundred ", 300, RoundUpToHundred.round(200.2)); - assertEquals("Returns same rounded value", 400, RoundUpToHundred.round(400)); - } -} diff --git a/java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java deleted file mode 100644 index e7d99fbe3e..0000000000 --- a/java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.matrices.apache; - -import org.apache.commons.math3.linear.Array2DRowRealMatrix; -import org.apache.commons.math3.linear.RealMatrix; -import org.junit.jupiter.api.Test; -import org.openjdk.jmh.annotations.*; - -import static org.assertj.core.api.Assertions.assertThat; - -class RealMatrixUnitTest { - - @Test - void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { - RealMatrix firstMatrix = new Array2DRowRealMatrix( - new double[][] { - new double[] {1d, 5d}, - new double[] {2d, 3d}, - new double[] {1d ,7d} - } - ); - - RealMatrix secondMatrix = new Array2DRowRealMatrix( - new double[][] { - new double[] {1d, 2d, 3d, 7d}, - new double[] {5d, 2d, 8d, 1d} - } - ); - - RealMatrix expected = new Array2DRowRealMatrix( - new double[][] { - new double[] {26d, 12d, 43d, 12d}, - new double[] {17d, 10d, 30d, 17d}, - new double[] {36d, 16d, 59d, 14d} - } - ); - - RealMatrix actual = firstMatrix.multiply(secondMatrix); - - assertThat(actual).isEqualTo(expected); - } -} diff --git a/java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java deleted file mode 100644 index da66cd7d61..0000000000 --- a/java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.matrices.colt; - -import cern.colt.matrix.DoubleFactory2D; -import cern.colt.matrix.DoubleMatrix2D; -import cern.colt.matrix.linalg.Algebra; -import org.junit.jupiter.api.Test; -import org.openjdk.jmh.annotations.*; - -import static org.assertj.core.api.Assertions.assertThat; - -class DoubleMatrix2DUnitTest { - - @Test - void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { - DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense; - - DoubleMatrix2D firstMatrix = doubleFactory2D.make( - new double[][] { - new double[] {1d, 5d}, - new double[] {2d, 3d}, - new double[] {1d ,7d} - } - ); - - DoubleMatrix2D secondMatrix = doubleFactory2D.make( - new double[][] { - new double[] {1d, 2d, 3d, 7d}, - new double[] {5d, 2d, 8d, 1d} - } - ); - - DoubleMatrix2D expected = doubleFactory2D.make( - new double[][] { - new double[] {26d, 12d, 43d, 12d}, - new double[] {17d, 10d, 30d, 17d}, - new double[] {36d, 16d, 59d, 14d} - } - ); - - Algebra algebra = new Algebra(); - DoubleMatrix2D actual = algebra.mult(firstMatrix, secondMatrix); - - assertThat(actual).isEqualTo(expected); - } - -} \ No newline at end of file diff --git a/java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java deleted file mode 100644 index 60381ece63..0000000000 --- a/java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.matrices.ejml; - -import org.ejml.simple.SimpleMatrix; -import org.junit.jupiter.api.Test; -import org.openjdk.jmh.annotations.*; - -import static org.assertj.core.api.Assertions.assertThat; - -class SimpleMatrixUnitTest { - - @Test - void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { - SimpleMatrix firstMatrix = new SimpleMatrix( - new double[][] { - new double[] {1d, 5d}, - new double[] {2d, 3d}, - new double[] {1d ,7d} - } - ); - - SimpleMatrix secondMatrix = new SimpleMatrix( - new double[][] { - new double[] {1d, 2d, 3d, 7d}, - new double[] {5d, 2d, 8d, 1d} - } - ); - - SimpleMatrix expected = new SimpleMatrix( - new double[][] { - new double[] {26d, 12d, 43d, 12d}, - new double[] {17d, 10d, 30d, 17d}, - new double[] {36d, 16d, 59d, 14d} - } - ); - - SimpleMatrix actual = firstMatrix.mult(secondMatrix); - - assertThat(actual).matches(m -> m.isIdentical(expected, 0d)); - } - -} \ No newline at end of file diff --git a/java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java deleted file mode 100644 index d1a062ee79..0000000000 --- a/java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.matrices.homemade; - -import org.junit.jupiter.api.Test; -import org.openjdk.jmh.annotations.*; - -import static org.assertj.core.api.Assertions.assertThat; - -class HomemadeMatrixUnitTest { - - @Test - void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { - double[][] firstMatrix = { - new double[]{1d, 5d}, - new double[]{2d, 3d}, - new double[]{1d, 7d} - }; - - double[][] secondMatrix = { - new double[]{1d, 2d, 3d, 7d}, - new double[]{5d, 2d, 8d, 1d} - }; - - double[][] expected = { - new double[]{26d, 12d, 43d, 12d}, - new double[]{17d, 10d, 30d, 17d}, - new double[]{36d, 16d, 59d, 14d} - }; - - double[][] actual = multiplyMatrices(firstMatrix, secondMatrix); - - assertThat(actual).isEqualTo(expected); - } - - private double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) { - double[][] result = new double[firstMatrix.length][secondMatrix[0].length]; - - for (int row = 0; row < result.length; row++) { - for (int col = 0; col < result[row].length; col++) { - result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col); - } - } - - return result; - } - - private double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) { - double cell = 0; - for (int i = 0; i < secondMatrix.length; i++) { - cell += firstMatrix[row][i] * secondMatrix[i][col]; - } - return cell; - } - -} \ No newline at end of file diff --git a/java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java deleted file mode 100644 index 01731a3dd5..0000000000 --- a/java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.matrices.la4j; - -import org.junit.jupiter.api.Test; -import org.la4j.Matrix; -import org.la4j.matrix.dense.Basic2DMatrix; -import org.openjdk.jmh.annotations.*; - -import static org.assertj.core.api.Assertions.assertThat; - -class Basic2DMatrixUnitTest { - - @Test - void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { - Matrix firstMatrix = new Basic2DMatrix( - new double[][]{ - new double[]{1d, 5d}, - new double[]{2d, 3d}, - new double[]{1d, 7d} - } - ); - - Matrix secondMatrix = new Basic2DMatrix( - new double[][]{ - new double[]{1d, 2d, 3d, 7d}, - new double[]{5d, 2d, 8d, 1d} - } - ); - - Matrix expected = new Basic2DMatrix( - new double[][]{ - new double[]{26d, 12d, 43d, 12d}, - new double[]{17d, 10d, 30d, 17d}, - new double[]{36d, 16d, 59d, 14d} - } - ); - - Matrix actual = firstMatrix.multiply(secondMatrix); - - assertThat(actual).isEqualTo(expected); - } - -} \ No newline at end of file diff --git a/java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java deleted file mode 100644 index 72ef60a571..0000000000 --- a/java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.matrices.nd4j; - -import org.junit.jupiter.api.Test; -import org.nd4j.linalg.api.ndarray.INDArray; -import org.nd4j.linalg.factory.Nd4j; -import org.openjdk.jmh.annotations.*; - -import static org.assertj.core.api.Assertions.assertThat; - -class INDArrayUnitTest { - - @Test - void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { - INDArray firstMatrix = Nd4j.create( - new double[][]{ - new double[]{1d, 5d}, - new double[]{2d, 3d}, - new double[]{1d, 7d} - } - ); - - INDArray secondMatrix = Nd4j.create( - new double[][] { - new double[] {1d, 2d, 3d, 7d}, - new double[] {5d, 2d, 8d, 1d} - } - ); - - INDArray expected = Nd4j.create( - new double[][] { - new double[] {26d, 12d, 43d, 12d}, - new double[] {17d, 10d, 30d, 17d}, - new double[] {36d, 16d, 59d, 14d} - } - ); - - INDArray actual = firstMatrix.mmul(secondMatrix); - - assertThat(actual).isEqualTo(expected); - } - -} \ No newline at end of file From 05e0753a9cd40eb33b32430ae2503540bfa06449 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 16:55:04 +0530 Subject: [PATCH 174/530] JAVA-626: Added 3 articles --- .../core-java-lang-math/README.md | 4 ++ .../algorithms/gcd/GCDImplementation.java | 55 +++++++++++++++++++ .../percentage/PercentageCalculator.java | 21 +++++++ .../gcd/GCDImplementationUnitTest.java | 32 +++++++++++ .../logarithm/LogarithmUnitTest.java | 31 +++++++++++ .../PercentageCalculatorUnitTest.java | 33 +++++++++++ 6 files changed, 176 insertions(+) create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java create mode 100644 core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java create mode 100644 core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java create mode 100644 core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java diff --git a/core-java-modules/core-java-lang-math/README.md b/core-java-modules/core-java-lang-math/README.md index ec97a2ada4..8a822d75fd 100644 --- a/core-java-modules/core-java-lang-math/README.md +++ b/core-java-modules/core-java-lang-math/README.md @@ -10,3 +10,7 @@ - [Basic Calculator in Java](https://www.baeldung.com/java-basic-calculator) - [Overflow and Underflow in Java](https://www.baeldung.com/java-overflow-underflow) - [Obtaining a Power Set of a Set in Java](https://www.baeldung.com/java-power-set-of-a-set) +- [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms) +- [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor) +- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage) +- More articles: [[<-- next]](/../core-java-lang-math-2) diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java new file mode 100644 index 0000000000..d4844abd9c --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java @@ -0,0 +1,55 @@ +package com.baeldung.algorithms.gcd; + +public class GCDImplementation { + + public static int gcdByBruteForce(int n1, int n2) { + int gcd = 1; + for (int i = 1; i <= n1 && i <= n2; i++) { + if (n1 % i == 0 && n2 % i == 0) { + gcd = i; + } + } + return gcd; + } + + public static int gcdByEuclidsAlgorithm(int n1, int n2) { + if (n2 == 0) { + return n1; + } + return gcdByEuclidsAlgorithm(n2, n1 % n2); + } + + public static int gcdBySteinsAlgorithm(int n1, int n2) { + if (n1 == 0) { + return n2; + } + + if (n2 == 0) { + return n1; + } + + int n; + for (n = 0; ((n1 | n2) & 1) == 0; n++) { + n1 >>= 1; + n2 >>= 1; + } + + while ((n1 & 1) == 0) { + n1 >>= 1; + } + + do { + while ((n2 & 1) == 0) { + n2 >>= 1; + } + + if (n1 > n2) { + int temp = n1; + n1 = n2; + n2 = temp; + } + n2 = (n2 - n1); + } while (n2 != 0); + return n1 << n; + } +} diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java new file mode 100644 index 0000000000..f69b23146e --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/PercentageCalculator.java @@ -0,0 +1,21 @@ +package com.baeldung.algorithms.percentage; + +import java.util.Scanner; + +public class PercentageCalculator { + + public double calculatePercentage(double obtained,double total){ + return obtained*100/total; + } + + public static void main(String[] args) { + PercentageCalculator pc = new PercentageCalculator(); + Scanner in = new Scanner(System.in); + System.out.println("Enter obtained marks:"); + double obtained = in.nextDouble(); + System.out.println("Enter total marks:"); + double total =in.nextDouble(); + System.out.println("Percentage obtained :"+pc.calculatePercentage(obtained,total)); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java new file mode 100644 index 0000000000..d2c91a2eb8 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.algorithms.gcd; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GCDImplementationUnitTest { + + @Test + public void whenCalculatingGCDByBruteForceMethod_thenCorrect() { + int n1 = 60; + int n2 = 90; + int gcd = GCDImplementation.gcdByBruteForce(n1, n2); + assertThat(gcd).isEqualTo(30); + } + + @Test + public void whenCalculatingGCDByEuclidsAlgorithm_thenCorrect() { + int n1 = 60; + int n2 = 90; + int gcd = GCDImplementation.gcdByEuclidsAlgorithm(n1, n2); + assertThat(gcd).isEqualTo(30); + } + + @Test + public void whenCalculatingGCDBySteinsAlgorithm_thenCorrect() { + int n1 = 60; + int n2 = 90; + int gcd = GCDImplementation.gcdBySteinsAlgorithm(n1, n2); + assertThat(gcd).isEqualTo(30); + } +} diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java new file mode 100644 index 0000000000..facad1edc4 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.algorithms.logarithm; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Test; + +public class LogarithmUnitTest { + + @Test + public void givenLog10_shouldReturnValidResults() { + assertEquals(Math.log10(100), 2); + assertEquals(Math.log10(1000), 3); + } + + @Test + public void givenLogE_shouldReturnValidResults() { + assertEquals(Math.log(Math.E), 1); + assertEquals(Math.log(10), 2.30258, 0.00001); + } + + @Test + public void givenCustomLog_shouldReturnValidResults() { + assertEquals(customLog(2, 256), 8); + assertEquals(customLog(10, 100), 2); + } + + private static double customLog(double base, double logNumber) { + return Math.log(logNumber) / Math.log(base); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java new file mode 100644 index 0000000000..e49acc0c4b --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/PercentageCalculatorUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.algorithms.percentage; + +import org.junit.Assert; +import org.junit.Test; + +public class PercentageCalculatorUnitTest { + private PercentageCalculator pc = new PercentageCalculator(); + + @Test + public void whenPass2Integers_thenShouldCalculatePercentage(){ + Assert.assertEquals("Result not as expected", + 50.0,pc.calculatePercentage(50,100),0.1); + } + + @Test + public void whenPassObtainedMarksAsDouble_thenShouldCalculatePercentage(){ + Assert.assertEquals("Result not as expected",5.05, + pc.calculatePercentage(50.5,1000),0.1); + } + + @Test + public void whenPassTotalMarksAsDouble_thenShouldCalculatePercentage(){ + Assert.assertEquals("Result not as expected",19.6, + pc.calculatePercentage(5,25.5),0.1); + } + + @Test + public void whenPass2DoubleNumbers_thenShouldCalculatePercentage(){ + Assert.assertEquals("Result not as expected",20, + pc.calculatePercentage(5.5,27.5),0.1); + } + +} From 96cfd0af12cf909a57ceecbdb1df8436f0cd83b2 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 16:56:34 +0530 Subject: [PATCH 175/530] JAVA-626 : Added new module, replacement for the retired java-math --- .../core-java-lang-math-2/.gitignore | 4 + .../core-java-lang-math-2/README.md | 16 +++ .../core-java-lang-math-2/pom.xml | 90 +++++++++++++ .../ApacheCommonsCombinationGenerator.java | 29 +++++ .../CombinatoricsLibCombinationGenerator.java | 13 ++ .../GuavaCombinationsGenerator.java | 17 +++ .../IterativeCombinationGenerator.java | 52 ++++++++ ...electionRecursiveCombinationGenerator.java | 53 ++++++++ .../SetRecursiveCombinationGenerator.java | 50 ++++++++ .../DistanceBetweenPointsService.java | 38 ++++++ .../algorithms/factorial/Factorial.java | 63 +++++++++ .../LinesIntersectionService.java | 21 +++ .../mercator/EllipticalMercator.java | 22 ++++ .../algorithms/mercator/Mercator.java | 10 ++ .../mercator/SphericalMercator.java | 14 ++ .../algorithms/rectanglesoverlap/Point.java | 29 +++++ .../rectanglesoverlap/Rectangle.java | 40 ++++++ .../roundedup/RoundUpToHundred.java | 20 +++ .../com/baeldung/matrices/HomemadeMatrix.java | 23 ++++ .../BigMatrixMultiplicationBenchmarking.java | 121 ++++++++++++++++++ .../matrices/benchmark/BigMatrixProvider.java | 46 +++++++ .../MatrixMultiplicationBenchmarking.java | 86 +++++++++++++ .../matrices/benchmark/MatrixProvider.java | 33 +++++ .../src/main/resources/logback.xml | 13 ++ .../combination/CombinationUnitTest.java | 35 +++++ .../DistanceBetweenPointsServiceUnitTest.java | 52 ++++++++ .../factorial/FactorialUnitTest.java | 72 +++++++++++ .../LinesIntersectionServiceUnitTest.java | 40 ++++++ .../mercator/EllipticalMercatorUnitTest.java | 22 ++++ .../mercator/SphericalMercatorUnitTest.java | 21 +++ .../rectanglesoverlap/RectangleUnitTest.java | 39 ++++++ .../roundedup/RoundUpToHundredUnitTest.java | 14 ++ .../matrices/apache/RealMatrixUnitTest.java | 41 ++++++ .../matrices/colt/DoubleMatrix2DUnitTest.java | 46 +++++++ .../matrices/ejml/SimpleMatrixUnitTest.java | 41 ++++++ .../homemade/HomemadeMatrixUnitTest.java | 54 ++++++++ .../matrices/la4j/Basic2DMatrixUnitTest.java | 42 ++++++ .../matrices/nd4j/INDArrayUnitTest.java | 42 ++++++ 38 files changed, 1464 insertions(+) create mode 100644 core-java-modules/core-java-lang-math-2/.gitignore create mode 100644 core-java-modules/core-java-lang-math-2/README.md create mode 100644 core-java-modules/core-java-lang-math-2/pom.xml create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/factorial/Factorial.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/Mercator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/HomemadeMatrix.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java create mode 100644 core-java-modules/core-java-lang-math-2/src/main/resources/logback.xml create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java diff --git a/core-java-modules/core-java-lang-math-2/.gitignore b/core-java-modules/core-java-lang-math-2/.gitignore new file mode 100644 index 0000000000..30b2b7442c --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/.gitignore @@ -0,0 +1,4 @@ +/target/ +.settings/ +.classpath +.project \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/README.md b/core-java-modules/core-java-lang-math-2/README.md new file mode 100644 index 0000000000..f05c8804ba --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/README.md @@ -0,0 +1,16 @@ +## Java Math + +This module contains articles about math in Java. + +### Relevant articles: + +- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) +- [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm) +- [Check If Two Rectangles Overlap In Java](https://www.baeldung.com/java-check-if-two-rectangles-overlap) +- [Calculate the Distance Between Two Points in Java](https://www.baeldung.com/java-distance-between-two-points) +- [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines) +- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred) +- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) +- [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging) +- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) +- More articles: [[<-- prev]](/../core-java-lang-math) diff --git a/core-java-modules/core-java-lang-math-2/pom.xml b/core-java-modules/core-java-lang-math-2/pom.xml new file mode 100644 index 0000000000..92ebcc6a94 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + core-java-lang-math-2 + 0.0.1-SNAPSHOT + core-java-lang-math-2 + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + org.ejml + ejml-all + ${ejml.version} + + + org.nd4j + nd4j-native + ${nd4j.version} + + + org.la4j + la4j + ${la4j.version} + + + colt + colt + ${colt.version} + + + com.google.guava + guava + ${guava.version} + + + org.assertj + assertj-core + ${org.assertj.core.version} + test + + + com.github.dpaukov + combinatoricslib3 + ${combinatoricslib3.version} + + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + + + + + 3.6.1 + 3.9.0 + 27.0.1-jre + 3.3.0 + 0.38 + 1.0.0-beta4 + 1.2.0 + 0.6.0 + 1.19 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java new file mode 100644 index 0000000000..40142ce940 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/ApacheCommonsCombinationGenerator.java @@ -0,0 +1,29 @@ +package com.baeldung.algorithms.combination; + +import java.util.Arrays; +import java.util.Iterator; + +import org.apache.commons.math3.util.CombinatoricsUtils; + +public class ApacheCommonsCombinationGenerator { + + private static final int N = 6; + private static final int R = 3; + + /** + * Print all combinations of r elements from a set + * @param n - number of elements in set + * @param r - number of elements in selection + */ + public static void generate(int n, int r) { + Iterator iterator = CombinatoricsUtils.combinationsIterator(n, r); + while (iterator.hasNext()) { + final int[] combination = iterator.next(); + System.out.println(Arrays.toString(combination)); + } + } + + public static void main(String[] args) { + generate(N, R); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java new file mode 100644 index 0000000000..0afdeefb8b --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/CombinatoricsLibCombinationGenerator.java @@ -0,0 +1,13 @@ +package com.baeldung.algorithms.combination; + +import org.paukov.combinatorics3.Generator; + +public class CombinatoricsLibCombinationGenerator { + + public static void main(String[] args) { + Generator.combination(0, 1, 2, 3, 4, 5) + .simple(3) + .stream() + .forEach(System.out::println); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java new file mode 100644 index 0000000000..d2783881ba --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/GuavaCombinationsGenerator.java @@ -0,0 +1,17 @@ +package com.baeldung.algorithms.combination; + +import java.util.Arrays; +import java.util.Set; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; + +public class GuavaCombinationsGenerator { + + public static void main(String[] args) { + + Set> combinations = Sets.combinations(ImmutableSet.of(0, 1, 2, 3, 4, 5), 3); + System.out.println(combinations.size()); + System.out.println(Arrays.toString(combinations.toArray())); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java new file mode 100644 index 0000000000..676d2f41e3 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/IterativeCombinationGenerator.java @@ -0,0 +1,52 @@ +package com.baeldung.algorithms.combination; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class IterativeCombinationGenerator { + + private static final int N = 5; + private static final int R = 2; + + /** + * Generate all combinations of r elements from a set + * @param n the number of elements in input set + * @param r the number of elements in a combination + * @return the list containing all combinations + */ + public List generate(int n, int r) { + List combinations = new ArrayList<>(); + int[] combination = new int[r]; + + // initialize with lowest lexicographic combination + for (int i = 0; i < r; i++) { + combination[i] = i; + } + + while (combination[r - 1] < n) { + combinations.add(combination.clone()); + + // generate next combination in lexicographic order + int t = r - 1; + while (t != 0 && combination[t] == n - r + t) { + t--; + } + combination[t]++; + for (int i = t + 1; i < r; i++) { + combination[i] = combination[i - 1] + 1; + } + } + + return combinations; + } + + public static void main(String[] args) { + IterativeCombinationGenerator generator = new IterativeCombinationGenerator(); + List combinations = generator.generate(N, R); + System.out.println(combinations.size()); + for (int[] combination : combinations) { + System.out.println(Arrays.toString(combination)); + } + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java new file mode 100644 index 0000000000..52305b8c2f --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SelectionRecursiveCombinationGenerator.java @@ -0,0 +1,53 @@ +package com.baeldung.algorithms.combination; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SelectionRecursiveCombinationGenerator { + + private static final int N = 6; + private static final int R = 3; + + /** + * Generate all combinations of r elements from a set + * @param n - number of elements in input set + * @param r - number of elements to be chosen + * @return the list containing all combinations + */ + public List generate(int n, int r) { + List combinations = new ArrayList<>(); + helper(combinations, new int[r], 0, n - 1, 0); + return combinations; + } + + /** + * Choose elements from set by recursing over elements selected + * @param combinations - List to store generated combinations + * @param data - current combination + * @param start - starting element of remaining set + * @param end - last element of remaining set + * @param index - number of elements chosen so far. + */ + private void helper(List combinations, int data[], int start, int end, int index) { + if (index == data.length) { + int[] combination = data.clone(); + combinations.add(combination); + } else { + int max = Math.min(end, end + 1 - data.length + index); + for (int i = start; i <= max; i++) { + data[index] = i; + helper(combinations, data, i + 1, end, index + 1); + } + } + } + + public static void main(String[] args) { + SelectionRecursiveCombinationGenerator generator = new SelectionRecursiveCombinationGenerator(); + List combinations = generator.generate(N, R); + for (int[] combination : combinations) { + System.out.println(Arrays.toString(combination)); + } + System.out.printf("generated %d combinations of %d items from %d ", combinations.size(), R, N); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java new file mode 100644 index 0000000000..a73447b31d --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/combination/SetRecursiveCombinationGenerator.java @@ -0,0 +1,50 @@ +package com.baeldung.algorithms.combination; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SetRecursiveCombinationGenerator { + + private static final int N = 5; + private static final int R = 2; + + /** + * Generate all combinations of r elements from a set + * @param n - number of elements in set + * @param r - number of elements in selection + * @return the list containing all combinations + */ + public List generate(int n, int r) { + List combinations = new ArrayList<>(); + helper(combinations, new int[r], 0, n-1, 0); + return combinations; + } + + /** + * @param combinations - List to contain the generated combinations + * @param data - List of elements in the selection + * @param start - index of the starting element in the remaining set + * @param end - index of the last element in the set + * @param index - number of elements selected so far + */ + private void helper(List combinations, int data[], int start, int end, int index) { + if (index == data.length) { + int[] combination = data.clone(); + combinations.add(combination); + } else if (start <= end) { + data[index] = start; + helper(combinations, data, start + 1, end, index + 1); + helper(combinations, data, start + 1, end, index); + } + } + + public static void main(String[] args) { + SetRecursiveCombinationGenerator generator = new SetRecursiveCombinationGenerator(); + List combinations = generator.generate(N, R); + for (int[] combination : combinations) { + System.out.println(Arrays.toString(combination)); + } + System.out.printf("generated %d combinations of %d items from %d ", combinations.size(), R, N); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java new file mode 100644 index 0000000000..0c8eb86a38 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.distancebetweenpoints; + +import java.awt.geom.Point2D; + +public class DistanceBetweenPointsService { + + public double calculateDistanceBetweenPoints( + double x1, + double y1, + double x2, + double y2) { + + return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); + } + + public double calculateDistanceBetweenPointsWithHypot( + double x1, + double y1, + double x2, + double y2) { + + double ac = Math.abs(y2 - y1); + double cb = Math.abs(x2 - x1); + + return Math.hypot(ac, cb); + } + + public double calculateDistanceBetweenPointsWithPoint2D( + double x1, + double y1, + double x2, + double y2) { + + return Point2D.distance(x1, y1, x2, y2); + + } + +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/factorial/Factorial.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/factorial/Factorial.java new file mode 100644 index 0000000000..43d2221773 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/factorial/Factorial.java @@ -0,0 +1,63 @@ +package com.baeldung.algorithms.factorial; + +import java.math.BigInteger; +import java.util.stream.LongStream; + +import org.apache.commons.math3.util.CombinatoricsUtils; + +import com.google.common.math.BigIntegerMath; + +public class Factorial { + + public long factorialUsingForLoop(int n) { + long fact = 1; + for (int i = 2; i <= n; i++) { + fact = fact * i; + } + return fact; + } + + public long factorialUsingStreams(int n) { + return LongStream.rangeClosed(1, n) + .reduce(1, (long x, long y) -> x * y); + } + + public long factorialUsingRecursion(int n) { + if (n <= 2) { + return n; + } + return n * factorialUsingRecursion(n - 1); + } + + private Long[] factorials = new Long[20]; + + public long factorialUsingMemoize(int n) { + + if (factorials[n] != null) { + return factorials[n]; + } + + if (n <= 2) { + return n; + } + long nthValue = n * factorialUsingMemoize(n - 1); + factorials[n] = nthValue; + return nthValue; + } + + public BigInteger factorialHavingLargeResult(int n) { + BigInteger result = BigInteger.ONE; + for (int i = 2; i <= n; i++) + result = result.multiply(BigInteger.valueOf(i)); + return result; + } + + public long factorialUsingApacheCommons(int n) { + return CombinatoricsUtils.factorial(n); + } + + public BigInteger factorialUsingGuava(int n) { + return BigIntegerMath.factorial(n); + } + +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java new file mode 100644 index 0000000000..35d6c8b424 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java @@ -0,0 +1,21 @@ +package com.baeldung.algorithms.linesintersection; + +import java.awt.Point; +import java.util.Optional; + +public class LinesIntersectionService { + + public Optional calculateIntersectionPoint(double m1, double b1, double m2, double b2) { + + if (m1 == m2) { + return Optional.empty(); + } + + double x = (b2 - b1) / (m1 - m2); + double y = m1 * x + b1; + + Point point = new Point(); + point.setLocation(x, y); + return Optional.of(point); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java new file mode 100644 index 0000000000..e1c41f9518 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/EllipticalMercator.java @@ -0,0 +1,22 @@ +package com.baeldung.algorithms.mercator; + +class EllipticalMercator extends Mercator { + + @Override + double yAxisProjection(double input) { + + input = Math.min(Math.max(input, -89.5), 89.5); + double earthDimensionalRateNormalized = 1.0 - Math.pow(RADIUS_MINOR / RADIUS_MAJOR, 2); + + double inputOnEarthProj = Math.sqrt(earthDimensionalRateNormalized) * Math.sin( Math.toRadians(input)); + + inputOnEarthProj = Math.pow(((1.0 - inputOnEarthProj)/(1.0+inputOnEarthProj)), 0.5 * Math.sqrt(earthDimensionalRateNormalized)); + double inputOnEarthProjNormalized = Math.tan(0.5 * ((Math.PI*0.5) - Math.toRadians(input)))/inputOnEarthProj; + return (-1) * RADIUS_MAJOR * Math.log(inputOnEarthProjNormalized); + } + + @Override + double xAxisProjection(double input) { + return RADIUS_MAJOR * Math.toRadians(input); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/Mercator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/Mercator.java new file mode 100644 index 0000000000..b289b1839d --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/Mercator.java @@ -0,0 +1,10 @@ +package com.baeldung.algorithms.mercator; + +abstract class Mercator { + final static double RADIUS_MAJOR = 6378137.0; + final static double RADIUS_MINOR = 6356752.3142; + + abstract double yAxisProjection(double input); + + abstract double xAxisProjection(double input); +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java new file mode 100644 index 0000000000..1be976d82e --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/mercator/SphericalMercator.java @@ -0,0 +1,14 @@ +package com.baeldung.algorithms.mercator; + +public class SphericalMercator extends Mercator { + + @Override + double xAxisProjection(double input) { + return Math.toRadians(input) * RADIUS_MAJOR; + } + + @Override + double yAxisProjection(double input) { + return Math.log(Math.tan(Math.PI / 4 + Math.toRadians(input) / 2)) * RADIUS_MAJOR; + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java new file mode 100644 index 0000000000..68b1e7c594 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Point.java @@ -0,0 +1,29 @@ +package com.baeldung.algorithms.rectanglesoverlap; + +public class Point { + + private int x; + private int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java new file mode 100644 index 0000000000..38f5edec61 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java @@ -0,0 +1,40 @@ +package com.baeldung.algorithms.rectanglesoverlap; + +public class Rectangle { + + private Point bottomLeft; + private Point topRight; + + public Rectangle(Point bottomLeft, Point topRight) { + this.bottomLeft = bottomLeft; + this.topRight = topRight; + } + + public Point getBottomLeft() { + return bottomLeft; + } + + public void setBottomLeft(Point bottomLeft) { + this.bottomLeft = bottomLeft; + } + + public Point getTopRight() { + return topRight; + } + + public void setTopRight(Point topRight) { + this.topRight = topRight; + } + + public boolean isOverlapping(Rectangle other) { + // one rectangle is to the top of the other + if (this.topRight.getY() < other.bottomLeft.getY() || this.bottomLeft.getY() > other.topRight.getY()) { + return false; + } + // one rectangle is to the left of the other + if (this.topRight.getX() < other.bottomLeft.getX() || this.bottomLeft.getX() > other.topRight.getX()) { + return false; + } + return true; + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java new file mode 100644 index 0000000000..333019e294 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/roundedup/RoundUpToHundred.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.roundedup; + +import java.util.Scanner; + +public class RoundUpToHundred { + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + double input = scanner.nextDouble(); + scanner.close(); + + RoundUpToHundred.round(input); + } + + static long round(double input) { + long i = (long) Math.ceil(input); + return ((i + 99) / 100) * 100; + }; + +} diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/HomemadeMatrix.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/HomemadeMatrix.java new file mode 100644 index 0000000000..0676250959 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/HomemadeMatrix.java @@ -0,0 +1,23 @@ +package com.baeldung.matrices; + +public class HomemadeMatrix { + public static double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) { + double[][] result = new double[firstMatrix.length][secondMatrix[0].length]; + + for (int row = 0; row < result.length; row++) { + for (int col = 0; col < result[row].length; col++) { + result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col); + } + } + + return result; + } + + private static double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) { + double cell = 0; + for (int i = 0; i < secondMatrix.length; i++) { + cell += firstMatrix[row][i] * secondMatrix[i][col]; + } + return cell; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java new file mode 100644 index 0000000000..2ed983f733 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixMultiplicationBenchmarking.java @@ -0,0 +1,121 @@ +package com.baeldung.matrices.benchmark; + +import cern.colt.matrix.DoubleFactory2D; +import cern.colt.matrix.DoubleMatrix2D; +import cern.colt.matrix.linalg.Algebra; +import com.baeldung.matrices.HomemadeMatrix; +import org.apache.commons.math3.linear.Array2DRowRealMatrix; +import org.apache.commons.math3.linear.RealMatrix; +import org.ejml.simple.SimpleMatrix; +import org.la4j.Matrix; +import org.la4j.matrix.dense.Basic2DMatrix; +import org.nd4j.linalg.api.ndarray.INDArray; +import org.nd4j.linalg.factory.Nd4j; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.ChainedOptionsBuilder; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class BigMatrixMultiplicationBenchmarking { + private static final int DEFAULT_FORKS = 2; + private static final int DEFAULT_WARMUP_ITERATIONS = 5; + private static final int DEFAULT_MEASUREMENT_ITERATIONS = 10; + + public static void main(String[] args) throws Exception { + Map parameters = parseParameters(args); + + ChainedOptionsBuilder builder = new OptionsBuilder() + .include(BigMatrixMultiplicationBenchmarking.class.getSimpleName()) + .mode(Mode.AverageTime) + .forks(forks(parameters)) + .warmupIterations(warmupIterations(parameters)) + .measurementIterations(measurementIterations(parameters)) + .timeUnit(TimeUnit.SECONDS); + + parameters.forEach(builder::param); + + new Runner(builder.build()).run(); + } + + private static Map parseParameters(String[] args) { + return Arrays.stream(args) + .map(arg -> arg.split("=")) + .collect(Collectors.toMap( + arg -> arg[0], + arg -> arg[1] + )); + } + + private static int forks(Map parameters) { + String forks = parameters.remove("forks"); + return parseOrDefault(forks, DEFAULT_FORKS); + } + + private static int warmupIterations(Map parameters) { + String warmups = parameters.remove("warmupIterations"); + return parseOrDefault(warmups, DEFAULT_WARMUP_ITERATIONS); + } + + private static int measurementIterations(Map parameters) { + String measurements = parameters.remove("measurementIterations"); + return parseOrDefault(measurements, DEFAULT_MEASUREMENT_ITERATIONS); + } + + private static int parseOrDefault(String parameter, int defaultValue) { + return parameter != null ? Integer.parseInt(parameter) : defaultValue; + } + + @Benchmark + public Object homemadeMatrixMultiplication(BigMatrixProvider matrixProvider) { + return HomemadeMatrix.multiplyMatrices(matrixProvider.getFirstMatrix(), matrixProvider.getSecondMatrix()); + } + + @Benchmark + public Object ejmlMatrixMultiplication(BigMatrixProvider matrixProvider) { + SimpleMatrix firstMatrix = new SimpleMatrix(matrixProvider.getFirstMatrix()); + SimpleMatrix secondMatrix = new SimpleMatrix(matrixProvider.getSecondMatrix()); + + return firstMatrix.mult(secondMatrix); + } + + @Benchmark + public Object apacheCommonsMatrixMultiplication(BigMatrixProvider matrixProvider) { + RealMatrix firstMatrix = new Array2DRowRealMatrix(matrixProvider.getFirstMatrix()); + RealMatrix secondMatrix = new Array2DRowRealMatrix(matrixProvider.getSecondMatrix()); + + return firstMatrix.multiply(secondMatrix); + } + + @Benchmark + public Object la4jMatrixMultiplication(BigMatrixProvider matrixProvider) { + Matrix firstMatrix = new Basic2DMatrix(matrixProvider.getFirstMatrix()); + Matrix secondMatrix = new Basic2DMatrix(matrixProvider.getSecondMatrix()); + + return firstMatrix.multiply(secondMatrix); + } + + @Benchmark + public Object nd4jMatrixMultiplication(BigMatrixProvider matrixProvider) { + INDArray firstMatrix = Nd4j.create(matrixProvider.getFirstMatrix()); + INDArray secondMatrix = Nd4j.create(matrixProvider.getSecondMatrix()); + + return firstMatrix.mmul(secondMatrix); + } + + @Benchmark + public Object coltMatrixMultiplication(BigMatrixProvider matrixProvider) { + DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense; + + DoubleMatrix2D firstMatrix = doubleFactory2D.make(matrixProvider.getFirstMatrix()); + DoubleMatrix2D secondMatrix = doubleFactory2D.make(matrixProvider.getSecondMatrix()); + + Algebra algebra = new Algebra(); + return algebra.mult(firstMatrix, secondMatrix); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java new file mode 100644 index 0000000000..d0f8a03fe3 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/BigMatrixProvider.java @@ -0,0 +1,46 @@ +package com.baeldung.matrices.benchmark; + +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.infra.BenchmarkParams; + +import java.util.Random; +import java.util.stream.DoubleStream; + +@State(Scope.Benchmark) +public class BigMatrixProvider { + @Param({}) + private int matrixSize; + private double[][] firstMatrix; + private double[][] secondMatrix; + + public BigMatrixProvider() {} + + @Setup + public void setup(BenchmarkParams parameters) { + firstMatrix = createMatrix(matrixSize); + secondMatrix = createMatrix(matrixSize); + } + + private double[][] createMatrix(int matrixSize) { + Random random = new Random(); + + double[][] result = new double[matrixSize][matrixSize]; + for (int row = 0; row < result.length; row++) { + for (int col = 0; col < result[row].length; col++) { + result[row][col] = random.nextDouble(); + } + } + return result; + } + + public double[][] getFirstMatrix() { + return firstMatrix; + } + + public double[][] getSecondMatrix() { + return secondMatrix; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java new file mode 100644 index 0000000000..fdb423e8da --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixMultiplicationBenchmarking.java @@ -0,0 +1,86 @@ +package com.baeldung.matrices.benchmark; + +import cern.colt.matrix.DoubleFactory2D; +import cern.colt.matrix.DoubleMatrix2D; +import cern.colt.matrix.linalg.Algebra; +import com.baeldung.matrices.HomemadeMatrix; +import org.apache.commons.math3.linear.Array2DRowRealMatrix; +import org.apache.commons.math3.linear.RealMatrix; +import org.ejml.simple.SimpleMatrix; +import org.la4j.Matrix; +import org.la4j.matrix.dense.Basic2DMatrix; +import org.nd4j.linalg.api.ndarray.INDArray; +import org.nd4j.linalg.factory.Nd4j; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Mode; +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; + +public class MatrixMultiplicationBenchmarking { + + public static void main(String[] args) throws Exception { + Options opt = new OptionsBuilder() + .include(MatrixMultiplicationBenchmarking.class.getSimpleName()) + .exclude(BigMatrixMultiplicationBenchmarking.class.getSimpleName()) + .mode(Mode.AverageTime) + .forks(2) + .warmupIterations(10) + .measurementIterations(10) + .timeUnit(TimeUnit.MICROSECONDS) + .build(); + + new Runner(opt).run(); + } + + @Benchmark + public Object homemadeMatrixMultiplication(MatrixProvider matrixProvider) { + return HomemadeMatrix.multiplyMatrices(matrixProvider.getFirstMatrix(), matrixProvider.getSecondMatrix()); + } + + @Benchmark + public Object ejmlMatrixMultiplication(MatrixProvider matrixProvider) { + SimpleMatrix firstMatrix = new SimpleMatrix(matrixProvider.getFirstMatrix()); + SimpleMatrix secondMatrix = new SimpleMatrix(matrixProvider.getSecondMatrix()); + + return firstMatrix.mult(secondMatrix); + } + + @Benchmark + public Object apacheCommonsMatrixMultiplication(MatrixProvider matrixProvider) { + RealMatrix firstMatrix = new Array2DRowRealMatrix(matrixProvider.getFirstMatrix()); + RealMatrix secondMatrix = new Array2DRowRealMatrix(matrixProvider.getSecondMatrix()); + + return firstMatrix.multiply(secondMatrix); + } + + @Benchmark + public Object la4jMatrixMultiplication(MatrixProvider matrixProvider) { + Matrix firstMatrix = new Basic2DMatrix(matrixProvider.getFirstMatrix()); + Matrix secondMatrix = new Basic2DMatrix(matrixProvider.getSecondMatrix()); + + return firstMatrix.multiply(secondMatrix); + } + + @Benchmark + public Object nd4jMatrixMultiplication(MatrixProvider matrixProvider) { + INDArray firstMatrix = Nd4j.create(matrixProvider.getFirstMatrix()); + INDArray secondMatrix = Nd4j.create(matrixProvider.getSecondMatrix()); + + return firstMatrix.mmul(secondMatrix); + } + + @Benchmark + public Object coltMatrixMultiplication(MatrixProvider matrixProvider) { + DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense; + + DoubleMatrix2D firstMatrix = doubleFactory2D.make(matrixProvider.getFirstMatrix()); + DoubleMatrix2D secondMatrix = doubleFactory2D.make(matrixProvider.getSecondMatrix()); + + Algebra algebra = new Algebra(); + return algebra.mult(firstMatrix, secondMatrix); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java new file mode 100644 index 0000000000..d401ba2ab6 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/matrices/benchmark/MatrixProvider.java @@ -0,0 +1,33 @@ +package com.baeldung.matrices.benchmark; + +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; + +@State(Scope.Benchmark) +public class MatrixProvider { + private double[][] firstMatrix; + private double[][] secondMatrix; + + public MatrixProvider() { + firstMatrix = + new double[][] { + new double[] {1d, 5d}, + new double[] {2d, 3d}, + new double[] {1d ,7d} + }; + + secondMatrix = + new double[][] { + new double[] {1d, 2d, 3d, 7d}, + new double[] {5d, 2d, 8d, 1d} + }; + } + + public double[][] getFirstMatrix() { + return firstMatrix; + } + + public double[][] getSecondMatrix() { + return secondMatrix; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/main/resources/logback.xml b/core-java-modules/core-java-lang-math-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java new file mode 100644 index 0000000000..987b6ddae6 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/combination/CombinationUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.algorithms.combination; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; + +import org.junit.Test; + +public class CombinationUnitTest { + + private static final int N = 5; + private static final int R = 3; + private static final int nCr = 10; + + @Test + public void givenSetAndSelectionSize_whenCalculatedUsingSetRecursiveAlgorithm_thenExpectedCount() { + SetRecursiveCombinationGenerator generator = new SetRecursiveCombinationGenerator(); + List selection = generator.generate(N, R); + assertEquals(nCr, selection.size()); + } + + @Test + public void givenSetAndSelectionSize_whenCalculatedUsingSelectionRecursiveAlgorithm_thenExpectedCount() { + SelectionRecursiveCombinationGenerator generator = new SelectionRecursiveCombinationGenerator(); + List selection = generator.generate(N, R); + assertEquals(nCr, selection.size()); + } + + @Test + public void givenSetAndSelectionSize_whenCalculatedUsingIterativeAlgorithm_thenExpectedCount() { + IterativeCombinationGenerator generator = new IterativeCombinationGenerator(); + List selection = generator.generate(N, R); + assertEquals(nCr, selection.size()); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java new file mode 100644 index 0000000000..784681a807 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.algorithms.distancebetweenpoints; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class DistanceBetweenPointsServiceUnitTest { + + private DistanceBetweenPointsService service = new DistanceBetweenPointsService(); + + @Test + public void givenTwoPoints_whenCalculateDistanceByFormula_thenCorrect() { + + double x1 = 3; + double y1 = 4; + double x2 = 7; + double y2 = 1; + + double distance = service.calculateDistanceBetweenPoints(x1, y1, x2, y2); + + assertEquals(distance, 5, 0.001); + + } + + @Test + public void givenTwoPoints_whenCalculateDistanceWithHypot_thenCorrect() { + + double x1 = 3; + double y1 = 4; + double x2 = 7; + double y2 = 1; + + double distance = service.calculateDistanceBetweenPointsWithHypot(x1, y1, x2, y2); + + assertEquals(distance, 5, 0.001); + + } + + @Test + public void givenTwoPoints_whenCalculateDistanceWithPoint2D_thenCorrect() { + + double x1 = 3; + double y1 = 4; + double x2 = 7; + double y2 = 1; + + double distance = service.calculateDistanceBetweenPointsWithPoint2D(x1, y1, x2, y2); + + assertEquals(distance, 5, 0.001); + + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java new file mode 100644 index 0000000000..c185dba62b --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.algorithms.factorial; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigInteger; + +import org.junit.Before; +import org.junit.Test; + +public class FactorialUnitTest { + + Factorial factorial; + + @Before + public void setup() { + factorial = new Factorial(); + } + + @Test + public void whenCalculatingFactorialUsingForLoop_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingForLoop(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingStreams_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingStreams(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingRecursion_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingRecursion(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingMemoize_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(120); + + n = 6; + + assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(720); + } + + @Test + public void whenCalculatingFactorialHavingLargeResult_thenCorrect() { + int n = 22; + + assertThat(factorial.factorialHavingLargeResult(n)).isEqualTo(new BigInteger("1124000727777607680000")); + } + + @Test + public void whenCalculatingFactorialUsingApacheCommons_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingApacheCommons(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingGuava_thenCorrect() { + int n = 22; + + assertThat(factorial.factorialUsingGuava(n)).isEqualTo(new BigInteger("1124000727777607680000")); + } + +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java new file mode 100644 index 0000000000..22371107f3 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.algorithms.linesintersection; + +import java.awt.Point; +import java.util.Optional; + +import org.junit.Test; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertEquals; + +public class LinesIntersectionServiceUnitTest { + private LinesIntersectionService service = new LinesIntersectionService(); + + @Test + public void givenNotParallelLines_whenCalculatePoint_thenPresent() { + + double m1 = 0; + double b1 = 0; + double m2 = 1; + double b2 = -1; + + Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); + + assertTrue(point.isPresent()); + assertEquals(point.get().getX(), 1, 0.001); + assertEquals(point.get().getY(), 0, 0.001); + } + + @Test + public void givenParallelLines_whenCalculatePoint_thenEmpty() { + double m1 = 1; + double b1 = 0; + double m2 = 1; + double b2 = -1; + + Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); + + assertFalse(point.isPresent()); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java new file mode 100644 index 0000000000..96b644c46c --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/EllipticalMercatorUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.algorithms.mercator; + +import org.junit.Assert; +import org.junit.Test; + + +public class EllipticalMercatorUnitTest { + + @Test + public void giventThatTheInputIs22_whenXAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { + Mercator mercator = new EllipticalMercator(); + double result = mercator.xAxisProjection(22); + Assert.assertEquals(result, 2449028.7974520186, 0.0); + } + + @Test + public void giventThatTheInputIs44_whenYAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { + Mercator mercator = new EllipticalMercator(); + double result = mercator.yAxisProjection(44); + Assert.assertEquals(result, 5435749.887511954, 0.0); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java new file mode 100644 index 0000000000..348c6ad3e4 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/mercator/SphericalMercatorUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.algorithms.mercator; + +import org.junit.Assert; +import org.junit.Test; + +public class SphericalMercatorUnitTest { + + @Test + public void giventThatTheInputIs22_whenXAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { + Mercator mercator = new SphericalMercator(); + double result = mercator.xAxisProjection(22); + Assert.assertEquals(result, 2449028.7974520186, 0.0); + } + + @Test + public void giventThatTheInputIs44_whenYAxisProjectionIsCalled_thenTheResultIsTheCorrectOne() { + Mercator mercator = new SphericalMercator(); + double result = mercator.yAxisProjection(44); + Assert.assertEquals(result, 5465442.183322753, 0.0); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java new file mode 100644 index 0000000000..e4bb614b48 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.algorithms.rectanglesoverlap; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; +import org.junit.Test; + +public class RectangleUnitTest { + + @Test + public void givenTwoOverlappingRectangles_whenisOverlappingCalled_shouldReturnTrue() { + Rectangle rectangle1 = new Rectangle(new Point(2, 1), new Point(4, 3)); + Rectangle rectangle2 = new Rectangle(new Point(1, 1), new Point(6, 4)); + assertTrue(rectangle1.isOverlapping(rectangle2)); + + rectangle1 = new Rectangle(new Point(-5, -2), new Point(2, 3)); + rectangle2 = new Rectangle(new Point(-2, -1), new Point(5, 2)); + assertTrue(rectangle1.isOverlapping(rectangle2)); + + rectangle1 = new Rectangle(new Point(-5, 1), new Point(2, 4)); + rectangle2 = new Rectangle(new Point(-2, -2), new Point(5, 5)); + assertTrue(rectangle1.isOverlapping(rectangle2)); + } + + @Test + public void givenTwoNonOverlappingRectangles_whenisOverlappingCalled_shouldReturnFalse() { + Rectangle rectangle1 = new Rectangle(new Point(-5, 1), new Point(-3, 4)); + Rectangle rectangle2 = new Rectangle(new Point(-2, -2), new Point(5, 5)); + assertFalse(rectangle1.isOverlapping(rectangle2)); + + rectangle1 = new Rectangle(new Point(-5, 1), new Point(3, 4)); + rectangle2 = new Rectangle(new Point(-2, -2), new Point(5, -1)); + assertFalse(rectangle1.isOverlapping(rectangle2)); + + rectangle1 = new Rectangle(new Point(-2, 1), new Point(0, 3)); + rectangle2 = new Rectangle(new Point(3, 1), new Point(5, 4)); + assertFalse(rectangle1.isOverlapping(rectangle2)); + } + +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java new file mode 100644 index 0000000000..5191d65787 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/roundedup/RoundUpToHundredUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.algorithms.roundedup; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class RoundUpToHundredUnitTest { + @Test + public void givenInput_whenRound_thenRoundUpToTheNearestHundred() { + assertEquals("Rounded up to hundred", 100, RoundUpToHundred.round(99)); + assertEquals("Rounded up to three hundred ", 300, RoundUpToHundred.round(200.2)); + assertEquals("Returns same rounded value", 400, RoundUpToHundred.round(400)); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java new file mode 100644 index 0000000000..e7d99fbe3e --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.matrices.apache; + +import org.apache.commons.math3.linear.Array2DRowRealMatrix; +import org.apache.commons.math3.linear.RealMatrix; +import org.junit.jupiter.api.Test; +import org.openjdk.jmh.annotations.*; + +import static org.assertj.core.api.Assertions.assertThat; + +class RealMatrixUnitTest { + + @Test + void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { + RealMatrix firstMatrix = new Array2DRowRealMatrix( + new double[][] { + new double[] {1d, 5d}, + new double[] {2d, 3d}, + new double[] {1d ,7d} + } + ); + + RealMatrix secondMatrix = new Array2DRowRealMatrix( + new double[][] { + new double[] {1d, 2d, 3d, 7d}, + new double[] {5d, 2d, 8d, 1d} + } + ); + + RealMatrix expected = new Array2DRowRealMatrix( + new double[][] { + new double[] {26d, 12d, 43d, 12d}, + new double[] {17d, 10d, 30d, 17d}, + new double[] {36d, 16d, 59d, 14d} + } + ); + + RealMatrix actual = firstMatrix.multiply(secondMatrix); + + assertThat(actual).isEqualTo(expected); + } +} diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java new file mode 100644 index 0000000000..da66cd7d61 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.matrices.colt; + +import cern.colt.matrix.DoubleFactory2D; +import cern.colt.matrix.DoubleMatrix2D; +import cern.colt.matrix.linalg.Algebra; +import org.junit.jupiter.api.Test; +import org.openjdk.jmh.annotations.*; + +import static org.assertj.core.api.Assertions.assertThat; + +class DoubleMatrix2DUnitTest { + + @Test + void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { + DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense; + + DoubleMatrix2D firstMatrix = doubleFactory2D.make( + new double[][] { + new double[] {1d, 5d}, + new double[] {2d, 3d}, + new double[] {1d ,7d} + } + ); + + DoubleMatrix2D secondMatrix = doubleFactory2D.make( + new double[][] { + new double[] {1d, 2d, 3d, 7d}, + new double[] {5d, 2d, 8d, 1d} + } + ); + + DoubleMatrix2D expected = doubleFactory2D.make( + new double[][] { + new double[] {26d, 12d, 43d, 12d}, + new double[] {17d, 10d, 30d, 17d}, + new double[] {36d, 16d, 59d, 14d} + } + ); + + Algebra algebra = new Algebra(); + DoubleMatrix2D actual = algebra.mult(firstMatrix, secondMatrix); + + assertThat(actual).isEqualTo(expected); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java new file mode 100644 index 0000000000..60381ece63 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.matrices.ejml; + +import org.ejml.simple.SimpleMatrix; +import org.junit.jupiter.api.Test; +import org.openjdk.jmh.annotations.*; + +import static org.assertj.core.api.Assertions.assertThat; + +class SimpleMatrixUnitTest { + + @Test + void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { + SimpleMatrix firstMatrix = new SimpleMatrix( + new double[][] { + new double[] {1d, 5d}, + new double[] {2d, 3d}, + new double[] {1d ,7d} + } + ); + + SimpleMatrix secondMatrix = new SimpleMatrix( + new double[][] { + new double[] {1d, 2d, 3d, 7d}, + new double[] {5d, 2d, 8d, 1d} + } + ); + + SimpleMatrix expected = new SimpleMatrix( + new double[][] { + new double[] {26d, 12d, 43d, 12d}, + new double[] {17d, 10d, 30d, 17d}, + new double[] {36d, 16d, 59d, 14d} + } + ); + + SimpleMatrix actual = firstMatrix.mult(secondMatrix); + + assertThat(actual).matches(m -> m.isIdentical(expected, 0d)); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java new file mode 100644 index 0000000000..d1a062ee79 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.matrices.homemade; + +import org.junit.jupiter.api.Test; +import org.openjdk.jmh.annotations.*; + +import static org.assertj.core.api.Assertions.assertThat; + +class HomemadeMatrixUnitTest { + + @Test + void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { + double[][] firstMatrix = { + new double[]{1d, 5d}, + new double[]{2d, 3d}, + new double[]{1d, 7d} + }; + + double[][] secondMatrix = { + new double[]{1d, 2d, 3d, 7d}, + new double[]{5d, 2d, 8d, 1d} + }; + + double[][] expected = { + new double[]{26d, 12d, 43d, 12d}, + new double[]{17d, 10d, 30d, 17d}, + new double[]{36d, 16d, 59d, 14d} + }; + + double[][] actual = multiplyMatrices(firstMatrix, secondMatrix); + + assertThat(actual).isEqualTo(expected); + } + + private double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) { + double[][] result = new double[firstMatrix.length][secondMatrix[0].length]; + + for (int row = 0; row < result.length; row++) { + for (int col = 0; col < result[row].length; col++) { + result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col); + } + } + + return result; + } + + private double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) { + double cell = 0; + for (int i = 0; i < secondMatrix.length; i++) { + cell += firstMatrix[row][i] * secondMatrix[i][col]; + } + return cell; + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java new file mode 100644 index 0000000000..01731a3dd5 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.matrices.la4j; + +import org.junit.jupiter.api.Test; +import org.la4j.Matrix; +import org.la4j.matrix.dense.Basic2DMatrix; +import org.openjdk.jmh.annotations.*; + +import static org.assertj.core.api.Assertions.assertThat; + +class Basic2DMatrixUnitTest { + + @Test + void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { + Matrix firstMatrix = new Basic2DMatrix( + new double[][]{ + new double[]{1d, 5d}, + new double[]{2d, 3d}, + new double[]{1d, 7d} + } + ); + + Matrix secondMatrix = new Basic2DMatrix( + new double[][]{ + new double[]{1d, 2d, 3d, 7d}, + new double[]{5d, 2d, 8d, 1d} + } + ); + + Matrix expected = new Basic2DMatrix( + new double[][]{ + new double[]{26d, 12d, 43d, 12d}, + new double[]{17d, 10d, 30d, 17d}, + new double[]{36d, 16d, 59d, 14d} + } + ); + + Matrix actual = firstMatrix.multiply(secondMatrix); + + assertThat(actual).isEqualTo(expected); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java new file mode 100644 index 0000000000..72ef60a571 --- /dev/null +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.matrices.nd4j; + +import org.junit.jupiter.api.Test; +import org.nd4j.linalg.api.ndarray.INDArray; +import org.nd4j.linalg.factory.Nd4j; +import org.openjdk.jmh.annotations.*; + +import static org.assertj.core.api.Assertions.assertThat; + +class INDArrayUnitTest { + + @Test + void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() { + INDArray firstMatrix = Nd4j.create( + new double[][]{ + new double[]{1d, 5d}, + new double[]{2d, 3d}, + new double[]{1d, 7d} + } + ); + + INDArray secondMatrix = Nd4j.create( + new double[][] { + new double[] {1d, 2d, 3d, 7d}, + new double[] {5d, 2d, 8d, 1d} + } + ); + + INDArray expected = Nd4j.create( + new double[][] { + new double[] {26d, 12d, 43d, 12d}, + new double[] {17d, 10d, 30d, 17d}, + new double[] {36d, 16d, 59d, 14d} + } + ); + + INDArray actual = firstMatrix.mmul(secondMatrix); + + assertThat(actual).isEqualTo(expected); + } + +} \ No newline at end of file From 1aba93f3aa0a02420b955db74ec9e8d698489dd5 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 16:57:48 +0530 Subject: [PATCH 176/530] JAVA-626 : added new module to parent module's pom --- core-java-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 326d4bb1c5..5e7ffa37b9 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -76,6 +76,7 @@ core-java-lang core-java-lang-2 core-java-lang-math + core-java-lang-math-2 core-java-lang-oop core-java-lang-oop-2 core-java-lang-oop-3 From 3e9da83493fcaa099930e0885093248eaf7f9840 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 16:59:20 +0530 Subject: [PATCH 177/530] JAVA-626 : removed retired modules from parent pom --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index a295439951..1c887245db 100644 --- a/pom.xml +++ b/pom.xml @@ -455,8 +455,6 @@ javafx java-jdi java-lite - java-math - java-math-2 java-numbers java-numbers-2 java-numbers-3 From ca2694209b61ecebed3010ef7e8a0b54183d94a2 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 17:01:55 +0530 Subject: [PATCH 178/530] removed retired modules from parent pom --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1c887245db..b896d61f91 100644 --- a/pom.xml +++ b/pom.xml @@ -966,8 +966,6 @@ javafx java-jdi java-lite - java-math - java-math-2 java-numbers java-numbers-2 java-numbers-3 From eeb864af710ef4e21386048665ea25bb7b0e29cc Mon Sep 17 00:00:00 2001 From: sergio41 Date: Sun, 22 Mar 2020 14:26:52 +0100 Subject: [PATCH 179/530] [BAEL-3910] Code Upload --- .../src/main/resources/config.properties | 1 + .../stringtoolong/StringTooLongUnitTest.java | 38 +++++++++++++++++++ .../src/test/resources/stringtoolong.txt | 1 + 3 files changed, 40 insertions(+) create mode 100644 core-java-modules/core-java-strings/src/main/resources/config.properties create mode 100644 core-java-modules/core-java-strings/src/test/java/com/baeldung/stringtoolong/StringTooLongUnitTest.java create mode 100644 core-java-modules/core-java-strings/src/test/resources/stringtoolong.txt diff --git a/core-java-modules/core-java-strings/src/main/resources/config.properties b/core-java-modules/core-java-strings/src/main/resources/config.properties new file mode 100644 index 0000000000..8197c13543 --- /dev/null +++ b/core-java-modules/core-java-strings/src/main/resources/config.properties @@ -0,0 +1 @@ +string.too.long= StringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLong diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringtoolong/StringTooLongUnitTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringtoolong/StringTooLongUnitTest.java new file mode 100644 index 0000000000..4035cadb83 --- /dev/null +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringtoolong/StringTooLongUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.stringtoolong; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +public class StringTooLongUnitTest { + @Test + public void whenDeclaringTooLongString_thenCompilationError() { + String stringTooLong = ""; + assertThat(stringTooLong).isNotEmpty(); + } + + @Test + public void whenStoringInFileTooLongString_thenNoCompilationError() throws IOException { + FileInputStream fis = new FileInputStream("src/test/resources/stringtoolong.txt"); + String stringTooLong = IOUtils.toString(fis, "UTF-8"); + assertThat(stringTooLong).isNotEmpty(); + } + + @Test + public void whenStoringInPropertiesString_thenNoCompilationError() throws IOException { + String sValue = null; + try (InputStream input = new FileInputStream("src/main/resources/config.properties")) { + Properties prop = new Properties(); + prop.load(input); + sValue = prop.getProperty("string.too.long"); + } + assertThat(sValue).isNotEmpty(); + } +} + \ No newline at end of file diff --git a/core-java-modules/core-java-strings/src/test/resources/stringtoolong.txt b/core-java-modules/core-java-strings/src/test/resources/stringtoolong.txt new file mode 100644 index 0000000000..6b2649aaa8 --- /dev/null +++ b/core-java-modules/core-java-strings/src/test/resources/stringtoolong.txt @@ -0,0 +1 @@ + StringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLong \ No newline at end of file From 9bd0dfa6d978e9315ecdc83adafb5b0c0575317f Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sun, 22 Mar 2020 21:40:42 +0530 Subject: [PATCH 180/530] updated hibernate version --- persistence-modules/hibernate-mapping/pom.xml | 2 +- persistence-modules/hibernate5/pom.xml | 2 +- .../main/java/com/baeldung/hibernate/pojo/PointEntity.java | 3 ++- .../main/java/com/baeldung/hibernate/pojo/PolygonEntity.java | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml index c7318ee425..4eabc5d298 100644 --- a/persistence-modules/hibernate-mapping/pom.xml +++ b/persistence-modules/hibernate-mapping/pom.xml @@ -65,7 +65,7 @@ - 5.3.10.Final + 5.4.12.Final 3.8.0 6.0.16.Final 3.0.1-b11 diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index ffeff5ee4a..7f04abc09f 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -77,7 +77,7 @@ - 5.3.7.Final + 5.4.12.Final 6.0.6 2.2.3 3.8.0 diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java index 736abde866..7a88a8bedc 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java @@ -1,12 +1,13 @@ package com.baeldung.hibernate.pojo; -import com.vividsolutions.jts.geom.Point; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import org.locationtech.jts.geom.Point; + @Entity public class PointEntity { diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java index 69208c8cd4..3144a88a16 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java @@ -1,11 +1,11 @@ package com.baeldung.hibernate.pojo; -import com.vividsolutions.jts.geom.Polygon; - import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import org.locationtech.jts.geom.Polygon; + @Entity public class PolygonEntity { From abf06202695479623623cef89f8a08b0255f2e2c Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Tue, 17 Mar 2020 00:31:37 +0100 Subject: [PATCH 181/530] [BAEL-3914] java regex: \\s vs \\s+ --- ...ReplaceAllWithWhitespaceRegexUnitTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 core-java-modules/core-java-regex/src/test/java/com/baeldung/replaceall/ReplaceAllWithWhitespaceRegexUnitTest.java diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/replaceall/ReplaceAllWithWhitespaceRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/replaceall/ReplaceAllWithWhitespaceRegexUnitTest.java new file mode 100644 index 0000000000..a95d1afd80 --- /dev/null +++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/replaceall/ReplaceAllWithWhitespaceRegexUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.replaceall; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ReplaceAllWithWhitespaceRegexUnitTest { + private static final String INPUT_STR = "Text With Whitespaces! "; + + @Test + public void givenString_whenReplaceBySingleCharClass_thenGetExpect() { + String expected = "Text___With_____Whitespaces!___"; + String result = INPUT_STR.replaceAll("\\s", "_"); + assertEquals(expected, result); + } + + @Test + public void givenString_whenReplaceBySingleCharClassWithPlus_thenGetExpect() { + String expected = "Text_With_Whitespaces!_"; + String result = INPUT_STR.replaceAll("\\s+", "_"); + assertEquals(expected, result); + } + + @Test + public void givenString_whenRemoveByWhitespace_thenGetSameResult() { + String expected = "TextWithWhitespaces!"; + String result1 = INPUT_STR.replaceAll("\\s", ""); + String result2 = INPUT_STR.replaceAll("\\s+", ""); + assertEquals(expected, result1); + assertEquals(result1, result2); + } +} From 8d83e7cf1bcc4fcf616dbca6b71c9317ab826442 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 22:54:40 +0530 Subject: [PATCH 182/530] JAVA-626 : Updated README description --- core-java-modules/core-java-lang-math-2/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-math-2/README.md b/core-java-modules/core-java-lang-math-2/README.md index f05c8804ba..0e0f1991c4 100644 --- a/core-java-modules/core-java-lang-math-2/README.md +++ b/core-java-modules/core-java-lang-math-2/README.md @@ -1,6 +1,6 @@ -## Java Math +========= -This module contains articles about math in Java. +## Core Java 8 Cookbooks and Examples - Part 2 ### Relevant articles: From bc6ef10c6db2b88235552650f2735fa8a7473235 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 23:38:04 +0530 Subject: [PATCH 183/530] JAVA-4: removed hibernate5-mapping module --- .../hibernate5-mapping/README.md | 11 --- .../hibernate5-mapping/pom.xml | 76 --------------- .../com/baeldung/hibernate/HibernateUtil.java | 96 ------------------- .../main/resources/META-INF/persistence.xml | 18 ---- .../src/main/resources/logback.xml | 13 --- 5 files changed, 214 deletions(-) delete mode 100644 persistence-modules/hibernate5-mapping/README.md delete mode 100644 persistence-modules/hibernate5-mapping/pom.xml delete mode 100644 persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java delete mode 100644 persistence-modules/hibernate5-mapping/src/main/resources/META-INF/persistence.xml delete mode 100644 persistence-modules/hibernate5-mapping/src/main/resources/logback.xml diff --git a/persistence-modules/hibernate5-mapping/README.md b/persistence-modules/hibernate5-mapping/README.md deleted file mode 100644 index f18b0b63de..0000000000 --- a/persistence-modules/hibernate5-mapping/README.md +++ /dev/null @@ -1,11 +0,0 @@ -## Hibernate 5 - -This module contains articles about Hibernate 5. - -### Relevant articles: - -- [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) -- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance) -- [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class) -- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time) -- [Mapping LOB Data in Hibernate](http://www.baeldung.com/hibernate-lob) \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/pom.xml b/persistence-modules/hibernate5-mapping/pom.xml deleted file mode 100644 index 59e0547671..0000000000 --- a/persistence-modules/hibernate5-mapping/pom.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - 4.0.0 - hibernate5-mapping - 0.0.1-SNAPSHOT - hibernate5-mapping - - - com.baeldung - persistence-modules - 1.0.0-SNAPSHOT - - - - - org.hibernate - hibernate-core - ${hibernate.version} - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - com.h2database - h2 - ${h2.version} - - - org.hibernate - hibernate-spatial - ${hibernate.version} - - - org.opengeo - geodb - ${geodb.version} - - - mysql - mysql-connector-java - ${mysql.version} - - - ch.vorburger.mariaDB4j - mariaDB4j - ${mariaDB4j.version} - - - org.hibernate - hibernate-testing - ${hibernate.version} - - - - - - geodb-repo - GeoDB repository - http://repo.boundlessgeo.com/main/ - - - - - 5.3.7.Final - 6.0.6 - 2.2.3 - 3.8.0 - 0.9 - - - diff --git a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java deleted file mode 100644 index 28e1af49ed..0000000000 --- a/persistence-modules/hibernate5-mapping/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.baeldung.hibernate; - -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.Properties; - -import org.apache.commons.lang3.StringUtils; -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.service.ServiceRegistry; - -import com.baeldung.hibernate.entities.DeptEmployee; -import com.baeldung.hibernate.pojo.Employee; -import com.baeldung.hibernate.pojo.EntityDescription; -import com.baeldung.hibernate.pojo.Phone; -import com.baeldung.hibernate.pojo.TemporalValues; -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.MyEmployee; -import com.baeldung.hibernate.pojo.inheritance.MyProduct; -import com.baeldung.hibernate.pojo.inheritance.Pen; -import com.baeldung.hibernate.pojo.inheritance.Pet; -import com.baeldung.hibernate.pojo.inheritance.Vehicle; - -public class HibernateUtil { - private static String PROPERTY_FILE_NAME; - - public static SessionFactory getSessionFactory() throws IOException { - return getSessionFactory(null); - } - - public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { - PROPERTY_FILE_NAME = propertyFileName; - ServiceRegistry serviceRegistry = configureServiceRegistry(); - return makeSessionFactory(serviceRegistry); - } - - public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException { - ServiceRegistry serviceRegistry = configureServiceRegistry(properties); - return makeSessionFactory(serviceRegistry); - } - - private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { - MetadataSources metadataSources = new MetadataSources(serviceRegistry); - - metadataSources.addPackage("com.baeldung.hibernate.pojo"); - metadataSources.addAnnotatedClass(Employee.class); - metadataSources.addAnnotatedClass(Phone.class); - metadataSources.addAnnotatedClass(EntityDescription.class); - metadataSources.addAnnotatedClass(TemporalValues.class); - metadataSources.addAnnotatedClass(DeptEmployee.class); - metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class); - metadataSources.addAnnotatedClass(Animal.class); - metadataSources.addAnnotatedClass(Bag.class); - metadataSources.addAnnotatedClass(Book.class); - metadataSources.addAnnotatedClass(Car.class); - metadataSources.addAnnotatedClass(MyEmployee.class); - metadataSources.addAnnotatedClass(MyProduct.class); - metadataSources.addAnnotatedClass(Pen.class); - metadataSources.addAnnotatedClass(Pet.class); - metadataSources.addAnnotatedClass(Vehicle.class); - - - Metadata metadata = metadataSources.getMetadataBuilder() - .build(); - - return metadata.getSessionFactoryBuilder() - .build(); - - } - - private static ServiceRegistry configureServiceRegistry() throws IOException { - return configureServiceRegistry(getProperties()); - } - - private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException { - return new StandardServiceRegistryBuilder().applySettings(properties) - .build(); - } - - public static Properties getProperties() throws IOException { - Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); - try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { - properties.load(inputStream); - } - return properties; - } -} \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate5-mapping/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 474eeb7a44..0000000000 --- a/persistence-modules/hibernate5-mapping/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - Hibernate EntityManager Demo - true - - - - - - - - - - \ No newline at end of file diff --git a/persistence-modules/hibernate5-mapping/src/main/resources/logback.xml b/persistence-modules/hibernate5-mapping/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/persistence-modules/hibernate5-mapping/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file From a081a6cf6ddbc4af29bd77f2638d28a39f3634f7 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sun, 22 Mar 2020 23:40:34 +0530 Subject: [PATCH 184/530] JAVA-4: modified README files to add proper descriptions, and https to some links --- persistence-modules/hibernate-annotations/README.md | 4 ++-- persistence-modules/hibernate-enterprise/README.md | 6 +++--- persistence-modules/hibernate-jpa/README.md | 8 ++++---- persistence-modules/hibernate-mapping/README.md | 8 ++++---- persistence-modules/hibernate5/README.md | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/persistence-modules/hibernate-annotations/README.md b/persistence-modules/hibernate-annotations/README.md index 2813dbdda3..393cf82bfd 100644 --- a/persistence-modules/hibernate-annotations/README.md +++ b/persistence-modules/hibernate-annotations/README.md @@ -1,10 +1,10 @@ ## Hibernate Annotations -This module contains articles about Hibernate Annotations. +This module contains articles about Annotations used in Hibernate. ### Relevant Articles: - [Custom Types in Hibernate and the @Type Annotation](https://www.baeldung.com/hibernate-custom-types) - [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column) - [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) -- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) +- [Hibernate One to Many Annotation Tutorial](https://www.baeldung.com/hibernate-one-to-many) - [Hibernate @WhereJoinTable Annotation](https://www.baeldung.com/hibernate-wherejointable) diff --git a/persistence-modules/hibernate-enterprise/README.md b/persistence-modules/hibernate-enterprise/README.md index c48092e6a2..c5606d0970 100644 --- a/persistence-modules/hibernate-enterprise/README.md +++ b/persistence-modules/hibernate-enterprise/README.md @@ -1,11 +1,11 @@ ## Hibernate Enterprise -This module contains articles about Hibernate. +This module contains articles about enterprise concerns such as Multitenancy, Errors, Exceptions, Logging and more in Hibernate. ### Relevant articles: -- [Introduction to Hibernate Spatial](http://www.baeldung.com/hibernate-spatial) -- [A Guide to Multitenancy in Hibernate 5](http://www.baeldung.com/hibernate-5-multitenancy) +- [Introduction to Hibernate Spatial](https://www.baeldung.com/hibernate-spatial) +- [A Guide to Multitenancy in Hibernate 5](https://www.baeldung.com/hibernate-5-multitenancy) - [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions) - [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions) - [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set) diff --git a/persistence-modules/hibernate-jpa/README.md b/persistence-modules/hibernate-jpa/README.md index fb1d46cf9b..d0a253f028 100644 --- a/persistence-modules/hibernate-jpa/README.md +++ b/persistence-modules/hibernate-jpa/README.md @@ -1,13 +1,13 @@ ## Hibernate JPA -This module contains articles about Hibernate JPA. +This module contains articles specific to use of Hibernate as a JPA implementation, such as Locking, Bootstrapping, One-to-One Relationship, Persistence Context, and more. ### Relevant articles: -- [JPA Attribute Converters](http://www.baeldung.com/jpa-attribute-converters) -- [Pessimistic Locking in JPA](http://www.baeldung.com/jpa-pessimistic-locking) +- [JPA Attribute Converters](https://www.baeldung.com/jpa-attribute-converters) +- [Pessimistic Locking in JPA](https://www.baeldung.com/jpa-pessimistic-locking) - [Bootstrapping JPA Programmatically in Java](http://www.baeldung.com/java-bootstrap-jpa) -- [Optimistic Locking in JPA](http://www.baeldung.com/jpa-optimistic-locking) +- [Optimistic Locking in JPA](https://www.baeldung.com/jpa-optimistic-locking) - [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) - [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) - [Enabling Transaction Locks in Spring Data JPA](https://www.baeldung.com/java-jpa-transaction-locks) diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md index 5ba73f35f3..b5d0cb2f99 100644 --- a/persistence-modules/hibernate-mapping/README.md +++ b/persistence-modules/hibernate-mapping/README.md @@ -7,9 +7,9 @@ This module contains articles about Object-relational Mapping (ORM) with Hiberna - [Persisting Maps with Hibernate](https://www.baeldung.com/hibernate-persisting-maps) - [Difference Between @Size, @Length, and @Column(length=value)](https://www.baeldung.com/jpa-size-length-column-differences) - [Hibernate Validator Specific Constraints](https://www.baeldung.com/hibernate-validator-constraints) -- [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) -- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance) +- [Dynamic Mapping with Hibernate](https://www.baeldung.com/hibernate-dynamic-mapping) +- [Hibernate Inheritance Mapping](https://www.baeldung.com/hibernate-inheritance) - [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class) -- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time) -- [Mapping LOB Data in Hibernate](http://www.baeldung.com/hibernate-lob) +- [Hibernate – Mapping Date and Time](https://www.baeldung.com/hibernate-date-time) +- [Mapping LOB Data in Hibernate](https://www.baeldung.com/hibernate-lob) - [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index b7a254d836..bd437c80eb 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -4,8 +4,8 @@ This module contains articles about Hibernate 5. Let's not add more articles her ### Relevant articles: -- [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers) -- [Hibernate Interceptors](http://www.baeldung.com/hibernate-interceptor) +- [An Overview of Identifiers in Hibernate](https://www.baeldung.com/hibernate-identifiers) +- [Hibernate Interceptors](https://www.baeldung.com/hibernate-interceptor) - [Hibernate Entity Lifecycle](https://www.baeldung.com/hibernate-entity-lifecycle) - [Hibernate 5 Naming Strategy Configuration](https://www.baeldung.com/hibernate-naming-strategy) - [Proxy in Hibernate load() Method](https://www.baeldung.com/hibernate-proxy-load-method) From 538f07945a130cdcd0d5b52f7169aa51c5494b46 Mon Sep 17 00:00:00 2001 From: Mark Thomas Date: Sun, 22 Mar 2020 14:06:39 -0500 Subject: [PATCH 185/530] BAEL-3304 - spatialguru.net@gmail.com (#8883) * BAEL-3304 - Add openapi generator client * BAEL-3304 - Add openapi generator client * BAEL-3304 - Add openapi generator client to root module * Remove .gitignore --- spring-swagger-codegen/pom.xml | 1 + .../.openapi-generator-ignore | 23 + .../.openapi-generator/VERSION | 1 + .../.travis.yml | 22 + .../README.md | 174 ++++ .../build.gradle | 120 +++ .../build.sbt | 0 .../docs/Category.md | 13 + .../docs/ModelApiResponse.md | 14 + .../docs/Order.md | 27 + .../docs/Pet.md | 27 + .../docs/PetApi.md | 581 ++++++++++++++ .../docs/StoreApi.md | 276 +++++++ .../docs/Tag.md | 13 + .../docs/User.md | 19 + .../docs/UserApi.md | 525 ++++++++++++ .../git_push.sh | 58 ++ .../gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58702 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../gradlew | 183 +++++ .../gradlew.bat | 100 +++ .../pom.xml | 274 +++++++ .../settings.gradle | 1 + .../src/main/AndroidManifest.xml | 3 + .../baeldung/petstore/client/api/PetApi.java | 477 +++++++++++ .../petstore/client/api/StoreApi.java | 240 ++++++ .../baeldung/petstore/client/api/UserApi.java | 441 ++++++++++ .../petstore/client/invoker/ApiClient.java | 750 ++++++++++++++++++ .../invoker/CustomInstantDeserializer.java | 233 ++++++ .../client/invoker/RFC3339DateFormat.java | 32 + .../client/invoker/auth/ApiKeyAuth.java | 62 ++ .../client/invoker/auth/Authentication.java | 14 + .../client/invoker/auth/HttpBasicAuth.java | 38 + .../client/invoker/auth/HttpBearerAuth.java | 34 + .../petstore/client/invoker/auth/OAuth.java | 24 + .../client/invoker/auth/OAuthFlow.java | 5 + .../petstore/client/model/Category.java | 131 +++ .../client/model/ModelApiResponse.java | 162 ++++ .../baeldung/petstore/client/model/Order.java | 296 +++++++ .../baeldung/petstore/client/model/Pet.java | 310 ++++++++ .../baeldung/petstore/client/model/Tag.java | 131 +++ .../baeldung/petstore/client/model/User.java | 317 ++++++++ .../petstore/client/api/PetApiTest.java | 167 ++++ .../petstore/client/api/StoreApiTest.java | 95 +++ .../petstore/client/api/UserApiTest.java | 161 ++++ .../petstore/client/model/CategoryTest.java | 49 ++ .../client/model/ModelApiResponseTest.java | 57 ++ .../petstore/client/model/OrderTest.java | 81 ++ .../petstore/client/model/PetTest.java | 81 ++ .../petstore/client/model/TagTest.java | 49 ++ .../petstore/client/model/UserTest.java | 97 +++ 52 files changed, 6996 insertions(+) create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator-ignore create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator/VERSION create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/.travis.yml create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/README.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/build.gradle create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/build.sbt create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/Category.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/ModelApiResponse.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/Order.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/Pet.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/PetApi.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/StoreApi.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/Tag.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/User.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/docs/UserApi.md create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/git_push.sh create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/gradle.properties create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/gradle/wrapper/gradle-wrapper.jar create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/gradle/wrapper/gradle-wrapper.properties create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/gradlew create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/gradlew.bat create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/settings.gradle create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/AndroidManifest.xml create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/PetApi.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/StoreApi.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/UserApi.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/ApiClient.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/CustomInstantDeserializer.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/RFC3339DateFormat.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/ApiKeyAuth.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/Authentication.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBearerAuth.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuth.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuthFlow.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Category.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/ModelApiResponse.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Order.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Pet.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Tag.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/User.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/PetApiTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/StoreApiTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/UserApiTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/CategoryTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/ModelApiResponseTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/OrderTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/PetTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/TagTest.java create mode 100644 spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/UserTest.java diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml index dee9415679..39d8902956 100644 --- a/spring-swagger-codegen/pom.xml +++ b/spring-swagger-codegen/pom.xml @@ -15,6 +15,7 @@ spring-swagger-codegen-api-client + spring-openapi-generator-api-client spring-swagger-codegen-app diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator-ignore b/spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator-ignore new file mode 100644 index 0000000000..7484ee590a --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator/VERSION b/spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator/VERSION new file mode 100644 index 0000000000..ec87108d82 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/.openapi-generator/VERSION @@ -0,0 +1 @@ +4.2.3 \ No newline at end of file diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/.travis.yml b/spring-swagger-codegen/spring-openapi-generator-api-client/.travis.yml new file mode 100644 index 0000000000..e3bdf2af1b --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/.travis.yml @@ -0,0 +1,22 @@ +# +# Generated by OpenAPI Generator: https://openapi-generator.tech +# +# Ref: https://docs.travis-ci.com/user/languages/java/ +# +language: java +jdk: + - openjdk12 + - openjdk11 + - openjdk10 + - openjdk9 + - openjdk8 +before_install: + # ensure gradlew has proper permission + - chmod a+x ./gradlew +script: + # test using maven + #- mvn test + # test using gradle + - gradle test + # test using sbt + # - sbt test diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/README.md b/spring-swagger-codegen/spring-openapi-generator-api-client/README.md new file mode 100644 index 0000000000..01fd596268 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/README.md @@ -0,0 +1,174 @@ +# spring-openapi-generator-api-client + +Swagger Petstore + +- API version: 1.0.3 + +- Build date: 2020-03-15T06:14:01.568992-05:00[America/Chicago] + +This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + + +*Automatically generated by the [OpenAPI Generator](https://openapi-generator.tech)* + +## Requirements + +Building the API client library requires: + +1. Java 1.8+ +2. Maven/Gradle + +## Installation + +To install the API client library to your local Maven repository, simply execute: + +```shell +mvn clean install +``` + +To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: + +```shell +mvn clean deploy +``` + +Refer to the [OSSRH Guide](http://central.sonatype.org/pages/ossrh-guide.html) for more information. + +### Maven users + +Add this dependency to your project's POM: + +```xml + + com.baeldung + spring-openapi-generator-api-client + 0.0.1-SNAPSHOT + compile + +``` + +### Gradle users + +Add this dependency to your project's build file: + +```groovy +compile "com.baeldung:spring-openapi-generator-api-client:0.0.1-SNAPSHOT" +``` + +### Others + +At first generate the JAR by executing: + +```shell +mvn clean package +``` + +Then manually install the following JARs: + +- `target/spring-openapi-generator-api-client-0.0.1-SNAPSHOT.jar` +- `target/lib/*.jar` + +## Getting Started + +Please follow the [installation](#installation) instruction and execute the following Java code: + +```java + +import com.baeldung.petstore.client.invoker.*; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.model.*; +import com.baeldung.petstore.client.api.PetApi; + +public class PetApiExample { + + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + Pet body = new Pet(); // Pet | Pet object that needs to be added to the store + try { + apiInstance.addPet(body); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#addPet"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *https://petstore.swagger.io/v2* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*PetApi* | [**addPet**](docs/PetApi.md#addPet) | **POST** /pet | Add a new pet to the store +*PetApi* | [**deletePet**](docs/PetApi.md#deletePet) | **DELETE** /pet/{petId} | Deletes a pet +*PetApi* | [**findPetsByStatus**](docs/PetApi.md#findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status +*PetApi* | [**findPetsByTags**](docs/PetApi.md#findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags +*PetApi* | [**getPetById**](docs/PetApi.md#getPetById) | **GET** /pet/{petId} | Find pet by ID +*PetApi* | [**updatePet**](docs/PetApi.md#updatePet) | **PUT** /pet | Update an existing pet +*PetApi* | [**updatePetWithForm**](docs/PetApi.md#updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data +*PetApi* | [**uploadFile**](docs/PetApi.md#uploadFile) | **POST** /pet/{petId}/uploadImage | uploads an image +*StoreApi* | [**deleteOrder**](docs/StoreApi.md#deleteOrder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +*StoreApi* | [**getInventory**](docs/StoreApi.md#getInventory) | **GET** /store/inventory | Returns pet inventories by status +*StoreApi* | [**getOrderById**](docs/StoreApi.md#getOrderById) | **GET** /store/order/{orderId} | Find purchase order by ID +*StoreApi* | [**placeOrder**](docs/StoreApi.md#placeOrder) | **POST** /store/order | Place an order for a pet +*UserApi* | [**createUser**](docs/UserApi.md#createUser) | **POST** /user | Create user +*UserApi* | [**createUsersWithArrayInput**](docs/UserApi.md#createUsersWithArrayInput) | **POST** /user/createWithArray | Creates list of users with given input array +*UserApi* | [**createUsersWithListInput**](docs/UserApi.md#createUsersWithListInput) | **POST** /user/createWithList | Creates list of users with given input array +*UserApi* | [**deleteUser**](docs/UserApi.md#deleteUser) | **DELETE** /user/{username} | Delete user +*UserApi* | [**getUserByName**](docs/UserApi.md#getUserByName) | **GET** /user/{username} | Get user by user name +*UserApi* | [**loginUser**](docs/UserApi.md#loginUser) | **GET** /user/login | Logs user into the system +*UserApi* | [**logoutUser**](docs/UserApi.md#logoutUser) | **GET** /user/logout | Logs out current logged in user session +*UserApi* | [**updateUser**](docs/UserApi.md#updateUser) | **PUT** /user/{username} | Updated user + + +## Documentation for Models + + - [Category](docs/Category.md) + - [ModelApiResponse](docs/ModelApiResponse.md) + - [Order](docs/Order.md) + - [Pet](docs/Pet.md) + - [Tag](docs/Tag.md) + - [User](docs/User.md) + + +## Documentation for Authorization + +Authentication schemes defined for the API: +### api_key + + +- **Type**: API key +- **API key parameter name**: api_key +- **Location**: HTTP header + +### petstore_auth + + +- **Type**: OAuth +- **Flow**: implicit +- **Authorization URL**: https://petstore.swagger.io/oauth/authorize +- **Scopes**: + - read:pets: read your pets + - write:pets: modify pets in your account + + +## Recommendation + +It's recommended to create an instance of `ApiClient` per thread in a multithreaded environment to avoid any potential issues. + +## Author + +apiteam@swagger.io + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/build.gradle b/spring-swagger-codegen/spring-openapi-generator-api-client/build.gradle new file mode 100644 index 0000000000..d86deb75b8 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/build.gradle @@ -0,0 +1,120 @@ +apply plugin: 'idea' +apply plugin: 'eclipse' + +group = 'com.baeldung' +version = '0.0.1-SNAPSHOT' + +buildscript { + repositories { + maven { url "https://repo1.maven.org/maven2" } + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.5.+' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 23 + buildToolsVersion '23.0.2' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 22 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + + dependencies { + provided 'javax.annotation:jsr250-api:1.0' + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + + install { + repositories.mavenInstaller { + pom.artifactId = 'spring-openapi-generator-api-client' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + swagger_annotations_version = "1.5.22" + jackson_version = "2.10.1" + jackson_databind_version = "2.10.1" + jackson_databind_nullable_version = "0.2.1" + spring_web_version = "4.3.9.RELEASE" + jodatime_version = "2.9.9" + junit_version = "4.13" + jackson_threeten_version = "2.9.10" +} + +dependencies { + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile "com.google.code.findbugs:jsr305:3.0.2" + compile "org.springframework:spring-web:$spring_web_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-databind:$jackson_databind_version" + compile "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:$jackson_version" + compile "org.openapitools:jackson-databind-nullable:$jackson_databind_nullable_version" + compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version" + compile "com.github.joschi.jackson:jackson-datatype-threetenbp:$jackson_threeten_version" + testCompile "junit:junit:$junit_version" +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/build.sbt b/spring-swagger-codegen/spring-openapi-generator-api-client/build.sbt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Category.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Category.md new file mode 100644 index 0000000000..848fb61818 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Category.md @@ -0,0 +1,13 @@ + + +# Category + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**name** | **String** | | [optional] + + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/ModelApiResponse.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/ModelApiResponse.md new file mode 100644 index 0000000000..14fb7f1ed2 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/ModelApiResponse.md @@ -0,0 +1,14 @@ + + +# ModelApiResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**code** | **Integer** | | [optional] +**type** | **String** | | [optional] +**message** | **String** | | [optional] + + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Order.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Order.md new file mode 100644 index 0000000000..409fc4cc96 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Order.md @@ -0,0 +1,27 @@ + + +# Order + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**petId** | **Long** | | [optional] +**quantity** | **Integer** | | [optional] +**shipDate** | [**OffsetDateTime**](OffsetDateTime.md) | | [optional] +**status** | [**StatusEnum**](#StatusEnum) | Order Status | [optional] +**complete** | **Boolean** | | [optional] + + + +## Enum: StatusEnum + +Name | Value +---- | ----- +PLACED | "placed" +APPROVED | "approved" +DELIVERED | "delivered" + + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Pet.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Pet.md new file mode 100644 index 0000000000..37ac007b79 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Pet.md @@ -0,0 +1,27 @@ + + +# Pet + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**category** | [**Category**](Category.md) | | [optional] +**name** | **String** | | +**photoUrls** | **List<String>** | | +**tags** | [**List<Tag>**](Tag.md) | | [optional] +**status** | [**StatusEnum**](#StatusEnum) | pet status in the store | [optional] + + + +## Enum: StatusEnum + +Name | Value +---- | ----- +AVAILABLE | "available" +PENDING | "pending" +SOLD | "sold" + + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/PetApi.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/PetApi.md new file mode 100644 index 0000000000..56e81ea3aa --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/PetApi.md @@ -0,0 +1,581 @@ +# PetApi + +All URIs are relative to *https://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**addPet**](PetApi.md#addPet) | **POST** /pet | Add a new pet to the store +[**deletePet**](PetApi.md#deletePet) | **DELETE** /pet/{petId} | Deletes a pet +[**findPetsByStatus**](PetApi.md#findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status +[**findPetsByTags**](PetApi.md#findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags +[**getPetById**](PetApi.md#getPetById) | **GET** /pet/{petId} | Find pet by ID +[**updatePet**](PetApi.md#updatePet) | **PUT** /pet | Update an existing pet +[**updatePetWithForm**](PetApi.md#updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data +[**uploadFile**](PetApi.md#uploadFile) | **POST** /pet/{petId}/uploadImage | uploads an image + + + +## addPet + +> addPet(body) + +Add a new pet to the store + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + Pet body = new Pet(); // Pet | Pet object that needs to be added to the store + try { + apiInstance.addPet(body); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#addPet"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + +- **Content-Type**: application/json, application/xml +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **405** | Invalid input | - | + + +## deletePet + +> deletePet(petId, apiKey) + +Deletes a pet + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + Long petId = 56L; // Long | Pet id to delete + String apiKey = "apiKey_example"; // String | + try { + apiInstance.deletePet(petId, apiKey); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#deletePet"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| Pet id to delete | + **apiKey** | **String**| | [optional] + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **400** | Invalid ID supplied | - | +| **404** | Pet not found | - | + + +## findPetsByStatus + +> List<Pet> findPetsByStatus(status) + +Finds Pets by status + +Multiple status values can be provided with comma separated strings + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + List status = Arrays.asList("available"); // List | Status values that need to be considered for filter + try { + List result = apiInstance.findPetsByStatus(status); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#findPetsByStatus"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **status** | [**List<String>**](String.md)| Status values that need to be considered for filter | [enum: available, pending, sold] + +### Return type + +[**List<Pet>**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/xml + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | +| **400** | Invalid status value | - | + + +## findPetsByTags + +> List<Pet> findPetsByTags(tags) + +Finds Pets by tags + +Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + List tags = Arrays.asList(); // List | Tags to filter by + try { + List result = apiInstance.findPetsByTags(tags); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#findPetsByTags"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tags** | [**List<String>**](String.md)| Tags to filter by | + +### Return type + +[**List<Pet>**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/xml + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | +| **400** | Invalid tag value | - | + + +## getPetById + +> Pet getPetById(petId) + +Find pet by ID + +Returns a single pet + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure API key authorization: api_key + ApiKeyAuth api_key = (ApiKeyAuth) defaultClient.getAuthentication("api_key"); + api_key.setApiKey("YOUR API KEY"); + // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) + //api_key.setApiKeyPrefix("Token"); + + PetApi apiInstance = new PetApi(defaultClient); + Long petId = 56L; // Long | ID of pet to return + try { + Pet result = apiInstance.getPetById(petId); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#getPetById"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| ID of pet to return | + +### Return type + +[**Pet**](Pet.md) + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/xml + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | +| **400** | Invalid ID supplied | - | +| **404** | Pet not found | - | + + +## updatePet + +> updatePet(body) + +Update an existing pet + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + Pet body = new Pet(); // Pet | Pet object that needs to be added to the store + try { + apiInstance.updatePet(body); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#updatePet"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + +- **Content-Type**: application/json, application/xml +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **400** | Invalid ID supplied | - | +| **404** | Pet not found | - | +| **405** | Validation exception | - | + + +## updatePetWithForm + +> updatePetWithForm(petId, name, status) + +Updates a pet in the store with form data + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + Long petId = 56L; // Long | ID of pet that needs to be updated + String name = "name_example"; // String | Updated name of the pet + String status = "status_example"; // String | Updated status of the pet + try { + apiInstance.updatePetWithForm(petId, name, status); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#updatePetWithForm"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| ID of pet that needs to be updated | + **name** | **String**| Updated name of the pet | [optional] + **status** | **String**| Updated status of the pet | [optional] + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + +- **Content-Type**: application/x-www-form-urlencoded +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **405** | Invalid input | - | + + +## uploadFile + +> ModelApiResponse uploadFile(petId, additionalMetadata, file) + +uploads an image + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.PetApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure OAuth2 access token for authorization: petstore_auth + OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); + petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + + PetApi apiInstance = new PetApi(defaultClient); + Long petId = 56L; // Long | ID of pet to update + String additionalMetadata = "additionalMetadata_example"; // String | Additional data to pass to server + File file = new File("/path/to/file"); // File | file to upload + try { + ModelApiResponse result = apiInstance.uploadFile(petId, additionalMetadata, file); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling PetApi#uploadFile"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| ID of pet to update | + **additionalMetadata** | **String**| Additional data to pass to server | [optional] + **file** | **File**| file to upload | [optional] + +### Return type + +[**ModelApiResponse**](ModelApiResponse.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + +- **Content-Type**: multipart/form-data +- **Accept**: application/json + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/StoreApi.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/StoreApi.md new file mode 100644 index 0000000000..7a70c0bdbc --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/StoreApi.md @@ -0,0 +1,276 @@ +# StoreApi + +All URIs are relative to *https://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**deleteOrder**](StoreApi.md#deleteOrder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +[**getInventory**](StoreApi.md#getInventory) | **GET** /store/inventory | Returns pet inventories by status +[**getOrderById**](StoreApi.md#getOrderById) | **GET** /store/order/{orderId} | Find purchase order by ID +[**placeOrder**](StoreApi.md#placeOrder) | **POST** /store/order | Place an order for a pet + + + +## deleteOrder + +> deleteOrder(orderId) + +Delete purchase order by ID + +For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.StoreApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + StoreApi apiInstance = new StoreApi(defaultClient); + Long orderId = 56L; // Long | ID of the order that needs to be deleted + try { + apiInstance.deleteOrder(orderId); + } catch (ApiException e) { + System.err.println("Exception when calling StoreApi#deleteOrder"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **Long**| ID of the order that needs to be deleted | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **400** | Invalid ID supplied | - | +| **404** | Order not found | - | + + +## getInventory + +> Map<String, Integer> getInventory() + +Returns pet inventories by status + +Returns a map of status codes to quantities + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.auth.*; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.StoreApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + // Configure API key authorization: api_key + ApiKeyAuth api_key = (ApiKeyAuth) defaultClient.getAuthentication("api_key"); + api_key.setApiKey("YOUR API KEY"); + // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) + //api_key.setApiKeyPrefix("Token"); + + StoreApi apiInstance = new StoreApi(defaultClient); + try { + Map result = apiInstance.getInventory(); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling StoreApi#getInventory"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**Map<String, Integer>** + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | + + +## getOrderById + +> Order getOrderById(orderId) + +Find purchase order by ID + +For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.StoreApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + StoreApi apiInstance = new StoreApi(defaultClient); + Long orderId = 56L; // Long | ID of pet that needs to be fetched + try { + Order result = apiInstance.getOrderById(orderId); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling StoreApi#getOrderById"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **Long**| ID of pet that needs to be fetched | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/xml + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | +| **400** | Invalid ID supplied | - | +| **404** | Order not found | - | + + +## placeOrder + +> Order placeOrder(body) + +Place an order for a pet + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.StoreApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + StoreApi apiInstance = new StoreApi(defaultClient); + Order body = new Order(); // Order | order placed for purchasing the pet + try { + Order result = apiInstance.placeOrder(body); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling StoreApi#placeOrder"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | [**Order**](Order.md)| order placed for purchasing the pet | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json, application/xml + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | +| **400** | Invalid Order | - | + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Tag.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Tag.md new file mode 100644 index 0000000000..f24eba7d22 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/Tag.md @@ -0,0 +1,13 @@ + + +# Tag + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**name** | **String** | | [optional] + + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/User.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/User.md new file mode 100644 index 0000000000..c4ea94b7fc --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/User.md @@ -0,0 +1,19 @@ + + +# User + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**username** | **String** | | [optional] +**firstName** | **String** | | [optional] +**lastName** | **String** | | [optional] +**email** | **String** | | [optional] +**password** | **String** | | [optional] +**phone** | **String** | | [optional] +**userStatus** | **Integer** | User Status | [optional] + + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/docs/UserApi.md b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/UserApi.md new file mode 100644 index 0000000000..ff3815e352 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/docs/UserApi.md @@ -0,0 +1,525 @@ +# UserApi + +All URIs are relative to *https://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**createUser**](UserApi.md#createUser) | **POST** /user | Create user +[**createUsersWithArrayInput**](UserApi.md#createUsersWithArrayInput) | **POST** /user/createWithArray | Creates list of users with given input array +[**createUsersWithListInput**](UserApi.md#createUsersWithListInput) | **POST** /user/createWithList | Creates list of users with given input array +[**deleteUser**](UserApi.md#deleteUser) | **DELETE** /user/{username} | Delete user +[**getUserByName**](UserApi.md#getUserByName) | **GET** /user/{username} | Get user by user name +[**loginUser**](UserApi.md#loginUser) | **GET** /user/login | Logs user into the system +[**logoutUser**](UserApi.md#logoutUser) | **GET** /user/logout | Logs out current logged in user session +[**updateUser**](UserApi.md#updateUser) | **PUT** /user/{username} | Updated user + + + +## createUser + +> createUser(body) + +Create user + +This can only be done by the logged in user. + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + User body = new User(); // User | Created user object + try { + apiInstance.createUser(body); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#createUser"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | [**User**](User.md)| Created user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **0** | successful operation | - | + + +## createUsersWithArrayInput + +> createUsersWithArrayInput(body) + +Creates list of users with given input array + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + List body = Arrays.asList(); // List | List of user object + try { + apiInstance.createUsersWithArrayInput(body); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#createUsersWithArrayInput"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | [**List<User>**](User.md)| List of user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **0** | successful operation | - | + + +## createUsersWithListInput + +> createUsersWithListInput(body) + +Creates list of users with given input array + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + List body = Arrays.asList(); // List | List of user object + try { + apiInstance.createUsersWithListInput(body); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#createUsersWithListInput"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | [**List<User>**](User.md)| List of user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **0** | successful operation | - | + + +## deleteUser + +> deleteUser(username) + +Delete user + +This can only be done by the logged in user. + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + String username = "username_example"; // String | The name that needs to be deleted + try { + apiInstance.deleteUser(username); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#deleteUser"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be deleted | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **400** | Invalid username supplied | - | +| **404** | User not found | - | + + +## getUserByName + +> User getUserByName(username) + +Get user by user name + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + String username = "username_example"; // String | The name that needs to be fetched. Use user1 for testing. + try { + User result = apiInstance.getUserByName(username); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#getUserByName"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be fetched. Use user1 for testing. | + +### Return type + +[**User**](User.md) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/xml + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | - | +| **400** | Invalid username supplied | - | +| **404** | User not found | - | + + +## loginUser + +> String loginUser(username, password) + +Logs user into the system + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + String username = "username_example"; // String | The user name for login + String password = "password_example"; // String | The password for login in clear text + try { + String result = apiInstance.loginUser(username, password); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#loginUser"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The user name for login | + **password** | **String**| The password for login in clear text | + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/xml + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | successful operation | * X-Rate-Limit - calls per hour allowed by the user
* X-Expires-After - date in UTC when token expires
| +| **400** | Invalid username/password supplied | - | + + +## logoutUser + +> logoutUser() + +Logs out current logged in user session + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + try { + apiInstance.logoutUser(); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#logoutUser"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **0** | successful operation | - | + + +## updateUser + +> updateUser(username, body) + +Updated user + +This can only be done by the logged in user. + +### Example + +```java +// Import classes: +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.invoker.ApiException; +import com.baeldung.petstore.client.invoker.Configuration; +import com.baeldung.petstore.client.invoker.models.*; +import com.baeldung.petstore.client.api.UserApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://petstore.swagger.io/v2"); + + UserApi apiInstance = new UserApi(defaultClient); + String username = "username_example"; // String | name that need to be updated + User body = new User(); // User | Updated user object + try { + apiInstance.updateUser(username, body); + } catch (ApiException e) { + System.err.println("Exception when calling UserApi#updateUser"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } + } +} +``` + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| name that need to be updated | + **body** | [**User**](User.md)| Updated user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **400** | Invalid user supplied | - | +| **404** | User not found | - | + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/git_push.sh b/spring-swagger-codegen/spring-openapi-generator-api-client/git_push.sh new file mode 100644 index 0000000000..ced3be2b0c --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/git_push.sh @@ -0,0 +1,58 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-pestore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=`git remote` +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/gradle.properties b/spring-swagger-codegen/spring-openapi-generator-api-client/gradle.properties new file mode 100644 index 0000000000..05644f0754 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/gradle.properties @@ -0,0 +1,2 @@ +# Uncomment to build for Android +#target = android \ No newline at end of file diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/gradle/wrapper/gradle-wrapper.jar b/spring-swagger-codegen/spring-openapi-generator-api-client/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b GIT binary patch literal 58702 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

@up^y4&I8N>~wvL%f(S2W%NN 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 D613UA literal 0 HcmV?d00001 diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/gradle/wrapper/gradle-wrapper.properties b/spring-swagger-codegen/spring-openapi-generator-api-client/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..94920145f3 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/gradlew b/spring-swagger-codegen/spring-openapi-generator-api-client/gradlew new file mode 100644 index 0000000000..2fe81a7d95 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/gradlew.bat b/spring-swagger-codegen/spring-openapi-generator-api-client/gradlew.bat new file mode 100644 index 0000000000..9618d8d960 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml new file mode 100644 index 0000000000..cc70a9f654 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml @@ -0,0 +1,274 @@ + + 4.0.0 + com.baeldung + spring-openapi-generator-api-client + jar + spring-openapi-generator-api-client + 0.0.1-SNAPSHOT + https://github.com/openapitools/openapi-generator + OpenAPI Java + + scm:git:git@github.com:openapitools/openapi-generator.git + scm:git:git@github.com:openapitools/openapi-generator.git + https://github.com/openapitools/openapi-generator + + + + + Unlicense + http://www.apache.org/licenses/LICENSE-2.0.html + repo + + + + + + OpenAPI-Generator Contributors + team@openapitools.org + OpenAPITools.org + http://openapitools.org + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M1 + + + enforce-maven + + enforce + + + + + 2.2.0 + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.10 + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + + + + + sign-artifacts + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + + + + + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + + + com.google.code.findbugs + jsr305 + 3.0.2 + + + + + org.springframework + spring-web + ${spring-web-version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson-version} + + + org.openapitools + jackson-databind-nullable + ${jackson-databind-nullable-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson-version} + + + com.github.joschi.jackson + jackson-datatype-threetenbp + ${jackson-threetenbp-version} + + + + + junit + junit + ${junit-version} + test + + + + UTF-8 + 1.5.22 + 4.3.9.RELEASE + 2.10.1 + 2.10.1 + 0.2.1 + 2.9.10 + 1.0.0 + 4.13 + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/settings.gradle b/spring-swagger-codegen/spring-openapi-generator-api-client/settings.gradle new file mode 100644 index 0000000000..06a087cb49 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "spring-openapi-generator-api-client" \ No newline at end of file diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/AndroidManifest.xml b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..cd581f9f78 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/PetApi.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/PetApi.java new file mode 100644 index 0000000000..b7256c81fb --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/PetApi.java @@ -0,0 +1,477 @@ +package com.baeldung.petstore.client.api; + +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.model.ModelApiResponse; +import com.baeldung.petstore.client.model.Pet; + +import java.io.File; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; + +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +@Component("com.baeldung.petstore.client.api.PetApi") +public class PetApi { + private ApiClient apiClient; + + public PetApi() { + this(new ApiClient()); + } + + @Autowired + public PetApi(ApiClient apiClient) { + this.apiClient = apiClient; + } + + public ApiClient getApiClient() { + return apiClient; + } + + public void setApiClient(ApiClient apiClient) { + this.apiClient = apiClient; + } + + /** + * Add a new pet to the store + * + *

405 - Invalid input + * @param body Pet object that needs to be added to the store (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void addPet(Pet body) throws RestClientException { + addPetWithHttpInfo(body); + } + + /** + * Add a new pet to the store + * + *

405 - Invalid input + * @param body Pet object that needs to be added to the store (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity addPetWithHttpInfo(Pet body) throws RestClientException { + Object postBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'body' when calling addPet"); + } + + String path = apiClient.expandPath("/pet", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/json", "application/xml" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "petstore_auth" }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Deletes a pet + * + *

400 - Invalid ID supplied + *

404 - Pet not found + * @param petId Pet id to delete (required) + * @param apiKey (optional) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void deletePet(Long petId, String apiKey) throws RestClientException { + deletePetWithHttpInfo(petId, apiKey); + } + + /** + * Deletes a pet + * + *

400 - Invalid ID supplied + *

404 - Pet not found + * @param petId Pet id to delete (required) + * @param apiKey (optional) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity deletePetWithHttpInfo(Long petId, String apiKey) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'petId' when calling deletePet"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("petId", petId); + String path = apiClient.expandPath("/pet/{petId}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + if (apiKey != null) + headerParams.add("api_key", apiClient.parameterToString(apiKey)); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "petstore_auth" }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.DELETE, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Finds Pets by status + * Multiple status values can be provided with comma separated strings + *

200 - successful operation + *

400 - Invalid status value + * @param status Status values that need to be considered for filter (required) + * @return List<Pet> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public List findPetsByStatus(List status) throws RestClientException { + return findPetsByStatusWithHttpInfo(status).getBody(); + } + + /** + * Finds Pets by status + * Multiple status values can be provided with comma separated strings + *

200 - successful operation + *

400 - Invalid status value + * @param status Status values that need to be considered for filter (required) + * @return ResponseEntity<List<Pet>> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity> findPetsByStatusWithHttpInfo(List status) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'status' is set + if (status == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'status' when calling findPetsByStatus"); + } + + String path = apiClient.expandPath("/pet/findByStatus", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + queryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("multi".toUpperCase(Locale.ROOT)), "status", status)); + + final String[] accepts = { + "application/json", "application/xml" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "petstore_auth" }; + + ParameterizedTypeReference> returnType = new ParameterizedTypeReference>() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + *

200 - successful operation + *

400 - Invalid tag value + * @param tags Tags to filter by (required) + * @return List<Pet> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + @Deprecated + public List findPetsByTags(List tags) throws RestClientException { + return findPetsByTagsWithHttpInfo(tags).getBody(); + } + + /** + * Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + *

200 - successful operation + *

400 - Invalid tag value + * @param tags Tags to filter by (required) + * @return ResponseEntity<List<Pet>> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + @Deprecated + public ResponseEntity> findPetsByTagsWithHttpInfo(List tags) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'tags' is set + if (tags == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'tags' when calling findPetsByTags"); + } + + String path = apiClient.expandPath("/pet/findByTags", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + queryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("multi".toUpperCase(Locale.ROOT)), "tags", tags)); + + final String[] accepts = { + "application/json", "application/xml" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "petstore_auth" }; + + ParameterizedTypeReference> returnType = new ParameterizedTypeReference>() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Find pet by ID + * Returns a single pet + *

200 - successful operation + *

400 - Invalid ID supplied + *

404 - Pet not found + * @param petId ID of pet to return (required) + * @return Pet + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public Pet getPetById(Long petId) throws RestClientException { + return getPetByIdWithHttpInfo(petId).getBody(); + } + + /** + * Find pet by ID + * Returns a single pet + *

200 - successful operation + *

400 - Invalid ID supplied + *

404 - Pet not found + * @param petId ID of pet to return (required) + * @return ResponseEntity<Pet> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity getPetByIdWithHttpInfo(Long petId) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'petId' when calling getPetById"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("petId", petId); + String path = apiClient.expandPath("/pet/{petId}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { + "application/json", "application/xml" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "api_key" }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Update an existing pet + * + *

400 - Invalid ID supplied + *

404 - Pet not found + *

405 - Validation exception + * @param body Pet object that needs to be added to the store (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void updatePet(Pet body) throws RestClientException { + updatePetWithHttpInfo(body); + } + + /** + * Update an existing pet + * + *

400 - Invalid ID supplied + *

404 - Pet not found + *

405 - Validation exception + * @param body Pet object that needs to be added to the store (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity updatePetWithHttpInfo(Pet body) throws RestClientException { + Object postBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'body' when calling updatePet"); + } + + String path = apiClient.expandPath("/pet", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/json", "application/xml" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "petstore_auth" }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.PUT, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Updates a pet in the store with form data + * + *

405 - Invalid input + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional) + * @param status Updated status of the pet (optional) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void updatePetWithForm(Long petId, String name, String status) throws RestClientException { + updatePetWithFormWithHttpInfo(petId, name, status); + } + + /** + * Updates a pet in the store with form data + * + *

405 - Invalid input + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional) + * @param status Updated status of the pet (optional) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity updatePetWithFormWithHttpInfo(Long petId, String name, String status) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'petId' when calling updatePetWithForm"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("petId", petId); + String path = apiClient.expandPath("/pet/{petId}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + if (name != null) + formParams.add("name", name); + if (status != null) + formParams.add("status", status); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/x-www-form-urlencoded" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "petstore_auth" }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * uploads an image + * + *

200 - successful operation + * @param petId ID of pet to update (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @param file file to upload (optional) + * @return ModelApiResponse + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ModelApiResponse uploadFile(Long petId, String additionalMetadata, File file) throws RestClientException { + return uploadFileWithHttpInfo(petId, additionalMetadata, file).getBody(); + } + + /** + * uploads an image + * + *

200 - successful operation + * @param petId ID of pet to update (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @param file file to upload (optional) + * @return ResponseEntity<ModelApiResponse> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity uploadFileWithHttpInfo(Long petId, String additionalMetadata, File file) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'petId' when calling uploadFile"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("petId", petId); + String path = apiClient.expandPath("/pet/{petId}/uploadImage", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + if (additionalMetadata != null) + formParams.add("additionalMetadata", additionalMetadata); + if (file != null) + formParams.add("file", new FileSystemResource(file)); + + final String[] accepts = { + "application/json" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "multipart/form-data" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "petstore_auth" }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/StoreApi.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/StoreApi.java new file mode 100644 index 0000000000..792617bc28 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/StoreApi.java @@ -0,0 +1,240 @@ +package com.baeldung.petstore.client.api; + +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.model.Order; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; + +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +@Component("com.baeldung.petstore.client.api.StoreApi") +public class StoreApi { + private ApiClient apiClient; + + public StoreApi() { + this(new ApiClient()); + } + + @Autowired + public StoreApi(ApiClient apiClient) { + this.apiClient = apiClient; + } + + public ApiClient getApiClient() { + return apiClient; + } + + public void setApiClient(ApiClient apiClient) { + this.apiClient = apiClient; + } + + /** + * Delete purchase order by ID + * For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors + *

400 - Invalid ID supplied + *

404 - Order not found + * @param orderId ID of the order that needs to be deleted (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void deleteOrder(Long orderId) throws RestClientException { + deleteOrderWithHttpInfo(orderId); + } + + /** + * Delete purchase order by ID + * For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors + *

400 - Invalid ID supplied + *

404 - Order not found + * @param orderId ID of the order that needs to be deleted (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity deleteOrderWithHttpInfo(Long orderId) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'orderId' is set + if (orderId == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'orderId' when calling deleteOrder"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("orderId", orderId); + String path = apiClient.expandPath("/store/order/{orderId}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.DELETE, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + *

200 - successful operation + * @return Map<String, Integer> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public Map getInventory() throws RestClientException { + return getInventoryWithHttpInfo().getBody(); + } + + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + *

200 - successful operation + * @return ResponseEntity<Map<String, Integer>> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity> getInventoryWithHttpInfo() throws RestClientException { + Object postBody = null; + + String path = apiClient.expandPath("/store/inventory", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { + "application/json" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { "api_key" }; + + ParameterizedTypeReference> returnType = new ParameterizedTypeReference>() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Find purchase order by ID + * For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions + *

200 - successful operation + *

400 - Invalid ID supplied + *

404 - Order not found + * @param orderId ID of pet that needs to be fetched (required) + * @return Order + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public Order getOrderById(Long orderId) throws RestClientException { + return getOrderByIdWithHttpInfo(orderId).getBody(); + } + + /** + * Find purchase order by ID + * For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions + *

200 - successful operation + *

400 - Invalid ID supplied + *

404 - Order not found + * @param orderId ID of pet that needs to be fetched (required) + * @return ResponseEntity<Order> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity getOrderByIdWithHttpInfo(Long orderId) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'orderId' is set + if (orderId == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'orderId' when calling getOrderById"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("orderId", orderId); + String path = apiClient.expandPath("/store/order/{orderId}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { + "application/json", "application/xml" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Place an order for a pet + * + *

200 - successful operation + *

400 - Invalid Order + * @param body order placed for purchasing the pet (required) + * @return Order + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public Order placeOrder(Order body) throws RestClientException { + return placeOrderWithHttpInfo(body).getBody(); + } + + /** + * Place an order for a pet + * + *

200 - successful operation + *

400 - Invalid Order + * @param body order placed for purchasing the pet (required) + * @return ResponseEntity<Order> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity placeOrderWithHttpInfo(Order body) throws RestClientException { + Object postBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'body' when calling placeOrder"); + } + + String path = apiClient.expandPath("/store/order", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { + "application/json", "application/xml" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/json" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/UserApi.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/UserApi.java new file mode 100644 index 0000000000..c7cb0b803d --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/api/UserApi.java @@ -0,0 +1,441 @@ +package com.baeldung.petstore.client.api; + +import com.baeldung.petstore.client.invoker.ApiClient; +import com.baeldung.petstore.client.model.User; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; + +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +@Component("com.baeldung.petstore.client.api.UserApi") +public class UserApi { + private ApiClient apiClient; + + public UserApi() { + this(new ApiClient()); + } + + @Autowired + public UserApi(ApiClient apiClient) { + this.apiClient = apiClient; + } + + public ApiClient getApiClient() { + return apiClient; + } + + public void setApiClient(ApiClient apiClient) { + this.apiClient = apiClient; + } + + /** + * Create user + * This can only be done by the logged in user. + *

0 - successful operation + * @param body Created user object (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void createUser(User body) throws RestClientException { + createUserWithHttpInfo(body); + } + + /** + * Create user + * This can only be done by the logged in user. + *

0 - successful operation + * @param body Created user object (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity createUserWithHttpInfo(User body) throws RestClientException { + Object postBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'body' when calling createUser"); + } + + String path = apiClient.expandPath("/user", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/json" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Creates list of users with given input array + * + *

0 - successful operation + * @param body List of user object (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void createUsersWithArrayInput(List body) throws RestClientException { + createUsersWithArrayInputWithHttpInfo(body); + } + + /** + * Creates list of users with given input array + * + *

0 - successful operation + * @param body List of user object (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity createUsersWithArrayInputWithHttpInfo(List body) throws RestClientException { + Object postBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'body' when calling createUsersWithArrayInput"); + } + + String path = apiClient.expandPath("/user/createWithArray", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/json" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Creates list of users with given input array + * + *

0 - successful operation + * @param body List of user object (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void createUsersWithListInput(List body) throws RestClientException { + createUsersWithListInputWithHttpInfo(body); + } + + /** + * Creates list of users with given input array + * + *

0 - successful operation + * @param body List of user object (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity createUsersWithListInputWithHttpInfo(List body) throws RestClientException { + Object postBody = body; + + // verify the required parameter 'body' is set + if (body == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'body' when calling createUsersWithListInput"); + } + + String path = apiClient.expandPath("/user/createWithList", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/json" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Delete user + * This can only be done by the logged in user. + *

400 - Invalid username supplied + *

404 - User not found + * @param username The name that needs to be deleted (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void deleteUser(String username) throws RestClientException { + deleteUserWithHttpInfo(username); + } + + /** + * Delete user + * This can only be done by the logged in user. + *

400 - Invalid username supplied + *

404 - User not found + * @param username The name that needs to be deleted (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity deleteUserWithHttpInfo(String username) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'username' is set + if (username == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'username' when calling deleteUser"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("username", username); + String path = apiClient.expandPath("/user/{username}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.DELETE, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Get user by user name + * + *

200 - successful operation + *

400 - Invalid username supplied + *

404 - User not found + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return User + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public User getUserByName(String username) throws RestClientException { + return getUserByNameWithHttpInfo(username).getBody(); + } + + /** + * Get user by user name + * + *

200 - successful operation + *

400 - Invalid username supplied + *

404 - User not found + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return ResponseEntity<User> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity getUserByNameWithHttpInfo(String username) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'username' is set + if (username == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'username' when calling getUserByName"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("username", username); + String path = apiClient.expandPath("/user/{username}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { + "application/json", "application/xml" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Logs user into the system + * + *

200 - successful operation + *

400 - Invalid username/password supplied + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return String + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public String loginUser(String username, String password) throws RestClientException { + return loginUserWithHttpInfo(username, password).getBody(); + } + + /** + * Logs user into the system + * + *

200 - successful operation + *

400 - Invalid username/password supplied + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return ResponseEntity<String> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity loginUserWithHttpInfo(String username, String password) throws RestClientException { + Object postBody = null; + + // verify the required parameter 'username' is set + if (username == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'username' when calling loginUser"); + } + + // verify the required parameter 'password' is set + if (password == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'password' when calling loginUser"); + } + + String path = apiClient.expandPath("/user/login", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + queryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username)); + queryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password)); + + final String[] accepts = { + "application/json", "application/xml" + }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Logs out current logged in user session + * + *

0 - successful operation + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void logoutUser() throws RestClientException { + logoutUserWithHttpInfo(); + } + + /** + * Logs out current logged in user session + * + *

0 - successful operation + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity logoutUserWithHttpInfo() throws RestClientException { + Object postBody = null; + + String path = apiClient.expandPath("/user/logout", Collections.emptyMap()); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.GET, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } + /** + * Updated user + * This can only be done by the logged in user. + *

400 - Invalid user supplied + *

404 - User not found + * @param username name that need to be updated (required) + * @param body Updated user object (required) + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public void updateUser(String username, User body) throws RestClientException { + updateUserWithHttpInfo(username, body); + } + + /** + * Updated user + * This can only be done by the logged in user. + *

400 - Invalid user supplied + *

404 - User not found + * @param username name that need to be updated (required) + * @param body Updated user object (required) + * @return ResponseEntity<Void> + * @throws RestClientException if an error occurs while attempting to invoke the API + */ + public ResponseEntity updateUserWithHttpInfo(String username, User body) throws RestClientException { + Object postBody = body; + + // verify the required parameter 'username' is set + if (username == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'username' when calling updateUser"); + } + + // verify the required parameter 'body' is set + if (body == null) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Missing the required parameter 'body' when calling updateUser"); + } + + // create path and map variables + final Map uriVariables = new HashMap(); + uriVariables.put("username", username); + String path = apiClient.expandPath("/user/{username}", uriVariables); + + final MultiValueMap queryParams = new LinkedMultiValueMap(); + final HttpHeaders headerParams = new HttpHeaders(); + final MultiValueMap cookieParams = new LinkedMultiValueMap(); + final MultiValueMap formParams = new LinkedMultiValueMap(); + + final String[] accepts = { }; + final List accept = apiClient.selectHeaderAccept(accepts); + final String[] contentTypes = { + "application/json" + }; + final MediaType contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + ParameterizedTypeReference returnType = new ParameterizedTypeReference() {}; + return apiClient.invokeAPI(path, HttpMethod.PUT, queryParams, postBody, headerParams, cookieParams, formParams, accept, contentType, authNames, returnType); + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/ApiClient.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/ApiClient.java new file mode 100644 index 0000000000..5a10828c47 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/ApiClient.java @@ -0,0 +1,750 @@ +package com.baeldung.petstore.client.invoker; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; + +import com.baeldung.petstore.client.invoker.auth.ApiKeyAuth; +import com.baeldung.petstore.client.invoker.auth.Authentication; +import com.baeldung.petstore.client.invoker.auth.HttpBasicAuth; +import com.baeldung.petstore.client.invoker.auth.HttpBearerAuth; +import com.baeldung.petstore.client.invoker.auth.OAuth; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.DateFormat; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TimeZone; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.openapitools.jackson.nullable.JsonNullableModule; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpRequest; +import org.springframework.http.InvalidMediaTypeException; +import org.springframework.http.MediaType; +import org.springframework.http.RequestEntity; +import org.springframework.http.RequestEntity.BodyBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.BufferingClientHttpRequestFactory; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; +import org.threeten.bp.*; + +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +@Component("com.baeldung.petstore.client.invoker.ApiClient") +public class ApiClient { + public enum CollectionFormat { + CSV(","), TSV("\t"), SSV(" "), PIPES("|"), MULTI(null); + + private final String separator; + private CollectionFormat(String separator) { + this.separator = separator; + } + + private String collectionToString(Collection collection) { + return StringUtils.collectionToDelimitedString(collection, separator); + } + } + + private boolean debugging = false; + + private HttpHeaders defaultHeaders = new HttpHeaders(); + private MultiValueMap defaultCookies = new LinkedMultiValueMap(); + + private String basePath = "https://petstore.swagger.io/v2"; + + private RestTemplate restTemplate; + + private Map authentications; + + private DateFormat dateFormat; + + public ApiClient() { + this.restTemplate = buildRestTemplate(); + init(); + } + + @Autowired + public ApiClient(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + init(); + } + + protected void init() { + // Use RFC3339 format for date and datetime. + // See http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14 + this.dateFormat = new RFC3339DateFormat(); + + // Use UTC as the default time zone. + this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + // Set default User-Agent. + setUserAgent("Java-SDK"); + + // Setup authentications (key: authentication name, value: authentication). + authentications = new HashMap(); + authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("petstore_auth", new OAuth()); + // Prevent the authentications from being modified. + authentications = Collections.unmodifiableMap(authentications); + } + + /** + * Get the current base path + * @return String the base path + */ + public String getBasePath() { + return basePath; + } + + /** + * Set the base path, which should include the host + * @param basePath the base path + * @return ApiClient this client + */ + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + return this; + } + + /** + * Get authentications (key: authentication name, value: authentication). + * @return Map the currently configured authentication types + */ + public Map getAuthentications() { + return authentications; + } + + /** + * Get authentication for the given name. + * + * @param authName The authentication name + * @return The authentication, null if not found + */ + public Authentication getAuthentication(String authName) { + return authentications.get(authName); + } + + /** + * Helper method to set token for HTTP bearer authentication. + * @param bearerToken the token + */ + public void setBearerToken(String bearerToken) { + for (Authentication auth : authentications.values()) { + if (auth instanceof HttpBearerAuth) { + ((HttpBearerAuth) auth).setBearerToken(bearerToken); + return; + } + } + throw new RuntimeException("No Bearer authentication configured!"); + } + + /** + * Helper method to set username for the first HTTP basic authentication. + * @param username the username + */ + public void setUsername(String username) { + for (Authentication auth : authentications.values()) { + if (auth instanceof HttpBasicAuth) { + ((HttpBasicAuth) auth).setUsername(username); + return; + } + } + throw new RuntimeException("No HTTP basic authentication configured!"); + } + + /** + * Helper method to set password for the first HTTP basic authentication. + * @param password the password + */ + public void setPassword(String password) { + for (Authentication auth : authentications.values()) { + if (auth instanceof HttpBasicAuth) { + ((HttpBasicAuth) auth).setPassword(password); + return; + } + } + throw new RuntimeException("No HTTP basic authentication configured!"); + } + + /** + * Helper method to set API key value for the first API key authentication. + * @param apiKey the API key + */ + public void setApiKey(String apiKey) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKey(apiKey); + return; + } + } + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set API key prefix for the first API key authentication. + * @param apiKeyPrefix the API key prefix + */ + public void setApiKeyPrefix(String apiKeyPrefix) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKeyPrefix(apiKeyPrefix); + return; + } + } + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set access token for the first OAuth2 authentication. + * @param accessToken the access token + */ + public void setAccessToken(String accessToken) { + for (Authentication auth : authentications.values()) { + if (auth instanceof OAuth) { + ((OAuth) auth).setAccessToken(accessToken); + return; + } + } + throw new RuntimeException("No OAuth2 authentication configured!"); + } + + /** + * Set the User-Agent header's value (by adding to the default header map). + * @param userAgent the user agent string + * @return ApiClient this client + */ + public ApiClient setUserAgent(String userAgent) { + addDefaultHeader("User-Agent", userAgent); + return this; + } + + /** + * Add a default header. + * + * @param name The header's name + * @param value The header's value + * @return ApiClient this client + */ + public ApiClient addDefaultHeader(String name, String value) { + if (defaultHeaders.containsKey(name)) { + defaultHeaders.remove(name); + } + defaultHeaders.add(name, value); + return this; + } + + /** + * Add a default cookie. + * + * @param name The cookie's name + * @param value The cookie's value + * @return ApiClient this client + */ + public ApiClient addDefaultCookie(String name, String value) { + if (defaultCookies.containsKey(name)) { + defaultCookies.remove(name); + } + defaultCookies.add(name, value); + return this; + } + + public void setDebugging(boolean debugging) { + List currentInterceptors = this.restTemplate.getInterceptors(); + if(debugging) { + if (currentInterceptors == null) { + currentInterceptors = new ArrayList(); + } + ClientHttpRequestInterceptor interceptor = new ApiClientHttpRequestInterceptor(); + currentInterceptors.add(interceptor); + this.restTemplate.setInterceptors(currentInterceptors); + } else { + if (currentInterceptors != null && !currentInterceptors.isEmpty()) { + Iterator iter = currentInterceptors.iterator(); + while (iter.hasNext()) { + ClientHttpRequestInterceptor interceptor = iter.next(); + if (interceptor instanceof ApiClientHttpRequestInterceptor) { + iter.remove(); + } + } + this.restTemplate.setInterceptors(currentInterceptors); + } + } + this.debugging = debugging; + } + + /** + * Check that whether debugging is enabled for this API client. + * @return boolean true if this client is enabled for debugging, false otherwise + */ + public boolean isDebugging() { + return debugging; + } + + /** + * Get the date format used to parse/format date parameters. + * @return DateFormat format + */ + public DateFormat getDateFormat() { + return dateFormat; + } + + /** + * Set the date format used to parse/format date parameters. + * @param dateFormat Date format + * @return API client + */ + public ApiClient setDateFormat(DateFormat dateFormat) { + this.dateFormat = dateFormat; + for(HttpMessageConverter converter:restTemplate.getMessageConverters()){ + if(converter instanceof AbstractJackson2HttpMessageConverter){ + ObjectMapper mapper = ((AbstractJackson2HttpMessageConverter)converter).getObjectMapper(); + mapper.setDateFormat(dateFormat); + } + } + return this; + } + + /** + * Parse the given string into Date object. + * @param str the string to parse + * @return the Date parsed from the string + */ + public Date parseDate(String str) { + try { + return dateFormat.parse(str); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * Format the given Date object into string. + * @param date the date to format + * @return the formatted date as string + */ + public String formatDate(Date date) { + return dateFormat.format(date); + } + + /** + * Format the given parameter object into string. + * @param param the object to convert + * @return String the parameter represented as a String + */ + public String parameterToString(Object param) { + if (param == null) { + return ""; + } else if (param instanceof Date) { + return formatDate( (Date) param); + } else if (param instanceof Collection) { + StringBuilder b = new StringBuilder(); + for(Object o : (Collection) param) { + if(b.length() > 0) { + b.append(","); + } + b.append(String.valueOf(o)); + } + return b.toString(); + } else { + return String.valueOf(param); + } + } + + /** + * Formats the specified collection path parameter to a string value. + * + * @param collectionFormat The collection format of the parameter. + * @param values The values of the parameter. + * @return String representation of the parameter + */ + public String collectionPathParameterToString(CollectionFormat collectionFormat, Collection values) { + // create the value based on the collection format + if (CollectionFormat.MULTI.equals(collectionFormat)) { + // not valid for path params + return parameterToString(values); + } + + // collectionFormat is assumed to be "csv" by default + if(collectionFormat == null) { + collectionFormat = CollectionFormat.CSV; + } + + return collectionFormat.collectionToString(values); + } + + /** + * Converts a parameter to a {@link MultiValueMap} for use in REST requests + * @param collectionFormat The format to convert to + * @param name The name of the parameter + * @param value The parameter's value + * @return a Map containing the String value(s) of the input parameter + */ + public MultiValueMap parameterToMultiValueMap(CollectionFormat collectionFormat, String name, Object value) { + final MultiValueMap params = new LinkedMultiValueMap(); + + if (name == null || name.isEmpty() || value == null) { + return params; + } + + if(collectionFormat == null) { + collectionFormat = CollectionFormat.CSV; + } + + Collection valueCollection = null; + if (value instanceof Collection) { + valueCollection = (Collection) value; + } else { + params.add(name, parameterToString(value)); + return params; + } + + if (valueCollection.isEmpty()){ + return params; + } + + if (collectionFormat.equals(CollectionFormat.MULTI)) { + for (Object item : valueCollection) { + params.add(name, parameterToString(item)); + } + return params; + } + + List values = new ArrayList(); + for(Object o : valueCollection) { + values.add(parameterToString(o)); + } + params.add(name, collectionFormat.collectionToString(values)); + + return params; + } + + /** + * Check if the given {@code String} is a JSON MIME. + * @param mediaType the input MediaType + * @return boolean true if the MediaType represents JSON, false otherwise + */ + public boolean isJsonMime(String mediaType) { + // "* / *" is default to JSON + if ("*/*".equals(mediaType)) { + return true; + } + + try { + return isJsonMime(MediaType.parseMediaType(mediaType)); + } catch (InvalidMediaTypeException e) { + } + return false; + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * @param mediaType the input MediaType + * @return boolean true if the MediaType represents JSON, false otherwise + */ + public boolean isJsonMime(MediaType mediaType) { + return mediaType != null && (MediaType.APPLICATION_JSON.isCompatibleWith(mediaType) || mediaType.getSubtype().matches("^.*\\+json[;]?\\s*$")); + } + + /** + * Select the Accept header's value from the given accepts array: + * if JSON exists in the given array, use it; + * otherwise use all of them (joining into a string) + * + * @param accepts The accepts array to select from + * @return List The list of MediaTypes to use for the Accept header + */ + public List selectHeaderAccept(String[] accepts) { + if (accepts.length == 0) { + return null; + } + for (String accept : accepts) { + MediaType mediaType = MediaType.parseMediaType(accept); + if (isJsonMime(mediaType)) { + return Collections.singletonList(mediaType); + } + } + return MediaType.parseMediaTypes(StringUtils.arrayToCommaDelimitedString(accepts)); + } + + /** + * Select the Content-Type header's value from the given array: + * if JSON exists in the given array, use it; + * otherwise use the first one of the array. + * + * @param contentTypes The Content-Type array to select from + * @return MediaType The Content-Type header to use. If the given array is empty, JSON will be used. + */ + public MediaType selectHeaderContentType(String[] contentTypes) { + if (contentTypes.length == 0) { + return MediaType.APPLICATION_JSON; + } + for (String contentType : contentTypes) { + MediaType mediaType = MediaType.parseMediaType(contentType); + if (isJsonMime(mediaType)) { + return mediaType; + } + } + return MediaType.parseMediaType(contentTypes[0]); + } + + /** + * Select the body to use for the request + * @param obj the body object + * @param formParams the form parameters + * @param contentType the content type of the request + * @return Object the selected body + */ + protected Object selectBody(Object obj, MultiValueMap formParams, MediaType contentType) { + boolean isForm = MediaType.MULTIPART_FORM_DATA.isCompatibleWith(contentType) || MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(contentType); + return isForm ? formParams : obj; + } + + /** + * Expand path template with variables + * @param pathTemplate path template with placeholders + * @param variables variables to replace + * @return path with placeholders replaced by variables + */ + public String expandPath(String pathTemplate, Map variables) { + return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); + } + + /** + * Invoke API by sending HTTP request with the given options. + * + * @param the return type to use + * @param path The sub-path of the HTTP URL + * @param method The request method + * @param queryParams The query parameters + * @param body The request body object + * @param headerParams The header parameters + * @param cookieParams The cookie parameters + * @param formParams The form parameters + * @param accept The request's Accept header + * @param contentType The request's Content-Type header + * @param authNames The authentications to apply + * @param returnType The return type into which to deserialize the response + * @return ResponseEntity<T> The response of the chosen type + */ + public ResponseEntity invokeAPI(String path, HttpMethod method, MultiValueMap queryParams, Object body, HttpHeaders headerParams, MultiValueMap cookieParams, MultiValueMap formParams, List accept, MediaType contentType, String[] authNames, ParameterizedTypeReference returnType) throws RestClientException { + updateParamsForAuth(authNames, queryParams, headerParams, cookieParams); + + final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path); + if (queryParams != null) { + //encode the query parameters in case they contain unsafe characters + for (List values : queryParams.values()) { + if (values != null) { + for (int i = 0; i < values.size(); i++) { + try { + values.set(i, URLEncoder.encode(values.get(i), "utf8")); + } catch (UnsupportedEncodingException e) { + + } + } + } + } + builder.queryParams(queryParams); + } + + URI uri; + try { + uri = new URI(builder.build().toUriString()); + } catch(URISyntaxException ex) { + throw new RestClientException("Could not build URL: " + builder.toUriString(), ex); + } + + final BodyBuilder requestBuilder = RequestEntity.method(method, uri); + if(accept != null) { + requestBuilder.accept(accept.toArray(new MediaType[accept.size()])); + } + if(contentType != null) { + requestBuilder.contentType(contentType); + } + + addHeadersToRequest(headerParams, requestBuilder); + addHeadersToRequest(defaultHeaders, requestBuilder); + addCookiesToRequest(cookieParams, requestBuilder); + addCookiesToRequest(defaultCookies, requestBuilder); + + RequestEntity requestEntity = requestBuilder.body(selectBody(body, formParams, contentType)); + + ResponseEntity responseEntity = restTemplate.exchange(requestEntity, returnType); + + if (responseEntity.getStatusCode().is2xxSuccessful()) { + return responseEntity; + } else { + // The error handler built into the RestTemplate should handle 400 and 500 series errors. + throw new RestClientException("API returned " + responseEntity.getStatusCode() + " and it wasn't handled by the RestTemplate error handler"); + } + } + + /** + * Add headers to the request that is being built + * @param headers The headers to add + * @param requestBuilder The current request + */ + protected void addHeadersToRequest(HttpHeaders headers, BodyBuilder requestBuilder) { + for (Entry> entry : headers.entrySet()) { + List values = entry.getValue(); + for(String value : values) { + if (value != null) { + requestBuilder.header(entry.getKey(), value); + } + } + } + } + + /** + * Add cookies to the request that is being built + * @param cookies The cookies to add + * @param requestBuilder The current request + */ + protected void addCookiesToRequest(MultiValueMap cookies, BodyBuilder requestBuilder) { + if (!cookies.isEmpty()) { + requestBuilder.header("Cookie", buildCookieHeader(cookies)); + } + } + + /** + * Build cookie header. Keeps a single value per cookie (as per + * RFC6265 section 5.3). + * + * @param cookies map all cookies + * @return header string for cookies. + */ + private String buildCookieHeader(MultiValueMap cookies) { + final StringBuilder cookieValue = new StringBuilder(); + String delimiter = ""; + for (final Map.Entry> entry : cookies.entrySet()) { + final String value = entry.getValue().get(entry.getValue().size() - 1); + cookieValue.append(String.format("%s%s=%s", delimiter, entry.getKey(), value)); + delimiter = "; "; + } + return cookieValue.toString(); + } + + /** + * Build the RestTemplate used to make HTTP requests. + * @return RestTemplate + */ + protected RestTemplate buildRestTemplate() { + RestTemplate restTemplate = new RestTemplate(); + for(HttpMessageConverter converter:restTemplate.getMessageConverters()){ + if(converter instanceof AbstractJackson2HttpMessageConverter){ + ObjectMapper mapper = ((AbstractJackson2HttpMessageConverter)converter).getObjectMapper(); + ThreeTenModule module = new ThreeTenModule(); + module.addDeserializer(Instant.class, CustomInstantDeserializer.INSTANT); + module.addDeserializer(OffsetDateTime.class, CustomInstantDeserializer.OFFSET_DATE_TIME); + module.addDeserializer(ZonedDateTime.class, CustomInstantDeserializer.ZONED_DATE_TIME); + mapper.registerModule(module); + mapper.registerModule(new JsonNullableModule()); + } + } + // This allows us to read the response more than once - Necessary for debugging. + restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(restTemplate.getRequestFactory())); + return restTemplate; + } + + /** + * Update query and header parameters based on authentication settings. + * + * @param authNames The authentications to apply + * @param queryParams The query parameters + * @param headerParams The header parameters + */ + private void updateParamsForAuth(String[] authNames, MultiValueMap queryParams, HttpHeaders headerParams, MultiValueMap cookieParams) { + for (String authName : authNames) { + Authentication auth = authentications.get(authName); + if (auth == null) { + throw new RestClientException("Authentication undefined: " + authName); + } + auth.applyToParams(queryParams, headerParams, cookieParams); + } + } + + private class ApiClientHttpRequestInterceptor implements ClientHttpRequestInterceptor { + private final Log log = LogFactory.getLog(ApiClientHttpRequestInterceptor.class); + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + logRequest(request, body); + ClientHttpResponse response = execution.execute(request, body); + logResponse(response); + return response; + } + + private void logRequest(HttpRequest request, byte[] body) throws UnsupportedEncodingException { + log.info("URI: " + request.getURI()); + log.info("HTTP Method: " + request.getMethod()); + log.info("HTTP Headers: " + headersToString(request.getHeaders())); + log.info("Request Body: " + new String(body, StandardCharsets.UTF_8)); + } + + private void logResponse(ClientHttpResponse response) throws IOException { + log.info("HTTP Status Code: " + response.getRawStatusCode()); + log.info("Status Text: " + response.getStatusText()); + log.info("HTTP Headers: " + headersToString(response.getHeaders())); + log.info("Response Body: " + bodyToString(response.getBody())); + } + + private String headersToString(HttpHeaders headers) { + StringBuilder builder = new StringBuilder(); + for(Entry> entry : headers.entrySet()) { + builder.append(entry.getKey()).append("=["); + for(String value : entry.getValue()) { + builder.append(value).append(","); + } + builder.setLength(builder.length() - 1); // Get rid of trailing comma + builder.append("],"); + } + builder.setLength(builder.length() - 1); // Get rid of trailing comma + return builder.toString(); + } + + private String bodyToString(InputStream body) throws IOException { + StringBuilder builder = new StringBuilder(); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(body, StandardCharsets.UTF_8)); + String line = bufferedReader.readLine(); + while (line != null) { + builder.append(line).append(System.lineSeparator()); + line = bufferedReader.readLine(); + } + bufferedReader.close(); + return builder.toString(); + } + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/CustomInstantDeserializer.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/CustomInstantDeserializer.java new file mode 100644 index 0000000000..6957818fb4 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/CustomInstantDeserializer.java @@ -0,0 +1,233 @@ +package com.baeldung.petstore.client.invoker; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonTokenId; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.datatype.threetenbp.DecimalUtils; +import com.fasterxml.jackson.datatype.threetenbp.deser.ThreeTenDateTimeDeserializerBase; +import com.fasterxml.jackson.datatype.threetenbp.function.BiFunction; +import com.fasterxml.jackson.datatype.threetenbp.function.Function; + +import java.io.IOException; +import java.math.BigDecimal; + +import org.threeten.bp.DateTimeException; +import org.threeten.bp.DateTimeUtils; +import org.threeten.bp.Instant; +import org.threeten.bp.OffsetDateTime; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZonedDateTime; +import org.threeten.bp.format.DateTimeFormatter; +import org.threeten.bp.temporal.Temporal; +import org.threeten.bp.temporal.TemporalAccessor; + +/** + * Deserializer for ThreeTen temporal {@link Instant}s, {@link OffsetDateTime}, and {@link ZonedDateTime}s. + * Adapted from the jackson threetenbp InstantDeserializer to add support for deserializing rfc822 format. + * + * @author Nick Williams + */ +public class CustomInstantDeserializer + extends ThreeTenDateTimeDeserializerBase { + private static final long serialVersionUID = 1L; + + public static final CustomInstantDeserializer INSTANT = new CustomInstantDeserializer( + Instant.class, DateTimeFormatter.ISO_INSTANT, + new Function() { + @Override + public Instant apply(TemporalAccessor temporalAccessor) { + return Instant.from(temporalAccessor); + } + }, + new Function() { + @Override + public Instant apply(FromIntegerArguments a) { + return Instant.ofEpochMilli(a.value); + } + }, + new Function() { + @Override + public Instant apply(FromDecimalArguments a) { + return Instant.ofEpochSecond(a.integer, a.fraction); + } + }, + null + ); + + public static final CustomInstantDeserializer OFFSET_DATE_TIME = new CustomInstantDeserializer( + OffsetDateTime.class, DateTimeFormatter.ISO_OFFSET_DATE_TIME, + new Function() { + @Override + public OffsetDateTime apply(TemporalAccessor temporalAccessor) { + return OffsetDateTime.from(temporalAccessor); + } + }, + new Function() { + @Override + public OffsetDateTime apply(FromIntegerArguments a) { + return OffsetDateTime.ofInstant(Instant.ofEpochMilli(a.value), a.zoneId); + } + }, + new Function() { + @Override + public OffsetDateTime apply(FromDecimalArguments a) { + return OffsetDateTime.ofInstant(Instant.ofEpochSecond(a.integer, a.fraction), a.zoneId); + } + }, + new BiFunction() { + @Override + public OffsetDateTime apply(OffsetDateTime d, ZoneId z) { + return d.withOffsetSameInstant(z.getRules().getOffset(d.toLocalDateTime())); + } + } + ); + + public static final CustomInstantDeserializer ZONED_DATE_TIME = new CustomInstantDeserializer( + ZonedDateTime.class, DateTimeFormatter.ISO_ZONED_DATE_TIME, + new Function() { + @Override + public ZonedDateTime apply(TemporalAccessor temporalAccessor) { + return ZonedDateTime.from(temporalAccessor); + } + }, + new Function() { + @Override + public ZonedDateTime apply(FromIntegerArguments a) { + return ZonedDateTime.ofInstant(Instant.ofEpochMilli(a.value), a.zoneId); + } + }, + new Function() { + @Override + public ZonedDateTime apply(FromDecimalArguments a) { + return ZonedDateTime.ofInstant(Instant.ofEpochSecond(a.integer, a.fraction), a.zoneId); + } + }, + new BiFunction() { + @Override + public ZonedDateTime apply(ZonedDateTime zonedDateTime, ZoneId zoneId) { + return zonedDateTime.withZoneSameInstant(zoneId); + } + } + ); + + protected final Function fromMilliseconds; + + protected final Function fromNanoseconds; + + protected final Function parsedToValue; + + protected final BiFunction adjust; + + protected CustomInstantDeserializer(Class supportedType, + DateTimeFormatter parser, + Function parsedToValue, + Function fromMilliseconds, + Function fromNanoseconds, + BiFunction adjust) { + super(supportedType, parser); + this.parsedToValue = parsedToValue; + this.fromMilliseconds = fromMilliseconds; + this.fromNanoseconds = fromNanoseconds; + this.adjust = adjust == null ? new BiFunction() { + @Override + public T apply(T t, ZoneId zoneId) { + return t; + } + } : adjust; + } + + @SuppressWarnings("unchecked") + protected CustomInstantDeserializer(CustomInstantDeserializer base, DateTimeFormatter f) { + super((Class) base.handledType(), f); + parsedToValue = base.parsedToValue; + fromMilliseconds = base.fromMilliseconds; + fromNanoseconds = base.fromNanoseconds; + adjust = base.adjust; + } + + @Override + protected JsonDeserializer withDateFormat(DateTimeFormatter dtf) { + if (dtf == _formatter) { + return this; + } + return new CustomInstantDeserializer(this, dtf); + } + + @Override + public T deserialize(JsonParser parser, DeserializationContext context) throws IOException { + //NOTE: Timestamps contain no timezone info, and are always in configured TZ. Only + //string values have to be adjusted to the configured TZ. + switch (parser.getCurrentTokenId()) { + case JsonTokenId.ID_NUMBER_FLOAT: { + BigDecimal value = parser.getDecimalValue(); + long seconds = value.longValue(); + int nanoseconds = DecimalUtils.extractNanosecondDecimal(value, seconds); + return fromNanoseconds.apply(new FromDecimalArguments( + seconds, nanoseconds, getZone(context))); + } + + case JsonTokenId.ID_NUMBER_INT: { + long timestamp = parser.getLongValue(); + if (context.isEnabled(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS)) { + return this.fromNanoseconds.apply(new FromDecimalArguments( + timestamp, 0, this.getZone(context) + )); + } + return this.fromMilliseconds.apply(new FromIntegerArguments( + timestamp, this.getZone(context) + )); + } + + case JsonTokenId.ID_STRING: { + String string = parser.getText().trim(); + if (string.length() == 0) { + return null; + } + if (string.endsWith("+0000")) { + string = string.substring(0, string.length() - 5) + "Z"; + } + T value; + try { + TemporalAccessor acc = _formatter.parse(string); + value = parsedToValue.apply(acc); + if (context.isEnabled(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)) { + return adjust.apply(value, this.getZone(context)); + } + } catch (DateTimeException e) { + throw _peelDTE(e); + } + return value; + } + } + throw context.mappingException("Expected type float, integer, or string."); + } + + private ZoneId getZone(DeserializationContext context) { + // Instants are always in UTC, so don't waste compute cycles + return (_valueClass == Instant.class) ? null : DateTimeUtils.toZoneId(context.getTimeZone()); + } + + private static class FromIntegerArguments { + public final long value; + public final ZoneId zoneId; + + private FromIntegerArguments(long value, ZoneId zoneId) { + this.value = value; + this.zoneId = zoneId; + } + } + + private static class FromDecimalArguments { + public final long integer; + public final int fraction; + public final ZoneId zoneId; + + private FromDecimalArguments(long integer, int fraction, ZoneId zoneId) { + this.integer = integer; + this.fraction = fraction; + this.zoneId = zoneId; + } + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/RFC3339DateFormat.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/RFC3339DateFormat.java new file mode 100644 index 0000000000..46083815a6 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/RFC3339DateFormat.java @@ -0,0 +1,32 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package com.baeldung.petstore.client.invoker; + +import com.fasterxml.jackson.databind.util.ISO8601DateFormat; +import com.fasterxml.jackson.databind.util.ISO8601Utils; + +import java.text.FieldPosition; +import java.util.Date; + + +public class RFC3339DateFormat extends ISO8601DateFormat { + + // Same as ISO8601DateFormat but serializing milliseconds. + @Override + public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { + String value = ISO8601Utils.format(date, true); + toAppendTo.append(value); + return toAppendTo; + } + +} \ No newline at end of file diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/ApiKeyAuth.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/ApiKeyAuth.java new file mode 100644 index 0000000000..b494b52050 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/ApiKeyAuth.java @@ -0,0 +1,62 @@ +package com.baeldung.petstore.client.invoker.auth; + +import org.springframework.http.HttpHeaders; +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]") +public class ApiKeyAuth implements Authentication { + private final String location; + private final String paramName; + + private String apiKey; + private String apiKeyPrefix; + + public ApiKeyAuth(String location, String paramName) { + this.location = location; + this.paramName = paramName; + } + + public String getLocation() { + return location; + } + + public String getParamName() { + return paramName; + } + + public String getApiKey() { + return apiKey; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + + public String getApiKeyPrefix() { + return apiKeyPrefix; + } + + public void setApiKeyPrefix(String apiKeyPrefix) { + this.apiKeyPrefix = apiKeyPrefix; + } + + @Override + public void applyToParams(MultiValueMap queryParams, HttpHeaders headerParams, MultiValueMap cookieParams) { + if (apiKey == null) { + return; + } + String value; + if (apiKeyPrefix != null) { + value = apiKeyPrefix + " " + apiKey; + } else { + value = apiKey; + } + if (location.equals("query")) { + queryParams.add(paramName, value); + } else if (location.equals("header")) { + headerParams.add(paramName, value); + } else if (location.equals("cookie")) { + cookieParams.add(paramName, value); + } + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/Authentication.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/Authentication.java new file mode 100644 index 0000000000..8d55110d1b --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/Authentication.java @@ -0,0 +1,14 @@ +package com.baeldung.petstore.client.invoker.auth; + +import org.springframework.http.HttpHeaders; +import org.springframework.util.MultiValueMap; + +public interface Authentication { + /** + * Apply authentication settings to header and / or query parameters. + * @param queryParams The query parameters for the request + * @param headerParams The header parameters for the request + * @param cookieParams The cookie parameters for the request + */ + public void applyToParams(MultiValueMap queryParams, HttpHeaders headerParams, MultiValueMap cookieParams); +} 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 new file mode 100644 index 0000000000..4c1dad6e7c --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBasicAuth.java @@ -0,0 +1,38 @@ +package com.baeldung.petstore.client.invoker.auth; + +import java.nio.charset.StandardCharsets; + +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]") +public class HttpBasicAuth implements Authentication { + private String username; + private String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public void applyToParams(MultiValueMap queryParams, HttpHeaders headerParams, MultiValueMap cookieParams) { + if (username == null && password == null) { + return; + } + String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + headerParams.add(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString(str.getBytes(StandardCharsets.UTF_8))); + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBearerAuth.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBearerAuth.java new file mode 100644 index 0000000000..46ab6cabce --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/HttpBearerAuth.java @@ -0,0 +1,34 @@ +package com.baeldung.petstore.client.invoker.auth; + +import org.springframework.http.HttpHeaders; +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]") +public class HttpBearerAuth implements Authentication { + private final String scheme; + private String bearerToken; + + public HttpBearerAuth(String scheme) { + this.scheme = scheme; + } + + public String getBearerToken() { + return bearerToken; + } + + public void setBearerToken(String bearerToken) { + this.bearerToken = bearerToken; + } + + @Override + public void applyToParams(MultiValueMap queryParams, HttpHeaders headerParams, MultiValueMap cookieParams) { + if (bearerToken == null) { + return; + } + headerParams.add(HttpHeaders.AUTHORIZATION, (scheme != null ? upperCaseBearer(scheme) + " " : "") + bearerToken); + } + + private static String upperCaseBearer(String scheme) { + return ("bearer".equalsIgnoreCase(scheme)) ? "Bearer" : scheme; + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuth.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuth.java new file mode 100644 index 0000000000..b9e0f986ac --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuth.java @@ -0,0 +1,24 @@ +package com.baeldung.petstore.client.invoker.auth; + +import org.springframework.http.HttpHeaders; +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]") +public class OAuth implements Authentication { + private String accessToken; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + @Override + public void applyToParams(MultiValueMap queryParams, HttpHeaders headerParams, MultiValueMap cookieParams) { + if (accessToken != null) { + headerParams.add(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + } + } +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuthFlow.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuthFlow.java new file mode 100644 index 0000000000..235e0b7f55 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/invoker/auth/OAuthFlow.java @@ -0,0 +1,5 @@ +package com.baeldung.petstore.client.invoker.auth; + +public enum OAuthFlow { + accessCode, implicit, password, application +} \ No newline at end of file diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Category.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Category.java new file mode 100644 index 0000000000..2bb7ebe9f6 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Category.java @@ -0,0 +1,131 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.Objects; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Category + */ +@JsonPropertyOrder({ + Category.JSON_PROPERTY_ID, + Category.JSON_PROPERTY_NAME +}) +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +public class Category { + public static final String JSON_PROPERTY_ID = "id"; + private Long id; + + public static final String JSON_PROPERTY_NAME = "name"; + private String name; + + + public Category id(Long id) { + + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public Category name(String name) { + + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_NAME) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getName() { + return name; + } + + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(this.id, category.id) && + Objects.equals(this.name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/ModelApiResponse.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/ModelApiResponse.java new file mode 100644 index 0000000000..107e08b8b9 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/ModelApiResponse.java @@ -0,0 +1,162 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.Objects; + +import io.swagger.annotations.ApiModelProperty; + +/** + * ModelApiResponse + */ +@JsonPropertyOrder({ + ModelApiResponse.JSON_PROPERTY_CODE, + ModelApiResponse.JSON_PROPERTY_TYPE, + ModelApiResponse.JSON_PROPERTY_MESSAGE +}) +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +public class ModelApiResponse { + public static final String JSON_PROPERTY_CODE = "code"; + private Integer code; + + public static final String JSON_PROPERTY_TYPE = "type"; + private String type; + + public static final String JSON_PROPERTY_MESSAGE = "message"; + private String message; + + + public ModelApiResponse code(Integer code) { + + this.code = code; + return this; + } + + /** + * Get code + * @return code + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_CODE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Integer getCode() { + return code; + } + + + public void setCode(Integer code) { + this.code = code; + } + + + public ModelApiResponse type(String type) { + + this.type = type; + return this; + } + + /** + * Get type + * @return type + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_TYPE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getType() { + return type; + } + + + public void setType(String type) { + this.type = type; + } + + + public ModelApiResponse message(String message) { + + this.message = message; + return this; + } + + /** + * Get message + * @return message + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_MESSAGE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getMessage() { + return message; + } + + + public void setMessage(String message) { + this.message = message; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelApiResponse _apiResponse = (ModelApiResponse) o; + return Objects.equals(this.code, _apiResponse.code) && + Objects.equals(this.type, _apiResponse.type) && + Objects.equals(this.message, _apiResponse.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, type, message); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelApiResponse {\n"); + sb.append(" code: ").append(toIndentedString(code)).append("\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" message: ").append(toIndentedString(message)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Order.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Order.java new file mode 100644 index 0000000000..b041595785 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Order.java @@ -0,0 +1,296 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonValue; + +import java.util.Objects; + +import org.threeten.bp.OffsetDateTime; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Order + */ +@JsonPropertyOrder({ + Order.JSON_PROPERTY_ID, + Order.JSON_PROPERTY_PET_ID, + Order.JSON_PROPERTY_QUANTITY, + Order.JSON_PROPERTY_SHIP_DATE, + Order.JSON_PROPERTY_STATUS, + Order.JSON_PROPERTY_COMPLETE +}) +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +public class Order { + public static final String JSON_PROPERTY_ID = "id"; + private Long id; + + public static final String JSON_PROPERTY_PET_ID = "petId"; + private Long petId; + + public static final String JSON_PROPERTY_QUANTITY = "quantity"; + private Integer quantity; + + public static final String JSON_PROPERTY_SHIP_DATE = "shipDate"; + private OffsetDateTime shipDate; + + /** + * Order Status + */ + public enum StatusEnum { + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String value) { + for (StatusEnum b : StatusEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + } + + public static final String JSON_PROPERTY_STATUS = "status"; + private StatusEnum status; + + public static final String JSON_PROPERTY_COMPLETE = "complete"; + private Boolean complete; + + + public Order id(Long id) { + + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public Order petId(Long petId) { + + this.petId = petId; + return this; + } + + /** + * Get petId + * @return petId + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_PET_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Long getPetId() { + return petId; + } + + + public void setPetId(Long petId) { + this.petId = petId; + } + + + public Order quantity(Integer quantity) { + + this.quantity = quantity; + return this; + } + + /** + * Get quantity + * @return quantity + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_QUANTITY) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Integer getQuantity() { + return quantity; + } + + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + + public Order shipDate(OffsetDateTime shipDate) { + + this.shipDate = shipDate; + return this; + } + + /** + * Get shipDate + * @return shipDate + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_SHIP_DATE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public OffsetDateTime getShipDate() { + return shipDate; + } + + + public void setShipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + } + + + public Order status(StatusEnum status) { + + this.status = status; + return this; + } + + /** + * Order Status + * @return status + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "Order Status") + @JsonProperty(JSON_PROPERTY_STATUS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public StatusEnum getStatus() { + return status; + } + + + public void setStatus(StatusEnum status) { + this.status = status; + } + + + public Order complete(Boolean complete) { + + this.complete = complete; + return this; + } + + /** + * Get complete + * @return complete + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_COMPLETE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Boolean getComplete() { + return complete; + } + + + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(this.id, order.id) && + Objects.equals(this.petId, order.petId) && + Objects.equals(this.quantity, order.quantity) && + Objects.equals(this.shipDate, order.shipDate) && + Objects.equals(this.status, order.status) && + Objects.equals(this.complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Pet.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Pet.java new file mode 100644 index 0000000000..3709cd5371 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Pet.java @@ -0,0 +1,310 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonValue; + +import com.baeldung.petstore.client.model.Category; +import com.baeldung.petstore.client.model.Tag; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Pet + */ +@JsonPropertyOrder({ + Pet.JSON_PROPERTY_ID, + Pet.JSON_PROPERTY_CATEGORY, + Pet.JSON_PROPERTY_NAME, + Pet.JSON_PROPERTY_PHOTO_URLS, + Pet.JSON_PROPERTY_TAGS, + Pet.JSON_PROPERTY_STATUS +}) +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +public class Pet { + public static final String JSON_PROPERTY_ID = "id"; + private Long id; + + public static final String JSON_PROPERTY_CATEGORY = "category"; + private Category category; + + public static final String JSON_PROPERTY_NAME = "name"; + private String name; + + public static final String JSON_PROPERTY_PHOTO_URLS = "photoUrls"; + private List photoUrls = new ArrayList<>(); + + public static final String JSON_PROPERTY_TAGS = "tags"; + private List tags = null; + + /** + * pet status in the store + */ + public enum StatusEnum { + AVAILABLE("available"), + + PENDING("pending"), + + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String value) { + for (StatusEnum b : StatusEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + } + + public static final String JSON_PROPERTY_STATUS = "status"; + private StatusEnum status; + + + public Pet id(Long id) { + + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public Pet category(Category category) { + + this.category = category; + return this; + } + + /** + * Get category + * @return category + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_CATEGORY) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Category getCategory() { + return category; + } + + + public void setCategory(Category category) { + this.category = category; + } + + + public Pet name(String name) { + + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(example = "doggie", required = true, value = "") + @JsonProperty(JSON_PROPERTY_NAME) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + + public String getName() { + return name; + } + + + public void setName(String name) { + this.name = name; + } + + + public Pet photoUrls(List photoUrls) { + + this.photoUrls = photoUrls; + return this; + } + + public Pet addPhotoUrlsItem(String photoUrlsItem) { + this.photoUrls.add(photoUrlsItem); + return this; + } + + /** + * Get photoUrls + * @return photoUrls + **/ + @ApiModelProperty(required = true, value = "") + @JsonProperty(JSON_PROPERTY_PHOTO_URLS) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + + public List getPhotoUrls() { + return photoUrls; + } + + + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + + public Pet tags(List tags) { + + this.tags = tags; + return this; + } + + public Pet addTagsItem(Tag tagsItem) { + if (this.tags == null) { + this.tags = new ArrayList<>(); + } + this.tags.add(tagsItem); + return this; + } + + /** + * Get tags + * @return tags + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_TAGS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public List getTags() { + return tags; + } + + + public void setTags(List tags) { + this.tags = tags; + } + + + public Pet status(StatusEnum status) { + + this.status = status; + return this; + } + + /** + * pet status in the store + * @return status + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "pet status in the store") + @JsonProperty(JSON_PROPERTY_STATUS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public StatusEnum getStatus() { + return status; + } + + + public void setStatus(StatusEnum status) { + this.status = status; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(this.id, pet.id) && + Objects.equals(this.category, pet.category) && + Objects.equals(this.name, pet.name) && + Objects.equals(this.photoUrls, pet.photoUrls) && + Objects.equals(this.tags, pet.tags) && + Objects.equals(this.status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Tag.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Tag.java new file mode 100644 index 0000000000..7ee50c69b0 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/Tag.java @@ -0,0 +1,131 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.Objects; + +import io.swagger.annotations.ApiModelProperty; + +/** + * Tag + */ +@JsonPropertyOrder({ + Tag.JSON_PROPERTY_ID, + Tag.JSON_PROPERTY_NAME +}) +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +public class Tag { + public static final String JSON_PROPERTY_ID = "id"; + private Long id; + + public static final String JSON_PROPERTY_NAME = "name"; + private String name; + + + public Tag id(Long id) { + + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public Tag name(String name) { + + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_NAME) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getName() { + return name; + } + + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(this.id, tag.id) && + Objects.equals(this.name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/User.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/User.java new file mode 100644 index 0000000000..ba12953ed3 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/main/java/com/baeldung/petstore/client/model/User.java @@ -0,0 +1,317 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import java.util.Objects; + +import io.swagger.annotations.ApiModelProperty; + +/** + * User + */ +@JsonPropertyOrder({ + User.JSON_PROPERTY_ID, + User.JSON_PROPERTY_USERNAME, + User.JSON_PROPERTY_FIRST_NAME, + User.JSON_PROPERTY_LAST_NAME, + User.JSON_PROPERTY_EMAIL, + User.JSON_PROPERTY_PASSWORD, + User.JSON_PROPERTY_PHONE, + User.JSON_PROPERTY_USER_STATUS +}) +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2020-03-15T06:14:01.568992-05:00[America/Chicago]") +public class User { + public static final String JSON_PROPERTY_ID = "id"; + private Long id; + + public static final String JSON_PROPERTY_USERNAME = "username"; + private String username; + + public static final String JSON_PROPERTY_FIRST_NAME = "firstName"; + private String firstName; + + public static final String JSON_PROPERTY_LAST_NAME = "lastName"; + private String lastName; + + public static final String JSON_PROPERTY_EMAIL = "email"; + private String email; + + public static final String JSON_PROPERTY_PASSWORD = "password"; + private String password; + + public static final String JSON_PROPERTY_PHONE = "phone"; + private String phone; + + public static final String JSON_PROPERTY_USER_STATUS = "userStatus"; + private Integer userStatus; + + + public User id(Long id) { + + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_ID) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public User username(String username) { + + this.username = username; + return this; + } + + /** + * Get username + * @return username + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_USERNAME) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getUsername() { + return username; + } + + + public void setUsername(String username) { + this.username = username; + } + + + public User firstName(String firstName) { + + this.firstName = firstName; + return this; + } + + /** + * Get firstName + * @return firstName + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_FIRST_NAME) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getFirstName() { + return firstName; + } + + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + + public User lastName(String lastName) { + + this.lastName = lastName; + return this; + } + + /** + * Get lastName + * @return lastName + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_LAST_NAME) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getLastName() { + return lastName; + } + + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + + public User email(String email) { + + this.email = email; + return this; + } + + /** + * Get email + * @return email + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_EMAIL) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getEmail() { + return email; + } + + + public void setEmail(String email) { + this.email = email; + } + + + public User password(String password) { + + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_PASSWORD) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getPassword() { + return password; + } + + + public void setPassword(String password) { + this.password = password; + } + + + public User phone(String phone) { + + this.phone = phone; + return this; + } + + /** + * Get phone + * @return phone + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + @JsonProperty(JSON_PROPERTY_PHONE) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public String getPhone() { + return phone; + } + + + public void setPhone(String phone) { + this.phone = phone; + } + + + public User userStatus(Integer userStatus) { + + this.userStatus = userStatus; + return this; + } + + /** + * User Status + * @return userStatus + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "User Status") + @JsonProperty(JSON_PROPERTY_USER_STATUS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + + public Integer getUserStatus() { + return userStatus; + } + + + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(this.id, user.id) && + Objects.equals(this.username, user.username) && + Objects.equals(this.firstName, user.firstName) && + Objects.equals(this.lastName, user.lastName) && + Objects.equals(this.email, user.email) && + Objects.equals(this.password, user.password) && + Objects.equals(this.phone, user.phone) && + Objects.equals(this.userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/PetApiTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/PetApiTest.java new file mode 100644 index 0000000000..8854e8e3d4 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/PetApiTest.java @@ -0,0 +1,167 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.api; + +import com.baeldung.petstore.client.model.ModelApiResponse; +import com.baeldung.petstore.client.model.Pet; + +import java.io.File; +import java.util.List; + +import org.junit.Ignore; +import org.junit.Test; + +/** + * API tests for PetApi + */ +@Ignore +public class PetApiTest { + + private final PetApi api = new PetApi(); + + + /** + * Add a new pet to the store + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void addPetTest() { + Pet body = null; + api.addPet(body); + + // TODO: test validations + } + + /** + * Deletes a pet + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void deletePetTest() { + Long petId = null; + String apiKey = null; + api.deletePet(petId, apiKey); + + // TODO: test validations + } + + /** + * Finds Pets by status + * + * Multiple status values can be provided with comma separated strings + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void findPetsByStatusTest() { + List status = null; + List response = api.findPetsByStatus(status); + + // TODO: test validations + } + + /** + * Finds Pets by tags + * + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void findPetsByTagsTest() { + List tags = null; + List response = api.findPetsByTags(tags); + + // TODO: test validations + } + + /** + * Find pet by ID + * + * Returns a single pet + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void getPetByIdTest() { + Long petId = null; + Pet response = api.getPetById(petId); + + // TODO: test validations + } + + /** + * Update an existing pet + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void updatePetTest() { + Pet body = null; + api.updatePet(body); + + // TODO: test validations + } + + /** + * Updates a pet in the store with form data + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void updatePetWithFormTest() { + Long petId = null; + String name = null; + String status = null; + api.updatePetWithForm(petId, name, status); + + // TODO: test validations + } + + /** + * uploads an image + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void uploadFileTest() { + Long petId = null; + String additionalMetadata = null; + File file = null; + ModelApiResponse response = api.uploadFile(petId, additionalMetadata, file); + + // TODO: test validations + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/StoreApiTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/StoreApiTest.java new file mode 100644 index 0000000000..444429bd42 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/StoreApiTest.java @@ -0,0 +1,95 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.api; + +import com.baeldung.petstore.client.model.Order; + +import java.util.Map; + +import org.junit.Ignore; +import org.junit.Test; + +/** + * API tests for StoreApi + */ +@Ignore +public class StoreApiTest { + + private final StoreApi api = new StoreApi(); + + + /** + * Delete purchase order by ID + * + * For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void deleteOrderTest() { + Long orderId = null; + api.deleteOrder(orderId); + + // TODO: test validations + } + + /** + * Returns pet inventories by status + * + * Returns a map of status codes to quantities + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void getInventoryTest() { + Map response = api.getInventory(); + + // TODO: test validations + } + + /** + * Find purchase order by ID + * + * For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void getOrderByIdTest() { + Long orderId = null; + Order response = api.getOrderById(orderId); + + // TODO: test validations + } + + /** + * Place an order for a pet + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void placeOrderTest() { + Order body = null; + Order response = api.placeOrder(body); + + // TODO: test validations + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/UserApiTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/UserApiTest.java new file mode 100644 index 0000000000..c73b47ecb2 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/api/UserApiTest.java @@ -0,0 +1,161 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.api; + +import com.baeldung.petstore.client.model.User; + +import java.util.List; + +import org.junit.Ignore; +import org.junit.Test; + +/** + * API tests for UserApi + */ +@Ignore +public class UserApiTest { + + private final UserApi api = new UserApi(); + + + /** + * Create user + * + * This can only be done by the logged in user. + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void createUserTest() { + User body = null; + api.createUser(body); + + // TODO: test validations + } + + /** + * Creates list of users with given input array + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void createUsersWithArrayInputTest() { + List body = null; + api.createUsersWithArrayInput(body); + + // TODO: test validations + } + + /** + * Creates list of users with given input array + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void createUsersWithListInputTest() { + List body = null; + api.createUsersWithListInput(body); + + // TODO: test validations + } + + /** + * Delete user + * + * This can only be done by the logged in user. + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void deleteUserTest() { + String username = null; + api.deleteUser(username); + + // TODO: test validations + } + + /** + * Get user by user name + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void getUserByNameTest() { + String username = null; + User response = api.getUserByName(username); + + // TODO: test validations + } + + /** + * Logs user into the system + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void loginUserTest() { + String username = null; + String password = null; + String response = api.loginUser(username, password); + + // TODO: test validations + } + + /** + * Logs out current logged in user session + * + * + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void logoutUserTest() { + api.logoutUser(); + + // TODO: test validations + } + + /** + * Updated user + * + * This can only be done by the logged in user. + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void updateUserTest() { + String username = null; + User body = null; + api.updateUser(username, body); + + // TODO: test validations + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/CategoryTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/CategoryTest.java new file mode 100644 index 0000000000..7be1b285c3 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/CategoryTest.java @@ -0,0 +1,49 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import org.junit.Test; + + +/** + * Model tests for Category + */ +public class CategoryTest { + private final Category model = new Category(); + + /** + * Model tests for Category + */ + @Test + public void testCategory() { + // TODO: test Category + } + + /** + * Test the property 'id' + */ + @Test + public void idTest() { + // TODO: test id + } + + /** + * Test the property 'name' + */ + @Test + public void nameTest() { + // TODO: test name + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/ModelApiResponseTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/ModelApiResponseTest.java new file mode 100644 index 0000000000..55f742f862 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/ModelApiResponseTest.java @@ -0,0 +1,57 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import org.junit.Test; + + +/** + * Model tests for ModelApiResponse + */ +public class ModelApiResponseTest { + private final ModelApiResponse model = new ModelApiResponse(); + + /** + * Model tests for ModelApiResponse + */ + @Test + public void testModelApiResponse() { + // TODO: test ModelApiResponse + } + + /** + * Test the property 'code' + */ + @Test + public void codeTest() { + // TODO: test code + } + + /** + * Test the property 'type' + */ + @Test + public void typeTest() { + // TODO: test type + } + + /** + * Test the property 'message' + */ + @Test + public void messageTest() { + // TODO: test message + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/OrderTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/OrderTest.java new file mode 100644 index 0000000000..edbacea028 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/OrderTest.java @@ -0,0 +1,81 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import org.junit.Test; + + +/** + * Model tests for Order + */ +public class OrderTest { + private final Order model = new Order(); + + /** + * Model tests for Order + */ + @Test + public void testOrder() { + // TODO: test Order + } + + /** + * Test the property 'id' + */ + @Test + public void idTest() { + // TODO: test id + } + + /** + * Test the property 'petId' + */ + @Test + public void petIdTest() { + // TODO: test petId + } + + /** + * Test the property 'quantity' + */ + @Test + public void quantityTest() { + // TODO: test quantity + } + + /** + * Test the property 'shipDate' + */ + @Test + public void shipDateTest() { + // TODO: test shipDate + } + + /** + * Test the property 'status' + */ + @Test + public void statusTest() { + // TODO: test status + } + + /** + * Test the property 'complete' + */ + @Test + public void completeTest() { + // TODO: test complete + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/PetTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/PetTest.java new file mode 100644 index 0000000000..78951acaba --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/PetTest.java @@ -0,0 +1,81 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import org.junit.Test; + + +/** + * Model tests for Pet + */ +public class PetTest { + private final Pet model = new Pet(); + + /** + * Model tests for Pet + */ + @Test + public void testPet() { + // TODO: test Pet + } + + /** + * Test the property 'id' + */ + @Test + public void idTest() { + // TODO: test id + } + + /** + * Test the property 'category' + */ + @Test + public void categoryTest() { + // TODO: test category + } + + /** + * Test the property 'name' + */ + @Test + public void nameTest() { + // TODO: test name + } + + /** + * Test the property 'photoUrls' + */ + @Test + public void photoUrlsTest() { + // TODO: test photoUrls + } + + /** + * Test the property 'tags' + */ + @Test + public void tagsTest() { + // TODO: test tags + } + + /** + * Test the property 'status' + */ + @Test + public void statusTest() { + // TODO: test status + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/TagTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/TagTest.java new file mode 100644 index 0000000000..16efed2570 --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/TagTest.java @@ -0,0 +1,49 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import org.junit.Test; + + +/** + * Model tests for Tag + */ +public class TagTest { + private final Tag model = new Tag(); + + /** + * Model tests for Tag + */ + @Test + public void testTag() { + // TODO: test Tag + } + + /** + * Test the property 'id' + */ + @Test + public void idTest() { + // TODO: test id + } + + /** + * Test the property 'name' + */ + @Test + public void nameTest() { + // TODO: test name + } + +} diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/UserTest.java b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/UserTest.java new file mode 100644 index 0000000000..d84cfb21ca --- /dev/null +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/src/test/java/com/baeldung/petstore/client/model/UserTest.java @@ -0,0 +1,97 @@ +/* + * Swagger Petstore + * This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.3 + * Contact: apiteam@swagger.io + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.baeldung.petstore.client.model; + +import org.junit.Test; + + +/** + * Model tests for User + */ +public class UserTest { + private final User model = new User(); + + /** + * Model tests for User + */ + @Test + public void testUser() { + // TODO: test User + } + + /** + * Test the property 'id' + */ + @Test + public void idTest() { + // TODO: test id + } + + /** + * Test the property 'username' + */ + @Test + public void usernameTest() { + // TODO: test username + } + + /** + * Test the property 'firstName' + */ + @Test + public void firstNameTest() { + // TODO: test firstName + } + + /** + * Test the property 'lastName' + */ + @Test + public void lastNameTest() { + // TODO: test lastName + } + + /** + * Test the property 'email' + */ + @Test + public void emailTest() { + // TODO: test email + } + + /** + * Test the property 'password' + */ + @Test + public void passwordTest() { + // TODO: test password + } + + /** + * Test the property 'phone' + */ + @Test + public void phoneTest() { + // TODO: test phone + } + + /** + * Test the property 'userStatus' + */ + @Test + public void userStatusTest() { + // TODO: test userStatus + } + +} From 0a48cad1c3a034ad1a48e811649148f4670d8f0c Mon Sep 17 00:00:00 2001 From: pazis Date: Mon, 23 Mar 2020 02:05:05 +0000 Subject: [PATCH 186/530] BAEL-3881 --- algorithms-miscellaneous-6/pom.xml | 15 +++++++++ .../gradientdescent/GradientDescent.java | 33 +++++++++++++++++++ .../GradientDescentUnitTest.java | 20 +++++++++++ pom.xml | 2 ++ 4 files changed, 70 insertions(+) create mode 100644 algorithms-miscellaneous-6/pom.xml create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java create mode 100644 algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java diff --git a/algorithms-miscellaneous-6/pom.xml b/algorithms-miscellaneous-6/pom.xml new file mode 100644 index 0000000000..5daa000ea3 --- /dev/null +++ b/algorithms-miscellaneous-6/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + algorithms-miscellaneous-6 + 0.0.1-SNAPSHOT + algorithms-miscellaneous-6 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java new file mode 100644 index 0000000000..c5db3a4a06 --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/gradientdescent/GradientDescent.java @@ -0,0 +1,33 @@ +package com.baeldung.algorithms.gradientdescent; + +import java.util.function.Function; + +public class GradientDescent { + + private final double precision = 0.000001; + + public double findLocalMinimum(Function f, double initialX) { + double stepCoefficient = 0.1; + double previousStep = 1.0; + double currentX = initialX; + double previousX = initialX; + double previousY = f.apply(previousX); + int iter = 100; + + currentX += stepCoefficient * previousY; + + while (previousStep > precision && iter > 0) { + iter--; + double currentY = f.apply(currentX); + if (currentY > previousY) { + stepCoefficient = -stepCoefficient / 2; + } + previousX = currentX; + currentX += stepCoefficient * previousY; + previousY = currentY; + previousStep = StrictMath.abs(currentX - previousX); + } + return currentX; + } + +} diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java new file mode 100644 index 0000000000..34d3e188f2 --- /dev/null +++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.gradientdescent; + +import static org.junit.Assert.assertTrue; + +import java.util.function.Function; + +import org.junit.Test; + +public class GradientDescentUnitTest { + + @Test + public void givenFunction_whenStartingPointIsOne_thenLocalMinimumIsFound() { + Function df = x -> + StrictMath.abs(StrictMath.pow(x, 3)) - (3 * StrictMath.pow(x, 2)) + x; + GradientDescent gd = new GradientDescent(); + double res = gd.findLocalMinimum(df, 1); + assertTrue(res > 1.78); + assertTrue(res < 1.84); + } +} diff --git a/pom.xml b/pom.xml index 15331d8c95..45bdf9747e 100644 --- a/pom.xml +++ b/pom.xml @@ -342,6 +342,7 @@ algorithms-miscellaneous-3 algorithms-miscellaneous-4 algorithms-miscellaneous-5 + algorithms-miscellaneous-6 algorithms-searching algorithms-sorting algorithms-sorting-2 @@ -853,6 +854,7 @@ algorithms-miscellaneous-3 algorithms-miscellaneous-4 algorithms-miscellaneous-5 + algorithms-miscellaneous-6 algorithms-searching algorithms-sorting algorithms-sorting-2 From 9ead49e028f7db5fd5b8bce659c378c9fd5d08e5 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:07:01 +0800 Subject: [PATCH 187/530] Update README.md --- core-java-modules/core-java-9/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md index bfd426b9c1..2dbf159750 100644 --- a/core-java-modules/core-java-9/README.md +++ b/core-java-modules/core-java-9/README.md @@ -10,6 +10,3 @@ This module contains articles about Java 9 core features - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) - [Immutable Set in Java](https://www.baeldung.com/java-immutable-set) - [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list) - -Note: also contains part of the code for the article -[How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering). From d90933973e6f6c12ab110033b42370c344e68890 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:18:10 +0800 Subject: [PATCH 188/530] Update README.md --- core-java-modules/core-java-arrays/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 42fe3f83a1..9d9db9ab81 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -10,7 +10,6 @@ This module contains articles about Java arrays - [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) -- [Read and Write User Input in Java](https://www.baeldung.com/java-console-input-output) - [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array) - [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) - [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) From cbf3815f0969390902a352331da268d45b46e16c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:22:55 +0800 Subject: [PATCH 189/530] Update README.md --- spring-security-modules/spring-security-rest/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-security-modules/spring-security-rest/README.md b/spring-security-modules/spring-security-rest/README.md index f7e91b85dc..26c101d32c 100644 --- a/spring-security-modules/spring-security-rest/README.md +++ b/spring-security-modules/spring-security-rest/README.md @@ -8,12 +8,11 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring REST Service Security](https://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/) + - [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) - [Custom Error Message Handling for REST API](https://www.baeldung.com/global-error-handler-in-a-spring-rest-api) - [Spring Security Context Propagation with @Async](https://www.baeldung.com/spring-security-async-principal-propagation) - [Servlet 3 Async Support with Spring MVC and Spring Security](https://www.baeldung.com/spring-mvc-async-security) - [Intro to Spring Security Expressions](https://www.baeldung.com/spring-security-expressions) -- [Spring Security for a REST API](https://www.baeldung.com/securing-a-restful-web-service-with-spring-security) - [Spring Security Expressions - hasRole Example](https://www.baeldung.com/spring-security-expressions-basic) - [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring) From 54a4a3655ef2e949dd18142dbd47ad6413b421e4 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:29:09 +0800 Subject: [PATCH 190/530] Delete README.md --- .../spring-boot-runtime/disabling-console-log4j2/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/README.md diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/README.md b/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/README.md deleted file mode 100644 index 554f051b41..0000000000 --- a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) From 2a65df46dbf696094ff5e099b1d9ddcb0932f5df Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:32:12 +0800 Subject: [PATCH 191/530] Update README.md --- testing-modules/junit5-migration/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/junit5-migration/README.md b/testing-modules/junit5-migration/README.md index 84e540b466..5cc9db8bd3 100644 --- a/testing-modules/junit5-migration/README.md +++ b/testing-modules/junit5-migration/README.md @@ -5,6 +5,6 @@ This module contains articles about migrating to JUnit 5. The code for the JUnit 4 - JUnit 5 E-book is in `com.baeldung.junit4` and `com.baeldung.junit5`. ### Relevant Articles: -- [JUnit 5 Migration](https://www.baeldung.com/junit-5-migration) + - [A Quick JUnit vs TestNG Comparison](https://www.baeldung.com/junit-vs-testng) - [Assertions in JUnit 4 and JUnit 5](https://www.baeldung.com/junit-assertions) From 9240a08f5a3df45942d640a5381008d331fb0327 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:37:23 +0800 Subject: [PATCH 192/530] Delete README.md --- .../spring-boot-runtime/disabling-console-jul/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-runtime/disabling-console-jul/README.md diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/README.md b/spring-boot-modules/spring-boot-runtime/disabling-console-jul/README.md deleted file mode 100644 index 554f051b41..0000000000 --- a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) From 825fd077970bac4924fd7797ba4425d92aae2360 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:42:04 +0800 Subject: [PATCH 193/530] Update README.md --- java-numbers/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/java-numbers/README.md b/java-numbers/README.md index eee6fceab1..8f53006b38 100644 --- a/java-numbers/README.md +++ b/java-numbers/README.md @@ -8,7 +8,6 @@ This module contains articles about numbers in Java. - [BigDecimal and BigInteger in Java](http://www.baeldung.com/java-bigdecimal-biginteger) - [Find All Pairs of Numbers in an Array That Add Up to a Given Sum](http://www.baeldung.com/java-algorithm-number-pairs-sum) - [Java – Random Long, Float, Integer and Double](http://www.baeldung.com/java-generate-random-long-float-integer-double) -- [Using Math.sin with Degrees](https://www.baeldung.com/java-math-sin-degrees) - [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) - [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) From eac4d6a71548399ac89810143ec849ab9055e181 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:44:34 +0800 Subject: [PATCH 194/530] Update README.md --- core-java-modules/core-java-lang-syntax/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md index bef03b98ad..ae0958e961 100644 --- a/core-java-modules/core-java-lang-syntax/README.md +++ b/core-java-modules/core-java-lang-syntax/README.md @@ -5,7 +5,6 @@ This module contains articles about Java syntax ### Relevant Articles: - [The Basics of Java Generics](https://www.baeldung.com/java-generics) - [Java Primitive Conversions](https://www.baeldung.com/java-primitive-conversions) -- [The Java continue and break Keywords](https://www.baeldung.com/java-continue-and-break) - [A Guide to Creating Objects in Java](https://www.baeldung.com/java-initialization) - [A Guide to Java Loops](https://www.baeldung.com/java-loops) - [Varargs in Java](https://www.baeldung.com/java-varargs) From 11f23a2f6b7ac2c75402fe8c203f46d138dac166 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:45:49 +0800 Subject: [PATCH 195/530] Update README.md --- core-java-modules/core-java-lang-syntax/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md index ae0958e961..f28a675258 100644 --- a/core-java-modules/core-java-lang-syntax/README.md +++ b/core-java-modules/core-java-lang-syntax/README.md @@ -8,7 +8,6 @@ This module contains articles about Java syntax - [A Guide to Creating Objects in Java](https://www.baeldung.com/java-initialization) - [A Guide to Java Loops](https://www.baeldung.com/java-loops) - [Varargs in Java](https://www.baeldung.com/java-varargs) -- [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums) - [Infinite Loops in Java](https://www.baeldung.com/infinite-loops-java) - [Java Switch Statement](https://www.baeldung.com/java-switch) - [Breaking Out of Nested Loops](https://www.baeldung.com/java-breaking-out-nested-loop) From 6f89368718e8a203566081251831de8ced9c4f68 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:46:45 +0800 Subject: [PATCH 196/530] Update README.md --- core-java-modules/core-java-lang-syntax/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md index f28a675258..f74fa1b546 100644 --- a/core-java-modules/core-java-lang-syntax/README.md +++ b/core-java-modules/core-java-lang-syntax/README.md @@ -8,7 +8,6 @@ This module contains articles about Java syntax - [A Guide to Creating Objects in Java](https://www.baeldung.com/java-initialization) - [A Guide to Java Loops](https://www.baeldung.com/java-loops) - [Varargs in Java](https://www.baeldung.com/java-varargs) -- [Infinite Loops in Java](https://www.baeldung.com/infinite-loops-java) - [Java Switch Statement](https://www.baeldung.com/java-switch) - [Breaking Out of Nested Loops](https://www.baeldung.com/java-breaking-out-nested-loop) - [Java Do-While Loop](https://www.baeldung.com/java-do-while-loop) From 4084fbf62646d33e60215bbb7cb4d6856006f456 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:48:05 +0800 Subject: [PATCH 197/530] Delete README.md --- bazel/bazelgreeting/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 bazel/bazelgreeting/README.md diff --git a/bazel/bazelgreeting/README.md b/bazel/bazelgreeting/README.md deleted file mode 100644 index 528f797c21..0000000000 --- a/bazel/bazelgreeting/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool) From df6fd3681d43035c71abefdfbfa2acdfaaa25806 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:50:03 +0800 Subject: [PATCH 198/530] Update README.md --- testing-modules/mockito-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index d7069949e4..8cd2869524 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -3,6 +3,5 @@ - [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8) - [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) - [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) -- [Quick Guide to BDDMockito](https://www.baeldung.com/bdd-mockito) - [Mockito – Using Spies](https://www.baeldung.com/mockito-spy) - [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis) From 4cb7ca6472dbc9a5075c3bb1ad257c6498d23a4a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:50:53 +0800 Subject: [PATCH 199/530] Update README.md --- testing-modules/mockito-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index 8cd2869524..064366dfd5 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -3,5 +3,4 @@ - [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8) - [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) - [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) -- [Mockito – Using Spies](https://www.baeldung.com/mockito-spy) - [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis) From 89b01e2908f5671d3da370ef912d00481cb8b052 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:53:56 +0800 Subject: [PATCH 200/530] Update README.md --- spring-boot-modules/spring-boot-custom-starter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-custom-starter/README.md b/spring-boot-modules/spring-boot-custom-starter/README.md index d74dc222d5..667be7ca40 100644 --- a/spring-boot-modules/spring-boot-custom-starter/README.md +++ b/spring-boot-modules/spring-boot-custom-starter/README.md @@ -1,6 +1,6 @@ ## Spring Boot Custom Starter -This module contains articles about writing [Spring Boot Starters](https://www.baeldung.com/spring-boot-starters). +This module contains articles about writing Spring Boot Starters. ### Relevant Articles: - [Creating a Custom Starter with Spring Boot](https://www.baeldung.com/spring-boot-custom-starter) From b7a00cb1270db6c2c820966bacadae6370358af1 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:55:39 +0800 Subject: [PATCH 201/530] Update README.md --- core-java-modules/core-java-lang-oop-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index 035d464c50..c48a3f5cd9 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -12,7 +12,6 @@ This module contains articles about Object-oriented programming (OOP) in Java - [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition) - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) -- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association) - [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods) - [Java Copy Constructor](https://www.baeldung.com/java-copy-constructor) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) From 53098cb731ea0d3abcfd9ee65ac7d08ad942140f Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:57:01 +0800 Subject: [PATCH 202/530] Update README.md --- spring-all/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-all/README.md b/spring-all/README.md index d71b8569cf..9ad78aa1ee 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -1,7 +1,3 @@ ## Spring All This module contains articles about Spring - -### Relevant Articles: - -- [The @Scheduled Annotation in Spring](https://www.baeldung.com/spring-scheduled-tasks) From 102d8ee3a3a87dc259282697e99b81b8ee319be1 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:58:04 +0800 Subject: [PATCH 203/530] Delete README.md --- .../data-jpa-application/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/README.md diff --git a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/README.md b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/README.md deleted file mode 100644 index 443ec07183..0000000000 --- a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles - -- [Unable to Find @SpringBootConfiguration with @DataJpaTest](https://www.baeldung.com/spring-boot-unable-to-find-springbootconfiguration-with-datajpatest) From 27f4e9032f60773403d8f4256ead87f7e3e6cf44 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:59:48 +0800 Subject: [PATCH 204/530] Update README.md --- java-math-2/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/java-math-2/README.md b/java-math-2/README.md index ca809e8623..7c459cc576 100644 --- a/java-math-2/README.md +++ b/java-math-2/README.md @@ -1,8 +1,3 @@ ## Java Math This module contains articles about math in Java. - -### Relevant articles: - -- [Basic Calculator in Java](https://www.baeldung.com/basic-calculator-in-java) -- More articles: [[<-- prev]](/../java-math) From f0373c1fbb5c17bf0d431389db24b8a6f4491da2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 19:01:02 +0800 Subject: [PATCH 205/530] Delete README.md --- .../spring-boot-config-jpa-error/data-jpa-library/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/README.md diff --git a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/README.md b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/README.md deleted file mode 100644 index 4e852f8a90..0000000000 --- a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Unable to Find @SpringBootConfiguration with @DataJpaTest](https://www.baeldung.com/spring-boot-unable-to-find-springbootconfiguration-with-datajpatest) From f145d644c9d787a1a4b90c467b73383e818a230c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Mon, 23 Mar 2020 19:04:46 +0800 Subject: [PATCH 206/530] Update README.md --- .../spring-security-sso/spring-security-sso-kerberos/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/README.md b/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/README.md index 0227d9ac70..3aa092edb8 100644 --- a/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/README.md +++ b/spring-security-modules/spring-security-sso/spring-security-sso-kerberos/README.md @@ -1,4 +1,3 @@ ## Relevant articles: -- [Introduction to SPNEGO/Kerberos Authentication in Spring](https://www.baeldung.com/spring-security-kerberos) - [Spring Security Kerberos Integration](https://www.baeldung.com/spring-security-kerberos-integration) From abd46c4349f07b36e279b7fa6fa310ac1ea52a17 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Mon, 23 Mar 2020 19:58:34 +0530 Subject: [PATCH 207/530] fix integration test cases (#8727) * fix integration test cases * fix integration test cases * used dynamic port in the integration test cases --- spring-5-reactive-client/pom.xml | 4 +- .../reactive/ReactiveIntegrationTest.java | 48 +++++++++++++++---- .../simultaneous/ClientIntegrationTest.java | 9 ++-- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index e3c41f8b84..cc728398f3 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -92,8 +92,8 @@ com.github.tomakehurst - wiremock - 2.24.1 + wiremock-standalone + 2.26.0 test diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java index 394ff42e5f..1d2197a381 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java @@ -1,37 +1,67 @@ package com.baeldung.reactive; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.WebClient; import com.baeldung.reactive.model.Foo; +import com.github.tomakehurst.wiremock.WireMockServer; import reactor.core.publisher.Mono; +@RunWith(SpringRunner.class) @SpringBootTest public class ReactiveIntegrationTest { private WebClient client; - - @BeforeEach - public void before() { - client = WebClient.create("http://localhost:8080"); + private int singleRequestTime = 1000; + private WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); + client = WebClient.create("http://localhost:" + wireMockServer.port()); } - // + @After + public void tearDown() { + wireMockServer.stop(); + } @Test public void whenMonoReactiveEndpointIsConsumed_thenCorrectOutput() { - final Mono fooMono = client.get().uri("/foos/123").exchange().log(); + stubFor(get(urlEqualTo("/foo/123")).willReturn(aResponse().withFixedDelay(singleRequestTime) + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("{\"id\":123, \"name\":\"foo\"}"))); + + final Mono fooMono = client.get().uri("/foo/123").exchange().log(); System.out.println(fooMono.subscribe()); } @Test public void whenFluxReactiveEndpointIsConsumed_thenCorrectOutput() throws InterruptedException { - client.get().uri("/foos") + stubFor(get(urlEqualTo("/foo")).willReturn(aResponse().withFixedDelay(singleRequestTime) + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("{\"id\":1, \"name\":\"foo\"}"))); + + client.get().uri("/foo") .retrieve() .bodyToFlux(Foo.class).log() .subscribe(System.out::println); diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java index d74a64d9c9..43454daf17 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.After; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.WireMockServer; @@ -19,15 +20,19 @@ import static org.junit.Assert.assertEquals; @RunWith(SpringRunner.class) @SpringBootTest +@DirtiesContext public class ClientIntegrationTest { private WireMockServer wireMockServer; + private Client client; + @Before public void setup() { - wireMockServer = new WireMockServer(wireMockConfig().port(8089)); + wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()); wireMockServer.start(); configureFor("localhost", wireMockServer.port()); + client = new Client("http://localhost:" + wireMockServer.port()); } @After @@ -52,8 +57,6 @@ public class ClientIntegrationTest { .boxed() .collect(Collectors.toList()); - Client client = new Client("http://localhost:8089"); - // Act long start = System.currentTimeMillis(); List users = client.fetchUsers(userIds) From 1062b4fef65b2d6d54b724c4f46f0b8c36b69b6f Mon Sep 17 00:00:00 2001 From: Karsten Silz <1061209+ksilz@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:17:16 +0000 Subject: [PATCH 208/530] BAEL-3911 (#8939) * Initial version of the code. * Addressed PR comment. --- .../dayofweek/DayOfWeekExtractor.java | 35 +++++++++++++ .../dayofweek/DayOfWeekExtractorUnitTest.java | 52 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractor.java create mode 100644 core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractorUnitTest.java diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractor.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractor.java new file mode 100644 index 0000000000..b027790e35 --- /dev/null +++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractor.java @@ -0,0 +1,35 @@ +package com.baeldung.datetime.dayofweek; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.format.TextStyle; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; + +public class DayOfWeekExtractor { + + public static int getDayNumberOld(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.DAY_OF_WEEK); + } + + public static String getDayStringOld(Date date, Locale locale ) { + DateFormat formatter = new SimpleDateFormat("EEEE", locale); + return formatter.format(date); + } + + public static int getDayNumberNew(LocalDate date) { + DayOfWeek day = date.getDayOfWeek(); + return day.getValue(); + } + + public static String getDayStringNew(LocalDate date, Locale locale ) { + DayOfWeek day = date.getDayOfWeek(); + return day.getDisplayName(TextStyle.FULL, locale); + } + +} diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractorUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractorUnitTest.java new file mode 100644 index 0000000000..0dfd50dca2 --- /dev/null +++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/dayofweek/DayOfWeekExtractorUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.datetime.dayofweek; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Locale; + +import org.junit.Test; + +public class DayOfWeekExtractorUnitTest { + + private DateFormat oldDateParser = new SimpleDateFormat("yyyy-MM-dd"); + + @Test + public void givenFeb29_2020_thenOldSaturdayNumber() throws ParseException { + assertThat(DayOfWeekExtractor.getDayNumberOld(oldDateParser.parse("2020-02-29")) == Calendar.SATURDAY); + } + + @Test + public void givenFeb29_2020_and_localeUS_thenOldSaturdayText() throws ParseException { + assertThat("Saturday".equals(DayOfWeekExtractor.getDayStringOld(oldDateParser.parse("2020-02-29"), Locale.US)) ); + } + + @Test + public void givenFeb29_2020_and_localeDE_thenOldSaturdayText() throws ParseException { + assertThat("Samstag".equals(DayOfWeekExtractor.getDayStringOld(oldDateParser.parse("2020-02-29"), Locale.GERMANY)) ); + } + + @Test + public void givenFeb29_2020_thenNewSaturdayNumber() throws ParseException { + assertThat(DayOfWeekExtractor.getDayNumberNew(LocalDate.parse("2020-02-29")) == Calendar.SATURDAY); + } + + @Test + public void givenFeb29_2020_and_localeUS_thenNewSaturdayText() throws ParseException { + assertThat("Saturday".equals(DayOfWeekExtractor.getDayStringOld(oldDateParser.parse("2020-02-29"), Locale.US)) ); + } + + @Test + public void givenFeb29_2020_and_localeDE_thenNewSaturdayText() throws ParseException { + assertThat("Samstag".equals(DayOfWeekExtractor.getDayStringOld(oldDateParser.parse("2020-02-29"), Locale.GERMANY)) ); + } + + +} + + + From 060557608c8a11bdb31e707eedc41e91b2cf9af6 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Tue, 24 Mar 2020 08:37:48 +0530 Subject: [PATCH 209/530] BAEL-3883: Boruvka's minimum spanning tree, moved code to newer module (#8949) algorithms-miscellaneous-6 --- algorithms-miscellaneous-5/pom.xml | 6 -- .../algorithms/boruvka/BoruvkaMST.java | 61 -------------- .../algorithms/boruvka/DisjointSet.java | 49 ----------- .../com/baeldung/algorithms/boruvka/Edge.java | 40 --------- .../baeldung/algorithms/boruvka/Graph.java | 64 -------------- .../baeldung/algorithms/boruvka/Input.java | 65 -------------- .../com/baeldung/algorithms/boruvka/Tree.java | 63 -------------- .../algorithms/boruvka/BoruvkaUnitTest.java | 48 ----------- algorithms-miscellaneous-6/pom.xml | 12 +++ .../algorithms/boruvka/BoruvkaMST.java | 84 +++++++++++++++++++ .../algorithms/boruvka/UnionFind.java | 39 +++++++++ .../algorithms/boruvka/BoruvkaUnitTest.java | 37 ++++++++ 12 files changed, 172 insertions(+), 396 deletions(-) delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/DisjointSet.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Edge.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Graph.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Input.java delete mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Tree.java delete mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java create mode 100644 algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml index f2db71a6da..4131e1791d 100644 --- a/algorithms-miscellaneous-5/pom.xml +++ b/algorithms-miscellaneous-5/pom.xml @@ -41,11 +41,6 @@ guava ${guava.version} - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - org.junit.platform junit-platform-commons @@ -78,7 +73,6 @@ 1.11 3.6.1 28.1-jre - 2.10.2 1.6.0 diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java deleted file mode 100644 index 0f8bc5b296..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung.algorithms.boruvka; - -public class BoruvkaMST { - - private static Tree mst = new Tree(); - private static int totalWeight; - - public BoruvkaMST(Graph graph) { - DisjointSet dSet = new DisjointSet(graph.getNodes()); - - // repeat at most log N times or until we have N-1 edges - for (int t = 1; t < graph.getNodes() && mst.getEdgeCount() < graph.getNodes() - 1; t = t + t) { - - // foreach tree in forest, find closest edge - Edge[] closestEdgeArray = new Edge[graph.getNodes()]; - for (Edge edge : graph.getAllEdges()) { - int first = edge.getFirst(); - int second = edge.getSecond(); - int firstParent = dSet.getParent(first); - int secondParent = dSet.getParent(second); - if (firstParent == secondParent) { - continue; // same tree - } - if (closestEdgeArray[firstParent] == null || edge.getWeight() < closestEdgeArray[firstParent].getWeight()) { - closestEdgeArray[firstParent] = edge; - } - if (closestEdgeArray[secondParent] == null || edge.getWeight() < closestEdgeArray[secondParent].getWeight()) { - closestEdgeArray[secondParent] = edge; - } - } - - // add newly discovered edges to MST - for (int i = 0; i < graph.getNodes(); i++) { - Edge edge = closestEdgeArray[i]; - if (edge != null) { - int first = edge.getFirst(); - int second = edge.getSecond(); - // don't add the same edge twice - if (dSet.getParent(first) != dSet.getParent(second)) { - mst.addEdge(edge); - totalWeight += edge.getWeight(); - dSet.union(first, second); - } - } - } - } - } - - public Iterable getMST() { - return mst; - } - - public int getTotalWeight() { - return totalWeight; - } - - public String toString() { - return "MST: " + mst.toString() + " | Total Weight: " + totalWeight; - } - -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/DisjointSet.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/DisjointSet.java deleted file mode 100644 index 7769686e36..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/DisjointSet.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.algorithms.boruvka; - -import java.util.Arrays; - -public class DisjointSet { - - private int[] nodeParents; - private int[] nodeRanks; - - public DisjointSet(int n) { - nodeParents = new int[n]; - nodeRanks = new int[n]; - for (int i = 0; i < n; i++) { - nodeParents[i] = i; - nodeRanks[i] = 0; - } - } - - public int getParent(int node) { - while (node != nodeParents[node]) { - node = nodeParents[node]; - } - return node; - } - - public void union(int node1, int node2) { - int node1Parent = getParent(node1); - int node2Parent = getParent(node2); - if (node1Parent == node2Parent) { - return; - } - - if (nodeRanks[node1Parent] < nodeRanks[node2Parent]) { - nodeParents[node1Parent] = node2Parent; - } - else if (nodeRanks[node1Parent] > nodeRanks[node2Parent]) { - nodeParents[node2Parent] = node1Parent; - } - else { - nodeParents[node2Parent] = node1Parent; - nodeRanks[node1Parent]++; - } - } - - public String toString() { - return "Parent: " + Arrays.toString(nodeParents) + "Rank: " + Arrays.toString(nodeRanks); - } - -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Edge.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Edge.java deleted file mode 100644 index 6ee136fc48..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Edge.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.algorithms.boruvka; - -public class Edge { - - private final int first; - private final int second; - private final int weight; - - public Edge(int first, int second, int weight) { - this.first = first; - this.second = second; - this.weight = weight; - } - - public double getWeight() { - return weight; - } - - public int getFirst() { - return first; - } - - public int getSecond() { - return second; - } - - public int getOtherNode(int firstNode) { - int secondNode = 0; - if (firstNode == first) - secondNode = second; - else if (firstNode == second) - secondNode = first; - return secondNode; - } - - public String toString() { - return String.format("%d-%d %d", first, second, weight); - } - -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Graph.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Graph.java deleted file mode 100644 index e899007dfa..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Graph.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.baeldung.algorithms.boruvka; - -import java.io.IOException; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; - -public class Graph { - - private int nodes; - private int edges; - private Tree[] trees; - - public Graph(Input jsonGraph) throws JsonParseException, JsonMappingException, IOException { - nodes = jsonGraph.getNodes(); - trees = (Tree[]) new Tree[nodes]; - for (int i = 0; i < nodes; i++) { - trees[i] = new Tree(); - } - - int edgesFromInput = jsonGraph.getEdges(); - for (int i = 0; i < edgesFromInput; i++) { - int first = jsonGraph.getEdgeList() - .get(i) - .getFirst(); - int second = jsonGraph.getEdgeList() - .get(i) - .getSecond(); - int weight = jsonGraph.getEdgeList() - .get(i) - .getWeight(); - Edge edge = new Edge(first, second, weight); - - trees[first].addEdge(edge); - trees[second].addEdge(edge); - edges++; - } - - } - - public int getNodes() { - return nodes; - } - - public int getEdges() { - return edges; - } - - public Iterable iterableTree(int i) { - return trees[i]; - } - - public Iterable getAllEdges() { - Iterable list = new Tree(); - for (int i = 0; i < nodes; i++) { - for (Edge edge : iterableTree(i)) { - if (edge.getOtherNode(i) > i) { - ((Tree) list).addEdge(edge); - } - } - } - return list; - } -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Input.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Input.java deleted file mode 100644 index b52720d5e9..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Input.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.baeldung.algorithms.boruvka; - -import java.util.List; - -public class Input { - private int nodes; - private int edges; - private List edgeList; - - public int getNodes() { - return nodes; - } - - public void setNodes(int nodes) { - this.nodes = nodes; - } - - public int getEdges() { - return edges; - } - - public void setEdges(int edges) { - this.edges = edges; - } - - public List getEdgeList() { - return edgeList; - } - - public void setEdgeList(List edgeList) { - this.edgeList = edgeList; - } - - static class E { - private int first; - private int second; - private int weight; - - public int getFirst() { - return first; - } - - public void setFirst(int first) { - this.first = first; - } - - public int getSecond() { - return second; - } - - public void setSecond(int second) { - this.second = second; - } - - public int getWeight() { - return weight; - } - - public void setWeight(int weight) { - this.weight = weight; - } - - } - -} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Tree.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Tree.java deleted file mode 100644 index cc28233e07..0000000000 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/boruvka/Tree.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.algorithms.boruvka; - -import java.util.Iterator; - -public class Tree implements Iterable { - private Node root; - private int edgeCount; - - private static class Node { - private Edge edge; - private Node next; - - public String toString() { - String nextStr = next != null ? next.toString() : ""; - return edge.toString() + " | " + nextStr; - } - } - - public Tree() { - root = null; - edgeCount = 0; - } - - public int getEdgeCount() { - return edgeCount; - } - - public void addEdge(Edge edge) { - Node oldRoot = root; - root = new Node(); - root.edge = edge; - root.next = oldRoot; - edgeCount++; - } - - public String toString() { - String rootStr = root != null ? root.toString() : ""; - return "Tree: " + rootStr + "Size: " + edgeCount; - } - - public Iterator iterator() { - return new LinkedIterator(root); - } - - private class LinkedIterator implements Iterator { - private Node current; - - public LinkedIterator(Node root) { - current = root; - } - - public boolean hasNext() { - return current != null; - } - - public Edge next() { - Edge edge = current.edge; - current = current.next; - return edge; - } - } - -} diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java deleted file mode 100644 index 1d03d2d4d9..0000000000 --- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.algorithms.boruvka; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -import org.junit.Before; -import org.junit.Test; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class BoruvkaUnitTest { - - private Input input; - private static String INPUT_JSON = "/input.json"; - - @Before - public void convertInputJsonToObject() throws JsonParseException, JsonMappingException, IOException { - ObjectMapper mapper = new ObjectMapper(); - StringBuilder jsonStr = new StringBuilder(); - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(BoruvkaMST.class.getResourceAsStream(INPUT_JSON)))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - jsonStr.append(line) - .append("\n"); - } - } - - input = mapper.readValue(jsonStr.toString(), Input.class); - - } - - @Test - public void givenInputGraph_whenBoruvkaPerformed_thenMinimumSpanningTree() throws JsonParseException, JsonMappingException, IOException { - Graph graph = new Graph(input); - BoruvkaMST boruvkaMST = new BoruvkaMST(graph); - - Tree mst = (Tree) boruvkaMST.getMST(); - - assertEquals(30, boruvkaMST.getTotalWeight()); - assertEquals(4, mst.getEdgeCount()); - } - -} diff --git a/algorithms-miscellaneous-6/pom.xml b/algorithms-miscellaneous-6/pom.xml index 5daa000ea3..fda9cf10f9 100644 --- a/algorithms-miscellaneous-6/pom.xml +++ b/algorithms-miscellaneous-6/pom.xml @@ -11,5 +11,17 @@ parent-modules 1.0.0-SNAPSHOT + + + + com.google.guava + guava + ${guava.version} + + + + + 28.1-jre + diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java new file mode 100644 index 0000000000..7dae21648c --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/BoruvkaMST.java @@ -0,0 +1,84 @@ +package com.baeldung.algorithms.boruvka; + +import com.google.common.graph.EndpointPair; +import com.google.common.graph.MutableValueGraph; +import com.google.common.graph.ValueGraphBuilder; + +public class BoruvkaMST { + + private static MutableValueGraph mst = ValueGraphBuilder.undirected() + .build(); + private static int totalWeight; + + public BoruvkaMST(MutableValueGraph graph) { + + int size = graph.nodes().size(); + + UnionFind uf = new UnionFind(size); + + // repeat at most log N times or until we have N-1 edges + for (int t = 1; t < size && mst.edges().size() < size - 1; t = t + t) { + + EndpointPair[] closestEdgeArray = new EndpointPair[size]; + + // foreach tree in graph, find closest edge + for (EndpointPair edge : graph.edges()) { + int u = edge.nodeU(); + int v = edge.nodeV(); + int uParent = uf.find(u); + int vParent = uf.find(v); + if (uParent == vParent) { + continue; // same tree + } + + int weight = graph.edgeValueOrDefault(u, v, 0); + + if (closestEdgeArray[uParent] == null) { + closestEdgeArray[uParent] = edge; + } + if (closestEdgeArray[vParent] == null) { + closestEdgeArray[vParent] = edge; + } + + int uParentWeight = graph.edgeValueOrDefault(closestEdgeArray[uParent].nodeU(), closestEdgeArray[uParent].nodeV(), 0); + int vParentWeight = graph.edgeValueOrDefault(closestEdgeArray[vParent].nodeU(), closestEdgeArray[vParent].nodeV(), 0); + + if (weight < uParentWeight) { + closestEdgeArray[uParent] = edge; + } + if (weight < vParentWeight) { + closestEdgeArray[vParent] = edge; + } + } + + // add newly discovered edges to MST + for (int i = 0; i < size; i++) { + EndpointPair edge = closestEdgeArray[i]; + if (edge != null) { + int u = edge.nodeU(); + int v = edge.nodeV(); + int weight = graph.edgeValueOrDefault(u, v, 0); + // don't add the same edge twice + if (uf.find(u) != uf.find(v)) { + mst.putEdgeValue(u, v, weight); + totalWeight += weight; + uf.union(u, v); + } + } + } + } + } + + public MutableValueGraph getMST() { + return mst; + } + + public int getTotalWeight() { + return totalWeight; + } + + public String toString() { + return "MST: " + mst.toString() + " | Total Weight: " + totalWeight; + } + +} diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java new file mode 100644 index 0000000000..33c9c4a4c8 --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/boruvka/UnionFind.java @@ -0,0 +1,39 @@ +package com.baeldung.algorithms.boruvka; + +public class UnionFind { + private int[] parents; + private int[] ranks; + + public UnionFind(int n) { + parents = new int[n]; + ranks = new int[n]; + for (int i = 0; i < n; i++) { + parents[i] = i; + ranks[i] = 0; + } + } + + public int find(int u) { + while (u != parents[u]) { + u = parents[u]; + } + return u; + } + + public void union(int u, int v) { + int uParent = find(u); + int vParent = find(v); + if (uParent == vParent) { + return; + } + + if (ranks[uParent] < ranks[vParent]) { + parents[uParent] = vParent; + } else if (ranks[uParent] > ranks[vParent]) { + parents[vParent] = uParent; + } else { + parents[vParent] = uParent; + ranks[uParent]++; + } + } +} diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java new file mode 100644 index 0000000000..e61e1e668d --- /dev/null +++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.algorithms.boruvka; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.graph.MutableValueGraph; +import com.google.common.graph.ValueGraphBuilder; + +public class BoruvkaUnitTest { + + private MutableValueGraph graph; + + @Before + public void setup() { + graph = ValueGraphBuilder.undirected() + .build(); + graph.putEdgeValue(0, 1, 8); + graph.putEdgeValue(0, 2, 5); + graph.putEdgeValue(1, 2, 9); + graph.putEdgeValue(1, 3, 11); + graph.putEdgeValue(2, 3, 15); + graph.putEdgeValue(2, 4, 10); + graph.putEdgeValue(3, 4, 7); + } + + @Test + public void givenInputGraph_whenBoruvkaPerformed_thenMinimumSpanningTree() { + BoruvkaMST boruvkaMST = new BoruvkaMST(graph); + MutableValueGraph mst = boruvkaMST.getMST(); + + assertEquals(30, boruvkaMST.getTotalWeight()); + assertEquals(4, mst.edges().size()); + } + +} From ff87d3ecc246a9c8cc3eed792dad0ce44338e54b Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Mon, 23 Mar 2020 22:00:55 -0600 Subject: [PATCH 210/530] BAEL-3069 Remove final keyword, add more empty lines for readability. --- .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 2 +- .../src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index a7adb7933a..b5bf9452ed 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Repository; public class EmployeeDAO { private JdbcTemplate jdbcTemplate; - public void setDataSource(final DataSource dataSource) { + public void setDataSource(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } diff --git a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java index a64ba9b2f0..71e8fb4263 100644 --- a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java +++ b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java @@ -27,10 +27,12 @@ public class EmployeeDAOUnitTest { ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate); Mockito.when(jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class)) .thenReturn(4); + assertEquals(4, employeeDAO.getCountOfEmployees()); Mockito.when(jdbcTemplate.queryForObject(Mockito.anyString(), Mockito.eq(Integer.class))) .thenReturn(3); + assertEquals(3, employeeDAO.getCountOfEmployees()); } @@ -40,8 +42,10 @@ public class EmployeeDAOUnitTest { .addScript("classpath:jdbc/schema.sql") .addScript("classpath:jdbc/test-data.sql") .build(); + EmployeeDAO employeeDAO = new EmployeeDAO(); employeeDAO.setDataSource(dataSource); + assertEquals(4, employeeDAO.getCountOfEmployees()); } } From 147a3fc2d5f8e05e98a288e9fad4d5625368b61a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 24 Mar 2020 14:49:36 +0800 Subject: [PATCH 211/530] Update README.md --- logging-modules/log-mdc/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/logging-modules/log-mdc/README.md b/logging-modules/log-mdc/README.md index 3841224824..b676d3ba76 100644 --- a/logging-modules/log-mdc/README.md +++ b/logging-modules/log-mdc/README.md @@ -1,8 +1,8 @@ ### Relevant Articles: - TBD -- [Improved Java Logging with Mapped Diagnostic Context (MDC)](http://www.baeldung.com/mdc-in-log4j-2-logback) -- [Java Logging with Nested Diagnostic Context (NDC)](http://www.baeldung.com/java-logging-ndc-log4j) -- [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel) +- [Improved Java Logging with Mapped Diagnostic Context (MDC)](https://www.baeldung.com/mdc-in-log4j-2-logback) +- [Java Logging with Nested Diagnostic Context (NDC)](https:www.baeldung.com/java-logging-ndc-log4j) +- [Drools Using Rules from Excel Files](https://www.baeldung.com/drools-excel) ### References From c3976ffa90911b02656325114eaaabfb6912dd54 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 24 Mar 2020 14:53:24 +0800 Subject: [PATCH 212/530] Update README.MD --- spring-boot-modules/spring-boot/README.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot/README.MD b/spring-boot-modules/spring-boot/README.MD index b15ab7dbe5..4f731f2627 100644 --- a/spring-boot-modules/spring-boot/README.MD +++ b/spring-boot-modules/spring-boot/README.MD @@ -26,3 +26,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) - [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) - [Validation in Spring Boot](https://www.baeldung.com/spring-boot-bean-validation) +- [Running Setup Data on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring) From 470575f3ff923831f49abe769223c8b159713ee7 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 24 Mar 2020 15:05:36 +0800 Subject: [PATCH 213/530] Update README.md --- spring-reactor/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-reactor/README.md b/spring-reactor/README.md index b92478f6fb..f8cf2898f1 100644 --- a/spring-reactor/README.md +++ b/spring-reactor/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring Reactor ## Relevant articles: -- [Introduction to Spring Reactor](https://www.baeldung.com/spring-reactor) +- [Introduction to Project Reactor Bus](https://www.baeldung.com/reactor-bus) From 51ad7ac4138ba728dde7f3d41cbbb14a88e448fb Mon Sep 17 00:00:00 2001 From: mike b Date: Tue, 24 Mar 2020 10:36:56 -0400 Subject: [PATCH 214/530] [BAEL-3646] addressing pr issues --- .../conditionalflow/step/NumberInfoClassifierWithDecider.java | 3 --- .../baeldung/conditionalflow/step/PrependingStdoutWriter.java | 4 +--- .../conditionalflow/step/NumberInfoGeneratorUnitTest.java | 3 ++- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java index b9d251c02d..4a8b7f1963 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/NumberInfoClassifierWithDecider.java @@ -1,9 +1,6 @@ package org.baeldung.conditionalflow.step; import org.baeldung.conditionalflow.model.NumberInfo; -import org.springframework.batch.core.ExitStatus; -import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.annotation.BeforeStep; import org.springframework.batch.core.listener.ItemListenerSupport; import org.springframework.batch.item.ItemProcessor; diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java index 283b43f267..c6f77df2ba 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java @@ -7,11 +7,9 @@ import org.springframework.batch.item.ItemWriter; public class PrependingStdoutWriter implements ItemWriter { private String prependText; - private OutputStream writeTo; - public PrependingStdoutWriter(String prependText, OutputStream os) { + public PrependingStdoutWriter(String prependText) { this.prependText = prependText; - this.writeTo = os; } public PrependingStdoutWriter(String prependText) { diff --git a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java index 62fe35add6..90fd884674 100644 --- a/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java +++ b/spring-batch/src/test/java/org/baeldung/conditionalflow/step/NumberInfoGeneratorUnitTest.java @@ -7,9 +7,10 @@ import org.baeldung.conditionalflow.model.NumberInfo; import org.junit.jupiter.api.Test; public class NumberInfoGeneratorUnitTest { + @Test public void givenArray_whenGenerator_correctOrderAndValue() { - int[] numbers = new int[]{1, -2, 4, -10}; + int[] numbers = new int[] { 1, -2, 4, -10 }; NumberInfoGenerator numberGenerator = new NumberInfoGenerator(numbers); assertEquals(new NumberInfo(numbers[0]), numberGenerator.read()); assertEquals(new NumberInfo(numbers[1]), numberGenerator.read()); From a7ed49c4439fb29a5bd0d48da2812ba9dfdf3413 Mon Sep 17 00:00:00 2001 From: Waldemar Date: Tue, 24 Mar 2020 18:42:00 +0100 Subject: [PATCH 215/530] BAEL-2398: rename package name --- .../src/main/java/com/baeldung/{ => introduction}/App.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename coroutines-java/src/main/java/com/baeldung/{ => introduction}/App.java (100%) diff --git a/coroutines-java/src/main/java/com/baeldung/App.java b/coroutines-java/src/main/java/com/baeldung/introduction/App.java similarity index 100% rename from coroutines-java/src/main/java/com/baeldung/App.java rename to coroutines-java/src/main/java/com/baeldung/introduction/App.java From 7ad1542856206c68c8817e28b0cbe9b49196beb9 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 24 Mar 2020 19:56:27 -0400 Subject: [PATCH 216/530] BAEL-3587: Added %n new line example. --- .../java/com/baeldung/newline/AddingNewLineToString.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java b/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java index f701ab2e45..45de6523f9 100644 --- a/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java +++ b/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java @@ -38,6 +38,11 @@ public class AddingNewLineToString { System.out.println("6. Using System.getProperty(\"line.separator\")"); rhyme = line1 + System.getProperty("line.separator") + line2; System.out.println(rhyme); + + //6. Using %n + System.out.println("7. Using %n"); + rhyme = "Humpty Dumpty sat on a wall.%nHumpty Dumpty had a great fall."; + System.out.println(rhyme); System.out.println("***HTML to rendered in a browser***"); //1. Line break for HTML using
From a7cb075f7d8cb308d6ced810233abbd485efe9f6 Mon Sep 17 00:00:00 2001 From: mike b Date: Tue, 24 Mar 2020 19:57:00 -0400 Subject: [PATCH 217/530] [BAEL-3646] Addressing broken PR --- .../conditionalflow/step/PrependingStdoutWriter.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java index c6f77df2ba..913c0885a9 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java @@ -12,12 +12,8 @@ public class PrependingStdoutWriter implements ItemWriter { this.prependText = prependText; } - public PrependingStdoutWriter(String prependText) { - this(prependText, System.out); - } - @Override - public void write(List list) throws Exception { + public void write(List list) { for (T listItem : list) { System.out.println(prependText + " " + listItem.toString()); } From f239c41f5fc570c7d3db66f1b5a3c7758905cd13 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 24 Mar 2020 19:57:56 -0400 Subject: [PATCH 218/530] BAEL-3587: Corrected mis-numbering in comments. --- .../main/java/com/baeldung/newline/AddingNewLineToString.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java b/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java index 45de6523f9..dd8b3a420d 100644 --- a/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java +++ b/core-java-modules/core-java-string-operations/src/main/java/com/baeldung/newline/AddingNewLineToString.java @@ -39,7 +39,7 @@ public class AddingNewLineToString { rhyme = line1 + System.getProperty("line.separator") + line2; System.out.println(rhyme); - //6. Using %n + //7. Using %n System.out.println("7. Using %n"); rhyme = "Humpty Dumpty sat on a wall.%nHumpty Dumpty had a great fall."; System.out.println(rhyme); From c4ba08d9e5026059a3d070aafcf904a579cb86fe Mon Sep 17 00:00:00 2001 From: mike b Date: Tue, 24 Mar 2020 20:02:23 -0400 Subject: [PATCH 219/530] [BAEL-3646] remove unused import --- .../baeldung/conditionalflow/step/PrependingStdoutWriter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java index 913c0885a9..9ffea1e798 100644 --- a/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java +++ b/spring-batch/src/main/java/org/baeldung/conditionalflow/step/PrependingStdoutWriter.java @@ -1,6 +1,5 @@ package org.baeldung.conditionalflow.step; -import java.io.OutputStream; import java.util.List; import org.springframework.batch.item.ItemWriter; From 361615f48b960d83b121f83ae6b0afca538054bc Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 25 Mar 2020 10:45:07 +0800 Subject: [PATCH 220/530] Update README.md --- spring-mvc-basics-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-mvc-basics-3/README.md b/spring-mvc-basics-3/README.md index 180cee498b..074c60152c 100644 --- a/spring-mvc-basics-3/README.md +++ b/spring-mvc-basics-3/README.md @@ -12,4 +12,5 @@ This module contains articles about Spring MVC - [Excluding URLs for a Filter in a Spring Web Application](https://www.baeldung.com/spring-exclude-filter) - [Guide to Flash Attributes in a Spring Web Application](https://www.baeldung.com/spring-web-flash-attributes) - [Handling URL Encoded Form Data in Spring REST](https://www.baeldung.com/spring-url-encoded-form-data) +- [Reading HttpServletRequest Multiple Times in Spring](https://www.baeldung.com/spring-reading-httpservletrequest-multiple-times) - More articles: [[<-- prev]](/spring-mvc-basics-2)[[more -->]](/spring-mvc-basics-4) From 6420d62d09f7f5120b4bd2c11668363955256e65 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 25 Mar 2020 10:48:12 +0800 Subject: [PATCH 221/530] Update README.md --- algorithms-miscellaneous-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md index 87a328e446..6e0de7d64e 100644 --- a/algorithms-miscellaneous-5/README.md +++ b/algorithms-miscellaneous-5/README.md @@ -19,4 +19,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. - [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm) - [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences) - [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms) +- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher) - More articles: [[<-- prev]](/../algorithms-miscellaneous-4) From f5afce0b95de6621dce734c4a849567a9916a900 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 25 Mar 2020 10:50:09 +0800 Subject: [PATCH 222/530] Update README.md --- spring-scheduling/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-scheduling/README.md b/spring-scheduling/README.md index bf34fb60de..4ee306c0e0 100644 --- a/spring-scheduling/README.md +++ b/spring-scheduling/README.md @@ -4,4 +4,4 @@ - [Guide to Spring Retry](https://www.baeldung.com/spring-retry) - [How To Do @Async in Spring](https://www.baeldung.com/spring-async) - [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally) - +- [Remote Debugging with IntelliJ IDEA](https://www.baeldung.com/intellij-remote-debugging) From 50c9b1c75e20598078473f83e8c92755dbd27eb8 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 25 Mar 2020 12:07:06 +0530 Subject: [PATCH 223/530] JAVA-626: Updated Next and Prev links in README --- core-java-modules/core-java-lang-math-2/README.md | 2 +- core-java-modules/core-java-lang-math/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-math-2/README.md b/core-java-modules/core-java-lang-math-2/README.md index 0e0f1991c4..9382414245 100644 --- a/core-java-modules/core-java-lang-math-2/README.md +++ b/core-java-modules/core-java-lang-math-2/README.md @@ -13,4 +13,4 @@ - [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) - [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging) - [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) -- More articles: [[<-- prev]](/../core-java-lang-math) +- More articles: [[<-- Prev]](/../core-java-lang-math) diff --git a/core-java-modules/core-java-lang-math/README.md b/core-java-modules/core-java-lang-math/README.md index 8a822d75fd..834799d6c6 100644 --- a/core-java-modules/core-java-lang-math/README.md +++ b/core-java-modules/core-java-lang-math/README.md @@ -13,4 +13,4 @@ - [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms) - [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor) - [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage) -- More articles: [[<-- next]](/../core-java-lang-math-2) +- More articles: [[Next -->]](/../core-java-lang-math-2) From 532d2a32eef22eb85e6c1cb7d03c303ff4361b58 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 25 Mar 2020 12:10:44 +0530 Subject: [PATCH 224/530] JAVA-626: Updated Next and Prev links in README --- core-java-modules/core-java-lang-math-2/README.md | 2 +- core-java-modules/core-java-lang-math/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-math-2/README.md b/core-java-modules/core-java-lang-math-2/README.md index 9382414245..09039f6ed0 100644 --- a/core-java-modules/core-java-lang-math-2/README.md +++ b/core-java-modules/core-java-lang-math-2/README.md @@ -13,4 +13,4 @@ - [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) - [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging) - [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) -- More articles: [[<-- Prev]](/../core-java-lang-math) +- More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math) diff --git a/core-java-modules/core-java-lang-math/README.md b/core-java-modules/core-java-lang-math/README.md index 834799d6c6..9295349f82 100644 --- a/core-java-modules/core-java-lang-math/README.md +++ b/core-java-modules/core-java-lang-math/README.md @@ -13,4 +13,4 @@ - [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms) - [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor) - [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage) -- More articles: [[Next -->]](/../core-java-lang-math-2) +- More articles: [[Next -->]](/core-java-modules/core-java-lang-math-2) From d2dacc22ba59c48bd3e7d2524d440d694cfb663e Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 25 Mar 2020 23:06:05 +0530 Subject: [PATCH 225/530] JAVA-625: Moved 3 articles from java-numbers-2 to java-numbers-3 --- .../main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java | 2 -- .../main/java/com/baeldung/numbersinrange/NumbersInARange.java | 0 .../java/com/baeldung/numbersinrange/RandomNumbersInARange.java | 0 .../com/baeldung/fibonacci/FibonacciSeriesUtilsUnitTest.java | 0 .../com/baeldung/numbersinrange/NumbersInARangeUnitTest.java | 0 .../baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java | 0 6 files changed, 2 deletions(-) rename {java-numbers-2 => java-numbers-3}/src/main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java (96%) rename {java-numbers-2 => java-numbers-3}/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java (100%) rename {java-numbers-2 => java-numbers-3}/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java (100%) rename {java-numbers-2 => java-numbers-3}/src/test/java/com/baeldung/fibonacci/FibonacciSeriesUtilsUnitTest.java (100%) rename {java-numbers-2 => java-numbers-3}/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java (100%) rename {java-numbers-2 => java-numbers-3}/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java (100%) diff --git a/java-numbers-2/src/main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java b/java-numbers-3/src/main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java similarity index 96% rename from java-numbers-2/src/main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java rename to java-numbers-3/src/main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java index 943fcffa56..616f3ab28f 100644 --- a/java-numbers-2/src/main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java +++ b/java-numbers-3/src/main/java/com/baeldung/fibonacci/FibonacciSeriesUtils.java @@ -1,7 +1,5 @@ package com.baeldung.fibonacci; -import static java.lang.Math.pow; - public class FibonacciSeriesUtils { public static int nthFibonacciTermRecursiveMethod(int n) { diff --git a/java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java b/java-numbers-3/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java similarity index 100% rename from java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java rename to java-numbers-3/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java diff --git a/java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java b/java-numbers-3/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java similarity index 100% rename from java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java rename to java-numbers-3/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java diff --git a/java-numbers-2/src/test/java/com/baeldung/fibonacci/FibonacciSeriesUtilsUnitTest.java b/java-numbers-3/src/test/java/com/baeldung/fibonacci/FibonacciSeriesUtilsUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/baeldung/fibonacci/FibonacciSeriesUtilsUnitTest.java rename to java-numbers-3/src/test/java/com/baeldung/fibonacci/FibonacciSeriesUtilsUnitTest.java diff --git a/java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java b/java-numbers-3/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java rename to java-numbers-3/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java diff --git a/java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java b/java-numbers-3/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java similarity index 100% rename from java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java rename to java-numbers-3/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java From 529720c911fef7de6e2d551b024a431adcf74bdd Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 25 Mar 2020 23:06:33 +0530 Subject: [PATCH 226/530] JAVA-625: Updated README for both modules --- java-numbers-2/README.md | 3 --- java-numbers-3/README.md | 8 ++++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md index ba9e14965d..48f9acd32d 100644 --- a/java-numbers-2/README.md +++ b/java-numbers-2/README.md @@ -13,7 +13,4 @@ This module contains articles about numbers in Java. - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) - [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) -- [Generating Random Numbers in a Range in Java](https://www.baeldung.com/java-generating-random-numbers-in-range) -- [Listing Numbers Within a Range in Java](https://www.baeldung.com/java-listing-numbers-within-a-range) -- [Fibonacci Series in Java](https://www.baeldung.com/java-fibonacci) - More articles: [[<-- prev]](/../java-numbers) diff --git a/java-numbers-3/README.md b/java-numbers-3/README.md index 835b8b0b54..035fc0c789 100644 --- a/java-numbers-3/README.md +++ b/java-numbers-3/README.md @@ -1,5 +1,13 @@ +## Java Number Cookbooks and Examples + +This module contains articles about numbers in Java. + ### Relevant Articles: - [Generating Random Numbers](https://www.baeldung.com/java-generating-random-numbers) - [Convert Double to Long in Java](https://www.baeldung.com/java-convert-double-long) - [Check for null Before Calling Parse in Double.parseDouble](https://www.baeldung.com/java-check-null-parse-double) +- [Generating Random Numbers in a Range in Java](https://www.baeldung.com/java-generating-random-numbers-in-range) +- [Listing Numbers Within a Range in Java](https://www.baeldung.com/java-listing-numbers-within-a-range) +- [Fibonacci Series in Java](https://www.baeldung.com/java-fibonacci) +- More articles: [[<-- prev]](/../java-numbers-2) From 525d960cf02a75ff4300eb6e4ba6bae37e75069f Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 25 Mar 2020 23:10:20 +0530 Subject: [PATCH 227/530] JAVA-625: Added next link to second module --- java-numbers-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md index 48f9acd32d..fc852aab19 100644 --- a/java-numbers-2/README.md +++ b/java-numbers-2/README.md @@ -13,4 +13,4 @@ This module contains articles about numbers in Java. - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) - [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) -- More articles: [[<-- prev]](/../java-numbers) +- More articles: [[<-- prev]](/../java-numbers) [[next -->]](/../java-numbers-3) From 65dd613fb8c48d1d7e7244e6fb39d4c4353c8d70 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 25 Mar 2020 23:13:19 +0530 Subject: [PATCH 228/530] JAVA-625: Updated README links --- java-numbers-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md index fc852aab19..1d996e32cc 100644 --- a/java-numbers-2/README.md +++ b/java-numbers-2/README.md @@ -13,4 +13,4 @@ This module contains articles about numbers in Java. - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) - [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) -- More articles: [[<-- prev]](/../java-numbers) [[next -->]](/../java-numbers-3) +- More articles: [[<-- prev]](/java-numbers) [[next -->]](/java-numbers-3) From 9f609d4d84abc8cd68911c96ecdfdb7779dbe701 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 25 Mar 2020 23:15:01 +0530 Subject: [PATCH 229/530] JAVA-625: Updated README Prev link --- java-numbers-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-numbers-3/README.md b/java-numbers-3/README.md index 035fc0c789..598acfb927 100644 --- a/java-numbers-3/README.md +++ b/java-numbers-3/README.md @@ -10,4 +10,4 @@ This module contains articles about numbers in Java. - [Generating Random Numbers in a Range in Java](https://www.baeldung.com/java-generating-random-numbers-in-range) - [Listing Numbers Within a Range in Java](https://www.baeldung.com/java-listing-numbers-within-a-range) - [Fibonacci Series in Java](https://www.baeldung.com/java-fibonacci) -- More articles: [[<-- prev]](/../java-numbers-2) +- More articles: [[<-- prev]](/java-numbers-2) From 9d11370afcda84ac9f07b9872f86f674e1767302 Mon Sep 17 00:00:00 2001 From: mike b Date: Wed, 25 Mar 2020 20:23:05 -0400 Subject: [PATCH 230/530] [bael-3646] trying to resolve merge conflict. --- spring-batch/repository.sqlite | Bin 73728 -> 73728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/spring-batch/repository.sqlite b/spring-batch/repository.sqlite index 9d260fa2d1eed9ab00ea099508119d8e44235d87..2b549352ec8073708bd085fd414ed93d189c7511 100644 GIT binary patch delta 3276 zcmeHJUu;uV7{BNC-fPQRZd;t#GH8itU0~b2xA$M8MA_EC*xF7g!HwwX{l`k(TBI8f z(`+%~gBrHwJoEuH@kJg?jIP5MA0!f=L>$BiBhlc4kw;9-LX?Q-oOZPulF6HKG`ZjX zecwIj~+l4j?0LD$8& zA=s9n#T8Xm6q=>n9jTLre5sV5IM$sjn`8TnhV4kQWJsbWNseJEdQLV(*%1F2^lTlgnLRKO5wK=U1u${}~p(n+$ZXe10_tN=OzCX7?P(CVLO1 z2hy3t>6#6mqJ0zqEX#&M=UZ8drm=nbdm?`#Ylh%2$pY}fz(6~^+sDE;`vx0YmY`1f z!u~e+&R(HOvsul6kjm&f)IJ4S6VmEYc^eb67N@41!N8oLMT=*sb@2pU83 zL}41sX)FT+AvpU|idc8UxmTVfw#VUU>M%wVyJ6|oCkV3Z`lsnALMIAOL%xU+zS+^t zPJ$u{a_Q$Z;H7{E@e+yn5G~mF^(2vBV7dHdPbM`qm_&RMfJ(t%{Vj8b_o%vta#vGz zxG>t*S<_TGKKvN%0in$?x7*Fr2eSwI(|eB>js9Ly(dF7AMU>$6(Jf)3shX}0v*=Ws zU%_P-s0Yfn1jw61*0Wa9GO~}7Lh^qDN=^sq?ax?>lsW2SM z_(=%2Icojd>mZ;UVM2$W6}Rp{#I%s`RU6@RxmE+X(S?Zi(TlUdzmva10sc0{-$sI> zTF~Qddb^u3Dz$SPA9_teJ?8asn0xyzI5MZuY633I9dpwRjn-1k;ye(lVEH=xAU4g# z_U~eYtBgc#=@UQrjz!sjjk#C$Ut=r3wt{v<@zv8L=u6G%KkYJ$9{jj4mt z6YaGw@?Y;wJK&9(4N#qtNbzEgf%7xF8d|v0%7Z{d#UH(u5gu%F#WVH?a?a29n6WqEDc9d;tc$FzPi2BHqZu1T z6On^MQ%4@;=|A%HtHoQ}xFD{2MAju?xK`C4Z2^}LoG++S7Q5=Ux(H$0YQxBt}Ud>3drr4BUrS(i19yphT F(x1b+3nl;n delta 2982 zcmd^AO>7%Q6y8~97dwBp)1P3s)J8415w)|s-t}%&Q8kHO$8GJD#8s(~NH^m(cG|{P zvZ&$$;f_M8IrxCYkC4i-tqtc!z@-OBkszckRp>1TkcfmLr69qZ@g`~nDC&*2mfz3J z?2O*e_uiYCZ<(2InG1HIHjd-EfHr>k@*#ysZP(AmT&RP{LU-eeYl%l5PceQLpsV@)zGEbFqV7z(yb-B1u* zi)4%CscC!T4ps_g5#HBjtn1iN3w^TGW+hBLVW`t{zxwnn?OmS`3| zs?EII63KeDHQ7pd9x}PN-6y!ce|Xm#e&4J>K1}%sRu;H5R0Y01n(rUUr;?|0CvwAQ za%}Gbxx{yH2nm7^2z<6n;CPOA=_-9z3kzQW{sF%R-M`8X|sdlj%t>qMTQ_hRJs#9?y%b_w(za`nUrlQ-^A z86fXp$U6HwN$}!9&|e_c>=}?DvV1Ywls_GF*89jpE(|(-X9t>1!`V|OQxGkt0MPx72g9>okE+EDRRdg+ z%VT?E&MK~*-OqbapgZDryS@Bqek7AiPgKS;Nm(=0=0|d$M(&R739^-HDEe6eUgf=O zw1|98$_fIptw?ZX0lA%IrCv=9p3cK_)GXvCUs#b=$mJrl@)r_W+)rkfd?Zjj%shXL zGt{{yL%)(6mFG&}smVP3YBL`$*G5LVToAcVfG@`(QRLw7qoH)j??^95O0-|mzD21W zh+f;&p<2EaYT|CR(+5$0k;OVfxjzZu4+E&h+9?rLJBMt$I#ijq2P>147Os6GqVJ#2 zRl-x1H*G6ySHdMY3m?Sn)D9QT@&&8V1DVOx{(J`guM4DRc#*=Y<=nEb_K_FSQlh03 z1ixt@>Q&_X6wOHubnWi0rw4-v{u_g|Juq~BUH|#M0LbB>c6cBFrhbE&OawKijYgLtrObCFz3v4sza$h z)TGA9)y3Y&yXCy(^r0w|_2mJOfmU3ZvYPJJZ`~2-kc|H8kc^Svf9UbUv73DzY=TX! N#YFV(6CayBe*?Yuegpsj From c5ba081f7c1ca22380f69303722802d8e140488a Mon Sep 17 00:00:00 2001 From: Yavuz Tas <12643010+yavuztas@users.noreply.github.com> Date: Thu, 26 Mar 2020 04:23:14 +0100 Subject: [PATCH 231/530] sample codes for article BAEL-3581 (#8942) --- persistence-modules/hibernate-jpa/pom.xml | 8 +- .../entitymanager/getreference/Game.java | 38 ++++ .../entitymanager/getreference/Player.java | 50 +++++ .../src/main/resources/META-INF/create-db.sql | 3 + .../src/main/resources/META-INF/data.sql | 5 + .../src/main/resources/META-INF/drop-db.sql | 2 + .../main/resources/META-INF/persistence.xml | 86 +++++++- .../GetReferenceH2IntegrationTest.java | 194 ++++++++++++++++++ .../GetReferenceMySQLManualTest.java | 185 +++++++++++++++++ .../GetReferencePostgreSQLManualTest.java | 185 +++++++++++++++++ 10 files changed, 754 insertions(+), 2 deletions(-) create mode 100644 persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Game.java create mode 100644 persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Player.java create mode 100644 persistence-modules/hibernate-jpa/src/main/resources/META-INF/create-db.sql create mode 100644 persistence-modules/hibernate-jpa/src/main/resources/META-INF/data.sql create mode 100644 persistence-modules/hibernate-jpa/src/main/resources/META-INF/drop-db.sql create mode 100644 persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java create mode 100644 persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceMySQLManualTest.java create mode 100644 persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferencePostgreSQLManualTest.java diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml index 67f40d5017..07b1ee1c51 100644 --- a/persistence-modules/hibernate-jpa/pom.xml +++ b/persistence-modules/hibernate-jpa/pom.xml @@ -81,11 +81,17 @@ jmh-generator-annprocess ${openjdk-jmh.version}
+ + org.postgresql + postgresql + ${postgresql.version} + 5.3.7.Final - 6.0.6 + 8.0.13 + 42.2.11 2.2.3 3.8.0 1.21 diff --git a/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Game.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Game.java new file mode 100644 index 0000000000..1de8de0327 --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Game.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.entitymanager.getreference; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Game { + + @Id + private Long id; + + private String name; + + public Game() { + } + + public Game(Long id, String name) { + this.id = id; + this.name = name; + } + + 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; + } + +} diff --git a/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Player.java b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Player.java new file mode 100644 index 0000000000..459a3a00ad --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/main/java/com/baeldung/hibernate/entitymanager/getreference/Player.java @@ -0,0 +1,50 @@ +package com.baeldung.hibernate.entitymanager.getreference; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@Entity +public class Player { + + @Id + private Long id; + + private String name; + + @ManyToOne + private Game game; + + public Player() { + } + + public Player(Long id, String name) { + this.id = id; + this.name = name; + } + + 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 Game getGame() { + return game; + } + + public void setGame(Game game) { + this.game = game; + } + +} diff --git a/persistence-modules/hibernate-jpa/src/main/resources/META-INF/create-db.sql b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/create-db.sql new file mode 100644 index 0000000000..7074b603f6 --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/create-db.sql @@ -0,0 +1,3 @@ +create table Game (id bigint not null, name varchar(255), primary key (id)); +create table Player (id bigint not null, name varchar(255), game_id bigint, primary key (id)); +alter table Player add constraint FKohr86afuapoujklti79wo27aa foreign key (game_id) references Game(id); \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/src/main/resources/META-INF/data.sql b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/data.sql new file mode 100644 index 0000000000..1e83082801 --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/data.sql @@ -0,0 +1,5 @@ +insert into Game (id, name) values (1, 'Game 1'); +insert into Game (id, name) values (2, 'Game 2'); +insert into Player (game_id, name, id) values (null, 'Player 1', 1); +insert into Player (game_id, name, id) values (null, 'Player 2', 2); +insert into Player (game_id, name, id) values (null, 'Player 3', 3); \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/src/main/resources/META-INF/drop-db.sql b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/drop-db.sql new file mode 100644 index 0000000000..275324fcae --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/drop-db.sql @@ -0,0 +1,2 @@ +drop table if exists Player; +drop table if exists Game; \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/persistence.xml index 4dfade1af3..c2d5bf59ab 100644 --- a/persistence-modules/hibernate-jpa/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/hibernate-jpa/src/main/resources/META-INF/persistence.xml @@ -5,7 +5,7 @@ version="2.0"> Hibernate EntityManager Demo - com.baeldung.hibernate.pojo.Movie + com.baeldung.hibernate.pojo.Movie true @@ -16,4 +16,88 @@ + + + EntityManager getReference persistence unit + com.baeldung.hibernate.entitymanager.getreference.Game + com.baeldung.hibernate.entitymanager.getreference.Player + true + + + + + + + + + + + + + + + + + + + EntityManager getReference persistence unit + com.baeldung.hibernate.entitymanager.getreference.Game + com.baeldung.hibernate.entitymanager.getreference.Player + true + + + + + + + + + + + + + + + + + + + + + + + + + EntityManager getReference persistence unit + com.baeldung.hibernate.entitymanager.getreference.Game + com.baeldung.hibernate.entitymanager.getreference.Player + true + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java new file mode 100644 index 0000000000..e8e6aeed7c --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceH2IntegrationTest.java @@ -0,0 +1,194 @@ +package com.baeldung.hibernate.entitymanager.getreference; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import org.junit.jupiter.api.*; +import org.slf4j.LoggerFactory; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GetReferenceH2IntegrationTest { + + private static EntityManagerFactory entityManagerFactory; + private static EntityManager entityManager; + + private static final PrintStream SystemOut = System.out; + private static OutputStream output; + + @BeforeAll + public static void setup() { + // close some specific loggers so that we can clearly see Hibernate: SQL queries + ((Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.OFF); + ((Logger) LoggerFactory.getLogger("org.hibernate.type.descriptor.sql")).setLevel(Level.OFF); + ((Logger) LoggerFactory.getLogger("org.hibernate.stat")).setLevel(Level.OFF); + + entityManagerFactory = Persistence.createEntityManagerFactory("com.baeldung.hibernate.entitymanager.game_player_h2"); + entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction().begin(); + + entityManager.persist(new Game(1L, "Game 1")); + entityManager.persist(new Game(2L, "Game 2")); + entityManager.persist(new Player(1L, "Player 1")); + entityManager.persist(new Player(2L, "Player 2")); + entityManager.persist(new Player(3L, "Player 3")); + + entityManager.getTransaction().commit(); + entityManager.clear(); + entityManager.close(); + } + + private void runInTransaction(Runnable task) { + // We create new persistence context for each test method to discard Hibernate first level cache. + // So that we can see the behavior of getReference() method in a non-cached environment. + entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction().begin(); + task.run(); + entityManager.getTransaction().commit(); + // In any case, we use clear() and close() to make all the managed entities detached and cleared. + // So, we can be sure we test always on a clear persistence context. + entityManager.clear(); + entityManager.close(); + } + + @BeforeEach + public void beforeEach() { + // stubbing System.out printStream + output = new ByteArrayOutputStream(); + System.setOut(new PrintStream(output)); + } + + @AfterEach + public void afterEach() { + System.setOut(SystemOut); + // we print to see original output after each test method + System.out.print(output.toString()); + } + + @AfterAll + public static void tearDown() { + entityManagerFactory.close(); + } + + @Test + public void whenUsingFindMethodToUpdateGame_thenExecutesSelectForGame() { + + runInTransaction(() -> { + Game game1 = entityManager.find(Game.class, 1L); + game1.setName("Game Updated 1"); + + entityManager.persist(game1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: update Game set name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToUpdateGame_thenExecutesSelectForGame() { + + runInTransaction(() -> { + Game game1 = entityManager.getReference(Game.class, 1L); + game1.setName("Game Updated 2"); + + entityManager.persist(game1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: update Game set name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingFindMethodToDeletePlayer_thenExecutesSelectForPlayer() { + + runInTransaction(() -> { + Player player2 = entityManager.find(Player.class, 2L); + entityManager.remove(player2); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: delete from Player where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToDeletePlayer_thenExecutesSelectForPlayer() { + + runInTransaction(() -> { + Player player3 = entityManager.getReference(Player.class, 3L); + entityManager.remove(player3); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: delete from Player where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingFindMethodToUpdatePlayersGame_thenExecutesSelectForGame() { + + runInTransaction((() -> { + Game game1 = entityManager.find(Game.class, 1L); + + Player player1 = entityManager.find(Player.class, 1L); + player1.setGame(game1); + + entityManager.persist(player1); + })); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: update Player set game_id=?, name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToUpdatePlayersGame_thenDoesNotExecuteSelectForGame() { + + runInTransaction(() -> { + Game game2 = entityManager.getReference(Game.class, 2L); + + Player player1 = entityManager.find(Player.class, 1L); + player1.setGame(game2); + + entityManager.persist(player1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: update Player set game_id=?, name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + +} diff --git a/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceMySQLManualTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceMySQLManualTest.java new file mode 100644 index 0000000000..2b7c5e8119 --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferenceMySQLManualTest.java @@ -0,0 +1,185 @@ +package com.baeldung.hibernate.entitymanager.getreference; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import org.junit.jupiter.api.*; +import org.slf4j.LoggerFactory; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * We need to have a running MySQL instance and a schema named "baeldung" ready in order to execute this integration test + */ +public class GetReferenceMySQLManualTest { + + private static EntityManagerFactory entityManagerFactory; + private static EntityManager entityManager; + + private static final PrintStream SystemOut = System.out; + private static OutputStream output; + + @BeforeAll + public static void setup() { + // close some specific loggers so that we can clearly see Hibernate: SQL queries + ((Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.OFF); + ((Logger) LoggerFactory.getLogger("org.hibernate.type.descriptor.sql")).setLevel(Level.OFF); + ((Logger) LoggerFactory.getLogger("org.hibernate.stat")).setLevel(Level.OFF); + + entityManagerFactory = Persistence.createEntityManagerFactory("com.baeldung.hibernate.entitymanager.game_player_mysql"); + } + + private void runInTransaction(Runnable task) { + // We create new persistence context for each test method to discard Hibernate first level cache. + // So that we can see the behavior of getReference() method in a non-cached environment. + entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction().begin(); + task.run(); + entityManager.getTransaction().commit(); + // In any case, we use clear() and close() to make all the managed entities detached and cleared. + // So, we can be sure we test always on a clear persistence context. + entityManager.clear(); + entityManager.close(); + } + + @BeforeEach + public void beforeEach() { + // stubbing System.out printStream + output = new ByteArrayOutputStream(); + System.setOut(new PrintStream(output)); + } + + @AfterEach + public void afterEach() { + System.setOut(SystemOut); + // we print to see original output after each test method + System.out.print(output.toString()); + } + + @AfterAll + public static void tearDown() { + entityManagerFactory.close(); + } + + @Test + public void whenUsingFindMethodToUpdateGame_thenExecutesSelectForGame() { + + runInTransaction(() -> { + Game game1 = entityManager.find(Game.class, 1L); + game1.setName("Game Updated 1"); + + entityManager.persist(game1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: update Game set name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToUpdateGame_thenExecutesSelectForGame() { + + runInTransaction(() -> { + Game game1 = entityManager.getReference(Game.class, 1L); + game1.setName("Game Updated 2"); + + entityManager.persist(game1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: update Game set name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingFindMethodToDeletePlayer_thenExecutesSelectForPlayer() { + + runInTransaction(() -> { + Player player2 = entityManager.find(Player.class, 2L); + entityManager.remove(player2); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: delete from Player where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToDeletePlayer_thenExecutesSelectForPlayer() { + + runInTransaction(() -> { + Player player3 = entityManager.getReference(Player.class, 3L); + entityManager.remove(player3); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: delete from Player where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingFindMethodToUpdatePlayersGame_thenExecutesSelectForGame() { + + runInTransaction((() -> { + Game game1 = entityManager.find(Game.class, 1L); + + Player player1 = entityManager.find(Player.class, 1L); + player1.setGame(game1); + + entityManager.persist(player1); + })); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: update Player set game_id=?, name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToUpdatePlayersGame_thenDoesNotExecuteSelectForGame() { + + runInTransaction(() -> { + Game game2 = entityManager.getReference(Game.class, 2L); + + Player player1 = entityManager.find(Player.class, 1L); + player1.setGame(game2); + + entityManager.persist(player1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: update Player set game_id=?, name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + +} diff --git a/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferencePostgreSQLManualTest.java b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferencePostgreSQLManualTest.java new file mode 100644 index 0000000000..17f6b10b8a --- /dev/null +++ b/persistence-modules/hibernate-jpa/src/test/java/com/baeldung/hibernate/entitymanager/getreference/GetReferencePostgreSQLManualTest.java @@ -0,0 +1,185 @@ +package com.baeldung.hibernate.entitymanager.getreference; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import org.junit.jupiter.api.*; +import org.slf4j.LoggerFactory; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * We need to have a running PostgreSQL instance in order to execute this integration test + */ +public class GetReferencePostgreSQLManualTest { + + private static EntityManagerFactory entityManagerFactory; + private static EntityManager entityManager; + + private static final PrintStream SystemOut = System.out; + private static OutputStream output; + + @BeforeAll + public static void setup() { + // close some specific loggers so that we can clearly see Hibernate: SQL queries + ((Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.OFF); + ((Logger) LoggerFactory.getLogger("org.hibernate.type.descriptor.sql")).setLevel(Level.OFF); + ((Logger) LoggerFactory.getLogger("org.hibernate.stat")).setLevel(Level.OFF); + + entityManagerFactory = Persistence.createEntityManagerFactory("com.baeldung.hibernate.entitymanager.game_player_postgresql"); + } + + private void runInTransaction(Runnable task) { + // We create new persistence context for each test method to discard Hibernate first level cache. + // So that we can see the behavior of getReference() method in a non-cached environment. + entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction().begin(); + task.run(); + entityManager.getTransaction().commit(); + // In any case, we use clear() and close() to make all the managed entities detached and cleared. + // So, we can be sure we test always on a clear persistence context. + entityManager.clear(); + entityManager.close(); + } + + @BeforeEach + public void beforeEach() { + // stubbing System.out printStream + output = new ByteArrayOutputStream(); + System.setOut(new PrintStream(output)); + } + + @AfterEach + public void afterEach() { + System.setOut(SystemOut); + // we print to see original output after each test method + System.out.print(output.toString()); + } + + @AfterAll + public static void tearDown() { + entityManagerFactory.close(); + } + + @Test + public void whenUsingFindMethodToUpdateGame_thenExecutesSelectForGame() { + + runInTransaction(() -> { + Game game1 = entityManager.find(Game.class, 1L); + game1.setName("Game Updated 1"); + + entityManager.persist(game1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: update Game set name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToUpdateGame_thenExecutesSelectForGame() { + + runInTransaction(() -> { + Game game1 = entityManager.getReference(Game.class, 1L); + game1.setName("Game Updated 2"); + + entityManager.persist(game1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: update Game set name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingFindMethodToDeletePlayer_thenExecutesSelectForPlayer() { + + runInTransaction(() -> { + Player player2 = entityManager.find(Player.class, 2L); + entityManager.remove(player2); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: delete from Player where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToDeletePlayer_thenExecutesSelectForPlayer() { + + runInTransaction(() -> { + Player player3 = entityManager.getReference(Player.class, 3L); + entityManager.remove(player3); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: delete from Player where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingFindMethodToUpdatePlayersGame_thenExecutesSelectForGame() { + + runInTransaction((() -> { + Game game1 = entityManager.find(Game.class, 1L); + + Player player1 = entityManager.find(Player.class, 1L); + player1.setGame(game1); + + entityManager.persist(player1); + })); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select game0_.id as id1_0_0_, game0_.name as name2_0_0_ from Game game0_ where game0_.id=?\n"); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: update Player set game_id=?, name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + + @Test + public void whenUsingGetReferenceMethodToUpdatePlayersGame_thenDoesNotExecuteSelectForGame() { + + runInTransaction(() -> { + Game game2 = entityManager.getReference(Game.class, 2L); + + Player player1 = entityManager.find(Player.class, 1L); + player1.setGame(game2); + + entityManager.persist(player1); + }); + + StringBuilder expected = new StringBuilder(); + expected.append("Hibernate: select "); + expected.append("player0_.id as id1_1_0_, player0_.game_id as game_id3_1_0_, "); + expected.append("player0_.name as name2_1_0_, game1_.id as id1_0_1_, game1_.name as name2_0_1_ "); + expected.append("from Player player0_ left outer join Game game1_ on player0_.game_id=game1_.id where player0_.id=?\n"); + expected.append("Hibernate: update Player set game_id=?, name=? where id=?\n"); + + assertEquals(expected.toString(), output.toString()); + } + +} From 32ff2077a37ab1bea794aaca9eb9a3f566e055c9 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Thu, 26 Mar 2020 04:31:54 +0000 Subject: [PATCH 232/530] Examples for collection transformations in Kotlin (#8912) --- .../transformations/AssociateUnitTest.kt | 48 +++++++++++++++++ .../transformations/FilterUnitTest.kt | 43 +++++++++++++++ .../transformations/FlattenUnitTest.kt | 21 ++++++++ .../transformations/JoinToUnitTest.kt | 46 ++++++++++++++++ .../transformations/MapUnitTest.kt | 53 +++++++++++++++++++ .../transformations/ReduceUnitTest.kt | 22 ++++++++ .../transformations/ZipUnitTest.kt | 34 ++++++++++++ 7 files changed, 267 insertions(+) create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/AssociateUnitTest.kt create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FilterUnitTest.kt create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FlattenUnitTest.kt create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/JoinToUnitTest.kt create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/MapUnitTest.kt create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ReduceUnitTest.kt create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ZipUnitTest.kt diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/AssociateUnitTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/AssociateUnitTest.kt new file mode 100644 index 0000000000..68f7040c4c --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/AssociateUnitTest.kt @@ -0,0 +1,48 @@ +package com.baeldung.collections.transformations + +import org.junit.Assert.assertEquals +import org.junit.Test + +class AssociateUnitTest { + @Test + fun testToMap() { + val input = listOf(Pair("one", 1), Pair("two", 2)) + val map = input.toMap() + assertEquals(mapOf("one" to 1, "two" to 2), map) + } + + @Test + fun testAssociateWith() { + val inputs = listOf("Hi", "there") + val map = inputs.associateWith { k -> k.length } + assertEquals(mapOf("Hi" to 2, "there" to 5), map) + } + + @Test + fun testAssociateBy() { + val inputs = listOf("Hi", "there") + val map = inputs.associateBy { v -> v.length } + assertEquals(mapOf(2 to "Hi", 5 to "there"), map) + } + + @Test + fun testAssociate() { + val inputs = listOf("Hi", "there") + val map = inputs.associate { e -> Pair(e.toUpperCase(), e.reversed()) } + assertEquals(mapOf("HI" to "iH", "THERE" to "ereht"), map) + } + + @Test + fun testAssociateByDuplicateKeys() { + val inputs = listOf("one", "two") + val map = inputs.associateBy { v -> v.length } + assertEquals(mapOf(3 to "two"), map) + } + + @Test + fun testGroupBy() { + val inputs = listOf("one", "two", "three") + val map = inputs.groupBy { v -> v.length } + assertEquals(mapOf(3 to listOf("one", "two"), 5 to listOf("three")), map) + } +} \ No newline at end of file diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FilterUnitTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FilterUnitTest.kt new file mode 100644 index 0000000000..591577e4f3 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FilterUnitTest.kt @@ -0,0 +1,43 @@ +package com.baeldung.collections.transformations + +import org.junit.Assert.assertEquals +import org.junit.Test + +class FilterUnitTest { + @Test + fun testFilterWithLambda() { + val input = listOf(1, 2, 3, 4, 5) + val filtered = input.filter { it <= 3 } + assertEquals(listOf(1, 2, 3), filtered) + } + + @Test + fun testFilterWithMethodReference() { + val input = listOf(1, 2, 3, 4, 5) + val filtered = input.filter(this::isSmall) + assertEquals(listOf(1, 2, 3), filtered) + } + + @Test + fun testFilterNotWithMethodReference() { + val input = listOf(1, 2, 3, 4, 5) + val filtered = input.filterNot(this::isSmall) + assertEquals(listOf(4, 5), filtered) + } + + @Test + fun testFilterIndexed() { + val input = listOf(5, 4, 3, 2, 1) + val filtered = input.filterIndexed { index, element -> index < 3 } + assertEquals(listOf(5, 4, 3), filtered) + } + + @Test + fun testFilterNotNull() { + val nullable: List = listOf("Hello", null, "World") + val nonnull: List = nullable.filterNotNull() + assertEquals(listOf("Hello", "World"), nonnull) + } + + private fun isSmall(i: Int) = i <= 3 +} \ No newline at end of file diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FlattenUnitTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FlattenUnitTest.kt new file mode 100644 index 0000000000..69fbceb8e3 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/FlattenUnitTest.kt @@ -0,0 +1,21 @@ +package com.baeldung.collections.transformations + +import org.junit.Assert.assertEquals +import org.junit.Test + +class FlattenUnitTest { + @Test + fun testFlatten() { + val inputs = listOf("one", "two", "three") + val characters = inputs.map(String::toList) + val flattened = characters.flatten(); + assertEquals(listOf('o', 'n', 'e', 't', 'w', 'o', 't', 'h', 'r', 'e', 'e'), flattened) + } + + @Test + fun testFlatMap() { + val inputs = listOf("one", "two", "three") + val characters = inputs.flatMap(String::toList) + assertEquals(listOf('o', 'n', 'e', 't', 'w', 'o', 't', 'h', 'r', 'e', 'e'), characters) + } +} \ No newline at end of file diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/JoinToUnitTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/JoinToUnitTest.kt new file mode 100644 index 0000000000..2ac0cdca50 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/JoinToUnitTest.kt @@ -0,0 +1,46 @@ +package com.baeldung.collections.transformations + +import org.junit.Assert.assertEquals +import org.junit.Test + +class JoinToUnitTest { + @Test + fun testJoinToString() { + val inputs = listOf("Jan", "Feb", "Mar", "Apr", "May") + + val simpleString = inputs.joinToString() + assertEquals("Jan, Feb, Mar, Apr, May", simpleString) + + val detailedString = inputs.joinToString(separator = ",", prefix="Months: ", postfix=".") + assertEquals("Months: Jan,Feb,Mar,Apr,May.", detailedString) + } + + @Test + fun testJoinToStringLimits() { + val inputs = listOf("Jan", "Feb", "Mar", "Apr", "May") + + val simpleString = inputs.joinToString(limit = 3) + assertEquals("Jan, Feb, Mar, ...", simpleString) + } + + @Test + fun testJoinToStringTransform() { + val inputs = listOf("Jan", "Feb", "Mar", "Apr", "May") + + val simpleString = inputs.joinToString(transform = String::toUpperCase) + assertEquals("JAN, FEB, MAR, APR, MAY", simpleString) + } + + @Test + fun testJoinTo() { + val inputs = listOf("Jan", "Feb", "Mar", "Apr", "May") + + val output = StringBuilder() + output.append("My ") + .append(inputs.size) + .append(" elements: ") + inputs.joinTo(output) + + assertEquals("My 5 elements: Jan, Feb, Mar, Apr, May", output.toString()) + } +} \ No newline at end of file diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/MapUnitTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/MapUnitTest.kt new file mode 100644 index 0000000000..e22fcbe903 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/MapUnitTest.kt @@ -0,0 +1,53 @@ +package com.baeldung.collections.transformations + +import org.junit.Assert.assertEquals +import org.junit.Test + +class MapUnitTest { + @Test + fun testMapWithLambda() { + val input = listOf("one", "two", "three") + + val reversed = input.map { it.reversed() } + assertEquals(listOf("eno", "owt", "eerht"), reversed) + + val lengths = input.map { it.length } + assertEquals(listOf(3, 3, 5), lengths) + } + + @Test + fun testMapIndexed() { + val input = listOf(3, 2, 1) + val result = input.mapIndexed { index, value -> index * value } + assertEquals(listOf(0, 2, 2), result) + } + + @Test + fun testMapNotNull() { + val input = listOf(1, 2, 3, 4, 5) + val smallSquares = input.mapNotNull { + if (it <= 3) { + it * it + } else { + null + } + } + assertEquals(listOf(1, 4, 9), smallSquares) + } + + @Test + fun mapMapKeys() { + val inputs = mapOf("one" to 1, "two" to 2, "three" to 3) + + val uppercases = inputs.mapKeys { it.key.toUpperCase() } + assertEquals(mapOf("ONE" to 1, "TWO" to 2, "THREE" to 3), uppercases) + } + + @Test + fun mapMapValues() { + val inputs = mapOf("one" to 1, "two" to 2, "three" to 3) + + val squares = inputs.mapValues { it.value * it.value } + assertEquals(mapOf("one" to 1, "two" to 4, "three" to 9), squares) + } +} \ No newline at end of file diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ReduceUnitTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ReduceUnitTest.kt new file mode 100644 index 0000000000..6821b7cdb9 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ReduceUnitTest.kt @@ -0,0 +1,22 @@ +package com.baeldung.collections.transformations + +import org.junit.Assert.assertEquals +import org.junit.Test + +class ReduceUnitTest { + @Test + fun testJoinToStringAsReduce() { + val inputs = listOf("Jan", "Feb", "Mar", "Apr", "May") + + val result = inputs.reduce { acc, next -> "$acc, $next" } + assertEquals("Jan, Feb, Mar, Apr, May", result) + } + + @Test + fun testFoldToLength() { + val inputs = listOf("Jan", "Feb", "Mar", "Apr", "May") + + val result = inputs.fold(0) { acc, next -> acc + next.length } + assertEquals(15, result) + } +} \ No newline at end of file diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ZipUnitTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ZipUnitTest.kt new file mode 100644 index 0000000000..66aeeceef4 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/collections/transformations/ZipUnitTest.kt @@ -0,0 +1,34 @@ +package com.baeldung.collections.transformations + +import org.junit.Assert.assertEquals +import org.junit.Test + +class ZipUnitTest { + @Test + fun testZip() { + val left = listOf("one", "two", "three") + val right = listOf(1, 2, 3) + val zipped = left.zip(right) + assertEquals (listOf(Pair("one", 1), Pair("two", 2), Pair("three", 3)), zipped) + } + + @Test + fun testZipShort() { + val left = listOf("one", "two") + val right = listOf(1, 2, 3) + val zipped = left.zip(right) + assertEquals (listOf(Pair("one", 1), Pair("two", 2)), zipped) + } + + @Test + fun testUnzip() { + val left = listOf("one", "two", "three") + val right = listOf(1, 2, 3) + val zipped = left.zip(right) + + val (newLeft, newRight) = zipped.unzip() + assertEquals(left, newLeft) + assertEquals(right, newRight) + } + +} \ No newline at end of file From 2adb66df0c2fba69e84e0f8dcaa4b0993aa5de94 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 26 Mar 2020 16:02:49 +0800 Subject: [PATCH 233/530] Update README.md --- java-math-2/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/java-math-2/README.md b/java-math-2/README.md index 7c459cc576..8b13789179 100644 --- a/java-math-2/README.md +++ b/java-math-2/README.md @@ -1,3 +1 @@ -## Java Math -This module contains articles about math in Java. From 2f0fbac05e43d5ad00283998e62f0159a32719ec Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 26 Mar 2020 16:03:01 +0800 Subject: [PATCH 234/530] Delete README.md --- java-math-2/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 java-math-2/README.md diff --git a/java-math-2/README.md b/java-math-2/README.md deleted file mode 100644 index 8b13789179..0000000000 --- a/java-math-2/README.md +++ /dev/null @@ -1 +0,0 @@ - From b7ea20cf99e620a8085777a204fed81487792639 Mon Sep 17 00:00:00 2001 From: patkorek Date: Thu, 26 Mar 2020 12:02:03 +0100 Subject: [PATCH 235/530] Postman Collection to test GraphQL endpoints --- ...GraphQL collection.postman_collection.json | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json diff --git a/spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json b/spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json new file mode 100644 index 0000000000..7fcaa2c76d --- /dev/null +++ b/spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json @@ -0,0 +1,169 @@ +{ + "info": { + "_postman_id": "910d9690-f629-4491-bbbd-adb30982a386", + "name": "GraphQL collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "mutations", + "item": [ + { + "name": "writePost", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation writePost ($title: String!, $text: String!, $category: String) {\n writePost (title: $title, text: $text, category: $category) {\n id\n title\n text\n category\n }\n}", + "variables": "{\n \"title\": \"\",\n \"text\": \"\",\n \"category\": \"\"\n}" + }, + "options": { + "graphql": {} + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + } + ], + "protocolProfileBehavior": {} + }, + { + "name": "queries", + "item": [ + { + "name": "get recent posts", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "{\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n text\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}", + "variables": "" + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "recentPosts - variables", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "query recentPosts ($count: Int, $offset: Int) {\n recentPosts (count: $count, offset: $offset) {\n id\n title\n text\n category\n }\n}", + "variables": "{\n \"count\": 1,\n \"offset\": 0\n}" + }, + "options": { + "graphql": {} + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "get recent posts - raw", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/graphql", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "query {\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}" + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + } + ], + "protocolProfileBehavior": {} + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "id": "b54f267b-c450-4f2d-8105-2f23bab4c922", + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "id": "00b575be-03d4-4b29-b137-733ead139638", + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "id": "20a274e5-6d51-40d6-81cb-af9eb115b21b", + "key": "url", + "value": "", + "type": "string" + } + ], + "protocolProfileBehavior": {} +} \ No newline at end of file From 071a86a22358e40c03e17202ecb6e9cc104a78c0 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 26 Mar 2020 15:12:26 +0100 Subject: [PATCH 236/530] JAVA-1098: Add code for the Spring Boot Exit Codes --- .../spring-boot-basic-customization/README.md | 1 + .../event/ExitCodeEventDemoApplication.java | 31 +++++++++++++++++++ ...xitCodeExceptionMapperDemoApplication.java | 31 +++++++++++++++++++ .../ExitCodeGeneratorDemoApplication.java | 22 +++++++++++++ spring-boot-modules/spring-boot/README.MD | 1 - 5 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/event/ExitCodeEventDemoApplication.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exception/ExitCodeExceptionMapperDemoApplication.java create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/generator/ExitCodeGeneratorDemoApplication.java diff --git a/spring-boot-modules/spring-boot-basic-customization/README.md b/spring-boot-modules/spring-boot-basic-customization/README.md index a3d9f1b1fc..6c067fc5a1 100644 --- a/spring-boot-modules/spring-boot-basic-customization/README.md +++ b/spring-boot-modules/spring-boot-basic-customization/README.md @@ -11,3 +11,4 @@ This module contains articles about Spring Boot customization - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) - [How to Define a Spring Boot Filter?](https://www.baeldung.com/spring-boot-add-filter) - [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) + - [Spring Boot Exit Codes](https://www.baeldung.com/spring-boot-exit-codes) diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/event/ExitCodeEventDemoApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/event/ExitCodeEventDemoApplication.java new file mode 100644 index 0000000000..c28f908fb8 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/event/ExitCodeEventDemoApplication.java @@ -0,0 +1,31 @@ +package com.baeldung.exitcode.event; + +import org.springframework.boot.ExitCodeEvent; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.event.EventListener; + +@SpringBootApplication +public class ExitCodeEventDemoApplication { + + public static void main(String[] args) { + System.exit( + SpringApplication.exit( + SpringApplication.run(ExitCodeEventDemoApplication.class, args) + ) + ); + } + + @Bean + DemoListener demoListenerBean() { + return new DemoListener(); + } + + private static class DemoListener { + @EventListener + public void exitEvent(ExitCodeEvent event) { + System.out.println("Exit code: " + event.getExitCode()); + } + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exception/ExitCodeExceptionMapperDemoApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exception/ExitCodeExceptionMapperDemoApplication.java new file mode 100644 index 0000000000..44b4ff36f5 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exception/ExitCodeExceptionMapperDemoApplication.java @@ -0,0 +1,31 @@ +package com.baeldung.exitcode.exception; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.ExitCodeExceptionMapper; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +public class ExitCodeExceptionMapperDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(ExitCodeExceptionMapperDemoApplication.class, args); + } + + @Bean + CommandLineRunner createException() { + return args -> Integer.parseInt("test"); + } + + @Bean + ExitCodeExceptionMapper exitCodeToExceptionMapper() { + return exception -> { + // set exit code based on the exception type + if (exception.getCause() instanceof NumberFormatException) { + return 80; + } + return 1; + }; + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/generator/ExitCodeGeneratorDemoApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/generator/ExitCodeGeneratorDemoApplication.java new file mode 100644 index 0000000000..7f7acbe86e --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/generator/ExitCodeGeneratorDemoApplication.java @@ -0,0 +1,22 @@ +package com.baeldung.exitcode.generator; + +import org.springframework.boot.ExitCodeGenerator; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ExitCodeGeneratorDemoApplication implements ExitCodeGenerator { + + public static void main(String[] args) { + System.exit( + SpringApplication.exit( + SpringApplication.run(ExitCodeGeneratorDemoApplication.class, args) + ) + ); + } + + @Override + public int getExitCode() { + return 42; + } +} diff --git a/spring-boot-modules/spring-boot/README.MD b/spring-boot-modules/spring-boot/README.MD index b15ab7dbe5..c95fe51842 100644 --- a/spring-boot-modules/spring-boot/README.MD +++ b/spring-boot-modules/spring-boot/README.MD @@ -22,7 +22,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [An Introduction to Kong](https://www.baeldung.com/kong) - [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) - [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) -- [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) - [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) - [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) - [Validation in Spring Boot](https://www.baeldung.com/spring-boot-bean-validation) From f03374a805a914dc80da93af1fde0c09e63e8dae Mon Sep 17 00:00:00 2001 From: Konstantinos Karavitis Date: Thu, 26 Mar 2020 19:57:09 +0200 Subject: [PATCH 237/530] [BAEL-3913] Prevent Application / CommandLineRunner classes from executing during JUnit testing (#8920) * kkaravitis@gmail.com hexagonal architecture in java * Removed evaluation article code * Removed evaluation article code * [BAEL-3913] Initial commit for prevent commandline application runner execution during JUnit test article * [BAEL-3913] Fixed broken lines format and reduced the test method names length * [BAEL-3913] Fixed broken lines format --- .../spring-boot-testing/README.md | 1 + .../ApplicationCommandLineRunnerApp.java | 11 +++++ .../ApplicationRunnerTaskExecutor.java | 27 ++++++++++++ .../execution/CommandLineTaskExecutor.java | 26 +++++++++++ .../runner/execution/TaskService.java | 14 ++++++ .../LoadSpringContextIntegrationTest.java | 43 +++++++++++++++++++ .../RunApplicationIntegrationTest.java | 26 +++++++++++ ...icationWithTestProfileIntegrationTest.java | 33 ++++++++++++++ ...tionWithTestPropertiesIntegrationTest.java | 32 ++++++++++++++ 9 files changed, 213 insertions(+) create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java create mode 100644 spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-testing/README.md b/spring-boot-modules/spring-boot-testing/README.md index 882e2be766..9bbaf337d7 100644 --- a/spring-boot-modules/spring-boot-testing/README.md +++ b/spring-boot-modules/spring-boot-testing/README.md @@ -13,3 +13,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level) - [Embedded Redis Server with Spring Boot Test](https://www.baeldung.com/spring-embedded-redis) - [Testing Spring Boot @ConfigurationProperties](https://www.baeldung.com/spring-boot-testing-configurationproperties) +- [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing]() diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java new file mode 100644 index 0000000000..76e18dfd2f --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationCommandLineRunnerApp.java @@ -0,0 +1,11 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ApplicationCommandLineRunnerApp { + public static void main(String[] args) { + SpringApplication.run(ApplicationCommandLineRunnerApp.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java new file mode 100644 index 0000000000..3bf08491bf --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/ApplicationRunnerTaskExecutor.java @@ -0,0 +1,27 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Profile("!test") +@ConditionalOnProperty( + prefix = "application.runner", + value = "enabled", + havingValue = "true", + matchIfMissing = true) +@Component +public class ApplicationRunnerTaskExecutor implements ApplicationRunner { + private TaskService taskService; + + public ApplicationRunnerTaskExecutor(TaskService taskService) { + this.taskService = taskService; + } + + @Override + public void run(ApplicationArguments args) throws Exception { + taskService.execute("application runner task"); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java new file mode 100644 index 0000000000..38fd3b9c0a --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/CommandLineTaskExecutor.java @@ -0,0 +1,26 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Profile("!test") +@ConditionalOnProperty( + prefix = "command.line.runner", + value = "enabled", + havingValue = "true", + matchIfMissing = true) +@Component +public class CommandLineTaskExecutor implements CommandLineRunner { + private TaskService taskService; + + public CommandLineTaskExecutor(TaskService taskService) { + this.taskService = taskService; + } + + @Override + public void run(String... args) throws Exception { + taskService.execute("command line runner task"); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java new file mode 100644 index 0000000000..dac437e72d --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/prevent/commandline/application/runner/execution/TaskService.java @@ -0,0 +1,14 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +@Service +public class TaskService { + private static Logger logger = LoggerFactory.getLogger(TaskService.class); + + public void execute(String task) { + logger.info("do " + task); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java new file mode 100644 index 0000000000..6698094550 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/LoadSpringContextIntegrationTest.java @@ -0,0 +1,43 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.prevent.commandline.application.runner.execution.ApplicationCommandLineRunnerApp; +import com.baeldung.prevent.commandline.application.runner.execution.TaskService; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { ApplicationCommandLineRunnerApp.class }, + initializers = ConfigFileApplicationContextInitializer.class) +public class LoadSpringContextIntegrationTest { + @SpyBean + TaskService taskService; + + @SpyBean + CommandLineRunner commandLineRunner; + + @SpyBean + ApplicationRunner applicationRunner; + + @Test + void whenContextLoads_thenRunnersDoNotRun() throws Exception { + assertNotNull(taskService); + assertNotNull(commandLineRunner); + assertNotNull(applicationRunner); + + verify(taskService, times(0)).execute(any()); + verify(commandLineRunner, times(0)).run(any()); + verify(applicationRunner, times(0)).run(any()); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java new file mode 100644 index 0000000000..26a7339f1d --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationIntegrationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.SpyBean; + +import com.baeldung.prevent.commandline.application.runner.execution.ApplicationRunnerTaskExecutor; +import com.baeldung.prevent.commandline.application.runner.execution.CommandLineTaskExecutor; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@SpringBootTest +class RunApplicationIntegrationTest { + @SpyBean + ApplicationRunnerTaskExecutor applicationRunnerTaskExecutor; + @SpyBean + CommandLineTaskExecutor commandLineTaskExecutor; + + @Test + void whenContextLoads_thenRunnersRun() throws Exception { + verify(applicationRunnerTaskExecutor, times(1)).run(any()); + verify(commandLineTaskExecutor, times(1)).run(any()); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java new file mode 100644 index 0000000000..333cd2ab91 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestProfileIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ActiveProfiles; + +import com.baeldung.prevent.commandline.application.runner.execution.ApplicationRunnerTaskExecutor; +import com.baeldung.prevent.commandline.application.runner.execution.CommandLineTaskExecutor; +import com.baeldung.prevent.commandline.application.runner.execution.TaskService; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@ActiveProfiles("test") +@SpringBootTest +class RunApplicationWithTestProfileIntegrationTest { + @Autowired + private ApplicationContext context; + + @Test + void whenContextLoads_thenRunnersAreNotLoaded() { + assertNotNull(context.getBean(TaskService.class)); + assertThrows(NoSuchBeanDefinitionException.class, + () -> context.getBean(CommandLineTaskExecutor.class), + "CommandLineRunner should not be loaded during this integration test"); + assertThrows(NoSuchBeanDefinitionException.class, + () -> context.getBean(ApplicationRunnerTaskExecutor.class), + "ApplicationRunner should not be loaded during this integration test"); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java new file mode 100644 index 0000000000..264a06a41e --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/prevent/commandline/application/runner/execution/RunApplicationWithTestPropertiesIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.prevent.commandline.application.runner.execution; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; + +import com.baeldung.prevent.commandline.application.runner.execution.ApplicationRunnerTaskExecutor; +import com.baeldung.prevent.commandline.application.runner.execution.CommandLineTaskExecutor; +import com.baeldung.prevent.commandline.application.runner.execution.TaskService; + +@SpringBootTest(properties = { + "command.line.runner.enabled=false", + "application.runner.enabled=false" }) +class RunApplicationWithTestPropertiesIntegrationTest { + @Autowired + private ApplicationContext context; + + @Test + void whenContextLoads_thenRunnersAreNotLoaded() { + assertNotNull(context.getBean(TaskService.class)); + assertThrows(NoSuchBeanDefinitionException.class, + () -> context.getBean(CommandLineTaskExecutor.class), + "CommandLineRunner should not be loaded during this integration test"); + assertThrows(NoSuchBeanDefinitionException.class, + () -> context.getBean(ApplicationRunnerTaskExecutor.class), + "ApplicationRunner should not be loaded during this integration test"); + } +} From 552aef2fdfcba4993d282cdb36f262430035b543 Mon Sep 17 00:00:00 2001 From: Waldemar Date: Fri, 27 Mar 2020 20:28:39 +0100 Subject: [PATCH 238/530] BAEL-2398: rename package --- coroutines-java/pom.xml | 4 ++-- .../src/main/java/com/baeldung/introduction/App.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coroutines-java/pom.xml b/coroutines-java/pom.xml index 8d08bfdc88..3546aa5673 100644 --- a/coroutines-java/pom.xml +++ b/coroutines-java/pom.xml @@ -53,7 +53,7 @@ exec-maven-plugin 1.6.0 - com.baeldung.App + com.baeldung.introduction.App target/classes java @@ -68,7 +68,7 @@ - com.baeldung.App + com.baeldung.introduction.App diff --git a/coroutines-java/src/main/java/com/baeldung/introduction/App.java b/coroutines-java/src/main/java/com/baeldung/introduction/App.java index 09157b1566..f915464973 100644 --- a/coroutines-java/src/main/java/com/baeldung/introduction/App.java +++ b/coroutines-java/src/main/java/com/baeldung/introduction/App.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.introduction; import co.paralleluniverse.fibers.Fiber; From c2c26425aa4ed5ea5b17d1f8fd489d1999080471 Mon Sep 17 00:00:00 2001 From: Donato Rimenti Date: Mon, 23 Mar 2020 14:17:54 +0100 Subject: [PATCH 239/530] [JAVA-969] Added JCenter repository for missing springfox dependency --- spring-boot-modules/spring-boot-mvc-2/pom.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-mvc-2/pom.xml b/spring-boot-modules/spring-boot-mvc-2/pom.xml index edebd41986..b6d145c101 100644 --- a/spring-boot-modules/spring-boot-mvc-2/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-2/pom.xml @@ -79,7 +79,11 @@ Spring Milestones https://repo.spring.io/milestone - + + jcenter-snapshots + jcenter + http://oss.jfrog.org/artifactory/oss-snapshot-local/ + From 23153cf01c005f2033518054cb08cb7cddb78007 Mon Sep 17 00:00:00 2001 From: mthomas Date: Sat, 28 Mar 2020 04:58:57 -0500 Subject: [PATCH 240/530] BAEL-3860 - Add model class and test for AtomicStampedReference --- .../concurrent/atomic/SafeAccount.java | 34 +++++++++++++++++++ .../atomic/ThreadSafeAccountTest.java | 21 ++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java create mode 100644 core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java new file mode 100644 index 0000000000..febfd481c3 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java @@ -0,0 +1,34 @@ +package com.baeldung.concurrent.atomic; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicStampedReference; + +public class SafeAccount { + + AtomicInteger stamp = new AtomicInteger(0); + AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); + + public int getBalance() { + return this.balance.get(new int[1]); + } + + public int getStamp() { + int[] stamps = new int[1]; + this.balance.get(stamps); + return stamps[0]; + } + + public boolean deposit(int funds) { + int[] stamps = new int[1]; + int current = this.balance.get(stamps); + int newStamp = this.stamp.incrementAndGet(); + return this.balance.compareAndSet(current, current + funds, stamps[0], newStamp); + } + + public boolean withdrawal(int funds) { + int[] stamps = new int[1]; + int current = this.balance.get(stamps); + int newStamp = this.stamp.incrementAndGet(); + return this.balance.compareAndSet(current, current - funds, stamps[0], newStamp); + } +} diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java b/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java new file mode 100644 index 0000000000..b9a5fe7773 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java @@ -0,0 +1,21 @@ +package com.baeldung.concurrent.atomic; + +import org.junit.Assert; +import org.junit.Test; + +public class ThreadSafeAccountTest { + + @Test + public void givenMultiThread_whenSafeAccountSetBalance() throws InterruptedException { + SafeAccount account = new SafeAccount(); + Thread t = new Thread(() -> { + while (!account.withdrawal(100)) + Thread.yield(); + }); + t.start(); + Assert.assertTrue(account.deposit(100)); + t.join(1_000); + Assert.assertFalse(t.isAlive()); + Assert.assertSame(0, account.getBalance()); + } +} From 106d35c490beb67f1824f8a647c20184afe895c6 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 28 Mar 2020 15:44:15 +0530 Subject: [PATCH 241/530] JAVA-624: Added new module java-collections-maps-3 --- .../java/com/baeldung/map/compare/HashMapComparisonUnitTest.java | 0 .../com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {java-collections-maps => java-collections-maps-3}/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java (100%) rename {java-collections-maps-2 => java-collections-maps-3}/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java (100%) diff --git a/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java similarity index 100% rename from java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java rename to java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java similarity index 100% rename from java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java rename to java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java From 7dad227d93262d53733437de31ace468ab096299 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 28 Mar 2020 15:46:17 +0530 Subject: [PATCH 242/530] JAVA-624: Updated READMEs and pom for new module --- java-collections-maps-2/README.md | 3 +-- java-collections-maps-3/README.md | 8 ++++++++ java-collections-maps-3/pom.xml | 26 ++++++++++++++++++++++++++ java-collections-maps/README.md | 3 +-- 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 java-collections-maps-3/README.md create mode 100644 java-collections-maps-3/pom.xml diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md index 8b33276f56..71c6a3f32b 100644 --- a/java-collections-maps-2/README.md +++ b/java-collections-maps-2/README.md @@ -13,5 +13,4 @@ This module contains articles about Map data structures in Java. - [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) - [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) -- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) -- More articles: [[<-- prev>]](/../java-collections-maps) +- More articles: [[<-- prev>]](/java-collections-maps) [[next -->]](/java-collections-maps-3) diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md new file mode 100644 index 0000000000..8f185f6ad4 --- /dev/null +++ b/java-collections-maps-3/README.md @@ -0,0 +1,8 @@ +## Java Collections Cookbooks and Examples + +This module contains articles about Map data structures in Java. + +### Relevant Articles: +- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) +- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) +- More articles: [[<-- prev>]](/java-collections-maps-2) diff --git a/java-collections-maps-3/pom.xml b/java-collections-maps-3/pom.xml new file mode 100644 index 0000000000..30b0d01528 --- /dev/null +++ b/java-collections-maps-3/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + java-collections-maps-3 + 0.1.0-SNAPSHOT + java-collections-maps-3 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + + + + + + + \ No newline at end of file diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md index dfd0d47dbc..8fa6fa32fa 100644 --- a/java-collections-maps/README.md +++ b/java-collections-maps/README.md @@ -10,8 +10,7 @@ This module contains articles about Map data structures in Java. - [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys) - [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value) - [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists) -- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) - [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) - [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map) - [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap-advanced) -- More articles: [[next -->]](/../java-collections-maps-2) +- More articles: [[next -->]](/java-collections-maps-2) From 7084709cd365a91d0eedf3ef2965ea5bcbda759f Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 28 Mar 2020 15:46:52 +0530 Subject: [PATCH 243/530] JAVA-624: Added new module java-collections-maps-3 to main pom --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 04a2ce054c..17cba6a494 100644 --- a/pom.xml +++ b/pom.xml @@ -456,6 +456,7 @@ java-collections-conversions-2 java-collections-maps java-collections-maps-2 + java-collections-maps-3 javafx @@ -967,6 +968,7 @@ java-collections-conversions-2 java-collections-maps java-collections-maps-2 + java-collections-maps-3 javafx From c18d09cd33c44bfe7fbd739d98ba0fb341b569cc Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 28 Mar 2020 16:48:04 +0530 Subject: [PATCH 244/530] JAVA-623: Moved 3 articles from core-java-security to security-2 --- .../core-java-security/README.md | 5 +- core-java-modules/core-java-security/pom.xml | 15 -- .../baeldung/hashing/DigestAlgorithms.java | 9 -- .../baeldung/hashing/Keccak256Hashing.java | 30 ---- .../com/baeldung/hashing/SHA256Hashing.java | 39 ----- .../com/baeldung/hashing/SHA3Hashing.java | 45 ------ .../com/baeldung/hashing/SHACommonUtils.java | 16 -- .../passwordhashing/PBKDF2Hasher.java | 149 ------------------ .../passwordhashing/SHA512Hasher.java | 35 ---- .../passwordhashing/SimplePBKDF2Hasher.java | 18 --- .../hashing/Keccak256HashingUnitTest.java | 22 --- .../hashing/SHA256HashingUnitTest.java | 35 ---- .../baeldung/hashing/SHA3HashingUnitTest.java | 38 ----- .../baeldung/java/md5/JavaMD5UnitTest.java | 75 --------- .../passwordhashing/PBKDF2HasherUnitTest.java | 41 ----- .../passwordhashing/SHA512HasherUnitTest.java | 70 -------- .../src/test/resources/test_md5.txt | 1 - 17 files changed, 2 insertions(+), 641 deletions(-) delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java delete mode 100644 core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java delete mode 100644 core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java delete mode 100644 core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java delete mode 100644 core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java delete mode 100644 core-java-modules/core-java-security/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java delete mode 100644 core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java delete mode 100644 core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java delete mode 100644 core-java-modules/core-java-security/src/test/resources/test_md5.txt diff --git a/core-java-modules/core-java-security/README.md b/core-java-modules/core-java-security/README.md index ff9b1eef14..83b12793b5 100644 --- a/core-java-modules/core-java-security/README.md +++ b/core-java-modules/core-java-security/README.md @@ -3,17 +3,16 @@ This module contains articles about core Java Security ### Relevant Articles: -- [MD5 Hashing in Java](http://www.baeldung.com/java-md5) + - [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) - [Introduction to SSL in Java](http://www.baeldung.com/java-ssl) - [Java KeyStore API](http://www.baeldung.com/java-keystore) - [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream) -- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) -- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) - [Enabling TLS v1.2 in Java 7](https://www.baeldung.com/java-7-tls-v12) - [The Java SecureRandom Class](https://www.baeldung.com/java-secure-random) - [An Introduction to Java SASL](https://www.baeldung.com/java-sasl) - [A Guide to Java GSS API](https://www.baeldung.com/java-gss) - [Intro to the Java SecurityManager](https://www.baeldung.com/java-security-manager) +- More articles: [[next -->]](/core-java-modules/core-java-security-2) diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml index a46c2e2d40..96024a73a1 100644 --- a/core-java-modules/core-java-security/pom.xml +++ b/core-java-modules/core-java-security/pom.xml @@ -24,24 +24,9 @@ ${assertj-core.version} test - - - commons-codec - commons-codec - ${commons-codec.version} - - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - - - 1.60 - 1.11 - 3.10.0 diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java deleted file mode 100644 index 94dd22ff4b..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.hashing; - -public class DigestAlgorithms { - - public static final String SHA3_256 = "SHA3-256"; - public static final String SHA_256 = "SHA-256"; - public static final String KECCAK_256 = "Keccak-256"; - -} diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java deleted file mode 100644 index 19fc4cf059..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.hashing; - -import org.bouncycastle.jcajce.provider.digest.Keccak; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.util.encoders.Hex; - -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.Security; - -import static com.baeldung.hashing.DigestAlgorithms.KECCAK_256; -import static com.baeldung.hashing.SHACommonUtils.bytesToHex; - -public class Keccak256Hashing { - - public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException { - Security.addProvider(new BouncyCastleProvider()); - final MessageDigest digest = MessageDigest.getInstance(KECCAK_256); - final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); - return bytesToHex(encodedhash); - } - - public static String hashWithBouncyCastle(final String originalString) { - Keccak.Digest256 digest256 = new Keccak.Digest256(); - byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8)); - return new String(Hex.encode(hashbytes)); - } - -} diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java deleted file mode 100644 index ec008cebab..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.hashing; - -import com.google.common.hash.Hashing; -import org.apache.commons.codec.digest.DigestUtils; -import org.bouncycastle.util.encoders.Hex; - -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import static com.baeldung.hashing.DigestAlgorithms.SHA_256; -import static com.baeldung.hashing.SHACommonUtils.bytesToHex; - -public class SHA256Hashing { - - public static String HashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException { - final MessageDigest digest = MessageDigest.getInstance(SHA_256); - final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); - return bytesToHex(encodedhash); - } - - public static String hashWithGuava(final String originalString) { - final String sha256hex = Hashing.sha256().hashString(originalString, StandardCharsets.UTF_8).toString(); - return sha256hex; - } - - public static String HashWithApacheCommons(final String originalString) { - final String sha256hex = DigestUtils.sha256Hex(originalString); - return sha256hex; - } - - public static String HashWithBouncyCastle(final String originalString) throws NoSuchAlgorithmException { - final MessageDigest digest = MessageDigest.getInstance(SHA_256); - final byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); - final String sha256hex = new String(Hex.encode(hash)); - return sha256hex; - } - -} diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java deleted file mode 100644 index eb363205b1..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.hashing; - -import com.google.common.hash.Hashing; -import org.apache.commons.codec.digest.DigestUtils; -import org.bouncycastle.crypto.digests.SHA3Digest; -import org.bouncycastle.jcajce.provider.digest.SHA3; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.util.encoders.Hex; - -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.Security; - -import static com.baeldung.hashing.DigestAlgorithms.SHA3_256; -import static com.baeldung.hashing.SHACommonUtils.bytesToHex; - -public class SHA3Hashing { - - /* works with JDK9+ only */ - public static String hashWithJavaMessageDigestJDK9(final String originalString) throws NoSuchAlgorithmException { - final MessageDigest digest = MessageDigest.getInstance(SHA3_256); - final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); - return bytesToHex(hashbytes); - } - - public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException { - Security.addProvider(new BouncyCastleProvider()); - final MessageDigest digest = MessageDigest.getInstance(SHA3_256); - final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); - return bytesToHex(hashbytes); - } - - /* works with JDK9+ only */ - public static String hashWithApacheCommonsJDK9(final String originalString) { - return new DigestUtils(SHA3_256).digestAsHex(originalString); - } - - public static String hashWithBouncyCastle(final String originalString) { - SHA3.Digest256 digest256 = new SHA3.Digest256(); - byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8)); - return new String(Hex.encode(hashbytes)); - } - -} diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java deleted file mode 100644 index 0f28408083..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.hashing; - -class SHACommonUtils { - - public static String bytesToHex(byte[] hash) { - StringBuffer hexString = new StringBuffer(); - for (byte h : hash) { - String hex = Integer.toHexString(0xff & h); - if (hex.length() == 1) - hexString.append('0'); - hexString.append(hex); - } - return hexString.toString(); - } - -} diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java deleted file mode 100644 index e2259e4249..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.baeldung.passwordhashing; - -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.KeySpec; -import java.util.Arrays; -import java.util.Base64; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEKeySpec; - -/** - * Hash passwords for storage, and test passwords against password tokens. - * - * Instances of this class can be used concurrently by multiple threads. - * - * @author erickson - * @see StackOverflow - */ -public final class PBKDF2Hasher -{ - - /** - * Each token produced by this class uses this identifier as a prefix. - */ - public static final String ID = "$31$"; - - /** - * The minimum recommended cost, used by default - */ - public static final int DEFAULT_COST = 16; - - private static final String ALGORITHM = "PBKDF2WithHmacSHA1"; - - private static final int SIZE = 128; - - private static final Pattern layout = Pattern.compile("\\$31\\$(\\d\\d?)\\$(.{43})"); - - private final SecureRandom random; - - private final int cost; - - public PBKDF2Hasher() - { - this(DEFAULT_COST); - } - - /** - * Create a password manager with a specified cost - * - * @param cost the exponential computational cost of hashing a password, 0 to 30 - */ - public PBKDF2Hasher(int cost) - { - iterations(cost); /* Validate cost */ - this.cost = cost; - this.random = new SecureRandom(); - } - - private static int iterations(int cost) - { - if ((cost < 0) || (cost > 30)) - throw new IllegalArgumentException("cost: " + cost); - return 1 << cost; - } - - /** - * Hash a password for storage. - * - * @return a secure authentication token to be stored for later authentication - */ - public String hash(char[] password) - { - byte[] salt = new byte[SIZE / 8]; - random.nextBytes(salt); - byte[] dk = pbkdf2(password, salt, 1 << cost); - byte[] hash = new byte[salt.length + dk.length]; - System.arraycopy(salt, 0, hash, 0, salt.length); - System.arraycopy(dk, 0, hash, salt.length, dk.length); - Base64.Encoder enc = Base64.getUrlEncoder().withoutPadding(); - return ID + cost + '$' + enc.encodeToString(hash); - } - - /** - * Authenticate with a password and a stored password token. - * - * @return true if the password and token match - */ - public boolean checkPassword(char[] password, String token) - { - Matcher m = layout.matcher(token); - if (!m.matches()) - throw new IllegalArgumentException("Invalid token format"); - int iterations = iterations(Integer.parseInt(m.group(1))); - byte[] hash = Base64.getUrlDecoder().decode(m.group(2)); - byte[] salt = Arrays.copyOfRange(hash, 0, SIZE / 8); - byte[] check = pbkdf2(password, salt, iterations); - int zero = 0; - for (int idx = 0; idx < check.length; ++idx) - zero |= hash[salt.length + idx] ^ check[idx]; - return zero == 0; - } - - private static byte[] pbkdf2(char[] password, byte[] salt, int iterations) - { - KeySpec spec = new PBEKeySpec(password, salt, iterations, SIZE); - try { - SecretKeyFactory f = SecretKeyFactory.getInstance(ALGORITHM); - return f.generateSecret(spec).getEncoded(); - } - catch (NoSuchAlgorithmException ex) { - throw new IllegalStateException("Missing algorithm: " + ALGORITHM, ex); - } - catch (InvalidKeySpecException ex) { - throw new IllegalStateException("Invalid SecretKeyFactory", ex); - } - } - - /** - * Hash a password in an immutable {@code String}. - * - *

Passwords should be stored in a {@code char[]} so that it can be filled - * with zeros after use instead of lingering on the heap and elsewhere. - * - * @deprecated Use {@link #hash(char[])} instead - */ - @Deprecated - public String hash(String password) - { - return hash(password.toCharArray()); - } - - /** - * Authenticate with a password in an immutable {@code String} and a stored - * password token. - * - * @deprecated Use {@link #checkPassword(char[],String)} instead. - * @see #hash(String) - */ - @Deprecated - public boolean checkPassword(String password, String token) - { - return checkPassword(password.toCharArray(), token); - } - -} diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java deleted file mode 100644 index 4f5337f963..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.passwordhashing; - -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - - -/** A really simple SHA_512 Encryption example. - * - */ -public class SHA512Hasher { - - public String hash(String passwordToHash, byte[] salt){ - String generatedPassword = null; - try { - MessageDigest md = MessageDigest.getInstance("SHA-512"); - md.update(salt); - byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8)); - StringBuilder sb = new StringBuilder(); - for(int i=0; i< bytes.length ;i++){ - sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); - } - generatedPassword = sb.toString(); - } - catch (NoSuchAlgorithmException e){ - e.printStackTrace(); - } - return generatedPassword; - } - - public boolean checkPassword(String hash, String attempt, byte[] salt){ - String generatedHash = hash(attempt, salt); - return hash.equals(generatedHash); - } -} diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java deleted file mode 100644 index 36c9b65070..0000000000 --- a/core-java-modules/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.passwordhashing; - -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEKeySpec; -import java.security.spec.KeySpec; - -/** A really simple SimplePBKDF2 Encryption example. - * - */ -public class SimplePBKDF2Hasher { - - public static String hashSimple(String password, byte[] salt) throws Exception{ - KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128); - SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); - byte[] hash = f.generateSecret(spec).getEncoded(); - return String.valueOf(hash); - } -} diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java deleted file mode 100644 index 9ed35c8834..0000000000 --- a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.hashing; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class Keccak256HashingUnitTest { - - private static String originalValue = "abc123"; - private static String hashedValue = "719accc61a9cc126830e5906f9d672d06eab6f8597287095a2c55a8b775e7016"; - - @Test public void testHashWithJavaMessageDigest() throws Exception { - final String currentHashedValue = Keccak256Hashing.hashWithJavaMessageDigest(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - - @Test public void testHashWithBouncyCastle() { - final String currentHashedValue = Keccak256Hashing.hashWithBouncyCastle(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - -} diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java deleted file mode 100644 index 6bc9ad2cc6..0000000000 --- a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.hashing; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class SHA256HashingUnitTest { - - private static String originalValue = "abc123"; - private static String hashedValue = "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090"; - - @Test - public void testHashWithJavaMessageDigest() throws Exception { - final String currentHashedValue = SHA256Hashing.HashWithJavaMessageDigest(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - - @Test - public void testHashWithGuava() throws Exception { - final String currentHashedValue = SHA256Hashing.hashWithGuava(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - - @Test - public void testHashWithApacheCommans() throws Exception { - final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - - @Test - public void testHashWithBouncyCastle() throws Exception { - final String currentHashedValue = SHA256Hashing.HashWithBouncyCastle(originalValue); - assertEquals(hashedValue, currentHashedValue); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java deleted file mode 100644 index fffab96405..0000000000 --- a/core-java-modules/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.hashing; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class SHA3HashingUnitTest { - - private static String originalValue = "abc123"; - private static String hashedValue = "f58fa3df820114f56e1544354379820cff464c9c41cb3ca0ad0b0843c9bb67ee"; - - /* works with JDK9+ only */ - //@Test - public void testHashWithJavaMessageDigestJDK9() throws Exception { - final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigestJDK9(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - - @Test - public void testHashWithJavaMessageDigest() throws Exception { - final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigest(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - - /* works with JDK9+ only */ - //@Test - public void testHashWithApacheCommonsJDK9() { - final String currentHashedValue = SHA3Hashing.hashWithApacheCommonsJDK9(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - - @Test - public void testHashWithBouncyCastle() { - final String currentHashedValue = SHA3Hashing.hashWithBouncyCastle(originalValue); - assertEquals(hashedValue, currentHashedValue); - } - -} diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java deleted file mode 100644 index 67d6918c09..0000000000 --- a/core-java-modules/core-java-security/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.baeldung.java.md5; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import javax.xml.bind.DatatypeConverter; - -import org.apache.commons.codec.digest.DigestUtils; -import org.junit.Test; - -import com.google.common.hash.HashCode; -import com.google.common.hash.Hashing; - -public class JavaMD5UnitTest { - - String filename = "src/test/resources/test_md5.txt"; - String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; - - String hash = "35454B055CC325EA1AF2126E27707052"; - String password = "ILoveJava"; - - @Test - public void givenPassword_whenHashing_thenVerifying() throws NoSuchAlgorithmException { - String hash = "35454B055CC325EA1AF2126E27707052"; - String password = "ILoveJava"; - - MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(password.getBytes()); - byte[] digest = md.digest(); - String myHash = DatatypeConverter.printHexBinary(digest).toUpperCase(); - - assertThat(myHash.equals(hash)).isTrue(); - } - - @Test - public void givenFile_generatingChecksum_thenVerifying() throws NoSuchAlgorithmException, IOException { - String filename = "src/test/resources/test_md5.txt"; - String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; - - MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(Files.readAllBytes(Paths.get(filename))); - byte[] digest = md.digest(); - String myChecksum = DatatypeConverter.printHexBinary(digest).toUpperCase(); - - assertThat(myChecksum.equals(checksum)).isTrue(); - } - - @Test - public void givenPassword_whenHashingUsingCommons_thenVerifying() { - String hash = "35454B055CC325EA1AF2126E27707052"; - String password = "ILoveJava"; - - String md5Hex = DigestUtils.md5Hex(password).toUpperCase(); - - assertThat(md5Hex.equals(hash)).isTrue(); - } - - @Test - public void givenFile_whenChecksumUsingGuava_thenVerifying() throws IOException { - String filename = "src/test/resources/test_md5.txt"; - String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; - - HashCode hash = com.google.common.io.Files.hash(new File(filename), Hashing.md5()); - String myChecksum = hash.toString().toUpperCase(); - - assertThat(myChecksum.equals(checksum)).isTrue(); - } - -} diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java deleted file mode 100644 index 8e90725c77..0000000000 --- a/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.passwordhashing; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.*; - - -public class PBKDF2HasherUnitTest { - - private PBKDF2Hasher mPBKDF2Hasher; - - @Before - public void setUp() throws Exception { - mPBKDF2Hasher = new PBKDF2Hasher(); - } - - @Test - public void givenCorrectMessageAndHash_whenAuthenticated_checkAuthenticationSucceeds() throws Exception { - String message1 = "password123"; - - String hash1 = mPBKDF2Hasher.hash(message1.toCharArray()); - - assertTrue(mPBKDF2Hasher.checkPassword(message1.toCharArray(), hash1)); - - } - - @Test - public void givenWrongMessage_whenAuthenticated_checkAuthenticationFails() throws Exception { - String message1 = "password123"; - - String hash1 = mPBKDF2Hasher.hash(message1.toCharArray()); - - String wrongPasswordAttempt = "IamWrong"; - - assertFalse(mPBKDF2Hasher.checkPassword(wrongPasswordAttempt.toCharArray(), hash1)); - - } - - -} \ No newline at end of file diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java deleted file mode 100644 index 3acfb0ba9d..0000000000 --- a/core-java-modules/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.baeldung.passwordhashing; - -import org.junit.Before; -import org.junit.Test; - -import java.security.SecureRandom; - -import static org.junit.Assert.*; - -/** - * Created by PhysicsSam on 06-Sep-18. - */ -public class SHA512HasherUnitTest { - - private SHA512Hasher hasher; - private SecureRandom secureRandom; - - @Before - public void setUp() throws Exception { - hasher = new SHA512Hasher(); - secureRandom = new SecureRandom(); - } - - @Test - public void givenSamePasswordAndSalt_whenHashed_checkResultingHashesAreEqual() throws Exception { - - byte[] salt = new byte[16]; - secureRandom.nextBytes(salt); - - String hash1 = hasher.hash("password", salt); - String hash2 = hasher.hash("password", salt); - - assertEquals(hash1, hash2); - - } - - @Test - public void givenSamePasswordAndDifferentSalt_whenHashed_checkResultingHashesNotEqual() throws Exception { - - byte[] salt = new byte[16]; - secureRandom.nextBytes(salt); - String hash1 = hasher.hash("password", salt); - //generate a second salt - byte[] secondSalt = new byte[16]; - String hash2 = hasher.hash("password", secondSalt); - - assertNotEquals(hash1, hash2); - - } - - @Test - public void givenPredefinedHash_whenCorrectAttemptGiven_checkAuthenticationSucceeds() throws Exception { - byte[] salt = new byte[16]; - secureRandom.nextBytes(salt); - - String originalHash = hasher.hash("password123", salt); - - assertTrue(hasher.checkPassword(originalHash, "password123", salt)); - } - - @Test - public void givenPredefinedHash_whenIncorrectAttemptGiven_checkAuthenticationFails() throws Exception { - byte[] salt = new byte[16]; - secureRandom.nextBytes(salt); - - String originalHash = hasher.hash("password123", salt); - - assertFalse(hasher.checkPassword(originalHash, "password124", salt)); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-security/src/test/resources/test_md5.txt b/core-java-modules/core-java-security/src/test/resources/test_md5.txt deleted file mode 100644 index 95d09f2b10..0000000000 --- a/core-java-modules/core-java-security/src/test/resources/test_md5.txt +++ /dev/null @@ -1 +0,0 @@ -hello world \ No newline at end of file From e2b6b4bc924f860cd2ab7d77ed17ad8e2d969b15 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 28 Mar 2020 16:48:43 +0530 Subject: [PATCH 245/530] JAVA-623: Moved 3 articles to core-java-security-2 --- .../core-java-security-2/README.md | 8 + .../core-java-security-2/pom.xml | 30 ++++ .../baeldung/hashing/DigestAlgorithms.java | 9 ++ .../baeldung/hashing/Keccak256Hashing.java | 30 ++++ .../com/baeldung/hashing/SHA256Hashing.java | 39 +++++ .../com/baeldung/hashing/SHA3Hashing.java | 45 ++++++ .../com/baeldung/hashing/SHACommonUtils.java | 16 ++ .../passwordhashing/PBKDF2Hasher.java | 149 ++++++++++++++++++ .../passwordhashing/SHA512Hasher.java | 35 ++++ .../passwordhashing/SimplePBKDF2Hasher.java | 18 +++ .../hashing/Keccak256HashingUnitTest.java | 22 +++ .../hashing/SHA256HashingUnitTest.java | 35 ++++ .../baeldung/hashing/SHA3HashingUnitTest.java | 38 +++++ .../baeldung/java/md5/JavaMD5UnitTest.java | 75 +++++++++ .../passwordhashing/PBKDF2HasherUnitTest.java | 41 +++++ .../passwordhashing/SHA512HasherUnitTest.java | 70 ++++++++ .../src/test/resources/test_md5.txt | 1 + 17 files changed, 661 insertions(+) create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/DigestAlgorithms.java create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/Keccak256Hashing.java create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA256Hashing.java create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA3Hashing.java create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHACommonUtils.java create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java create mode 100644 core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java create mode 100644 core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java create mode 100644 core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java create mode 100644 core-java-modules/core-java-security-2/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java create mode 100644 core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java create mode 100644 core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java create mode 100644 core-java-modules/core-java-security-2/src/test/resources/test_md5.txt diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md index c250e24078..2eb21fb77e 100644 --- a/core-java-modules/core-java-security-2/README.md +++ b/core-java-modules/core-java-security-2/README.md @@ -1,3 +1,11 @@ +## Core Java Security + +This module contains articles about core Java Security + ### Relevant Articles: - [Guide To The Java Authentication And Authorization Service (JAAS)](https://www.baeldung.com/java-authentication-authorization-service) +- [MD5 Hashing in Java](http://www.baeldung.com/java-md5) +- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) +- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) +- More articles: [[<-- prev]](/core-java-modules/core-java-security) diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml index 23f0c5aab9..9315ab4af2 100644 --- a/core-java-modules/core-java-security-2/pom.xml +++ b/core-java-modules/core-java-security-2/pom.xml @@ -16,4 +16,34 @@ ../../parent-java + + + commons-codec + commons-codec + ${commons-codec.version} + + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + + 1.60 + 1.11 + + + 3.10.0 + diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/DigestAlgorithms.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/DigestAlgorithms.java new file mode 100644 index 0000000000..94dd22ff4b --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/DigestAlgorithms.java @@ -0,0 +1,9 @@ +package com.baeldung.hashing; + +public class DigestAlgorithms { + + public static final String SHA3_256 = "SHA3-256"; + public static final String SHA_256 = "SHA-256"; + public static final String KECCAK_256 = "Keccak-256"; + +} diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/Keccak256Hashing.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/Keccak256Hashing.java new file mode 100644 index 0000000000..19fc4cf059 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/Keccak256Hashing.java @@ -0,0 +1,30 @@ +package com.baeldung.hashing; + +import org.bouncycastle.jcajce.provider.digest.Keccak; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.util.encoders.Hex; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.Security; + +import static com.baeldung.hashing.DigestAlgorithms.KECCAK_256; +import static com.baeldung.hashing.SHACommonUtils.bytesToHex; + +public class Keccak256Hashing { + + public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException { + Security.addProvider(new BouncyCastleProvider()); + final MessageDigest digest = MessageDigest.getInstance(KECCAK_256); + final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(encodedhash); + } + + public static String hashWithBouncyCastle(final String originalString) { + Keccak.Digest256 digest256 = new Keccak.Digest256(); + byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8)); + return new String(Hex.encode(hashbytes)); + } + +} diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA256Hashing.java new file mode 100644 index 0000000000..ec008cebab --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA256Hashing.java @@ -0,0 +1,39 @@ +package com.baeldung.hashing; + +import com.google.common.hash.Hashing; +import org.apache.commons.codec.digest.DigestUtils; +import org.bouncycastle.util.encoders.Hex; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import static com.baeldung.hashing.DigestAlgorithms.SHA_256; +import static com.baeldung.hashing.SHACommonUtils.bytesToHex; + +public class SHA256Hashing { + + public static String HashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException { + final MessageDigest digest = MessageDigest.getInstance(SHA_256); + final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(encodedhash); + } + + public static String hashWithGuava(final String originalString) { + final String sha256hex = Hashing.sha256().hashString(originalString, StandardCharsets.UTF_8).toString(); + return sha256hex; + } + + public static String HashWithApacheCommons(final String originalString) { + final String sha256hex = DigestUtils.sha256Hex(originalString); + return sha256hex; + } + + public static String HashWithBouncyCastle(final String originalString) throws NoSuchAlgorithmException { + final MessageDigest digest = MessageDigest.getInstance(SHA_256); + final byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); + final String sha256hex = new String(Hex.encode(hash)); + return sha256hex; + } + +} diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA3Hashing.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA3Hashing.java new file mode 100644 index 0000000000..eb363205b1 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHA3Hashing.java @@ -0,0 +1,45 @@ +package com.baeldung.hashing; + +import com.google.common.hash.Hashing; +import org.apache.commons.codec.digest.DigestUtils; +import org.bouncycastle.crypto.digests.SHA3Digest; +import org.bouncycastle.jcajce.provider.digest.SHA3; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.util.encoders.Hex; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.Security; + +import static com.baeldung.hashing.DigestAlgorithms.SHA3_256; +import static com.baeldung.hashing.SHACommonUtils.bytesToHex; + +public class SHA3Hashing { + + /* works with JDK9+ only */ + public static String hashWithJavaMessageDigestJDK9(final String originalString) throws NoSuchAlgorithmException { + final MessageDigest digest = MessageDigest.getInstance(SHA3_256); + final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(hashbytes); + } + + public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException { + Security.addProvider(new BouncyCastleProvider()); + final MessageDigest digest = MessageDigest.getInstance(SHA3_256); + final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(hashbytes); + } + + /* works with JDK9+ only */ + public static String hashWithApacheCommonsJDK9(final String originalString) { + return new DigestUtils(SHA3_256).digestAsHex(originalString); + } + + public static String hashWithBouncyCastle(final String originalString) { + SHA3.Digest256 digest256 = new SHA3.Digest256(); + byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8)); + return new String(Hex.encode(hashbytes)); + } + +} diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHACommonUtils.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHACommonUtils.java new file mode 100644 index 0000000000..0f28408083 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/hashing/SHACommonUtils.java @@ -0,0 +1,16 @@ +package com.baeldung.hashing; + +class SHACommonUtils { + + public static String bytesToHex(byte[] hash) { + StringBuffer hexString = new StringBuffer(); + for (byte h : hash) { + String hex = Integer.toHexString(0xff & h); + if (hex.length() == 1) + hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } + +} diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java new file mode 100644 index 0000000000..e2259e4249 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java @@ -0,0 +1,149 @@ +package com.baeldung.passwordhashing; + +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; +import java.util.Arrays; +import java.util.Base64; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; + +/** + * Hash passwords for storage, and test passwords against password tokens. + * + * Instances of this class can be used concurrently by multiple threads. + * + * @author erickson + * @see StackOverflow + */ +public final class PBKDF2Hasher +{ + + /** + * Each token produced by this class uses this identifier as a prefix. + */ + public static final String ID = "$31$"; + + /** + * The minimum recommended cost, used by default + */ + public static final int DEFAULT_COST = 16; + + private static final String ALGORITHM = "PBKDF2WithHmacSHA1"; + + private static final int SIZE = 128; + + private static final Pattern layout = Pattern.compile("\\$31\\$(\\d\\d?)\\$(.{43})"); + + private final SecureRandom random; + + private final int cost; + + public PBKDF2Hasher() + { + this(DEFAULT_COST); + } + + /** + * Create a password manager with a specified cost + * + * @param cost the exponential computational cost of hashing a password, 0 to 30 + */ + public PBKDF2Hasher(int cost) + { + iterations(cost); /* Validate cost */ + this.cost = cost; + this.random = new SecureRandom(); + } + + private static int iterations(int cost) + { + if ((cost < 0) || (cost > 30)) + throw new IllegalArgumentException("cost: " + cost); + return 1 << cost; + } + + /** + * Hash a password for storage. + * + * @return a secure authentication token to be stored for later authentication + */ + public String hash(char[] password) + { + byte[] salt = new byte[SIZE / 8]; + random.nextBytes(salt); + byte[] dk = pbkdf2(password, salt, 1 << cost); + byte[] hash = new byte[salt.length + dk.length]; + System.arraycopy(salt, 0, hash, 0, salt.length); + System.arraycopy(dk, 0, hash, salt.length, dk.length); + Base64.Encoder enc = Base64.getUrlEncoder().withoutPadding(); + return ID + cost + '$' + enc.encodeToString(hash); + } + + /** + * Authenticate with a password and a stored password token. + * + * @return true if the password and token match + */ + public boolean checkPassword(char[] password, String token) + { + Matcher m = layout.matcher(token); + if (!m.matches()) + throw new IllegalArgumentException("Invalid token format"); + int iterations = iterations(Integer.parseInt(m.group(1))); + byte[] hash = Base64.getUrlDecoder().decode(m.group(2)); + byte[] salt = Arrays.copyOfRange(hash, 0, SIZE / 8); + byte[] check = pbkdf2(password, salt, iterations); + int zero = 0; + for (int idx = 0; idx < check.length; ++idx) + zero |= hash[salt.length + idx] ^ check[idx]; + return zero == 0; + } + + private static byte[] pbkdf2(char[] password, byte[] salt, int iterations) + { + KeySpec spec = new PBEKeySpec(password, salt, iterations, SIZE); + try { + SecretKeyFactory f = SecretKeyFactory.getInstance(ALGORITHM); + return f.generateSecret(spec).getEncoded(); + } + catch (NoSuchAlgorithmException ex) { + throw new IllegalStateException("Missing algorithm: " + ALGORITHM, ex); + } + catch (InvalidKeySpecException ex) { + throw new IllegalStateException("Invalid SecretKeyFactory", ex); + } + } + + /** + * Hash a password in an immutable {@code String}. + * + *

Passwords should be stored in a {@code char[]} so that it can be filled + * with zeros after use instead of lingering on the heap and elsewhere. + * + * @deprecated Use {@link #hash(char[])} instead + */ + @Deprecated + public String hash(String password) + { + return hash(password.toCharArray()); + } + + /** + * Authenticate with a password in an immutable {@code String} and a stored + * password token. + * + * @deprecated Use {@link #checkPassword(char[],String)} instead. + * @see #hash(String) + */ + @Deprecated + public boolean checkPassword(String password, String token) + { + return checkPassword(password.toCharArray(), token); + } + +} diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java new file mode 100644 index 0000000000..4f5337f963 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java @@ -0,0 +1,35 @@ +package com.baeldung.passwordhashing; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + + +/** A really simple SHA_512 Encryption example. + * + */ +public class SHA512Hasher { + + public String hash(String passwordToHash, byte[] salt){ + String generatedPassword = null; + try { + MessageDigest md = MessageDigest.getInstance("SHA-512"); + md.update(salt); + byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for(int i=0; i< bytes.length ;i++){ + sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); + } + generatedPassword = sb.toString(); + } + catch (NoSuchAlgorithmException e){ + e.printStackTrace(); + } + return generatedPassword; + } + + public boolean checkPassword(String hash, String attempt, byte[] salt){ + String generatedHash = hash(attempt, salt); + return hash.equals(generatedHash); + } +} diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java new file mode 100644 index 0000000000..36c9b65070 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java @@ -0,0 +1,18 @@ +package com.baeldung.passwordhashing; + +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import java.security.spec.KeySpec; + +/** A really simple SimplePBKDF2 Encryption example. + * + */ +public class SimplePBKDF2Hasher { + + public static String hashSimple(String password, byte[] salt) throws Exception{ + KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128); + SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); + byte[] hash = f.generateSecret(spec).getEncoded(); + return String.valueOf(hash); + } +} diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java new file mode 100644 index 0000000000..9ed35c8834 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.hashing; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class Keccak256HashingUnitTest { + + private static String originalValue = "abc123"; + private static String hashedValue = "719accc61a9cc126830e5906f9d672d06eab6f8597287095a2c55a8b775e7016"; + + @Test public void testHashWithJavaMessageDigest() throws Exception { + final String currentHashedValue = Keccak256Hashing.hashWithJavaMessageDigest(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + + @Test public void testHashWithBouncyCastle() { + final String currentHashedValue = Keccak256Hashing.hashWithBouncyCastle(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + +} diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java new file mode 100644 index 0000000000..6bc9ad2cc6 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.hashing; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SHA256HashingUnitTest { + + private static String originalValue = "abc123"; + private static String hashedValue = "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090"; + + @Test + public void testHashWithJavaMessageDigest() throws Exception { + final String currentHashedValue = SHA256Hashing.HashWithJavaMessageDigest(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + + @Test + public void testHashWithGuava() throws Exception { + final String currentHashedValue = SHA256Hashing.hashWithGuava(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + + @Test + public void testHashWithApacheCommans() throws Exception { + final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + + @Test + public void testHashWithBouncyCastle() throws Exception { + final String currentHashedValue = SHA256Hashing.HashWithBouncyCastle(originalValue); + assertEquals(hashedValue, currentHashedValue); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java new file mode 100644 index 0000000000..fffab96405 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.hashing; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SHA3HashingUnitTest { + + private static String originalValue = "abc123"; + private static String hashedValue = "f58fa3df820114f56e1544354379820cff464c9c41cb3ca0ad0b0843c9bb67ee"; + + /* works with JDK9+ only */ + //@Test + public void testHashWithJavaMessageDigestJDK9() throws Exception { + final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigestJDK9(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + + @Test + public void testHashWithJavaMessageDigest() throws Exception { + final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigest(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + + /* works with JDK9+ only */ + //@Test + public void testHashWithApacheCommonsJDK9() { + final String currentHashedValue = SHA3Hashing.hashWithApacheCommonsJDK9(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + + @Test + public void testHashWithBouncyCastle() { + final String currentHashedValue = SHA3Hashing.hashWithBouncyCastle(originalValue); + assertEquals(hashedValue, currentHashedValue); + } + +} diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java new file mode 100644 index 0000000000..67d6918c09 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/java/md5/JavaMD5UnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.java.md5; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.xml.bind.DatatypeConverter; + +import org.apache.commons.codec.digest.DigestUtils; +import org.junit.Test; + +import com.google.common.hash.HashCode; +import com.google.common.hash.Hashing; + +public class JavaMD5UnitTest { + + String filename = "src/test/resources/test_md5.txt"; + String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; + + String hash = "35454B055CC325EA1AF2126E27707052"; + String password = "ILoveJava"; + + @Test + public void givenPassword_whenHashing_thenVerifying() throws NoSuchAlgorithmException { + String hash = "35454B055CC325EA1AF2126E27707052"; + String password = "ILoveJava"; + + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(password.getBytes()); + byte[] digest = md.digest(); + String myHash = DatatypeConverter.printHexBinary(digest).toUpperCase(); + + assertThat(myHash.equals(hash)).isTrue(); + } + + @Test + public void givenFile_generatingChecksum_thenVerifying() throws NoSuchAlgorithmException, IOException { + String filename = "src/test/resources/test_md5.txt"; + String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; + + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(Files.readAllBytes(Paths.get(filename))); + byte[] digest = md.digest(); + String myChecksum = DatatypeConverter.printHexBinary(digest).toUpperCase(); + + assertThat(myChecksum.equals(checksum)).isTrue(); + } + + @Test + public void givenPassword_whenHashingUsingCommons_thenVerifying() { + String hash = "35454B055CC325EA1AF2126E27707052"; + String password = "ILoveJava"; + + String md5Hex = DigestUtils.md5Hex(password).toUpperCase(); + + assertThat(md5Hex.equals(hash)).isTrue(); + } + + @Test + public void givenFile_whenChecksumUsingGuava_thenVerifying() throws IOException { + String filename = "src/test/resources/test_md5.txt"; + String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; + + HashCode hash = com.google.common.io.Files.hash(new File(filename), Hashing.md5()); + String myChecksum = hash.toString().toUpperCase(); + + assertThat(myChecksum.equals(checksum)).isTrue(); + } + +} diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java new file mode 100644 index 0000000000..8e90725c77 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.passwordhashing; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + + +public class PBKDF2HasherUnitTest { + + private PBKDF2Hasher mPBKDF2Hasher; + + @Before + public void setUp() throws Exception { + mPBKDF2Hasher = new PBKDF2Hasher(); + } + + @Test + public void givenCorrectMessageAndHash_whenAuthenticated_checkAuthenticationSucceeds() throws Exception { + String message1 = "password123"; + + String hash1 = mPBKDF2Hasher.hash(message1.toCharArray()); + + assertTrue(mPBKDF2Hasher.checkPassword(message1.toCharArray(), hash1)); + + } + + @Test + public void givenWrongMessage_whenAuthenticated_checkAuthenticationFails() throws Exception { + String message1 = "password123"; + + String hash1 = mPBKDF2Hasher.hash(message1.toCharArray()); + + String wrongPasswordAttempt = "IamWrong"; + + assertFalse(mPBKDF2Hasher.checkPassword(wrongPasswordAttempt.toCharArray(), hash1)); + + } + + +} \ No newline at end of file diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java new file mode 100644 index 0000000000..3acfb0ba9d --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung.passwordhashing; + +import org.junit.Before; +import org.junit.Test; + +import java.security.SecureRandom; + +import static org.junit.Assert.*; + +/** + * Created by PhysicsSam on 06-Sep-18. + */ +public class SHA512HasherUnitTest { + + private SHA512Hasher hasher; + private SecureRandom secureRandom; + + @Before + public void setUp() throws Exception { + hasher = new SHA512Hasher(); + secureRandom = new SecureRandom(); + } + + @Test + public void givenSamePasswordAndSalt_whenHashed_checkResultingHashesAreEqual() throws Exception { + + byte[] salt = new byte[16]; + secureRandom.nextBytes(salt); + + String hash1 = hasher.hash("password", salt); + String hash2 = hasher.hash("password", salt); + + assertEquals(hash1, hash2); + + } + + @Test + public void givenSamePasswordAndDifferentSalt_whenHashed_checkResultingHashesNotEqual() throws Exception { + + byte[] salt = new byte[16]; + secureRandom.nextBytes(salt); + String hash1 = hasher.hash("password", salt); + //generate a second salt + byte[] secondSalt = new byte[16]; + String hash2 = hasher.hash("password", secondSalt); + + assertNotEquals(hash1, hash2); + + } + + @Test + public void givenPredefinedHash_whenCorrectAttemptGiven_checkAuthenticationSucceeds() throws Exception { + byte[] salt = new byte[16]; + secureRandom.nextBytes(salt); + + String originalHash = hasher.hash("password123", salt); + + assertTrue(hasher.checkPassword(originalHash, "password123", salt)); + } + + @Test + public void givenPredefinedHash_whenIncorrectAttemptGiven_checkAuthenticationFails() throws Exception { + byte[] salt = new byte[16]; + secureRandom.nextBytes(salt); + + String originalHash = hasher.hash("password123", salt); + + assertFalse(hasher.checkPassword(originalHash, "password124", salt)); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-security-2/src/test/resources/test_md5.txt b/core-java-modules/core-java-security-2/src/test/resources/test_md5.txt new file mode 100644 index 0000000000..95d09f2b10 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/resources/test_md5.txt @@ -0,0 +1 @@ +hello world \ No newline at end of file From 2ba09756f7fe2efdb8198d4cba4952e1e88a4314 Mon Sep 17 00:00:00 2001 From: Antonio Moreno Date: Tue, 24 Mar 2020 23:43:49 +0000 Subject: [PATCH 246/530] BAEL-3928 Comparing Long values in Java --- .../comparelong/CompareLongUnitTest.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java new file mode 100644 index 0000000000..ab4ea2b657 --- /dev/null +++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.comparelong; + +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class CompareLongUnitTest { + + @Test + public void givenLongValuesLessThan128_whenUsingReferenceComparater_thenSuccess() { + + Long l1 = 127L; + Long l2 = 127L; + + assertThat(l1 == l2).isTrue(); + } + + @Test + public void givenLongValuesGreaterOrEqualsThan128_whenUsingReferenceComparater_thenFails() { + + Long l1 = 128L; + Long l2 = 128L; + + assertThat(l1 == l2).isFalse(); + } + + @Test + public void givenLongValuesGreaterOrEqualsThan128_whenUsingEquals_thenSuccess() { + + Long l1 = 128L; + Long l2 = 128L; + + assertThat(l1.equals(l2)).isTrue(); + } + + @Test + public void givenLongValuesGreaterOrEqualsThan128_whenUsingComparisonOperator_andLongValue_thenSuccess() { + + Long l1 = 128L; + Long l2 = 128L; + + assertThat(l1.longValue() == l2.longValue()).isTrue(); + } + + @Test + public void givenLongValuesGreaterOrEqualsThan128_whenUsingCasting_thenSuccess() { + + Long l1 = 128L; + Long l2 = 128L; + + assertThat((long) l1 == (long) l2).isTrue(); + } + +} \ No newline at end of file From c6f71e7ac7bae3587fdabcc49329fec817af38e7 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 26 Mar 2020 23:00:07 +0100 Subject: [PATCH 247/530] [BAEL-3934]shedlock update --- .../spring-boot-libraries/pom.xml | 8 +++- .../main/java/com/baeldung/Application.java | 15 +++++++ .../java/com/baeldung/boot/Application.java | 14 ------- ...eduler.java => BaeldungTaskScheduler.java} | 5 +-- .../shedlock/SchedulerConfiguration.java | 14 ++++--- .../src/main/resources/application.yml | 6 +++ .../BaeldungTaskSchedulerIntegrationTest.java | 39 +++++++++++++++++++ 7 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/Application.java delete mode 100644 spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java rename spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/{TaskScheduler.java => BaeldungTaskScheduler.java} (85%) create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml create mode 100644 spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/scheduling/shedlock/BaeldungTaskSchedulerIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index e9d955edc0..2b1b1b7d12 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -52,7 +52,11 @@ shedlock-provider-jdbc-template ${shedlock.version} - + + com.h2database + h2 + ${h2.version} + net.sourceforge.barbecue @@ -79,6 +83,7 @@ javase ${zxing.version} + @@ -185,6 +190,7 @@ 2.2.4 2.3.2 0.23.0 + 1.4.200 2.1.0 1.5-beta1 2.1 diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..15422e1065 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/Application.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +@EnableSchedulerLock(defaultLockAtMostFor = "PT30S") +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java deleted file mode 100644 index cb0d0c1532..0000000000 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.boot; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ApplicationContext; - -@SpringBootApplication -public class Application { - private static ApplicationContext applicationContext; - - public static void main(String[] args) { - applicationContext = SpringApplication.run(Application.class, args); - } -} diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java similarity index 85% rename from spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java index 060afe660e..cd5f63e962 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java @@ -5,9 +5,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component -class TaskScheduler { - - @Scheduled(cron = "*/15 * * * *") +class BaeldungTaskScheduler { + @Scheduled(cron = "0 0/15 * * * ?") @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") public void scheduledTask() { System.out.println("Running ShedLock task"); diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java index 74ea39683d..440e1ffc6a 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java @@ -1,12 +1,16 @@ package com.baeldung.scheduling.shedlock; +import net.javacrumbs.shedlock.core.LockProvider; +import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; -import org.springframework.scheduling.annotation.EnableScheduling; + +import javax.sql.DataSource; @Configuration -@EnableScheduling -@EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class SchedulerConfiguration { - + @Bean + public LockProvider lockProvider(DataSource dataSource) { + return new JdbcTemplateLockProvider(dataSource); + } } \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml new file mode 100644 index 0000000000..3477520208 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml @@ -0,0 +1,6 @@ +spring: + datasource: + driverClassName: org.h2.Driver + url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/scheduling/shedlock/BaeldungTaskSchedulerIntegrationTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/scheduling/shedlock/BaeldungTaskSchedulerIntegrationTest.java new file mode 100644 index 0000000000..47f42c133f --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/scheduling/shedlock/BaeldungTaskSchedulerIntegrationTest.java @@ -0,0 +1,39 @@ +package com.baeldung.scheduling.shedlock; + +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 java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class BaeldungTaskSchedulerIntegrationTest { + @Autowired + private BaeldungTaskScheduler taskScheduler; + + @Test + public void whenShedLockConfigCorrect_thenSpringCtxtStartsWithoutError() { + // save the old out + PrintStream old = System.out; + + // Create a stream to hold the output for test + ByteArrayOutputStream consoleOutput = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(consoleOutput); + System.setOut(ps); + //test + taskScheduler.scheduledTask(); + System.out.flush(); + String expected = "Running ShedLock task\n"; + assertThat(consoleOutput.toString()).isEqualTo(expected); + + //restore the old out + System.setOut(old); + } + +} \ No newline at end of file From 1bc12a57df47a42c36097bdbd0cc5247658666b1 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Sun, 29 Mar 2020 13:16:38 +0430 Subject: [PATCH 248/530] Ignoring a Bad Flaky Test --- .../hibernate/criteria/HibernateCriteriaIntegrationTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java index 31877255b2..7d95e0f342 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java @@ -8,6 +8,7 @@ import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; +import org.junit.Ignore; import org.junit.Test; import com.baeldung.hibernate.criteria.model.Item; @@ -24,6 +25,7 @@ public class HibernateCriteriaIntegrationTest { final private ApplicationView av = new ApplicationView(); @Test + @Ignore public void testPerformanceOfCriteria() { assertFalse(av.checkIfCriteriaTimeLower()); } From e189686b4a55267a1a0b369ef0f170576b2a0eb7 Mon Sep 17 00:00:00 2001 From: naXa! Date: Sun, 17 Mar 2019 22:24:10 +0300 Subject: [PATCH 249/530] [BAEL-2749] create new module `dbunit`; add DbUnit tests: `OldSchoolDbUnitTest` + `PrepAndExpectedDbUnitTest` + relevant data --- dbunit/README.md | 6 + dbunit/docs/db_schema.png | Bin 0 -> 17099 bytes dbunit/pom.xml | 35 ++++++ .../main/java/com/baeldung/dbunit/.gitkeep | 0 dbunit/src/main/resources/logback.xml | 13 ++ .../baeldung/dbunit/OldSchoolDbUnitTest.java | 111 ++++++++++++++++++ .../dbunit/PrepAndExpectedDbUnitTest.java | 103 ++++++++++++++++ dbunit/src/test/resources/data.xml | 11 ++ dbunit/src/test/resources/items.xml | 9 ++ .../src/test/resources/items_exp_delete.xml | 8 ++ .../src/test/resources/items_exp_rename.xml | 9 ++ dbunit/src/test/resources/schema.sql | 28 +++++ dbunit/src/test/resources/users.xml | 7 ++ .../src/test/resources/users_exp_delete.xml | 6 + .../src/test/resources/users_exp_rename.xml | 7 ++ 15 files changed, 353 insertions(+) create mode 100644 dbunit/README.md create mode 100644 dbunit/docs/db_schema.png create mode 100644 dbunit/pom.xml create mode 100644 dbunit/src/main/java/com/baeldung/dbunit/.gitkeep create mode 100644 dbunit/src/main/resources/logback.xml create mode 100644 dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java create mode 100644 dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java create mode 100644 dbunit/src/test/resources/data.xml create mode 100644 dbunit/src/test/resources/items.xml create mode 100644 dbunit/src/test/resources/items_exp_delete.xml create mode 100644 dbunit/src/test/resources/items_exp_rename.xml create mode 100644 dbunit/src/test/resources/schema.sql create mode 100644 dbunit/src/test/resources/users.xml create mode 100644 dbunit/src/test/resources/users_exp_delete.xml create mode 100644 dbunit/src/test/resources/users_exp_rename.xml diff --git a/dbunit/README.md b/dbunit/README.md new file mode 100644 index 0000000000..383bd6fb7e --- /dev/null +++ b/dbunit/README.md @@ -0,0 +1,6 @@ +### Database schema + +![db schema](docs/db_schema.png) + +### Relevant Articles: +- [Introduction To DBUnit](https://www.baeldung.com/dbunit) diff --git a/dbunit/docs/db_schema.png b/dbunit/docs/db_schema.png new file mode 100644 index 0000000000000000000000000000000000000000..d9185bacd2c624c8e05aea87bf542cfdfd7f1604 GIT binary patch literal 17099 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 + 4.0.0 + dbunit + 1.0 + dbunit + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.dbunit + dbunit + ${dbunit.version} + test + + + + com.h2database + h2 + 1.4.197 + test + + + + + + 2.6.0 + + + diff --git a/dbunit/src/main/java/com/baeldung/dbunit/.gitkeep b/dbunit/src/main/java/com/baeldung/dbunit/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dbunit/src/main/resources/logback.xml b/dbunit/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/dbunit/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java new file mode 100644 index 0000000000..a703863614 --- /dev/null +++ b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -0,0 +1,111 @@ +package com.baeldung.dbunit; + +import org.dbunit.Assertion; +import org.dbunit.IDatabaseTester; +import org.dbunit.JdbcDatabaseTester; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.ITable; +import org.dbunit.dataset.xml.FlatXmlDataSet; +import org.dbunit.operation.DatabaseOperation; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.ResultSet; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class OldSchoolDbUnitTest { + private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); + private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; + private static final String USER = "sa"; + private static final String PASSWORD = ""; + + private static IDatabaseTester tester = null; + + @BeforeClass + public static void setUp() throws Exception { + tester = initDatabaseTester(); + } + + private static IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + tester.setTearDownOperation(DatabaseOperation.NONE); + return tester; + } + + private static IDataSet initDataSet() throws Exception { + final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml"); + return new FlatXmlDataSet(is); + } + + @Before + public void setup() throws Exception { + tester.onSetup(); + } + + @After + public void tearDown() throws Exception { + tester.onTearDown(); + } + + @Test + public void testSelect() throws Exception { + // Arrange + final Connection connection = tester.getConnection().getConnection(); + + // Act + final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); + + // Assert + assertTrue(rs.next()); + assertEquals("Grey T-Shirt", rs.getString("title")); + } + + @Test + public void testDelete() throws Exception { + // Arrange + final Connection connection = tester.getConnection().getConnection(); + + final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); + ITable expectedTable = (new FlatXmlDataSet(is)).getTable("items"); + //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"}); + + // Act + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + // Assert + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + + Assertion.assertEquals(expectedTable, actualTable); + } + + @Test + public void testUpdate() throws Exception { + // Arrange + final Connection connection = tester.getConnection().getConnection(); + + final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); + ITable expectedTable = (new FlatXmlDataSet(is)).getTable("items"); + //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"}); + + // Act + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + // Assert + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + + Assertion.assertEquals(expectedTable, actualTable); + } + +} diff --git a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java new file mode 100644 index 0000000000..c3882d5eab --- /dev/null +++ b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -0,0 +1,103 @@ +package com.baeldung.dbunit; + +import org.dbunit.*; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; +import org.dbunit.util.fileloader.DataFileLoader; +import org.dbunit.util.fileloader.FlatXmlDataFileLoader; +import org.junit.Test; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.ResultSet; + +public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { + private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); + private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; + private static final String USER = "sa"; + private static final String PASSWORD = ""; + + @Override + public void setUp() throws Exception { + setDatabaseTester(initDatabaseTester()); + setDataFileLoader(initDataFileLoader()); + super.setUp(); + } + + private IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + return tester; + } + + private IDataSet initDataSet() throws Exception { + final InputStream is = getClass().getClassLoader().getResourceAsStream("data.xml"); + return new FlatXmlDataSetBuilder().build(is); + } + + private DataFileLoader initDataFileLoader() { + return new FlatXmlDataFileLoader(); + } + + @Test + public void testSelect() throws Exception { + // Arrange + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; + final String[] prepDataFiles = {"/users.xml"}; + final String[] expectedDataFiles = {"/users.xml"}; + final PrepAndExpectedTestCaseSteps testSteps = () -> { + // invoke the method being tested here; for the sake of simplicity we use JDBC API directly in this example + final ResultSet rs = connection.createStatement().executeQuery("select * from USERS where id = 1"); + + // either place assertions here + //assertTrue(rs.next()); + //assertEquals("Xavier", rs.getString("last_name")); + + return rs; + }; + + // Act + final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + + // or place assertions at the end + assertTrue(rs.next()); + assertEquals("Xavier", rs.getString("last_name")); + } + + @Test + public void testUpdate() throws Exception { + // Arrange + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; // define tables to verify + final String[] prepDataFiles = {"/users.xml"}; // define prep files + final String[] expectedDataFiles = {"/users_exp_rename.xml"}; // define expected files + final PrepAndExpectedTestCaseSteps testSteps = () -> { + // invoke the method being tested here; for the sake of simplicity we use JDBC API directly in this example + return connection.createStatement().executeUpdate("update USERS set first_name = 'new name' where id = 1"); + // after this method exits, dbUnit will: + // * verify configured tables + // * cleanup tables as configured + }; + + // Act + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } + + @Test + public void testDelete() throws Exception { + // Arrange + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; + final String[] prepDataFiles = {"/users.xml"}; + final String[] expectedDataFiles = {"/users_exp_delete.xml"}; + final PrepAndExpectedTestCaseSteps testSteps = + () -> connection.createStatement().executeUpdate("delete from USERS where id = 2"); + + // Act + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } + +} diff --git a/dbunit/src/test/resources/data.xml b/dbunit/src/test/resources/data.xml new file mode 100644 index 0000000000..e4498513e0 --- /dev/null +++ b/dbunit/src/test/resources/data.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dbunit/src/test/resources/items.xml b/dbunit/src/test/resources/items.xml new file mode 100644 index 0000000000..04a975d7ee --- /dev/null +++ b/dbunit/src/test/resources/items.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dbunit/src/test/resources/items_exp_delete.xml b/dbunit/src/test/resources/items_exp_delete.xml new file mode 100644 index 0000000000..1aaeff59ca --- /dev/null +++ b/dbunit/src/test/resources/items_exp_delete.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/dbunit/src/test/resources/items_exp_rename.xml b/dbunit/src/test/resources/items_exp_rename.xml new file mode 100644 index 0000000000..237280e758 --- /dev/null +++ b/dbunit/src/test/resources/items_exp_rename.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dbunit/src/test/resources/schema.sql b/dbunit/src/test/resources/schema.sql new file mode 100644 index 0000000000..9b5018985a --- /dev/null +++ b/dbunit/src/test/resources/schema.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS USERS +( + `id` int AUTO_INCREMENT NOT NULL, + `first_name` varchar(100) NOT NULL, + `last_name` varchar(100) NOT NULL, + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS ITEMS +( + `id` int AUTO_INCREMENT NOT NULL, + `title` varchar(100) NOT NULL, + `produced` date, + `price` float, + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS PURCHASES +( + `id` int NOT NULL AUTO_INCREMENT, + `id_user` int NOT NULL, + `id_item` int NOT NULL, + `total_price` float NOT NULL, + `quantity` int(11) NOT NULL, + PRIMARY KEY (`id`), + FOREIGN KEY (`id_user`) REFERENCES USERS (`id`) ON DELETE CASCADE, + FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE +); diff --git a/dbunit/src/test/resources/users.xml b/dbunit/src/test/resources/users.xml new file mode 100644 index 0000000000..cebadf2e67 --- /dev/null +++ b/dbunit/src/test/resources/users.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/dbunit/src/test/resources/users_exp_delete.xml b/dbunit/src/test/resources/users_exp_delete.xml new file mode 100644 index 0000000000..8b72ceef89 --- /dev/null +++ b/dbunit/src/test/resources/users_exp_delete.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/dbunit/src/test/resources/users_exp_rename.xml b/dbunit/src/test/resources/users_exp_rename.xml new file mode 100644 index 0000000000..9bc1254967 --- /dev/null +++ b/dbunit/src/test/resources/users_exp_rename.xml @@ -0,0 +1,7 @@ + + + + + + + From 6194165f0d1c57ef5d6b5f1111d96107beee735c Mon Sep 17 00:00:00 2001 From: naXa! Date: Mon, 25 Mar 2019 01:37:05 +0300 Subject: [PATCH 250/530] [BAEL-2749] add `SampleDbUnitTest` (extending `DBTestCase`) --- .../com/baeldung/dbunit/SampleDbUnitTest.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java diff --git a/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java new file mode 100644 index 0000000000..cfe4fd4e11 --- /dev/null +++ b/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java @@ -0,0 +1,96 @@ +package com.baeldung.dbunit; + +import org.dbunit.Assertion; +import org.dbunit.DBTestCase; +import org.dbunit.PropertiesBasedJdbcDatabaseTester; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.ITable; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; +import org.junit.Test; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.ResultSet; + +public class SampleDbUnitTest extends DBTestCase { + private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); + private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; + private static final String USER = "sa"; + private static final String PASSWORD = ""; + + public SampleDbUnitTest(String name) { + super(name); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); + // System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, ""); + } + + @Override + protected IDataSet getDataSet() throws Exception { + final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml"); + return new FlatXmlDataSetBuilder().build(is); + } + + @Override + protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; + } + + @Override + protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.NONE; + } + + @Test + public void testSelect() throws Exception { + // Arrange + final Connection connection = getConnection().getConnection(); + + // Act + final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); + + // Assert + assertTrue(rs.next()); + assertEquals("Grey T-Shirt", rs.getString("title")); + } + + @Test + public void testDelete() throws Exception { + // Arrange + final Connection connection = getConnection().getConnection(); + + final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); + + // Act + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + // Assert + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + + Assertion.assertEquals(expectedTable, actualTable); + } + + @Test + public void testUpdate() throws Exception { + // Arrange + final Connection connection = getConnection().getConnection(); + + final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); + + // Act + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + // Assert + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + + Assertion.assertEquals(expectedTable, actualTable); + } + +} From 71fecd658963941c694f0528e981b2f88441999d Mon Sep 17 00:00:00 2001 From: Philippe Date: Sun, 29 Mar 2020 11:49:46 -0300 Subject: [PATCH 251/530] [BAEL-3793][BAEL-3935] Code snippets --- terraform/best-practices/README.md | 10 +++ .../best-practices/ec2-simple/.gitignore | 4 ++ terraform/best-practices/ec2-simple/SETUP.md | 23 +++++++ terraform/best-practices/ec2-simple/main.tf | 33 +++++++++ .../best-practices/ec2-simple/providers.tf | 6 ++ .../best-practices/ec2-simple/variables.tf | 15 ++++ terraform/best-practices/k8s-basic/.gitignore | 4 ++ terraform/best-practices/k8s-basic/SETUP.md | 15 ++++ terraform/best-practices/k8s-basic/main.tf | 12 ++++ .../best-practices/k8s-basic/providers.tf | 6 ++ .../best-practices/k8s-basic/variables.tf | 9 +++ .../best-practices/k8s-modules/.gitignore | 4 ++ terraform/best-practices/k8s-modules/SETUP.md | 21 ++++++ terraform/best-practices/k8s-modules/main.tf | 27 ++++++++ .../k8s-modules/modules/SvcCustomer/main.tf | 68 ++++++++++++++++++ .../modules/SvcCustomer/outputs.tf | 3 + .../modules/SvcCustomer/variables.tf | 5 ++ .../k8s-modules/modules/SvcFeedback/main.tf | 69 +++++++++++++++++++ .../modules/SvcFeedback/outputs.tf | 3 + .../modules/SvcFeedback/variables.tf | 5 ++ .../ingress/www.petshop.com.br/main.tf | 41 +++++++++++ .../ingress/www.petshop.com.br/outputs.tf | 5 ++ .../ingress/www.petshop.com.br/variables.tf | 20 ++++++ .../best-practices/k8s-modules/provider.tf | 13 ++++ terraform/hello-terraform/.gitignore | 6 ++ terraform/hello-terraform/main.tf | 7 ++ 26 files changed, 434 insertions(+) create mode 100644 terraform/best-practices/README.md create mode 100644 terraform/best-practices/ec2-simple/.gitignore create mode 100644 terraform/best-practices/ec2-simple/SETUP.md create mode 100644 terraform/best-practices/ec2-simple/main.tf create mode 100644 terraform/best-practices/ec2-simple/providers.tf create mode 100644 terraform/best-practices/ec2-simple/variables.tf create mode 100644 terraform/best-practices/k8s-basic/.gitignore create mode 100644 terraform/best-practices/k8s-basic/SETUP.md create mode 100644 terraform/best-practices/k8s-basic/main.tf create mode 100644 terraform/best-practices/k8s-basic/providers.tf create mode 100644 terraform/best-practices/k8s-basic/variables.tf create mode 100644 terraform/best-practices/k8s-modules/.gitignore create mode 100644 terraform/best-practices/k8s-modules/SETUP.md create mode 100644 terraform/best-practices/k8s-modules/main.tf create mode 100644 terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf create mode 100644 terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf create mode 100644 terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf create mode 100644 terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf create mode 100644 terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf create mode 100644 terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf create mode 100644 terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf create mode 100644 terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf create mode 100644 terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf create mode 100644 terraform/best-practices/k8s-modules/provider.tf create mode 100644 terraform/hello-terraform/.gitignore create mode 100644 terraform/hello-terraform/main.tf diff --git a/terraform/best-practices/README.md b/terraform/best-practices/README.md new file mode 100644 index 0000000000..fd488b1afb --- /dev/null +++ b/terraform/best-practices/README.md @@ -0,0 +1,10 @@ +# Terraform Sample Code + +This folder contains Terraform project samples that illustrates topics covered in the +"Best practices when using Terraform" article. Setup instructions are available in each sample's folder. + +List of available samples: + + * k8s-basic: "Hello world" project that just connects to a Kubernetes cluster and create a new namespace. + * ec2-basic: "Hello world" project that creates a single EC2 instance + * k8s-modules: A more elaborate sample that creates a simple set of services in a Kubernetes cluster diff --git a/terraform/best-practices/ec2-simple/.gitignore b/terraform/best-practices/ec2-simple/.gitignore new file mode 100644 index 0000000000..a70da3ca16 --- /dev/null +++ b/terraform/best-practices/ec2-simple/.gitignore @@ -0,0 +1,4 @@ +*.tfvars +*.tfstate +*.tfstate.backup +.terraform diff --git a/terraform/best-practices/ec2-simple/SETUP.md b/terraform/best-practices/ec2-simple/SETUP.md new file mode 100644 index 0000000000..3f906b6933 --- /dev/null +++ b/terraform/best-practices/ec2-simple/SETUP.md @@ -0,0 +1,23 @@ +# EC2 Basic Sample + +This Terraform sample project creates a single EC2 instance in the configured region. + +IMPORTANT NOTICE: In order to run this sample you must have an active AWS Account. As you probably know, creating resources on AWS +may result in additional charges in your bill. We recommend creating a test account to run this test as you can then use AWS's free tier +to play around. When finished, ALWAYS REMEMBER TO DESTROY YOUR RESOURCES !!! + +# Setup instructions + +1. Make sure you have a working AWS environment. Use a simple command such as _aws ec2 describe-instances_ and check its output. + If you get a list of existing EC2 instances, you're good to go. Otherwise, please refer to AWS documentation in order to setup your CLI. +2. Download the Terraform package for your environment from Hashicorp's site. Unzip it and put the _terraform_ binary somewhere + in the OS's PATH. +3. Open a command prompt and _cd_ into this folder +4. Run the following commands: +''' + $ terraform init + $ terraform apply -auto-approve +''' +5. Wait until Terraform create all resources and run _aws ec2 describe-instances_. The output should list the newly creates EC2 instance +6. Run _terraform destroy_ to remove the previously creates namespace. + diff --git a/terraform/best-practices/ec2-simple/main.tf b/terraform/best-practices/ec2-simple/main.tf new file mode 100644 index 0000000000..57fb9d1757 --- /dev/null +++ b/terraform/best-practices/ec2-simple/main.tf @@ -0,0 +1,33 @@ +# +# Resource definitions +# + +data "aws_ami" "apache" { + filter { + name = "name" + values = [var.ami_name] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } + + owners = [var.ami_owner] + + most_recent = true +} + +resource "aws_instance" "web" { + ami = data.aws_ami.apache.id + instance_type = "t2.micro" + subnet_id = aws_subnet.frontend.id +} +resource "aws_subnet" "frontend" { + vpc_id = aws_vpc.apps.id + cidr_block = "10.0.1.0/24" +} + +resource "aws_vpc" "apps" { + cidr_block = "10.0.0.0/16" +} diff --git a/terraform/best-practices/ec2-simple/providers.tf b/terraform/best-practices/ec2-simple/providers.tf new file mode 100644 index 0000000000..fa5826b067 --- /dev/null +++ b/terraform/best-practices/ec2-simple/providers.tf @@ -0,0 +1,6 @@ +# +# Providers definitions +# +provider "aws" { + version = "~> 2.53" +} \ No newline at end of file diff --git a/terraform/best-practices/ec2-simple/variables.tf b/terraform/best-practices/ec2-simple/variables.tf new file mode 100644 index 0000000000..2a7fddcd33 --- /dev/null +++ b/terraform/best-practices/ec2-simple/variables.tf @@ -0,0 +1,15 @@ +# +# Variables +# + +variable "ami_name" { + type = string + description = "AMI name to use for our EC2 instance. Defaults to Ubuntu 18.04 (Bionic)" + default = "ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-*" +} + +variable "ami_owner" { + type = string + description = "AMI Owner ID to use for our EC2 instance. Defaults to 099720109477 (Canonical)" + default = "099720109477" +} \ No newline at end of file diff --git a/terraform/best-practices/k8s-basic/.gitignore b/terraform/best-practices/k8s-basic/.gitignore new file mode 100644 index 0000000000..a70da3ca16 --- /dev/null +++ b/terraform/best-practices/k8s-basic/.gitignore @@ -0,0 +1,4 @@ +*.tfvars +*.tfstate +*.tfstate.backup +.terraform diff --git a/terraform/best-practices/k8s-basic/SETUP.md b/terraform/best-practices/k8s-basic/SETUP.md new file mode 100644 index 0000000000..479bb75274 --- /dev/null +++ b/terraform/best-practices/k8s-basic/SETUP.md @@ -0,0 +1,15 @@ +# Setup instructions + +1. Mak sure you have a working Kubernetes environment. Use a simple command such as _kubectl get nodes_ and check its output. + If you get a list of nodes that contains at least one _ready_ module, you're good to go +2. Download the Terraform package for your environment from Hashicorp's site. Unzip it and put the _terraform_ binary somewhere + in the OS's PATH. +3. Open a command prompt and _cd_ into this folder +4. Run the following commands: +''' + $ terraform init + $ terraform apply -auto-approve +''' +5. Wait until Terraform create all resources and run _kubectl get namespaces_. The output should now have a new "hello-terraform" namespace. +6. Run _terraform destroy_ to remove the previously creates namespace. + diff --git a/terraform/best-practices/k8s-basic/main.tf b/terraform/best-practices/k8s-basic/main.tf new file mode 100644 index 0000000000..5eb3749930 --- /dev/null +++ b/terraform/best-practices/k8s-basic/main.tf @@ -0,0 +1,12 @@ +# +# Resource definitions +# + +resource "kubernetes_namespace" "hello" { + metadata { + labels = { + terraform = "true" + } + name = var.namespace_name + } +} \ No newline at end of file diff --git a/terraform/best-practices/k8s-basic/providers.tf b/terraform/best-practices/k8s-basic/providers.tf new file mode 100644 index 0000000000..385f857a11 --- /dev/null +++ b/terraform/best-practices/k8s-basic/providers.tf @@ -0,0 +1,6 @@ +# +# Providers definitions +# +provider "kubernetes" { + version = "~> 1.11" +} \ No newline at end of file diff --git a/terraform/best-practices/k8s-basic/variables.tf b/terraform/best-practices/k8s-basic/variables.tf new file mode 100644 index 0000000000..b9217079bf --- /dev/null +++ b/terraform/best-practices/k8s-basic/variables.tf @@ -0,0 +1,9 @@ +# +# Variables +# + +variable "namespace_name" { + type = string + description = "Name to use for the created namespace" + default = "hello-terraform" +} \ No newline at end of file diff --git a/terraform/best-practices/k8s-modules/.gitignore b/terraform/best-practices/k8s-modules/.gitignore new file mode 100644 index 0000000000..a70da3ca16 --- /dev/null +++ b/terraform/best-practices/k8s-modules/.gitignore @@ -0,0 +1,4 @@ +*.tfvars +*.tfstate +*.tfstate.backup +.terraform diff --git a/terraform/best-practices/k8s-modules/SETUP.md b/terraform/best-practices/k8s-modules/SETUP.md new file mode 100644 index 0000000000..b7e4c2764d --- /dev/null +++ b/terraform/best-practices/k8s-modules/SETUP.md @@ -0,0 +1,21 @@ +# Kubernetes multimodule sample + +This sample deploys two services behind a Kubernetes ingress. + +# Setup instructions + +1. Mak sure you have a working Kubernetes environment. Use a simple command such as _kubectl get nodes_ and check its output. + If you get a list of nodes that contains at least one _ready_ module, you're good to go +2. Download the Terraform package for your environment from Hashicorp's site. Unzip it and put the _terraform_ binary somewhere + in the OS's PATH. +3. Open a command prompt and _cd_ into this folder +4. Run the following commands: +''' + $ terraform init + $ terraform apply -auto-approve +''' +5. Wait until Terraform create all resources and run _kubectl get services_. The output should now have a few services. +6. Run _terraform destroy_ to remove the previously creates namespace. + + + diff --git a/terraform/best-practices/k8s-modules/main.tf b/terraform/best-practices/k8s-modules/main.tf new file mode 100644 index 0000000000..86426b33db --- /dev/null +++ b/terraform/best-practices/k8s-modules/main.tf @@ -0,0 +1,27 @@ +/* + * Top-level definitions + */ + +//================================================================== Ingress + +module "ingress_www_petshop_com_br" { + source = "./modules/ingress/www.petshop.com.br" + ingress_host = "www.petshop.com.br" +} + +//================================================================== Deployments + +module "SvcCustomer" { + source = "./modules/SvcCustomer" +} + +module "SvcFeedback" { + source = "./modules/SvcFeedback" +} + + + + + + + diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf b/terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf new file mode 100644 index 0000000000..1ca0c91545 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf @@ -0,0 +1,68 @@ +/* + * SvcCustomer deployment resources + */ + +resource "kubernetes_deployment" "SvcCustomer" { + + metadata { + name = "svccustomer" + labels = { + app = "SvcCustomer" + } + } + + spec { + replicas = 1 + + selector { + match_labels = { + app = "SvcCustomer" + } + } + + template { + metadata { + labels = { + app = "SvcCustomer" + } + } + + spec { + image_pull_secrets { + name = "docker-config" + } + + + container { + image = "inanimate/echo-server" + name = "svccustomer-httpd" + env { + name = "PORT" + value = "80" + } + } + } + } + } +} + +resource "kubernetes_service" "SvcCustomer" { + metadata { + name = "svccustomer" + } + + spec { + + selector = { + app = "SvcCustomer" + } + + session_affinity = "ClientIP" + port { + port = 80 + } + + //type = "LoadBalancer" + } + } + \ No newline at end of file diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf b/terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf new file mode 100644 index 0000000000..8a37fdf375 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf @@ -0,0 +1,3 @@ +/* + * SvcCustomer output values + */ diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf b/terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf new file mode 100644 index 0000000000..3dfcfcd264 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf @@ -0,0 +1,5 @@ +/* + * SvcCustomer deployment variables + */ + + \ No newline at end of file diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf b/terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf new file mode 100644 index 0000000000..0f84c9163e --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf @@ -0,0 +1,69 @@ +/* + * SvcFeedback deployment resources + */ + +resource "kubernetes_deployment" "SvcFeedback" { + + metadata { + name = "svcfeedback" + labels = { + app = "SvcFeedback" + } + } + + spec { + replicas = 1 + + selector { + match_labels = { + app = "SvcFeedback" + } + } + + template { + metadata { + labels = { + app = "SvcFeedback" + } + } + + spec { + image_pull_secrets { + name = "docker-config" + } + + + container { + image = "inanimate/echo-server" + name = "svcfeedback-httpd" + env { + name = "PORT" + value = "80" + } + } + + } + } + } +} + +resource "kubernetes_service" "SvcFeedback" { + metadata { + name = "svcfeedback" + } + + spec { + + selector = { + app = "SvcFeedback" + } + + session_affinity = "ClientIP" + port { + port = 80 + } + + //type = "LoadBalancer" + } + } + \ No newline at end of file diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf b/terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf new file mode 100644 index 0000000000..e08c17d4b4 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf @@ -0,0 +1,3 @@ +/* + * SvcFeedback output values + */ diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf b/terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf new file mode 100644 index 0000000000..d8076d41a4 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf @@ -0,0 +1,5 @@ +/* + * SvcFeedback deployment variables + */ + + \ No newline at end of file diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf b/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf new file mode 100644 index 0000000000..0dbda48981 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf @@ -0,0 +1,41 @@ +/* + * Kubernetes Ingress module + */ +locals { + iname = var.ingress_name == "" ? join("-",["ingress",sha1(uuid())]) : var.ingress_name +} + +resource "kubernetes_ingress" "ingress" { + metadata { + name = local.iname + annotations = map( + "nginx.ingress.kubernetes.io/rewrite-target","/" + ) + } + spec { + rule { + http { + path { + backend { + service_name = "svccustomer" + service_port = 80 + } + path = "/customers" + } + path { + backend { + service_name = "svcfeedback" + service_port = 80 + } + path = "/feedback" + } + } + } +/* + tls { + secret_name = "tls-secret" + } +*/ + } +} + diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf b/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf new file mode 100644 index 0000000000..e604417b05 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf @@ -0,0 +1,5 @@ +/* + * Output variables + */ + + diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf b/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf new file mode 100644 index 0000000000..9b06128ec5 --- /dev/null +++ b/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf @@ -0,0 +1,20 @@ +/* + * Kubernetes Ingress module + */ + + +variable "ingress_name" { + type = string + description = "Ingress name. Defaults to a random name." + default = "" +} + +variable "ingress_host" { + type = string + description = "Ingress hostname" + default = "www.petshop.com.br" +} + + + + diff --git a/terraform/best-practices/k8s-modules/provider.tf b/terraform/best-practices/k8s-modules/provider.tf new file mode 100644 index 0000000000..bb90d66ecf --- /dev/null +++ b/terraform/best-practices/k8s-modules/provider.tf @@ -0,0 +1,13 @@ +# +# Provider configurations +# This file will *NOT* be overwriten upon regeneration, so it's safe +# to add your own customizations +# + +provider "kubernetes" { + version = "~> 1.10" +} + +provider "random" { + version = "~> 2.2" +} \ No newline at end of file diff --git a/terraform/hello-terraform/.gitignore b/terraform/hello-terraform/.gitignore new file mode 100644 index 0000000000..452502c50f --- /dev/null +++ b/terraform/hello-terraform/.gitignore @@ -0,0 +1,6 @@ +*.tfvars +*.tfstate +*.tfstate.backup +.terraform +hello.txt + diff --git a/terraform/hello-terraform/main.tf b/terraform/hello-terraform/main.tf new file mode 100644 index 0000000000..d6a726fa36 --- /dev/null +++ b/terraform/hello-terraform/main.tf @@ -0,0 +1,7 @@ +provider "local" { + version = "~> 1.4" +} +resource "local_file" "hello" { + content = "Hello, Terraform" + filename = "hello.txt" +} From 4382852a1731d9d06f838219ec176ddf89c04d3d Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 29 Mar 2020 19:00:40 +0200 Subject: [PATCH 252/530] JAVA-43: Upgrade spring-security-modules to Spring Boot 2 --- spring-security-modules/spring-security-acl/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-security-modules/spring-security-acl/pom.xml b/spring-security-modules/spring-security-acl/pom.xml index 3c613f9d92..5c04aaa9ca 100644 --- a/spring-security-modules/spring-security-acl/pom.xml +++ b/spring-security-modules/spring-security-acl/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 From 65e21d3f6a394cbfc34f6c6d8b49d92a02a4aa9e Mon Sep 17 00:00:00 2001 From: Seun Matt Date: Sun, 29 Mar 2020 21:36:54 +0100 Subject: [PATCH 253/530] example code for BAEL-3749 (#8815) * example code for BAEL-3749 * added live test * added live test * improved exception handling in response log filter * propage exception in example code * updated repo with upstream * added example code for BAEL-3293 * updated the example code for BAEL-3749 * updated the example code for BAEL-3749 * updated the example code for BAEL-3749 * updated the example code for BAEL-3749 --- cas/cas-secured-app/pom.xml | 8 +- .../CasSecuredAppApplication.java | 91 ------ .../cassecuredapp/CasSecuredApplication.java | 97 +++++++ .../cassecuredapp/config/SecurityConfig.java | 83 ------ .../config/WebSecurityConfig.java | 79 ++++++ .../controllers/AuthController.java | 29 +- .../controllers/IndexController.java | 8 +- .../controllers/SecuredController.java | 30 ++ .../controllers/SecuredPageController.java | 24 -- .../src/main/resources/application.properties | 3 +- ...CasSecuredApplicationIntegrationTest.java} | 2 +- cas/cas-server/.factorypath | 228 ---------------- cas/cas-server/.gitignore | 7 + cas/cas-server/.mergify.yml | 32 +++ cas/cas-server/.travis.yml | 62 +++++ cas/cas-server/Dockerfile | 40 +++ cas/cas-server/README.md | 151 ++++++---- cas/cas-server/build.cmd | 102 ------- cas/cas-server/build.gradle | 106 +++++++ cas/cas-server/build.sh | 189 ------------- cas/cas-server/docker-build.sh | 10 + cas/cas-server/docker-compose.yml | 7 + cas/cas-server/docker-push.sh | 12 + cas/cas-server/docker-run.sh | 7 + cas/cas-server/etc/cas/config/application.yml | 2 - cas/cas-server/etc/cas/config/cas.properties | 9 +- cas/cas-server/etc/cas/config/log4j2.xml | 120 ++++---- cas/cas-server/etc/cas/saml/.gitkeep | 1 + cas/cas-server/etc/cas/services/.donotdel | 0 cas/cas-server/etc/cas/thekeystore | Bin 0 -> 2266 bytes cas/cas-server/gradle.properties | 28 ++ cas/cas-server/gradle/dockerjib.gradle | 52 ++++ cas/cas-server/gradle/springboot.gradle | 24 ++ cas/cas-server/gradle/tasks.gradle | 258 ++++++++++++++++++ .../gradle/wrapper/gradle-wrapper.properties | 5 + cas/cas-server/gradlew | 188 +++++++++++++ cas/cas-server/gradlew.bat | 100 +++++++ cas/cas-server/maven/maven-wrapper.jar | Bin 71910 -> 0 bytes cas/cas-server/maven/maven-wrapper.properties | 3 - cas/cas-server/mvnw | 234 ---------------- cas/cas-server/mvnw.bat | 174 ------------ cas/cas-server/pom.xml | 208 -------------- cas/cas-server/settings.gradle | 1 + .../src/main/jib/docker/entrypoint.sh | 22 ++ .../src/main/resources/application.properties | 136 +-------- .../src/main/resources/cas.properties | 9 - .../create_test_db_and_users_tbl.sql | 12 +- .../resources/etc/cas/config/application.yml | 2 - .../resources/etc/cas/config/cas.properties | 18 +- .../main/resources/etc/cas/config/log4j2.xml | 117 -------- .../etc/cas/services/casSecuredApp-8900.json | 8 + .../src/main/resources/etc/cas/thekeystore | Bin 2258 -> 2251 bytes .../main/resources/etc/cas/thekeystore.crt | Bin 901 -> 0 bytes cas/cas-server/src/main/resources/log4j2.xml | 117 -------- .../services/casSecuredApp-19991.json | 8 - cas/pom.xml | 23 -- pom.xml | 2 - 57 files changed, 1390 insertions(+), 1898 deletions(-) delete mode 100644 cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java create mode 100644 cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java delete mode 100644 cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java create mode 100644 cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/WebSecurityConfig.java create mode 100644 cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredController.java delete mode 100644 cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java rename cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/{CasSecuredAppApplicationIntegrationTest.java => CasSecuredApplicationIntegrationTest.java} (84%) delete mode 100644 cas/cas-server/.factorypath mode change 100644 => 100755 cas/cas-server/.gitignore create mode 100644 cas/cas-server/.mergify.yml create mode 100644 cas/cas-server/.travis.yml create mode 100644 cas/cas-server/Dockerfile delete mode 100644 cas/cas-server/build.cmd create mode 100644 cas/cas-server/build.gradle delete mode 100644 cas/cas-server/build.sh create mode 100755 cas/cas-server/docker-build.sh create mode 100644 cas/cas-server/docker-compose.yml create mode 100755 cas/cas-server/docker-push.sh create mode 100755 cas/cas-server/docker-run.sh delete mode 100644 cas/cas-server/etc/cas/config/application.yml create mode 100644 cas/cas-server/etc/cas/saml/.gitkeep create mode 100644 cas/cas-server/etc/cas/services/.donotdel create mode 100644 cas/cas-server/etc/cas/thekeystore create mode 100644 cas/cas-server/gradle.properties create mode 100644 cas/cas-server/gradle/dockerjib.gradle create mode 100644 cas/cas-server/gradle/springboot.gradle create mode 100644 cas/cas-server/gradle/tasks.gradle create mode 100644 cas/cas-server/gradle/wrapper/gradle-wrapper.properties create mode 100755 cas/cas-server/gradlew create mode 100644 cas/cas-server/gradlew.bat delete mode 100644 cas/cas-server/maven/maven-wrapper.jar delete mode 100644 cas/cas-server/maven/maven-wrapper.properties delete mode 100644 cas/cas-server/mvnw delete mode 100644 cas/cas-server/mvnw.bat create mode 100644 cas/cas-server/settings.gradle create mode 100755 cas/cas-server/src/main/jib/docker/entrypoint.sh delete mode 100644 cas/cas-server/src/main/resources/cas.properties delete mode 100644 cas/cas-server/src/main/resources/etc/cas/config/application.yml delete mode 100644 cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml create mode 100644 cas/cas-server/src/main/resources/etc/cas/services/casSecuredApp-8900.json delete mode 100644 cas/cas-server/src/main/resources/etc/cas/thekeystore.crt delete mode 100644 cas/cas-server/src/main/resources/log4j2.xml delete mode 100644 cas/cas-server/src/main/resources/services/casSecuredApp-19991.json diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml index 8e6f28e3a8..426d65c32b 100644 --- a/cas/cas-secured-app/pom.xml +++ b/cas/cas-secured-app/pom.xml @@ -11,11 +11,15 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 + + 2.2.6.RELEASE + + org.springframework.boot diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java deleted file mode 100644 index 25cbb9bc9b..0000000000 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.baeldung.cassecuredapp; - -import org.jasig.cas.client.session.SingleSignOutFilter; -import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; -import org.jasig.cas.client.validation.Cas30ServiceTicketValidator; -import org.jasig.cas.client.validation.TicketValidator; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; -import org.springframework.context.event.EventListener; -import org.springframework.security.cas.ServiceProperties; -import org.springframework.security.cas.authentication.CasAuthenticationProvider; -import org.springframework.security.cas.web.CasAuthenticationEntryPoint; -import org.springframework.security.core.authority.AuthorityUtils; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.authentication.logout.LogoutFilter; -import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; - -import javax.servlet.http.HttpSessionEvent; - -@SpringBootApplication -public class CasSecuredAppApplication { - - public static void main(String[] args) { - SpringApplication.run(CasSecuredAppApplication.class, args); - } - - @Bean - public ServiceProperties serviceProperties() { - ServiceProperties serviceProperties = new ServiceProperties(); - serviceProperties.setService("http://localhost:9000/login/cas"); - serviceProperties.setSendRenew(false); - return serviceProperties; - } - - @Bean - @Primary - public AuthenticationEntryPoint authenticationEntryPoint(ServiceProperties sP) { - CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint(); - entryPoint.setLoginUrl("https://localhost:6443/cas/login"); - entryPoint.setServiceProperties(sP); - return entryPoint; - } - - @Bean - public TicketValidator ticketValidator() { - return new Cas30ServiceTicketValidator("https://localhost:6443/cas"); - } - - @Bean - public CasAuthenticationProvider casAuthenticationProvider() { - CasAuthenticationProvider provider = new CasAuthenticationProvider(); - provider.setServiceProperties(serviceProperties()); - provider.setTicketValidator(ticketValidator()); - provider.setUserDetailsService((s) -> new User("test@test.com", "smatt", - true, true, true, true, - AuthorityUtils.createAuthorityList("ROLE_ADMIN"))); - provider.setKey("CAS_PROVIDER_LOCALHOST_9000"); - return provider; - } - - - @Bean - public SecurityContextLogoutHandler securityContextLogoutHandler() { - return new SecurityContextLogoutHandler(); - } - - @Bean - public LogoutFilter logoutFilter() { - LogoutFilter logoutFilter = new LogoutFilter( - "https://localhost:6443/cas/logout", securityContextLogoutHandler()); - logoutFilter.setFilterProcessesUrl("/logout/cas"); - return logoutFilter; - } - - @Bean - public SingleSignOutFilter singleSignOutFilter() { - SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); - singleSignOutFilter.setCasServerUrlPrefix("https://localhost:6443/cas"); - singleSignOutFilter.setIgnoreInitConfiguration(true); - return singleSignOutFilter; - } - - @EventListener - public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener(HttpSessionEvent event) { - return new SingleSignOutHttpSessionListener(); - } -} diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java new file mode 100644 index 0000000000..4a2c609758 --- /dev/null +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java @@ -0,0 +1,97 @@ +package com.baeldung.cassecuredapp; + +import org.jasig.cas.client.session.SingleSignOutFilter; +import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; +import org.jasig.cas.client.validation.Cas30ServiceTicketValidator; +import org.jasig.cas.client.validation.TicketValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.context.event.EventListener; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.cas.ServiceProperties; +import org.springframework.security.cas.authentication.CasAuthenticationProvider; +import org.springframework.security.cas.web.CasAuthenticationEntryPoint; +import org.springframework.security.cas.web.CasAuthenticationFilter; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; + +import javax.servlet.http.HttpSessionEvent; + +@SpringBootApplication +public class CasSecuredApplication { + + private static final Logger logger = LoggerFactory.getLogger(CasSecuredApplication.class); + + public static void main(String... args) { + SpringApplication.run(CasSecuredApplication.class, args); + } + + @Bean + public CasAuthenticationFilter casAuthenticationFilter( + AuthenticationManager authenticationManager, + ServiceProperties serviceProperties) throws Exception { + CasAuthenticationFilter filter = new CasAuthenticationFilter(); + filter.setAuthenticationManager(authenticationManager); + filter.setServiceProperties(serviceProperties); + return filter; + } + + @Bean + public ServiceProperties serviceProperties() { + logger.info("service properties"); + ServiceProperties serviceProperties = new ServiceProperties(); + serviceProperties.setService("http://cas-client:8900/login/cas"); + serviceProperties.setSendRenew(false); + return serviceProperties; + } + + @Bean + public TicketValidator ticketValidator() { + return new Cas30ServiceTicketValidator("https://localhost:8443"); + } + + @Bean + public CasAuthenticationProvider casAuthenticationProvider( + TicketValidator ticketValidator, + ServiceProperties serviceProperties) { + CasAuthenticationProvider provider = new CasAuthenticationProvider(); + provider.setServiceProperties(serviceProperties); + provider.setTicketValidator(ticketValidator); + provider.setUserDetailsService( + s -> new User("test@test.com", "Mellon", true, true, true, true, + AuthorityUtils.createAuthorityList("ROLE_ADMIN"))); + provider.setKey("CAS_PROVIDER_LOCALHOST_8900"); + return provider; + } + + + @Bean + public SecurityContextLogoutHandler securityContextLogoutHandler() { + return new SecurityContextLogoutHandler(); + } + + @Bean + public LogoutFilter logoutFilter() { + LogoutFilter logoutFilter = new LogoutFilter("https://localhost:8443/logout", securityContextLogoutHandler()); + logoutFilter.setFilterProcessesUrl("/logout/cas"); + return logoutFilter; + } + + @Bean + public SingleSignOutFilter singleSignOutFilter() { + SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); + singleSignOutFilter.setCasServerUrlPrefix("https://localhost:8443"); + singleSignOutFilter.setLogoutCallbackPath("/exit/cas"); + singleSignOutFilter.setIgnoreInitConfiguration(true); + return singleSignOutFilter; + } + +} diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java deleted file mode 100644 index 2eabed49e1..0000000000 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/SecurityConfig.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.baeldung.cassecuredapp.config; - -import org.jasig.cas.client.session.SingleSignOutFilter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.ProviderManager; -import org.springframework.security.cas.ServiceProperties; -import org.springframework.security.cas.authentication.CasAuthenticationProvider; -import org.springframework.security.cas.web.CasAuthenticationFilter; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.authentication.logout.LogoutFilter; - -import java.util.Arrays; - -@EnableWebSecurity -@Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - private AuthenticationProvider authenticationProvider; - private AuthenticationEntryPoint authenticationEntryPoint; - private SingleSignOutFilter singleSignOutFilter; - private LogoutFilter logoutFilter; - - @Autowired - public SecurityConfig(CasAuthenticationProvider casAuthenticationProvider, AuthenticationEntryPoint eP, - LogoutFilter lF - , SingleSignOutFilter ssF - ) { - this.authenticationProvider = casAuthenticationProvider; - this.authenticationEntryPoint = eP; - - this.logoutFilter = lF; - this.singleSignOutFilter = ssF; - - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .regexMatchers("/secured.*", "/login") - .authenticated() - .and() - .authorizeRequests() - .regexMatchers("/") - .permitAll() - .and() - .httpBasic() - .authenticationEntryPoint(authenticationEntryPoint) - .and() - .logout().logoutSuccessUrl("/logout") - .and() - .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class) - .addFilterBefore(logoutFilter, LogoutFilter.class); - - } - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.authenticationProvider(authenticationProvider); - } - - @Override - protected AuthenticationManager authenticationManager() throws Exception { - return new ProviderManager(Arrays.asList(authenticationProvider)); - } - - @Bean - public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sP) throws Exception { - CasAuthenticationFilter filter = new CasAuthenticationFilter(); - filter.setServiceProperties(sP); - filter.setAuthenticationManager(authenticationManager()); - return filter; - } - -} diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/WebSecurityConfig.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/WebSecurityConfig.java new file mode 100644 index 0000000000..b0c3c68387 --- /dev/null +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/config/WebSecurityConfig.java @@ -0,0 +1,79 @@ +package com.baeldung.cassecuredapp.config; + +import org.jasig.cas.client.session.SingleSignOutFilter; +import org.jasig.cas.client.validation.Cas30ServiceTicketValidator; +import org.jasig.cas.client.validation.TicketValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.ProviderManager; +import org.springframework.security.cas.ServiceProperties; +import org.springframework.security.cas.authentication.CasAuthenticationProvider; +import org.springframework.security.cas.web.CasAuthenticationEntryPoint; +import org.springframework.security.cas.web.CasAuthenticationFilter; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.authentication.logout.LogoutFilter; + +import java.util.Collections; + +@EnableWebSecurity +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + private Logger logger = LoggerFactory.getLogger(WebSecurityConfig.class); + private SingleSignOutFilter singleSignOutFilter; + private LogoutFilter logoutFilter; + private CasAuthenticationProvider casAuthenticationProvider; + private ServiceProperties serviceProperties; + + @Autowired + public WebSecurityConfig(SingleSignOutFilter singleSignOutFilter, LogoutFilter logoutFilter, + CasAuthenticationProvider casAuthenticationProvider, + ServiceProperties serviceProperties) { + this.logoutFilter = logoutFilter; + this.singleSignOutFilter = singleSignOutFilter; + this.serviceProperties = serviceProperties; + this.casAuthenticationProvider = casAuthenticationProvider; + } + + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests().antMatchers( "/secured", "/login").authenticated() + .and() + .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint()) + .and() + .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class) + .addFilterBefore(logoutFilter, LogoutFilter.class) + .csrf().ignoringAntMatchers("/exit/cas"); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(casAuthenticationProvider); + } + + @Bean + @Override + protected AuthenticationManager authenticationManager() throws Exception { + return new ProviderManager(Collections.singletonList(casAuthenticationProvider)); + } + + public AuthenticationEntryPoint authenticationEntryPoint() { + CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint(); + entryPoint.setLoginUrl("https://localhost:8443/login"); + entryPoint.setServiceProperties(serviceProperties); + return entryPoint; + } + + + +} diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java index 2c88b74a83..16254c8cbd 100644 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java @@ -1,7 +1,7 @@ package com.baeldung.cassecuredapp.controllers; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler; @@ -13,24 +13,27 @@ import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import static org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY; + @Controller public class AuthController { - private Logger logger = LogManager.getLogger(AuthController.class); - - @GetMapping("/logout") - public String logout( - HttpServletRequest request, HttpServletResponse response, SecurityContextLogoutHandler logoutHandler) { - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - logoutHandler.logout(request, response, auth ); - new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY).logout(request, response, auth); - return "auth/logout"; - } - + private Logger logger = LoggerFactory.getLogger(AuthController.class); @GetMapping("/login") public String login() { + logger.info("/login called"); return "redirect:/secured"; } + + @GetMapping("/logout") + public String logout(HttpServletRequest request, HttpServletResponse response, SecurityContextLogoutHandler logoutHandler) { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY); + cookieClearingLogoutHandler.logout(request, response, auth); + logoutHandler.logout(request, response, auth); + return "auth/logout"; + } + } diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java index 75956cf493..d4800206d4 100644 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/IndexController.java @@ -1,15 +1,19 @@ package com.baeldung.cassecuredapp.controllers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - @Controller public class IndexController { + private Logger logger = LoggerFactory.getLogger(IndexController.class); + @GetMapping("/") public String index() { + logger.info("Index controller called"); return "index"; } + } diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredController.java new file mode 100644 index 0000000000..0b3ab6199f --- /dev/null +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredController.java @@ -0,0 +1,30 @@ +package com.baeldung.cassecuredapp.controllers; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class SecuredController { + + private Logger logger = LoggerFactory.getLogger(SecuredController.class); + + @GetMapping("/secured") + public String securedIndex(ModelMap modelMap) { + + logger.info("/secured called"); + + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); + + if(auth.getPrincipal() instanceof UserDetails) + modelMap.put("username", ((UserDetails) auth.getPrincipal()).getUsername()); + + return "secure/index"; + } +} diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java deleted file mode 100644 index 9a872d1f40..0000000000 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/SecuredPageController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.cassecuredapp.controllers; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -@RequestMapping(value = "/secured") -public class SecuredPageController { - - @GetMapping - public String index(ModelMap modelMap) { - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); - if( auth != null && auth.getPrincipal() != null - && auth.getPrincipal() instanceof UserDetails) { - modelMap.put("username", ((UserDetails) auth.getPrincipal()).getUsername()); - } - return "secure/index"; - } -} diff --git a/cas/cas-secured-app/src/main/resources/application.properties b/cas/cas-secured-app/src/main/resources/application.properties index 99802c632f..f8789997d5 100644 --- a/cas/cas-secured-app/src/main/resources/application.properties +++ b/cas/cas-secured-app/src/main/resources/application.properties @@ -1 +1,2 @@ -server.port=9000 \ No newline at end of file +server.port=8900 +spring.freemarker.suffix=.ftl \ No newline at end of file diff --git a/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java b/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredApplicationIntegrationTest.java similarity index 84% rename from cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java rename to cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredApplicationIntegrationTest.java index 2f2644e2ea..de13f6665d 100644 --- a/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java +++ b/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredApplicationIntegrationTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class CasSecuredAppApplicationIntegrationTest { +public class CasSecuredApplicationIntegrationTest { @Test public void contextLoads() { diff --git a/cas/cas-server/.factorypath b/cas/cas-server/.factorypath deleted file mode 100644 index 006c761796..0000000000 --- a/cas/cas-server/.factorypath +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cas/cas-server/.gitignore b/cas/cas-server/.gitignore old mode 100644 new mode 100755 index 5304519922..6121b5ea9d --- a/cas/cas-server/.gitignore +++ b/cas/cas-server/.gitignore @@ -2,6 +2,8 @@ !/.project .project .settings +.history +.vscode target/ .idea/ .DS_Store @@ -9,6 +11,11 @@ target/ overlays/ .gradle/ build/ +log/ bin/ +*.war *.iml *.log +tmp/ +./apache-tomcat +apache-tomcat.zip \ No newline at end of file diff --git a/cas/cas-server/.mergify.yml b/cas/cas-server/.mergify.yml new file mode 100644 index 0000000000..4fcbdbe4ac --- /dev/null +++ b/cas/cas-server/.mergify.yml @@ -0,0 +1,32 @@ +# +# Licensed to Apereo under one or more contributor license +# agreements. See the NOTICE file distributed with this work +# for additional information regarding copyright ownership. +# Apereo licenses this file to you 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 the following location: +# +# 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. +# + +pull_request_rules: +- name: automatic merge by dependabot + conditions: + - status-success=continuous-integration/travis-ci/pr + - status-success=WIP + - "#changes-requested-reviews-by=0" + - base=master + - label=dependencies + actions: + merge: + method: merge + strict: true + delete_head_branch: \ No newline at end of file diff --git a/cas/cas-server/.travis.yml b/cas/cas-server/.travis.yml new file mode 100644 index 0000000000..8347dd1719 --- /dev/null +++ b/cas/cas-server/.travis.yml @@ -0,0 +1,62 @@ +language: java +sudo: required +dist: trusty +services: + - docker +branches: + only: + - master +before_cache: + - rm -rf $HOME/.gradle/caches/5.*/ + - rm -rf $HOME/.gradle/caches/4.*/ + - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ + - find ~/.gradle/caches/ -name "*.lock" -type f -delete +cache: + bundler: false + cargo: false + directories: + - $HOME/.m2 + - $HOME/.npm/ + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ +env: + global: + - JAVA_OPTS="-Xms512m -Xmx4048m -Xss128m -XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -Xverify:none -server" + - GRADLE_OPTS="-Xms512m -Xmx1024m -Xss128m -XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -Xverify:none -server" +jdk: +- openjdk11 +before_install: +- echo -e "Configuring Gradle wrapper...\n" +- mkdir -p ~/.gradle && echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties +- chmod -R 777 ./gradlew +- chmod -R 777 *.sh +install: true +stages: + - build + - validate + - docker +jobs: + include: + - stage: build + script: ./gradlew clean build --stacktrace --no-daemon --refresh-dependencies -Dorg.gradle.internal.http.socketTimeout=600000 -Dorg.gradle.internal.http.connectionTimeout=600000 + name: "Build CAS" + ############################################ + - stage: validate + script: ./gradlew downloadShell + name: "Download CAS Shell" + - stage: validate + script: ./gradlew listTemplateViews + name: "List CAS Template Views" + - stage: validate + script: ./gradlew explodeWar + name: "Unzip CAS Web Application" + ############################################ + - stage: docker + script: ./gradlew build jibDockerBuild --stacktrace --no-daemon --refresh-dependencies + name: "Build Docker Image via Jib" + - stage: docker + script: docker-compose build + name: "Build Docker Image via Docker Compose" + - stage: docker + script: ./docker-build.sh + name: "Build Docker Image" \ No newline at end of file diff --git a/cas/cas-server/Dockerfile b/cas/cas-server/Dockerfile new file mode 100644 index 0000000000..b2f15ef4c3 --- /dev/null +++ b/cas/cas-server/Dockerfile @@ -0,0 +1,40 @@ +FROM adoptopenjdk/openjdk11:alpine-slim AS overlay + +RUN mkdir -p cas-overlay +COPY ./src cas-overlay/src/ +COPY ./gradle/ cas-overlay/gradle/ +COPY ./gradlew ./settings.gradle ./build.gradle ./gradle.properties /cas-overlay/ + +RUN mkdir -p ~/.gradle \ + && echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties \ + && echo "org.gradle.configureondemand=true" >> ~/.gradle/gradle.properties \ + && cd cas-overlay \ + && chmod 750 ./gradlew \ + && ./gradlew --version; + +RUN cd cas-overlay \ + && ./gradlew clean build --parallel; + +FROM adoptopenjdk/openjdk11:alpine-jre AS cas + +LABEL "Organization"="Apereo" +LABEL "Description"="Apereo CAS" + +RUN cd / \ + && mkdir -p /etc/cas/config \ + && mkdir -p /etc/cas/services \ + && mkdir -p /etc/cas/saml \ + && mkdir -p cas-overlay; + +COPY etc/cas/ /etc/cas/ +COPY etc/cas/config/ /etc/cas/config/ +COPY etc/cas/services/ /etc/cas/services/ +COPY etc/cas/saml/ /etc/cas/saml/ +COPY --from=overlay cas-overlay/build/libs/cas.war cas-overlay/ + +EXPOSE 8080 8443 + +ENV PATH $PATH:$JAVA_HOME/bin:. + +WORKDIR cas-overlay +ENTRYPOINT ["java", "-server", "-noverify", "-Xmx2048M", "-jar", "cas.war"] diff --git a/cas/cas-server/README.md b/cas/cas-server/README.md index 44cfa2246c..b224738732 100644 --- a/cas/cas-server/README.md +++ b/cas/cas-server/README.md @@ -1,105 +1,146 @@ -CAS Overlay Template -============================ +CAS Overlay Template [![Build Status](https://travis-ci.org/apereo/cas-overlay-template.svg?branch=master)](https://travis-ci.org/apereo/cas-overlay-template) +======================= -Generic CAS WAR overlay to exercise the latest versions of CAS. This overlay could be freely used as a starting template for local CAS war overlays. The CAS services management overlay is available [here](https://github.com/apereo/cas-services-management-overlay). +Generic CAS WAR overlay to exercise the latest versions of CAS. This overlay could be freely used as a starting template for local CAS war overlays. # Versions -```xml -5.3.x +- CAS `6.1.x` +- JDK `11` + +# Overview + +To build the project, use: + +```bash +# Use --refresh-dependencies to force-update SNAPSHOT versions +./gradlew[.bat] clean build ``` -# Requirements - -* JDK 1.8+ - -# Configuration - -The `etc` directory contains the configuration files and directories that need to be copied to `/etc/cas/config`. - -# Build - To see what commands are available to the build script, run: ```bash -./build.sh help +./gradlew[.bat] tasks ``` -To package the final web application, run: +To launch into the CAS command-line shell: ```bash -./build.sh package +./gradlew[.bat] downloadShell runShell ``` -To update `SNAPSHOT` versions run: +To fetch and overlay a CAS resource or view, use: ```bash -./build.sh package -U +./gradlew[.bat] getResource -PresourceName=[resource-name] ``` +To list all available CAS views and templates: + +```bash +./gradlew[.bat] listTemplateViews +``` + +To unzip and explode the CAS web application file and the internal resources jar: + +```bash +./gradlew[.bat] explodeWar +``` + +# Configuration + +- The `etc` directory contains the configuration files and directories that need to be copied to `/etc/cas/config`. + +```bash +./gradlew[.bat] copyCasConfiguration +``` + +- The specifics of the build are controlled using the `gradle.properties` file. + +## Adding Modules + +CAS modules may be specified under the `dependencies` block of the [Gradle build script](build.gradle): + +```gradle +dependencies { + compile "org.apereo.cas:cas-server-some-module:${project.casVersion}" + ... +} +``` + +To collect the list of all project modules and dependencies: + +```bash +./gradlew[.bat] allDependencies +``` + +### Clear Gradle Cache + +If you need to, on Linux/Unix systems, you can delete all the existing artifacts (artifacts and metadata) Gradle has downloaded using: + +```bash +# Only do this when absolutely necessary +rm -rf $HOME/.gradle/caches/ +``` + +Same strategy applies to Windows too, provided you switch `$HOME` to its equivalent in the above command. + # Deployment -- Create a keystore file `thekeystore` under `/etc/cas`. Use the password `changeit` for both the keystore and the key/certificate entries. +- Create a keystore file `thekeystore` under `/etc/cas`. Use the password `changeit` for both the keystore and the key/certificate entries. This can either be done using the JDK's `keytool` utility or via the following command: + +```bash +./gradlew[.bat] createKeystore +``` + - Ensure the keystore is loaded up with keys and certificates of the server. On a successful deployment via the following methods, CAS will be available at: -* `http://cas.server.name:8080/cas` * `https://cas.server.name:8443/cas` ## Executable WAR -Run the CAS web application as an executable WAR. +Run the CAS web application as an executable WAR: ```bash -./build.sh run +./gradlew[.bat] run ``` -## Spring Boot - -Run the CAS web application as an executable WAR via Spring Boot. This is most useful during development and testing. +Debug the CAS web application as an executable WAR: ```bash -./build.sh bootrun +./gradlew[.bat] debug ``` -### Warning! +Run the CAS web application as a *standalone* executable WAR: -Be careful with this method of deployment. `bootRun` is not designed to work with already executable WAR artifacts such that CAS server web application. YMMV. Today, uses of this mode ONLY work when there is **NO OTHER** dependency added to the build script and the `cas-server-webapp` is the only present module. See [this issue](https://github.com/spring-projects/spring-boot/issues/8320) for more info. - - -## Spring Boot App Server Selection - -There is an app.server property in the `pom.xml` that can be used to select a spring boot application server. -It defaults to `-tomcat` but `-jetty` and `-undertow` are supported. - -It can also be set to an empty value (nothing) if you want to deploy CAS to an external application server of your choice. - -```xml --tomcat -``` - -## Windows Build - -If you are building on windows, try `build.cmd` instead of `build.sh`. Arguments are similar but for usage, run: - -``` -build.cmd help +```bash +./gradlew[.bat] clean executable ``` ## External -Deploy resultant `target/cas.war` to a servlet container of choice. +Deploy the binary web application file `cas.war` after a successful build to a servlet container of choice. +## Docker -## Command Line Shell +The following strategies outline how to build and deploy CAS Docker images. -Invokes the CAS Command Line Shell. For a list of commands either use no arguments or use `-h`. To enter the interactive shell use `-sh`. +### Jib + +The overlay embraces the [Jib Gradle Plugin](https://github.com/GoogleContainerTools/jib) to provide easy-to-use out-of-the-box tooling for building CAS docker images. Jib is an open-source Java containerizer from Google that lets Java developers build containers using the tools they know. It is a container image builder that handles all the steps of packaging your application into a container image. It does not require you to write a Dockerfile or have Docker installed, and it is directly integrated into the overlay. ```bash -./build.sh cli +./gradlew build jibDockerBuild ``` -### Relevant Articles: +### Dockerfile -- [CAS SSO With Spring Security](https://www.baeldung.com/spring-security-cas-sso) +You can also use the native Docker tooling and the provided `Dockerfile` to build and run CAS. + +```bash +chmod +x *.sh +./docker-build.sh +./docker-run.sh +``` diff --git a/cas/cas-server/build.cmd b/cas/cas-server/build.cmd deleted file mode 100644 index 2cf9262afe..0000000000 --- a/cas/cas-server/build.cmd +++ /dev/null @@ -1,102 +0,0 @@ -@echo off - -@set JAVA_ARGS=-Xms500m -Xmx1g -@set CAS_DIR=\etc\cas -@set CONFIG_DIR=\etc\cas\config - -@rem Call this script with DNAME and CERT_SUBJ_ALT_NAMES already set to override -@if "%DNAME%" == "" set DNAME=CN=cas.example.org,OU=Example,OU=Org,C=US -@rem List other host names or ip addresses you want in your certificate, may help with host name verification, -@rem if client apps make https connection for ticket validation and compare name in cert (include sub. alt. names) -@rem to name used to access CAS -@if "%CERT_SUBJ_ALT_NAMES%" == "" set CERT_SUBJ_ALT_NAMES=dns:example.org,dns:localhost,dns:%COMPUTERNAME%,ip:127.0.0.1 - -@rem Check for mvn in path, use it if found, otherwise use maven wrapper -@set MAVEN_CMD=mvn -@where /q mvn -@if %ERRORLEVEL% neq 0 set MAVEN_CMD=.\mvnw.bat - -@if "%1" == "" call:help -@if "%1" == "copy" call:copy -@if "%1" == "clean" call:clean %2 %3 %4 -@if "%1" == "package" call:package %2 %3 %4 -@if "%1" == "bootrun" call:bootrun %2 %3 %4 -@if "%1" == "debug" call:debug %2 %3 %4 -@if "%1" == "run" call:run %2 %3 %4 -@if "%1" == "runalone" call:runalone %2 %3 %4 -@if "%1" == "help" call:help -@if "%1" == "gencert" call:gencert -@if "%1" == "cli" call:runcli %2 %3 %4 - -@rem function section starts here -@goto:eof - -:copy - @echo "Creating configuration directory under %CONFIG_DIR%" - if not exist %CONFIG_DIR% mkdir %CONFIG_DIR% - - @echo "Copying configuration files from etc/cas to /etc/cas" - xcopy /S /Y etc\cas\* \etc\cas -@goto:eof - -:help - @echo "Usage: build.bat [copy|clean|package|run|debug|bootrun|gencert|cli] [optional extra args for maven or cli]" - @echo "To get started on a clean system, run "build.bat copy" and "build.bat gencert", then "build.bat run" - @echo "Note that using the copy or gencert arguments will create and/or overwrite the %CAS_DIR% which is outside this project" -@goto:eof - -:clean - call %MAVEN_CMD% clean %1 %2 %3 - exit /B %ERRORLEVEL% -@goto:eof - -:package - call %MAVEN_CMD% clean package -T 5 %1 %2 %3 - exit /B %ERRORLEVEL% -@goto:eof - -:bootrun - call %MAVEN_CMD% clean package spring-boot:run -T 5 %1 %2 %3 - exit /B %ERRORLEVEL% -@goto:eof - -:debug - call:package %1 %2 %3 & java %JAVA_ARGS% -Xdebug -Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=n -jar target/cas.war -@goto:eof - -:run - call:package %1 %2 %3 & java %JAVA_ARGS% -jar target/cas.war -@goto:eof - -:runalone - call:package %1 %2 %3 & target/cas.war -@goto:eof - -:gencert - where /q keytool - if ERRORLEVEL 1 ( - @echo Java keytool.exe not found in path. - exit /b 1 - ) else ( - if not exist %CAS_DIR% mkdir %CAS_DIR% - @echo on - @echo Generating self-signed SSL cert for %DNAME% in %CAS_DIR%\thekeystore - keytool -genkeypair -alias cas -keyalg RSA -keypass changeit -storepass changeit -keystore %CAS_DIR%\thekeystore -dname %DNAME% -ext SAN=%CERT_SUBJ_ALT_NAMES% - @echo Exporting cert for use in trust store (used by cas clients) - keytool -exportcert -alias cas -storepass changeit -keystore %CAS_DIR%\thekeystore -file %CAS_DIR%\cas.cer - ) -@goto:eof - -:runcli - for /f %%i in ('call %MAVEN_CMD% -q --non-recursive "-Dexec.executable=cmd" "-Dexec.args=/C echo ${cas.version}" "org.codehaus.mojo:exec-maven-plugin:1.3.1:exec"') do set CAS_VERSION=%%i - @set CAS_VERSION=%CAS_VERSION: =% - @set DOWNLOAD_DIR=target - @set COMMAND_FILE=cas-server-support-shell-%CAS_VERSION%.jar - @if not exist %DOWNLOAD_DIR% mkdir %DOWNLOAD_DIR% - @if not exist %DOWNLOAD_DIR%\%COMMAND_FILE% ( - @call mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:get -DgroupId=org.apereo.cas -DartifactId=cas-server-support-shell -Dversion=%CAS_VERSION% -Dpackaging=jar -DartifactItem.outputDirectory=%DOWNLOAD_DIR% -DartifactItem.destFileName=%COMMAND_FILE% -DremoteRepositories=central::default::http://repo1.maven.apache.org/maven2,snapshots::::https://oss.sonatype.org/content/repositories/snapshots -Dtransitive=false - @call mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:copy -Dmdep.useBaseVersion=true -Dartifact=org.apereo.cas:cas-server-support-shell:%CAS_VERSION%:jar -DoutputDirectory=%DOWNLOAD_DIR% - ) - @call java %JAVA_ARGS% -jar %DOWNLOAD_DIR%\%COMMAND_FILE% %1 %2 %3 - -@goto:eof \ No newline at end of file diff --git a/cas/cas-server/build.gradle b/cas/cas-server/build.gradle new file mode 100644 index 0000000000..41381e2d8f --- /dev/null +++ b/cas/cas-server/build.gradle @@ -0,0 +1,106 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url "https://repo.spring.io/libs-milestone" } + maven { url "https://repo.spring.io/libs-snapshot" } + maven { url "https://plugins.gradle.org/m2/" } + } + dependencies { + classpath "de.undercouch:gradle-download-task:${project.gradleDownloadTaskVersion}" + classpath "org.springframework.boot:spring-boot-gradle-plugin:${project.springBootVersion}" + classpath "gradle.plugin.com.google.cloud.tools:jib-gradle-plugin:${project.jibVersion}" + classpath "io.freefair.gradle:maven-plugin:${project.gradleMavenPluginVersion}" + } +} + +repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url "https://build.shibboleth.net/nexus/content/repositories/releases/" } + maven { url "https://repo.spring.io/milestone/" } + maven { url "https://repo.spring.io/snapshot/" } + maven { url "https://oss.jfrog.org/artifactory/oss-snapshot-local" } +} + +def casServerVersion = project.'cas.version' +def casWebApplicationBinaryName = "cas.war" + +project.ext."casServerVersion" = casServerVersion +project.ext."casWebApplicationBinaryName" = casWebApplicationBinaryName + +apply plugin: "io.freefair.war-overlay" +apply from: rootProject.file("gradle/tasks.gradle") + +apply plugin: "war" +apply plugin: "eclipse" +apply plugin: "idea" + +apply from: rootProject.file("gradle/springboot.gradle") +apply from: rootProject.file("gradle/dockerjib.gradle") + +dependencies { + // Other CAS dependencies/modules may be listed here... + compile "org.apereo.cas:cas-server-support-json-service-registry:${casServerVersion}" + compile "org.apereo.cas:cas-server-support-jdbc:${casServerVersion}" +} + +tasks.findByName("jibDockerBuild") + .dependsOn(copyWebAppIntoJib, copyConfigIntoJib) + .finalizedBy(deleteWebAppFromJib) + +tasks.findByName("jib") + .dependsOn(copyWebAppIntoJib, copyConfigIntoJib) + .finalizedBy(deleteWebAppFromJib) + +configurations.all { + resolutionStrategy { + cacheChangingModulesFor 0, "seconds" + cacheDynamicVersionsFor 0, "seconds" + + preferProjectModules() + + def failIfConflict = project.hasProperty("failOnVersionConflict") && Boolean.valueOf(project.getProperty("failOnVersionConflict")) + if (failIfConflict) { + failOnVersionConflict() + } + } +} + +eclipse { + classpath { + downloadSources = true + downloadJavadoc = true + } +} + +idea { + module { + downloadJavadoc = true + downloadSources = true + } +} + +bootWar { + entryCompression = ZipEntryCompression.STORED + overlays { + // https://docs.freefair.io/gradle-plugins/current/reference/#_io_freefair_war_overlay + // Note: The "excludes" property is only for files in the war dependency. + // If a jar is excluded from the war, it could be brought back into the final war as a dependency + // of non-war dependencies. Those should be excluded via normal gradle dependency exclusions. + cas { + from "org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}@war" + provided = false + //excludes = ["WEB-INF/lib/somejar-1.0*"] + } + } +} + + +wrapper { + distributionType = Wrapper.DistributionType.BIN + gradleVersion = "${project.gradleVersion}" +} diff --git a/cas/cas-server/build.sh b/cas/cas-server/build.sh deleted file mode 100644 index 4d80aa2593..0000000000 --- a/cas/cas-server/build.sh +++ /dev/null @@ -1,189 +0,0 @@ -#!/bin/bash - - -function copy() { - echo -e "Creating configuration directory under /etc/cas" - mkdir -p /etc/cas/config - - echo -e "Copying configuration files from etc/cas to /etc/cas" - cp -rfv etc/cas/* /etc/cas -} - -function help() { - echo "Usage: build.sh [copy|clean|package|run|debug|bootrun|gencert]" - echo " copy: Copy config from ./etc/cas/config to /etc/cas/config" - echo " clean: Clean Maven build directory" - echo " package: Clean and build CAS war" - echo " run: Build and run cas.war via Java (i.e. java -jar target/cas.war)" - echo " runalone: Build and run cas.war on its own as a standalone executable (target/cas.war)" - echo " debug: Run CAS.war and listen for Java debugger on port 5000" - echo " bootrun: Run with maven spring boot plugin" - echo " listviews: List all CAS views that ship with the web application and can be customized in the overlay" - echo " getview: Ask for a view name to be included in the overlay for customizations" - echo " gencert: Create keystore with SSL certificate in location where CAS looks by default" - echo " cli: Run the CAS command line shell and pass commands" -} - -function clean() { - shift - ./mvnw clean "$@" -} - -function package() { - shift - ./mvnw clean package -T 5 "$@" - # copy -} - -function bootrun() { - shift - ./mvnw clean package spring-boot:run -P bootiful -T 5 "$@" -} - -function debug() { - package && java -Xdebug -Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=n -jar target/cas.war -} - -function run() { - package && java -jar target/cas.war -} - -function runalone() { - shift - ./mvnw clean package -P default,exec "$@" - chmod +x target/cas.war - target/cas.war -} - -function listviews() { - shift - explodeapp - find $PWD/target/cas -type f -name "*.html" | xargs -n 1 basename | sort | more -} - -function explodeapp() { - if [ ! -d $PWD/target/cas ];then - echo "Building the CAS web application and exploding the final war file..." - ./mvnw clean package war:exploded "$@" - fi - echo "Exploded the CAS web application file." -} - -function getview() { - shift - explodeapp - echo "Searching for view name $@..." - results=`find $PWD/target/cas -type f -name "*.html" | grep -i "$@"` - echo -e "Found view(s): \n$results" - count=`wc -w <<< "$results"` - if [ "$count" -eq 1 ];then - # echo "Found view $results to include in the overlay" - firststring="target/cas/WEB-INF/classes" - secondstring="src/main/resources" - overlayfile=`echo "${results/$firststring/$secondstring}"` - overlaypath=`dirname "${overlayfile}"` - # echo "Overlay file is $overlayfile to be created at $overlaypath" - mkdir -p $overlaypath - cp $results $overlaypath - echo "Created view at $overlayfile" - ls $overlayfile - else - echo "More than one view file is found. Narrow down the search query..." - fi -} - - -function gencert() { - if [[ ! -d /etc/cas ]] ; then - copy - fi - which keytool - if [[ $? -ne 0 ]] ; then - echo Error: Java JDK \'keytool\' is not installed or is not in the path - exit 1 - fi - # override DNAME and CERT_SUBJ_ALT_NAMES before calling or use dummy values - DNAME="${DNAME:-CN=cas.example.org,OU=Example,OU=Org,C=US}" - CERT_SUBJ_ALT_NAMES="${CERT_SUBJ_ALT_NAMES:-dns:example.org,dns:localhost,ip:127.0.0.1}" - echo "Generating keystore for CAS with DN ${DNAME}" - keytool -genkeypair -alias cas -keyalg RSA -keypass changeit -storepass changeit -keystore /etc/cas/thekeystore -dname ${DNAME} -ext SAN=${CERT_SUBJ_ALT_NAMES} - keytool -exportcert -alias cas -storepass changeit -keystore /etc/cas/thekeystore -file /etc/cas/cas.cer -} - -function cli() { - - CAS_VERSION=$(./mvnw -q -Dexec.executable="echo" -Dexec.args='${cas.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec 2>/dev/null) - # echo "CAS version: $CAS_VERSION" - JAR_FILE_NAME="cas-server-support-shell-${CAS_VERSION}.jar" - # echo "JAR name: $JAR_FILE_NAME" - JAR_PATH="org/apereo/cas/cas-server-support-shell/${CAS_VERSION}/${JAR_FILE_NAME}" - # echo "JAR path: $JAR_PATH" - - JAR_FILE_LOCAL="$HOME/.m2/repository/$JAR_PATH"; - # echo "Local JAR file path: $JAR_FILE_LOCAL"; - if [ -f "$JAR_FILE_LOCAL" ]; then - # echo "Using JAR file locally at $JAR_FILE_LOCAL" - java -jar $JAR_FILE_LOCAL "$@" - exit 0; - fi - - DOWNLOAD_DIR=./target - COMMAND_FILE="${DOWNLOAD_DIR}/${JAR_FILE_NAME}" - if [ ! -f "$COMMAND_FILE" ]; then - mkdir -p $DOWNLOAD_DIR - ./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.0.2:get -DgroupId=org.apereo.cas -DartifactId=cas-server-support-shell -Dversion=$CAS_VERSION -Dpackaging=jar -DartifactItem.outputDirectory=$DOWNLOAD_DIR -DremoteRepositories=central::default::http://repo1.maven.apache.org/maven2,snapshots::::https://oss.sonatype.org/content/repositories/snapshots -Dtransitive=false - ./mvnw org.apache.maven.plugins:maven-dependency-plugin:3.0.2:copy -Dmdep.useBaseVersion=true -Dartifact=org.apereo.cas:cas-server-support-shell:$CAS_VERSION:jar -DoutputDirectory=$DOWNLOAD_DIR - fi - java -jar $COMMAND_FILE "$@" - exit 0; - -} - -if [ $# -eq 0 ]; then - echo -e "No commands provided. Defaulting to [run]\n" - run - exit 0 -fi - -case "$1" in -"copy") - copy - ;; -"clean") - shift - clean "$@" - ;; -"package") - shift - package "$@" - ;; -"bootrun") - shift - bootrun "$@" - ;; -"debug") - debug "$@" - ;; -"run") - run "$@" - ;; -"runalone") - runalone "$@" - ;; -"listviews") - listviews "$@" - ;; -"gencert") - gencert "$@" - ;; -"getview") - getview "$@" - ;; -"cli") - shift - cli "$@" - ;; -*) - help - ;; -esac diff --git a/cas/cas-server/docker-build.sh b/cas/cas-server/docker-build.sh new file mode 100755 index 0000000000..8f2c2776bf --- /dev/null +++ b/cas/cas-server/docker-build.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +image_tag=(`cat gradle.properties | grep "cas.version" | cut -d= -f2`) + +echo "Building CAS docker image tagged as [$image_tag]" +# read -p "Press [Enter] to continue..." any_key; + +docker build --tag="org.apereo.cas/cas:$image_tag" . \ + && echo "Built CAS image successfully tagged as org.apereo.cas/cas:$image_tag" \ + && docker images "org.apereo.cas/cas:$image_tag" \ No newline at end of file diff --git a/cas/cas-server/docker-compose.yml b/cas/cas-server/docker-compose.yml new file mode 100644 index 0000000000..8f2e6ca7c9 --- /dev/null +++ b/cas/cas-server/docker-compose.yml @@ -0,0 +1,7 @@ +version: '3' +services: + cas: + build: . + ports: + - "8443:8443" + - "8080:8080" \ No newline at end of file diff --git a/cas/cas-server/docker-push.sh b/cas/cas-server/docker-push.sh new file mode 100755 index 0000000000..e04b107212 --- /dev/null +++ b/cas/cas-server/docker-push.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +read -p "Docker username: " docker_user +read -s -p "Docker password: " docker_psw + +echo "$docker_psw" | docker login --username "$docker_user" --password-stdin + +image_tag=(`cat gradle.properties | grep "cas.version" | cut -d= -f2`) + +echo "Pushing CAS docker image tagged as $image_tag to org.apereo.cas/cas..." +docker push org.apereo.cas/cas:"$image_tag" \ + && echo "Pushed org.apereo.cas/cas:$image_tag successfully."; \ No newline at end of file diff --git a/cas/cas-server/docker-run.sh b/cas/cas-server/docker-run.sh new file mode 100755 index 0000000000..f8627859f2 --- /dev/null +++ b/cas/cas-server/docker-run.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +docker stop cas > /dev/null 2>&1 +docker rm cas > /dev/null 2>&1 +image_tag=(`cat gradle.properties | grep "cas.version" | cut -d= -f2`) +docker run -d -p 8080:8080 -p 8443:8443 --name="cas" org.apereo.cas/cas:"${image_tag}" +docker logs -f cas \ No newline at end of file diff --git a/cas/cas-server/etc/cas/config/application.yml b/cas/cas-server/etc/cas/config/application.yml deleted file mode 100644 index be1f7c3edd..0000000000 --- a/cas/cas-server/etc/cas/config/application.yml +++ /dev/null @@ -1,2 +0,0 @@ -info: - description: CAS Configuration \ No newline at end of file diff --git a/cas/cas-server/etc/cas/config/cas.properties b/cas/cas-server/etc/cas/config/cas.properties index 47a1477308..a3be0e1388 100644 --- a/cas/cas-server/etc/cas/config/cas.properties +++ b/cas/cas-server/etc/cas/config/cas.properties @@ -1,7 +1,6 @@ -cas.server.name: https://cas.example.org:8443 -cas.server.prefix: https://cas.example.org:8443/cas - -cas.adminPagesSecurity.ip=127\.0\.0\.1 +cas.server.name=https://cas.example.org:8443 +cas.server.prefix=${cas.server.name}/cas logging.config: file:/etc/cas/config/log4j2.xml -# cas.serviceRegistry.config.location: classpath:/services + +# cas.authn.accept.users= diff --git a/cas/cas-server/etc/cas/config/log4j2.xml b/cas/cas-server/etc/cas/config/log4j2.xml index e688cc0350..685dfab245 100644 --- a/cas/cas-server/etc/cas/config/log4j2.xml +++ b/cas/cas-server/etc/cas/config/log4j2.xml @@ -2,20 +2,26 @@ - - . - - warn + /var/log + + info + warn + info + warn + debug + warn + warn + warn + warn + warn + warn - + - + @@ -23,8 +29,8 @@ - + @@ -33,16 +39,6 @@ - - - - - - - - - @@ -52,52 +48,58 @@ - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cas/cas-server/etc/cas/saml/.gitkeep b/cas/cas-server/etc/cas/saml/.gitkeep new file mode 100644 index 0000000000..882c99944d --- /dev/null +++ b/cas/cas-server/etc/cas/saml/.gitkeep @@ -0,0 +1 @@ +This directory is references in the Dockerfile so it needs to be here. \ No newline at end of file diff --git a/cas/cas-server/etc/cas/services/.donotdel b/cas/cas-server/etc/cas/services/.donotdel new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cas/cas-server/etc/cas/thekeystore b/cas/cas-server/etc/cas/thekeystore new file mode 100644 index 0000000000000000000000000000000000000000..78f49baf743bc53e74cb67746992be258229c310 GIT binary patch literal 2266 zcmcgtc{J1w7oOkD7#YUW2w6i>BlG^ol6P!l$THbwi=vqO} zmYOk062e%@YtIrw=n$_u-*?XY$M^U5$35ph&%O7Yd!BpGy}Ms`zd|4o=)M8J4R(p_ zyYExV1$Fib4gjRWe}cRSqyhqf0~n|P0B}IyRQMbrXw&-UkX;%=H~+&uQHb3Frx62$ z_ZK7qS)+$zucd0azsOV;vTvu0vLqElCvV!Bz-nJ9z0&irkt8K}> zJrJ0~8>Cg57A~TFKxJviS1W$}L~4=(L-R7?3at^Tsq;scd>n;pKWwh!gk zHC$)eb@&cVlM2zX_W@HEh9*x)v zgKta)@yyS69GS8R`>Z(0YN)IEzQVZ^iDlFD;~52}`o5~x{X!0;0pT&YEiSI}8E*;U z=hN#w;gi$FL-$)IGePw7*< zmNTt?+v_`pF(tYoc73CozG)E;p5DJDwJ}sl^L{c-AVfM3FdF-nd0(@{#`N_#H$=jLe(4bHNWu@5aLK?nlJknSS zu;;hSYCw!P&g=g0h>DA|=talkLx%R|qAzD47Oqr8`8qpGzj2xSa^Qn(uAdbwMsdNq z8RKuxv6h}(9Kj}IsMQqz}-*N4iT_2YBLotQ?S`s7Ck z$~3kH>KB-NiI17cT&J_|b_E^F^X1J*BHCxAoz6)-HlC&Ad9Wr*vQ?52Z>g=@Bn@VI zR=b)L-5MX)P;KD2`NI*Kuu{44*b+r-aJt`rY`43SMqajA)YU6i{_b1TT5mgbXe5!Gu1wODRyDKyKPR}CzVMcuGh@|Q-ek5 zA4QaYQ4<$hmyFrb>5MYPjq~pBG_(84xfv&W`g(l`T!E`E`qOjU8N($aQ7>Z~h3rhy zpWJ8qC6ChX34iDPbl#?W`ZPMhG;+`FrCUS8WLuDxArD@CtVPGHIjy;T8Y7}QCHHFS z;Nu`}=~i#s;a*Ag*rw|B=B413OsXDxt7wtYjUyQ5mO`v$S9DvU=_q<2v_3GogQOC} zHjB)rH#74^nnj62H=8P;%>z+?`}cV#bLh$L74>df7vk>Xg?^Aq$VJy41tWm3;&*}u+! zHva7yjdS>;&Tb92p?=E*A6BMuectg9sHt4CbqaaA=GeAaox#W5Dj$-j-R&B_s9;X{ z0#1V`H=3~6(uXD|6R12RJ7f)Q5j?E@L_|X8(haAnVcs5Z?K&ji`j;2%^MX^gq zN*viE94`y+7+A#X%+iX=R?S=%@}M%JUSXjHiY^7(IiHQ(+E3T5hbXmuAgjVinXE|h z%5Mvqd1O6#L8%)TlscV;(YM`>UclguYfrdmeH;}?iWB+p`zmtSV^u*s1Om$dsjyU# z3JuPOK>;Wf?p*0c22ltuOtew-CJF$!IUt}1jvM4cz--_MG}Pwof58DXl<0ut-@m2% z5l%Fxp~qE<>kU5~-+uW%gG3{2yge@Yc;k3LdvapIupF9buQy}W$L!NIOB zSpVO7SZ`N9P*NC$`x8_F@i-i)qO9Z~j8ejZI8f<7@c-Eg6_EM25c_WeMg{mFAQeDD zsQ>`EV_RHzx&jx_^cq|Zo*Uu0^uq(A+_E@k`j$#e6S&rY_(#^dxusOEK69>M9?MpY)kf|5u@rMWaLTZzZfK#}jVIyAih7z9a+uP;{Dy@L*x%FsVpunNTDoZ9;=G z{@!%%t=+EC*UkW*#j5U{;A!G7+r4Oh(le*nVg3nK2{TF78IqV$ms7|rn{<-wwG`Ka z!T<H82FI)&Nn30Q)ncWKYf3nUB_0+rRnkXY-@Nbd# zw{2f!0OIJNo^3StQ#U7l<9+9DKVZxlEaJ%$!wJ6 z6y$N8ju9&GIoHjG{`%BfHLvFEghR}L(EF*~33ki6J^q26u&QY?_ulsTmLA~Z?EJ_K z#`Cbk_~lkrrplSv7MNqqO;V5i7h)I!ubXvUEq!K7elbcRf@d1WB|+%te4Vg!V~%mD zKu{0Q3~v%(o|O36HCAaN%H{v`*!faCu~=huy*1>n1`V@gq#)KN;|&`^$Sln(Arrays.asList("-server -noverify -Xmx2048M -XX:+TieredCompilation -XX:TieredStopAtLevel=1".split(" "))) + if (project.hasProperty('args')) { + casRunArgs.addAll(project.args.split('\\s+')) + } + javaexec { + main = "-jar" + jvmArgs = casRunArgs + args = ["build/libs/${casWebApplicationBinaryName}"] + logger.info "Started ${commandLine}" + } + } +} + +task setExecutable(group: "build", description: "Configure the project to run in executable mode") { + doFirst { + project.setProperty("executable", "true") + logger.info "Configuring the project as executable" + } +} + +task executable(type:Exec, group: "build", description: "Run the CAS web application in standalone executable mode") { + dependsOn setExecutable, 'build' + doFirst { + workingDir "." + if (!Os.isFamily(Os.FAMILY_WINDOWS)) { + commandLine "chmod", "+x", bootWar.archivePath + } + logger.info "Running ${bootWar.archivePath}" + commandLine bootWar.archivePath + } +} + +task debug(group: "build", description: "Debug the CAS web application in embedded mode on port 5005") { + dependsOn 'build' + doLast { + logger.info "Debugging process is started in a suspended state, listening on port 5005." + def casArgs = Arrays.asList("-Xmx2048M".split(" ")) + javaexec { + main = "-jar" + jvmArgs = casArgs + debug = true + args = ["build/libs/${casWebApplicationBinaryName}"] + logger.info "Started ${commandLine}" + } + } +} + +task downloadShell(group: "shell", description: "Download CAS shell jar from snapshot or release maven repo") { + doFirst { + mkdir "${project.shellDir}" + } + doLast { + def downloadFile + if (isRunningCasServerSnapshot(casServerVersion)) { + def snapshotDir = "https://oss.sonatype.org/content/repositories/snapshots/org/apereo/cas/cas-server-support-shell/${casServerVersion}/" + def files = new ApacheURLLister().listFiles(new URL(snapshotDir)) + files = files.sort{it.path} + files.each { + if (it.path.endsWith(".jar")) { + downloadFile = it + } + } + } else { + downloadFile = "https://repo1.maven.org/maven2/org/apereo/cas/cas-server-support-shell/${casServerVersion}/cas-server-support-shell-${casServerVersion}.jar" + } + logger.info "Downloading file: ${downloadFile}" + download { + src downloadFile + dest new File("${project.shellDir}", "cas-server-support-shell-${casServerVersion}.jar") + overwrite false + } + } +} + +task runShell(group: "shell", description: "Run the CAS shell") { + dependsOn downloadShell + doLast { + println "Run the following command to launch the shell:\n\tjava -jar ${project.shellDir}/cas-server-support-shell-${casServerVersion}.jar" + } +} + +task debugShell(group: "shell", description: "Run the CAS shell with debug options, wait for debugger on port 5005") { + dependsOn downloadShell + doLast { + println """ + Run the following command to launch the shell:\n\t + java -Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=y -jar ${project.shellDir}/cas-server-support-shell-${casServerVersion}.jar + """ + } +} + +task showConfiguration(group: "build", description: "Show configurations for each dependency, etc") { + doLast() { + def cfg = project.hasProperty("configuration") ? project.property("configuration") : "compile" + configurations.getByName(cfg).each { println it } + } +} + +task allDependenciesInsight(group: "build", type: DependencyInsightReportTask, description: "Produce insight information for all dependencies") {} + +task allDependencies(group: "build", type: DependencyReportTask, description: "Display a graph of all project dependencies") {} + +task casVersion (group: "build", description: "Display the current CAS version") { + doFirst { + def verbose = project.hasProperty("verbose") && Boolean.valueOf(project.getProperty("verbose")) + if (verbose) { + def out = services.get(StyledTextOutputFactory).create("CAS") + println "******************************************************************" + out.withStyle(Style.Info).println "Apereo CAS $casServerVersion" + out.withStyle(Style.Description).println "Enterprise Single SignOn for all earthlings and beyond" + out.withStyle(Style.SuccessHeader).println "- GitHub: " + out.withStyle(Style.Success).println "https://github.com/apereo/cas" + out.withStyle(Style.SuccessHeader).println "- Docs: " + out.withStyle(Style.Success).println "https://apereo.github.io/cas" + out.withStyle(Style.SuccessHeader).println "- Blog: " + out.withStyle(Style.Success).println "https://apereo.github.io" + println "******************************************************************" + } else { + println casServerVersion + } + } +} + +task createKeystore(group: "build", description: "Create CAS keystore") { + doFirst { + mkdir "/etc/cas" + + def keystorePath = "/etc/cas/thekeystore" + + def dn = "CN=cas.example.org,OU=Example,OU=Org,C=US" + if (project.hasProperty("certificateDn")) { + dn = project.getProperty("certificateDn") + } + def subjectAltName = "dns:example.org,dns:localhost,ip:127.0.0.1" + if (project.hasProperty("certificateSubAltName")) { + subjectAltName = project.getProperty("certificateSubAltName") + } + // this will fail if thekeystore exists and has cert with cas alias already (so delete if you want to recreate) + logger.info "Generating keystore for CAS with DN ${dn}" + exec { + workingDir "." + commandLine "keytool", "-genkeypair", "-alias", "cas", + "-keyalg", "RSA", + "-keypass", "changeit", "-storepass", "changeit", + "-keystore", keystorePath, + "-dname", dn, "-ext", "SAN=${subjectAltName}" + } + logger.info "Exporting cert from keystore..." + exec { + workingDir "." + commandLine "keytool", "-exportcert", "-alias", "cas", + "-storepass", "changeit", "-keystore", keystorePath, + "-file", "/etc/cas/cas.cer" + } + logger.info "Import /etc/cas/cas.cer into your Java truststore (JAVA_HOME/lib/security/cacerts)" + } +} + +task listTemplateViews (group: "build", description: "List all CAS views") { + dependsOn explodeWar + + doFirst { + fileTree(explodedResourcesDir).matching { + include "**/*.html" + } + .collect { it.name } + .toSorted() + .each { println it } + } +} + +task getResource(group: "build", description: "Fetch a CAS resource and move it into the overlay") { + dependsOn explodeWar + + doFirst { + def resourceName = project.getProperty("resourceName") + + def results = fileTree(explodedResourcesDir).matching { + include "**/${resourceName}.*" + } + if (results.isEmpty()) { + println "No resources could be found matching ${resourceName}" + return + } + if (results.size() > 1) { + println "Multiple resources found matching ${resourceName}: ${results}" + return + } + + def fromFile = explodedResourcesDir + def resourcesDir = "src/main/resources" + mkdir resourcesDir + + def resourceFile = results[0].canonicalPath + def toResourceFile = resourceFile.replace(fromFile, resourcesDir) + + def parent = file(toResourceFile).getParent() + mkdir parent + + Files.copy(Paths.get(resourceFile), Paths.get(toResourceFile), StandardCopyOption.REPLACE_EXISTING) + println "Copied file ${resourceFile} to ${toResourceFile}" + } +} + +def isRunningCasServerSnapshot(casServerVersion) { + return "${casServerVersion}".contains("-SNAPSHOT") +} \ No newline at end of file diff --git a/cas/cas-server/gradle/wrapper/gradle-wrapper.properties b/cas/cas-server/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..f04d6a20ae --- /dev/null +++ b/cas/cas-server/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/cas/cas-server/gradlew b/cas/cas-server/gradlew new file mode 100755 index 0000000000..83f2acfdc3 --- /dev/null +++ b/cas/cas-server/gradlew @@ -0,0 +1,188 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/cas/cas-server/gradlew.bat b/cas/cas-server/gradlew.bat new file mode 100644 index 0000000000..24467a141f --- /dev/null +++ b/cas/cas-server/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/cas/cas-server/maven/maven-wrapper.jar b/cas/cas-server/maven/maven-wrapper.jar deleted file mode 100644 index 18ba302c65c4f71f57e0daa0ea1b59cb85759b5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71910 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` -fi - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - local basedir=$(pwd) - local wdir=$(pwd) - while [ "$wdir" != '/' ] ; do - wdir=$(cd "$wdir/.."; pwd) - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER="org.apache.maven.wrapper.MavenWrapperMain" - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - -classpath \ -"$MAVEN_PROJECTBASEDIR/maven/maven-wrapper.jar" \ - ${WRAPPER_LAUNCHER} "$@" diff --git a/cas/cas-server/mvnw.bat b/cas/cas-server/mvnw.bat deleted file mode 100644 index d391151aa7..0000000000 --- a/cas/cas-server/mvnw.bat +++ /dev/null @@ -1,174 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto chkMHome - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:chkMHome -if not "%M2_HOME%"=="" goto valMHome - -SET "M2_HOME=%~dp0.." -if not "%M2_HOME%"=="" goto valMHome - -echo. -echo Error: M2_HOME not found in your environment. >&2 -echo Please set the M2_HOME variable in your environment to match the >&2 -echo location of the Maven installation. >&2 -echo. -goto error - -:valMHome - -:stripMHome -if not "_%M2_HOME:~-1%"=="_\" goto checkMCmd -set "M2_HOME=%M2_HOME:~0,-1%" -goto stripMHome - -:checkMCmd -if exist "%M2_HOME%\bin\mvn.cmd" goto init - -echo. -echo Error: M2_HOME is set to an invalid directory. >&2 -echo M2_HOME = "%M2_HOME%" >&2 -echo Please set the M2_HOME variable in your environment to match the >&2 -echo location of the Maven installation >&2 -echo. -goto error -@REM ==== END VALIDATION ==== - -:init - -set MAVEN_CMD_LINE_ARGS=%* - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\maven\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% - -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml index abcf251667..e69de29bb2 100644 --- a/cas/cas-server/pom.xml +++ b/cas/cas-server/pom.xml @@ -1,208 +0,0 @@ - - - 4.0.0 - cas-server - 1.0 - cas-server - war - - - com.baeldung - parent-boot-1 - 0.0.1-SNAPSHOT - ../../parent-boot-1 - - - - - org.apereo.cas - cas-server-support-json-service-registry - ${cas.version} - - - org.apereo.cas - cas-server-support-jdbc - ${cas.version} - - - org.apereo.cas - cas-server-support-jdbc-drivers - ${cas.version} - - - - - - - com.rimerosolutions.maven.plugins - wrapper-maven-plugin - ${wrapper-maven-plugin.version} - - true - MD5 - - - - org.springframework.boot - spring-boot-maven-plugin - - ${mainClassName} - true - ${isExecutable} - WAR - - - - - repackage - - - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - cas - false - false - - false - ${manifestFileToUse} - - - - org.apereo.cas - cas-server-webapp${app.server} - - - - - - cas - - - - - - true - - default - - - org.apereo.cas - cas-server-webapp${app.server} - ${cas.version} - war - runtime - - - - - - - - false - - exec - - org.apereo.cas.web.CasWebApplication - true - - - - - - com.soebes.maven.plugins - echo-maven-plugin - ${echo-maven-plugin.version} - - - prepare-package - - echo - - - - - - Executable profile to make the generated CAS web application executable. - - - - - - - - - - false - - bootiful - - -tomcat - false - - - - org.apereo.cas - cas-server-webapp${app.server} - ${cas.version} - war - runtime - - - - - - - false - - pgp - - - - com.github.s4u.plugins - pgpverify-maven-plugin - ${pgpverify-maven-plugin.version} - - - - check - - - - - hkp://pool.sks-keyservers.net - ${settings.localRepository}/pgpkeys-cache - test - true - false - - - - - - - - - 5.3.3 - - -tomcat - - org.springframework.boot.loader.WarLauncher - false - ${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF - - 0.0.4 - 2.6 - - 0.3.0 - 1.1.0 - - - diff --git a/cas/cas-server/settings.gradle b/cas/cas-server/settings.gradle new file mode 100644 index 0000000000..3ad50900ea --- /dev/null +++ b/cas/cas-server/settings.gradle @@ -0,0 +1 @@ +rootProject.name='cas' \ No newline at end of file diff --git a/cas/cas-server/src/main/jib/docker/entrypoint.sh b/cas/cas-server/src/main/jib/docker/entrypoint.sh new file mode 100755 index 0000000000..a3a0895b04 --- /dev/null +++ b/cas/cas-server/src/main/jib/docker/entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +#echo -e "\nChecking java..." +#java -version + +#echo -e "\nCreating CAS configuration directories..." +mkdir -p /etc/cas/config +mkdir -p /etc/cas/services + +#echo "Listing provided CAS docker artifacts..." +#ls -R docker/cas + +#echo -e "\nMoving CAS configuration artifacts..." +mv docker/cas/thekeystore /etc/cas 2>/dev/null +mv docker/cas/config/*.* /etc/cas/config 2>/dev/null +mv docker/cas/services/*.* /etc/cas/services 2>/dev/null + +#echo -e "\nListing CAS configuration under /etc/cas..." +#ls -R /etc/cas + +echo -e "\nRunning CAS..." +exec java -Xms512m -Xmx2048M -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -jar docker/cas/war/cas.war diff --git a/cas/cas-server/src/main/resources/application.properties b/cas/cas-server/src/main/resources/application.properties index 7735fcabdc..185532f943 100644 --- a/cas/cas-server/src/main/resources/application.properties +++ b/cas/cas-server/src/main/resources/application.properties @@ -1,134 +1,4 @@ -## -# CAS Server Context Configuration -# -server.context-path=/cas -server.port=6443 - +server.port=8443 +spring.main.allow-bean-definition-overriding=true server.ssl.key-store=classpath:/etc/cas/thekeystore -server.ssl.key-store-password=changeit -server.ssl.key-password=changeit -# server.ssl.ciphers= -# server.ssl.client-auth= -# server.ssl.enabled= -# server.ssl.key-alias= -# server.ssl.key-store-provider= -# server.ssl.key-store-type= -# server.ssl.protocol= -# server.ssl.trust-store= -# server.ssl.trust-store-password= -# server.ssl.trust-store-provider= -# server.ssl.trust-store-type= - -server.max-http-header-size=2097152 -server.use-forward-headers=true -server.connection-timeout=20000 -server.error.include-stacktrace=NEVER - -server.tomcat.max-http-post-size=2097152 -server.tomcat.basedir=build/tomcat -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms) -server.tomcat.accesslog.suffix=.log -server.tomcat.max-threads=10 -server.tomcat.port-header=X-Forwarded-Port -server.tomcat.protocol-header=X-Forwarded-Proto -server.tomcat.protocol-header-https-value=https -server.tomcat.remote-ip-header=X-FORWARDED-FOR -server.tomcat.uri-encoding=UTF-8 - -spring.http.encoding.charset=UTF-8 -spring.http.encoding.enabled=true -spring.http.encoding.force=true - -## -#CAS CONFIG LOCATION -# -standalone.config=classpath:/etc/cas/config - - -## -# CAS Cloud Bus Configuration -# -spring.cloud.bus.enabled=false -# spring.cloud.bus.refresh.enabled=true -# spring.cloud.bus.env.enabled=true -# spring.cloud.bus.destination=CasCloudBus -# spring.cloud.bus.ack.enabled=true - -endpoints.enabled=false -endpoints.sensitive=true - -endpoints.restart.enabled=false -endpoints.shutdown.enabled=false - -management.security.enabled=true -management.security.roles=ACTUATOR,ADMIN -management.security.sessions=if_required -management.context-path=/status -management.add-application-context-header=false - -security.basic.authorize-mode=role -security.basic.enabled=false -security.basic.path=/cas/status/** - -## -# CAS Web Application Session Configuration -# -server.session.timeout=300 -server.session.cookie.http-only=true -server.session.tracking-modes=COOKIE - -## -# CAS Thymeleaf View Configuration -# -spring.thymeleaf.encoding=UTF-8 -spring.thymeleaf.cache=true -spring.thymeleaf.mode=HTML -## -# CAS Log4j Configuration -# -# logging.config=file:/etc/cas/log4j2.xml - -server.context-parameters.isLog4jAutoInitializationDisabled=true - -## -# CAS AspectJ Configuration -# -spring.aop.auto=true -spring.aop.proxy-target-class=true - -## -# CAS Authentication Credentials -# -#cas.authn.accept.users=casuser::Mellon -cas.authn.accept.users= -cas.authn.accept.name= - -#CAS Database Authentication Property -cas.authn.jdbc.query[0].sql=SELECT * FROM users WHERE email = ? -cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC -cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect -cas.authn.jdbc.query[0].user=root -cas.authn.jdbc.query[0].password=1234 -cas.authn.jdbc.query[0].ddlAuto=none -#cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver -cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver -cas.authn.jdbc.query[0].fieldPassword=password -cas.authn.jdbc.query[0].passwordEncoder.type=NONE - - -## -# CAS Delegated Authentication -# -cas.authn.pac4j.bitbucket.clientName=Bitbucket -cas.authn.pac4j.dropbox.clientName=Dropbox -cas.authn.pac4j.facebook.clientName=Facebook -cas.authn.pac4j.foursquare.clientName=Foursquare -cas.authn.pac4j.github.clientName=Github -cas.authn.pac4j.google.clientName=Google -cas.authn.pac4j.linkedIn.clientName=LinkedIn -cas.authn.pac4j.paypal.clientName=PayPal -cas.authn.pac4j.twitter.clientName=Twitter -cas.authn.pac4j.yahoo.clientName=Yahoo -cas.authn.pac4j.windowsLive.clientName=Windows Live -cas.authn.pac4j.wordpress.clientName=WordPress +server.ssl.key-store-password=changeit \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/cas.properties b/cas/cas-server/src/main/resources/cas.properties deleted file mode 100644 index e39d68f312..0000000000 --- a/cas/cas-server/src/main/resources/cas.properties +++ /dev/null @@ -1,9 +0,0 @@ -cas.server.name: https://localhost:6443 -cas.server.prefix: https://localhost:643/cas - -cas.adminPagesSecurity.ip=127\.0\.0\.1 - -logging.config: file:/etc/cas/config/log4j2.xml - -cas.serviceRegistry.initFromJson=true -cas.serviceRegistry.config.location=classpath:/services \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql b/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql index 79a4a48a82..104b515813 100644 --- a/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql +++ b/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql @@ -4,13 +4,13 @@ USE `test`; -- Dumping structure for table test.users CREATE TABLE IF NOT EXISTS `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `email` varchar(50) DEFAULT NULL, - `password` text DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; + `id` int(11) NOT NULL AUTO_INCREMENT, + `email` varchar(50) DEFAULT NULL, + `password` text DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; /*!40000 ALTER TABLE `users` DISABLE KEYS */; INSERT INTO `users` (`id`, `email`, `password`) VALUES - (1, 'test@test.com', 'Mellon'); + (1, 'test@test.com', 'Mellon'); /*!40000 ALTER TABLE `users` ENABLE KEYS */; \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/etc/cas/config/application.yml b/cas/cas-server/src/main/resources/etc/cas/config/application.yml deleted file mode 100644 index be1f7c3edd..0000000000 --- a/cas/cas-server/src/main/resources/etc/cas/config/application.yml +++ /dev/null @@ -1,2 +0,0 @@ -info: - description: CAS Configuration \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/etc/cas/config/cas.properties b/cas/cas-server/src/main/resources/etc/cas/config/cas.properties index 47a1477308..dda939bc1d 100644 --- a/cas/cas-server/src/main/resources/etc/cas/config/cas.properties +++ b/cas/cas-server/src/main/resources/etc/cas/config/cas.properties @@ -1,7 +1,15 @@ -cas.server.name: https://cas.example.org:8443 -cas.server.prefix: https://cas.example.org:8443/cas +cas.serviceRegistry.initFromJson=true +cas.serviceRegistry.json.location=classpath:/etc/cas/services -cas.adminPagesSecurity.ip=127\.0\.0\.1 -logging.config: file:/etc/cas/config/log4j2.xml -# cas.serviceRegistry.config.location: classpath:/services +cas.authn.accept.users= + +cas.authn.jdbc.query[0].sql=SELECT * FROM users WHERE email = ? +cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC +cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect +cas.authn.jdbc.query[0].user=root +cas.authn.jdbc.query[0].password=smattroot +cas.authn.jdbc.query[0].ddlAuto=none +cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver +cas.authn.jdbc.query[0].fieldPassword=password +cas.authn.jdbc.query[0].passwordEncoder.type=NONE \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml b/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml deleted file mode 100644 index e688cc0350..0000000000 --- a/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - . - - warn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cas/cas-server/src/main/resources/etc/cas/services/casSecuredApp-8900.json b/cas/cas-server/src/main/resources/etc/cas/services/casSecuredApp-8900.json new file mode 100644 index 0000000000..5d468945ff --- /dev/null +++ b/cas/cas-server/src/main/resources/etc/cas/services/casSecuredApp-8900.json @@ -0,0 +1,8 @@ +{ + "@class" : "org.apereo.cas.services.RegexRegisteredService", + "serviceId" : "http://cas-client:8900/login/cas", + "name" : "casSecuredApp", + "id" : 8900, + "logoutType" : "BACK_CHANNEL", + "logoutUrl" : "http://cas-client:8900/exit/cas" +} \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/etc/cas/thekeystore b/cas/cas-server/src/main/resources/etc/cas/thekeystore index 77bf895249a044c3320c6dd79003dd108c369c3b..a361bf03f9f77a8356cd0f5369f29e6965aa8cee 100644 GIT binary patch delta 1998 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 diff --git a/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt b/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt deleted file mode 100644 index 12ef688a08439af5a75accd1cf5d4bedfce3bd9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 901 zcmXqLVs12OV#-{=%*4pV#FD?sAkl!AjZ>@5qwPB{BO^B}gF&Gow*e;`b0`a&FjG;! zp^$+9h{GYwnUkNKn3IuTTmlng$0EjsMT{GZ7&DTXft)z6p@o5|k%gg&k-4d56p(8P zuimboeq`zQ69QGU z6Ux18*X$`=Te0j~Yv)#ABD-l#nCoa=Ow5c7jEfZwzj*}F0-agOPYL6FZJSWllzuu6ekFzDZOsdn^valvVGIxKPs#KZCDcX zYeU_kr=prmpDb7>sw-|%Se=z}&9U25zH6IWMbl%o^_op?3Rxy<$MX7aCZ$WiS~klz zMVuqVdZC1{SohYqn>=e{f2KaIb9CTR$XIaik8d4g%GNZ#ini+3$NKu$?)1Lw)MgWY zBgqz>xrs&ZT!FOwg$-OSzb|_|eX{+3@#55T5BF@WZVz8{VlBHk?~$$RPMsIJp8r?& zr=;HTe1|iR|J70(dMB;ya4*U<_;WeogLdF56QO_0AEsYF-!9qhH}j#e#Ep0WqPkU< diff --git a/cas/cas-server/src/main/resources/log4j2.xml b/cas/cas-server/src/main/resources/log4j2.xml deleted file mode 100644 index e688cc0350..0000000000 --- a/cas/cas-server/src/main/resources/log4j2.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - . - - warn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cas/cas-server/src/main/resources/services/casSecuredApp-19991.json b/cas/cas-server/src/main/resources/services/casSecuredApp-19991.json deleted file mode 100644 index 336007e484..0000000000 --- a/cas/cas-server/src/main/resources/services/casSecuredApp-19991.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "@class" : "org.apereo.cas.services.RegexRegisteredService", - "serviceId" : "^http://localhost:9000/login/cas", - "name" : "CAS Spring Secured App", - "description": "This is a Spring App that usses the CAS Server for it's authentication", - "id" : 19991, - "evaluationOrder" : 1 -} \ No newline at end of file diff --git a/cas/pom.xml b/cas/pom.xml index 77fae3b50a..e69de29bb2 100644 --- a/cas/pom.xml +++ b/cas/pom.xml @@ -1,23 +0,0 @@ - - - 4.0.0 - cas - cas - pom - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - .. - - - - cas-secured-app - cas-server - - - diff --git a/pom.xml b/pom.xml index 04a2ce054c..e82390a37e 100644 --- a/pom.xml +++ b/pom.xml @@ -388,7 +388,6 @@ blade bootique - cas cdi checker-plugin @@ -899,7 +898,6 @@ blade bootique - cas cdi checker-plugin From 35bbf9c8845c7c6091afdefb5fb49e8f54035f1c Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Mon, 30 Mar 2020 01:29:02 +0430 Subject: [PATCH 254/530] Borrowing one Example from JCIP --- .../volatilekeyword/TaskRunner.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/TaskRunner.java diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/TaskRunner.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/TaskRunner.java new file mode 100644 index 0000000000..f0493d4911 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/TaskRunner.java @@ -0,0 +1,25 @@ +package com.baeldung.concurrent.volatilekeyword; + +public class TaskRunner { + + private static int number; + private volatile static boolean ready; + + private static class Reader extends Thread { + + @Override + public void run() { + while (!ready) { + Thread.yield(); + } + + System.out.println(number); + } + } + + public static void main(String[] args) { + new Reader().start(); + number = 42; + ready = true; + } +} From ee95317ad9dd8af56a885bcac40b9b11d04dca56 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 29 Mar 2020 23:54:31 +0200 Subject: [PATCH 255/530] JAVA-42: Upgrade spring-security-ldap to Spring Boot 2 --- .../spring-security-ldap/pom.xml | 8 +++++-- .../com/baeldung/SampleLDAPApplication.java | 13 +----------- .../{security => config}/SecurityConfig.java | 21 +++++++++++++++---- .../java/com/baeldung/config/WebConfig.java | 16 ++++++++++++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/webSecurityConfig.xml | 1 + 6 files changed, 42 insertions(+), 18 deletions(-) rename spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/{security => config}/SecurityConfig.java (53%) create mode 100644 spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/WebConfig.java create mode 100644 spring-security-modules/spring-security-ldap/src/main/resources/application.properties diff --git a/spring-security-modules/spring-security-ldap/pom.xml b/spring-security-modules/spring-security-ldap/pom.xml index f5e8856648..baed682186 100644 --- a/spring-security-modules/spring-security-ldap/pom.xml +++ b/spring-security-modules/spring-security-ldap/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 @@ -21,6 +21,10 @@ org.springframework.boot spring-boot-starter-security + + org.springframework.boot + spring-boot-starter-web + org.springframework.boot spring-boot-starter-thymeleaf diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java index ec585f2387..2d619cccfa 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java @@ -2,7 +2,7 @@ package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @@ -19,15 +19,4 @@ public class SampleLDAPApplication extends SpringBootServletInitializer { SpringApplication.run(SampleLDAPApplication.class, args); } - @Bean - public WebMvcConfigurerAdapter adapter() { - return new WebMvcConfigurerAdapter() { - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/login") - .setViewName("login"); - } - }; - } - } \ No newline at end of file diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java similarity index 53% rename from spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java rename to spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java index a00cb02459..69f90d9de9 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/security/SecurityConfig.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.security; +package com.baeldung.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; @@ -14,13 +14,26 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.ldapAuthentication().userSearchBase("ou=people").userSearchFilter("(uid={0})").groupSearchBase("ou=groups").groupSearchFilter("(member={0})").contextSource().root("dc=baeldung,dc=com").ldif("classpath:users.ldif"); + auth.ldapAuthentication() + .userSearchBase("ou=people") + .userSearchFilter("(uid={0})") + .groupSearchBase("ou=groups") + .groupSearchFilter("(member={0})") + .contextSource() + .root("dc=baeldung,dc=com") + .ldif("classpath:users.ldif"); } @Override protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests().antMatchers("/", "/home").permitAll().anyRequest().authenticated(); - http.formLogin().loginPage("/login").permitAll().and().logout().logoutSuccessUrl("/"); + http + .authorizeRequests() + .antMatchers("/", "/home", "/css/**") + .permitAll() + .anyRequest() + .authenticated() + .and().formLogin().loginPage("/login").permitAll() + .and().logout().logoutSuccessUrl("/"); } } diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/WebConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/WebConfig.java new file mode 100644 index 0000000000..9809be1844 --- /dev/null +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/WebConfig.java @@ -0,0 +1,16 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/login") + .setViewName("login"); + } +} diff --git a/spring-security-modules/spring-security-ldap/src/main/resources/application.properties b/spring-security-modules/spring-security-ldap/src/main/resources/application.properties new file mode 100644 index 0000000000..3d0221bb7b --- /dev/null +++ b/spring-security-modules/spring-security-ldap/src/main/resources/application.properties @@ -0,0 +1 @@ +management.health.ldap.enabled=false \ No newline at end of file diff --git a/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml index c13f65de5e..adfd603e54 100644 --- a/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml +++ b/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml @@ -10,6 +10,7 @@ + From 0628c8dd423c2c46932b474b5f2d0d51e6b26369 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Mon, 30 Mar 2020 17:55:33 +0430 Subject: [PATCH 256/530] Introducing nullsFirst and nullsLast --- .../com/baeldung/java8/Java8SortUnitTest.java | 63 ++++++++++++++++--- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/Java8SortUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/Java8SortUnitTest.java index 57d9d8347b..9e510575fc 100644 --- a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/Java8SortUnitTest.java +++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/Java8SortUnitTest.java @@ -1,18 +1,17 @@ package com.baeldung.java8; -import static org.hamcrest.Matchers.equalTo; +import com.baeldung.java8.entity.Human; +import com.google.common.collect.Lists; +import com.google.common.primitives.Ints; +import org.junit.Assert; +import org.junit.Test; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import org.junit.Assert; -import org.junit.Test; - -import com.baeldung.java8.entity.Human; -import com.google.common.collect.Lists; -import com.google.common.primitives.Ints; +import static org.hamcrest.Matchers.equalTo; public class Java8SortUnitTest { @@ -113,11 +112,11 @@ public class Java8SortUnitTest { humans.sort(Comparator.comparing(Human::getName)); Assert.assertThat(humans.get(0), equalTo(new Human("Jack", 12))); } - + @Test public final void givenStreamNaturalOrdering_whenSortingEntitiesByName_thenCorrectlySorted() { final List letters = Lists.newArrayList("B", "A", "C"); - + final List sortedLetters = letters.stream().sorted().collect(Collectors.toList()); Assert.assertThat(sortedLetters.get(0), equalTo("A")); } @@ -126,7 +125,7 @@ public class Java8SortUnitTest { public final void givenStreamCustomOrdering_whenSortingEntitiesByName_thenCorrectlySorted() { final List humans = Lists.newArrayList(new Human("Sarah", 10), new Human("Jack", 12)); final Comparator nameComparator = (h1, h2) -> h1.getName().compareTo(h2.getName()); - + final List sortedHumans = humans.stream().sorted(nameComparator).collect(Collectors.toList()); Assert.assertThat(sortedHumans.get(0), equalTo(new Human("Jack", 12))); } @@ -164,4 +163,48 @@ public class Java8SortUnitTest { Assert.assertThat(reverseSortedHumans.get(0), equalTo(new Human("Sarah", 10))); } + @Test(expected = NullPointerException.class) + public final void givenANullElement_whenSortingEntitiesByName_thenThrowsNPE() { + final List humans = Lists.newArrayList(null, new Human("Jack", 12)); + + humans.sort((h1, h2) -> h1.getName().compareTo(h2.getName())); + } + + @Test + public final void givenANullElement_whenSortingEntitiesByNameManually_thenMovesTheNullToLast() { + final List humans = Lists.newArrayList(null, new Human("Jack", 12), null); + + humans.sort((h1, h2) -> { + if (h1 == null) return h2 == null ? 0 : 1; + else if (h2 == null) return -1; + + return h1.getName().compareTo(h2.getName()); + }); + + Assert.assertNotNull(humans.get(0)); + Assert.assertNull(humans.get(1)); + Assert.assertNull(humans.get(2)); + } + + @Test + public final void givenANullElement_whenSortingEntitiesByName_thenMovesTheNullToLast() { + final List humans = Lists.newArrayList(null, new Human("Jack", 12), null); + + humans.sort(Comparator.nullsLast(Comparator.comparing(Human::getName))); + + Assert.assertNotNull(humans.get(0)); + Assert.assertNull(humans.get(1)); + Assert.assertNull(humans.get(2)); + } + + @Test + public final void givenANullElement_whenSortingEntitiesByName_thenMovesTheNullToStart() { + final List humans = Lists.newArrayList(null, new Human("Jack", 12), null); + + humans.sort(Comparator.nullsFirst(Comparator.comparing(Human::getName))); + + Assert.assertNull(humans.get(0)); + Assert.assertNull(humans.get(1)); + Assert.assertNotNull(humans.get(2)); + } } From 1734250d97b95af9f44e02cf6933bc22ed1a9355 Mon Sep 17 00:00:00 2001 From: Mona Mohamadinia Date: Mon, 30 Mar 2020 21:44:37 +0430 Subject: [PATCH 257/530] Added the Static Resource Examples (#8786) --- .../src/main/resources/application.properties | 5 ++++- .../src/main/resources/files/about.html | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-mvc-2/src/main/resources/files/about.html diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/application.properties index 709574239b..7070d4c2f0 100644 --- a/spring-boot-modules/spring-boot-mvc-2/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/application.properties @@ -1 +1,4 @@ -spring.main.allow-bean-definition-overriding=true \ No newline at end of file +spring.main.allow-bean-definition-overriding=true +spring.mvc.static-path-pattern=/content/** +spring.webflux.static-path-pattern=/content/** +spring.resources.static-locations=classpath:/files/,classpath:/static-files \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/resources/files/about.html b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/files/about.html new file mode 100644 index 0000000000..15df316612 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-2/src/main/resources/files/about.html @@ -0,0 +1,10 @@ + + + + + Hello World! + + +Hello World! + + \ No newline at end of file From 8bfb7df3b2c2463e9ea584bf79c9c19c8ef525ff Mon Sep 17 00:00:00 2001 From: Roman <32590063+oskar9247@users.noreply.github.com> Date: Mon, 30 Mar 2020 22:25:55 +0200 Subject: [PATCH 258/530] BAEL-3822 Spring Boot MVC controller return HTML (#8988) Co-authored-by: Oskar <> --- .../com/baeldung/html/HtmlApplication.java | 12 ++++++++ .../com/baeldung/html/HtmlController.java | 17 +++++++++++ .../com/baeldung/html/HtmlControllerTest.java | 30 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 spring-5-mvc/src/main/java/com/baeldung/html/HtmlApplication.java create mode 100644 spring-5-mvc/src/main/java/com/baeldung/html/HtmlController.java create mode 100644 spring-5-mvc/src/test/java/com/baeldung/html/HtmlControllerTest.java diff --git a/spring-5-mvc/src/main/java/com/baeldung/html/HtmlApplication.java b/spring-5-mvc/src/main/java/com/baeldung/html/HtmlApplication.java new file mode 100644 index 0000000000..ad660559c7 --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/html/HtmlApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.html; + +import org.springframework.boot.*; +import org.springframework.boot.autoconfigure.*; + +@SpringBootApplication +public class HtmlApplication +{ + public static void main(String[] args) { + SpringApplication.run(HtmlApplication.class, args); + } +} diff --git a/spring-5-mvc/src/main/java/com/baeldung/html/HtmlController.java b/spring-5-mvc/src/main/java/com/baeldung/html/HtmlController.java new file mode 100644 index 0000000000..23674d165e --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/html/HtmlController.java @@ -0,0 +1,17 @@ +package com.baeldung.html; + +import org.springframework.http.*; +import org.springframework.stereotype.*; +import org.springframework.web.bind.annotation.*; + +@Controller +public class HtmlController +{ + @GetMapping(value = "/welcome", produces = MediaType.TEXT_HTML_VALUE) + @ResponseBody + public String welcomeAsHTML() + { + return "\n" + "

Welcome
\n" + + "\n" + "Hello world\n" + "\n" + ""; + } +} diff --git a/spring-5-mvc/src/test/java/com/baeldung/html/HtmlControllerTest.java b/spring-5-mvc/src/test/java/com/baeldung/html/HtmlControllerTest.java new file mode 100644 index 0000000000..8eba4e8cf9 --- /dev/null +++ b/spring-5-mvc/src/test/java/com/baeldung/html/HtmlControllerTest.java @@ -0,0 +1,30 @@ +package com.baeldung.html; + +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.*; +import org.springframework.boot.test.autoconfigure.web.servlet.*; +import org.springframework.test.web.servlet.*; +import org.springframework.test.web.servlet.request.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(HtmlController.class) +class HtmlControllerUnitTest { + + @Autowired + private MockMvc mockMvc; + + private final String expectedHtmlResponse = + "\n" + "
Welcome
\n" + + "\n" + "Hello world\n" + "\n" + ""; + + @Test + void whenGETRequestToCorrectURL_thenReturnCorrectWelcomeMessage() throws Exception { + MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/welcome")) + .andExpect(status().isOk()) + .andReturn(); + + String resultDOW = result.getResponse().getContentAsString(); + assertEquals(expectedHtmlResponse, resultDOW); + } +} From 2d5782d4327ed494bef6cc30903abf4bdbf092ec Mon Sep 17 00:00:00 2001 From: Mihai238 Date: Mon, 30 Mar 2020 22:59:12 +0200 Subject: [PATCH 259/530] add guava throwables example (#8984) Co-authored-by: Mihai Lepadat --- .../baeldung/guava/ThrowablesUnitTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 guava/src/test/java/com/baeldung/guava/ThrowablesUnitTest.java diff --git a/guava/src/test/java/com/baeldung/guava/ThrowablesUnitTest.java b/guava/src/test/java/com/baeldung/guava/ThrowablesUnitTest.java new file mode 100644 index 0000000000..7d33b38a0e --- /dev/null +++ b/guava/src/test/java/com/baeldung/guava/ThrowablesUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.guava; + +import com.google.common.base.Throwables; +import org.junit.Test; + +import java.util.function.Supplier; + +public class ThrowablesUnitTest { + + @Test(expected = RuntimeException.class) + public void whenThrowable_shouldWrapItInRuntimeException() throws Exception { + try { + throwThrowable(Throwable::new); + } catch (Throwable t) { + Throwables.propagateIfPossible(t, Exception.class); + throw new RuntimeException(t); + } + } + + @Test(expected = Error.class) + public void whenError_shouldPropagateAsIs() throws Exception { + try { + throwThrowable(Error::new); + } catch (Throwable t) { + Throwables.propagateIfPossible(t, Exception.class); + throw new RuntimeException(t); + } + } + + @Test(expected = Exception.class) + public void whenException_shouldPropagateAsIs() throws Exception { + try { + throwThrowable(Exception::new); + } catch (Throwable t) { + Throwables.propagateIfPossible(t, Exception.class); + throw new RuntimeException(t); + } + } + + private void throwThrowable(Supplier exceptionSupplier) throws Throwable { + throw exceptionSupplier.get(); + } + +} From 2fb2f89bd4d443dbbc5c1205b57e9dcdc6870479 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Mon, 30 Mar 2020 23:06:47 +0200 Subject: [PATCH 260/530] BAEL-3477: Add usage example for the mutable key (#8987) --- .../com/baeldung/map/ProductUnitTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java index 2015909870..ba29d5c454 100644 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java @@ -3,6 +3,8 @@ package com.baeldung.map; import org.junit.jupiter.api.Test; import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import static org.junit.jupiter.api.Assertions.*; @@ -121,4 +123,52 @@ class ProductUnitTest { assertNull(productsByName.get("E-Bike")); } + @Test + public void givenMutableKeyWhenKeyChangeThenValueNotFound() { + // Given + MutableKey key = new MutableKey("initial"); + + Map items = new HashMap<>(); + items.put(key, "success"); + + // When + key.setName("changed"); + + // Then + assertNull(items.get(key)); + } + + static class MutableKey { + private String name; + + public MutableKey(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MutableKey that = (MutableKey) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + } + } From 16e6ddc2e3e8749f26b22be495234ef3ab119e21 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Mon, 30 Mar 2020 23:10:57 +0200 Subject: [PATCH 261/530] BAEL-3060: Cleanup JMXTutorialMainlauncher (#8991) --- .../baeldung/jmx/JMXTutorialMainlauncher.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java index 21044f82c4..e2a60ac384 100644 --- a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java @@ -3,7 +3,12 @@ package com.baeldung.jmx; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.management.*; +import javax.management.InstanceAlreadyExistsException; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; import java.lang.management.ManagementFactory; public class JMXTutorialMainlauncher { @@ -11,24 +16,21 @@ public class JMXTutorialMainlauncher { private static final Logger LOG = LoggerFactory.getLogger(JMXTutorialMainlauncher.class); public static void main(String[] args) { - // TODO Auto-generated method stub LOG.debug("This is basic JMX tutorial"); - ObjectName objectName = null; + try { - objectName = new ObjectName("com.baeldung.tutorial:type=basic,name=game"); - } catch (MalformedObjectNameException e) { - e.printStackTrace(); - } - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - Game gameObj = new Game(); - try { - server.registerMBean(gameObj, objectName); - } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) { + ObjectName objectName = new ObjectName("com.baeldung.tutorial:type=basic,name=game"); + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + server.registerMBean(new Game(), objectName); + } catch (MalformedObjectNameException | InstanceAlreadyExistsException | + MBeanRegistrationException | NotCompliantMBeanException e) { e.printStackTrace(); } + LOG.debug("Registration for Game mbean with the platform server is successfull"); LOG.debug("Please open jconsole to access Game mbean"); + while (true) { // to ensure application does not terminate } From 3f83ed67d3511a057bbf5b0db8e56f214ffd88a7 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 30 Mar 2020 23:27:11 +0200 Subject: [PATCH 262/530] JAVA-42: Upgrade spring-security-kerberos to Spring Boot 2 --- spring-security-modules/spring-security-kerberos/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-security-modules/spring-security-kerberos/pom.xml b/spring-security-modules/spring-security-kerberos/pom.xml index 6846bdf063..51a48a78c6 100644 --- a/spring-security-modules/spring-security-kerberos/pom.xml +++ b/spring-security-modules/spring-security-kerberos/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 From 3f2d436db4e93cf57428c75758376b8e2d17b3c2 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 30 Mar 2020 23:45:37 +0200 Subject: [PATCH 263/530] JAVA-42: Upgrade spring-security-cache-control to Spring Boot 2 --- .../spring-security-cache-control/pom.xml | 38 +++---------------- .../ResourceEndpointIntegrationTest.java | 2 +- 2 files changed, 7 insertions(+), 33 deletions(-) diff --git a/spring-security-modules/spring-security-cache-control/pom.xml b/spring-security-modules/spring-security-cache-control/pom.xml index acc37b41ef..743b3c291d 100644 --- a/spring-security-modules/spring-security-cache-control/pom.xml +++ b/spring-security-modules/spring-security-cache-control/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 @@ -23,41 +23,15 @@ spring-boot-starter-web - org.springframework.security - spring-security-core - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-web - - - javax.servlet - javax.servlet-api - ${javax.servlet-api.version} + org.springframework.boot + spring-boot-starter-security - org.hamcrest - hamcrest - ${hamcrest.version} + org.springframework.boot + spring-boot-starter-test test - - - org.mockito - mockito-core - test - - - - org.springframework - spring-test - - \ No newline at end of file diff --git a/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java b/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java index d6a1a97773..d4d24a4986 100644 --- a/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java +++ b/spring-security-modules/spring-security-cache-control/src/test/java/com/baeldung/cachecontrol/ResourceEndpointIntegrationTest.java @@ -4,8 +4,8 @@ import static io.restassured.RestAssured.given; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; import io.restassured.http.ContentType; From 405831d3da839c12ca73562112653842ee83ef44 Mon Sep 17 00:00:00 2001 From: patkorek Date: Tue, 31 Mar 2020 07:36:44 +0200 Subject: [PATCH 264/530] changed tabs to spaces --- ...GraphQL collection.postman_collection.json | 334 +++++++++--------- 1 file changed, 167 insertions(+), 167 deletions(-) diff --git a/spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json b/spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json index 7fcaa2c76d..f19bc1febb 100644 --- a/spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json +++ b/spring-boot-modules/spring-boot/src/test/resources/GraphQL collection.postman_collection.json @@ -1,169 +1,169 @@ { - "info": { - "_postman_id": "910d9690-f629-4491-bbbd-adb30982a386", - "name": "GraphQL collection", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "mutations", - "item": [ - { - "name": "writePost", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "graphql", - "graphql": { - "query": "mutation writePost ($title: String!, $text: String!, $category: String) {\n writePost (title: $title, text: $text, category: $category) {\n id\n title\n text\n category\n }\n}", - "variables": "{\n \"title\": \"\",\n \"text\": \"\",\n \"category\": \"\"\n}" - }, - "options": { - "graphql": {} - } - }, - "url": { - "raw": "http://localhost:9090/springbootapp/graphql", - "protocol": "http", - "host": [ - "localhost" - ], - "port": "9090", - "path": [ - "springbootapp", - "graphql" - ] - } - }, - "response": [] - } - ], - "protocolProfileBehavior": {} - }, - { - "name": "queries", - "item": [ - { - "name": "get recent posts", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "graphql", - "graphql": { - "query": "{\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n text\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}", - "variables": "" - } - }, - "url": { - "raw": "http://localhost:9090/springbootapp/graphql", - "protocol": "http", - "host": [ - "localhost" - ], - "port": "9090", - "path": [ - "springbootapp", - "graphql" - ] - } - }, - "response": [] - }, - { - "name": "recentPosts - variables", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "graphql", - "graphql": { - "query": "query recentPosts ($count: Int, $offset: Int) {\n recentPosts (count: $count, offset: $offset) {\n id\n title\n text\n category\n }\n}", - "variables": "{\n \"count\": 1,\n \"offset\": 0\n}" - }, - "options": { - "graphql": {} - } - }, - "url": { - "raw": "http://localhost:9090/springbootapp/graphql", - "protocol": "http", - "host": [ - "localhost" - ], - "port": "9090", - "path": [ - "springbootapp", - "graphql" - ] - } - }, - "response": [] - }, - { - "name": "get recent posts - raw", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/graphql", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "query {\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}" - }, - "url": { - "raw": "http://localhost:9090/springbootapp/graphql", - "protocol": "http", - "host": [ - "localhost" - ], - "port": "9090", - "path": [ - "springbootapp", - "graphql" - ] - } - }, - "response": [] - } - ], - "protocolProfileBehavior": {} - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "b54f267b-c450-4f2d-8105-2f23bab4c922", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "00b575be-03d4-4b29-b137-733ead139638", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "id": "20a274e5-6d51-40d6-81cb-af9eb115b21b", - "key": "url", - "value": "", - "type": "string" - } - ], - "protocolProfileBehavior": {} + "info": { + "_postman_id": "910d9690-f629-4491-bbbd-adb30982a386", + "name": "GraphQL collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "mutations", + "item": [ + { + "name": "writePost", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation writePost ($title: String!, $text: String!, $category: String) {\n writePost (title: $title, text: $text, category: $category) {\n id\n title\n text\n category\n }\n}", + "variables": "{\n \"title\": \"\",\n \"text\": \"\",\n \"category\": \"\"\n}" + }, + "options": { + "graphql": {} + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + } + ], + "protocolProfileBehavior": {} + }, + { + "name": "queries", + "item": [ + { + "name": "get recent posts", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "{\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n text\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}", + "variables": "" + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "recentPosts - variables", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "query recentPosts ($count: Int, $offset: Int) {\n recentPosts (count: $count, offset: $offset) {\n id\n title\n text\n category\n }\n}", + "variables": "{\n \"count\": 1,\n \"offset\": 0\n}" + }, + "options": { + "graphql": {} + } + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "get recent posts - raw", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/graphql", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "query {\r\n recentPosts(count: 10, offset: 0) {\r\n id\r\n title\r\n category\r\n author {\r\n id\r\n name\r\n thumbnail\r\n }\r\n }\r\n}" + }, + "url": { + "raw": "http://localhost:9090/springbootapp/graphql", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "springbootapp", + "graphql" + ] + } + }, + "response": [] + } + ], + "protocolProfileBehavior": {} + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "id": "b54f267b-c450-4f2d-8105-2f23bab4c922", + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "id": "00b575be-03d4-4b29-b137-733ead139638", + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "id": "20a274e5-6d51-40d6-81cb-af9eb115b21b", + "key": "url", + "value": "", + "type": "string" + } + ], + "protocolProfileBehavior": {} } \ No newline at end of file From a0478a7832e003ac3748ae5b574504b12e64dc1a Mon Sep 17 00:00:00 2001 From: ramkumarvenkat Date: Tue, 31 Mar 2020 12:09:13 +0530 Subject: [PATCH 265/530] Fix code after article changes --- .../com/baeldung/guava/entity/Profile.java | 20 ++++++++ .../com/baeldung/guava/entity/Session.java | 13 ++++++ .../java/com/baeldung/guava/entity/User.java | 20 ++++++++ .../guava/mapmaker/GuavaMapMakerUnitTest.java | 46 +++++++++++++------ 4 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 guava-collections-map/src/main/java/com/baeldung/guava/entity/Profile.java create mode 100644 guava-collections-map/src/main/java/com/baeldung/guava/entity/Session.java create mode 100644 guava-collections-map/src/main/java/com/baeldung/guava/entity/User.java diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/entity/Profile.java b/guava-collections-map/src/main/java/com/baeldung/guava/entity/Profile.java new file mode 100644 index 0000000000..17a6502f39 --- /dev/null +++ b/guava-collections-map/src/main/java/com/baeldung/guava/entity/Profile.java @@ -0,0 +1,20 @@ +package com.baeldung.guava.entity; + +public class Profile { + private long id; + private String type; + + public Profile(long id, String type) { + this.id = id; + this.type = type; + } + + public long getId() { + return id; + } + + public String getName() { + return type; + } + +} diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/entity/Session.java b/guava-collections-map/src/main/java/com/baeldung/guava/entity/Session.java new file mode 100644 index 0000000000..b834c23df1 --- /dev/null +++ b/guava-collections-map/src/main/java/com/baeldung/guava/entity/Session.java @@ -0,0 +1,13 @@ +package com.baeldung.guava.entity; + +public class Session { + private long id; + + public Session(long id) { + this.id = id; + } + + public long getId() { + return id; + } +} diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/entity/User.java b/guava-collections-map/src/main/java/com/baeldung/guava/entity/User.java new file mode 100644 index 0000000000..613045ec23 --- /dev/null +++ b/guava-collections-map/src/main/java/com/baeldung/guava/entity/User.java @@ -0,0 +1,20 @@ +package com.baeldung.guava.entity; + +public class User { + private long id; + private String name; + + public User(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + +} diff --git a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java index 8da459f22e..e2bc1349c6 100644 --- a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java @@ -1,40 +1,56 @@ package com.baeldung.guava.mapmaker; +import com.baeldung.guava.entity.Profile; +import com.baeldung.guava.entity.Session; +import com.baeldung.guava.entity.User; import com.google.common.collect.MapMaker; +import org.junit.Assert; import org.junit.Test; import java.util.concurrent.ConcurrentMap; +import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertNotNull; public class GuavaMapMakerUnitTest { @Test - public void whenMakeMap_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().makeMap(); - assertNotNull(concurrentMap); + public void whenCreateCaches_thenCreated() { + ConcurrentMap sessionCache = new MapMaker().makeMap(); + assertNotNull(sessionCache); + + ConcurrentMap profileCache = new MapMaker().makeMap(); + assertNotNull(profileCache); + + User userA = new User(1, "UserA"); + + sessionCache.put(userA, new Session(100)); + Assert.assertThat(sessionCache.size(), equalTo(1)); + + profileCache.put(userA, new Profile(1000, "Personal")); + Assert.assertThat(profileCache.size(), equalTo(1)); } @Test - public void whenMakeMapWithWeakKeys_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().weakKeys().makeMap(); - assertNotNull(concurrentMap); + public void whenCreateCacheWithInitialCapacity_thenCreated() { + ConcurrentMap profileCache = new MapMaker().initialCapacity(100).makeMap(); + assertNotNull(profileCache); } @Test - public void whenMakeMapWithWeakValues_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().weakValues().makeMap(); - assertNotNull(concurrentMap); + public void whenCreateCacheWithConcurrencyLevel_thenCreated() { + ConcurrentMap sessionCache = new MapMaker().concurrencyLevel(10).makeMap(); + assertNotNull(sessionCache); } @Test - public void whenMakeMapWithInitialCapacity_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().initialCapacity(10).makeMap(); - assertNotNull(concurrentMap); + public void whenCreateCacheWithWeakKeys_thenCreated() { + ConcurrentMap sessionCache = new MapMaker().weakKeys().makeMap(); + assertNotNull(sessionCache); } @Test - public void whenMakeMapWithConcurrencyLevel_thenCreated() { - ConcurrentMap concurrentMap = new MapMaker().concurrencyLevel(10).makeMap(); - assertNotNull(concurrentMap); + public void whenCreateCacheWithWeakValues_thenCreated() { + ConcurrentMap profileCache = new MapMaker().weakValues().makeMap(); + assertNotNull(profileCache); } } From b2a07b9fdf4ba1183da7dd2294432bf1a414ab9c Mon Sep 17 00:00:00 2001 From: kwoyke Date: Tue, 31 Mar 2020 08:54:14 +0200 Subject: [PATCH 266/530] BAEL-2681: Upgrade core-java-collections-set to Java 11 (#8998) * BAEL-2681: Upgrade core-java-collections-set to Java 11 * BAEL-2681: Comment out core-java-collections-set from the pom.xml --- .../core-java-collections-set/pom.xml | 16 ++++++++++++++++ core-java-modules/pom.xml | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-set/pom.xml b/core-java-modules/core-java-collections-set/pom.xml index 8ba1b2400d..c89ba0c091 100644 --- a/core-java-modules/core-java-collections-set/pom.xml +++ b/core-java-modules/core-java-collections-set/pom.xml @@ -34,7 +34,23 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + 11 + 11 4.3 2.8.5 diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 5e7ffa37b9..ebdb11925b 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -42,7 +42,7 @@ core-java-collections-list core-java-collections-list-2 core-java-collections-list-3 - core-java-collections-set + core-java-concurrency-2 core-java-concurrency-advanced From 6534bddb6c73cae5ba2614fbc509535ae46babae Mon Sep 17 00:00:00 2001 From: mthomas Date: Tue, 31 Mar 2020 04:43:06 -0500 Subject: [PATCH 267/530] Move code to core-java-modules/core-java-concurrency-advanced-3Add Add missing 'Unit' in test name --- .../com/baeldung/atomicstampedreference}/SafeAccount.java | 6 +++--- .../atomicstampedreference/ThreadSafeAccountUnitTest.java} | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename core-java-modules/{core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic => core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference}/SafeAccount.java (82%) rename core-java-modules/{core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java => core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java} (70%) diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java similarity index 82% rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java rename to core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java index febfd481c3..fe41429e22 100644 --- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java @@ -1,12 +1,12 @@ -package com.baeldung.concurrent.atomic; +package com.baeldung.atomicstampedreference; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicStampedReference; public class SafeAccount { - AtomicInteger stamp = new AtomicInteger(0); - AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); + private AtomicInteger stamp = new AtomicInteger(0); + private AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); public int getBalance() { return this.balance.get(new int[1]); diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java similarity index 70% rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java rename to core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java index b9a5fe7773..bd33d5b4ec 100644 --- a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java @@ -1,12 +1,12 @@ -package com.baeldung.concurrent.atomic; +package com.baeldung.atomicstampedreference; import org.junit.Assert; import org.junit.Test; -public class ThreadSafeAccountTest { +public class ThreadSafeAccountUnitTest { @Test - public void givenMultiThread_whenSafeAccountSetBalance() throws InterruptedException { + public void givenMultiThread_whenSafeAccount_thenSetBalance() throws InterruptedException { SafeAccount account = new SafeAccount(); Thread t = new Thread(() -> { while (!account.withdrawal(100)) From 8c69054becc77089a9cc7d27ea7959617e440736 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Tue, 31 Mar 2020 19:25:52 +0530 Subject: [PATCH 268/530] renamed integration test to manual test (#8934) * renamed integration test to manual test * added comments in manual test case --- ...tegrationTest.java => JGitBugManualTest.java} | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) rename jgit/src/test/java/com/baeldung/jgit/{JGitBugIntegrationTest.java => JGitBugManualTest.java} (67%) diff --git a/jgit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java b/jgit/src/test/java/com/baeldung/jgit/JGitBugManualTest.java similarity index 67% rename from jgit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java rename to jgit/src/test/java/com/baeldung/jgit/JGitBugManualTest.java index ad34890996..bcfe615bc7 100644 --- a/jgit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java +++ b/jgit/src/test/java/com/baeldung/jgit/JGitBugManualTest.java @@ -10,10 +10,18 @@ import org.junit.Test; import java.io.IOException; import static org.junit.Assert.assertNotNull; -/** - * Tests which show issues with JGit that we reported upstream. - */ -public class JGitBugIntegrationTest { +public class JGitBugManualTest { + + /** + * This test case expects one git repository to be present in local file system. + * Currently this test uses the Baeldung repository i.e. the current checkout repository. + * It finds the repository by tracking back and scan file system to find .git folder in + * the file system. + * + * Before running the test case ensure that the .git folder is present. + * + * @throws IOException + */ @Test public void testRevWalkDisposeClosesReader() throws IOException { try (Repository repo = Helper.openJGitRepository()) { From aaffd9614fc1675ab05f992eec62c90be5aef76f Mon Sep 17 00:00:00 2001 From: naXa! Date: Mon, 25 Mar 2019 02:00:03 +0300 Subject: [PATCH 269/530] [BAEL-2749] add dbunit module to parent pom --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 04a2ce054c..734e2c8ab9 100644 --- a/pom.xml +++ b/pom.xml @@ -601,6 +601,8 @@ + dbunit + parent-boot-1 parent-boot-2 parent-spring-4 @@ -1288,6 +1290,8 @@ + dbunit + parent-boot-1 parent-boot-2 parent-spring-4 From a65c5bf202c3326514e7d6c1408bd9e445c06fd9 Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Sun, 29 Mar 2020 11:37:19 +0200 Subject: [PATCH 270/530] [BAEL-2749] Introduces Assertj and uses builder pattern --- dbunit/pom.xml | 36 ++++++++++++++++--- .../baeldung/dbunit/OldSchoolDbUnitTest.java | 8 +++-- .../dbunit/PrepAndExpectedDbUnitTest.java | 12 +++++-- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/dbunit/pom.xml b/dbunit/pom.xml index b77b15f2d4..ab0befcf4c 100644 --- a/dbunit/pom.xml +++ b/dbunit/pom.xml @@ -3,6 +3,16 @@ 4.0.0 dbunit 1.0 + + 1.4.200 + + 1.8 + 1.8 + 3.8.1 + + 3.14.0 + 2.6.0 + dbunit @@ -22,14 +32,30 @@ com.h2database h2 - 1.4.197 + ${h2.version} + test + + + + org.assertj + assertj-core + ${assertj-core.version} test - - - 2.6.0 - + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven-compiler-plugin.source} + ${maven-compiler-plugin.target} + + + + diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index a703863614..2a2f25971b 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -6,6 +6,7 @@ import org.dbunit.JdbcDatabaseTester; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.ITable; import org.dbunit.dataset.xml.FlatXmlDataSet; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; import org.dbunit.operation.DatabaseOperation; import org.junit.After; import org.junit.Before; @@ -16,6 +17,7 @@ import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -74,7 +76,7 @@ public class OldSchoolDbUnitTest { final Connection connection = tester.getConnection().getConnection(); final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); - ITable expectedTable = (new FlatXmlDataSet(is)).getTable("items"); + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"}); // Act @@ -94,7 +96,7 @@ public class OldSchoolDbUnitTest { final Connection connection = tester.getConnection().getConnection(); final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); - ITable expectedTable = (new FlatXmlDataSet(is)).getTable("items"); + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"}); // Act @@ -105,7 +107,7 @@ public class OldSchoolDbUnitTest { ITable actualTable = databaseDataSet.getTable("items"); //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - Assertion.assertEquals(expectedTable, actualTable); + assertThat(actualTable).isEqualTo(actualTable); } } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java index c3882d5eab..c322cf0ae3 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -1,6 +1,10 @@ package com.baeldung.dbunit; -import org.dbunit.*; +import org.dbunit.DefaultPrepAndExpectedTestCase; +import org.dbunit.IDatabaseTester; +import org.dbunit.JdbcDatabaseTester; +import org.dbunit.PrepAndExpectedTestCaseSteps; +import org.dbunit.VerifyTableDefinition; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; import org.dbunit.operation.DatabaseOperation; @@ -12,6 +16,8 @@ import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; +import static org.assertj.core.api.Assertions.assertThat; + public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; @@ -63,8 +69,8 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); // or place assertions at the end - assertTrue(rs.next()); - assertEquals("Xavier", rs.getString("last_name")); + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("last_name")).isEqualTo("Xavier"); } @Test From 71ba591868ed0f200f16c17a3d116cf6c32a559b Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Sun, 29 Mar 2020 18:16:45 +0200 Subject: [PATCH 271/530] [BAEL-2749] Select and Delete for OldSchool --- dbunit/pom.xml | 1 + .../baeldung/dbunit/OldSchoolDbUnitTest.java | 39 +++++++++++-------- .../items_exp_delete_no_produced.xml | 8 ++++ 3 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 dbunit/src/test/resources/items_exp_delete_no_produced.xml diff --git a/dbunit/pom.xml b/dbunit/pom.xml index ab0befcf4c..7ca53cd3be 100644 --- a/dbunit/pom.xml +++ b/dbunit/pom.xml @@ -13,6 +13,7 @@ 3.14.0 2.6.0
+ dbunit diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index 2a2f25971b..e64b49263a 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -5,7 +5,7 @@ import org.dbunit.IDatabaseTester; import org.dbunit.JdbcDatabaseTester; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.ITable; -import org.dbunit.dataset.xml.FlatXmlDataSet; +import org.dbunit.dataset.filter.DefaultColumnFilter; import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; import org.dbunit.operation.DatabaseOperation; import org.junit.After; @@ -18,8 +18,7 @@ import java.sql.Connection; import java.sql.ResultSet; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.dbunit.Assertion.assertEquals; public class OldSchoolDbUnitTest { private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); @@ -44,7 +43,7 @@ public class OldSchoolDbUnitTest { private static IDataSet initDataSet() throws Exception { final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml"); - return new FlatXmlDataSet(is); + return new FlatXmlDataSetBuilder().build(is); } @Before @@ -59,35 +58,43 @@ public class OldSchoolDbUnitTest { @Test public void testSelect() throws Exception { - // Arrange final Connection connection = tester.getConnection().getConnection(); - // Act final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); - // Assert - assertTrue(rs.next()); - assertEquals("Grey T-Shirt", rs.getString("title")); + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); } @Test public void testDelete() throws Exception { - // Arrange final Connection connection = tester.getConnection().getConnection(); final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"}); - // Act connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - // Assert final IDataSet databaseDataSet = tester.getConnection().createDataSet(); ITable actualTable = databaseDataSet.getTable("items"); - //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - Assertion.assertEquals(expectedTable, actualTable); + assertEquals(expectedTable, actualTable); + } + + @Test + public void testDeleteWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete_no_produced.xml"); + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + + assertEquals(expectedTable, actualTable); } @Test @@ -107,7 +114,7 @@ public class OldSchoolDbUnitTest { ITable actualTable = databaseDataSet.getTable("items"); //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - assertThat(actualTable).isEqualTo(actualTable); + assertEquals(expectedTable, actualTable); } } diff --git a/dbunit/src/test/resources/items_exp_delete_no_produced.xml b/dbunit/src/test/resources/items_exp_delete_no_produced.xml new file mode 100644 index 0000000000..c9b182a1b2 --- /dev/null +++ b/dbunit/src/test/resources/items_exp_delete_no_produced.xml @@ -0,0 +1,8 @@ + + + + + + + + From e4f4f7110b33f753a50b5f56443b8dff8ab014b5 Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Sun, 29 Mar 2020 21:47:00 +0200 Subject: [PATCH 272/530] [BAEL-2749] Code refactoring --- dbunit/src/main/resources/logback.xml | 2 +- .../baeldung/dbunit/ConnectionSettings.java | 8 ++++ .../baeldung/dbunit/OldSchoolDbUnitTest.java | 32 ++++++++----- .../dbunit/PrepAndExpectedDbUnitTest.java | 48 +++++++------------ .../com/baeldung/dbunit/SampleDbUnitTest.java | 23 ++++----- dbunit/src/test/resources/data.xml | 12 ++--- .../src/test/resources/items_exp_delete.xml | 8 ++-- .../items_exp_delete_no_produced.xml | 8 ++-- .../src/test/resources/items_exp_rename.xml | 10 ++-- .../items_exp_rename_no_produced.xml | 9 ++++ dbunit/src/test/resources/schema.sql | 34 ++++++------- dbunit/src/test/resources/users.xml | 6 +-- .../src/test/resources/users_exp_delete.xml | 4 +- .../src/test/resources/users_exp_rename.xml | 6 +-- 14 files changed, 108 insertions(+), 102 deletions(-) create mode 100644 dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java create mode 100644 dbunit/src/test/resources/items_exp_rename_no_produced.xml diff --git a/dbunit/src/main/resources/logback.xml b/dbunit/src/main/resources/logback.xml index 7d900d8ea8..26beb6d5b4 100644 --- a/dbunit/src/main/resources/logback.xml +++ b/dbunit/src/main/resources/logback.xml @@ -8,6 +8,6 @@ - + \ No newline at end of file diff --git a/dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java b/dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java new file mode 100644 index 0000000000..e842022292 --- /dev/null +++ b/dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java @@ -0,0 +1,8 @@ +package com.baeldung.dbunit; + +public class ConnectionSettings { + public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); + public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; + public static final String USER = "sa"; + public static final String PASSWORD = ""; +} diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index e64b49263a..0b63184951 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.dbunit; -import org.dbunit.Assertion; import org.dbunit.IDatabaseTester; import org.dbunit.JdbcDatabaseTester; import org.dbunit.dataset.IDataSet; @@ -17,14 +16,14 @@ import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; +import static com.baeldung.dbunit.ConnectionSettings.USER; import static org.assertj.core.api.Assertions.assertThat; import static org.dbunit.Assertion.assertEquals; public class OldSchoolDbUnitTest { - private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); - private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; - private static final String USER = "sa"; - private static final String PASSWORD = ""; private static IDatabaseTester tester = null; @@ -99,20 +98,31 @@ public class OldSchoolDbUnitTest { @Test public void testUpdate() throws Exception { - // Arrange final Connection connection = tester.getConnection().getConnection(); final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - //expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"produced"}); + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - // Act connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - // Assert final IDataSet databaseDataSet = tester.getConnection().createDataSet(); ITable actualTable = databaseDataSet.getTable("items"); - //actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + + assertEquals(expectedTable, actualTable); + } + + @Test + public void testUpdateWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename_no_produced.xml"); + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); assertEquals(expectedTable, actualTable); } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java index c322cf0ae3..bb70136de2 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -16,13 +16,13 @@ import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; +import static com.baeldung.dbunit.ConnectionSettings.USER; import static org.assertj.core.api.Assertions.assertThat; public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { - private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); - private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; - private static final String USER = "sa"; - private static final String PASSWORD = ""; @Override public void setUp() throws Exception { @@ -49,60 +49,46 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { @Test public void testSelect() throws Exception { - // Arrange final Connection connection = getConnection().getConnection(); final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = () -> { - // invoke the method being tested here; for the sake of simplicity we use JDBC API directly in this example - final ResultSet rs = connection.createStatement().executeQuery("select * from USERS where id = 1"); + final PrepAndExpectedTestCaseSteps testSteps = + () -> connection + .createStatement() + .executeQuery("select * from USERS where id = 1"); - // either place assertions here - //assertTrue(rs.next()); - //assertEquals("Xavier", rs.getString("last_name")); - - return rs; - }; - - // Act final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - // or place assertions at the end assertThat(rs.next()).isTrue(); assertThat(rs.getString("last_name")).isEqualTo("Xavier"); } @Test public void testUpdate() throws Exception { - // Arrange final Connection connection = getConnection().getConnection(); final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; // define tables to verify - final String[] prepDataFiles = {"/users.xml"}; // define prep files - final String[] expectedDataFiles = {"/users_exp_rename.xml"}; // define expected files - final PrepAndExpectedTestCaseSteps testSteps = () -> { - // invoke the method being tested here; for the sake of simplicity we use JDBC API directly in this example - return connection.createStatement().executeUpdate("update USERS set first_name = 'new name' where id = 1"); - // after this method exits, dbUnit will: - // * verify configured tables - // * cleanup tables as configured - }; + final String[] prepDataFiles = {"/users.xml"}; + final String[] expectedDataFiles = {"/users_exp_rename.xml"}; + final PrepAndExpectedTestCaseSteps testSteps = + () -> connection + .createStatement() + .executeUpdate("update USERS set first_name = 'new name' where id = 1"); - // Act super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); } @Test public void testDelete() throws Exception { - // Arrange final Connection connection = getConnection().getConnection(); final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users_exp_delete.xml"}; final PrepAndExpectedTestCaseSteps testSteps = - () -> connection.createStatement().executeUpdate("delete from USERS where id = 2"); + () -> connection + .createStatement() + .executeUpdate("delete from USERS where id = 2"); - // Act super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java index cfe4fd4e11..f7970754e7 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java @@ -13,11 +13,13 @@ import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; +import static com.baeldung.dbunit.ConnectionSettings.USER; +import static org.assertj.core.api.Assertions.assertThat; + public class SampleDbUnitTest extends DBTestCase { - private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); - private static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; - private static final String USER = "sa"; - private static final String PASSWORD = ""; public SampleDbUnitTest(String name) { super(name); @@ -46,29 +48,23 @@ public class SampleDbUnitTest extends DBTestCase { @Test public void testSelect() throws Exception { - // Arrange final Connection connection = getConnection().getConnection(); - // Act final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); - // Assert - assertTrue(rs.next()); - assertEquals("Grey T-Shirt", rs.getString("title")); + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); } @Test public void testDelete() throws Exception { - // Arrange final Connection connection = getConnection().getConnection(); final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - // Act connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - // Assert final IDataSet databaseDataSet = getConnection().createDataSet(); ITable actualTable = databaseDataSet.getTable("items"); @@ -77,16 +73,13 @@ public class SampleDbUnitTest extends DBTestCase { @Test public void testUpdate() throws Exception { - // Arrange final Connection connection = getConnection().getConnection(); final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - // Act connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - // Assert final IDataSet databaseDataSet = getConnection().createDataSet(); ITable actualTable = databaseDataSet.getTable("items"); diff --git a/dbunit/src/test/resources/data.xml b/dbunit/src/test/resources/data.xml index e4498513e0..ac413cfd23 100644 --- a/dbunit/src/test/resources/data.xml +++ b/dbunit/src/test/resources/data.xml @@ -1,11 +1,11 @@ - + - - - - - + + + + + diff --git a/dbunit/src/test/resources/items_exp_delete.xml b/dbunit/src/test/resources/items_exp_delete.xml index 1aaeff59ca..09b78da493 100644 --- a/dbunit/src/test/resources/items_exp_delete.xml +++ b/dbunit/src/test/resources/items_exp_delete.xml @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/dbunit/src/test/resources/items_exp_delete_no_produced.xml b/dbunit/src/test/resources/items_exp_delete_no_produced.xml index c9b182a1b2..dd76e8c6ce 100644 --- a/dbunit/src/test/resources/items_exp_delete_no_produced.xml +++ b/dbunit/src/test/resources/items_exp_delete_no_produced.xml @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/dbunit/src/test/resources/items_exp_rename.xml b/dbunit/src/test/resources/items_exp_rename.xml index 237280e758..830d83499f 100644 --- a/dbunit/src/test/resources/items_exp_rename.xml +++ b/dbunit/src/test/resources/items_exp_rename.xml @@ -1,9 +1,9 @@ - - - - - + + + + + diff --git a/dbunit/src/test/resources/items_exp_rename_no_produced.xml b/dbunit/src/test/resources/items_exp_rename_no_produced.xml new file mode 100644 index 0000000000..991c4726a0 --- /dev/null +++ b/dbunit/src/test/resources/items_exp_rename_no_produced.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dbunit/src/test/resources/schema.sql b/dbunit/src/test/resources/schema.sql index 9b5018985a..dc4738ca76 100644 --- a/dbunit/src/test/resources/schema.sql +++ b/dbunit/src/test/resources/schema.sql @@ -1,28 +1,28 @@ CREATE TABLE IF NOT EXISTS USERS ( - `id` int AUTO_INCREMENT NOT NULL, - `first_name` varchar(100) NOT NULL, - `last_name` varchar(100) NOT NULL, - PRIMARY KEY (`id`) + `id` int AUTO_INCREMENT NOT NULL, + `first_name` varchar(100) NOT NULL, + `last_name` varchar(100) NOT NULL, + PRIMARY KEY (`id`) ); CREATE TABLE IF NOT EXISTS ITEMS ( - `id` int AUTO_INCREMENT NOT NULL, - `title` varchar(100) NOT NULL, - `produced` date, - `price` float, - PRIMARY KEY (`id`) + `id` int AUTO_INCREMENT NOT NULL, + `title` varchar(100) NOT NULL, + `produced` date, + `price` float, + PRIMARY KEY (`id`) ); CREATE TABLE IF NOT EXISTS PURCHASES ( - `id` int NOT NULL AUTO_INCREMENT, - `id_user` int NOT NULL, - `id_item` int NOT NULL, - `total_price` float NOT NULL, - `quantity` int(11) NOT NULL, - PRIMARY KEY (`id`), - FOREIGN KEY (`id_user`) REFERENCES USERS (`id`) ON DELETE CASCADE, - FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE + `id` int NOT NULL AUTO_INCREMENT, + `id_user` int NOT NULL, + `id_item` int NOT NULL, + `total_price` float NOT NULL, + `quantity` int(11) NOT NULL, + PRIMARY KEY (`id`), + FOREIGN KEY (`id_user`) REFERENCES USERS (`id`) ON DELETE CASCADE, + FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE ); diff --git a/dbunit/src/test/resources/users.xml b/dbunit/src/test/resources/users.xml index cebadf2e67..d8ff78024e 100644 --- a/dbunit/src/test/resources/users.xml +++ b/dbunit/src/test/resources/users.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/dbunit/src/test/resources/users_exp_delete.xml b/dbunit/src/test/resources/users_exp_delete.xml index 8b72ceef89..c4ea6e64e5 100644 --- a/dbunit/src/test/resources/users_exp_delete.xml +++ b/dbunit/src/test/resources/users_exp_delete.xml @@ -1,6 +1,6 @@ - - + + diff --git a/dbunit/src/test/resources/users_exp_rename.xml b/dbunit/src/test/resources/users_exp_rename.xml index 9bc1254967..c187e1ebe5 100644 --- a/dbunit/src/test/resources/users_exp_rename.xml +++ b/dbunit/src/test/resources/users_exp_rename.xml @@ -1,7 +1,7 @@ - - - + + + From d5d1cc7d580b1749b9f29df644ea34cbddeee8ac Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Tue, 31 Mar 2020 12:02:24 +0200 Subject: [PATCH 273/530] [BAEL-2749] Adds DataSourceBaseDBTestCase --- .../baeldung/dbunit/DataSourceDBUnitTest.java | 46 +++++++++++++++++++ ...{SampleDbUnitTest.java => DbUnitTest.java} | 12 ++--- 2 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java rename dbunit/src/test/java/com/baeldung/dbunit/{SampleDbUnitTest.java => DbUnitTest.java} (85%) diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java new file mode 100644 index 0000000000..154d93e0af --- /dev/null +++ b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.dbunit; + +import org.dbunit.DataSourceBasedDBTestCase; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.Test; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { + @Override + protected DataSource getDataSource() { + JdbcDataSource dataSource = new JdbcDataSource(); + dataSource.setURL( + "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"); + dataSource.setUser("sa"); + dataSource.setPassword("sa"); + return dataSource; + } + + @Override + protected IDataSet getDataSet() throws Exception { + return new FlatXmlDataSetBuilder().build(getClass() + .getClassLoader() + .getResourceAsStream("data.xml")); + } + + @Test + public void testSimpleDataSet() throws SQLException { + final Connection connection = getDataSource() + .getConnection(); + + final ResultSet rs = connection + .createStatement() + .executeQuery("select * from iTEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } +} diff --git a/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java similarity index 85% rename from dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java rename to dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java index f7970754e7..8d6a94279a 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/SampleDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java @@ -19,9 +19,9 @@ import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; import static com.baeldung.dbunit.ConnectionSettings.USER; import static org.assertj.core.api.Assertions.assertThat; -public class SampleDbUnitTest extends DBTestCase { +public class DbUnitTest extends DBTestCase { - public SampleDbUnitTest(String name) { + public DbUnitTest(String name) { super(name); System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); @@ -32,7 +32,7 @@ public class SampleDbUnitTest extends DBTestCase { @Override protected IDataSet getDataSet() throws Exception { - final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml"); + final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("data.xml"); return new FlatXmlDataSetBuilder().build(is); } @@ -53,14 +53,14 @@ public class SampleDbUnitTest extends DBTestCase { final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + assertThat(rs.getString( "title")).isEqualTo("Grey T-Shirt"); } @Test public void testDelete() throws Exception { final Connection connection = getConnection().getConnection(); - final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); + final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); @@ -75,7 +75,7 @@ public class SampleDbUnitTest extends DBTestCase { public void testUpdate() throws Exception { final Connection connection = getConnection().getConnection(); - final InputStream is = SampleDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); + final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); From ef19d83db5f48290978f5c4e9e3c738a53e6087c Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Tue, 31 Mar 2020 12:38:39 +0200 Subject: [PATCH 274/530] [BAEL-2749] USERS table name changed to CLIENTS --- .../baeldung/dbunit/DataSourceDBUnitTest.java | 18 +++++++++++++++--- .../java/com/baeldung/dbunit/DbUnitTest.java | 1 - .../dbunit/PrepAndExpectedDbUnitTest.java | 12 ++++++------ dbunit/src/test/resources/data.xml | 2 +- dbunit/src/test/resources/schema.sql | 4 ++-- dbunit/src/test/resources/users.xml | 6 +++--- dbunit/src/test/resources/users_exp_delete.xml | 4 ++-- dbunit/src/test/resources/users_exp_rename.xml | 6 +++--- 8 files changed, 32 insertions(+), 21 deletions(-) diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java index 154d93e0af..c8045394c4 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -1,7 +1,9 @@ package com.baeldung.dbunit; +import org.dbunit.Assertion; import org.dbunit.DataSourceBasedDBTestCase; import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.ITable; import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; import org.h2.jdbcx.JdbcDataSource; import org.junit.Test; @@ -11,16 +13,17 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; import static org.assertj.core.api.Assertions.assertThat; public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { + @Override protected DataSource getDataSource() { JdbcDataSource dataSource = new JdbcDataSource(); - dataSource.setURL( - "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"); + dataSource.setURL(JDBC_URL); dataSource.setUser("sa"); - dataSource.setPassword("sa"); + dataSource.setPassword(""); return dataSource; } @@ -43,4 +46,13 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { assertThat(rs.next()).isTrue(); assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); } + + @Test + public void testEmptySchema() throws Exception { + IDataSet expectedDataSet = getDataSet(); + ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("CLIENTS"); + Assertion.assertEquals(expectedTable, actualTable); + } } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java index 8d6a94279a..479ea3dd51 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java @@ -27,7 +27,6 @@ public class DbUnitTest extends DBTestCase { System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); - // System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, ""); } @Override diff --git a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java index bb70136de2..2c7e5de508 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -50,13 +50,13 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { @Test public void testSelect() throws Exception { final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users.xml"}; final PrepAndExpectedTestCaseSteps testSteps = () -> connection .createStatement() - .executeQuery("select * from USERS where id = 1"); + .executeQuery("select * from CLIENTS where id = 1"); final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); @@ -67,13 +67,13 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { @Test public void testUpdate() throws Exception { final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; // define tables to verify + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; // define tables to verify final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users_exp_rename.xml"}; final PrepAndExpectedTestCaseSteps testSteps = () -> connection .createStatement() - .executeUpdate("update USERS set first_name = 'new name' where id = 1"); + .executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); } @@ -81,13 +81,13 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { @Test public void testDelete() throws Exception { final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("USERS", new String[]{})}; + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users_exp_delete.xml"}; final PrepAndExpectedTestCaseSteps testSteps = () -> connection .createStatement() - .executeUpdate("delete from USERS where id = 2"); + .executeUpdate("delete from CLIENTS where id = 2"); super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); } diff --git a/dbunit/src/test/resources/data.xml b/dbunit/src/test/resources/data.xml index ac413cfd23..4230073fc6 100644 --- a/dbunit/src/test/resources/data.xml +++ b/dbunit/src/test/resources/data.xml @@ -1,7 +1,7 @@ - + diff --git a/dbunit/src/test/resources/schema.sql b/dbunit/src/test/resources/schema.sql index dc4738ca76..c2a8d2d630 100644 --- a/dbunit/src/test/resources/schema.sql +++ b/dbunit/src/test/resources/schema.sql @@ -1,4 +1,4 @@ -CREATE TABLE IF NOT EXISTS USERS +CREATE TABLE IF NOT EXISTS CLIENTS ( `id` int AUTO_INCREMENT NOT NULL, `first_name` varchar(100) NOT NULL, @@ -23,6 +23,6 @@ CREATE TABLE IF NOT EXISTS PURCHASES `total_price` float NOT NULL, `quantity` int(11) NOT NULL, PRIMARY KEY (`id`), - FOREIGN KEY (`id_user`) REFERENCES USERS (`id`) ON DELETE CASCADE, + FOREIGN KEY (`id_user`) REFERENCES CLIENTS (`id`) ON DELETE CASCADE, FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE ); diff --git a/dbunit/src/test/resources/users.xml b/dbunit/src/test/resources/users.xml index d8ff78024e..9c14435362 100644 --- a/dbunit/src/test/resources/users.xml +++ b/dbunit/src/test/resources/users.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/dbunit/src/test/resources/users_exp_delete.xml b/dbunit/src/test/resources/users_exp_delete.xml index c4ea6e64e5..3780c00c4c 100644 --- a/dbunit/src/test/resources/users_exp_delete.xml +++ b/dbunit/src/test/resources/users_exp_delete.xml @@ -1,6 +1,6 @@ - - + + diff --git a/dbunit/src/test/resources/users_exp_rename.xml b/dbunit/src/test/resources/users_exp_rename.xml index c187e1ebe5..a576cc9e80 100644 --- a/dbunit/src/test/resources/users_exp_rename.xml +++ b/dbunit/src/test/resources/users_exp_rename.xml @@ -1,7 +1,7 @@ - - - + + + From 07947ce4d62daae7bc147fe7b4ac106b070b4d0e Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Tue, 31 Mar 2020 13:31:11 +0200 Subject: [PATCH 275/530] [BAEL-2749] Insertion test with ignore cols --- .../baeldung/dbunit/DataSourceDBUnitTest.java | 18 ++++++++++++++++++ dbunit/src/test/resources/expected-user.xml | 5 +++++ 2 files changed, 23 insertions(+) create mode 100644 dbunit/src/test/resources/expected-user.xml diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java index c8045394c4..d30305ecf2 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -55,4 +55,22 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { ITable actualTable = databaseDataSet.getTable("CLIENTS"); Assertion.assertEquals(expectedTable, actualTable); } + + + @Test + public void testAssertByQuery() throws Exception { + IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(getClass() + .getClassLoader() + .getResourceAsStream("expected-user.xml")); + ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + Connection conn = getDataSource().getConnection(); + conn.createStatement() + .executeUpdate( + "INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); + ITable actualData = getConnection() + .createQueryTable( + "result_name", + "SELECT * FROM CLIENTS WHERE id='2'"); + Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[]{"id"}); + } } diff --git a/dbunit/src/test/resources/expected-user.xml b/dbunit/src/test/resources/expected-user.xml new file mode 100644 index 0000000000..379db13601 --- /dev/null +++ b/dbunit/src/test/resources/expected-user.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 906d72859f67d1d9d9016d6b689805286d4c2675 Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Tue, 31 Mar 2020 17:51:04 +0200 Subject: [PATCH 276/530] [BAEL-2749] Test Code Completion --- .../baeldung/dbunit/DataSourceDBUnitTest.java | 49 ++++++++++++++++++- .../java/com/baeldung/dbunit/DbUnitTest.java | 2 +- .../baeldung/dbunit/OldSchoolDbUnitTest.java | 19 ++++++- dbunit/src/test/resources/data.xml | 2 - .../expected-ignoring-registered_at.xml | 9 ++++ .../resources/expected-multiple-failures.xml | 9 ++++ dbunit/src/test/resources/expected-user.xml | 3 +- dbunit/src/test/resources/items.xml | 1 - .../src/test/resources/items_exp_delete.xml | 1 - .../items_exp_delete_no_produced.xml | 1 - .../src/test/resources/items_exp_rename.xml | 1 - .../items_exp_rename_no_produced.xml | 1 - dbunit/src/test/resources/users.xml | 1 - .../src/test/resources/users_exp_delete.xml | 1 - .../src/test/resources/users_exp_rename.xml | 1 - 15 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 dbunit/src/test/resources/expected-ignoring-registered_at.xml create mode 100644 dbunit/src/test/resources/expected-multiple-failures.xml diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java index d30305ecf2..7482f38535 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -2,10 +2,15 @@ package com.baeldung.dbunit; import org.dbunit.Assertion; import org.dbunit.DataSourceBasedDBTestCase; +import org.dbunit.assertion.DiffCollectingFailureHandler; +import org.dbunit.assertion.Difference; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.ITable; import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; import org.h2.jdbcx.JdbcDataSource; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import javax.sql.DataSource; @@ -14,6 +19,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static java.util.stream.Collectors.joining; import static org.assertj.core.api.Assertions.assertThat; public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { @@ -34,6 +40,27 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { .getResourceAsStream("data.xml")); } + @Override + protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; + } + + @Override + protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.DELETE_ALL; + } + + @Before + public void setUp() throws Exception { + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + } + + @Test public void testSimpleDataSet() throws SQLException { final Connection connection = getDataSource() @@ -56,7 +83,6 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { Assertion.assertEquals(expectedTable, actualTable); } - @Test public void testAssertByQuery() throws Exception { IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(getClass() @@ -70,7 +96,26 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { ITable actualData = getConnection() .createQueryTable( "result_name", - "SELECT * FROM CLIENTS WHERE id='2'"); + "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[]{"id"}); } + + @Test(expected = AssertionError.class) + public void testMultipleFailures() throws Exception { + IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(getClass().getClassLoader().getResourceAsStream("expected-multiple-failures.xml")); + ITable expectedTable = expectedDataSet.getTable("ITEMS"); + Connection conn = getDataSource().getConnection(); + conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); + ITable actualData = getConnection().createDataSet().getTable("ITEMS"); + DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); + Assertion.assertEquals(expectedTable, actualData, collectingHandler); + if (!collectingHandler.getDiffList().isEmpty()) { + String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); +// throw new AssertionError(message); + } + } + + private static String formatDifference(Difference diff) { + return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue(); + } } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java index 479ea3dd51..1dee5afb28 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java @@ -42,7 +42,7 @@ public class DbUnitTest extends DBTestCase { @Override protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.NONE; + return DatabaseOperation.DELETE_ALL; } @Test diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index 0b63184951..3b46feb304 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.dbunit; +import org.dbunit.Assertion; import org.dbunit.IDatabaseTester; import org.dbunit.JdbcDatabaseTester; import org.dbunit.dataset.IDataSet; @@ -36,7 +37,7 @@ public class OldSchoolDbUnitTest { final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); tester.setDataSet(initDataSet()); tester.setSetUpOperation(DatabaseOperation.REFRESH); - tester.setTearDownOperation(DatabaseOperation.NONE); + tester.setTearDownOperation(DatabaseOperation.DELETE_ALL); return tester; } @@ -65,6 +66,22 @@ public class OldSchoolDbUnitTest { assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); } + @Test + public void testIgnoringProduced() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + final String[] excludedColumns = {"id", "produced"}; + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(getClass().getClassLoader() + .getResourceAsStream("expected-ignoring-registered_at.xml")); + final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); + + connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); + + Assertion.assertEquals(expectedTable, actualTable); + } + @Test public void testDelete() throws Exception { final Connection connection = tester.getConnection().getConnection(); diff --git a/dbunit/src/test/resources/data.xml b/dbunit/src/test/resources/data.xml index 4230073fc6..290cc36890 100644 --- a/dbunit/src/test/resources/data.xml +++ b/dbunit/src/test/resources/data.xml @@ -1,8 +1,6 @@ - - diff --git a/dbunit/src/test/resources/expected-ignoring-registered_at.xml b/dbunit/src/test/resources/expected-ignoring-registered_at.xml new file mode 100644 index 0000000000..ea57b6a961 --- /dev/null +++ b/dbunit/src/test/resources/expected-ignoring-registered_at.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/dbunit/src/test/resources/expected-multiple-failures.xml b/dbunit/src/test/resources/expected-multiple-failures.xml new file mode 100644 index 0000000000..ea57b6a961 --- /dev/null +++ b/dbunit/src/test/resources/expected-multiple-failures.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/dbunit/src/test/resources/expected-user.xml b/dbunit/src/test/resources/expected-user.xml index 379db13601..631dd84210 100644 --- a/dbunit/src/test/resources/expected-user.xml +++ b/dbunit/src/test/resources/expected-user.xml @@ -1,5 +1,4 @@ - - + \ No newline at end of file diff --git a/dbunit/src/test/resources/items.xml b/dbunit/src/test/resources/items.xml index 04a975d7ee..d13e93bbe0 100644 --- a/dbunit/src/test/resources/items.xml +++ b/dbunit/src/test/resources/items.xml @@ -1,5 +1,4 @@ - diff --git a/dbunit/src/test/resources/items_exp_delete.xml b/dbunit/src/test/resources/items_exp_delete.xml index 09b78da493..a6fa2b33e8 100644 --- a/dbunit/src/test/resources/items_exp_delete.xml +++ b/dbunit/src/test/resources/items_exp_delete.xml @@ -1,5 +1,4 @@ - diff --git a/dbunit/src/test/resources/items_exp_delete_no_produced.xml b/dbunit/src/test/resources/items_exp_delete_no_produced.xml index dd76e8c6ce..3e7f854f5f 100644 --- a/dbunit/src/test/resources/items_exp_delete_no_produced.xml +++ b/dbunit/src/test/resources/items_exp_delete_no_produced.xml @@ -1,5 +1,4 @@ - diff --git a/dbunit/src/test/resources/items_exp_rename.xml b/dbunit/src/test/resources/items_exp_rename.xml index 830d83499f..32f1d57cf6 100644 --- a/dbunit/src/test/resources/items_exp_rename.xml +++ b/dbunit/src/test/resources/items_exp_rename.xml @@ -1,5 +1,4 @@ - diff --git a/dbunit/src/test/resources/items_exp_rename_no_produced.xml b/dbunit/src/test/resources/items_exp_rename_no_produced.xml index 991c4726a0..b42d3804fa 100644 --- a/dbunit/src/test/resources/items_exp_rename_no_produced.xml +++ b/dbunit/src/test/resources/items_exp_rename_no_produced.xml @@ -1,5 +1,4 @@ - diff --git a/dbunit/src/test/resources/users.xml b/dbunit/src/test/resources/users.xml index 9c14435362..9ac3909bc5 100644 --- a/dbunit/src/test/resources/users.xml +++ b/dbunit/src/test/resources/users.xml @@ -1,5 +1,4 @@ - diff --git a/dbunit/src/test/resources/users_exp_delete.xml b/dbunit/src/test/resources/users_exp_delete.xml index 3780c00c4c..2fe97ae6f6 100644 --- a/dbunit/src/test/resources/users_exp_delete.xml +++ b/dbunit/src/test/resources/users_exp_delete.xml @@ -1,5 +1,4 @@ - diff --git a/dbunit/src/test/resources/users_exp_rename.xml b/dbunit/src/test/resources/users_exp_rename.xml index a576cc9e80..95682118bb 100644 --- a/dbunit/src/test/resources/users_exp_rename.xml +++ b/dbunit/src/test/resources/users_exp_rename.xml @@ -1,5 +1,4 @@ - From 1e052c5a721be544899a146080b5103f1af2c8d5 Mon Sep 17 00:00:00 2001 From: Amy DeGregorio Date: Tue, 31 Mar 2020 12:02:54 -0400 Subject: [PATCH 277/530] BAEL-3827 Add CSS and JS to Thymeleaf (#8985) * BAEL-3827 Add CSS and JS to Thymeleaf * BAEL-3827 Add integration tests * BAEL-3827 Add new spring-thymeleaf-3 module to the parent pom.xml * BAEL-3827 Add new spring-thymeleaf-3 module to the parent pom.xml in both places --- pom.xml | 2 + spring-thymeleaf-3/README.md | 5 ++ spring-thymeleaf-3/pom.xml | 78 +++++++++++++++++++ .../com/baeldung/thymeleaf/Application.java | 11 +++ .../cssandjs/CssAndJsApplication.java | 11 +++ .../cssandjs/CssAndJsController.java | 15 ++++ .../resources/static/js/cssandjs/actions.js | 7 ++ .../resources/static/styles/cssandjs/main.css | 18 +++++ .../templates/cssandjs/styledPage.html | 20 +++++ .../thymeleaf/ApplicationIntegrationTest.java | 13 ++++ .../CssAndJsControllerIntegrationTest.java | 41 ++++++++++ 11 files changed, 221 insertions(+) create mode 100644 spring-thymeleaf-3/README.md create mode 100644 spring-thymeleaf-3/pom.xml create mode 100644 spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/Application.java create mode 100644 spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsApplication.java create mode 100644 spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsController.java create mode 100644 spring-thymeleaf-3/src/main/resources/static/js/cssandjs/actions.js create mode 100644 spring-thymeleaf-3/src/main/resources/static/styles/cssandjs/main.css create mode 100644 spring-thymeleaf-3/src/main/resources/templates/cssandjs/styledPage.html create mode 100644 spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/ApplicationIntegrationTest.java create mode 100644 spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/cssandjs/CssAndJsControllerIntegrationTest.java diff --git a/pom.xml b/pom.xml index e82390a37e..9f132ca7a8 100644 --- a/pom.xml +++ b/pom.xml @@ -729,6 +729,7 @@ spring-threads spring-thymeleaf spring-thymeleaf-2 + spring-thymeleaf-3 spring-vault spring-vertx @@ -1229,6 +1230,7 @@ spring-thymeleaf spring-thymeleaf-2 + spring-thymeleaf-3 spring-vault spring-vertx diff --git a/spring-thymeleaf-3/README.md b/spring-thymeleaf-3/README.md new file mode 100644 index 0000000000..e1ddd727d7 --- /dev/null +++ b/spring-thymeleaf-3/README.md @@ -0,0 +1,5 @@ +## Spring Thymeleaf 3 + +This module contains articles about Spring with Thymeleaf + +## Relevant Articles: \ No newline at end of file diff --git a/spring-thymeleaf-3/pom.xml b/spring-thymeleaf-3/pom.xml new file mode 100644 index 0000000000..7677e50d79 --- /dev/null +++ b/spring-thymeleaf-3/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + spring-thymeleaf-3 + spring-thymeleaf-3 + war + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.thymeleaf.cssandjs.CssAndJsApplication + JAR + + + + org.apache.maven.plugins + maven-war-plugin + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + ${tomcat7-maven-plugin.version} + + + tomcat-run + + exec-war-only + + package + + / + false + webapp.jar + utf-8 + + + + + + spring-thymeleaf-3 + + + + 1.8 + 1.8 + 2.2 + + + diff --git a/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/Application.java b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/Application.java new file mode 100644 index 0000000000..2ccca82497 --- /dev/null +++ b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/Application.java @@ -0,0 +1,11 @@ +package com.baeldung.thymeleaf; + +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-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsApplication.java b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsApplication.java new file mode 100644 index 0000000000..fc6c142b8b --- /dev/null +++ b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.thymeleaf.cssandjs; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CssAndJsApplication { + public static void main(String[] args) { + SpringApplication.run(CssAndJsApplication.class, args); + } +} diff --git a/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsController.java b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsController.java new file mode 100644 index 0000000000..b56a7b468e --- /dev/null +++ b/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/cssandjs/CssAndJsController.java @@ -0,0 +1,15 @@ +package com.baeldung.thymeleaf.cssandjs; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class CssAndJsController { + + @GetMapping("/styled-page") + public String getStyledPage(Model model) { + model.addAttribute("name", "Baeldung Reader"); + return "cssandjs/styledPage"; + } +} diff --git a/spring-thymeleaf-3/src/main/resources/static/js/cssandjs/actions.js b/spring-thymeleaf-3/src/main/resources/static/js/cssandjs/actions.js new file mode 100644 index 0000000000..e192e6358e --- /dev/null +++ b/spring-thymeleaf-3/src/main/resources/static/js/cssandjs/actions.js @@ -0,0 +1,7 @@ +function showAlert() { + alert("The button was clicked!"); +} + +function showName(name) { + alert("Here's the name: " + name); +} \ No newline at end of file diff --git a/spring-thymeleaf-3/src/main/resources/static/styles/cssandjs/main.css b/spring-thymeleaf-3/src/main/resources/static/styles/cssandjs/main.css new file mode 100644 index 0000000000..1f57b4616a --- /dev/null +++ b/spring-thymeleaf-3/src/main/resources/static/styles/cssandjs/main.css @@ -0,0 +1,18 @@ +h2 { + font-family: sans-serif; + font-size: 1.5em; + text-transform: uppercase; +} + +strong { + font-weight: 700; + background-color: yellow; +} + +p { + font-family: sans-serif; +} + +label { + font-weight: 600; +} \ No newline at end of file diff --git a/spring-thymeleaf-3/src/main/resources/templates/cssandjs/styledPage.html b/spring-thymeleaf-3/src/main/resources/templates/cssandjs/styledPage.html new file mode 100644 index 0000000000..12e4fc9227 --- /dev/null +++ b/spring-thymeleaf-3/src/main/resources/templates/cssandjs/styledPage.html @@ -0,0 +1,20 @@ + + + + + Add CSS and JS to Thymeleaf + + + + + +

Carefully Styled Heading

+

+ This is text on which we want to apply very special styling. +

+

+ + + \ No newline at end of file diff --git a/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/ApplicationIntegrationTest.java b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/ApplicationIntegrationTest.java new file mode 100644 index 0000000000..b7cfa140f0 --- /dev/null +++ b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/ApplicationIntegrationTest.java @@ -0,0 +1,13 @@ +package com.baeldung.thymeleaf; + +import org.junit.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class ApplicationIntegrationTest { + + @Test + public void contextLoads() { + + } +} diff --git a/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/cssandjs/CssAndJsControllerIntegrationTest.java b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/cssandjs/CssAndJsControllerIntegrationTest.java new file mode 100644 index 0000000000..365608bd2a --- /dev/null +++ b/spring-thymeleaf-3/src/test/java/com/baeldung/thymeleaf/cssandjs/CssAndJsControllerIntegrationTest.java @@ -0,0 +1,41 @@ +package com.baeldung.thymeleaf.cssandjs; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +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.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = CssAndJsApplication.class) +public class CssAndJsControllerIntegrationTest { + @Autowired + private WebApplicationContext context; + + private MockMvc mockMvc; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build(); + } + + @Test + public void whenCalledGetStyledPage_thenReturnContent() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/styled-page")) + .andExpect(status().isOk()) + .andExpect(view().name("cssandjs/styledPage")) + .andExpect(content().string(containsString("Carefully Styled Heading"))); + } +} From dc5f7efe47ca47050a4e6f5a0534a0fd1bb870be Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Tue, 31 Mar 2020 22:04:57 +0430 Subject: [PATCH 278/530] Fixing the False Sharing of the Data.sql File --- .../main/resources/application-lazy-load-no-trans-off.properties | 1 + .../main/resources/application-lazy-load-no-trans-on.properties | 1 + .../src/main/resources/{data.sql => data-trans.sql} | 0 3 files changed, 2 insertions(+) rename persistence-modules/spring-boot-persistence-h2/src/main/resources/{data.sql => data-trans.sql} (100%) diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-off.properties b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-off.properties index b5fb841685..1055806ecf 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-off.properties +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-off.properties @@ -5,6 +5,7 @@ spring.datasource.password= spring.jpa.hibernate.ddl-auto=create-drop spring.h2.console.enabled=true spring.h2.console.path=/h2-console +spring.datasource.data=data-trans.sql logging.level.org.hibernate.SQL=INFO logging.level.org.hibernate.type=TRACE diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-on.properties b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-on.properties index 04579e1dae..77aacf0d77 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-on.properties +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application-lazy-load-no-trans-on.properties @@ -5,6 +5,7 @@ spring.datasource.password= spring.jpa.hibernate.ddl-auto=create-drop spring.h2.console.enabled=true spring.h2.console.path=/h2-console +spring.datasource.data=data-trans.sql logging.level.org.hibernate.SQL=INFO logging.level.org.hibernate.type=TRACE diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/data.sql b/persistence-modules/spring-boot-persistence-h2/src/main/resources/data-trans.sql similarity index 100% rename from persistence-modules/spring-boot-persistence-h2/src/main/resources/data.sql rename to persistence-modules/spring-boot-persistence-h2/src/main/resources/data-trans.sql From 0b1c5e01a5108350a493a06e07d2779a0b9e3f60 Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Tue, 31 Mar 2020 20:18:11 +0200 Subject: [PATCH 279/530] [BAEL-2749] Improves code and makes a copy in libraries-testing --- dbunit/README.md | 2 - dbunit/docs/db_schema.png | Bin 17099 -> 0 bytes .../baeldung/dbunit/DataSourceDBUnitTest.java | 75 ++++---- .../java/com/baeldung/dbunit/DbUnitTest.java | 33 ++-- .../baeldung/dbunit/OldSchoolDbUnitTest.java | 85 +++++---- .../dbunit/PrepAndExpectedDbUnitTest.java | 23 +-- libraries-testing/pom.xml | 37 ++++ .../baeldung/dbunit/ConnectionSettings.java | 8 + .../baeldung/dbunit/DataSourceDBUnitTest.java | 136 +++++++++++++++ .../java/com/baeldung/dbunit/DbUnitTest.java | 90 ++++++++++ .../baeldung/dbunit/OldSchoolDbUnitTest.java | 161 ++++++++++++++++++ .../dbunit/PrepAndExpectedDbUnitTest.java | 89 ++++++++++ .../src/test/resources/dbunit/data.xml | 9 + .../expected-ignoring-registered_at.xml | 9 + .../dbunit/expected-multiple-failures.xml | 9 + .../test/resources/dbunit/expected-user.xml | 4 + .../src/test/resources/dbunit/items.xml | 8 + .../resources/dbunit/items_exp_delete.xml | 7 + .../dbunit/items_exp_delete_no_produced.xml | 7 + .../resources/dbunit/items_exp_rename.xml | 8 + .../dbunit/items_exp_rename_no_produced.xml | 8 + .../src/test/resources/dbunit/schema.sql | 28 +++ .../src/test/resources/dbunit/users.xml | 6 + .../resources/dbunit/users_exp_delete.xml | 5 + .../resources/dbunit/users_exp_rename.xml | 6 + 25 files changed, 758 insertions(+), 95 deletions(-) delete mode 100644 dbunit/docs/db_schema.png create mode 100644 libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java create mode 100644 libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java create mode 100644 libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java create mode 100644 libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java create mode 100644 libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java create mode 100644 libraries-testing/src/test/resources/dbunit/data.xml create mode 100644 libraries-testing/src/test/resources/dbunit/expected-ignoring-registered_at.xml create mode 100644 libraries-testing/src/test/resources/dbunit/expected-multiple-failures.xml create mode 100644 libraries-testing/src/test/resources/dbunit/expected-user.xml create mode 100644 libraries-testing/src/test/resources/dbunit/items.xml create mode 100644 libraries-testing/src/test/resources/dbunit/items_exp_delete.xml create mode 100644 libraries-testing/src/test/resources/dbunit/items_exp_delete_no_produced.xml create mode 100644 libraries-testing/src/test/resources/dbunit/items_exp_rename.xml create mode 100644 libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml create mode 100644 libraries-testing/src/test/resources/dbunit/schema.sql create mode 100644 libraries-testing/src/test/resources/dbunit/users.xml create mode 100644 libraries-testing/src/test/resources/dbunit/users_exp_delete.xml create mode 100644 libraries-testing/src/test/resources/dbunit/users_exp_rename.xml diff --git a/dbunit/README.md b/dbunit/README.md index 383bd6fb7e..333cac9439 100644 --- a/dbunit/README.md +++ b/dbunit/README.md @@ -1,6 +1,4 @@ ### Database schema -![db schema](docs/db_schema.png) - ### Relevant Articles: - [Introduction To DBUnit](https://www.baeldung.com/dbunit) diff --git a/dbunit/docs/db_schema.png b/dbunit/docs/db_schema.png deleted file mode 100644 index d9185bacd2c624c8e05aea87bf542cfdfd7f1604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17099 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 formatDifference((Difference) d)).collect(joining("\n")); -// throw new AssertionError(message); + try (final InputStream is = getClass() + .getClassLoader() + .getResourceAsStream("expected-multiple-failures.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = expectedDataSet.getTable("ITEMS"); + final Connection conn = getDataSource().getConnection(); + final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); + + conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); + final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualData, collectingHandler); + if (!collectingHandler.getDiffList().isEmpty()) { + String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); + logger.error(() -> message); + } } } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java index 1dee5afb28..d24410bedf 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java @@ -31,8 +31,9 @@ public class DbUnitTest extends DBTestCase { @Override protected IDataSet getDataSet() throws Exception { - final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("data.xml"); - return new FlatXmlDataSetBuilder().build(is); + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } } @Override @@ -52,37 +53,39 @@ public class DbUnitTest extends DBTestCase { final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); assertThat(rs.next()).isTrue(); - assertThat(rs.getString( "title")).isEqualTo("Grey T-Shirt"); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); } @Test public void testDelete() throws Exception { final Connection connection = getConnection().getConnection(); - final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); - Assertion.assertEquals(expectedTable, actualTable); + Assertion.assertEquals(expectedTable, actualTable); + } } @Test public void testUpdate() throws Exception { final Connection connection = getConnection().getConnection(); - final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); - Assertion.assertEquals(expectedTable, actualTable); + Assertion.assertEquals(expectedTable, actualTable); + } } } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index 3b46feb304..41d7ffd8d4 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -42,8 +42,9 @@ public class OldSchoolDbUnitTest { } private static IDataSet initDataSet() throws Exception { - final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml"); - return new FlatXmlDataSetBuilder().build(is); + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } } @Before @@ -70,78 +71,92 @@ public class OldSchoolDbUnitTest { public void testIgnoringProduced() throws Exception { final Connection connection = tester.getConnection().getConnection(); final String[] excludedColumns = {"id", "produced"}; - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(getClass().getClassLoader() - .getResourceAsStream("expected-ignoring-registered_at.xml")); - final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); + try (final InputStream is = getClass().getClassLoader() + .getResourceAsStream("expected-ignoring-registered_at.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); - connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); + connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); - Assertion.assertEquals(expectedTable, actualTable); + Assertion.assertEquals(expectedTable, actualTable); + } } @Test public void testDelete() throws Exception { final Connection connection = tester.getConnection().getConnection(); - final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml"); - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + try (final InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("items_exp_delete.xml");) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); - assertEquals(expectedTable, actualTable); + assertEquals(expectedTable, actualTable); + } } @Test public void testDeleteWithExcludedColumns() throws Exception { final Connection connection = tester.getConnection().getConnection(); - final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete_no_produced.xml"); - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + try (final InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("items_exp_delete_no_produced.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - assertEquals(expectedTable, actualTable); + assertEquals(expectedTable, actualTable); + } } @Test public void testUpdate() throws Exception { final Connection connection = tester.getConnection().getConnection(); - final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml"); - final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + try (final InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("items_exp_rename.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); - assertEquals(expectedTable, actualTable); + assertEquals(expectedTable, actualTable); + } } @Test public void testUpdateWithExcludedColumns() throws Exception { final Connection connection = tester.getConnection().getConnection(); - final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename_no_produced.xml"); - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + try (final InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("items_exp_rename_no_produced.xml")) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - assertEquals(expectedTable, actualTable); + assertEquals(expectedTable, actualTable); + } } } diff --git a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java index 2c7e5de508..b4e23f56ff 100644 --- a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -39,8 +39,9 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { } private IDataSet initDataSet() throws Exception { - final InputStream is = getClass().getClassLoader().getResourceAsStream("data.xml"); - return new FlatXmlDataSetBuilder().build(is); + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } } private DataFileLoader initDataFileLoader() { @@ -53,10 +54,8 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = - () -> connection - .createStatement() - .executeQuery("select * from CLIENTS where id = 1"); + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() + .executeQuery("select * from CLIENTS where id = 1"); final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); @@ -70,10 +69,8 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; // define tables to verify final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users_exp_rename.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = - () -> connection - .createStatement() - .executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() + .executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); } @@ -84,10 +81,8 @@ public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; final String[] prepDataFiles = {"/users.xml"}; final String[] expectedDataFiles = {"/users_exp_delete.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = - () -> connection - .createStatement() - .executeUpdate("delete from CLIENTS where id = 2"); + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() + .executeUpdate("delete from CLIENTS where id = 2"); super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); } diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index 3ffbb291a0..c4d2786441 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -130,6 +130,27 @@ ${asciidoctor.version} + + org.dbunit + dbunit + ${dbunit.version} + test + + + + com.h2database + h2 + ${h2.version} + test + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + @@ -150,6 +171,16 @@ + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven-compiler-plugin.source} + ${maven-compiler-plugin.target} + + + @@ -166,6 +197,12 @@ 4.1.1 3.6.2 2.0.0.0 + 1.4.200 + 2.6.0 + 3.14.0 + 1.8 + 1.8 + 3.8.1 diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java new file mode 100644 index 0000000000..cc29d9c58a --- /dev/null +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java @@ -0,0 +1,8 @@ +package com.baeldung.dbunit; + +public class ConnectionSettings { + public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); + public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:dbunit/schema.sql'"; + public static final String USER = "sa"; + public static final String PASSWORD = ""; +} diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java new file mode 100644 index 0000000000..662ed44fb6 --- /dev/null +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -0,0 +1,136 @@ +package com.baeldung.dbunit; + +import org.dbunit.Assertion; +import org.dbunit.DataSourceBasedDBTestCase; +import org.dbunit.assertion.DiffCollectingFailureHandler; +import org.dbunit.assertion.Difference; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.ITable; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.platform.commons.logging.Logger; +import org.junit.platform.commons.logging.LoggerFactory; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; + +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static java.util.stream.Collectors.joining; +import static org.assertj.core.api.Assertions.assertThat; + +public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { + + private static Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); + + @Override + protected javax.sql.DataSource getDataSource() { + JdbcDataSource dataSource = new JdbcDataSource(); + dataSource.setURL(JDBC_URL); + dataSource.setUser("sa"); + dataSource.setPassword(""); + return dataSource; + } + + @Override + protected IDataSet getDataSet() throws Exception { + try (java.io.InputStream resourceAsStream = getClass() + .getClassLoader() + .getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(resourceAsStream); + } + } + + @Override + protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; + } + + @Override + protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.DELETE_ALL; + } + + @Before + public void setUp() throws Exception { + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + } + + + @Test + public void testSimpleDataSet() throws SQLException { + final Connection connection = getDataSource() + .getConnection(); + + final ResultSet rs = connection + .createStatement() + .executeQuery("select * from iTEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test + public void testEmptySchema() throws Exception { + final IDataSet expectedDataSet = getDataSet(); + final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + final IDataSet databaseDataSet = getConnection().createDataSet(); + final ITable actualTable = databaseDataSet.getTable("CLIENTS"); + Assertion.assertEquals(expectedTable, actualTable); + } + + @Test + public void testAssertByQuery() throws Exception { + try (final java.io.InputStream is = getClass() + .getClassLoader() + .getResourceAsStream("dbunit/expected-user.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + final Connection conn = getDataSource().getConnection(); + + conn.createStatement() + .executeUpdate( + "INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); + final ITable actualData = getConnection() + .createQueryTable( + "result_name", + "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); + + Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[]{"id"}); + } + } + + @Test + public void testMultipleFailures() throws Exception { + try (final java.io.InputStream is = getClass() + .getClassLoader() + .getResourceAsStream("dbunit/expected-multiple-failures.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = expectedDataSet.getTable("ITEMS"); + final Connection conn = getDataSource().getConnection(); + final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); + + conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); + final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualData, collectingHandler); + if (!collectingHandler.getDiffList().isEmpty()) { + String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); + logger.error(() -> message); + } + } + } + + private static String formatDifference(Difference diff) { + return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue(); + } +} diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java new file mode 100644 index 0000000000..3ed77b2c25 --- /dev/null +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java @@ -0,0 +1,90 @@ +package com.baeldung.dbunit; + +import org.dbunit.Assertion; +import org.dbunit.DBTestCase; +import org.dbunit.PropertiesBasedJdbcDatabaseTester; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.ITable; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.ResultSet; + +import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; +import static com.baeldung.dbunit.ConnectionSettings.USER; +import static org.assertj.core.api.Assertions.assertThat; + +public class DbUnitTest extends DBTestCase { + + public DbUnitTest(String name) { + super(name); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); + } + + @Override + protected IDataSet getDataSet() throws Exception { + try (final java.io.InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } + } + + @Override + protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; + } + + @Override + protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.DELETE_ALL; + } + + @Test + public void testSelect() throws Exception { + final Connection connection = getConnection().getConnection(); + + final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test + public void testDelete() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final java.io.InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + + Assertion.assertEquals(expectedTable, actualTable); + } + } + + @Test + public void testUpdate() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final java.io.InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + + Assertion.assertEquals(expectedTable, actualTable); + } + } + +} diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java new file mode 100644 index 0000000000..aa6d9143bb --- /dev/null +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -0,0 +1,161 @@ +package com.baeldung.dbunit; + +import org.dbunit.Assertion; +import org.dbunit.IDatabaseTester; +import org.dbunit.JdbcDatabaseTester; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.ITable; +import org.dbunit.dataset.filter.DefaultColumnFilter; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.ResultSet; + +import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; +import static com.baeldung.dbunit.ConnectionSettings.USER; +import static org.assertj.core.api.Assertions.assertThat; +import static org.dbunit.Assertion.assertEquals; + +public class OldSchoolDbUnitTest { + + private static IDatabaseTester tester = null; + + @BeforeClass + public static void setUp() throws Exception { + tester = initDatabaseTester(); + } + + private static IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + tester.setTearDownOperation(DatabaseOperation.DELETE_ALL); + return tester; + } + + private static IDataSet initDataSet() throws Exception { + try (final java.io.InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } + } + + @Before + public void setup() throws Exception { + tester.onSetup(); + } + + @After + public void tearDown() throws Exception { + tester.onTearDown(); + } + + @Test + public void testSelect() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test + public void testIgnoringProduced() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + final String[] excludedColumns = {"id", "produced"}; + try (final java.io.InputStream is = getClass().getClassLoader() + .getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); + + connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); + + Assertion.assertEquals(expectedTable, actualTable); + } + } + + @Test + public void testDelete() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final java.io.InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("dbunit/items_exp_delete.xml");) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + + assertEquals(expectedTable, actualTable); + } + } + + @Test + public void testDeleteWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final java.io.InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + + assertEquals(expectedTable, actualTable); + } + } + + @Test + public void testUpdate() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final java.io.InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("dbunit/items_exp_rename.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + + assertEquals(expectedTable, actualTable); + } + } + + @Test + public void testUpdateWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final java.io.InputStream is = + OldSchoolDbUnitTest.class.getClassLoader() + .getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("items"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); + + assertEquals(expectedTable, actualTable); + } + } + +} diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java new file mode 100644 index 0000000000..7e77cd8fc3 --- /dev/null +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -0,0 +1,89 @@ +package com.baeldung.dbunit; + +import org.dbunit.DefaultPrepAndExpectedTestCase; +import org.dbunit.IDatabaseTester; +import org.dbunit.JdbcDatabaseTester; +import org.dbunit.PrepAndExpectedTestCaseSteps; +import org.dbunit.VerifyTableDefinition; +import org.dbunit.dataset.IDataSet; +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; +import org.dbunit.operation.DatabaseOperation; +import org.dbunit.util.fileloader.DataFileLoader; +import org.dbunit.util.fileloader.FlatXmlDataFileLoader; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.ResultSet; + +import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; +import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; +import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; +import static com.baeldung.dbunit.ConnectionSettings.USER; +import static org.assertj.core.api.Assertions.assertThat; + +public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { + + @Override + public void setUp() throws Exception { + setDatabaseTester(initDatabaseTester()); + setDataFileLoader(initDataFileLoader()); + super.setUp(); + } + + private IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + return tester; + } + + private IDataSet initDataSet() throws Exception { + try (final java.io.InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } + } + + private DataFileLoader initDataFileLoader() { + return new FlatXmlDataFileLoader(); + } + + @Test + public void testSelect() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; + final String[] prepDataFiles = {"/dbunit/users.xml"}; + final String[] expectedDataFiles = {"/dbunit/users.xml"}; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() + .executeQuery("select * from CLIENTS where id = 1"); + + final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("last_name")).isEqualTo("Xavier"); + } + + @Test + public void testUpdate() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; // define tables to verify + final String[] prepDataFiles = {"/dbunit/users.xml"}; + final String[] expectedDataFiles = {"/dbunit/users_exp_rename.xml"}; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() + .executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); + + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } + + @Test + public void testDelete() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; + final String[] prepDataFiles = {"/dbunit/users.xml"}; + final String[] expectedDataFiles = {"/dbunit/users_exp_delete.xml"}; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() + .executeUpdate("delete from CLIENTS where id = 2"); + + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } + +} diff --git a/libraries-testing/src/test/resources/dbunit/data.xml b/libraries-testing/src/test/resources/dbunit/data.xml new file mode 100644 index 0000000000..290cc36890 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/data.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/expected-ignoring-registered_at.xml b/libraries-testing/src/test/resources/dbunit/expected-ignoring-registered_at.xml new file mode 100644 index 0000000000..ea57b6a961 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/expected-ignoring-registered_at.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/libraries-testing/src/test/resources/dbunit/expected-multiple-failures.xml b/libraries-testing/src/test/resources/dbunit/expected-multiple-failures.xml new file mode 100644 index 0000000000..ea57b6a961 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/expected-multiple-failures.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/libraries-testing/src/test/resources/dbunit/expected-user.xml b/libraries-testing/src/test/resources/dbunit/expected-user.xml new file mode 100644 index 0000000000..631dd84210 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/expected-user.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/libraries-testing/src/test/resources/dbunit/items.xml b/libraries-testing/src/test/resources/dbunit/items.xml new file mode 100644 index 0000000000..d13e93bbe0 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/items.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/items_exp_delete.xml b/libraries-testing/src/test/resources/dbunit/items_exp_delete.xml new file mode 100644 index 0000000000..a6fa2b33e8 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/items_exp_delete.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/items_exp_delete_no_produced.xml b/libraries-testing/src/test/resources/dbunit/items_exp_delete_no_produced.xml new file mode 100644 index 0000000000..3e7f854f5f --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/items_exp_delete_no_produced.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/items_exp_rename.xml b/libraries-testing/src/test/resources/dbunit/items_exp_rename.xml new file mode 100644 index 0000000000..32f1d57cf6 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/items_exp_rename.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml b/libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml new file mode 100644 index 0000000000..b42d3804fa --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/schema.sql b/libraries-testing/src/test/resources/dbunit/schema.sql new file mode 100644 index 0000000000..c2a8d2d630 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/schema.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS CLIENTS +( + `id` int AUTO_INCREMENT NOT NULL, + `first_name` varchar(100) NOT NULL, + `last_name` varchar(100) NOT NULL, + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS ITEMS +( + `id` int AUTO_INCREMENT NOT NULL, + `title` varchar(100) NOT NULL, + `produced` date, + `price` float, + PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS PURCHASES +( + `id` int NOT NULL AUTO_INCREMENT, + `id_user` int NOT NULL, + `id_item` int NOT NULL, + `total_price` float NOT NULL, + `quantity` int(11) NOT NULL, + PRIMARY KEY (`id`), + FOREIGN KEY (`id_user`) REFERENCES CLIENTS (`id`) ON DELETE CASCADE, + FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE +); diff --git a/libraries-testing/src/test/resources/dbunit/users.xml b/libraries-testing/src/test/resources/dbunit/users.xml new file mode 100644 index 0000000000..9ac3909bc5 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/users.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/users_exp_delete.xml b/libraries-testing/src/test/resources/dbunit/users_exp_delete.xml new file mode 100644 index 0000000000..2fe97ae6f6 --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/users_exp_delete.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/libraries-testing/src/test/resources/dbunit/users_exp_rename.xml b/libraries-testing/src/test/resources/dbunit/users_exp_rename.xml new file mode 100644 index 0000000000..95682118bb --- /dev/null +++ b/libraries-testing/src/test/resources/dbunit/users_exp_rename.xml @@ -0,0 +1,6 @@ + + + + + + From ee185d85b57e3b5036cec9aa3d5b13c08dc94ada Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Tue, 31 Mar 2020 20:19:11 +0200 Subject: [PATCH 280/530] [BAEL-2749] Removes dbunit module --- dbunit/README.md | 4 - dbunit/pom.xml | 62 ------- .../main/java/com/baeldung/dbunit/.gitkeep | 0 dbunit/src/main/resources/logback.xml | 13 -- .../baeldung/dbunit/ConnectionSettings.java | 8 - .../baeldung/dbunit/DataSourceDBUnitTest.java | 138 --------------- .../java/com/baeldung/dbunit/DbUnitTest.java | 91 ---------- .../baeldung/dbunit/OldSchoolDbUnitTest.java | 162 ------------------ .../dbunit/PrepAndExpectedDbUnitTest.java | 90 ---------- dbunit/src/test/resources/data.xml | 9 - .../expected-ignoring-registered_at.xml | 9 - .../resources/expected-multiple-failures.xml | 9 - dbunit/src/test/resources/expected-user.xml | 4 - dbunit/src/test/resources/items.xml | 8 - .../src/test/resources/items_exp_delete.xml | 7 - .../items_exp_delete_no_produced.xml | 7 - .../src/test/resources/items_exp_rename.xml | 8 - .../items_exp_rename_no_produced.xml | 8 - dbunit/src/test/resources/schema.sql | 28 --- dbunit/src/test/resources/users.xml | 6 - .../src/test/resources/users_exp_delete.xml | 5 - .../src/test/resources/users_exp_rename.xml | 6 - 22 files changed, 682 deletions(-) delete mode 100644 dbunit/README.md delete mode 100644 dbunit/pom.xml delete mode 100644 dbunit/src/main/java/com/baeldung/dbunit/.gitkeep delete mode 100644 dbunit/src/main/resources/logback.xml delete mode 100644 dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java delete mode 100644 dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java delete mode 100644 dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java delete mode 100644 dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java delete mode 100644 dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java delete mode 100644 dbunit/src/test/resources/data.xml delete mode 100644 dbunit/src/test/resources/expected-ignoring-registered_at.xml delete mode 100644 dbunit/src/test/resources/expected-multiple-failures.xml delete mode 100644 dbunit/src/test/resources/expected-user.xml delete mode 100644 dbunit/src/test/resources/items.xml delete mode 100644 dbunit/src/test/resources/items_exp_delete.xml delete mode 100644 dbunit/src/test/resources/items_exp_delete_no_produced.xml delete mode 100644 dbunit/src/test/resources/items_exp_rename.xml delete mode 100644 dbunit/src/test/resources/items_exp_rename_no_produced.xml delete mode 100644 dbunit/src/test/resources/schema.sql delete mode 100644 dbunit/src/test/resources/users.xml delete mode 100644 dbunit/src/test/resources/users_exp_delete.xml delete mode 100644 dbunit/src/test/resources/users_exp_rename.xml diff --git a/dbunit/README.md b/dbunit/README.md deleted file mode 100644 index 333cac9439..0000000000 --- a/dbunit/README.md +++ /dev/null @@ -1,4 +0,0 @@ -### Database schema - -### Relevant Articles: -- [Introduction To DBUnit](https://www.baeldung.com/dbunit) diff --git a/dbunit/pom.xml b/dbunit/pom.xml deleted file mode 100644 index 7ca53cd3be..0000000000 --- a/dbunit/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - 4.0.0 - dbunit - 1.0 - - 1.4.200 - - 1.8 - 1.8 - 3.8.1 - - 3.14.0 - 2.6.0 - - - dbunit - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.dbunit - dbunit - ${dbunit.version} - test - - - - com.h2database - h2 - ${h2.version} - test - - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven-compiler-plugin.source} - ${maven-compiler-plugin.target} - - - - - - diff --git a/dbunit/src/main/java/com/baeldung/dbunit/.gitkeep b/dbunit/src/main/java/com/baeldung/dbunit/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbunit/src/main/resources/logback.xml b/dbunit/src/main/resources/logback.xml deleted file mode 100644 index 26beb6d5b4..0000000000 --- a/dbunit/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java b/dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java deleted file mode 100644 index e842022292..0000000000 --- a/dbunit/src/test/java/com/baeldung/dbunit/ConnectionSettings.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.dbunit; - -public class ConnectionSettings { - public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); - public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'"; - public static final String USER = "sa"; - public static final String PASSWORD = ""; -} diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java deleted file mode 100644 index 606f1a90a3..0000000000 --- a/dbunit/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.baeldung.dbunit; - -import org.dbunit.Assertion; -import org.dbunit.DataSourceBasedDBTestCase; -import org.dbunit.assertion.DiffCollectingFailureHandler; -import org.dbunit.assertion.Difference; -import org.dbunit.dataset.IDataSet; -import org.dbunit.dataset.ITable; -import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; -import org.dbunit.operation.DatabaseOperation; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.platform.commons.logging.Logger; -import org.junit.platform.commons.logging.LoggerFactory; - -import javax.sql.DataSource; -import java.io.InputStream; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; - -import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; -import static java.util.stream.Collectors.joining; -import static org.assertj.core.api.Assertions.assertThat; - -public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { - - private static Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); - - @Override - protected DataSource getDataSource() { - JdbcDataSource dataSource = new JdbcDataSource(); - dataSource.setURL(JDBC_URL); - dataSource.setUser("sa"); - dataSource.setPassword(""); - return dataSource; - } - - @Override - protected IDataSet getDataSet() throws Exception { - try (InputStream resourceAsStream = getClass() - .getClassLoader() - .getResourceAsStream("data.xml")) { - return new FlatXmlDataSetBuilder().build(resourceAsStream); - } - } - - @Override - protected DatabaseOperation getSetUpOperation() { - return DatabaseOperation.REFRESH; - } - - @Override - protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.DELETE_ALL; - } - - @Before - public void setUp() throws Exception { - super.setUp(); - } - - @After - public void tearDown() throws Exception { - super.tearDown(); - } - - - @Test - public void testSimpleDataSet() throws SQLException { - final Connection connection = getDataSource() - .getConnection(); - - final ResultSet rs = connection - .createStatement() - .executeQuery("select * from iTEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test - public void testEmptySchema() throws Exception { - final IDataSet expectedDataSet = getDataSet(); - final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); - final IDataSet databaseDataSet = getConnection().createDataSet(); - final ITable actualTable = databaseDataSet.getTable("CLIENTS"); - Assertion.assertEquals(expectedTable, actualTable); - } - - @Test - public void testAssertByQuery() throws Exception { - try (final InputStream is = getClass() - .getClassLoader() - .getResourceAsStream("expected-user.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); - final Connection conn = getDataSource().getConnection(); - - conn.createStatement() - .executeUpdate( - "INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); - final ITable actualData = getConnection() - .createQueryTable( - "result_name", - "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); - - Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[]{"id"}); - } - } - - @Test - public void testMultipleFailures() throws Exception { - try (final InputStream is = getClass() - .getClassLoader() - .getResourceAsStream("expected-multiple-failures.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = expectedDataSet.getTable("ITEMS"); - final Connection conn = getDataSource().getConnection(); - final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); - - conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); - final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); - - Assertion.assertEquals(expectedTable, actualData, collectingHandler); - if (!collectingHandler.getDiffList().isEmpty()) { - String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); - logger.error(() -> message); - } - } - } - - private static String formatDifference(Difference diff) { - return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue(); - } -} diff --git a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java deleted file mode 100644 index d24410bedf..0000000000 --- a/dbunit/src/test/java/com/baeldung/dbunit/DbUnitTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.baeldung.dbunit; - -import org.dbunit.Assertion; -import org.dbunit.DBTestCase; -import org.dbunit.PropertiesBasedJdbcDatabaseTester; -import org.dbunit.dataset.IDataSet; -import org.dbunit.dataset.ITable; -import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; -import org.dbunit.operation.DatabaseOperation; -import org.junit.Test; - -import java.io.InputStream; -import java.sql.Connection; -import java.sql.ResultSet; - -import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; -import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; -import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; -import static com.baeldung.dbunit.ConnectionSettings.USER; -import static org.assertj.core.api.Assertions.assertThat; - -public class DbUnitTest extends DBTestCase { - - public DbUnitTest(String name) { - super(name); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); - } - - @Override - protected IDataSet getDataSet() throws Exception { - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } - } - - @Override - protected DatabaseOperation getSetUpOperation() { - return DatabaseOperation.REFRESH; - } - - @Override - protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.DELETE_ALL; - } - - @Test - public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - - final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test - public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_delete.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - Assertion.assertEquals(expectedTable, actualTable); - } - } - - @Test - public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("items_exp_rename.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - Assertion.assertEquals(expectedTable, actualTable); - } - } - -} diff --git a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java deleted file mode 100644 index 41d7ffd8d4..0000000000 --- a/dbunit/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.baeldung.dbunit; - -import org.dbunit.Assertion; -import org.dbunit.IDatabaseTester; -import org.dbunit.JdbcDatabaseTester; -import org.dbunit.dataset.IDataSet; -import org.dbunit.dataset.ITable; -import org.dbunit.dataset.filter.DefaultColumnFilter; -import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; -import org.dbunit.operation.DatabaseOperation; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.InputStream; -import java.sql.Connection; -import java.sql.ResultSet; - -import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; -import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; -import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; -import static com.baeldung.dbunit.ConnectionSettings.USER; -import static org.assertj.core.api.Assertions.assertThat; -import static org.dbunit.Assertion.assertEquals; - -public class OldSchoolDbUnitTest { - - private static IDatabaseTester tester = null; - - @BeforeClass - public static void setUp() throws Exception { - tester = initDatabaseTester(); - } - - private static IDatabaseTester initDatabaseTester() throws Exception { - final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); - tester.setDataSet(initDataSet()); - tester.setSetUpOperation(DatabaseOperation.REFRESH); - tester.setTearDownOperation(DatabaseOperation.DELETE_ALL); - return tester; - } - - private static IDataSet initDataSet() throws Exception { - try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } - } - - @Before - public void setup() throws Exception { - tester.onSetup(); - } - - @After - public void tearDown() throws Exception { - tester.onTearDown(); - } - - @Test - public void testSelect() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test - public void testIgnoringProduced() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - final String[] excludedColumns = {"id", "produced"}; - try (final InputStream is = getClass().getClassLoader() - .getResourceAsStream("expected-ignoring-registered_at.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); - - connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); - - Assertion.assertEquals(expectedTable, actualTable); - } - } - - @Test - public void testDelete() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("items_exp_delete.xml");) { - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - assertEquals(expectedTable, actualTable); - } - } - - @Test - public void testDeleteWithExcludedColumns() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("items_exp_delete_no_produced.xml")) { - final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - - assertEquals(expectedTable, actualTable); - } - } - - @Test - public void testUpdate() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("items_exp_rename.xml")) { - final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - assertEquals(expectedTable, actualTable); - } - } - - @Test - public void testUpdateWithExcludedColumns() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("items_exp_rename_no_produced.xml")) { - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - - assertEquals(expectedTable, actualTable); - } - } - -} diff --git a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java deleted file mode 100644 index b4e23f56ff..0000000000 --- a/dbunit/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.baeldung.dbunit; - -import org.dbunit.DefaultPrepAndExpectedTestCase; -import org.dbunit.IDatabaseTester; -import org.dbunit.JdbcDatabaseTester; -import org.dbunit.PrepAndExpectedTestCaseSteps; -import org.dbunit.VerifyTableDefinition; -import org.dbunit.dataset.IDataSet; -import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; -import org.dbunit.operation.DatabaseOperation; -import org.dbunit.util.fileloader.DataFileLoader; -import org.dbunit.util.fileloader.FlatXmlDataFileLoader; -import org.junit.Test; - -import java.io.InputStream; -import java.sql.Connection; -import java.sql.ResultSet; - -import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; -import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; -import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; -import static com.baeldung.dbunit.ConnectionSettings.USER; -import static org.assertj.core.api.Assertions.assertThat; - -public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { - - @Override - public void setUp() throws Exception { - setDatabaseTester(initDatabaseTester()); - setDataFileLoader(initDataFileLoader()); - super.setUp(); - } - - private IDatabaseTester initDatabaseTester() throws Exception { - final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); - tester.setDataSet(initDataSet()); - tester.setSetUpOperation(DatabaseOperation.REFRESH); - return tester; - } - - private IDataSet initDataSet() throws Exception { - try (final InputStream is = getClass().getClassLoader().getResourceAsStream("data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } - } - - private DataFileLoader initDataFileLoader() { - return new FlatXmlDataFileLoader(); - } - - @Test - public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; - final String[] prepDataFiles = {"/users.xml"}; - final String[] expectedDataFiles = {"/users.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() - .executeQuery("select * from CLIENTS where id = 1"); - - final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("last_name")).isEqualTo("Xavier"); - } - - @Test - public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; // define tables to verify - final String[] prepDataFiles = {"/users.xml"}; - final String[] expectedDataFiles = {"/users_exp_rename.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() - .executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); - - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } - - @Test - public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; - final String[] prepDataFiles = {"/users.xml"}; - final String[] expectedDataFiles = {"/users_exp_delete.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() - .executeUpdate("delete from CLIENTS where id = 2"); - - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } - -} diff --git a/dbunit/src/test/resources/data.xml b/dbunit/src/test/resources/data.xml deleted file mode 100644 index 290cc36890..0000000000 --- a/dbunit/src/test/resources/data.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/dbunit/src/test/resources/expected-ignoring-registered_at.xml b/dbunit/src/test/resources/expected-ignoring-registered_at.xml deleted file mode 100644 index ea57b6a961..0000000000 --- a/dbunit/src/test/resources/expected-ignoring-registered_at.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/dbunit/src/test/resources/expected-multiple-failures.xml b/dbunit/src/test/resources/expected-multiple-failures.xml deleted file mode 100644 index ea57b6a961..0000000000 --- a/dbunit/src/test/resources/expected-multiple-failures.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/dbunit/src/test/resources/expected-user.xml b/dbunit/src/test/resources/expected-user.xml deleted file mode 100644 index 631dd84210..0000000000 --- a/dbunit/src/test/resources/expected-user.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/dbunit/src/test/resources/items.xml b/dbunit/src/test/resources/items.xml deleted file mode 100644 index d13e93bbe0..0000000000 --- a/dbunit/src/test/resources/items.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/dbunit/src/test/resources/items_exp_delete.xml b/dbunit/src/test/resources/items_exp_delete.xml deleted file mode 100644 index a6fa2b33e8..0000000000 --- a/dbunit/src/test/resources/items_exp_delete.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dbunit/src/test/resources/items_exp_delete_no_produced.xml b/dbunit/src/test/resources/items_exp_delete_no_produced.xml deleted file mode 100644 index 3e7f854f5f..0000000000 --- a/dbunit/src/test/resources/items_exp_delete_no_produced.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dbunit/src/test/resources/items_exp_rename.xml b/dbunit/src/test/resources/items_exp_rename.xml deleted file mode 100644 index 32f1d57cf6..0000000000 --- a/dbunit/src/test/resources/items_exp_rename.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/dbunit/src/test/resources/items_exp_rename_no_produced.xml b/dbunit/src/test/resources/items_exp_rename_no_produced.xml deleted file mode 100644 index b42d3804fa..0000000000 --- a/dbunit/src/test/resources/items_exp_rename_no_produced.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/dbunit/src/test/resources/schema.sql b/dbunit/src/test/resources/schema.sql deleted file mode 100644 index c2a8d2d630..0000000000 --- a/dbunit/src/test/resources/schema.sql +++ /dev/null @@ -1,28 +0,0 @@ -CREATE TABLE IF NOT EXISTS CLIENTS -( - `id` int AUTO_INCREMENT NOT NULL, - `first_name` varchar(100) NOT NULL, - `last_name` varchar(100) NOT NULL, - PRIMARY KEY (`id`) -); - -CREATE TABLE IF NOT EXISTS ITEMS -( - `id` int AUTO_INCREMENT NOT NULL, - `title` varchar(100) NOT NULL, - `produced` date, - `price` float, - PRIMARY KEY (`id`) -); - -CREATE TABLE IF NOT EXISTS PURCHASES -( - `id` int NOT NULL AUTO_INCREMENT, - `id_user` int NOT NULL, - `id_item` int NOT NULL, - `total_price` float NOT NULL, - `quantity` int(11) NOT NULL, - PRIMARY KEY (`id`), - FOREIGN KEY (`id_user`) REFERENCES CLIENTS (`id`) ON DELETE CASCADE, - FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE -); diff --git a/dbunit/src/test/resources/users.xml b/dbunit/src/test/resources/users.xml deleted file mode 100644 index 9ac3909bc5..0000000000 --- a/dbunit/src/test/resources/users.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dbunit/src/test/resources/users_exp_delete.xml b/dbunit/src/test/resources/users_exp_delete.xml deleted file mode 100644 index 2fe97ae6f6..0000000000 --- a/dbunit/src/test/resources/users_exp_delete.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/dbunit/src/test/resources/users_exp_rename.xml b/dbunit/src/test/resources/users_exp_rename.xml deleted file mode 100644 index 95682118bb..0000000000 --- a/dbunit/src/test/resources/users_exp_rename.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - From d1b40a0c026a07b5780e85bd8170f3a397967189 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Tue, 31 Mar 2020 22:55:19 +0200 Subject: [PATCH 281/530] JAVA-42: Upgrade spring-security-x509 to Spring Boot 2 --- spring-security-modules/spring-security-x509/pom.xml | 4 ++-- .../src/main/resources/application.properties | 6 +++--- .../src/main/resources/application.properties | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spring-security-modules/spring-security-x509/pom.xml b/spring-security-modules/spring-security-x509/pom.xml index a4ff908eed..d4132f058d 100644 --- a/spring-security-modules/spring-security-x509/pom.xml +++ b/spring-security-modules/spring-security-x509/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties index f293d6712d..53dfe9976a 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties @@ -1,8 +1,8 @@ -server.ssl.key-store=../keystore/keystore.jks +server.ssl.key-store=keystore/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit server.ssl.enabled=true server.port=8443 -security.user.name=Admin -security.user.password=admin \ No newline at end of file +spring.security.user.name=Admin +spring.security.user.password=admin \ No newline at end of file diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties index 174eba9f98..743c9c4582 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties @@ -4,8 +4,8 @@ server.ssl.key-alias=localhost server.ssl.key-password=changeit server.ssl.enabled=true server.port=8443 -security.user.name=Admin -security.user.password=admin +spring.security.user.name=Admin +spring.security.user.password=admin server.ssl.trust-store=../keystore/truststore.jks server.ssl.trust-store-password=changeit server.ssl.client-auth=need \ No newline at end of file From dc75e11440a687431620b26d3ed4f8d812e0a293 Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Wed, 1 Apr 2020 07:44:25 +0200 Subject: [PATCH 282/530] [BAEL-2749] DBUnit documentation --- libraries-testing/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-testing/README.md b/libraries-testing/README.md index 332debfe18..7098c10d28 100644 --- a/libraries-testing/README.md +++ b/libraries-testing/README.md @@ -11,3 +11,4 @@ This module contains articles about test libraries. - [Introduction to Awaitlity](https://www.baeldung.com/awaitlity-testing) - [Introduction to Hoverfly in Java](https://www.baeldung.com/hoverfly) - [Testing with Hamcrest](https://www.baeldung.com/java-junit-hamcrest-guide) +- [Introduction To DBUnit](https://www.baeldung.com/dbunit) From 408d19ffe96953c96a551e143d4f8f412617ae5c Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Wed, 1 Apr 2020 09:35:52 +0200 Subject: [PATCH 283/530] BAEL-3181: Add bytebuddy dependency --- spring-5-mvc/pom.xml | 7 ++++++- spring-5-mvc/src/main/resources/application.properties | 3 --- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index 2f8ef05bff..4b42528d0f 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -42,6 +42,11 @@ org.slf4j jcl-over-slf4j + + net.bytebuddy + byte-buddy + ${byte-buddy.version} + org.jetbrains.kotlin @@ -175,8 +180,8 @@ 2.9.0 2.9.9 1.2.71 - com.baeldung.Spring5Application 4.5.8 + com.baeldung.Spring5Application diff --git a/spring-5-mvc/src/main/resources/application.properties b/spring-5-mvc/src/main/resources/application.properties index 886ea1978b..ccec014c2b 100644 --- a/spring-5-mvc/src/main/resources/application.properties +++ b/spring-5-mvc/src/main/resources/application.properties @@ -1,6 +1,3 @@ server.port=8081 -security.user.name=user -security.user.password=pass - logging.level.root=INFO \ No newline at end of file From 3d6c7359fa3522e9985d2126509238624a667e04 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Wed, 1 Apr 2020 14:35:03 +0200 Subject: [PATCH 284/530] JAVA-995: Upgrade Spring Boot to the latest 2.2.6 version --- 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 6e9e90a6d3..c7bb11b1d5 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -81,7 +81,7 @@ 3.3.0 1.0.22.RELEASE - 2.2.2.RELEASE + 2.2.6.RELEASE From c0abc0ed354f073d0f3958308acb4939f11c49fb Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Wed, 1 Apr 2020 19:44:48 +0200 Subject: [PATCH 285/530] [BAEL-2749] Uses static imports and uses code format --- .../baeldung/dbunit/ConnectionSettings.java | 8 +- .../baeldung/dbunit/DataSourceDBUnitTest.java | 178 ++++++-------- .../java/com/baeldung/dbunit/DbUnitTest.java | 117 +++++----- .../baeldung/dbunit/OldSchoolDbUnitTest.java | 219 ++++++++---------- .../dbunit/PrepAndExpectedDbUnitTest.java | 100 ++++---- pom.xml | 1 - 6 files changed, 285 insertions(+), 338 deletions(-) diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java index cc29d9c58a..b30d636a12 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java @@ -1,8 +1,8 @@ package com.baeldung.dbunit; public class ConnectionSettings { - public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); - public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:dbunit/schema.sql'"; - public static final String USER = "sa"; - public static final String PASSWORD = ""; + public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); + public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:dbunit/schema.sql'"; + public static final String USER = "sa"; + public static final String PASSWORD = ""; } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java index 662ed44fb6..1cb7489688 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -15,6 +15,7 @@ import org.junit.Test; import org.junit.platform.commons.logging.Logger; import org.junit.platform.commons.logging.LoggerFactory; +import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; @@ -25,112 +26,87 @@ import static org.assertj.core.api.Assertions.assertThat; public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { - private static Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); + private static final Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); - @Override - protected javax.sql.DataSource getDataSource() { - JdbcDataSource dataSource = new JdbcDataSource(); - dataSource.setURL(JDBC_URL); - dataSource.setUser("sa"); - dataSource.setPassword(""); - return dataSource; - } - - @Override - protected IDataSet getDataSet() throws Exception { - try (java.io.InputStream resourceAsStream = getClass() - .getClassLoader() - .getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(resourceAsStream); + @Override protected javax.sql.DataSource getDataSource() { + JdbcDataSource dataSource = new JdbcDataSource(); + dataSource.setURL(JDBC_URL); + dataSource.setUser("sa"); + dataSource.setPassword(""); + return dataSource; } - } - @Override - protected DatabaseOperation getSetUpOperation() { - return DatabaseOperation.REFRESH; - } - - @Override - protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.DELETE_ALL; - } - - @Before - public void setUp() throws Exception { - super.setUp(); - } - - @After - public void tearDown() throws Exception { - super.tearDown(); - } - - - @Test - public void testSimpleDataSet() throws SQLException { - final Connection connection = getDataSource() - .getConnection(); - - final ResultSet rs = connection - .createStatement() - .executeQuery("select * from iTEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test - public void testEmptySchema() throws Exception { - final IDataSet expectedDataSet = getDataSet(); - final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); - final IDataSet databaseDataSet = getConnection().createDataSet(); - final ITable actualTable = databaseDataSet.getTable("CLIENTS"); - Assertion.assertEquals(expectedTable, actualTable); - } - - @Test - public void testAssertByQuery() throws Exception { - try (final java.io.InputStream is = getClass() - .getClassLoader() - .getResourceAsStream("dbunit/expected-user.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); - final Connection conn = getDataSource().getConnection(); - - conn.createStatement() - .executeUpdate( - "INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); - final ITable actualData = getConnection() - .createQueryTable( - "result_name", - "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); - - Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[]{"id"}); + @Override protected IDataSet getDataSet() throws Exception { + try (InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(resourceAsStream); + } } - } - @Test - public void testMultipleFailures() throws Exception { - try (final java.io.InputStream is = getClass() - .getClassLoader() - .getResourceAsStream("dbunit/expected-multiple-failures.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = expectedDataSet.getTable("ITEMS"); - final Connection conn = getDataSource().getConnection(); - final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); - - conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); - final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); - - Assertion.assertEquals(expectedTable, actualData, collectingHandler); - if (!collectingHandler.getDiffList().isEmpty()) { - String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); - logger.error(() -> message); - } + @Override protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; } - } - private static String formatDifference(Difference diff) { - return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue(); - } + @Override protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.DELETE_ALL; + } + + @Before public void setUp() throws Exception { + super.setUp(); + } + + @After public void tearDown() throws Exception { + super.tearDown(); + } + + @Test public void testSimpleDataSet() throws SQLException { + final Connection connection = getDataSource().getConnection(); + + final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test public void testEmptySchema() throws Exception { + final IDataSet expectedDataSet = getDataSet(); + final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + final IDataSet databaseDataSet = getConnection().createDataSet(); + final ITable actualTable = databaseDataSet.getTable("CLIENTS"); + Assertion.assertEquals(expectedTable, actualTable); + } + + @Test public void testAssertByQuery() throws Exception { + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-user.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + final Connection conn = getDataSource().getConnection(); + + conn.createStatement().executeUpdate("INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); + final ITable actualData = getConnection().createQueryTable("result_name", "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); + + Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[] { "id" }); + } + } + + @Test public void testMultipleFailures() throws Exception { + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-multiple-failures.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = expectedDataSet.getTable("ITEMS"); + final Connection conn = getDataSource().getConnection(); + final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); + + conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); + final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualData, collectingHandler); + if (!collectingHandler.getDiffList().isEmpty()) { + String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); + logger.error(() -> message); + } + } + } + + private static String formatDifference(Difference diff) { + return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue(); + } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java index 3ed77b2c25..a3a41b9b8d 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java @@ -9,6 +9,7 @@ import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; import org.dbunit.operation.DatabaseOperation; import org.junit.Test; +import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; @@ -20,71 +21,65 @@ import static org.assertj.core.api.Assertions.assertThat; public class DbUnitTest extends DBTestCase { - public DbUnitTest(String name) { - super(name); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); - } - - @Override - protected IDataSet getDataSet() throws Exception { - try (final java.io.InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); + public DbUnitTest(String name) { + super(name); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); } - } - @Override - protected DatabaseOperation getSetUpOperation() { - return DatabaseOperation.REFRESH; - } - - @Override - protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.DELETE_ALL; - } - - @Test - public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - - final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test - public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final java.io.InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - Assertion.assertEquals(expectedTable, actualTable); + @Override protected IDataSet getDataSet() throws Exception { + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } } - } - @Test - public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final java.io.InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("items"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - Assertion.assertEquals(expectedTable, actualTable); + @Override protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; + } + + @Override protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.DELETE_ALL; + } + + @Test public void testSelect() throws Exception { + final Connection connection = getConnection().getConnection(); + + final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test public void testDelete() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualTable); + } + } + + @Test public void testUpdate() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualTable); + } } - } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index aa6d9143bb..be6023d432 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -13,6 +13,7 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; @@ -25,137 +26,119 @@ import static org.dbunit.Assertion.assertEquals; public class OldSchoolDbUnitTest { - private static IDatabaseTester tester = null; + private static IDatabaseTester tester = null; - @BeforeClass - public static void setUp() throws Exception { - tester = initDatabaseTester(); - } - - private static IDatabaseTester initDatabaseTester() throws Exception { - final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); - tester.setDataSet(initDataSet()); - tester.setSetUpOperation(DatabaseOperation.REFRESH); - tester.setTearDownOperation(DatabaseOperation.DELETE_ALL); - return tester; - } - - private static IDataSet initDataSet() throws Exception { - try (final java.io.InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); + @BeforeClass public static void setUp() throws Exception { + tester = initDatabaseTester(); } - } - @Before - public void setup() throws Exception { - tester.onSetup(); - } - - @After - public void tearDown() throws Exception { - tester.onTearDown(); - } - - @Test - public void testSelect() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - final ResultSet rs = connection.createStatement().executeQuery("select * from iTEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test - public void testIgnoringProduced() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - final String[] excludedColumns = {"id", "produced"}; - try (final java.io.InputStream is = getClass().getClassLoader() - .getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); - - connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); - - Assertion.assertEquals(expectedTable, actualTable); + private static IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + tester.setTearDownOperation(DatabaseOperation.DELETE_ALL); + return tester; } - } - @Test - public void testDelete() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final java.io.InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("dbunit/items_exp_delete.xml");) { - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - assertEquals(expectedTable, actualTable); + private static IDataSet initDataSet() throws Exception { + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } } - } - @Test - public void testDeleteWithExcludedColumns() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final java.io.InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) { - final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - - assertEquals(expectedTable, actualTable); + @Before public void setup() throws Exception { + tester.onSetup(); } - } - @Test - public void testUpdate() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final java.io.InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("dbunit/items_exp_rename.xml")) { - final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - - assertEquals(expectedTable, actualTable); + @After public void tearDown() throws Exception { + tester.onTearDown(); } - } - @Test - public void testUpdateWithExcludedColumns() throws Exception { - final Connection connection = tester.getConnection().getConnection(); + @Test public void testSelect() throws Exception { + final Connection connection = tester.getConnection().getConnection(); - try (final java.io.InputStream is = - OldSchoolDbUnitTest.class.getClassLoader() - .getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) { - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("items"); + final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("items"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[]{"produced"}); - - assertEquals(expectedTable, actualTable); + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test public void testIgnoringProduced() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + final String[] excludedColumns = { "id", "produced" }; + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); + + connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); + + Assertion.assertEquals(expectedTable, actualTable); + } + } + + @Test public void testDelete() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + assertEquals(expectedTable, actualTable); + } + } + + @Test public void testDeleteWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" }); + + assertEquals(expectedTable, actualTable); + } + } + + @Test public void testUpdate() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + assertEquals(expectedTable, actualTable); + } + } + + @Test public void testUpdateWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" }); + + assertEquals(expectedTable, actualTable); + } } - } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java index 7e77cd8fc3..f797f153a0 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -12,6 +12,7 @@ import org.dbunit.util.fileloader.DataFileLoader; import org.dbunit.util.fileloader.FlatXmlDataFileLoader; import org.junit.Test; +import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; @@ -23,67 +24,60 @@ import static org.assertj.core.api.Assertions.assertThat; public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { - @Override - public void setUp() throws Exception { - setDatabaseTester(initDatabaseTester()); - setDataFileLoader(initDataFileLoader()); - super.setUp(); - } - - private IDatabaseTester initDatabaseTester() throws Exception { - final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); - tester.setDataSet(initDataSet()); - tester.setSetUpOperation(DatabaseOperation.REFRESH); - return tester; - } - - private IDataSet initDataSet() throws Exception { - try (final java.io.InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); + @Override public void setUp() throws Exception { + setDatabaseTester(initDatabaseTester()); + setDataFileLoader(initDataFileLoader()); + super.setUp(); } - } - private DataFileLoader initDataFileLoader() { - return new FlatXmlDataFileLoader(); - } + private IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + return tester; + } - @Test - public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; - final String[] prepDataFiles = {"/dbunit/users.xml"}; - final String[] expectedDataFiles = {"/dbunit/users.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() - .executeQuery("select * from CLIENTS where id = 1"); + private IDataSet initDataSet() throws Exception { + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); + } + } - final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + private DataFileLoader initDataFileLoader() { + return new FlatXmlDataFileLoader(); + } - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("last_name")).isEqualTo("Xavier"); - } + @Test public void testSelect() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; + final String[] prepDataFiles = { "/dbunit/users.xml" }; + final String[] expectedDataFiles = { "/dbunit/users.xml" }; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeQuery("select * from CLIENTS where id = 1"); - @Test - public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; // define tables to verify - final String[] prepDataFiles = {"/dbunit/users.xml"}; - final String[] expectedDataFiles = {"/dbunit/users_exp_rename.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() - .executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); + final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("last_name")).isEqualTo("Xavier"); + } - @Test - public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = {new VerifyTableDefinition("CLIENTS", new String[]{})}; - final String[] prepDataFiles = {"/dbunit/users.xml"}; - final String[] expectedDataFiles = {"/dbunit/users_exp_delete.xml"}; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement() - .executeUpdate("delete from CLIENTS where id = 2"); + @Test public void testUpdate() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; // define tables to verify + final String[] prepDataFiles = { "/dbunit/users.xml" }; + final String[] expectedDataFiles = { "/dbunit/users_exp_rename.xml" }; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } + + @Test public void testDelete() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; + final String[] prepDataFiles = { "/dbunit/users.xml" }; + final String[] expectedDataFiles = { "/dbunit/users_exp_delete.xml" }; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("delete from CLIENTS where id = 2"); + + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } } diff --git a/pom.xml b/pom.xml index 734e2c8ab9..8b09f69252 100644 --- a/pom.xml +++ b/pom.xml @@ -601,7 +601,6 @@ - dbunit parent-boot-1 parent-boot-2 From 064e16251be28928331af940acf6b39fe9258dda Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Wed, 1 Apr 2020 20:02:46 +0200 Subject: [PATCH 286/530] [BAEL-2749] Formats pom --- pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pom.xml b/pom.xml index 8b09f69252..04a2ce054c 100644 --- a/pom.xml +++ b/pom.xml @@ -601,7 +601,6 @@ - parent-boot-1 parent-boot-2 parent-spring-4 @@ -1289,8 +1288,6 @@ - dbunit - parent-boot-1 parent-boot-2 parent-spring-4 From 37ed8f63271c225427a172d8b95224f5be09f626 Mon Sep 17 00:00:00 2001 From: Waldemar Date: Wed, 1 Apr 2020 20:29:34 +0200 Subject: [PATCH 287/530] BAEL-2398 rename package --- coroutines-java/pom.xml | 4 ++-- .../main/java/com/baeldung/{introduction => quasar}/App.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename coroutines-java/src/main/java/com/baeldung/{introduction => quasar}/App.java (86%) diff --git a/coroutines-java/pom.xml b/coroutines-java/pom.xml index 3546aa5673..caee769a78 100644 --- a/coroutines-java/pom.xml +++ b/coroutines-java/pom.xml @@ -53,7 +53,7 @@ exec-maven-plugin 1.6.0 - com.baeldung.introduction.App + com.baeldung.quasar.App target/classes java @@ -68,7 +68,7 @@ - com.baeldung.introduction.App + com.baeldung.quasar.App diff --git a/coroutines-java/src/main/java/com/baeldung/introduction/App.java b/coroutines-java/src/main/java/com/baeldung/quasar/App.java similarity index 86% rename from coroutines-java/src/main/java/com/baeldung/introduction/App.java rename to coroutines-java/src/main/java/com/baeldung/quasar/App.java index f915464973..510877d1be 100644 --- a/coroutines-java/src/main/java/com/baeldung/introduction/App.java +++ b/coroutines-java/src/main/java/com/baeldung/quasar/App.java @@ -1,4 +1,4 @@ -package com.baeldung.introduction; +package com.baeldung.quasar; import co.paralleluniverse.fibers.Fiber; From b56b71cf5f223ec31965844d5601ab319aa3ba2b Mon Sep 17 00:00:00 2001 From: kwoyke Date: Wed, 1 Apr 2020 20:42:54 +0200 Subject: [PATCH 288/530] BAEL-2682: Move java-immutable-set article to core-java-collections-set module (#9001) --- core-java-modules/core-java-9/README.md | 1 - core-java-modules/core-java-collections-set/README.md | 1 + .../src/main/java/com/baeldung}/set/UnmodifiableSet.java | 2 +- .../src/test/java/com/baeldung/set}/SetExamplesUnitTest.java | 5 +++-- 4 files changed, 5 insertions(+), 4 deletions(-) rename core-java-modules/{core-java-9/src/main/java/com/baeldung/java9 => core-java-collections-set/src/main/java/com/baeldung}/set/UnmodifiableSet.java (97%) rename core-java-modules/{core-java-9/src/test/java/com/baeldung/java9 => core-java-collections-set/src/test/java/com/baeldung/set}/SetExamplesUnitTest.java (97%) diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md index 2dbf159750..0a9bf76ac4 100644 --- a/core-java-modules/core-java-9/README.md +++ b/core-java-modules/core-java-9/README.md @@ -8,5 +8,4 @@ This module contains articles about Java 9 core features - [Introduction to Chronicle Queue](https://www.baeldung.com/java-chronicle-queue) - [Iterate Through a Range of Dates in Java](https://www.baeldung.com/java-iterate-date-range) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) -- [Immutable Set in Java](https://www.baeldung.com/java-immutable-set) - [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list) diff --git a/core-java-modules/core-java-collections-set/README.md b/core-java-modules/core-java-collections-set/README.md index 2b34ef3449..b97cd3216f 100644 --- a/core-java-modules/core-java-collections-set/README.md +++ b/core-java-modules/core-java-collections-set/README.md @@ -11,3 +11,4 @@ This module contains articles about the Java Set collection - [Guide to EnumSet](https://www.baeldung.com/java-enumset) - [Set Operations in Java](https://www.baeldung.com/java-set-operations) - [Copying Sets in Java](https://www.baeldung.com/java-copy-sets) +- [Immutable Set in Java](https://www.baeldung.com/java-immutable-set) diff --git a/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java b/core-java-modules/core-java-collections-set/src/main/java/com/baeldung/set/UnmodifiableSet.java similarity index 97% rename from core-java-modules/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java rename to core-java-modules/core-java-collections-set/src/main/java/com/baeldung/set/UnmodifiableSet.java index 7dbcd2a3a3..2af040b13e 100644 --- a/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java +++ b/core-java-modules/core-java-collections-set/src/main/java/com/baeldung/set/UnmodifiableSet.java @@ -1,4 +1,4 @@ -package com.baeldung.java9.set; +package com.baeldung.set; import com.google.common.collect.ImmutableSet; diff --git a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java b/core-java-modules/core-java-collections-set/src/test/java/com/baeldung/set/SetExamplesUnitTest.java similarity index 97% rename from core-java-modules/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java rename to core-java-modules/core-java-collections-set/src/test/java/com/baeldung/set/SetExamplesUnitTest.java index 28e71affcc..d89927dfd6 100644 --- a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java +++ b/core-java-modules/core-java-collections-set/src/test/java/com/baeldung/set/SetExamplesUnitTest.java @@ -1,9 +1,10 @@ -package com.baeldung.java9; +package com.baeldung.set; + +import org.junit.Test; import java.util.Collections; import java.util.HashSet; import java.util.Set; -import org.junit.Test; import static org.junit.Assert.assertEquals; From b4610e110f34e6a394640928fa52da8efdd22827 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Thu, 2 Apr 2020 00:23:38 +0530 Subject: [PATCH 289/530] Adding code for article tracked under BAEL-3573. (#8999) Co-authored-by: CHANDRAKANT Kumar --- .../core-java-concurrency-testing/.gitignore | 26 ++++++ .../core-java-concurrency-testing/README.md | 7 ++ .../core-java-concurrency-testing/pom.xml | 93 +++++++++++++++++++ .../com/baeldung/concurrent/MyCounter.java | 22 +++++ .../src/main/resources/logback.xml | 19 ++++ .../concurrent/MyCounterJCStressUnitTest.java | 36 +++++++ .../MyCounterMultithreadedTCUnitTest.java | 35 +++++++ .../concurrent/MyCounterSimpleUnitTest.java | 57 ++++++++++++ .../MyCounterTempusFugitUnitTest.java | 35 +++++++ .../MyCounterThreadWeaverUnitTest.java | 42 +++++++++ .../src/test/resources/.gitignore | 13 +++ 11 files changed, 385 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-testing/.gitignore create mode 100644 core-java-modules/core-java-concurrency-testing/README.md create mode 100644 core-java-modules/core-java-concurrency-testing/pom.xml create mode 100644 core-java-modules/core-java-concurrency-testing/src/main/java/com/baeldung/concurrent/MyCounter.java create mode 100644 core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml create mode 100644 core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore diff --git a/core-java-modules/core-java-concurrency-testing/.gitignore b/core-java-modules/core-java-concurrency-testing/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-testing/README.md b/core-java-modules/core-java-concurrency-testing/README.md new file mode 100644 index 0000000000..fef74a6750 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java Concurrency Testing Examples + +### Relevant Articles: +- [Testing Multi-Threaded Code in Java](https://www.baeldung.com/java-testing-multithreaded) + diff --git a/core-java-modules/core-java-concurrency-testing/pom.xml b/core-java-modules/core-java-concurrency-testing/pom.xml new file mode 100644 index 0000000000..bb3e6f5152 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + core-java-concurrency-testing + 0.1.0-SNAPSHOT + core-java-concurrency-testing + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + junit + junit + 4.13 + test + + + com.googlecode.thread-weaver + threadweaver + 0.2 + test + + + com.google.code.tempus-fugit + tempus-fugit + 1.1 + test + + + com.googlecode.multithreadedtc + multithreadedtc + 1.01 + test + + + org.openjdk.jcstress + jcstress-core + 0.5 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${javac.target} + ${javac.target} + ${javac.target} + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + main + package + + shade + + + jcstress + + + org.openjdk.jcstress.Main + + + META-INF/TestList + + + + + + + + + + diff --git a/core-java-modules/core-java-concurrency-testing/src/main/java/com/baeldung/concurrent/MyCounter.java b/core-java-modules/core-java-concurrency-testing/src/main/java/com/baeldung/concurrent/MyCounter.java new file mode 100644 index 0000000000..a678b047a8 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/main/java/com/baeldung/concurrent/MyCounter.java @@ -0,0 +1,22 @@ +package com.baeldung.concurrent; + +public class MyCounter { + + private int count; + + public void increment() { + int temp = count; + count = temp + 1; + } + + public synchronized void incrementWithWait() throws InterruptedException { + int temp = count; + wait(100); + count = temp + 1; + } + + public int getCount() { + return count; + } + +} diff --git a/core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java new file mode 100644 index 0000000000..6c76505347 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterJCStressUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.concurrent; + +import static org.openjdk.jcstress.annotations.Expect.ACCEPTABLE; +import static org.openjdk.jcstress.annotations.Expect.ACCEPTABLE_INTERESTING; + +import org.openjdk.jcstress.annotations.Actor; +import org.openjdk.jcstress.annotations.Arbiter; +import org.openjdk.jcstress.annotations.JCStressTest; +import org.openjdk.jcstress.annotations.Outcome; +import org.openjdk.jcstress.annotations.State; +import org.openjdk.jcstress.infra.results.I_Result; + +@JCStressTest +@Outcome(id = "1", expect = ACCEPTABLE_INTERESTING, desc = "One update lost.") +@Outcome(id = "2", expect = ACCEPTABLE, desc = "Both updates.") +@State +public class MyCounterJCStressUnitTest { + + private MyCounter counter; + + @Actor + public void actor1() { + counter.increment(); + } + + @Actor + public void actor2() { + counter.increment(); + } + + @Arbiter + public void arbiter(I_Result r) { + r.r1 = counter.getCount(); + } + +} diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java new file mode 100644 index 0000000000..eb4e77cae9 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterMultithreadedTCUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.concurrent; + +import org.junit.Test; + +import edu.umd.cs.mtc.MultithreadedTestCase; +import edu.umd.cs.mtc.TestFramework; + +public class MyCounterMultithreadedTCUnitTest extends MultithreadedTestCase { + + private MyCounter counter; + + @Override + public void initialize() { + counter = new MyCounter(); + } + + public void thread1() throws InterruptedException { + counter.increment(); + } + + public void thread2() throws InterruptedException { + counter.increment(); + } + + @SuppressWarnings("deprecation") + @Override + public void finish() { + assertEquals(2, counter.getCount()); + } + + @Test + public void testCounter() throws Throwable { + TestFramework.runManyTimes(new MyCounterMultithreadedTCUnitTest(), 1000); + } +} diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java new file mode 100644 index 0000000000..4f3409b923 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterSimpleUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.concurrent; + +import static org.junit.Assert.assertEquals; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.junit.Test; + +public class MyCounterSimpleUnitTest { + + @Test + public void testCounter() { + MyCounter counter = new MyCounter(); + for (int i = 0; i < 500; i++) + counter.increment(); + assertEquals(500, counter.getCount()); + } + + // @Test + public void testCounterWithConcurrency() throws InterruptedException { + int numberOfThreads = 100; + ExecutorService service = Executors.newFixedThreadPool(10); + CountDownLatch latch = new CountDownLatch(numberOfThreads); + MyCounter counter = new MyCounter(); + for (int i = 0; i < numberOfThreads; i++) { + service.execute(() -> { + counter.increment(); + latch.countDown(); + }); + } + latch.await(); + assertEquals(numberOfThreads, counter.getCount()); + } + + // @Test + public void testSummationWithConcurrencyAndWait() throws InterruptedException { + int numberOfThreads = 2; + ExecutorService service = Executors.newFixedThreadPool(10); + CountDownLatch latch = new CountDownLatch(numberOfThreads); + MyCounter counter = new MyCounter(); + for (int i = 0; i < numberOfThreads; i++) { + service.submit(() -> { + try { + counter.incrementWithWait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + latch.countDown(); + }); + } + latch.await(); + assertEquals(numberOfThreads, counter.getCount()); + } + +} diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java new file mode 100644 index 0000000000..360c61b4f4 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterTempusFugitUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.concurrent; + +import static org.junit.Assert.assertEquals; + +import org.junit.AfterClass; +import org.junit.Rule; +import org.junit.Test; + +import com.google.code.tempusfugit.concurrency.ConcurrentRule; +import com.google.code.tempusfugit.concurrency.RepeatingRule; +import com.google.code.tempusfugit.concurrency.annotations.Concurrent; +import com.google.code.tempusfugit.concurrency.annotations.Repeating; + +public class MyCounterTempusFugitUnitTest { + + @Rule + public ConcurrentRule concurrently = new ConcurrentRule(); + @Rule + public RepeatingRule rule = new RepeatingRule(); + + private static MyCounter counter = new MyCounter(); + + @Test + @Concurrent(count = 2) + @Repeating(repetition = 10) + public void runsMultipleTimes() { + counter.increment(); + } + + @AfterClass + public static void annotatedTestRunsMultipleTimes() throws InterruptedException { + assertEquals(counter.getCount(), 20); + } + +} diff --git a/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java new file mode 100644 index 0000000000..29b08996cd --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/test/java/com/baeldung/concurrent/MyCounterThreadWeaverUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.concurrent; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.google.testing.threadtester.AnnotatedTestRunner; +import com.google.testing.threadtester.ThreadedAfter; +import com.google.testing.threadtester.ThreadedBefore; +import com.google.testing.threadtester.ThreadedMain; +import com.google.testing.threadtester.ThreadedSecondary; + +public class MyCounterThreadWeaverUnitTest { + + private MyCounter counter; + + @ThreadedBefore + public void before() { + counter = new MyCounter(); + } + + @ThreadedMain + public void mainThread() { + counter.increment(); + } + + @ThreadedSecondary + public void secondThread() { + counter.increment(); + } + + @ThreadedAfter + public void after() { + assertEquals(2, counter.getCount()); + } + + @Test + public void testCounter() { + new AnnotatedTestRunner().runTests(this.getClass(), MyCounter.class); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore b/core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-concurrency-testing/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file From 7187cb0dfbd3487877248742309519bed0f55d49 Mon Sep 17 00:00:00 2001 From: ramkumarvenkat Date: Thu, 2 Apr 2020 07:13:19 +0530 Subject: [PATCH 290/530] Change package name --- .../java/com/baeldung/guava/{entity => mapmaker}/Profile.java | 2 +- .../java/com/baeldung/guava/{entity => mapmaker}/Session.java | 2 +- .../java/com/baeldung/guava/{entity => mapmaker}/User.java | 2 +- .../com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java | 3 --- 4 files changed, 3 insertions(+), 6 deletions(-) rename guava-collections-map/src/main/java/com/baeldung/guava/{entity => mapmaker}/Profile.java (88%) rename guava-collections-map/src/main/java/com/baeldung/guava/{entity => mapmaker}/Session.java (81%) rename guava-collections-map/src/main/java/com/baeldung/guava/{entity => mapmaker}/User.java (88%) diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/entity/Profile.java b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Profile.java similarity index 88% rename from guava-collections-map/src/main/java/com/baeldung/guava/entity/Profile.java rename to guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Profile.java index 17a6502f39..165c5a9f8f 100644 --- a/guava-collections-map/src/main/java/com/baeldung/guava/entity/Profile.java +++ b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Profile.java @@ -1,4 +1,4 @@ -package com.baeldung.guava.entity; +package com.baeldung.guava.mapmaker; public class Profile { private long id; diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/entity/Session.java b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Session.java similarity index 81% rename from guava-collections-map/src/main/java/com/baeldung/guava/entity/Session.java rename to guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Session.java index b834c23df1..a614f431f8 100644 --- a/guava-collections-map/src/main/java/com/baeldung/guava/entity/Session.java +++ b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/Session.java @@ -1,4 +1,4 @@ -package com.baeldung.guava.entity; +package com.baeldung.guava.mapmaker; public class Session { private long id; diff --git a/guava-collections-map/src/main/java/com/baeldung/guava/entity/User.java b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/User.java similarity index 88% rename from guava-collections-map/src/main/java/com/baeldung/guava/entity/User.java rename to guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/User.java index 613045ec23..a7f0435049 100644 --- a/guava-collections-map/src/main/java/com/baeldung/guava/entity/User.java +++ b/guava-collections-map/src/main/java/com/baeldung/guava/mapmaker/User.java @@ -1,4 +1,4 @@ -package com.baeldung.guava.entity; +package com.baeldung.guava.mapmaker; public class User { private long id; diff --git a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java index e2bc1349c6..754e3ac099 100644 --- a/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/mapmaker/GuavaMapMakerUnitTest.java @@ -1,8 +1,5 @@ package com.baeldung.guava.mapmaker; -import com.baeldung.guava.entity.Profile; -import com.baeldung.guava.entity.Session; -import com.baeldung.guava.entity.User; import com.google.common.collect.MapMaker; import org.junit.Assert; import org.junit.Test; From f06af6499859b3dcd45d14d2060631a4fd1f0241 Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Thu, 2 Apr 2020 11:20:34 +0200 Subject: [PATCH 291/530] [BAEL-2749] Indentation and annotations format --- .../baeldung/dbunit/ConnectionSettings.java | 8 +- .../baeldung/dbunit/DataSourceDBUnitTest.java | 162 +++++++------- .../java/com/baeldung/dbunit/DbUnitTest.java | 116 +++++----- .../baeldung/dbunit/OldSchoolDbUnitTest.java | 209 +++++++++--------- .../dbunit/PrepAndExpectedDbUnitTest.java | 96 ++++---- 5 files changed, 310 insertions(+), 281 deletions(-) diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java index b30d636a12..cc29d9c58a 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java @@ -1,8 +1,8 @@ package com.baeldung.dbunit; public class ConnectionSettings { - public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); - public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:dbunit/schema.sql'"; - public static final String USER = "sa"; - public static final String PASSWORD = ""; + public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); + public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:dbunit/schema.sql'"; + public static final String USER = "sa"; + public static final String PASSWORD = ""; } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java index 1cb7489688..93503277b4 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -26,87 +26,97 @@ import static org.assertj.core.api.Assertions.assertThat; public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { - private static final Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); + private static final Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); - @Override protected javax.sql.DataSource getDataSource() { - JdbcDataSource dataSource = new JdbcDataSource(); - dataSource.setURL(JDBC_URL); - dataSource.setUser("sa"); - dataSource.setPassword(""); - return dataSource; + @Override + protected javax.sql.DataSource getDataSource() { + JdbcDataSource dataSource = new JdbcDataSource(); + dataSource.setURL(JDBC_URL); + dataSource.setUser("sa"); + dataSource.setPassword(""); + return dataSource; + } + + @Override + protected IDataSet getDataSet() throws Exception { + try (InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(resourceAsStream); } + } - @Override protected IDataSet getDataSet() throws Exception { - try (InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(resourceAsStream); - } + @Override + protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; + } + + @Override + protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.DELETE_ALL; + } + + @Before + public void setUp() throws Exception { + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + } + + @Test + public void testSimpleDataSet() throws SQLException { + final Connection connection = getDataSource().getConnection(); + + final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test + public void testEmptySchema() throws Exception { + final IDataSet expectedDataSet = getDataSet(); + final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + final IDataSet databaseDataSet = getConnection().createDataSet(); + final ITable actualTable = databaseDataSet.getTable("CLIENTS"); + Assertion.assertEquals(expectedTable, actualTable); + } + + @Test + public void testAssertByQuery() throws Exception { + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-user.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); + final Connection conn = getDataSource().getConnection(); + + conn.createStatement().executeUpdate("INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); + final ITable actualData = getConnection().createQueryTable("result_name", "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); + + Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[] { "id" }); } + } - @Override protected DatabaseOperation getSetUpOperation() { - return DatabaseOperation.REFRESH; + @Test + public void testMultipleFailures() throws Exception { + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-multiple-failures.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = expectedDataSet.getTable("ITEMS"); + final Connection conn = getDataSource().getConnection(); + final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); + + conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); + final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualData, collectingHandler); + if (!collectingHandler.getDiffList().isEmpty()) { + String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); + logger.error(() -> message); + } } + } - @Override protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.DELETE_ALL; - } - - @Before public void setUp() throws Exception { - super.setUp(); - } - - @After public void tearDown() throws Exception { - super.tearDown(); - } - - @Test public void testSimpleDataSet() throws SQLException { - final Connection connection = getDataSource().getConnection(); - - final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test public void testEmptySchema() throws Exception { - final IDataSet expectedDataSet = getDataSet(); - final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); - final IDataSet databaseDataSet = getConnection().createDataSet(); - final ITable actualTable = databaseDataSet.getTable("CLIENTS"); - Assertion.assertEquals(expectedTable, actualTable); - } - - @Test public void testAssertByQuery() throws Exception { - try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-user.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); - final Connection conn = getDataSource().getConnection(); - - conn.createStatement().executeUpdate("INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); - final ITable actualData = getConnection().createQueryTable("result_name", "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); - - Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[] { "id" }); - } - } - - @Test public void testMultipleFailures() throws Exception { - try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-multiple-failures.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = expectedDataSet.getTable("ITEMS"); - final Connection conn = getDataSource().getConnection(); - final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); - - conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); - final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); - - Assertion.assertEquals(expectedTable, actualData, collectingHandler); - if (!collectingHandler.getDiffList().isEmpty()) { - String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); - logger.error(() -> message); - } - } - } - - private static String formatDifference(Difference diff) { - return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue(); - } + private static String formatDifference(Difference diff) { + return "expected value in " + diff.getExpectedTable().getTableMetaData().getTableName() + "." + diff.getColumnName() + " row " + diff.getRowIndex() + ":" + diff.getExpectedValue() + ", but was: " + diff.getActualValue(); + } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java index a3a41b9b8d..da4ac54f12 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java @@ -21,65 +21,71 @@ import static org.assertj.core.api.Assertions.assertThat; public class DbUnitTest extends DBTestCase { - public DbUnitTest(String name) { - super(name); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); + public DbUnitTest(String name) { + super(name); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); + System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); + } + + @Override + protected IDataSet getDataSet() throws Exception { + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); } + } - @Override protected IDataSet getDataSet() throws Exception { - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } + @Override + protected DatabaseOperation getSetUpOperation() { + return DatabaseOperation.REFRESH; + } + + @Override + protected DatabaseOperation getTearDownOperation() { + return DatabaseOperation.DELETE_ALL; + } + + @Test + public void testSelect() throws Exception { + final Connection connection = getConnection().getConnection(); + + final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test + public void testDelete() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualTable); } + } - @Override protected DatabaseOperation getSetUpOperation() { - return DatabaseOperation.REFRESH; - } - - @Override protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.DELETE_ALL; - } - - @Test public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - - final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - - Assertion.assertEquals(expectedTable, actualTable); - } - } - - @Test public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - - Assertion.assertEquals(expectedTable, actualTable); - } + @Test + public void testUpdate() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualTable); } + } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index be6023d432..a7821102dc 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -26,119 +26,128 @@ import static org.dbunit.Assertion.assertEquals; public class OldSchoolDbUnitTest { - private static IDatabaseTester tester = null; + private static IDatabaseTester tester = null; - @BeforeClass public static void setUp() throws Exception { - tester = initDatabaseTester(); + @BeforeClass + public static void setUp() throws Exception { + tester = initDatabaseTester(); + } + + private static IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + tester.setTearDownOperation(DatabaseOperation.DELETE_ALL); + return tester; + } + + private static IDataSet initDataSet() throws Exception { + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); } + } - private static IDatabaseTester initDatabaseTester() throws Exception { - final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); - tester.setDataSet(initDataSet()); - tester.setSetUpOperation(DatabaseOperation.REFRESH); - tester.setTearDownOperation(DatabaseOperation.DELETE_ALL); - return tester; + @Before + public void setup() throws Exception { + tester.onSetup(); + } + + @After + public void tearDown() throws Exception { + tester.onTearDown(); + } + + @Test + public void testSelect() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); + + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); + } + + @Test + public void testIgnoringProduced() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + final String[] excludedColumns = { "id", "produced" }; + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) { + final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); + final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); + + connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); + + Assertion.assertEquals(expectedTable, actualTable); } + } - private static IDataSet initDataSet() throws Exception { - try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } + @Test + public void testDelete() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + assertEquals(expectedTable, actualTable); } + } - @Before public void setup() throws Exception { - tester.onSetup(); + @Test + public void testDeleteWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" }); + + assertEquals(expectedTable, actualTable); } + } - @After public void tearDown() throws Exception { - tester.onTearDown(); + @Test + public void testUpdate() throws Exception { + final Connection connection = tester.getConnection().getConnection(); + + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { + final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + assertEquals(expectedTable, actualTable); } + } - @Test public void testSelect() throws Exception { - final Connection connection = tester.getConnection().getConnection(); + @Test + public void testUpdateWithExcludedColumns() throws Exception { + final Connection connection = tester.getConnection().getConnection(); - final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); + try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) { + ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test public void testIgnoringProduced() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - final String[] excludedColumns = { "id", "produced" }; - try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) { - final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); - - connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); - - Assertion.assertEquals(expectedTable, actualTable); - } - } - - @Test public void testDelete() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - - assertEquals(expectedTable, actualTable); - } - } - - @Test public void testDeleteWithExcludedColumns() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) { - final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" }); - - assertEquals(expectedTable, actualTable); - } - } - - @Test public void testUpdate() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { - final ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - - assertEquals(expectedTable, actualTable); - } - } - - @Test public void testUpdateWithExcludedColumns() throws Exception { - final Connection connection = tester.getConnection().getConnection(); - - try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) { - ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" }); - - assertEquals(expectedTable, actualTable); - } + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = tester.getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" }); + + assertEquals(expectedTable, actualTable); } + } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java index f797f153a0..039dfd1639 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java @@ -24,60 +24,64 @@ import static org.assertj.core.api.Assertions.assertThat; public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { - @Override public void setUp() throws Exception { - setDatabaseTester(initDatabaseTester()); - setDataFileLoader(initDataFileLoader()); - super.setUp(); + @Override + public void setUp() throws Exception { + setDatabaseTester(initDatabaseTester()); + setDataFileLoader(initDataFileLoader()); + super.setUp(); + } + + private IDatabaseTester initDatabaseTester() throws Exception { + final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); + tester.setDataSet(initDataSet()); + tester.setSetUpOperation(DatabaseOperation.REFRESH); + return tester; + } + + private IDataSet initDataSet() throws Exception { + try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { + return new FlatXmlDataSetBuilder().build(is); } + } - private IDatabaseTester initDatabaseTester() throws Exception { - final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); - tester.setDataSet(initDataSet()); - tester.setSetUpOperation(DatabaseOperation.REFRESH); - return tester; - } + private DataFileLoader initDataFileLoader() { + return new FlatXmlDataFileLoader(); + } - private IDataSet initDataSet() throws Exception { - try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } - } + @Test + public void testSelect() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; + final String[] prepDataFiles = { "/dbunit/users.xml" }; + final String[] expectedDataFiles = { "/dbunit/users.xml" }; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeQuery("select * from CLIENTS where id = 1"); - private DataFileLoader initDataFileLoader() { - return new FlatXmlDataFileLoader(); - } + final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - @Test public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; - final String[] prepDataFiles = { "/dbunit/users.xml" }; - final String[] expectedDataFiles = { "/dbunit/users.xml" }; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeQuery("select * from CLIENTS where id = 1"); + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("last_name")).isEqualTo("Xavier"); + } - final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + @Test + public void testUpdate() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; // define tables to verify + final String[] prepDataFiles = { "/dbunit/users.xml" }; + final String[] expectedDataFiles = { "/dbunit/users_exp_rename.xml" }; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("last_name")).isEqualTo("Xavier"); - } + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } - @Test public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; // define tables to verify - final String[] prepDataFiles = { "/dbunit/users.xml" }; - final String[] expectedDataFiles = { "/dbunit/users_exp_rename.xml" }; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); + @Test + public void testDelete() throws Exception { + final Connection connection = getConnection().getConnection(); + final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; + final String[] prepDataFiles = { "/dbunit/users.xml" }; + final String[] expectedDataFiles = { "/dbunit/users_exp_delete.xml" }; + final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("delete from CLIENTS where id = 2"); - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } - - @Test public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; - final String[] prepDataFiles = { "/dbunit/users.xml" }; - final String[] expectedDataFiles = { "/dbunit/users_exp_delete.xml" }; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("delete from CLIENTS where id = 2"); - - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } + super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); + } } From 509423ba5714718292b4b08782afe7f73dbcd80f Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Thu, 2 Apr 2020 16:10:53 +0200 Subject: [PATCH 292/530] JAVA-997: Upgrade Spring Core & Security to the latest versions --- parent-spring-5/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml index 27f355bfad..c75655ebc8 100644 --- a/parent-spring-5/pom.xml +++ b/parent-spring-5/pom.xml @@ -31,8 +31,8 @@ - 5.2.2.RELEASE - 5.2.1.RELEASE + 5.2.5.RELEASE + 5.2.3.RELEASE \ No newline at end of file From e98323d913d19af96119a9d9220b8eebda64c2fc Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Fri, 3 Apr 2020 08:51:46 +0200 Subject: [PATCH 293/530] [BAEL-2749] Renaming test methods and running them with JUnit4 --- .../baeldung/dbunit/DataSourceDBUnitTest.java | 63 +++++++++++-- .../java/com/baeldung/dbunit/DbUnitTest.java | 91 ------------------- .../baeldung/dbunit/OldSchoolDbUnitTest.java | 26 ++++-- .../dbunit/PrepAndExpectedDbUnitTest.java | 87 ------------------ .../jsonassert/JsonAssertUnitTest.java | 10 +- .../src/test/resources/dbunit/data.xml | 2 +- .../dbunit/items_exp_rename_no_produced.xml | 2 +- .../src/test/resources/dbunit/users.xml | 2 +- .../resources/dbunit/users_exp_delete.xml | 2 +- .../resources/dbunit/users_exp_rename.xml | 2 +- 10 files changed, 80 insertions(+), 207 deletions(-) delete mode 100644 libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java delete mode 100644 libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java index 93503277b4..20b0337f4d 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -14,6 +14,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.platform.commons.logging.Logger; import org.junit.platform.commons.logging.LoggerFactory; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; import java.io.InputStream; import java.sql.Connection; @@ -23,7 +25,9 @@ import java.sql.SQLException; import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; import static java.util.stream.Collectors.joining; import static org.assertj.core.api.Assertions.assertThat; +import static org.dbunit.Assertion.assertEqualsIgnoreCols; +@RunWith(JUnit4.class) public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { private static final Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); @@ -65,7 +69,7 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { } @Test - public void testSimpleDataSet() throws SQLException { + public void givenDataSet_whenSelect_thenFirstTitleIsGreyTShirt() throws SQLException { final Connection connection = getDataSource().getConnection(); final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); @@ -75,7 +79,7 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { } @Test - public void testEmptySchema() throws Exception { + public void givenDataSetEmptySchema_whenDataSetCreated_thenTablesAreEqual() throws Exception { final IDataSet expectedDataSet = getDataSet(); final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); final IDataSet databaseDataSet = getConnection().createDataSet(); @@ -84,33 +88,74 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { } @Test - public void testAssertByQuery() throws Exception { + public void givenDataSet_whenInsert_thenTableHasNewClient() throws Exception { try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-user.xml")) { final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); final ITable expectedTable = expectedDataSet.getTable("CLIENTS"); final Connection conn = getDataSource().getConnection(); - conn.createStatement().executeUpdate("INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); - final ITable actualData = getConnection().createQueryTable("result_name", "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); + conn.createStatement() + .executeUpdate( + "INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen')"); + final ITable actualData = getConnection() + .createQueryTable( + "result_name", + "SELECT * FROM CLIENTS WHERE last_name='Jansen'"); - Assertion.assertEqualsIgnoreCols(expectedTable, actualData, new String[] { "id" }); + assertEqualsIgnoreCols(expectedTable, actualData, new String[] { "id" }); } } @Test - public void testMultipleFailures() throws Exception { + public void givenDataSet_whenDelete_thenItemIsDeleted() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final InputStream is = DataSourceDBUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); + + connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualTable); + } + } + + @Test + public void givenDataSet_whenUpdate_thenItemHasNewName() throws Exception { + final Connection connection = getConnection().getConnection(); + + try (final InputStream is = DataSourceDBUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { + ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); + + connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); + + final IDataSet databaseDataSet = getConnection().createDataSet(); + ITable actualTable = databaseDataSet.getTable("ITEMS"); + + Assertion.assertEquals(expectedTable, actualTable); + } + } + + @Test + public void givenDataSet_whenInsertUnexpectedData_thenFailOnAllUnexpectedValues() throws Exception { try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-multiple-failures.xml")) { final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); final ITable expectedTable = expectedDataSet.getTable("ITEMS"); final Connection conn = getDataSource().getConnection(); final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler(); - conn.createStatement().executeUpdate("INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); + conn.createStatement().executeUpdate( + "INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000')"); final ITable actualData = getConnection().createDataSet().getTable("ITEMS"); Assertion.assertEquals(expectedTable, actualData, collectingHandler); if (!collectingHandler.getDiffList().isEmpty()) { - String message = (String) collectingHandler.getDiffList().stream().map(d -> formatDifference((Difference) d)).collect(joining("\n")); + String message = (String) collectingHandler + .getDiffList() + .stream() + .map(d -> formatDifference((Difference) d)).collect(joining("\n")); logger.error(() -> message); } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java deleted file mode 100644 index da4ac54f12..0000000000 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/DbUnitTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.baeldung.dbunit; - -import org.dbunit.Assertion; -import org.dbunit.DBTestCase; -import org.dbunit.PropertiesBasedJdbcDatabaseTester; -import org.dbunit.dataset.IDataSet; -import org.dbunit.dataset.ITable; -import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; -import org.dbunit.operation.DatabaseOperation; -import org.junit.Test; - -import java.io.InputStream; -import java.sql.Connection; -import java.sql.ResultSet; - -import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; -import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; -import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; -import static com.baeldung.dbunit.ConnectionSettings.USER; -import static org.assertj.core.api.Assertions.assertThat; - -public class DbUnitTest extends DBTestCase { - - public DbUnitTest(String name) { - super(name); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, USER); - System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, PASSWORD); - } - - @Override - protected IDataSet getDataSet() throws Exception { - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } - } - - @Override - protected DatabaseOperation getSetUpOperation() { - return DatabaseOperation.REFRESH; - } - - @Override - protected DatabaseOperation getTearDownOperation() { - return DatabaseOperation.DELETE_ALL; - } - - @Test - public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - - final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("title")).isEqualTo("Grey T-Shirt"); - } - - @Test - public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); - - connection.createStatement().executeUpdate("delete from ITEMS where id = 2"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - - Assertion.assertEquals(expectedTable, actualTable); - } - } - - @Test - public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - - try (final InputStream is = DbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { - ITable expectedTable = (new FlatXmlDataSetBuilder().build(is)).getTable("ITEMS"); - - connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); - - final IDataSet databaseDataSet = getConnection().createDataSet(); - ITable actualTable = databaseDataSet.getTable("ITEMS"); - - Assertion.assertEquals(expectedTable, actualTable); - } - } - -} diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java index a7821102dc..6243af9676 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/OldSchoolDbUnitTest.java @@ -12,6 +12,8 @@ import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; import java.io.InputStream; import java.sql.Connection; @@ -24,6 +26,7 @@ import static com.baeldung.dbunit.ConnectionSettings.USER; import static org.assertj.core.api.Assertions.assertThat; import static org.dbunit.Assertion.assertEquals; +@RunWith(JUnit4.class) public class OldSchoolDbUnitTest { private static IDatabaseTester tester = null; @@ -58,7 +61,7 @@ public class OldSchoolDbUnitTest { } @Test - public void testSelect() throws Exception { + public void givenDataSet_whenSelect_thenFirstTitleIsGreyTShirt() throws Exception { final Connection connection = tester.getConnection().getConnection(); final ResultSet rs = connection.createStatement().executeQuery("select * from ITEMS where id = 1"); @@ -68,24 +71,27 @@ public class OldSchoolDbUnitTest { } @Test - public void testIgnoringProduced() throws Exception { + public void givenDataSet_whenInsert_thenGetResultsAreStillEqualIfIgnoringColumnsWithDifferentProduced() throws Exception { final Connection connection = tester.getConnection().getConnection(); final String[] excludedColumns = { "id", "produced" }; try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/expected-ignoring-registered_at.xml")) { final IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(is); - final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedDataSet.getTable("ITEMS"), excludedColumns); + final ITable expectedTable = DefaultColumnFilter.excludedColumnsTable( + expectedDataSet.getTable("ITEMS"), excludedColumns); - connection.createStatement().executeUpdate("INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); + connection.createStatement().executeUpdate( + "INSERT INTO ITEMS (title, price, produced) VALUES('Necklace', 199.99, now())"); final IDataSet databaseDataSet = tester.getConnection().createDataSet(); - final ITable actualTable = DefaultColumnFilter.excludedColumnsTable(databaseDataSet.getTable("ITEMS"), excludedColumns); + final ITable actualTable = DefaultColumnFilter.excludedColumnsTable( + databaseDataSet.getTable("ITEMS"), excludedColumns); Assertion.assertEquals(expectedTable, actualTable); } } @Test - public void testDelete() throws Exception { + public void givenDataSet_whenDelete_thenItemIsRemoved() throws Exception { final Connection connection = tester.getConnection().getConnection(); try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete.xml")) { @@ -101,7 +107,7 @@ public class OldSchoolDbUnitTest { } @Test - public void testDeleteWithExcludedColumns() throws Exception { + public void givenDataSet_whenDelete_thenItemIsRemovedAndResultsEqualIfProducedIsIgnored() throws Exception { final Connection connection = tester.getConnection().getConnection(); try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_delete_no_produced.xml")) { @@ -118,7 +124,7 @@ public class OldSchoolDbUnitTest { } @Test - public void testUpdate() throws Exception { + public void givenDataSet_whenUpdate_thenItemHasNewName() throws Exception { final Connection connection = tester.getConnection().getConnection(); try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename.xml")) { @@ -134,18 +140,18 @@ public class OldSchoolDbUnitTest { } @Test - public void testUpdateWithExcludedColumns() throws Exception { + public void givenDataSet_whenUpdateWithNoProduced_thenItemHasNewName() throws Exception { final Connection connection = tester.getConnection().getConnection(); try (final InputStream is = OldSchoolDbUnitTest.class.getClassLoader().getResourceAsStream("dbunit/items_exp_rename_no_produced.xml")) { ITable expectedTable = new FlatXmlDataSetBuilder().build(is).getTable("ITEMS"); + expectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[] { "produced" }); connection.createStatement().executeUpdate("update ITEMS set title='new name' where id = 1"); final IDataSet databaseDataSet = tester.getConnection().createDataSet(); ITable actualTable = databaseDataSet.getTable("ITEMS"); actualTable = DefaultColumnFilter.excludedColumnsTable(actualTable, new String[] { "produced" }); - assertEquals(expectedTable, actualTable); } } diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java deleted file mode 100644 index 039dfd1639..0000000000 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/PrepAndExpectedDbUnitTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.baeldung.dbunit; - -import org.dbunit.DefaultPrepAndExpectedTestCase; -import org.dbunit.IDatabaseTester; -import org.dbunit.JdbcDatabaseTester; -import org.dbunit.PrepAndExpectedTestCaseSteps; -import org.dbunit.VerifyTableDefinition; -import org.dbunit.dataset.IDataSet; -import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; -import org.dbunit.operation.DatabaseOperation; -import org.dbunit.util.fileloader.DataFileLoader; -import org.dbunit.util.fileloader.FlatXmlDataFileLoader; -import org.junit.Test; - -import java.io.InputStream; -import java.sql.Connection; -import java.sql.ResultSet; - -import static com.baeldung.dbunit.ConnectionSettings.JDBC_DRIVER; -import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL; -import static com.baeldung.dbunit.ConnectionSettings.PASSWORD; -import static com.baeldung.dbunit.ConnectionSettings.USER; -import static org.assertj.core.api.Assertions.assertThat; - -public class PrepAndExpectedDbUnitTest extends DefaultPrepAndExpectedTestCase { - - @Override - public void setUp() throws Exception { - setDatabaseTester(initDatabaseTester()); - setDataFileLoader(initDataFileLoader()); - super.setUp(); - } - - private IDatabaseTester initDatabaseTester() throws Exception { - final JdbcDatabaseTester tester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); - tester.setDataSet(initDataSet()); - tester.setSetUpOperation(DatabaseOperation.REFRESH); - return tester; - } - - private IDataSet initDataSet() throws Exception { - try (final InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit/data.xml")) { - return new FlatXmlDataSetBuilder().build(is); - } - } - - private DataFileLoader initDataFileLoader() { - return new FlatXmlDataFileLoader(); - } - - @Test - public void testSelect() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; - final String[] prepDataFiles = { "/dbunit/users.xml" }; - final String[] expectedDataFiles = { "/dbunit/users.xml" }; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeQuery("select * from CLIENTS where id = 1"); - - final ResultSet rs = (ResultSet) super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - - assertThat(rs.next()).isTrue(); - assertThat(rs.getString("last_name")).isEqualTo("Xavier"); - } - - @Test - public void testUpdate() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; // define tables to verify - final String[] prepDataFiles = { "/dbunit/users.xml" }; - final String[] expectedDataFiles = { "/dbunit/users_exp_rename.xml" }; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("update CLIENTS set first_name = 'new name' where id = 1"); - - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } - - @Test - public void testDelete() throws Exception { - final Connection connection = getConnection().getConnection(); - final VerifyTableDefinition[] verifyTables = { new VerifyTableDefinition("CLIENTS", new String[] {}) }; - final String[] prepDataFiles = { "/dbunit/users.xml" }; - final String[] expectedDataFiles = { "/dbunit/users_exp_delete.xml" }; - final PrepAndExpectedTestCaseSteps testSteps = () -> connection.createStatement().executeUpdate("delete from CLIENTS where id = 2"); - - super.runTest(verifyTables, prepDataFiles, expectedDataFiles, testSteps); - } - -} diff --git a/libraries-testing/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java b/libraries-testing/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java index ce9638c4af..822468e91f 100644 --- a/libraries-testing/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java @@ -78,10 +78,10 @@ public class JsonAssertUnitTest { @Test public void givenArray_whenComparing_thenOrderMustMatchForStrict() throws JSONException { - String result = "[Alex, Barbera, Charlie, Xavier]"; - JSONAssert.assertEquals("[Charlie, Alex, Xavier, Barbera]", result, JSONCompareMode.LENIENT); - JSONAssert.assertEquals("[Alex, Barbera, Charlie, Xavier]", result, JSONCompareMode.STRICT); - JSONAssert.assertNotEquals("[Charlie, Alex, Xavier, Barbera]", result, JSONCompareMode.STRICT); + String result = "[Alex, Barbera, Charlie, Wolf]"; + JSONAssert.assertEquals("[Charlie, Alex, Wolf, Barbera]", result, JSONCompareMode.LENIENT); + JSONAssert.assertEquals("[Alex, Barbera, Charlie, Wolf]", result, JSONCompareMode.STRICT); + JSONAssert.assertNotEquals("[Charlie, Alex, Wolf, Barbera]", result, JSONCompareMode.STRICT); } @Test @@ -94,7 +94,7 @@ public class JsonAssertUnitTest { @Test public void whenComparingSizeOfArray_thenPass() throws JSONException { - String names = "{names:[Alex, Barbera, Charlie, Xavier]}"; + String names = "{names:[Alex, Barbera, Charlie, Wolf]}"; JSONAssert.assertEquals("{names:[4]}", names, new ArraySizeComparator(JSONCompareMode.LENIENT)); } diff --git a/libraries-testing/src/test/resources/dbunit/data.xml b/libraries-testing/src/test/resources/dbunit/data.xml index 290cc36890..4865dec54c 100644 --- a/libraries-testing/src/test/resources/dbunit/data.xml +++ b/libraries-testing/src/test/resources/dbunit/data.xml @@ -1,6 +1,6 @@ - + diff --git a/libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml b/libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml index b42d3804fa..4f14b17113 100644 --- a/libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml +++ b/libraries-testing/src/test/resources/dbunit/items_exp_rename_no_produced.xml @@ -1,6 +1,6 @@ - + diff --git a/libraries-testing/src/test/resources/dbunit/users.xml b/libraries-testing/src/test/resources/dbunit/users.xml index 9ac3909bc5..f04943c4cc 100644 --- a/libraries-testing/src/test/resources/dbunit/users.xml +++ b/libraries-testing/src/test/resources/dbunit/users.xml @@ -1,6 +1,6 @@ - + diff --git a/libraries-testing/src/test/resources/dbunit/users_exp_delete.xml b/libraries-testing/src/test/resources/dbunit/users_exp_delete.xml index 2fe97ae6f6..20a2f2f1a7 100644 --- a/libraries-testing/src/test/resources/dbunit/users_exp_delete.xml +++ b/libraries-testing/src/test/resources/dbunit/users_exp_delete.xml @@ -1,5 +1,5 @@ - + diff --git a/libraries-testing/src/test/resources/dbunit/users_exp_rename.xml b/libraries-testing/src/test/resources/dbunit/users_exp_rename.xml index 95682118bb..1ab6cf53b8 100644 --- a/libraries-testing/src/test/resources/dbunit/users_exp_rename.xml +++ b/libraries-testing/src/test/resources/dbunit/users_exp_rename.xml @@ -1,6 +1,6 @@ - + From 55d1d12216712635a005ab6d7629ebeb2fc97f40 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 4 Apr 2020 12:55:27 +0530 Subject: [PATCH 294/530] JAVA-624: Updated READMEs for prev links --- java-collections-maps-2/README.md | 2 +- java-collections-maps-3/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md index 71c6a3f32b..2188960543 100644 --- a/java-collections-maps-2/README.md +++ b/java-collections-maps-2/README.md @@ -13,4 +13,4 @@ This module contains articles about Map data structures in Java. - [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) - [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) -- More articles: [[<-- prev>]](/java-collections-maps) [[next -->]](/java-collections-maps-3) +- More articles: [[<-- prev]](/java-collections-maps) [[next -->]](/java-collections-maps-3) diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md index 8f185f6ad4..886461a35c 100644 --- a/java-collections-maps-3/README.md +++ b/java-collections-maps-3/README.md @@ -5,4 +5,4 @@ This module contains articles about Map data structures in Java. ### Relevant Articles: - [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) - [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) -- More articles: [[<-- prev>]](/java-collections-maps-2) +- More articles: [[<-- prev]](/java-collections-maps-2) From 902bb5308945cc37b148ee630832071209ce9361 Mon Sep 17 00:00:00 2001 From: Marius Catalin Munteanu Date: Wed, 11 Mar 2020 10:56:13 +0200 Subject: [PATCH 295/530] [BAEL-3011] Accesing Spring MVC Data from Thymeleaf - Code example for https://jira.baeldung.com/browse/BAEL-3012 --- .../thymeleaf/mvcdata/BeanConfig.java | 14 ++++ .../thymeleaf/mvcdata/EmailController.java | 63 ++++++++++++++++ .../mvcdata/repository/EmailData.java | 48 +++++++++++++ .../templates/mvcdata/email-bean-data.html | 14 ++++ .../mvcdata/email-model-attributes.html | 16 +++++ .../mvcdata/email-request-parameters.html | 20 ++++++ .../mvcdata/email-servlet-context.html | 14 ++++ .../mvcdata/email-session-attributes.html | 14 ++++ .../mvcdata/EmailControllerUnitTest.java | 72 +++++++++++++++++++ 9 files changed, 275 insertions(+) create mode 100644 spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/BeanConfig.java create mode 100644 spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/EmailController.java create mode 100644 spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/repository/EmailData.java create mode 100644 spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-bean-data.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-model-attributes.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-request-parameters.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-servlet-context.html create mode 100644 spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-session-attributes.html create mode 100644 spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/mvcdata/EmailControllerUnitTest.java diff --git a/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/BeanConfig.java b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/BeanConfig.java new file mode 100644 index 0000000000..19f0101cf2 --- /dev/null +++ b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/BeanConfig.java @@ -0,0 +1,14 @@ +package com.baeldung.thymeleaf.mvcdata; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.thymeleaf.mvcdata.repository.EmailData; + +@Configuration +public class BeanConfig { + @Bean + public EmailData emailData() { + return new EmailData(); + } +} diff --git a/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/EmailController.java b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/EmailController.java new file mode 100644 index 0000000000..1bfe3f3428 --- /dev/null +++ b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/EmailController.java @@ -0,0 +1,63 @@ +package com.baeldung.thymeleaf.mvcdata; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpSession; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestParam; + +import com.baeldung.thymeleaf.mvcdata.repository.EmailData; + +@Controller +public class EmailController { + private EmailData emailData = new EmailData(); + private ServletContext servletContext; + + public EmailController(ServletContext servletContext) { + this.servletContext = servletContext; + } + + @GetMapping(value = "/email/modelattributes") + public String emailModel(Model model) { + model.addAttribute("emaildata", emailData); + return "mvcdata/email-model-attributes"; + } + + @ModelAttribute("emailModelAttribute") + EmailData emailModelAttribute() { + return emailData; + } + + @GetMapping(value = "/email/requestparameters") + public String emailRequestParameters( + @RequestParam(value = "emailsubject") String emailSubject, + @RequestParam(value = "emailcontent") String emailContent, + @RequestParam(value = "emailaddress") String emailAddress1, + @RequestParam(value = "emailaddress") String emailAddress2, + @RequestParam(value = "emaillocale") String emailLocale) { + return "mvcdata/email-request-parameters"; + } + + @GetMapping("/email/sessionattributes") + public String emailSessionAttributes(HttpSession httpSession) { + httpSession.setAttribute("emaildata", emailData); + return "mvcdata/email-session-attributes"; + } + + @GetMapping("/email/servletcontext") + public String emailServletContext() { + servletContext.setAttribute("emailsubject", emailData.getEmailSubject()); + servletContext.setAttribute("emailcontent", emailData.getEmailBody()); + servletContext.setAttribute("emailaddress", emailData.getEmailAddress1()); + servletContext.setAttribute("emaillocale", emailData.getEmailLocale()); + return "mvcdata/email-servlet-context"; + } + + @GetMapping("/email/beandata") + public String emailBeanData() { + return "mvcdata/email-bean-data"; + } +} diff --git a/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/repository/EmailData.java b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/repository/EmailData.java new file mode 100644 index 0000000000..9dc25bdaa7 --- /dev/null +++ b/spring-thymeleaf-2/src/main/java/com/baeldung/thymeleaf/mvcdata/repository/EmailData.java @@ -0,0 +1,48 @@ +package com.baeldung.thymeleaf.mvcdata.repository; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class EmailData implements Serializable { + private String emailSubject; + private String emailBody; + private String emailLocale; + private String emailAddress1; + private String emailAddress2; + + public EmailData() { + this.emailSubject = "You have received a new message"; + this.emailBody = "Good morning !"; + this.emailLocale = "en-US"; + this.emailAddress1 = "jhon.doe@example.com"; + this.emailAddress2 = "mark.jakob@example.com"; + } + + public String getEmailSubject() { + return this.emailSubject; + } + + public String getEmailBody() { + return this.emailBody; + } + + public String getEmailLocale() { + return this.emailLocale; + } + + public String getEmailAddress1() { + return this.emailAddress1; + } + + public String getEmailAddress2() { + return this.emailAddress2; + } + + public List getEmailAddresses() { + List emailAddresses = new ArrayList<>(); + emailAddresses.add(getEmailAddress1()); + emailAddresses.add(getEmailAddress2()); + return emailAddresses; + } +} diff --git a/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-bean-data.html b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-bean-data.html new file mode 100644 index 0000000000..59073b51c6 --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-bean-data.html @@ -0,0 +1,14 @@ + + + +

Subject

+

Subject

+

Content

+

Body

+

Email address

+

Email address

+

Language

+

Language

+ + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-model-attributes.html b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-model-attributes.html new file mode 100644 index 0000000000..caf136383a --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-model-attributes.html @@ -0,0 +1,16 @@ + + + +

Subject

+

Subject

+

Content

+

+

Email addresses

+

+ +

+

Language

+

+ + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-request-parameters.html b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-request-parameters.html new file mode 100644 index 0000000000..8bcd3e1c62 --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-request-parameters.html @@ -0,0 +1,20 @@ + + + +

Subject

+

Subject

+

Content

+

+

Email addresses

+

+ +

+

Email address 1

+

+

Email address 2

+

+

Language

+

+ + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-servlet-context.html b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-servlet-context.html new file mode 100644 index 0000000000..b07573047e --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-servlet-context.html @@ -0,0 +1,14 @@ + + + +

Subject

+

+

Content

+

+

Email address

+

+

Language

+

+ + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-session-attributes.html b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-session-attributes.html new file mode 100644 index 0000000000..9227171fc6 --- /dev/null +++ b/spring-thymeleaf-2/src/main/resources/templates/mvcdata/email-session-attributes.html @@ -0,0 +1,14 @@ + + + +

Subject

+

+

Content

+

+

Email address

+

+

Language

+

+ + \ No newline at end of file diff --git a/spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/mvcdata/EmailControllerUnitTest.java b/spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/mvcdata/EmailControllerUnitTest.java new file mode 100644 index 0000000000..5e1190e174 --- /dev/null +++ b/spring-thymeleaf-2/src/test/java/com/baeldung/thymeleaf/mvcdata/EmailControllerUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.thymeleaf.mvcdata; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +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.request.MockMvcRequestBuilders; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import com.baeldung.thymeleaf.mvcdata.repository.EmailData; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc(printOnlyOnFailure = false) +public class EmailControllerUnitTest { + + EmailData emailData = new EmailData(); + + @Autowired + private MockMvc mockMvc; + + @Test + public void whenCallModelAttributes_thenReturnEmailData() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/email/modelattributes")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("You have received a new message"))); + } + + @Test + public void whenCallRequestParameters_thenReturnEmailData() throws Exception { + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("emailsubject", emailData.getEmailSubject()); + params.add("emailcontent", emailData.getEmailBody()); + params.add("emailaddress", emailData.getEmailAddress1()); + params.add("emailaddress", emailData.getEmailAddress2()); + params.add("emaillocale", emailData.getEmailLocale()); + mockMvc.perform(MockMvcRequestBuilders.get("/email/requestparameters") + .params(params)) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("en-US"))); + } + + @Test + public void whenCallSessionAttributes_thenReturnEmailData() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/email/sessionattributes")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Good morning !"))); + } + + @Test + public void whenCallServletContext_thenReturnEmailData() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/email/servletcontext")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("jhon.doe@example.com"))); + } + + @Test + public void whenCallBeanData_thenReturnEmailData() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/email/beandata")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("jhon.doe@example.com"))); + } + +} From ffc854e2f0d92d531aae9d576c387bfb3ee078d5 Mon Sep 17 00:00:00 2001 From: Waldemar Date: Sat, 4 Apr 2020 11:38:24 +0200 Subject: [PATCH 296/530] BAEL-2398: add libraries-concurrency module --- libraries-concurrency/pom.xml | 15 +++++++++++++++ pom.xml | 1 + 2 files changed, 16 insertions(+) create mode 100644 libraries-concurrency/pom.xml diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml new file mode 100644 index 0000000000..0dc546e63a --- /dev/null +++ b/libraries-concurrency/pom.xml @@ -0,0 +1,15 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + libraries-concurrency + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index a295439951..9694941645 100644 --- a/pom.xml +++ b/pom.xml @@ -1259,6 +1259,7 @@ wildfly xml xstream + libraries-concurrency
From 0cb40ad2665b4ed854938cc57d126a73ba6b4a1a Mon Sep 17 00:00:00 2001 From: Waldemar Date: Sat, 4 Apr 2020 11:48:18 +0200 Subject: [PATCH 297/530] BAEL-2398: move coroutines-java module into libraries-concurrency module --- .../coroutines-java}/pom.xml | 15 +++++---------- .../src/main/java/com/baeldung/quasar/App.java | 0 libraries-concurrency/pom.xml | 11 ++++++++--- 3 files changed, 13 insertions(+), 13 deletions(-) rename {coroutines-java => libraries-concurrency/coroutines-java}/pom.xml (89%) rename {coroutines-java => libraries-concurrency/coroutines-java}/src/main/java/com/baeldung/quasar/App.java (100%) diff --git a/coroutines-java/pom.xml b/libraries-concurrency/coroutines-java/pom.xml similarity index 89% rename from coroutines-java/pom.xml rename to libraries-concurrency/coroutines-java/pom.xml index caee769a78..72356738d4 100644 --- a/coroutines-java/pom.xml +++ b/libraries-concurrency/coroutines-java/pom.xml @@ -2,19 +2,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - com.baeldung coroutines-java - 1.0-SNAPSHOT - coroutines-java - http://baeldung.com - - UTF-8 - 1.8 - 1.8 - + + com.baeldung + libraries-concurrency + 1.0.0-SNAPSHOT + diff --git a/coroutines-java/src/main/java/com/baeldung/quasar/App.java b/libraries-concurrency/coroutines-java/src/main/java/com/baeldung/quasar/App.java similarity index 100% rename from coroutines-java/src/main/java/com/baeldung/quasar/App.java rename to libraries-concurrency/coroutines-java/src/main/java/com/baeldung/quasar/App.java diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml index 0dc546e63a..5ba722ae2e 100644 --- a/libraries-concurrency/pom.xml +++ b/libraries-concurrency/pom.xml @@ -2,14 +2,19 @@ + 4.0.0 + libraries-concurrency + libraries-concurrency + pom + parent-modules com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - libraries-concurrency + + coroutines-java + \ No newline at end of file From 585ed13442a50a8471d5df66d831d4b069e27c2a Mon Sep 17 00:00:00 2001 From: Waldemar Date: Sat, 4 Apr 2020 11:50:20 +0200 Subject: [PATCH 298/530] BAEL-2398: rename coroutines-java to coroutines-with-quasar --- .../{coroutines-java => coroutines-with-quasar}/pom.xml | 4 ++-- .../src/main/java/com/baeldung/quasar/App.java | 0 libraries-concurrency/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename libraries-concurrency/{coroutines-java => coroutines-with-quasar}/pom.xml (97%) rename libraries-concurrency/{coroutines-java => coroutines-with-quasar}/src/main/java/com/baeldung/quasar/App.java (100%) diff --git a/libraries-concurrency/coroutines-java/pom.xml b/libraries-concurrency/coroutines-with-quasar/pom.xml similarity index 97% rename from libraries-concurrency/coroutines-java/pom.xml rename to libraries-concurrency/coroutines-with-quasar/pom.xml index 72356738d4..59241272e7 100644 --- a/libraries-concurrency/coroutines-java/pom.xml +++ b/libraries-concurrency/coroutines-with-quasar/pom.xml @@ -2,8 +2,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - coroutines-java - coroutines-java + coroutines-with-quasar + coroutines-with-quasar com.baeldung diff --git a/libraries-concurrency/coroutines-java/src/main/java/com/baeldung/quasar/App.java b/libraries-concurrency/coroutines-with-quasar/src/main/java/com/baeldung/quasar/App.java similarity index 100% rename from libraries-concurrency/coroutines-java/src/main/java/com/baeldung/quasar/App.java rename to libraries-concurrency/coroutines-with-quasar/src/main/java/com/baeldung/quasar/App.java diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml index 5ba722ae2e..7ae834025f 100644 --- a/libraries-concurrency/pom.xml +++ b/libraries-concurrency/pom.xml @@ -14,7 +14,7 @@ - coroutines-java + coroutines-with-quasar \ No newline at end of file From 1acadab18b1fec5fe1422faf7c01d6b4c5b45ffd Mon Sep 17 00:00:00 2001 From: Fabricio Pautasso Date: Sat, 4 Apr 2020 11:55:13 -0300 Subject: [PATCH 299/530] BAEL-3918 - Adding BigDecimal numbers using the Stream API (#8900) * BAEL-3918 - Adding BigDecimal numbers using the Stream API * BAEL-3918 - Adding BigDecimal numbers using the Stream API * BAEL-3918 - Adding BigDecimal numbers using the Stream API * BAEL-3918 - Updating test methods names to be compliant with Baeldung standards * Minor name change Co-authored-by: ashleyfrieze --- .../bigdecimals/AddNumbersUnitTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java new file mode 100644 index 0000000000..9399908b30 --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.streams.bigdecimals; + +import static org.junit.Assert.assertEquals; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.junit.Test; + +public class AddNumbersUnitTest { + + @Test + public void givenIntStream_whenSum_thenResultIsCorrect() { + IntStream intNumbers = IntStream.range(0, 3); + assertEquals(3, intNumbers.sum()); + } + + @Test + public void givenCollectionOfDouble_whenUsingMapToDoubleToSum_thenResultIsCorrect() { + List doubleNumbers = Arrays.asList(23.48, 52.26, 13.5); + double result = doubleNumbers.stream() + .mapToDouble(Double::doubleValue) + .sum(); + assertEquals(89.24, result, .1); + } + + public void givenStreamOfIntegers_whenUsingReduceToSum_thenResultIsCorrect() { + Stream intNumbers = Stream.of(0, 1, 2); + int result = intNumbers.reduce(0, Integer::sum); + assertEquals(106, result); + } + + public void givenStreamOfBigDecimals_whenUsingReduceToSum_thenResultIsCorrect() { + Stream bigDecimalNumber = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN); + BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add); + assertEquals(11, result); + } + +} From 487d6b38fc3ac13af3dd026745c83e56b0716f13 Mon Sep 17 00:00:00 2001 From: mikr Date: Sat, 4 Apr 2020 20:24:48 +0200 Subject: [PATCH 300/530] JAVA-117 Standardize spring-boot-modules/spring-boot --- .../java/{org => com}/baeldung/boot/Application.java | 2 +- .../baeldung/boot/config/H2JpaConfig.java | 6 +++--- .../{org => com}/baeldung/boot/config/WebConfig.java | 8 ++++---- .../boot/controller/servlet/HelloWorldServlet.java | 2 +- .../controller/servlet/SpringHelloWorldServlet.java | 2 +- .../boot/converter/GenericBigDecimalConverter.java | 2 +- .../boot/converter/StringToEmployeeConverter.java | 2 +- .../boot/converter/StringToEnumConverterFactory.java | 2 +- .../StringToEmployeeConverterController.java | 2 +- .../{org => com}/baeldung/boot/domain/Modes.java | 2 +- .../common/error/MyCustomErrorController.java | 2 +- .../error/SpringHelloServletRegistrationBean.java | 2 +- .../common/error/controller/ErrorController.java | 2 +- .../MyServletContainerCustomizationBean.java | 2 +- .../resources/ExecutorServiceExitCodeGenerator.java | 2 +- .../{org => com}/baeldung/demo/DemoApplication.java | 2 +- .../baeldung/demo/boottest/Employee.java | 2 +- .../baeldung/demo/boottest/EmployeeRepository.java | 2 +- .../demo/boottest/EmployeeRestController.java | 2 +- .../baeldung/demo/boottest/EmployeeService.java | 2 +- .../baeldung/demo/boottest/EmployeeServiceImpl.java | 2 +- .../baeldung/demo/components/FooService.java | 6 +++--- .../baeldung/demo/exceptions/CommonException.java | 2 +- .../demo/exceptions/FooNotFoundException.java | 2 +- .../java/{org => com}/baeldung/demo/model/Foo.java | 2 +- .../baeldung/demo/repository/FooRepository.java | 4 ++-- .../baeldung/demo/service/FooController.java | 6 +++--- .../endpoints/info/TotalUsersInfoContributor.java | 4 ++-- .../baeldung/main/SpringBootApplication.java | 12 ++++++------ .../main/java/{org => com}/baeldung/model/User.java | 2 +- .../baeldung/repository/UserRepository.java | 4 ++-- .../baeldung/session/exception/Application.java | 4 ++-- .../session/exception/repository/FooRepository.java | 4 ++-- .../exception/repository/FooRepositoryImpl.java | 4 ++-- .../baeldung/startup/AppStartupRunner.java | 2 +- .../startup/CommandLineAppStartupRunner.java | 2 +- .../baeldung/boot/ApplicationIntegrationTest.java | 4 ++-- .../boot/DemoApplicationIntegrationTest.java | 4 ++-- .../repository/FooRepositoryIntegrationTest.java | 8 ++++---- .../repository/HibernateSessionIntegrationTest.java | 8 ++++---- .../NoHibernateSessionIntegrationTest.java | 8 ++++---- .../converter/CustomConverterIntegrationTest.java | 6 +++--- ...ToEmployeeConverterControllerIntegrationTest.java | 4 ++-- .../boottest/EmployeeControllerIntegrationTest.java | 5 +---- .../boottest/EmployeeRepositoryIntegrationTest.java | 6 +++--- .../EmployeeRestControllerIntegrationTest.java | 4 ++-- .../boottest/EmployeeServiceImplIntegrationTest.java | 6 +++++- .../baeldung/demo/boottest/JsonUtil.java | 2 +- .../repository/UserRepositoryIntegrationTest.java | 7 ++++--- 49 files changed, 93 insertions(+), 91 deletions(-) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/Application.java (93%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/config/H2JpaConfig.java (89%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/config/WebConfig.java (71%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/controller/servlet/HelloWorldServlet.java (96%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java (96%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/converter/GenericBigDecimalConverter.java (96%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/converter/StringToEmployeeConverter.java (90%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/converter/StringToEnumConverterFactory.java (95%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/converter/controller/StringToEmployeeConverterController.java (91%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/boot/domain/Modes.java (54%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/common/error/MyCustomErrorController.java (93%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/common/error/SpringHelloServletRegistrationBean.java (91%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/common/error/controller/ErrorController.java (90%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/common/properties/MyServletContainerCustomizationBean.java (95%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java (94%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/DemoApplication.java (94%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/boottest/Employee.java (95%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/boottest/EmployeeRepository.java (91%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/boottest/EmployeeRestController.java (96%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/boottest/EmployeeService.java (89%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/boottest/EmployeeServiceImpl.java (96%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/components/FooService.java (77%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/exceptions/CommonException.java (85%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/exceptions/FooNotFoundException.java (86%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/model/Foo.java (95%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/repository/FooRepository.java (70%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/demo/service/FooController.java (85%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/endpoints/info/TotalUsersInfoContributor.java (89%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/main/SpringBootApplication.java (78%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/model/User.java (96%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/repository/UserRepository.java (98%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/session/exception/Application.java (87%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/session/exception/repository/FooRepository.java (50%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/session/exception/repository/FooRepositoryImpl.java (88%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/startup/AppStartupRunner.java (95%) rename spring-boot-modules/spring-boot/src/main/java/{org => com}/baeldung/startup/CommandLineAppStartupRunner.java (94%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/boot/ApplicationIntegrationTest.java (85%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/boot/DemoApplicationIntegrationTest.java (87%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/boot/repository/FooRepositoryIntegrationTest.java (82%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/boot/repository/HibernateSessionIntegrationTest.java (81%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java (78%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/converter/CustomConverterIntegrationTest.java (94%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java (94%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java (93%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java (94%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java (97%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java (94%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/demo/boottest/JsonUtil.java (91%) rename spring-boot-modules/spring-boot/src/test/java/{org => com}/baeldung/repository/UserRepositoryIntegrationTest.java (92%) diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/Application.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java similarity index 93% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/Application.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java index c1b6558b26..cb0d0c1532 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/Application.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/Application.java @@ -1,4 +1,4 @@ -package org.baeldung.boot; +package com.baeldung.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java similarity index 89% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java index 92a6ed7ab0..928928c9a5 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/H2JpaConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.config; +package com.baeldung.boot.config; import java.util.Properties; @@ -18,7 +18,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration -@EnableJpaRepositories(basePackages = { "org.baeldung.boot.repository", "org.baeldung.boot.boottest", "org.baeldung.repository" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.boot.boottest", "com.baeldung.repository" }) @PropertySource("classpath:persistence-generic-entity.properties") @EnableTransactionManagement public class H2JpaConfig { @@ -41,7 +41,7 @@ public class H2JpaConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.boot.domain", "org.baeldung.boot.model", "org.baeldung.boot.boottest", "org.baeldung.model" }); + em.setPackagesToScan(new String[] { "com.baeldung.boot.domain", "com.baeldung.boot.model", "com.baeldung.boot.boottest", "com.baeldung.model" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java similarity index 71% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java index 9554facb12..b23c910a04 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/config/WebConfig.java @@ -1,8 +1,8 @@ -package org.baeldung.boot.config; +package com.baeldung.boot.config; -import org.baeldung.boot.converter.StringToEmployeeConverter; -import org.baeldung.boot.converter.StringToEnumConverterFactory; -import org.baeldung.boot.converter.GenericBigDecimalConverter; +import com.baeldung.boot.converter.StringToEmployeeConverter; +import com.baeldung.boot.converter.StringToEnumConverterFactory; +import com.baeldung.boot.converter.GenericBigDecimalConverter; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java similarity index 96% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java index 34ad11254c..80c75aa8b5 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/HelloWorldServlet.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.controller.servlet; +package com.baeldung.boot.controller.servlet; import java.io.IOException; import java.io.PrintWriter; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java similarity index 96% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java index 91547683c6..f276f94b7c 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.controller.servlet; +package com.baeldung.boot.controller.servlet; import java.io.IOException; import java.io.PrintWriter; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java similarity index 96% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java index 8add28fc2d..fc73cfee5f 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.converter; +package com.baeldung.boot.converter; import com.google.common.collect.ImmutableSet; import org.springframework.core.convert.TypeDescriptor; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java similarity index 90% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java index 1bf75b38f0..ac635532ea 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.converter; +package com.baeldung.boot.converter; import org.springframework.core.convert.converter.Converter; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java similarity index 95% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java index ddb2cd2b08..a2dce11a6a 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/StringToEnumConverterFactory.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.converter; +package com.baeldung.boot.converter; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java similarity index 91% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java index 27bad4c387..260b1c734b 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.converter.controller; +package com.baeldung.boot.converter.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java similarity index 54% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java index dcba064e8c..7717294996 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/boot/domain/Modes.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.domain; +package com.baeldung.boot.domain; public enum Modes { diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/MyCustomErrorController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java similarity index 93% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/MyCustomErrorController.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java index df0e3ec0b2..373ae8f745 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/MyCustomErrorController.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/MyCustomErrorController.java @@ -1,4 +1,4 @@ -package org.baeldung.common.error; +package com.baeldung.common.error; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.web.bind.annotation.GetMapping; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java similarity index 91% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java index 774cf1b970..3f51a4ab69 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/SpringHelloServletRegistrationBean.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/SpringHelloServletRegistrationBean.java @@ -1,4 +1,4 @@ -package org.baeldung.common.error; +package com.baeldung.common.error; import org.springframework.boot.web.servlet.ServletRegistrationBean; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/controller/ErrorController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java similarity index 90% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/controller/ErrorController.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java index ac5f92e9c9..1e5fbf3ac4 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/error/controller/ErrorController.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/error/controller/ErrorController.java @@ -1,4 +1,4 @@ -package org.baeldung.common.error.controller; +package com.baeldung.common.error.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java similarity index 95% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java index d553d44769..be503b1b6c 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/properties/MyServletContainerCustomizationBean.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/properties/MyServletContainerCustomizationBean.java @@ -1,4 +1,4 @@ -package org.baeldung.common.properties; +package com.baeldung.common.properties; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java similarity index 94% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java index 64853a9941..1db7054f85 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/common/resources/ExecutorServiceExitCodeGenerator.java @@ -1,4 +1,4 @@ -package org.baeldung.common.resources; +package com.baeldung.common.resources; import org.springframework.boot.ExitCodeGenerator; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java similarity index 94% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java index 4a88fcea07..eb091b4695 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/DemoApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.demo; +package com.baeldung.demo; import com.baeldung.graphql.GraphqlConfiguration; import org.springframework.boot.SpringApplication; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/Employee.java similarity index 95% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/Employee.java index 645ce2838a..fa3c1dc809 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/Employee.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRepository.java similarity index 91% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRepository.java index 00fdbfaae4..b6850d587e 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRepository.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRestController.java similarity index 96% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRestController.java index 516bff0e8c..7d2e06d4a0 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeRestController.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeService.java similarity index 89% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeService.java index 07765a511c..ff1976cad1 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeService.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeServiceImpl.java similarity index 96% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeServiceImpl.java index a1639b29cc..156fc571f3 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/boottest/EmployeeServiceImpl.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java similarity index 77% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java index 66943f6461..98a0db67ef 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/components/FooService.java @@ -1,7 +1,7 @@ -package org.baeldung.demo.components; +package com.baeldung.demo.components; -import org.baeldung.demo.model.Foo; -import org.baeldung.demo.repository.FooRepository; +import com.baeldung.demo.model.Foo; +import com.baeldung.demo.repository.FooRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java similarity index 85% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java index 51dd7bbd44..276802d0b9 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/CommonException.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.exceptions; +package com.baeldung.demo.exceptions; public class CommonException extends RuntimeException { diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java similarity index 86% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java index 59796c58f0..8c425d078e 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/exceptions/FooNotFoundException.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.exceptions; +package com.baeldung.demo.exceptions; public class FooNotFoundException extends RuntimeException { diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java similarity index 95% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java index e5638cfd3d..796bcca11b 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/model/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.model; +package com.baeldung.demo.model; import java.io.Serializable; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java similarity index 70% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java index c04e0c7438..ed27ac23bc 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/repository/FooRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.demo.repository; +package com.baeldung.demo.repository; -import org.baeldung.demo.model.Foo; +import com.baeldung.demo.model.Foo; import org.springframework.data.jpa.repository.JpaRepository; public interface FooRepository extends JpaRepository { diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java similarity index 85% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java index c28dcde1a7..c72c52fa3e 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/demo/service/FooController.java @@ -1,7 +1,7 @@ -package org.baeldung.demo.service; +package com.baeldung.demo.service; -import org.baeldung.demo.components.FooService; -import org.baeldung.demo.model.Foo; +import com.baeldung.demo.model.Foo; +import com.baeldung.demo.components.FooService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/endpoints/info/TotalUsersInfoContributor.java similarity index 89% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/endpoints/info/TotalUsersInfoContributor.java index 34b50a2c0a..c316cabda5 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/endpoints/info/TotalUsersInfoContributor.java @@ -1,9 +1,9 @@ -package org.baeldung.endpoints.info; +package com.baeldung.endpoints.info; import java.util.HashMap; import java.util.Map; -import org.baeldung.repository.UserRepository; +import com.baeldung.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java similarity index 78% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java index a203659d63..c8cfb50f1c 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java @@ -1,9 +1,9 @@ -package org.baeldung.main; +package com.baeldung.main; -import org.baeldung.boot.controller.servlet.HelloWorldServlet; -import org.baeldung.boot.controller.servlet.SpringHelloWorldServlet; -import org.baeldung.common.error.SpringHelloServletRegistrationBean; -import org.baeldung.common.resources.ExecutorServiceExitCodeGenerator; +import com.baeldung.boot.controller.servlet.HelloWorldServlet; +import com.baeldung.boot.controller.servlet.SpringHelloWorldServlet; +import com.baeldung.common.error.SpringHelloServletRegistrationBean; +import com.baeldung.common.resources.ExecutorServiceExitCodeGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -18,7 +18,7 @@ import java.util.concurrent.Executors; @RestController @EnableAutoConfiguration -@ComponentScan({ "org.baeldung.common.error", "org.baeldung.common.error.controller", "org.baeldung.common.properties", "org.baeldung.common.resources", "org.baeldung.endpoints", "org.baeldung.service", "org.baeldung.monitor.jmx", "org.baeldung.boot.config" }) +@ComponentScan({ "org.baeldung.common.error", "com.baeldung.common.error.controller", "com.baeldung.common.properties", "com.baeldung.common.resources", "com.baeldung.endpoints", "com.baeldung.service", "com.baeldung.monitor.jmx", "com.baeldung.boot.config" }) public class SpringBootApplication { private static ApplicationContext applicationContext; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/model/User.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java similarity index 96% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/model/User.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java index eb886338a0..cc5f27f38c 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/model/User.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/model/User.java @@ -1,4 +1,4 @@ -package org.baeldung.model; +package com.baeldung.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java similarity index 98% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java index 752664cd5d..4dd863fb17 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/repository/UserRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.repository; +package com.baeldung.repository; -import org.baeldung.model.User; +import com.baeldung.model.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/Application.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java similarity index 87% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/Application.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java index 354c64c258..de4ca5998e 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/Application.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/Application.java @@ -1,6 +1,6 @@ -package org.baeldung.session.exception; +package com.baeldung.session.exception; -import org.baeldung.demo.model.Foo; +import com.baeldung.demo.model.Foo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java similarity index 50% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java index ce7bbfe57b..5e748973ed 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.session.exception.repository; +package com.baeldung.session.exception.repository; -import org.baeldung.demo.model.Foo; +import com.baeldung.demo.model.Foo; public interface FooRepository { diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java similarity index 88% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java index 607bae83ba..a304373d6c 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/session/exception/repository/FooRepositoryImpl.java @@ -1,8 +1,8 @@ -package org.baeldung.session.exception.repository; +package com.baeldung.session.exception.repository; import javax.persistence.EntityManagerFactory; -import org.baeldung.demo.model.Foo; +import com.baeldung.demo.model.Foo; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/AppStartupRunner.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/AppStartupRunner.java similarity index 95% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/AppStartupRunner.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/AppStartupRunner.java index d491bdb42c..0495473704 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/AppStartupRunner.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/AppStartupRunner.java @@ -1,4 +1,4 @@ -package org.baeldung.startup; +package com.baeldung.startup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/CommandLineAppStartupRunner.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/CommandLineAppStartupRunner.java similarity index 94% rename from spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/CommandLineAppStartupRunner.java rename to spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/CommandLineAppStartupRunner.java index 6a7be59c21..48c5225cf1 100644 --- a/spring-boot-modules/spring-boot/src/main/java/org/baeldung/startup/CommandLineAppStartupRunner.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/startup/CommandLineAppStartupRunner.java @@ -1,4 +1,4 @@ -package org.baeldung.startup; +package com.baeldung.startup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/ApplicationIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java similarity index 85% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/ApplicationIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java index 5e351157c8..462291e0ac 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/ApplicationIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/ApplicationIntegrationTest.java @@ -1,6 +1,6 @@ -package org.baeldung.boot; +package com.baeldung.boot; -import org.baeldung.session.exception.Application; +import com.baeldung.session.exception.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java similarity index 87% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java index 0541da3199..aaf4f1f780 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/DemoApplicationIntegrationTest.java @@ -1,6 +1,6 @@ -package org.baeldung.boot; +package com.baeldung.boot; -import org.baeldung.demo.DemoApplication; +import com.baeldung.demo.DemoApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java similarity index 82% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java index c32e36d7e3..1772739d20 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/FooRepositoryIntegrationTest.java @@ -1,8 +1,8 @@ -package org.baeldung.boot.repository; +package com.baeldung.boot.repository; -import org.baeldung.boot.DemoApplicationIntegrationTest; -import org.baeldung.demo.model.Foo; -import org.baeldung.demo.repository.FooRepository; +import com.baeldung.boot.DemoApplicationIntegrationTest; +import com.baeldung.demo.model.Foo; +import com.baeldung.demo.repository.FooRepository; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java similarity index 81% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java index b22282e896..2fe072bb67 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/HibernateSessionIntegrationTest.java @@ -1,8 +1,8 @@ -package org.baeldung.boot.repository; +package com.baeldung.boot.repository; -import org.baeldung.boot.DemoApplicationIntegrationTest; -import org.baeldung.demo.model.Foo; -import org.baeldung.demo.repository.FooRepository; +import com.baeldung.boot.DemoApplicationIntegrationTest; +import com.baeldung.demo.model.Foo; +import com.baeldung.demo.repository.FooRepository; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java similarity index 78% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java index 5c8d10223b..2e3326e6b1 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java @@ -1,8 +1,8 @@ -package org.baeldung.boot.repository; +package com.baeldung.boot.repository; -import org.baeldung.boot.ApplicationIntegrationTest; -import org.baeldung.demo.model.Foo; -import org.baeldung.session.exception.repository.FooRepository; +import com.baeldung.boot.ApplicationIntegrationTest; +import com.baeldung.demo.model.Foo; +import com.baeldung.session.exception.repository.FooRepository; import org.hibernate.HibernateException; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java similarity index 94% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java index bd1ae2c8fa..4619964783 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/CustomConverterIntegrationTest.java @@ -1,9 +1,9 @@ -package org.baeldung.converter; +package com.baeldung.converter; import com.baeldung.toggle.Employee; -import org.baeldung.boot.Application; -import org.baeldung.boot.domain.Modes; +import com.baeldung.boot.Application; +import com.baeldung.boot.domain.Modes; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java similarity index 94% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java index 2afda7565a..52dc542ebf 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.converter.controller; +package com.baeldung.converter.controller; import org.junit.Test; import org.junit.runner.RunWith; @@ -14,7 +14,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.baeldung.boot.Application; +import com.baeldung.boot.Application; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = Application.class) diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java similarity index 93% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java index 2d70583a54..962abf0fa3 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java @@ -1,8 +1,5 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; -import org.baeldung.demo.boottest.Employee; -import org.baeldung.demo.boottest.EmployeeRestController; -import org.baeldung.demo.boottest.EmployeeService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java similarity index 94% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java index 3042f95a46..164887886b 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java @@ -1,7 +1,7 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; -import org.baeldung.demo.boottest.Employee; -import org.baeldung.demo.boottest.EmployeeRepository; +import com.baeldung.demo.boottest.Employee; +import com.baeldung.demo.boottest.EmployeeRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java similarity index 97% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java index a4b35889d6..327e9f9d56 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.CoreMatchers.is; @@ -14,7 +14,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.io.IOException; import java.util.List; -import org.baeldung.demo.DemoApplication; +import com.baeldung.demo.DemoApplication; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java similarity index 94% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java index df28111a57..88f2830a2b 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import static org.assertj.core.api.Assertions.assertThat; @@ -6,6 +6,10 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import com.baeldung.demo.boottest.Employee; +import com.baeldung.demo.boottest.EmployeeRepository; +import com.baeldung.demo.boottest.EmployeeService; +import com.baeldung.demo.boottest.EmployeeServiceImpl; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/JsonUtil.java similarity index 91% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/JsonUtil.java index 7e04f47696..3fcd709f7c 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/demo/boottest/JsonUtil.java @@ -1,4 +1,4 @@ -package org.baeldung.demo.boottest; +package com.baeldung.demo.boottest; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java similarity index 92% rename from spring-boot-modules/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java rename to spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java index ea7f118967..a1318949f3 100644 --- a/spring-boot-modules/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java +++ b/spring-boot-modules/spring-boot/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java @@ -1,7 +1,8 @@ -package org.baeldung.repository; +package com.baeldung.repository; -import org.baeldung.boot.config.H2JpaConfig; -import org.baeldung.model.User; +import com.baeldung.boot.config.H2JpaConfig; +import com.baeldung.model.User; +import com.baeldung.repository.UserRepository; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; From 2d0f2c171bba3b8d970de9e8e76c9e78ea07d124 Mon Sep 17 00:00:00 2001 From: mikr Date: Sat, 4 Apr 2020 20:40:09 +0200 Subject: [PATCH 301/530] JAVA-117 Standardize spring-boot-modules/spring-boot-client --- .../main/java/{org => com}/baeldung/boot/Application.java | 2 +- .../java/{org => com}/baeldung/boot/client/Details.java | 2 +- .../baeldung/boot/client/DetailsServiceClient.java | 2 +- .../{org => com}/baeldung/websocket/client/Message.java | 2 +- .../baeldung/websocket/client/MyStompSessionHandler.java | 2 +- .../{org => com}/baeldung/websocket/client/StompClient.java | 2 +- .../test/java/{org => com}/baeldung/SpringContextTest.java | 4 ++-- .../boot/client/DetailsServiceClientIntegrationTest.java | 6 ++++-- .../client/MyStompSessionHandlerIntegrationTest.java | 1 - 9 files changed, 12 insertions(+), 11 deletions(-) rename spring-boot-modules/spring-boot-client/src/main/java/{org => com}/baeldung/boot/Application.java (93%) rename spring-boot-modules/spring-boot-client/src/main/java/{org => com}/baeldung/boot/client/Details.java (93%) rename spring-boot-modules/spring-boot-client/src/main/java/{org => com}/baeldung/boot/client/DetailsServiceClient.java (93%) rename spring-boot-modules/spring-boot-client/src/main/java/{org => com}/baeldung/websocket/client/Message.java (89%) rename spring-boot-modules/spring-boot-client/src/main/java/{org => com}/baeldung/websocket/client/MyStompSessionHandler.java (97%) rename spring-boot-modules/spring-boot-client/src/main/java/{org => com}/baeldung/websocket/client/StompClient.java (96%) rename spring-boot-modules/spring-boot-client/src/test/java/{org => com}/baeldung/SpringContextTest.java (86%) rename spring-boot-modules/spring-boot-client/src/test/java/{org => com}/baeldung/boot/client/DetailsServiceClientIntegrationTest.java (90%) diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/Application.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/Application.java similarity index 93% rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/Application.java rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/Application.java index c1b6558b26..cb0d0c1532 100644 --- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/Application.java +++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/Application.java @@ -1,4 +1,4 @@ -package org.baeldung.boot; +package com.baeldung.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/Details.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/Details.java similarity index 93% rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/Details.java rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/Details.java index 1e3ddf7b21..c806476634 100644 --- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/Details.java +++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/Details.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.client; +package com.baeldung.boot.client; public class Details { diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/DetailsServiceClient.java similarity index 93% rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/DetailsServiceClient.java index f2b9d6d030..a9f1b08c97 100644 --- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java +++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/boot/client/DetailsServiceClient.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.client; +package com.baeldung.boot.client; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Service; diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/Message.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/Message.java similarity index 89% rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/Message.java rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/Message.java index 2744c49f62..19140f76a2 100644 --- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/Message.java +++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/Message.java @@ -1,4 +1,4 @@ -package org.baeldung.websocket.client; +package com.baeldung.websocket.client; public class Message { diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/MyStompSessionHandler.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/MyStompSessionHandler.java similarity index 97% rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/MyStompSessionHandler.java rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/MyStompSessionHandler.java index 92beab9430..8ccc42c58a 100644 --- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/MyStompSessionHandler.java +++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/MyStompSessionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.websocket.client; +package com.baeldung.websocket.client; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/StompClient.java b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/StompClient.java similarity index 96% rename from spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/StompClient.java rename to spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/StompClient.java index 2bff07186d..04d87dd2ed 100644 --- a/spring-boot-modules/spring-boot-client/src/main/java/org/baeldung/websocket/client/StompClient.java +++ b/spring-boot-modules/spring-boot-client/src/main/java/com/baeldung/websocket/client/StompClient.java @@ -1,4 +1,4 @@ -package org.baeldung.websocket.client; +package com.baeldung.websocket.client; import java.util.Scanner; diff --git a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/SpringContextTest.java similarity index 86% rename from spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/SpringContextTest.java rename to spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/SpringContextTest.java index 9c3b83ea79..1341f17eac 100644 --- a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.boot.Application; +import com.baeldung.boot.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/boot/client/DetailsServiceClientIntegrationTest.java similarity index 90% rename from spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java rename to spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/boot/client/DetailsServiceClientIntegrationTest.java index d423300b85..4af5370950 100644 --- a/spring-boot-modules/spring-boot-client/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java +++ b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/boot/client/DetailsServiceClientIntegrationTest.java @@ -1,10 +1,12 @@ -package org.baeldung.boot.client; +package com.baeldung.boot.client; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; -import org.baeldung.boot.Application; +import com.baeldung.boot.Application; +import com.baeldung.boot.client.Details; +import com.baeldung.boot.client.DetailsServiceClient; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java index bb1b5e254e..57eec935f6 100644 --- a/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-client/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.websocket.client; -import org.baeldung.websocket.client.MyStompSessionHandler; import org.junit.Test; import org.mockito.Mockito; import org.springframework.messaging.simp.stomp.StompHeaders; From ba65e099896cce714f3616329971d58c47dfa99d Mon Sep 17 00:00:00 2001 From: gindex Date: Sat, 28 Mar 2020 19:01:54 +0100 Subject: [PATCH 302/530] Add blocking and non-blocking mono examples Add article reference Fix url --- reactor-core/README.md | 1 + .../java/com/baeldung/mono/MonoUnitTest.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java diff --git a/reactor-core/README.md b/reactor-core/README.md index e3cca35f86..f2dbd77981 100644 --- a/reactor-core/README.md +++ b/reactor-core/README.md @@ -7,3 +7,4 @@ This module contains articles about Reactor Core. - [Intro To Reactor Core](https://www.baeldung.com/reactor-core) - [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams) - [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor) +- [How To Get String From Mono In Reactive Java](http://baeldung.com/string-from-mono/) \ No newline at end of file diff --git a/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java new file mode 100644 index 0000000000..b493cd1159 --- /dev/null +++ b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.mono; + +import org.junit.Test; +import reactor.core.publisher.Mono; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.Optional; + +import static org.junit.Assert.assertEquals; + +public class MonoUnitTest { + @Test + public void whenMonoProducesString_thenBlockAndConsume() { + String expected = "hello world!"; + + String result1 = Mono.just(expected).block(); + assertEquals(expected, result1); + + String result2 = Mono.just(expected).block(Duration.of(1000, ChronoUnit.MILLIS)); + assertEquals(expected, result2); + + Optional result3 = Mono.empty().blockOptional(); + assertEquals(Optional.empty(), result3); + } + + @Test + public void whenMonoProducesString_thenConsumeNonBlocking() { + String expected = "hello world!"; + + Mono.just(expected) + .doOnNext(result -> assertEquals(expected, result)) + .subscribe(); + + Mono.just(expected) + .subscribe(result -> assertEquals(expected, result)); + + } +} From 641956f87db3f02e3291cc684e868b9d19b808ad Mon Sep 17 00:00:00 2001 From: mikr Date: Sat, 4 Apr 2020 21:16:51 +0200 Subject: [PATCH 303/530] JAVA-117 Standardize spring-boot-modules/spring-boot-gradle --- spring-boot-modules/spring-boot-gradle/build.gradle | 8 ++++---- .../main/java/{org => com}/baeldung/DemoApplication.java | 2 +- .../java/{org => com}/baeldung/DemoApplicationTests.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) rename spring-boot-modules/spring-boot-gradle/src/main/java/{org => com}/baeldung/DemoApplication.java (92%) rename spring-boot-modules/spring-boot-gradle/src/test/java/{org => com}/baeldung/DemoApplicationTests.java (93%) diff --git a/spring-boot-modules/spring-boot-gradle/build.gradle b/spring-boot-modules/spring-boot-gradle/build.gradle index 96055536c3..faae01a1a5 100644 --- a/spring-boot-modules/spring-boot-gradle/build.gradle +++ b/spring-boot-modules/spring-boot-gradle/build.gradle @@ -21,7 +21,7 @@ apply plugin: 'io.spring.dependency-management' //add tasks thinJar and thinResolve for thin JAR deployments apply plugin: 'org.springframework.boot.experimental.thin-launcher' -group = 'org.baeldung' +group = 'com.baeldung' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 @@ -35,16 +35,16 @@ dependencies { } springBoot { - mainClassName = 'org.baeldung.DemoApplication' + mainClassName = 'com.baeldung.DemoApplication' } bootJar { // This is overridden by the mainClassName in springBoot{} and added here for reference purposes. - mainClassName = 'org.baeldung.DemoApplication' + mainClassName = 'com.baeldung.DemoApplication' // This block serves the same purpose as the above thus commented out. Added here for reference purposes // manifest { -// attributes 'Start-Class': 'org.baeldung.DemoApplication' +// attributes 'Start-Class': 'com.baeldung.DemoApplication' // } } diff --git a/spring-boot-modules/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java b/spring-boot-modules/spring-boot-gradle/src/main/java/com/baeldung/DemoApplication.java similarity index 92% rename from spring-boot-modules/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java rename to spring-boot-modules/spring-boot-gradle/src/main/java/com/baeldung/DemoApplication.java index f8df823f25..64bac6936b 100644 --- a/spring-boot-modules/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java +++ b/spring-boot-modules/spring-boot-gradle/src/main/java/com/baeldung/DemoApplication.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java b/spring-boot-modules/spring-boot-gradle/src/test/java/com/baeldung/DemoApplicationTests.java similarity index 93% rename from spring-boot-modules/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java rename to spring-boot-modules/spring-boot-gradle/src/test/java/com/baeldung/DemoApplicationTests.java index b24bfb2cb6..65395582cb 100644 --- a/spring-boot-modules/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java +++ b/spring-boot-modules/spring-boot-gradle/src/test/java/com/baeldung/DemoApplicationTests.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; From ad889f6bcd2c597f86434b731141ccb4f0321ca1 Mon Sep 17 00:00:00 2001 From: mikr Date: Sat, 4 Apr 2020 21:47:45 +0200 Subject: [PATCH 304/530] JAVA-117 Standardize spring-boot-modules --- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- spring-boot-modules/spring-boot-artifacts/pom.xml | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- spring-boot-modules/spring-boot-deployment/pom.xml | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextLiveTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../properties/external/ExternalPropertiesWithJavaConfig.java | 2 +- .../properties/external/ExternalPropertiesWithXmlConfig.java | 2 +- .../properties/external/ExternalPropertiesWithXmlConfigOne.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../src/main/java/com/baeldung/main/SpringBootApplication.java | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java index 834f26dacf..78a1ab7a54 100644 --- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java index c185456019..3322193134 100644 --- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java index 961d756a68..0f4fa757d6 100644 --- a/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-artifacts/pom.xml b/spring-boot-modules/spring-boot-artifacts/pom.xml index f7c8636593..de9f6ab635 100644 --- a/spring-boot-modules/spring-boot-artifacts/pom.xml +++ b/spring-boot-modules/spring-boot-artifacts/pom.xml @@ -208,7 +208,7 @@ - org.baeldung.boot.Application + com.baeldung.boot.Application 3.1.1 3.3.7-1 2.2 diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java index 8324fabfca..ce743e0f77 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-camel/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java index ff3e795778..ca8989724b 100644 --- a/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-ctx-fluent/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java index e6ce83fab5..b4668e7d2b 100644 --- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java index b82b67df68..7103da97f3 100644 --- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-deployment/pom.xml b/spring-boot-modules/spring-boot-deployment/pom.xml index 64c0e698f6..b3fc3eabd1 100644 --- a/spring-boot-modules/spring-boot-deployment/pom.xml +++ b/spring-boot-modules/spring-boot-deployment/pom.xml @@ -190,7 +190,7 @@ - org.baeldung.boot.Application + com.baeldung.boot.Application 3.1.1 3.3.7-1 2.2 diff --git a/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java index ab6e4557d5..97810cf590 100644 --- a/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-jasypt/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java index 4effccc083..3f3ecd87d0 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-keycloak/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java index 9817522e68..d2660ad84e 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java index 069dd41b8d..209a93d94c 100644 --- a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java index 16e0708fc9..e73f4e79f7 100644 --- a/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-mvc/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java index d43f18f6a7..5b954f8941 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithJavaConfig.java @@ -7,7 +7,7 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration -@ComponentScan("org.baeldung.properties.core") +@ComponentScan("com.baeldung.properties.core") @PropertySource("classpath:foo.properties") public class ExternalPropertiesWithJavaConfig { diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java index 6d105428d9..9080e3d0ba 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfig.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource("classpath:configForProperties.xml") -@ComponentScan("org.baeldung.core") +@ComponentScan("com.baeldung.core") public class ExternalPropertiesWithXmlConfig { public ExternalPropertiesWithXmlConfig() { diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java index 6f1e4c8490..f45f5b6a03 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/external/ExternalPropertiesWithXmlConfigOne.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource("classpath:configForPropertiesOne.xml") -@ComponentScan("org.baeldung.core") +@ComponentScan("com.baeldung.core") public class ExternalPropertiesWithXmlConfigOne { public ExternalPropertiesWithXmlConfigOne() { diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/org/baeldung/SpringContextTest.java index 874c4f582f..2e1a17199d 100644 --- a/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/org/baeldung/SpringContextTest.java index 874c4f582f..2e1a17199d 100644 --- a/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java index 16e0708fc9..e73f4e79f7 100644 --- a/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-vue/src/test/java/org/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java index c8cfb50f1c..383932524f 100644 --- a/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java +++ b/spring-boot-modules/spring-boot/src/main/java/com/baeldung/main/SpringBootApplication.java @@ -18,7 +18,7 @@ import java.util.concurrent.Executors; @RestController @EnableAutoConfiguration -@ComponentScan({ "org.baeldung.common.error", "com.baeldung.common.error.controller", "com.baeldung.common.properties", "com.baeldung.common.resources", "com.baeldung.endpoints", "com.baeldung.service", "com.baeldung.monitor.jmx", "com.baeldung.boot.config" }) +@ComponentScan({ "com.baeldung.common.error", "com.baeldung.common.error.controller", "com.baeldung.common.properties", "com.baeldung.common.resources", "com.baeldung.endpoints", "com.baeldung.service", "com.baeldung.monitor.jmx", "com.baeldung.boot.config" }) public class SpringBootApplication { private static ApplicationContext applicationContext; From 8c5dfc6f173c01ff21b6392393152fad6154bdea Mon Sep 17 00:00:00 2001 From: kwoyke Date: Sun, 5 Apr 2020 07:52:47 +0200 Subject: [PATCH 305/530] BAEL-3978: Add code samples for Objects.equals() (#9033) --- .../comparelong/CompareLongUnitTest.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java index ab4ea2b657..a26b0a74b0 100644 --- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java +++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/comparelong/CompareLongUnitTest.java @@ -1,8 +1,12 @@ package com.baeldung.comparelong; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + import org.junit.Test; +import java.util.Objects; + public class CompareLongUnitTest { @Test @@ -32,6 +36,33 @@ public class CompareLongUnitTest { assertThat(l1.equals(l2)).isTrue(); } + @Test + public void givenLongValuesLessThan128_whenUsingObjectsEquals_thenSuccess() { + + Long l1 = 127L; + Long l2 = 127L; + + assertThat(Objects.equals(l1, l2)).isTrue(); + } + + @Test + public void givenLongValuesGreaterOrEqualsThan128_whenUsingObjectsEquals_thenSuccess() { + + Long l1 = 128L; + Long l2 = 128L; + + assertThat(Objects.equals(l1, l2)).isTrue(); + } + + @Test + public void givenNullReference_whenUsingObjectsEquals_thenNoException() { + + Long l1 = null; + Long l2 = 128L; + + assertThatCode(() -> Objects.equals(l1, l2)).doesNotThrowAnyException(); + } + @Test public void givenLongValuesGreaterOrEqualsThan128_whenUsingComparisonOperator_andLongValue_thenSuccess() { From 6d60aad5f9487c774e364b09b8446b3c23006732 Mon Sep 17 00:00:00 2001 From: Aitor Cuesta Date: Sun, 5 Apr 2020 12:51:27 +0200 Subject: [PATCH 306/530] BAEL-3075 - Initial commit --- .../spring-boot-persistence-2/README.md | 1 + .../spring-boot-persistence-2/pom.xml | 60 +++++++++++++++++-- .../SpringOraclePoolingApplication.java | 29 +++++++++ .../configuration/C3P0Configuration.java | 27 +++++++++ .../configuration/OracleConfiguration.java | 27 +++++++++ .../configuration/OracleUCPConfiguration.java | 30 ++++++++++ .../controller/BookstoreController.java | 45 ++++++++++++++ .../spring/oracle/pooling/entity/Book.java | 45 ++++++++++++++ .../pooling/exception/BookstoreException.java | 10 ++++ .../pooling/repository/BookRepository.java | 9 +++ ...pplication-oracle-pooling-basic.properties | 27 +++++++++ .../src/main/resources/application.yml | 10 +++- .../SpringBootJdbiApplicationUnitTest.java | 4 +- ...gOraclePoolingApplicationC3P0LiveTest.java | 27 +++++++++ ...clePoolingApplicationHikariCPLiveTest.java | 27 +++++++++ ...raclePoolingApplicationOracleLiveTest.java | 27 +++++++++ ...lePoolingApplicationOracleUCPLiveTest.java | 27 +++++++++ 17 files changed, 424 insertions(+), 8 deletions(-) create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplication.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/C3P0Configuration.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/controller/BookstoreController.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/entity/Book.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/exception/BookstoreException.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/repository/BookRepository.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties create mode 100644 persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationC3P0LiveTest.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationHikariCPLiveTest.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleLiveTest.java create mode 100644 persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java diff --git a/persistence-modules/spring-boot-persistence-2/README.md b/persistence-modules/spring-boot-persistence-2/README.md index 5d171fb2ca..a74bf7ff02 100644 --- a/persistence-modules/spring-boot-persistence-2/README.md +++ b/persistence-modules/spring-boot-persistence-2/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi) +- [Oracle Connection Pooling With Spring](https://www.baeldung.com/oracle-connection-pooling-with-spring) \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 048dd45c7f..8f76bce1b3 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -41,10 +41,20 @@ - - org.springframework.boot - spring-boot-starter-jdbc - + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + net.bytebuddy + byte-buddy + org.jdbi @@ -82,6 +92,47 @@ spring-boot-starter-test test + + + com.oracle + ojdbc8 + 12.2.0.1 + system + ${basedir}/lib/ojdbc8.jar + + + + com.oracle + ucp + 12.2.0.1 + system + ${basedir}/lib/ucp.jar + + + + com.oracle + ons + 12.2.0.1 + system + ${basedir}/lib/ons.jar + + + + com.mchange + c3p0 + ${c3p0.version} + + + + org.apache.commons + commons-dbcp2 + + + + org.apache.tomcat + tomcat-jdbc + + @@ -96,6 +147,7 @@ 3.9.1 2.1.8.RELEASE + 0.9.5.2 diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplication.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplication.java new file mode 100644 index 0000000000..fa7f884112 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplication.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.oracle.pooling; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import lombok.extern.slf4j.Slf4j; + +@SpringBootApplication +@Slf4j +public class SpringOraclePoolingApplication implements CommandLineRunner{ + + @Autowired + private DataSource dataSource; + + public static void main(String[] args) { + SpringApplication.run(SpringOraclePoolingApplication.class, args); + } + + @Override + public void run(String... args) throws Exception { + log.info("Connection Polling datasource : "+ dataSource); + + } + +} diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/C3P0Configuration.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/C3P0Configuration.java new file mode 100644 index 0000000000..f357924807 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/C3P0Configuration.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.oracle.pooling.configuration; + +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import com.mchange.v2.c3p0.ComboPooledDataSource; + +@Configuration +@Profile("c3p0") +public class C3P0Configuration { + + @Bean + public DataSource dataSource() throws SQLException { + ComboPooledDataSource dataSource = new ComboPooledDataSource(); + dataSource.setUser("books"); + dataSource.setPassword("books"); + dataSource.setJdbcUrl("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); + dataSource.setMinPoolSize(5); + dataSource.setMaxPoolSize(10); + return dataSource; + } +} diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java new file mode 100644 index 0000000000..327374cb54 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.oracle.pooling.configuration; + +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import oracle.jdbc.pool.OracleDataSource; + +@Configuration +@Profile("oracle") +public class OracleConfiguration { + + @Bean + public DataSource dataSource() throws SQLException { + OracleDataSource dataSource = new OracleDataSource(); + dataSource.setUser("books"); + dataSource.setPassword("books"); + dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); + dataSource.setFastConnectionFailoverEnabled(true); + dataSource.setImplicitCachingEnabled(true); + return dataSource; + } +} diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java new file mode 100644 index 0000000000..67b4b40712 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java @@ -0,0 +1,30 @@ +package com.baeldung.spring.oracle.pooling.configuration; + +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import oracle.ucp.jdbc.PoolDataSource; +import oracle.ucp.jdbc.PoolDataSourceFactory; + +@Configuration +@Profile("oracle-ucp") +public class OracleUCPConfiguration { + + @Bean + public DataSource dataSource() throws SQLException { + PoolDataSource dataSource = PoolDataSourceFactory.getPoolDataSource(); + dataSource.setUser("books"); + dataSource.setPassword("books"); + dataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); + dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); + dataSource.setFastConnectionFailoverEnabled(true); + dataSource.setInitialPoolSize(5); + dataSource.setMaxPoolSize(10); + return dataSource; + } +} diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/controller/BookstoreController.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/controller/BookstoreController.java new file mode 100644 index 0000000000..49b998bfb9 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/controller/BookstoreController.java @@ -0,0 +1,45 @@ +package com.baeldung.spring.oracle.pooling.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.PathVariable; +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.spring.oracle.pooling.entity.Book; +import com.baeldung.spring.oracle.pooling.exception.BookstoreException; +import com.baeldung.spring.oracle.pooling.repository.BookRepository; + +@RestController +@RequestMapping("/books") +public class BookstoreController { + + @Autowired + private BookRepository repository; + + @GetMapping(value = "/hello") + public String sayHello() { + return "Hello"; + } + + @GetMapping("/all") + public List findAll() { + return repository.findAll(); + } + + @PostMapping("/create") + public Book newBook(@RequestBody Book newBook) { + return repository.save(newBook); + } + + @GetMapping("/get/{id}") + public Book findOne(@PathVariable Long id) throws BookstoreException { + return repository.findById(id) + .orElseThrow(BookstoreException::new); + } + +} 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 new file mode 100644 index 0000000000..fb2c3fcf6a --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/entity/Book.java @@ -0,0 +1,45 @@ +package com.baeldung.spring.oracle.pooling.entity; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + public Book() { + } + + public Book(String name) { + this.name = name; + } + + 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; + } + + @Override + public String toString() { + return "Book [id=" + id + ", name=" + name + "]"; + } + +} diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/exception/BookstoreException.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/exception/BookstoreException.java new file mode 100644 index 0000000000..d2fb399ab3 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/exception/BookstoreException.java @@ -0,0 +1,10 @@ +package com.baeldung.spring.oracle.pooling.exception; + +public class BookstoreException extends Exception{ + + /** + * + */ + private static final long serialVersionUID = 1L; + +} diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/repository/BookRepository.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/repository/BookRepository.java new file mode 100644 index 0000000000..a50a1b24a4 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/repository/BookRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.spring.oracle.pooling.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.baeldung.spring.oracle.pooling.entity.Book; + +public interface BookRepository extends JpaRepository{ + +} diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties b/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties new file mode 100644 index 0000000000..9a1c7fc89d --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/application-oracle-pooling-basic.properties @@ -0,0 +1,27 @@ +logging.level.root=INFO + +# OracleDB connection settings +spring.datasource.url=jdbc:oracle:thin:@//localhost:11521/ORCLPDB1 +spring.datasource.username=books +spring.datasource.password=books +spring.datasource.driver-class-name=oracle.jdbc.OracleDriver + +# Comment this line for standard Spring Boot default choosing algorithm +#spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource + +# HikariCP settings +spring.datasource.hikari.minimumIdle=5 +spring.datasource.hikari.maximumPoolSize=20 +spring.datasource.hikari.idleTimeout=30000 +spring.datasource.hikari.maxLifetime=2000000 +spring.datasource.hikari.connectionTimeout=30000 +spring.datasource.hikari.poolName=HikariPoolBooks + +# Tomcat settings +spring.datasource.tomcat.maxActive=15 +spring.datasource.tomcat.minIdle=5 + +# JPA settings +spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect +spring.jpa.hibernate.use-new-id-generator-mappings=false +spring.jpa.hibernate.ddl-auto=create \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-2/src/main/resources/application.yml b/persistence-modules/spring-boot-persistence-2/src/main/resources/application.yml index 8b13789179..4b792fd5dc 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/resources/application.yml +++ b/persistence-modules/spring-boot-persistence-2/src/main/resources/application.yml @@ -1 +1,9 @@ - +# Available profiles +# - none for no profile +# - oracle-pooling-basic - Oracle database with HikariCP. Loads configuration from application-oracle-pooling-basic.properties +# - oracle - Uses OracleDataSource. This profile also needs "oracle-pooling-basic" +# - oracle-ucp - Uses PoolDataSource. This profile also needs "oracle-pooling-basic" +# - c3p0 - Uses ComboPooledDataSource. This profile also needs "oracle-pooling-basic" +spring: + profiles: + active: none \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java index e4b623ee2b..93083f6c4c 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java @@ -5,10 +5,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import org.jdbi.v3.core.Jdbi; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +22,7 @@ import com.baeldung.boot.jdbi.service.CarMakerService; import lombok.extern.slf4j.Slf4j; @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = {SpringBootJdbiApplication.class, JdbiConfiguration.class}) @Slf4j public class SpringBootJdbiApplicationUnitTest { diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationC3P0LiveTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationC3P0LiveTest.java new file mode 100644 index 0000000000..5a2d3f2d29 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationC3P0LiveTest.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.oracle.pooling; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import javax.sql.DataSource; + +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.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = {SpringOraclePoolingApplication.class}) +@ActiveProfiles({"oracle-pooling-basic", "c3p0"}) +public class SpringOraclePoolingApplicationC3P0LiveTest { + + @Autowired + private DataSource dataSource; + + @Test + public void givenC3p0Configuration_thenBuildsComboPooledDataSource() { + assertTrue(dataSource instanceof com.mchange.v2.c3p0.ComboPooledDataSource); + } + +} diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationHikariCPLiveTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationHikariCPLiveTest.java new file mode 100644 index 0000000000..ab8fc1e121 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationHikariCPLiveTest.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.oracle.pooling; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import javax.sql.DataSource; + +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.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = {SpringOraclePoolingApplication.class}) +@ActiveProfiles("oracle-pooling-basic") +public class SpringOraclePoolingApplicationHikariCPLiveTest { + + @Autowired + private DataSource dataSource; + + @Test + public void givenHikariCPConfiguration_thenBuildsHikariCP() { + assertTrue(dataSource instanceof com.zaxxer.hikari.HikariDataSource); + } + +} diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleLiveTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleLiveTest.java new file mode 100644 index 0000000000..229375dadd --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleLiveTest.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.oracle.pooling; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import javax.sql.DataSource; + +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.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = {SpringOraclePoolingApplication.class}) +@ActiveProfiles({"oracle-pooling-basic", "oracle"}) +public class SpringOraclePoolingApplicationOracleLiveTest { + + @Autowired + private DataSource dataSource; + + @Test + public void givenOracleConfiguration_thenBuildsOracleDataSource() { + assertTrue(dataSource instanceof oracle.jdbc.pool.OracleDataSource); + } + +} diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java new file mode 100644 index 0000000000..4fb6aa6bae --- /dev/null +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.oracle.pooling; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import javax.sql.DataSource; + +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.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = {SpringOraclePoolingApplication.class}) +@ActiveProfiles({"oracle-pooling-basic", "oracle-ucp"}) +public class SpringOraclePoolingApplicationOracleUCPLiveTest { + + @Autowired + private DataSource dataSource; + + @Test + public void givenOracleUCPConfiguration_thenBuildsOraclePoolDataSource() { + assertTrue(dataSource instanceof oracle.ucp.jdbc.PoolDataSource); + } + +} From a3c69eba43cd3e32dfa6d78532736a7211e2f824 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sun, 22 Mar 2020 18:36:02 +0100 Subject: [PATCH 307/530] [BAEL-2808] Added tests for physical naming strategies --- .../spring-data-jpa-4/create.sql | 2 + .../default-naming-strategy-ddl.sql | 1 + persistence-modules/spring-data-jpa-4/pom.xml | 5 ++ .../com/baeldung/namingstrategy/Person.java | 36 ++++++++ .../namingstrategy/PersonRepository.java | 6 ++ .../QuotedLowerCaseNamingStrategy.java | 12 +++ ...DataJpaTableAndColumnNamesApplication.java | 7 ++ .../UnquotedLowerCaseNamingStrategy.java | 12 +++ ...owerCaseNamingStrategyIntegrationTest.java | 78 +++++++++++++++++ ...PhysicalNamingStrategyIntegrationTest.java | 82 ++++++++++++++++++ ...owerCaseNamingStrategyIntegrationTest.java | 83 +++++++++++++++++++ ...oted-lower-case-naming-strategy.properties | 9 ++ ...spring-physical-naming-strategy.properties | 9 ++ ...oted-lower-case-naming-strategy.properties | 9 ++ .../upper-case-naming-strategy-ddl.sql | 1 + 15 files changed, 352 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-4/create.sql create mode 100644 persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/PersonRepository.java create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaTableAndColumnNamesApplication.java create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties create mode 100644 persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql diff --git a/persistence-modules/spring-data-jpa-4/create.sql b/persistence-modules/spring-data-jpa-4/create.sql new file mode 100644 index 0000000000..1bbe1640a7 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/create.sql @@ -0,0 +1,2 @@ +create table PERSON (ID int8 not null, FIRST_NAME varchar(255), LAST_NAME varchar(255), primary key (ID)) +create table person (id int8 not null, first_name varchar(255), last_name varchar(255), primary key (id)) diff --git a/persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql b/persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql new file mode 100644 index 0000000000..34d5bd1867 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql @@ -0,0 +1 @@ +create table person (id int8 not null, firstname varchar(255), last_name varchar(255), primary key (id)) diff --git a/persistence-modules/spring-data-jpa-4/pom.xml b/persistence-modules/spring-data-jpa-4/pom.xml index 8a476012c7..71fc21527f 100644 --- a/persistence-modules/spring-data-jpa-4/pom.xml +++ b/persistence-modules/spring-data-jpa-4/pom.xml @@ -33,6 +33,11 @@ mysql-connector-java + + org.postgresql + postgresql + + com.h2database h2 diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java new file mode 100644 index 0000000000..c3e7f50403 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java @@ -0,0 +1,36 @@ +package com.baeldung.namingstrategy; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Person { + @Id + private Long id; + + @Column(name = "FIRSTNAME") + private String firstName; + + private String lastName; + + public Person() {} + + public Person(Long id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + public Long id() { + return id; + } + + public String firstName() { + return firstName; + } + + public String lastName() { + return lastName; + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/PersonRepository.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/PersonRepository.java new file mode 100644 index 0000000000..3c7c25bbcb --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/PersonRepository.java @@ -0,0 +1,6 @@ +package com.baeldung.namingstrategy; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PersonRepository extends JpaRepository { +} diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java new file mode 100644 index 0000000000..16b01e50e3 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java @@ -0,0 +1,12 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy; + +public class QuotedLowerCaseNamingStrategy extends SpringPhysicalNamingStrategy { + @Override + protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) { + return new Identifier(name.toLowerCase(), true); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaTableAndColumnNamesApplication.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaTableAndColumnNamesApplication.java new file mode 100644 index 0000000000..09aaf12b60 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaTableAndColumnNamesApplication.java @@ -0,0 +1,7 @@ +package com.baeldung.namingstrategy; + +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringDataJpaTableAndColumnNamesApplication { +} diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java new file mode 100644 index 0000000000..69e96aee27 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java @@ -0,0 +1,12 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy; + +public class UnquotedLowerCaseNamingStrategy extends SpringPhysicalNamingStrategy { + @Override + protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) { + return new Identifier(name.toLowerCase(), false); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyIntegrationTest.java new file mode 100644 index 0000000000..ffa282da72 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyIntegrationTest.java @@ -0,0 +1,78 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("quoted-lower-case-naming-strategy.properties") +class QuotedLowerCaseNamingStrategyIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonUnquoted_thenException(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyIntegrationTest.java new file mode 100644 index 0000000000..8ad59fe2db --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyIntegrationTest.java @@ -0,0 +1,82 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("spring-physical-naming-strategy.properties") +class SpringPhysicalNamingStrategyIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndDefaultNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndDefaultNamingStrategyAndH2Database_whenQueryPersonQuotedUpperCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndDefaultNamingStrategyAndH2Database_whenQueryPersonQuotedLowerCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyIntegrationTest.java new file mode 100644 index 0000000000..2d84a17526 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyIntegrationTest.java @@ -0,0 +1,83 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("unquoted-lower-case-naming-strategy.properties") +class UnquotedLowerCaseNamingStrategyIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonUnquoted_thenException(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties new file mode 100644 index 0000000000..dce43e2da5 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:h2:mem:custom-lower-case-strategy +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.QuotedLowerCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties new file mode 100644 index 0000000000..a8ba1a3e4d --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:h2:mem:spring-strategy +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=default-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties new file mode 100644 index 0000000000..63f400db0b --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:h2:mem:custom-lower-case-strategy +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UnquotedLowerCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql b/persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql new file mode 100644 index 0000000000..b26697ac66 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql @@ -0,0 +1 @@ +create table "PERSON" ("ID" int8 not null, "FIRSTNAME" varchar(255), "LAST_NAME" varchar(255), primary key ("ID")) From aebba04be7812a3ba020cfddfbc38da245dca10b Mon Sep 17 00:00:00 2001 From: dupirefr Date: Tue, 24 Mar 2020 08:09:31 +0100 Subject: [PATCH 308/530] [BAEL-2808] Added a few tests to illustrate my problem --- .../QuotedUpperCaseNamingStrategy.java | 12 +++ .../UnquotedUpperCaseNamingStrategy.java | 12 +++ ...rCaseNamingStrategyH2IntegrationTest.java} | 5 +- ...NamingStrategyPostgresIntegrationTest.java | 85 +++++++++++++++++++ ...erCaseNamingStrategyH2IntegrationTest.java | 85 +++++++++++++++++++ ...NamingStrategyPostgresIntegrationTest.java | 81 ++++++++++++++++++ ...sicalNamingStrategyH2IntegrationTest.java} | 11 ++- ...NamingStrategyPostgresIntegrationTest.java | 85 +++++++++++++++++++ ...rCaseNamingStrategyH2IntegrationTest.java} | 11 ++- ...NamingStrategyPostgresIntegrationTest.java | 85 +++++++++++++++++++ ...erCaseNamingStrategyH2IntegrationTest.java | 85 +++++++++++++++++++ ...NamingStrategyPostgresIntegrationTest.java | 85 +++++++++++++++++++ ...ase-naming-strategy-on-postgres.properties | 9 ++ ...oted-lower-case-naming-strategy.properties | 4 +- ...ase-naming-strategy-on-postgres.properties | 9 ++ ...oted-upper-case-naming-strategy.properties | 9 ++ ...cal-naming-strategy-on-postgres.properties | 9 ++ ...spring-physical-naming-strategy.properties | 2 +- ...ase-naming-strategy-on-postgres.properties | 9 ++ ...oted-lower-case-naming-strategy.properties | 4 +- ...ase-naming-strategy-on-postgres.properties | 9 ++ ...oted-upper-case-naming-strategy.properties | 9 ++ 22 files changed, 701 insertions(+), 14 deletions(-) create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java create mode 100644 persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{QuotedLowerCaseNamingStrategyIntegrationTest.java => QuotedLowerCaseNamingStrategyH2IntegrationTest.java} (95%) create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{SpringPhysicalNamingStrategyIntegrationTest.java => SpringPhysicalNamingStrategyH2IntegrationTest.java} (85%) create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresIntegrationTest.java rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{UnquotedLowerCaseNamingStrategyIntegrationTest.java => UnquotedLowerCaseNamingStrategyH2IntegrationTest.java} (91%) create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties create mode 100644 persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java new file mode 100644 index 0000000000..3cb62aa5a2 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java @@ -0,0 +1,12 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy; + +public class QuotedUpperCaseNamingStrategy extends SpringPhysicalNamingStrategy { + @Override + protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) { + return new Identifier(name.toUpperCase(), true); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java new file mode 100644 index 0000000000..cb87af10f4 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java @@ -0,0 +1,12 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy; + +public class UnquotedUpperCaseNamingStrategy extends SpringPhysicalNamingStrategy { + @Override + protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) { + return new Identifier(name.toUpperCase(), false); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java similarity index 95% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java index ffa282da72..71a4dbda3f 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-lower-case-naming-strategy.properties") -class QuotedLowerCaseNamingStrategyIntegrationTest { +class QuotedLowerCaseNamingStrategyH2IntegrationTest { @PersistenceContext private EntityManager entityManager; @@ -45,6 +45,7 @@ class QuotedLowerCaseNamingStrategyIntegrationTest { void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonUnquoted_thenException(String tableName) { Query query = entityManager.createNativeQuery("select * from " + tableName); + // Unexpected result assertThrows(SQLGrammarException.class, query::getResultStream); } @@ -52,6 +53,7 @@ class QuotedLowerCaseNamingStrategyIntegrationTest { void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + // Expected result assertThrows(SQLGrammarException.class, query::getResultStream); } @@ -59,6 +61,7 @@ class QuotedLowerCaseNamingStrategyIntegrationTest { void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { Query query = entityManager.createNativeQuery("select * from \"person\""); + // Expected result List result = (List) query.getResultStream() .map(this::fromDatabase) .collect(Collectors.toList()); diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java new file mode 100644 index 0000000000..79c47e86e0 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java @@ -0,0 +1,85 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("quoted-lower-case-naming-strategy-on-postgres.properties") +class QuotedLowerCaseNamingStrategyPostgresIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + // Expected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java new file mode 100644 index 0000000000..f819327a5c --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java @@ -0,0 +1,85 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("quoted-upper-case-naming-strategy.properties") +class QuotedUpperCaseNamingStrategyH2IntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonUnquoted_thenException(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + // Expected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java new file mode 100644 index 0000000000..20250a7ecb --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java @@ -0,0 +1,81 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("quoted-upper-case-naming-strategy-on-postgres.properties") +class QuotedUpperCaseNamingStrategyPostgresIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + // Unexpected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + // Expected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java similarity index 85% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java index 8ad59fe2db..1850fea173 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("spring-physical-naming-strategy.properties") -class SpringPhysicalNamingStrategyIntegrationTest { +class SpringPhysicalNamingStrategyH2IntegrationTest { @PersistenceContext private EntityManager entityManager; @@ -42,9 +42,10 @@ class SpringPhysicalNamingStrategyIntegrationTest { @ParameterizedTest @ValueSource(strings = {"person", "PERSON", "Person"}) - void givenPeopleAndDefaultNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + void givenPeopleAndSpringNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { Query query = entityManager.createNativeQuery("select * from " + tableName); + // Expected result List result = (List) query.getResultStream() .map(this::fromDatabase) .collect(Collectors.toList()); @@ -53,9 +54,10 @@ class SpringPhysicalNamingStrategyIntegrationTest { } @Test - void givenPeopleAndDefaultNamingStrategyAndH2Database_whenQueryPersonQuotedUpperCase_thenResult() { + void givenPeopleAndSpringNamingStrategy_whenQueryPersonQuotedUpperCase_thenResult() { Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + // Unexpected result List result = (List) query.getResultStream() .map(this::fromDatabase) .collect(Collectors.toList()); @@ -64,9 +66,10 @@ class SpringPhysicalNamingStrategyIntegrationTest { } @Test - void givenPeopleAndDefaultNamingStrategyAndH2Database_whenQueryPersonQuotedLowerCase_thenException() { + void givenPeopleAndSpringNamingStrategy_whenQueryPersonQuotedLowerCase_thenException() { Query query = entityManager.createNativeQuery("select * from \"person\""); + // Unexpected result assertThrows(SQLGrammarException.class, query::getResultStream); } diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresIntegrationTest.java new file mode 100644 index 0000000000..97f2b601b0 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresIntegrationTest.java @@ -0,0 +1,85 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("spring-physical-naming-strategy-on-postgres.properties") +class SpringPhysicalNamingStrategyPostgresIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndSpringNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndSpringNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + // Expected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + @Test + void givenPeopleAndSpringNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java similarity index 91% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java index 2d84a17526..6311c42e93 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java @@ -24,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-lower-case-naming-strategy.properties") -class UnquotedLowerCaseNamingStrategyIntegrationTest { +class UnquotedLowerCaseNamingStrategyH2IntegrationTest { @PersistenceContext private EntityManager entityManager; @@ -43,9 +43,10 @@ class UnquotedLowerCaseNamingStrategyIntegrationTest { @ParameterizedTest @ValueSource(strings = {"person", "PERSON", "Person"}) - void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonUnquoted_thenException(String tableName) { + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { Query query = entityManager.createNativeQuery("select * from " + tableName); + // Expected result List result = (List) query.getResultStream() .map(this::fromDatabase) .collect(Collectors.toList()); @@ -54,9 +55,10 @@ class UnquotedLowerCaseNamingStrategyIntegrationTest { } @Test - void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenResult() { Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + // Unexpected result List result = (List) query.getResultStream() .map(this::fromDatabase) .collect(Collectors.toList()); @@ -65,9 +67,10 @@ class UnquotedLowerCaseNamingStrategyIntegrationTest { } @Test - void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenException() { Query query = entityManager.createNativeQuery("select * from \"person\""); + // Unexpected result assertThrows(SQLGrammarException.class, query::getResultStream); } diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java new file mode 100644 index 0000000000..4e1d69ccdb --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java @@ -0,0 +1,85 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("unquoted-lower-case-naming-strategy-on-postgres.properties") +class UnquotedLowerCaseNamingStrategyPostgresIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + // Expected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + @Test + void givenPeopleAndLowerCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java new file mode 100644 index 0000000000..7af8001854 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java @@ -0,0 +1,85 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("unquoted-upper-case-naming-strategy.properties") +class UnquotedUpperCaseNamingStrategyH2IntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + // Expected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java new file mode 100644 index 0000000000..0fdb05b0ee --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java @@ -0,0 +1,85 @@ +package com.baeldung.namingstrategy; + +import org.hibernate.exception.SQLGrammarException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.TestPropertySource; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) +@TestPropertySource("unquoted-upper-case-naming-strategy-on-postgres.properties") +class UnquotedUpperCaseNamingStrategyPostgresIntegrationTest { + + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private PersonRepository personRepository; + + @BeforeEach + void insertPeople() { + personRepository.saveAll(Arrays.asList( + new Person(1L, "John", "Doe"), + new Person(2L, "Jane", "Doe"), + new Person(3L, "Ted", "Mosby") + )); + } + + @ParameterizedTest + @ValueSource(strings = {"person", "PERSON", "Person"}) + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonUnquoted_thenResult(String tableName) { + Query query = entityManager.createNativeQuery("select * from " + tableName); + + // Expected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedUpperCase_thenException() { + Query query = entityManager.createNativeQuery("select * from \"PERSON\""); + + // Unexpected result + assertThrows(SQLGrammarException.class, query::getResultStream); + } + + @Test + void givenPeopleAndUpperCaseNamingStrategy_whenQueryPersonQuotedLowerCase_thenResult() { + Query query = entityManager.createNativeQuery("select * from \"person\""); + + // Unexpected result + List result = (List) query.getResultStream() + .map(this::fromDatabase) + .collect(Collectors.toList()); + + assertThat(result).isNotEmpty(); + } + + public Person fromDatabase(Object databaseRow) { + Object[] typedDatabaseRow = (Object[]) databaseRow; + + return new Person( + ((BigInteger) typedDatabaseRow[0]).longValue(), + (String) typedDatabaseRow[1], + (String) typedDatabaseRow[2] + ); + } +} diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties new file mode 100644 index 0000000000..04b29de41f --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/quoted-lower-case-strategy +spring.datasource.username=postgres +spring.datasource.password=root + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.QuotedLowerCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties index dce43e2da5..6643c12c8a 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties @@ -1,8 +1,8 @@ -spring.datasource.url=jdbc:h2:mem:custom-lower-case-strategy +spring.datasource.url=jdbc:h2:mem:quoted-lower-case-strategy spring.datasource.username=sa spring.datasource.password= -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.QuotedLowerCaseNamingStrategy #spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata #spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties new file mode 100644 index 0000000000..36898d5b4f --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/quoted-upper-case-strategy +spring.datasource.username=postgres +spring.datasource.password=root + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.QuotedUpperCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties new file mode 100644 index 0000000000..6d56d58749 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:h2:mem:quoted-upper-case-strategy +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.QuotedUpperCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties new file mode 100644 index 0000000000..706b12b1b6 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/spring-strategy +spring.datasource.username=postgres +spring.datasource.password=root + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=default-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties index a8ba1a3e4d..c9a0c6f24c 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties @@ -2,7 +2,7 @@ spring.datasource.url=jdbc:h2:mem:spring-strategy spring.datasource.username=sa spring.datasource.password= -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy #spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata #spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties new file mode 100644 index 0000000000..b22472bd8f --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/unquoted-lower-case-strategy +spring.datasource.username=postgres +spring.datasource.password=root + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UnquotedLowerCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties index 63f400db0b..8083515b4b 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties @@ -1,8 +1,8 @@ -spring.datasource.url=jdbc:h2:mem:custom-lower-case-strategy +spring.datasource.url=jdbc:h2:mem:unquoted-lower-case-strategy spring.datasource.username=sa spring.datasource.password= -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UnquotedLowerCaseNamingStrategy #spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata #spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties new file mode 100644 index 0000000000..da03a0d7b5 --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/unquoted-upper-case-strategy +spring.datasource.username=postgres +spring.datasource.password=root + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UnquotedUpperCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties new file mode 100644 index 0000000000..d1b63e008c --- /dev/null +++ b/persistence-modules/spring-data-jpa-4/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties @@ -0,0 +1,9 @@ +spring.datasource.url=jdbc:h2:mem:unquoted-upper-case-strategy +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UnquotedUpperCaseNamingStrategy +#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata +#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create +#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=upper-case-naming-strategy-ddl.sql \ No newline at end of file From daab2b383ff6059a9a64af89300e3adc2ae1d743 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Wed, 1 Apr 2020 23:10:07 +0200 Subject: [PATCH 309/530] [BAEL-2808] Last fix --- .../spring-data-jpa-4/default-naming-strategy-ddl.sql | 1 - .../src/main/java/com/baeldung/namingstrategy/Person.java | 1 - .../spring-data-jpa-4/upper-case-naming-strategy-ddl.sql | 1 - 3 files changed, 3 deletions(-) delete mode 100644 persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql delete mode 100644 persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql diff --git a/persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql b/persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql deleted file mode 100644 index 34d5bd1867..0000000000 --- a/persistence-modules/spring-data-jpa-4/default-naming-strategy-ddl.sql +++ /dev/null @@ -1 +0,0 @@ -create table person (id int8 not null, firstname varchar(255), last_name varchar(255), primary key (id)) diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java index c3e7f50403..cfb6e67c2c 100644 --- a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/Person.java @@ -9,7 +9,6 @@ public class Person { @Id private Long id; - @Column(name = "FIRSTNAME") private String firstName; private String lastName; diff --git a/persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql b/persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql deleted file mode 100644 index b26697ac66..0000000000 --- a/persistence-modules/spring-data-jpa-4/upper-case-naming-strategy-ddl.sql +++ /dev/null @@ -1 +0,0 @@ -create table "PERSON" ("ID" int8 not null, "FIRSTNAME" varchar(255), "LAST_NAME" varchar(255), primary key ("ID")) From c73b8dbf724d4fe5bc2a3f4b5ffbb424b4747c22 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sun, 5 Apr 2020 16:16:27 +0200 Subject: [PATCH 310/530] [BAEL-2808] Migrated PostgreSQL tests to LiveTest --- ...ation.java => SpringDataJpaNamingConventionApplication.java} | 2 +- ....java => QuotedLowerCaseNamingStrategyPostgresLiveTest.java} | 2 +- ....java => QuotedUpperCaseNamingStrategyPostgresLiveTest.java} | 2 +- ...t.java => SpringPhysicalNamingStrategyPostgresLiveTest.java} | 2 +- ...ava => UnquotedLowerCaseNamingStrategyPostgresLiveTest.java} | 2 +- ...ava => UnquotedUpperCaseNamingStrategyPostgresLiveTest.java} | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/{SpringDataJpaTableAndColumnNamesApplication.java => SpringDataJpaNamingConventionApplication.java} (69%) rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java => QuotedLowerCaseNamingStrategyPostgresLiveTest.java} (97%) rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java => QuotedUpperCaseNamingStrategyPostgresLiveTest.java} (97%) rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{SpringPhysicalNamingStrategyPostgresIntegrationTest.java => SpringPhysicalNamingStrategyPostgresLiveTest.java} (97%) rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java => UnquotedLowerCaseNamingStrategyPostgresLiveTest.java} (97%) rename persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/{UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java => UnquotedUpperCaseNamingStrategyPostgresLiveTest.java} (97%) diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaTableAndColumnNamesApplication.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java similarity index 69% rename from persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaTableAndColumnNamesApplication.java rename to persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java index 09aaf12b60..f223015db8 100644 --- a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaTableAndColumnNamesApplication.java +++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java @@ -3,5 +3,5 @@ package com.baeldung.namingstrategy; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class SpringDataJpaTableAndColumnNamesApplication { +public class SpringDataJpaNamingConventionApplication { } diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java similarity index 97% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java index 79c47e86e0..6b1c984600 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-lower-case-naming-strategy-on-postgres.properties") -class QuotedLowerCaseNamingStrategyPostgresIntegrationTest { +class QuotedLowerCaseNamingStrategyPostgresLiveTest { @PersistenceContext private EntityManager entityManager; diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java similarity index 97% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java index 20250a7ecb..bd23b81b4b 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-upper-case-naming-strategy-on-postgres.properties") -class QuotedUpperCaseNamingStrategyPostgresIntegrationTest { +class QuotedUpperCaseNamingStrategyPostgresLiveTest { @PersistenceContext private EntityManager entityManager; diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java similarity index 97% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java index 97f2b601b0..e26ebb148d 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("spring-physical-naming-strategy-on-postgres.properties") -class SpringPhysicalNamingStrategyPostgresIntegrationTest { +class SpringPhysicalNamingStrategyPostgresLiveTest { @PersistenceContext private EntityManager entityManager; diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java similarity index 97% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java index 4e1d69ccdb..033a213cf5 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-lower-case-naming-strategy-on-postgres.properties") -class UnquotedLowerCaseNamingStrategyPostgresIntegrationTest { +class UnquotedLowerCaseNamingStrategyPostgresLiveTest { @PersistenceContext private EntityManager entityManager; diff --git a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java similarity index 97% rename from persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java index 0fdb05b0ee..0151e7ece4 100644 --- a/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-upper-case-naming-strategy-on-postgres.properties") -class UnquotedUpperCaseNamingStrategyPostgresIntegrationTest { +class UnquotedUpperCaseNamingStrategyPostgresLiveTest { @PersistenceContext private EntityManager entityManager; From b2bc2dca8f3651e54edf7e62c8be87601ba1bd92 Mon Sep 17 00:00:00 2001 From: Aitor Cuesta Date: Sun, 5 Apr 2020 17:10:49 +0200 Subject: [PATCH 311/530] BAEL-3075 - Adding ojdbc8.jar, ons.jar and ucp.jar --- .../spring-boot-persistence-2/lib/ons.jar | Bin 0 -> 139977 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 persistence-modules/spring-boot-persistence-2/lib/ons.jar diff --git a/persistence-modules/spring-boot-persistence-2/lib/ons.jar b/persistence-modules/spring-boot-persistence-2/lib/ons.jar new file mode 100644 index 0000000000000000000000000000000000000000..637cf11887b54ddf4d567b7251ee51a18d235af7 GIT binary patch literal 139977 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 z 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 z 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

ewb;D-r7XArVu8KG|V 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 f6l~YCbtn6nEB3w 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 OhYSiT6$(iBp#BHktRXf4 literal 0 HcmV?d00001 From b30ee628059d55773e18420d9ed8df9f079678eb Mon Sep 17 00:00:00 2001 From: Belma Jakupovic Date: Mon, 6 Apr 2020 20:22:28 +0200 Subject: [PATCH 312/530] Belma Jakupovic - Mockito additional answers (#9041) --- .../mockito/additionalanswers/Book.java | 58 ++++++++++++++++ .../additionalanswers/BookRepository.java | 17 +++++ .../additionalanswers/BookService.java | 22 ++++++ .../BookServiceUnitTest.java | 68 +++++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java create mode 100644 testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java new file mode 100644 index 0000000000..fa021f8cba --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java @@ -0,0 +1,58 @@ +package com.baeldung.mockito.additionalanswers; + +public class Book { + + private Long bookId; + + private String title; + + private String author; + + private int numberOfPages; + + public Book(String title, String author, int numberOfPages) { + this.title = title; + this.author = author; + this.numberOfPages = numberOfPages; + } + + public Book(Long bookId, String title, String author, int numberOfPages) { + this.bookId = bookId; + this.title = title; + this.author = author; + this.numberOfPages = numberOfPages; + } + + public Long getBookId() { + return bookId; + } + + public void setBookId(Long bookId) { + this.bookId = bookId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public int getNumberOfPages() { + return numberOfPages; + } + + public void setNumberOfPages(int numberOfPages) { + this.numberOfPages = numberOfPages; + } +} + diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java new file mode 100644 index 0000000000..78187e3f01 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java @@ -0,0 +1,17 @@ +package com.baeldung.mockito.additionalanswers; + +public class BookRepository { + public Book getByBookId(Long bookId) { + return new Book(bookId, "To Kill a Mocking Bird", "Harper Lee", 256); + } + + public Book save(Book book) { + return new Book(book.getBookId(), book.getTitle(), book.getAuthor(), book.getNumberOfPages()); + } + + public Book checkIfEquals(Book bookOne, Book bookTwo, Book bookThree) { + if (bookOne.equals(bookTwo) && bookTwo.equals(bookThree) && bookThree.equals(bookOne)) { + return bookOne; + } else return bookTwo; + } +} diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java new file mode 100644 index 0000000000..92c01f8a70 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java @@ -0,0 +1,22 @@ +package com.baeldung.mockito.additionalanswers; + +public class BookService { + private final BookRepository bookRepository; + + public BookService(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + public Book getByBookId(Long id) { + return bookRepository.getByBookId(id); + } + + public Book save(Book book) { + return bookRepository.save(book); + } + + public Book checkifEquals(Book book1, Book book2, Book book3) { + return bookRepository.checkIfEquals(book1, book2, book3); + } +} + diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java new file mode 100644 index 0000000000..c9527ec0ec --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.mockito.additionalanswers; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.AdditionalAnswers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; + +@RunWith(MockitoJUnitRunner.class) +public class BookServiceUnitTest { + @InjectMocks + private BookService bookService; + + @Mock + private BookRepository bookRepository; + + @Test + public void givenSaveMethodMocked_whenSaveInvoked_ThenReturnFirstArgument_UnitTest() { + Book book = new Book("To Kill a Mocking Bird", "Harper Lee", 256); + Mockito.when(bookRepository.save(any(Book.class))).then(AdditionalAnswers.returnsFirstArg()); + + Book savedBook = bookService.save(book); + + assertEquals(savedBook, book); + } + + @Test + public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnSecondArgument_UnitTest() { + Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456); + Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); + Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); + + Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsSecondArg()); + + Book secondBook = bookService.checkifEquals(book1, book2, book3); + + assertEquals(secondBook, book2); + } + + @Test + public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnLastArgument_UnitTest() { + Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456); + Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); + Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); + + Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsLastArg()); + + Book lastBook = bookService.checkifEquals(book1, book2, book3); + assertEquals(lastBook, book3); + } + + @Test + public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnArgumentAtIndex_UnitTest() { + Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456); + Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); + Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); + + Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsArgAt(1)); + + Book bookOnIndex = bookService.checkifEquals(book1, book2, book3); + + assertEquals(bookOnIndex, book2); + } +} From ab6fee6012ba5ab83ab4263ea3a53a771b4f7ecf Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Mon, 6 Apr 2020 22:21:24 +0200 Subject: [PATCH 313/530] BAEL-3868 - Fix the integrations tests in mocks (#9039) * BAEL-3491 - Check for null before calling parse in the Double.parseDouble * BAEL-3491 - Check for null before calling parse in the Double.parseDouble - Return to indentation with spaces. * BAEL-3854 - Pattern Matching for instanceof in Java 14 * BAEL-3854 - Pattern Matching for instanceof in Java 14 - add unit test * BAEL-3868 - Fix the integrations tests in mocks Co-authored-by: Jonathan Cook --- .../jmockit/ExpectationsCollaborator.java | 2 +- .../jmockit/ExpectationsIntegrationTest.java | 35 ++++++++++--------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java index 799e7721e0..1aafa28a6a 100644 --- a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java +++ b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/ExpectationsCollaborator.java @@ -15,5 +15,5 @@ public interface ExpectationsCollaborator { void methodForArgThat(Object o); String methodReturnsString(); int methodReturnsInt(); - Object methodForDelegate(int i); + int methodForDelegate(int i); } diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java index 8b0c3ab4ec..1ff90111d1 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java @@ -1,21 +1,21 @@ package com.baeldung.jmockit; -import com.baeldung.jmockit.ExpectationsCollaborator; -import com.baeldung.jmockit.Model; -import mockit.Delegate; -import mockit.Expectations; -import mockit.Mocked; -import mockit.Verifications; -import mockit.integration.junit4.JMockit; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; +import mockit.Delegate; +import mockit.Expectations; +import mockit.Mocked; +import mockit.Verifications; +import mockit.integration.junit4.JMockit; @RunWith(JMockit.class) @SuppressWarnings("unchecked") @@ -112,17 +112,16 @@ public class ExpectationsIntegrationTest { result = "foo"; result = new Exception(); result = "bar"; - mock.methodReturnsInt(); - result = new int[]{1, 2, 3}; - mock.methodReturnsString(); returns("foo", "bar"); mock.methodReturnsInt(); + result = new int[]{1, 2, 3}; result = 1; }}; assertEquals("Should return foo", "foo", mock.methodReturnsString()); try { mock.methodReturnsString(); + fail("Shouldn't reach here"); } catch (Exception e) { // NOOP } @@ -134,13 +133,14 @@ public class ExpectationsIntegrationTest { assertEquals("Should return bar", "bar", mock.methodReturnsString()); assertEquals("Should return 1", 1, mock.methodReturnsInt()); } - + @Test public void testDelegate(@Mocked ExpectationsCollaborator mock) { new Expectations() {{ mock.methodForDelegate(anyInt); - result = new Delegate() { - public int delegate(int i) throws Exception { + + result = new Delegate() { + int delegate(int i) throws Exception { if (i < 3) { return 5; } else { @@ -153,6 +153,7 @@ public class ExpectationsIntegrationTest { assertEquals("Should return 5", 5, mock.methodForDelegate(1)); try { mock.methodForDelegate(3); + fail("Shouldn't reach here"); } catch (Exception e) { } } From ad669c87a4c4de7df98f6dddf5db813cd76b254d Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 6 Apr 2020 22:28:19 +0200 Subject: [PATCH 314/530] JAVA-1201: Disable libraries-concurrency in the main pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e21c13efc2..bc9b820766 100644 --- a/pom.xml +++ b/pom.xml @@ -1263,7 +1263,7 @@ wildfly xml xstream - libraries-concurrency + From 7f010f0f98ee07b1fc42237bc864a30ea622596a Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Tue, 7 Apr 2020 08:50:55 +0200 Subject: [PATCH 315/530] Revert "JAVA-1201: Disable libraries-concurrency in the main pom.xml" This reverts commit ad669c87a4c4de7df98f6dddf5db813cd76b254d. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bc9b820766..e21c13efc2 100644 --- a/pom.xml +++ b/pom.xml @@ -1263,7 +1263,7 @@ wildfly xml xstream - + libraries-concurrency From 5bd296e8d0470a9eea32f8b7c42e56b992e222f7 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Tue, 7 Apr 2020 08:52:00 +0200 Subject: [PATCH 316/530] JAVA-1201: Disable coroutines-with-quasar as it needs Java 12 --- libraries-concurrency/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml index 7ae834025f..cb59b17674 100644 --- a/libraries-concurrency/pom.xml +++ b/libraries-concurrency/pom.xml @@ -14,7 +14,7 @@ - coroutines-with-quasar + \ No newline at end of file From 222a1363756975e00c7580f40db6ab3190457fcd Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 15:02:49 +0800 Subject: [PATCH 317/530] Update README.md --- cas/cas-server/README.md | 145 --------------------------------------- 1 file changed, 145 deletions(-) diff --git a/cas/cas-server/README.md b/cas/cas-server/README.md index b224738732..8b13789179 100644 --- a/cas/cas-server/README.md +++ b/cas/cas-server/README.md @@ -1,146 +1 @@ -CAS Overlay Template [![Build Status](https://travis-ci.org/apereo/cas-overlay-template.svg?branch=master)](https://travis-ci.org/apereo/cas-overlay-template) -======================= -Generic CAS WAR overlay to exercise the latest versions of CAS. This overlay could be freely used as a starting template for local CAS war overlays. - -# Versions - -- CAS `6.1.x` -- JDK `11` - -# Overview - -To build the project, use: - -```bash -# Use --refresh-dependencies to force-update SNAPSHOT versions -./gradlew[.bat] clean build -``` - -To see what commands are available to the build script, run: - -```bash -./gradlew[.bat] tasks -``` - -To launch into the CAS command-line shell: - -```bash -./gradlew[.bat] downloadShell runShell -``` - -To fetch and overlay a CAS resource or view, use: - -```bash -./gradlew[.bat] getResource -PresourceName=[resource-name] -``` - -To list all available CAS views and templates: - -```bash -./gradlew[.bat] listTemplateViews -``` - -To unzip and explode the CAS web application file and the internal resources jar: - -```bash -./gradlew[.bat] explodeWar -``` - -# Configuration - -- The `etc` directory contains the configuration files and directories that need to be copied to `/etc/cas/config`. - -```bash -./gradlew[.bat] copyCasConfiguration -``` - -- The specifics of the build are controlled using the `gradle.properties` file. - -## Adding Modules - -CAS modules may be specified under the `dependencies` block of the [Gradle build script](build.gradle): - -```gradle -dependencies { - compile "org.apereo.cas:cas-server-some-module:${project.casVersion}" - ... -} -``` - -To collect the list of all project modules and dependencies: - -```bash -./gradlew[.bat] allDependencies -``` - -### Clear Gradle Cache - -If you need to, on Linux/Unix systems, you can delete all the existing artifacts (artifacts and metadata) Gradle has downloaded using: - -```bash -# Only do this when absolutely necessary -rm -rf $HOME/.gradle/caches/ -``` - -Same strategy applies to Windows too, provided you switch `$HOME` to its equivalent in the above command. - -# Deployment - -- Create a keystore file `thekeystore` under `/etc/cas`. Use the password `changeit` for both the keystore and the key/certificate entries. This can either be done using the JDK's `keytool` utility or via the following command: - -```bash -./gradlew[.bat] createKeystore -``` - -- Ensure the keystore is loaded up with keys and certificates of the server. - -On a successful deployment via the following methods, CAS will be available at: - -* `https://cas.server.name:8443/cas` - -## Executable WAR - -Run the CAS web application as an executable WAR: - -```bash -./gradlew[.bat] run -``` - -Debug the CAS web application as an executable WAR: - -```bash -./gradlew[.bat] debug -``` - -Run the CAS web application as a *standalone* executable WAR: - -```bash -./gradlew[.bat] clean executable -``` - -## External - -Deploy the binary web application file `cas.war` after a successful build to a servlet container of choice. - -## Docker - -The following strategies outline how to build and deploy CAS Docker images. - -### Jib - -The overlay embraces the [Jib Gradle Plugin](https://github.com/GoogleContainerTools/jib) to provide easy-to-use out-of-the-box tooling for building CAS docker images. Jib is an open-source Java containerizer from Google that lets Java developers build containers using the tools they know. It is a container image builder that handles all the steps of packaging your application into a container image. It does not require you to write a Dockerfile or have Docker installed, and it is directly integrated into the overlay. - -```bash -./gradlew build jibDockerBuild -``` - -### Dockerfile - -You can also use the native Docker tooling and the provided `Dockerfile` to build and run CAS. - -```bash -chmod +x *.sh -./docker-build.sh -./docker-run.sh -``` From 911c746f23022890bcc39b2a1e936f7109dbae11 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 15:02:57 +0800 Subject: [PATCH 318/530] Delete README.md --- cas/cas-server/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 cas/cas-server/README.md diff --git a/cas/cas-server/README.md b/cas/cas-server/README.md deleted file mode 100644 index 8b13789179..0000000000 --- a/cas/cas-server/README.md +++ /dev/null @@ -1 +0,0 @@ - From c76c811b1cb72b71c8c127c9e3da41a731e4adff Mon Sep 17 00:00:00 2001 From: patkorek Date: Tue, 7 Apr 2020 10:23:15 +0200 Subject: [PATCH 319/530] BAEL-2660 few examples to convert String to Int --- .../strings/ConvertStringToInt.groovy | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy diff --git a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy new file mode 100644 index 0000000000..40c53965a5 --- /dev/null +++ b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy @@ -0,0 +1,92 @@ +package com.baeldung.strings + +import org.junit.Test + +import java.text.DecimalFormat + +import static org.junit.Assert.assertEquals +import static org.junit.Assert.assertNull + +class ConvertStringToInt { + + @Test + void givenString_thenConvertToIntegerUsingAsInteger() { + def stringNum = "123" + def invalidString = "123a" + Integer expectedInteger = 123 + Integer integerNum = stringNum as Integer + def intNum = invalidString?.isInteger() ? invalidString as Integer : null + + assertNull(null, intNum) + assertEquals(integerNum, expectedInteger) + } + + @Test + void givenString_thenConvertToIntUsingAsInt() { + def stringNum = "123" + int expectedInt = 123 + int intNum = stringNum as int + + assertEquals(intNum, expectedInt) + } + + @Test + void givenString_thenConvertToIntegerUsingToInteger() { + def stringNum = "123" + int expectedInt = 123 + int intNum = stringNum.toInteger() + + assertEquals(intNum, expectedInt) + } + + @Test + void givenString_thenConvertToIntegerUsingParseInt() { + def stringNum = "123" + int expectedInt = 123 + int intNum = Integer.parseInt(stringNum) + + assertEquals(intNum, expectedInt) + } + + @Test + void givenString_thenConvertToIntegerUsingValueOf() { + def stringNum = "123" + int expectedInt = 123 + int intNum = Integer.valueOf(stringNum) + + assertEquals(intNum, expectedInt) + } + + @Test + void givenString_thenConvertToIntegerUsingIntValue() { + def stringNum = "123" + int expectedInt = 123 + int intNum = new Integer(stringNum).intValue() + int secondIntNum = new Integer(stringNum) + + assertEquals(intNum, expectedInt) + assertEquals(secondIntNum, expectedInt) + } + + @Test + void givenString_thenConvertToIntegerUsingDecimalFormat() { + def stringNum = "123" + int expectedInt = 123 + DecimalFormat decimalFormat = new DecimalFormat("#") + int intNum = decimalFormat.parse(stringNum).intValue() + + assertEquals(intNum, expectedInt) + } + + @Test(expected = NumberFormatException.class) + void givenInvalidString_whenUsingAs_thenThrowNumberFormatException() { + def invalidString = "123a" + invalidString as Integer + } + + @Test(expected = NullPointerException.class) + void givenNullString_whenUsingToInteger_thenThrowNullPointerException() { + def invalidString = null + invalidString.toInteger() + } +} From 5e90298049ebf59769a0397e2cfebf14eabd3a8b Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:24:27 +0800 Subject: [PATCH 320/530] Update README.md --- libraries-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-3/README.md b/libraries-3/README.md index f3c3375098..62bd3b9f66 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -15,4 +15,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Introduction to the jcabi-aspects AOP Annotations Library](https://www.baeldung.com/java-jcabi-aspects) - [Introduction to Takes](https://www.baeldung.com/java-takes) - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway) - +- [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro) From 2ecd4cb204e6856476f5cf2b24877a591612248a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:27:04 +0800 Subject: [PATCH 321/530] Update README.md --- persistence-modules/spring-boot-persistence-h2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-boot-persistence-h2/README.md b/persistence-modules/spring-boot-persistence-h2/README.md index a0f9c67a33..d11ec1f409 100644 --- a/persistence-modules/spring-boot-persistence-h2/README.md +++ b/persistence-modules/spring-boot-persistence-h2/README.md @@ -1,4 +1,5 @@ ### Relevant Articles: - [Access the Same In-Memory H2 Database in Multiple Spring Boot Applications](https://www.baeldung.com/spring-boot-access-h2-database-multiple-apps) - [Spring Boot With H2 Database](https://www.baeldung.com/spring-boot-h2-database) -- [Hibernate @NotNull vs @Column(nullable = false)](https://www.baeldung.com/hibernate-notnull-vs-nullable) \ No newline at end of file +- [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) From fb594d2b2734aa68bdffaf636729f52461b9439c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:30:42 +0800 Subject: [PATCH 322/530] Update README.md --- core-java-modules/core-java-io-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-2/README.md b/core-java-modules/core-java-io-2/README.md index 62461be0ff..84cabc5992 100644 --- a/core-java-modules/core-java-io-2/README.md +++ b/core-java-modules/core-java-io-2/README.md @@ -12,4 +12,5 @@ This module contains articles about core Java input and output (IO) - [Java – Append Data to a File](https://www.baeldung.com/java-append-to-file) - [How to Copy a File with Java](https://www.baeldung.com/java-copy-file) - [Create a Directory in Java](https://www.baeldung.com/java-create-directory) +- [Java IO vs NIO](https://www.baeldung.com/java-io-vs-nio) - [[<-- Prev]](/core-java-modules/core-java-io) From a59aa144001d35a75c7014eb03f7e0457e67161f Mon Sep 17 00:00:00 2001 From: patkorek Date: Tue, 7 Apr 2020 10:34:38 +0200 Subject: [PATCH 323/530] Renamed methods --- .../com/baeldung/strings/ConvertStringToInt.groovy | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy index 40c53965a5..3b179ee193 100644 --- a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy +++ b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy @@ -10,7 +10,7 @@ import static org.junit.Assert.assertNull class ConvertStringToInt { @Test - void givenString_thenConvertToIntegerUsingAsInteger() { + void givenString_whenUsingAsInteger_thenConvertToInteger() { def stringNum = "123" def invalidString = "123a" Integer expectedInteger = 123 @@ -22,7 +22,7 @@ class ConvertStringToInt { } @Test - void givenString_thenConvertToIntUsingAsInt() { + void givenString_whenUsingAsInt_thenConvertToInt() { def stringNum = "123" int expectedInt = 123 int intNum = stringNum as int @@ -31,7 +31,7 @@ class ConvertStringToInt { } @Test - void givenString_thenConvertToIntegerUsingToInteger() { + void givenString_whenUsingToInteger_thenConvertToInteger() { def stringNum = "123" int expectedInt = 123 int intNum = stringNum.toInteger() @@ -40,7 +40,7 @@ class ConvertStringToInt { } @Test - void givenString_thenConvertToIntegerUsingParseInt() { + void givenString_whenUsingParseInt_thenConvertToInteger() { def stringNum = "123" int expectedInt = 123 int intNum = Integer.parseInt(stringNum) @@ -49,7 +49,7 @@ class ConvertStringToInt { } @Test - void givenString_thenConvertToIntegerUsingValueOf() { + void givenString_whenUsingValueOf_thenConvertToInteger() { def stringNum = "123" int expectedInt = 123 int intNum = Integer.valueOf(stringNum) @@ -58,7 +58,7 @@ class ConvertStringToInt { } @Test - void givenString_thenConvertToIntegerUsingIntValue() { + void givenString_whenUsingIntValue_thenConvertToInteger() { def stringNum = "123" int expectedInt = 123 int intNum = new Integer(stringNum).intValue() @@ -69,7 +69,7 @@ class ConvertStringToInt { } @Test - void givenString_thenConvertToIntegerUsingDecimalFormat() { + void givenString_whenUsingDecimalFormat_thenConvertToInteger() { def stringNum = "123" int expectedInt = 123 DecimalFormat decimalFormat = new DecimalFormat("#") From c9847d5036664bd35d88332b33836e85e293249d Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:37:03 +0800 Subject: [PATCH 324/530] Create README.md --- linux-bash/functions/src/main/bash/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 linux-bash/functions/src/main/bash/README.md diff --git a/linux-bash/functions/src/main/bash/README.md b/linux-bash/functions/src/main/bash/README.md new file mode 100644 index 0000000000..5fb6958b9d --- /dev/null +++ b/linux-bash/functions/src/main/bash/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Bash Functions in Linux](https://www.baeldung.com/linux/bash-functions) From 23a7314302d4f9bb1f7949d1b009f965cb43d340 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:39:13 +0800 Subject: [PATCH 325/530] Create README.md --- lombok/src/main/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 lombok/src/main/README.md diff --git a/lombok/src/main/README.md b/lombok/src/main/README.md new file mode 100644 index 0000000000..4092d8ce99 --- /dev/null +++ b/lombok/src/main/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Guide to the Linux wc Command](https://www.baeldung.com/linux/wc-command) From 4d9ae47da774264f984f77203e20a9908bd42d40 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:44:15 +0800 Subject: [PATCH 326/530] Create README.md --- linux-bash/read/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 linux-bash/read/README.md diff --git a/linux-bash/read/README.md b/linux-bash/read/README.md new file mode 100644 index 0000000000..56c1dd5b24 --- /dev/null +++ b/linux-bash/read/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Guide to the Linux read Command](https://www.baeldung.com/linux/read-command) From 850b02f07e04b3adebc27384ba8aad13c05945c6 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:48:21 +0800 Subject: [PATCH 327/530] Create README.md --- linux-bash/command-line-arguments/src/main/bash/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 linux-bash/command-line-arguments/src/main/bash/README.md diff --git a/linux-bash/command-line-arguments/src/main/bash/README.md b/linux-bash/command-line-arguments/src/main/bash/README.md new file mode 100644 index 0000000000..27d89fff99 --- /dev/null +++ b/linux-bash/command-line-arguments/src/main/bash/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [How to Use Command Line Arguments in a Bash Script](https://www.baeldung.com/linux/use-command-line-arguments-in-bash-script) From 1f6163f45cb9a0bf94cca287e5bfc0e4a765b779 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:49:44 +0800 Subject: [PATCH 328/530] Update README.md --- linux-bash/text/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/linux-bash/text/README.md b/linux-bash/text/README.md index de99c1962a..20df2a33ec 100644 --- a/linux-bash/text/README.md +++ b/linux-bash/text/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Linux Commands – Remove All Text After X](https://www.baeldung.com/linux/tr-manipulate-strings) +- [Linux Commands for Appending Multiple Lines to a File](https://www.baeldung.com/linux/appending-multiple-lines-to-file2) From 83cf886628977eb17779e46eb2edcd3a13c367e4 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 16:56:28 +0800 Subject: [PATCH 329/530] Create README.md --- .../core-java-concurrency-collections-2/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-collections-2/README.md diff --git a/core-java-modules/core-java-concurrency-collections-2/README.md b/core-java-modules/core-java-concurrency-collections-2/README.md new file mode 100644 index 0000000000..91da6c623c --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Introduction to Lock Striping](https://www.baeldung.com/java-lock-stripping) From 073f9c9067e96c56fee2af7580174b56c9c95a8b Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:09:25 +0800 Subject: [PATCH 330/530] Create README.md --- core-scala/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 core-scala/README.md diff --git a/core-scala/README.md b/core-scala/README.md new file mode 100644 index 0000000000..72b583c22b --- /dev/null +++ b/core-scala/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Pattern Matching in Scala](https://www.baeldung.com/scala/pattern-matching) From 40825b6f1fd4896b868d08b95e86aed98109d3a7 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 7 Apr 2020 14:49:42 +0530 Subject: [PATCH 331/530] JAVA-1188: Moved modules to core-java-modules --- java-collections-maps-2/README.md | 16 - java-collections-maps-2/pom.xml | 79 ---- .../main/java/com/baeldung/map/Product.java | 133 ------- .../com/baeldung/map/convert/MapToString.java | 34 -- .../com/baeldung/map/convert/StringToMap.java | 21 -- .../baeldung/map/copyhashmap/CopyHashMap.java | 55 --- .../map/initialize/MapInitializer.java | 80 ----- .../baeldung/map/iteration/MapIteration.java | 74 ---- .../java/com/baeldung/map/mapmax/MapMax.java | 92 ----- .../com/baeldung/map/mergemaps/Employee.java | 60 ---- .../com/baeldung/map/mergemaps/MergeMaps.java | 105 ------ .../map/primitives/PrimitiveMaps.java | 69 ---- .../com/baeldung/map/sort/SortHashMap.java | 104 ------ .../com/baeldung/map/ProductUnitTest.java | 174 --------- .../map/convert/MapToStringUnitTest.java | 48 --- .../map/convert/StringToMapUnitTest.java | 23 -- .../map/copyhashmap/CopyHashMapUnitTest.java | 76 ---- .../baeldung/map/copyhashmap/Employee.java | 28 -- .../initialize/MapInitializerUnitTest.java | 27 -- .../baeldung/map/mapmax/MapMaxUnitTest.java | 58 --- .../map/weakhashmap/WeakHashMapUnitTest.java | 72 ---- java-collections-maps-3/README.md | 8 - java-collections-maps-3/pom.xml | 26 -- .../compare/HashMapComparisonUnitTest.java | 225 ------------ .../TreeMapVsHashMapUnitTest.java | 58 --- java-collections-maps/README.md | 16 - java-collections-maps/pom.xml | 35 -- .../main/java/com/baeldung/map/MapUtil.java | 44 --- .../src/main/java/com/baeldung/map/MyKey.java | 64 ---- .../com/baeldung/map/MyLinkedHashMap.java | 23 -- .../src/main/resources/logback.xml | 13 - .../baeldung/guava/GuavaBiMapUnitTest.java | 120 ------- .../baeldung/map/ImmutableMapUnitTest.java | 84 ----- .../com/baeldung/map/KeyCheckUnitTest.java | 27 -- .../map/MapMultipleValuesUnitTest.java | 119 ------- .../java/com/baeldung/map/MapUnitTest.java | 336 ------------------ .../com/baeldung/map/MapUtilUnitTest.java | 103 ------ .../baeldung/map/MultiValuedMapUnitTest.java | 227 ------------ 38 files changed, 2956 deletions(-) delete mode 100644 java-collections-maps-2/README.md delete mode 100644 java-collections-maps-2/pom.xml delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/Product.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java delete mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java delete mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java delete mode 100644 java-collections-maps-3/README.md delete mode 100644 java-collections-maps-3/pom.xml delete mode 100644 java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java delete mode 100644 java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java delete mode 100644 java-collections-maps/README.md delete mode 100644 java-collections-maps/pom.xml delete mode 100644 java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java delete mode 100644 java-collections-maps/src/main/java/com/baeldung/map/MyKey.java delete mode 100644 java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java delete mode 100644 java-collections-maps/src/main/resources/logback.xml delete mode 100644 java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java delete mode 100644 java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java delete mode 100644 java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java delete mode 100644 java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java delete mode 100644 java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java delete mode 100644 java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java delete mode 100644 java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md deleted file mode 100644 index 2188960543..0000000000 --- a/java-collections-maps-2/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## Java Collections Cookbooks and Examples - -This module contains articles about Map data structures in Java. - -### Relevant Articles: -- [Map of Primitives in Java](https://www.baeldung.com/java-map-primitives) -- [Copying a HashMap in Java](https://www.baeldung.com/java-copy-hashmap) -- [A Guide to Java HashMap](https://www.baeldung.com/java-hashmap) -- [Guide to WeakHashMap in Java](https://www.baeldung.com/java-weakhashmap) -- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion) -- [Iterate over a Map in Java](https://www.baeldung.com/java-iterate-map) -- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps) -- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) -- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) -- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) -- More articles: [[<-- prev]](/java-collections-maps) [[next -->]](/java-collections-maps-3) diff --git a/java-collections-maps-2/pom.xml b/java-collections-maps-2/pom.xml deleted file mode 100644 index a246559f61..0000000000 --- a/java-collections-maps-2/pom.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - 4.0.0 - java-collections-maps-2 - 0.1.0-SNAPSHOT - java-collections-maps-2 - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - - org.eclipse.collections - eclipse-collections - ${eclipse-collections.version} - - - net.sf.trove4j - trove4j - ${trove4j.version} - - - it.unimi.dsi - fastutil - ${fastutil.version} - - - colt - colt - ${colt.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - one.util - streamex - ${streamex.version} - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - - - org.assertj - assertj-core - ${assertj.version} - test - - - - - 0.6.5 - 4.1 - 1.7.0 - 8.2.0 - 3.0.2 - 8.1.0 - 1.2.0 - 3.11.1 - - - \ No newline at end of file diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java b/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java deleted file mode 100644 index 5559895730..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.baeldung.map; - -import java.util.*; - -public class Product { - - private String name; - private String description; - private List tags; - - public Product(String name, String description) { - this.name = name; - this.description = description; - this.tags = new ArrayList<>(); - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public List getTags() { - return tags; - } - - public Product addTagsOfOtherProdcut(Product product) { - this.tags.addAll(product.getTags()); - return this; - } - - @Override - public boolean equals(Object o) { - - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Product product = (Product) o; - return Objects.equals(name, product.name) && - Objects.equals(description, product.description); - } - - @Override - public int hashCode() { - return Objects.hash(name, description); - } - - public static void forEach() { - - HashMap productsByName = new HashMap<>(); - productsByName.forEach( (key, product) - -> System.out.println("Key: " + key + " Product:" + product.getDescription()) - //do something with the key and value - ); - - //Prior to Java 8: - for(Map.Entry entry : productsByName.entrySet()) { - Product product = entry.getValue(); - String key = entry.getKey(); - //do something with the key and value - } - } - - public static void getOrDefault() { - - HashMap productsByName = new HashMap<>(); - Product chocolate = new Product("chocolate", "something sweet"); - Product defaultProduct = productsByName.getOrDefault("horse carriage", chocolate); - Product bike = productsByName.getOrDefault("E-Bike", chocolate); - - //Prior to Java 8: - Product bike2 = productsByName.containsKey("E-Bike") - ? productsByName.get("E-Bike") - : chocolate; - Product defaultProduct2 = productsByName.containsKey("horse carriage") - ? productsByName.get("horse carriage") - : chocolate; - } - - public static void putIfAbsent() { - - HashMap productsByName = new HashMap<>(); - Product chocolate = new Product("chocolate", "something sweet"); - productsByName.putIfAbsent("E-Bike", chocolate); - - //Prior to Java 8: - if(productsByName.containsKey("E-Bike")) { - productsByName.put("E-Bike", chocolate); - } - } - - public static void merge() { - - HashMap productsByName = new HashMap<>(); - Product eBike2 = new Product("E-Bike", "A bike with a battery"); - eBike2.getTags().add("sport"); - productsByName.merge("E-Bike", eBike2, Product::addTagsOfOtherProdcut); - - //Prior to Java 8: - if(productsByName.containsKey("E-Bike")) { - productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2); - } else { - productsByName.put("E-Bike", eBike2); - } - } - - public static void compute() { - - HashMap productsByName = new HashMap<>(); - Product eBike2 = new Product("E-Bike", "A bike with a battery"); - - productsByName.compute("E-Bike", (k,v) -> { - if(v != null) { - return v.addTagsOfOtherProdcut(eBike2); - } else { - return eBike2; - } - }); - - //Prior to Java 8: - if(productsByName.containsKey("E-Bike")) { - productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2); - } else { - productsByName.put("E-Bike", eBike2); - } - } -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java deleted file mode 100644 index d13be924ff..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.map.convert; - -import com.google.common.base.Joiner; -import org.apache.commons.lang3.StringUtils; - -import java.util.Map; -import java.util.stream.Collectors; - -public class MapToString { - - public static String convertWithIteration(Map map) { - StringBuilder mapAsString = new StringBuilder("{"); - for (Integer key : map.keySet()) { - mapAsString.append(key + "=" + map.get(key) + ", "); - } - mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}"); - return mapAsString.toString(); - } - - public static String convertWithStream(Map map) { - String mapAsString = map.keySet().stream() - .map(key -> key + "=" + map.get(key)) - .collect(Collectors.joining(", ", "{", "}")); - return mapAsString; - } - - public static String convertWithGuava(Map map) { - return Joiner.on(",").withKeyValueSeparator("=").join(map); - } - - public static String convertWithApache(Map map) { - return StringUtils.join(map); - } -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java deleted file mode 100644 index 416ba4dd9a..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.map.convert; - -import com.google.common.base.Splitter; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -public class StringToMap { - - public static Map convertWithStream(String mapAsString) { - Map map = Arrays.stream(mapAsString.split(",")) - .map(entry -> entry.split("=")) - .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1])); - return map; - } - - public static Map convertWithGuava(String mapAsString) { - return Splitter.on(',').withKeyValueSeparator('=').split(mapAsString); - } -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java deleted file mode 100644 index cb18f3aa11..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.map.copyhashmap; - -import org.apache.commons.lang3.SerializationUtils; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.stream.Collectors; - -public class CopyHashMap { - - public static HashMap copyUsingConstructor(HashMap originalMap) { - return new HashMap(originalMap); - } - - public static HashMap copyUsingClone(HashMap originalMap) { - return (HashMap) originalMap.clone(); - } - - public static HashMap copyUsingPut(HashMap originalMap) { - HashMap shallowCopy = new HashMap(); - Set> entries = originalMap.entrySet(); - for(Map.Entry mapEntry: entries) { - shallowCopy.put(mapEntry.getKey(), mapEntry.getValue()); - } - - return shallowCopy; - } - - public static HashMap copyUsingPutAll(HashMap originalMap) { - HashMap shallowCopy = new HashMap(); - shallowCopy.putAll(originalMap); - - return shallowCopy; - } - - public static HashMap copyUsingJava8Stream(HashMap originalMap) { - Set> entries = originalMap.entrySet(); - HashMap shallowCopy = (HashMap) entries - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - - return shallowCopy; - } - - public static HashMap shallowCopy(HashMap originalMap) { - return (HashMap) originalMap.clone(); - } - - public static HashMap deepCopy(HashMap originalMap) { - return SerializationUtils.clone(originalMap); - } - -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java b/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java deleted file mode 100644 index 4d63abcfd0..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.baeldung.map.initialize; - -import java.util.AbstractMap; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class MapInitializer { - - public static Map articleMapOne; - static { - articleMapOne = new HashMap<>(); - articleMapOne.put("ar01", "Intro to Map"); - articleMapOne.put("ar02", "Some article"); - } - - public static Map createSingletonMap() { - Map passwordMap = Collections.singletonMap("username1", "password1"); - return passwordMap; - - } - - public Map createEmptyMap() { - Map emptyMap = Collections.emptyMap(); - return emptyMap; - } - - public Map createUsingDoubleBrace() { - Map doubleBraceMap = new HashMap() { - - /** - * - */ - private static final long serialVersionUID = 1L; - - { - put("key1", "value1"); - put("key2", "value2"); - } - }; - return doubleBraceMap; - } - - public Map createMapUsingStreamStringArray() { - Map map = Stream.of(new String[][] { { "Hello", "World" }, { "John", "Doe" }, }) - .collect(Collectors.toMap(data -> data[0], data -> data[1])); - - return map; - } - - public Map createMapUsingStreamObjectArray() { - Map map = Stream.of(new Object[][] { { "data1", 1 }, { "data2", 2 }, }) - .collect(Collectors.toMap(data -> (String) data[0], data -> (Integer) data[1])); - - return map; - } - - public Map createMapUsingStreamSimpleEntry() { - Map map = Stream.of(new AbstractMap.SimpleEntry<>("idea", 1), new AbstractMap.SimpleEntry<>("mobile", 2)) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - - return map; - } - - public Map createMapUsingStreamSimpleImmutableEntry() { - Map map = Stream.of(new AbstractMap.SimpleImmutableEntry<>("idea", 1), new AbstractMap.SimpleImmutableEntry<>("mobile", 2)) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - - return map; - } - - public Map createImmutableMapWithStreams() { - Map map = Stream.of(new String[][] { { "Hello", "World" }, { "John", "Doe" }, }) - .collect(Collectors.collectingAndThen(Collectors.toMap(data -> data[0], data -> data[1]), Collections:: unmodifiableMap)); - return map; - - } -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java b/java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java deleted file mode 100644 index b0c32e1487..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.baeldung.map.iteration; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -public class MapIteration { - - public static void main(String[] args) { - MapIteration mapIteration = new MapIteration(); - Map map = new HashMap<>(); - - map.put("One", 1); - map.put("Three", 3); - map.put("Two", 2); - - System.out.println("Iterating Keys of Map Using KeySet"); - mapIteration.iterateKeys(map); - - System.out.println("Iterating Map Using Entry Set"); - mapIteration.iterateUsingEntrySet(map); - - System.out.println("Iterating Using Iterator and Map Entry"); - mapIteration.iterateUsingIteratorAndEntry(map); - - System.out.println("Iterating Using KeySet and For Each"); - mapIteration.iterateUsingKeySetAndForeach(map); - - System.out.println("Iterating Map Using Lambda Expression"); - mapIteration.iterateUsingLambda(map); - - System.out.println("Iterating Using Stream API"); - mapIteration.iterateUsingStreamAPI(map); - } - - public void iterateUsingEntrySet(Map map) { - for (Map.Entry entry : map.entrySet()) { - System.out.println(entry.getKey() + ":" + entry.getValue()); - } - } - - public void iterateUsingLambda(Map map) { - map.forEach((k, v) -> System.out.println((k + ":" + v))); - } - - public void iterateUsingIteratorAndEntry(Map map) { - Iterator> iterator = map.entrySet() - .iterator(); - while (iterator.hasNext()) { - Map.Entry pair = iterator.next(); - System.out.println(pair.getKey() + ":" + pair.getValue()); - } - } - - public void iterateUsingKeySetAndForeach(Map map) { - for (String key : map.keySet()) { - System.out.println(key + ":" + map.get(key)); - } - } - - public void iterateUsingStreamAPI(Map map) { - map.entrySet() - .stream() - .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); - } - - public void iterateKeys(Map map) { - for (String key : map.keySet()) { - System.out.println(key); - } - - } - -} \ No newline at end of file diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java deleted file mode 100644 index 8c33c857ee..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.baeldung.map.mapmax; - -import java.util.*; -import java.util.Map.Entry; - -public class MapMax { - - public > V maxUsingIteration(Map map) { - - Map.Entry maxEntry = null; - - for (Map.Entry entry : map.entrySet()) { - - if (maxEntry == null || entry.getValue() - .compareTo(maxEntry.getValue()) > 0) { - maxEntry = entry; - } - } - - return maxEntry.getValue(); - } - - public > V maxUsingCollectionsMax(Map map) { - - Entry maxEntry = Collections.max(map.entrySet(), new Comparator>() { - public int compare(Entry e1, Entry e2) { - return e1.getValue() - .compareTo(e2.getValue()); - } - }); - - return maxEntry.getValue(); - } - - public > V maxUsingCollectionsMaxAndLambda(Map map) { - - Entry maxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue() - .compareTo(e2.getValue())); - - return maxEntry.getValue(); - } - - public > V maxUsingCollectionsMaxAndMethodReference(Map map) { - - Entry maxEntry = Collections.max(map.entrySet(), Comparator.comparing(Map.Entry::getValue)); - - return maxEntry.getValue(); - } - - public > V maxUsingStreamAndLambda(Map map) { - - Optional> maxEntry = map.entrySet() - .stream() - .max((Entry e1, Entry e2) -> e1.getValue() - .compareTo(e2.getValue())); - - return maxEntry.get() - .getValue(); - } - - public > V maxUsingStreamAndMethodReference(Map map) { - - Optional> maxEntry = map.entrySet() - .stream() - .max(Comparator.comparing(Map.Entry::getValue)); - - return maxEntry.get() - .getValue(); - } - - public static void main(String[] args) { - - Map map = new HashMap(); - - map.put(1, 3); - map.put(2, 4); - map.put(3, 5); - map.put(4, 6); - map.put(5, 7); - - MapMax mapMax = new MapMax(); - - System.out.println(mapMax.maxUsingIteration(map)); - System.out.println(mapMax.maxUsingCollectionsMax(map)); - System.out.println(mapMax.maxUsingCollectionsMaxAndLambda(map)); - System.out.println(mapMax.maxUsingCollectionsMaxAndMethodReference(map)); - System.out.println(mapMax.maxUsingStreamAndLambda(map)); - System.out.println(mapMax.maxUsingStreamAndMethodReference(map)); - - } - -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java deleted file mode 100644 index d7fb0d1a1d..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.map.mergemaps; - -public class Employee implements Comparable { - - private Long id; - private String name; - - public Employee(Long id, String name) { - this.name = name; - this.id = id; - } - - 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; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Employee employee = (Employee) o; - - if (!id.equals(employee.id)) return false; - return name.equals(employee.name); - - } - - @Override - public int hashCode() { - int result = id.hashCode(); - result = 31 * result + name.hashCode(); - return result; - } - - @Override - public String toString() { - return "Employee{" + - "id=" + id + - ", name='" + name + '\'' + - '}'; - } - - @Override - public int compareTo(Employee employee) { - return (int)(this.id - employee.getId()); - } -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java deleted file mode 100644 index 4f187bad90..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.baeldung.map.mergemaps; - -import one.util.streamex.EntryStream; - -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class MergeMaps { - - private static Map map1 = new HashMap<>(); - private static Map map2 = new HashMap<>(); - - public static void main(String[] args) { - - initialize(); - - mergeFunction(); - - streamConcat(); - - streamOf(); - - streamEx(); - - streamMerge(); - } - - private static void streamMerge() { - - Map map3 = map2.entrySet() - .stream() - .collect( - Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue, - (v1, v2) -> new Employee(v1.getId(), v2.getName()), - () -> new HashMap<>(map1) - ) - ); - - System.out.println(map3); - } - - private static void streamEx() { - Map map3 = EntryStream.of(map1) - .append(EntryStream.of(map2)) - .toMap((e1, e2) -> e1); - - System.out.println(map3); - - } - - private static void streamOf() { - Map map3 = Stream.of(map1, map2) - .flatMap(map -> map.entrySet().stream()) - .collect( - Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue, - (v1, v2) -> new Employee(v1.getId(), v2.getName()) - ) - ); - - map3.entrySet().forEach(System.out::println); - } - - private static void streamConcat() { - Map result = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream()).collect(Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue, - (value1, value2) -> new Employee(value2.getId(), value1.getName()) - )); - - result.entrySet().forEach(System.out::println); - } - - private static void mergeFunction() { - Map map3 = new HashMap<>(map1); - - map2.forEach( - (key, value) -> map3.merge(key, value, (v1, v2) -> - new Employee(v1.getId(), v2.getName())) - ); - - map3.entrySet().forEach(System.out::println); - } - - - private static void initialize() { - Employee employee1 = new Employee(1L, "Henry"); - map1.put(employee1.getName(), employee1); - Employee employee2 = new Employee(22L, "Annie"); - map1.put(employee2.getName(), employee2); - Employee employee3 = new Employee(8L, "John"); - map1.put(employee3.getName(), employee3); - - Employee employee4 = new Employee(2L, "George"); - map2.put(employee4.getName(), employee4); - Employee employee5 = new Employee(3L, "Henry"); - map2.put(employee5.getName(), employee5); - } - -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java deleted file mode 100644 index 30bec12ccc..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.map.primitives; - -import cern.colt.map.AbstractIntDoubleMap; -import cern.colt.map.OpenIntDoubleHashMap; -import gnu.trove.map.TDoubleIntMap; -import gnu.trove.map.hash.TDoubleIntHashMap; -import it.unimi.dsi.fastutil.ints.Int2BooleanMap; -import it.unimi.dsi.fastutil.ints.Int2BooleanOpenHashMap; -import it.unimi.dsi.fastutil.ints.Int2BooleanSortedMap; -import it.unimi.dsi.fastutil.ints.Int2BooleanSortedMaps; -import org.eclipse.collections.api.map.primitive.ImmutableIntIntMap; -import org.eclipse.collections.api.map.primitive.MutableIntIntMap; -import org.eclipse.collections.api.map.primitive.MutableObjectDoubleMap; -import org.eclipse.collections.impl.factory.primitive.IntIntMaps; -import org.eclipse.collections.impl.factory.primitive.ObjectDoubleMaps; - -public class PrimitiveMaps { - - public static void main(String[] args) { - - eclipseCollectionsMap(); - troveMap(); - coltMap(); - fastutilMap(); - } - - private static void fastutilMap() { - Int2BooleanMap int2BooleanMap = new Int2BooleanOpenHashMap(); - int2BooleanMap.put(1, true); - int2BooleanMap.put(7, false); - int2BooleanMap.put(4, true); - - boolean value = int2BooleanMap.get(1); - - Int2BooleanSortedMap int2BooleanSorted = Int2BooleanSortedMaps.EMPTY_MAP; - } - - private static void coltMap() { - AbstractIntDoubleMap map = new OpenIntDoubleHashMap(); - map.put(1, 4.5); - double value = map.get(1); - } - - private static void eclipseCollectionsMap() { - MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty(); - mutableIntIntMap.addToValue(1, 1); - - ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty(); - - MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty(); - dObject.addToValue("price", 150.5); - dObject.addToValue("quality", 4.4); - dObject.addToValue("stability", 0.8); - } - - private static void troveMap() { - double[] doubles = new double[] {1.2, 4.5, 0.3}; - int[] ints = new int[] {1, 4, 0}; - - TDoubleIntMap doubleIntMap = new TDoubleIntHashMap(doubles, ints); - - doubleIntMap.put(1.2, 22); - doubleIntMap.put(4.5, 16); - - doubleIntMap.adjustValue(1.2, 1); - doubleIntMap.adjustValue(4.5, 4); - doubleIntMap.adjustValue(0.3, 7); - } -} diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java deleted file mode 100644 index 14610ffb00..0000000000 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.baeldung.map.sort; - -import com.baeldung.map.mergemaps.Employee; -import com.google.common.base.Functions; -import com.google.common.collect.ImmutableSortedMap; -import com.google.common.collect.Ordering; - -import java.util.*; -import java.util.stream.Collectors; - -public class SortHashMap { - - private static Map map = new HashMap<>(); - - public static void main(String[] args) { - - initialize(); - - treeMapSortByKey(); - - arrayListSortByValue(); - arrayListSortByKey(); - - sortStream(); - - sortGuava(); - - addDuplicates(); - - treeSetByKey(); - treeSetByValue(); - - } - - private static void sortGuava() { - final Ordering naturalOrdering = - Ordering.natural().onResultOf(Functions.forMap(map, null)); - - System.out.println(ImmutableSortedMap.copyOf(map, naturalOrdering)); - } - - private static void sortStream() { - map.entrySet().stream() - .sorted(Map.Entry.comparingByKey().reversed()) - .forEach(System.out::println); - - Map result = map.entrySet().stream() - .sorted(Map.Entry.comparingByValue()) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, - (oldValue, newValue) -> oldValue, LinkedHashMap::new)); - - result.entrySet().forEach(System.out::println); - } - - private static void treeSetByValue() { - SortedSet values = new TreeSet<>(map.values()); - System.out.println(values); - } - - private static void treeSetByKey() { - SortedSet keysSet = new TreeSet<>(map.keySet()); - System.out.println(keysSet); - } - - private static void treeMapSortByKey() { - TreeMap sorted = new TreeMap<>(map); - sorted.putAll(map); - - sorted.entrySet().forEach(System.out::println); - - } - - private static void arrayListSortByValue() { - List employeeById = new ArrayList<>(map.values()); - - Collections.sort(employeeById); - - System.out.println(employeeById); - } - - private static void arrayListSortByKey() { - List employeeByKey = new ArrayList<>(map.keySet()); - Collections.sort(employeeByKey); - System.out.println(employeeByKey); - } - - private static void initialize() { - Employee employee1 = new Employee(1L, "Mher"); - map.put(employee1.getName(), employee1); - Employee employee2 = new Employee(22L, "Annie"); - map.put(employee2.getName(), employee2); - Employee employee3 = new Employee(8L, "John"); - map.put(employee3.getName(), employee3); - Employee employee4 = new Employee(2L, "George"); - map.put(employee4.getName(), employee4); - } - - private static void addDuplicates() { - Employee employee5 = new Employee(1L, "Mher"); - map.put(employee5.getName(), employee5); - Employee employee6 = new Employee(22L, "Annie"); - map.put(employee6.getName(), employee6); - } -} diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java deleted file mode 100644 index ba29d5c454..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.baeldung.map; - -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import static org.junit.jupiter.api.Assertions.*; - -class ProductUnitTest { - - - @Test - public void getExistingValue() { - HashMap productsByName = new HashMap<>(); - - Product eBike = new Product("E-Bike", "A bike with a battery"); - Product roadBike = new Product("Road bike", "A bike for competition"); - - productsByName.put(eBike.getName(), eBike); - productsByName.put(roadBike.getName(), roadBike); - - Product nextPurchase = productsByName.get("E-Bike"); - - assertEquals("A bike with a battery", nextPurchase.getDescription()); - } - - @Test - public void getNonExistingValue() { - HashMap productsByName = new HashMap<>(); - - Product eBike = new Product("E-Bike", "A bike with a battery"); - Product roadBike = new Product("Road bike", "A bike for competition"); - - productsByName.put(eBike.getName(), eBike); - productsByName.put(roadBike.getName(), roadBike); - - Product nextPurchase = productsByName.get("Car"); - - assertNull(nextPurchase); - } - - @Test - public void getExistingValueAfterSameKeyInsertedTwice() { - HashMap productsByName = new HashMap<>(); - - Product eBike = new Product("E-Bike", "A bike with a battery"); - Product roadBike = new Product("Road bike", "A bike for competition"); - Product newEBike = new Product("E-Bike", "A bike with a better battery"); - - productsByName.put(eBike.getName(), eBike); - productsByName.put(roadBike.getName(), roadBike); - productsByName.put(newEBike.getName(), newEBike); - - Product nextPurchase = productsByName.get("E-Bike"); - - assertEquals("A bike with a better battery", nextPurchase.getDescription()); - } - - @Test - public void getExistingValueWithNullKey() { - HashMap productsByName = new HashMap<>(); - - Product defaultProduct = new Product("Chocolate", "At least buy chocolate"); - - productsByName.put(null, defaultProduct); - productsByName.put(defaultProduct.getName(), defaultProduct); - - Product nextPurchase = productsByName.get(null); - assertEquals("At least buy chocolate", nextPurchase.getDescription()); - - nextPurchase = productsByName.get("Chocolate"); - assertEquals("At least buy chocolate", nextPurchase.getDescription()); - } - - @Test - public void insertSameObjectWithDifferentKey() { - HashMap productsByName = new HashMap<>(); - - Product defaultProduct = new Product("Chocolate", "At least buy chocolate"); - - productsByName.put(null, defaultProduct); - productsByName.put(defaultProduct.getName(), defaultProduct); - - assertSame(productsByName.get(null), productsByName.get("Chocolate")); - } - - @Test - public void checkIfKeyExists() { - HashMap productsByName = new HashMap<>(); - - Product eBike = new Product("E-Bike", "A bike with a battery"); - - productsByName.put(eBike.getName(), eBike); - - assertTrue(productsByName.containsKey("E-Bike")); - } - - @Test - public void checkIfValueExists() { - HashMap productsByName = new HashMap<>(); - - Product eBike = new Product("E-Bike", "A bike with a battery"); - - productsByName.put(eBike.getName(), eBike); - - assertTrue(productsByName.containsValue(eBike)); - } - - @Test - public void removeExistingKey() { - HashMap productsByName = new HashMap<>(); - - Product eBike = new Product("E-Bike", "A bike with a battery"); - Product roadBike = new Product("Road bike", "A bike for competition"); - - productsByName.put(eBike.getName(), eBike); - productsByName.put(roadBike.getName(), roadBike); - - productsByName.remove("E-Bike"); - - assertNull(productsByName.get("E-Bike")); - } - - @Test - public void givenMutableKeyWhenKeyChangeThenValueNotFound() { - // Given - MutableKey key = new MutableKey("initial"); - - Map items = new HashMap<>(); - items.put(key, "success"); - - // When - key.setName("changed"); - - // Then - assertNull(items.get(key)); - } - - static class MutableKey { - private String name; - - public MutableKey(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - MutableKey that = (MutableKey) o; - return Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hash(name); - } - } - -} diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java deleted file mode 100644 index 4517dea328..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.map.convert; - -import org.apache.commons.collections4.MapUtils; -import org.junit.Assert; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.HashMap; -import java.util.Map; - -public class MapToStringUnitTest { - - private Map wordsByKey = new HashMap<>(); - - @BeforeEach - public void setup() { - wordsByKey.clear(); - wordsByKey.put(1, "one"); - wordsByKey.put(2, "two"); - wordsByKey.put(3, "three"); - wordsByKey.put(4, "four"); - } - - @Test - public void givenMap_WhenUsingIteration_ThenResultingMapIsCorrect() { - String mapAsString = MapToString.convertWithIteration(wordsByKey); - Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); - } - - @Test - public void givenMap_WhenUsingStream_ThenResultingMapIsCorrect() { - String mapAsString = MapToString.convertWithStream(wordsByKey); - Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); - } - - @Test - public void givenMap_WhenUsingGuava_ThenResultingMapIsCorrect() { - String mapAsString = MapToString.convertWithGuava(wordsByKey); - Assert.assertEquals("1=one,2=two,3=three,4=four", mapAsString); - } - - @Test - public void givenMap_WhenUsingApache_ThenResultingMapIsCorrect() { - String mapAsString = MapToString.convertWithApache(wordsByKey); - Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); - MapUtils.debugPrint(System.out, "Map as String", wordsByKey); - } -} \ No newline at end of file diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java deleted file mode 100644 index 2f80b30871..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.map.convert; - -import org.junit.Assert; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -public class StringToMapUnitTest { - - @Test - public void givenString_WhenUsingStream_ThenResultingStringIsCorrect() { - Map wordsByKey = StringToMap.convertWithStream("1=one,2=two,3=three,4=four"); - Assert.assertEquals(4, wordsByKey.size()); - Assert.assertEquals("one", wordsByKey.get("1")); - } - - @Test - void givenString_WhenUsingGuava_ThenResultingStringIsCorrect() { - Map wordsByKey = StringToMap.convertWithGuava("1=one,2=two,3=three,4=four"); - Assert.assertEquals(4, wordsByKey.size()); - Assert.assertEquals("one", wordsByKey.get("1")); - } -} \ No newline at end of file diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java deleted file mode 100644 index e2d5e327e1..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.baeldung.map.copyhashmap; - -import com.google.common.collect.ImmutableMap; -import org.junit.Test; - -import java.util.HashMap; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CopyHashMapUnitTest { - - @Test - public void givenHashMap_whenShallowCopy_thenCopyisNotSameAsOriginal() { - - HashMap map = new HashMap<>(); - Employee emp1 = new Employee("John"); - Employee emp2 = new Employee("Norman"); - map.put("emp1",emp1); - map.put("emp2",emp2); - - HashMap shallowCopy = CopyHashMap.shallowCopy(map); - - assertThat(shallowCopy).isNotSameAs(map); - - } - - @Test - public void givenHashMap_whenShallowCopyModifyingOriginalObject_thenCopyShouldChange() { - - HashMap map = new HashMap<>(); - Employee emp1 = new Employee("John"); - Employee emp2 = new Employee("Norman"); - map.put("emp1",emp1); - map.put("emp2",emp2); - - HashMap shallowCopy = CopyHashMap.shallowCopy(map); - - emp1.setName("Johny"); - - assertThat(shallowCopy.get("emp1")).isEqualTo(map.get("emp1")); - - } - - @Test - public void givenHashMap_whenDeepCopyModifyingOriginalObject_thenCopyShouldNotChange() { - - HashMap map = new HashMap<>(); - Employee emp1 = new Employee("John"); - Employee emp2 = new Employee("Norman"); - map.put("emp1",emp1); - map.put("emp2",emp2); - HashMap deepCopy = CopyHashMap.deepCopy(map); - - emp1.setName("Johny"); - - assertThat(deepCopy.get("emp1")).isNotEqualTo(map.get("emp1")); - - } - - @Test - public void givenImmutableMap_whenCopyUsingGuava_thenCopyShouldNotChange() { - Employee emp1 = new Employee("John"); - Employee emp2 = new Employee("Norman"); - - Map map = ImmutableMap. builder() - .put("emp1",emp1) - .put("emp2",emp2) - .build(); - Map shallowCopy = ImmutableMap.copyOf(map); - - assertThat(shallowCopy).isSameAs(map); - - } - -} diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java deleted file mode 100644 index 5db55c26ea..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.map.copyhashmap; - -import java.io.Serializable; - -public class Employee implements Serializable{ - - private String name; - - public Employee(String name) { - super(); - this.name = name; - } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return this.name; - } - -} - - diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java deleted file mode 100644 index 7c6dffe787..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.map.initialize; - -import org.junit.Test; - -import java.util.Map; - -import static org.junit.Assert.assertEquals; - -public class MapInitializerUnitTest { - - @Test - public void givenStaticMap_whenUpdated_thenCorrect() { - - MapInitializer.articleMapOne.put("NewArticle1", "Convert array to List"); - - assertEquals(MapInitializer.articleMapOne.get("NewArticle1"), "Convert array to List"); - - } - - @Test(expected=UnsupportedOperationException.class) - public void givenSingleTonMap_whenEntriesAdded_throwsException() { - - Map map = MapInitializer.createSingletonMap(); - map.put("username2", "password2"); - } - -} diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java deleted file mode 100644 index 30b945bfc8..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.baeldung.map.mapmax; - - -import org.junit.Before; -import org.junit.Test; - -import java.util.HashMap; -import java.util.Map; - -import static org.junit.Assert.assertEquals; - -public class MapMaxUnitTest { - - Map map = null; - MapMax mapMax = null; - - - @Before - public void setupTestData() { - map = new HashMap(); - map.put(23, 12); - map.put(46, 24); - map.put(27, 38); - mapMax = new MapMax(); - } - - @Test - public void givenMap_whenIterated_thenReturnMaxValue() { - assertEquals(new Integer(38), mapMax.maxUsingIteration(map)); - } - - @Test - public void givenMap_whenUsingCollectionsMax_thenReturnMaxValue() { - assertEquals(new Integer(38), mapMax.maxUsingCollectionsMax(map)); - } - - @Test - public void givenMap_whenUsingCollectionsMaxAndLambda_thenReturnMaxValue() { - assertEquals(new Integer(38), mapMax.maxUsingCollectionsMaxAndLambda(map)); - } - - @Test - public void givenMap_whenUsingCollectionsMaxAndMethodReference_thenReturnMaxValue() { - assertEquals(new Integer(38), mapMax.maxUsingCollectionsMaxAndMethodReference(map)); - } - - @Test - public void givenMap_whenUsingStreamAndLambda_thenReturnMaxValue() { - assertEquals(new Integer(38), mapMax.maxUsingStreamAndLambda(map)); - } - - @Test - public void givenMap_whenUsingStreamAndMethodReference_thenReturnMaxValue() { - assertEquals(new Integer(38), mapMax.maxUsingStreamAndMethodReference (map)); - } - - -} diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java deleted file mode 100644 index 293f24c378..0000000000 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.baeldung.map.weakhashmap; - - -import org.junit.Test; - -import java.util.WeakHashMap; -import java.util.concurrent.TimeUnit; - -import static com.jayway.awaitility.Awaitility.await; -import static org.junit.Assert.assertTrue; - -public class WeakHashMapUnitTest { - - @Test - public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObject() { - //given - WeakHashMap map = new WeakHashMap<>(); - BigImage bigImage = new BigImage("image_id"); - UniqueImageName imageName = new UniqueImageName("name_of_big_image"); - - map.put(imageName, bigImage); - assertTrue(map.containsKey(imageName)); - - //when big image key is not reference anywhere - imageName = null; - System.gc(); - - //then GC will finally reclaim that object - await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty); - } - - @Test - public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObjectButLeaveReferencedObject() { - //given - WeakHashMap map = new WeakHashMap<>(); - BigImage bigImageFirst = new BigImage("foo"); - UniqueImageName imageNameFirst = new UniqueImageName("name_of_big_image"); - - BigImage bigImageSecond = new BigImage("foo_2"); - UniqueImageName imageNameSecond = new UniqueImageName("name_of_big_image_2"); - - map.put(imageNameFirst, bigImageFirst); - map.put(imageNameSecond, bigImageSecond); - assertTrue(map.containsKey(imageNameFirst)); - assertTrue(map.containsKey(imageNameSecond)); - - //when - imageNameFirst = null; - System.gc(); - - //then - await().atMost(10, TimeUnit.SECONDS).until(() -> map.size() == 1); - await().atMost(10, TimeUnit.SECONDS).until(() -> map.containsKey(imageNameSecond)); - } - - - class BigImage { - public final String imageId; - - BigImage(String imageId) { - this.imageId = imageId; - } - } - - class UniqueImageName { - public final String imageName; - - UniqueImageName(String imageName) { - this.imageName = imageName; - } - } -} diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md deleted file mode 100644 index 886461a35c..0000000000 --- a/java-collections-maps-3/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Java Collections Cookbooks and Examples - -This module contains articles about Map data structures in Java. - -### Relevant Articles: -- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) -- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) -- More articles: [[<-- prev]](/java-collections-maps-2) diff --git a/java-collections-maps-3/pom.xml b/java-collections-maps-3/pom.xml deleted file mode 100644 index 30b0d01528..0000000000 --- a/java-collections-maps-3/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - java-collections-maps-3 - 0.1.0-SNAPSHOT - java-collections-maps-3 - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - - - - - - - - \ No newline at end of file diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java deleted file mode 100644 index 0edd0cd87b..0000000000 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.baeldung.map.compare; - -import com.google.common.base.Equivalence; -import com.google.common.collect.MapDifference; -import com.google.common.collect.MapDifference.ValueDifference; -import com.google.common.collect.Maps; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.collection.IsMapContaining.hasEntry; -import static org.hamcrest.collection.IsMapContaining.hasKey; -import static org.junit.Assert.*; - -public class HashMapComparisonUnitTest { - - Map asiaCapital1; - Map asiaCapital2; - Map asiaCapital3; - - Map asiaCity1; - Map asiaCity2; - Map asiaCity3; - - @Before - public void setup(){ - asiaCapital1 = new HashMap(); - asiaCapital1.put("Japan", "Tokyo"); - asiaCapital1.put("South Korea", "Seoul"); - - asiaCapital2 = new HashMap(); - asiaCapital2.put("South Korea", "Seoul"); - asiaCapital2.put("Japan", "Tokyo"); - - asiaCapital3 = new HashMap(); - asiaCapital3.put("Japan", "Tokyo"); - asiaCapital3.put("China", "Beijing"); - - asiaCity1 = new HashMap(); - asiaCity1.put("Japan", new String[] { "Tokyo", "Osaka" }); - asiaCity1.put("South Korea", new String[] { "Seoul", "Busan" }); - - asiaCity2 = new HashMap(); - asiaCity2.put("South Korea", new String[] { "Seoul", "Busan" }); - asiaCity2.put("Japan", new String[] { "Tokyo", "Osaka" }); - - asiaCity3 = new HashMap(); - asiaCity3.put("Japan", new String[] { "Tokyo", "Osaka" }); - asiaCity3.put("China", new String[] { "Beijing", "Hong Kong" }); - } - - @Test - public void whenCompareTwoHashMapsUsingEquals_thenSuccess() { - assertTrue(asiaCapital1.equals(asiaCapital2)); - assertFalse(asiaCapital1.equals(asiaCapital3)); - } - - @Test - public void whenCompareTwoHashMapsWithArrayValuesUsingEquals_thenFail() { - assertFalse(asiaCity1.equals(asiaCity2)); - } - - @Test - public void whenCompareTwoHashMapsUsingStreamAPI_thenSuccess() { - assertTrue(areEqual(asiaCapital1, asiaCapital2)); - assertFalse(areEqual(asiaCapital1, asiaCapital3)); - } - - @Test - public void whenCompareTwoHashMapsWithArrayValuesUsingStreamAPI_thenSuccess() { - assertTrue(areEqualWithArrayValue(asiaCity1, asiaCity2)); - assertFalse(areEqualWithArrayValue(asiaCity1, asiaCity3)); - } - - @Test - public void whenCompareTwoHashMapKeys_thenSuccess() { - assertTrue(asiaCapital1.keySet().equals(asiaCapital2.keySet())); - assertFalse(asiaCapital1.keySet().equals(asiaCapital3.keySet())); - } - - @Test - public void whenCompareTwoHashMapKeyValuesUsingStreamAPI_thenSuccess() { - Map asiaCapital3 = new HashMap(); - asiaCapital3.put("Japan", "Tokyo"); - asiaCapital3.put("South Korea", "Seoul"); - asiaCapital3.put("China", "Beijing"); - - Map asiaCapital4 = new HashMap(); - asiaCapital4.put("South Korea", "Seoul"); - asiaCapital4.put("Japan", "Osaka"); - asiaCapital4.put("China", "Beijing"); - - Map result = areEqualKeyValues(asiaCapital3, asiaCapital4); - - assertEquals(3, result.size()); - assertThat(result, hasEntry("Japan", false)); - assertThat(result, hasEntry("South Korea", true)); - assertThat(result, hasEntry("China", true)); - } - - @Test - public void givenDifferentMaps_whenGetDiffUsingGuava_thenSuccess() { - Map asia1 = new HashMap(); - asia1.put("Japan", "Tokyo"); - asia1.put("South Korea", "Seoul"); - asia1.put("India", "New Delhi"); - - Map asia2 = new HashMap(); - asia2.put("Japan", "Tokyo"); - asia2.put("China", "Beijing"); - asia2.put("India", "Delhi"); - - MapDifference diff = Maps.difference(asia1, asia2); - Map> entriesDiffering = diff.entriesDiffering(); - - assertFalse(diff.areEqual()); - assertEquals(1, entriesDiffering.size()); - assertThat(entriesDiffering, hasKey("India")); - assertEquals("New Delhi", entriesDiffering.get("India").leftValue()); - assertEquals("Delhi", entriesDiffering.get("India").rightValue()); - } - - @Test - public void givenDifferentMaps_whenGetEntriesOnOneSideUsingGuava_thenSuccess() { - Map asia1 = new HashMap(); - asia1.put("Japan", "Tokyo"); - asia1.put("South Korea", "Seoul"); - asia1.put("India", "New Delhi"); - - Map asia2 = new HashMap(); - asia2.put("Japan", "Tokyo"); - asia2.put("China", "Beijing"); - asia2.put("India", "Delhi"); - - MapDifference diff = Maps.difference(asia1, asia2); - Map entriesOnlyOnRight = diff.entriesOnlyOnRight(); - Map entriesOnlyOnLeft = diff.entriesOnlyOnLeft(); - - assertEquals(1, entriesOnlyOnRight.size()); - assertThat(entriesOnlyOnRight, hasEntry("China", "Beijing")); - assertEquals(1, entriesOnlyOnLeft.size()); - assertThat(entriesOnlyOnLeft, hasEntry("South Korea", "Seoul")); - } - - @Test - public void givenDifferentMaps_whenGetCommonEntriesUsingGuava_thenSuccess() { - Map asia1 = new HashMap(); - asia1.put("Japan", "Tokyo"); - asia1.put("South Korea", "Seoul"); - asia1.put("India", "New Delhi"); - - Map asia2 = new HashMap(); - asia2.put("Japan", "Tokyo"); - asia2.put("China", "Beijing"); - asia2.put("India", "Delhi"); - - MapDifference diff = Maps.difference(asia1, asia2); - Map entriesInCommon = diff.entriesInCommon(); - - assertEquals(1, entriesInCommon.size()); - assertThat(entriesInCommon, hasEntry("Japan", "Tokyo")); - } - - @Test - public void givenSimilarMapsWithArrayValue_whenCompareUsingGuava_thenFail() { - MapDifference diff = Maps.difference(asiaCity1, asiaCity2); - assertFalse(diff.areEqual()); - } - - @Test - public void givenSimilarMapsWithArrayValue_whenCompareUsingGuavaEquivalence_thenSuccess() { - Equivalence eq = new Equivalence() { - @Override - protected boolean doEquivalent(String[] a, String[] b) { - return Arrays.equals(a, b); - } - - @Override - protected int doHash(String[] value) { - return value.hashCode(); - } - }; - - MapDifference diff = Maps.difference(asiaCity1, asiaCity2, eq); - assertTrue(diff.areEqual()); - - diff = Maps.difference(asiaCity1, asiaCity3, eq); - assertFalse(diff.areEqual()); - } - - // =========================================================================== - - private boolean areEqual(Map first, Map second) { - if (first.size() != second.size()) { - return false; - } - - return first.entrySet() - .stream() - .allMatch(e -> e.getValue() - .equals(second.get(e.getKey()))); - } - - private boolean areEqualWithArrayValue(Map first, Map second) { - if (first.size() != second.size()) { - return false; - } - - return first.entrySet() - .stream() - .allMatch(e -> Arrays.equals(e.getValue(), second.get(e.getKey()))); - } - - private Map areEqualKeyValues(Map first, Map second) { - return first.entrySet() - .stream() - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().equals(second.get(e.getKey())))); - } - -} diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java deleted file mode 100644 index 1057e3b9f0..0000000000 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.baeldung.map.treemaphashmap; - -import org.hamcrest.Matchers; -import org.junit.Assert; -import org.junit.Test; - -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; - -public class TreeMapVsHashMapUnitTest { - - @Test - public void whenInsertObjectsTreeMap_thenNaturalOrder() { - Map treemap = new TreeMap<>(); - treemap.put(3, "TreeMap"); - treemap.put(2, "vs"); - treemap.put(1, "HashMap"); - Assert.assertThat(treemap.keySet(), Matchers.contains(1, 2, 3)); - } - - @Test(expected = NullPointerException.class) - public void whenInsertNullInTreeMap_thenException() { - Map treemap = new TreeMap<>(); - treemap.put(null, "NullPointerException"); - } - - @Test - public void whenInsertObjectsHashMap_thenRandomOrder() { - Map hashmap = new HashMap<>(); - hashmap.put(3, "TreeMap"); - hashmap.put(2, "vs"); - hashmap.put(1, "HashMap"); - Assert.assertThat(hashmap.keySet(), Matchers.containsInAnyOrder(1, 2, 3)); - } - - @Test - public void whenInsertNullInHashMap_thenInsertsNull() { - Map hashmap = new HashMap<>(); - hashmap.put(null, null); - Assert.assertNull(hashmap.get(null)); - } - - @Test - public void givenHashMapAndTreeMap_whenputDuplicates_thenOnlyUnique() { - Map treeMap = new HashMap<>(); - treeMap.put(1, "Baeldung"); - treeMap.put(1, "Baeldung"); - - Assert.assertTrue(treeMap.size() == 1); - - Map treeMap2 = new TreeMap<>(); - treeMap2.put(1, "Baeldung"); - treeMap2.put(1, "Baeldung"); - - Assert.assertTrue(treeMap2.size() == 1); - } -} \ No newline at end of file diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md deleted file mode 100644 index 8fa6fa32fa..0000000000 --- a/java-collections-maps/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## Java Collections Cookbooks and Examples - -This module contains articles about Map data structures in Java. - -### Relevant Articles: -- [Guide to the Guava BiMap](https://www.baeldung.com/guava-bimap) -- [A Guide to Java HashMap](https://www.baeldung.com/java-hashmap) -- [A Guide to LinkedHashMap in Java](https://www.baeldung.com/java-linked-hashmap) -- [A Guide to TreeMap in Java](https://www.baeldung.com/java-treemap) -- [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys) -- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value) -- [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists) -- [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) -- [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map) -- [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap-advanced) -- More articles: [[next -->]](/java-collections-maps-2) diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml deleted file mode 100644 index 38cf1c38ad..0000000000 --- a/java-collections-maps/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - java-collections-maps - 0.1.0-SNAPSHOT - java-collections-maps - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - org.assertj - assertj-core - ${assertj.version} - test - - - - - 4.1 - 3.6.1 - - diff --git a/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java b/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java deleted file mode 100644 index 91b7197a92..0000000000 --- a/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * - */ -package com.baeldung.map; - -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.stream.Stream; - -/** - * @author swpraman - * - */ -public class MapUtil { - - public static Stream keys(Map map, V value) { - return map.entrySet() - .stream() - .filter(entry -> value.equals(entry.getValue())) - .map(Map.Entry::getKey); - } - - public static Set getKeys(Map map, V value) { - Set keys = new HashSet<>(); - for (Entry entry : map.entrySet()) { - if (entry.getValue().equals(value)) { - keys.add(entry.getKey()); - } - } - return keys; - } - - public static K getKey(Map map, V value) { - for (Entry entry : map.entrySet()) { - if (entry.getValue().equals(value)) { - return entry.getKey(); - } - } - return null; - } - -} diff --git a/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java b/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java deleted file mode 100644 index 9993d7862c..0000000000 --- a/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.baeldung.map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MyKey { - private static final Logger LOG = LoggerFactory.getLogger(MyKey.class); - - private String name; - private int id; - - public MyKey(int id, String name) { - this.id = id; - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - @Override - public int hashCode() { - LOG.debug("Calling hashCode()"); - return id; - } - - @Override - public String toString() { - return "MyKey [name=" + name + ", id=" + id + "]"; - } - - @Override - public boolean equals(Object obj) { - LOG.debug("Calling equals() for key: " + obj); - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - MyKey other = (MyKey) obj; - if (id != other.id) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - -} diff --git a/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java b/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java deleted file mode 100644 index b687e57d85..0000000000 --- a/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.map; - -import java.util.LinkedHashMap; -import java.util.Map; - -public class MyLinkedHashMap extends LinkedHashMap { - - /** - * - */ - private static final long serialVersionUID = 1L; - private static final int MAX_ENTRIES = 5; - - public MyLinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { - super(initialCapacity, loadFactor, accessOrder); - } - - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > MAX_ENTRIES; - } - -} diff --git a/java-collections-maps/src/main/resources/logback.xml b/java-collections-maps/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/java-collections-maps/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java deleted file mode 100644 index b44d2db1aa..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.baeldung.guava; - -import static org.junit.Assert.*; -import java.util.HashMap; -import java.util.Map; -import org.junit.Test; -import com.google.common.collect.BiMap; -import com.google.common.collect.EnumHashBiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.ImmutableBiMap; - -public class GuavaBiMapUnitTest { - @Test - public void whenQueryByValue_returnsKey() { - final BiMap capitalCountryBiMap = HashBiMap.create(); - capitalCountryBiMap.put("New Delhi", "India"); - capitalCountryBiMap.put("Washingon, D.C.", "USA"); - capitalCountryBiMap.put("Moscow", "Russia"); - - final String countryCapitalName = capitalCountryBiMap.inverse().get("India"); - - assertEquals("New Delhi", countryCapitalName); - } - - @Test - public void whenCreateBiMapFromExistingMap_returnsKey() { - final Map capitalCountryMap = new HashMap<>(); - capitalCountryMap.put("New Delhi", "India"); - capitalCountryMap.put("Washingon, D.C.", "USA"); - capitalCountryMap.put("Moscow", "Russia"); - final BiMap capitalCountryBiMap = HashBiMap.create(capitalCountryMap); - - final String countryCapitalName = capitalCountryBiMap.inverse().get("India"); - - assertEquals("New Delhi", countryCapitalName); - } - - @Test - public void whenQueryByKey_returnsValue() { - final BiMap capitalCountryBiMap = HashBiMap.create(); - - capitalCountryBiMap.put("New Delhi", "India"); - capitalCountryBiMap.put("Washingon, D.C.", "USA"); - capitalCountryBiMap.put("Moscow", "Russia"); - - assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); - } - - @Test(expected = IllegalArgumentException.class) - public void whenSameValueIsPresent_throwsException() { - final BiMap capitalCountryBiMap = HashBiMap.create(); - - capitalCountryBiMap.put("New Delhi", "India"); - capitalCountryBiMap.put("Washingon, D.C.", "USA"); - capitalCountryBiMap.put("Moscow", "Russia"); - capitalCountryBiMap.put("Trump", "USA"); - } - - @Test - public void givenSameValueIsPresent_whenForcePut_completesSuccessfully() { - final BiMap capitalCountryBiMap = HashBiMap.create(); - - capitalCountryBiMap.put("New Delhi", "India"); - capitalCountryBiMap.put("Washingon, D.C.", "USA"); - capitalCountryBiMap.put("Moscow", "Russia"); - capitalCountryBiMap.forcePut("Trump", "USA"); - - assertEquals("USA", capitalCountryBiMap.get("Trump")); - assertEquals("Trump", capitalCountryBiMap.inverse().get("USA")); - } - - @Test - public void whenSameKeyIsPresent_replacesAlreadyPresent() { - final BiMap capitalCountryBiMap = HashBiMap.create(); - - capitalCountryBiMap.put("New Delhi", "India"); - capitalCountryBiMap.put("Washingon, D.C.", "USA"); - capitalCountryBiMap.put("Moscow", "Russia"); - capitalCountryBiMap.put("Washingon, D.C.", "HongKong"); - - assertEquals("HongKong", capitalCountryBiMap.get("Washingon, D.C.")); - } - - @Test - public void whenUsingImmutableBiMap_allowsPutSuccessfully() { - final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); - - assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); - } - - @Test(expected = UnsupportedOperationException.class) - public void whenUsingImmutableBiMap_doesntAllowRemove() { - final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); - - capitalCountryBiMap.remove("New Delhi"); - } - - @Test(expected = UnsupportedOperationException.class) - public void whenUsingImmutableBiMap_doesntAllowPut() { - final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); - - capitalCountryBiMap.put("New York", "USA"); - } - - private enum Operation { - ADD, SUBTRACT, MULTIPLY, DIVIDE - } - - @Test - public void whenUsingEnumAsKeyInMap_replacesAlreadyPresent() { - final BiMap operationStringBiMap = EnumHashBiMap.create(Operation.class); - - operationStringBiMap.put(Operation.ADD, "Add"); - operationStringBiMap.put(Operation.SUBTRACT, "Subtract"); - operationStringBiMap.put(Operation.MULTIPLY, "Multiply"); - operationStringBiMap.put(Operation.DIVIDE, "Divide"); - - assertEquals("Divide", operationStringBiMap.get(Operation.DIVIDE)); - } -} \ No newline at end of file diff --git a/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java deleted file mode 100644 index d308aac7eb..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.baeldung.map; - -import com.google.common.collect.ImmutableMap; -import org.junit.jupiter.api.Test; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.*; - - -public class ImmutableMapUnitTest { - - @Test - public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { - - Map mutableMap = new HashMap<>(); - mutableMap.put("USA", "North America"); - - Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); - assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); - - mutableMap.remove("USA"); - assertFalse(unmodifiableMap.containsKey("USA")); - - mutableMap.put("Mexico", "North America"); - assertTrue(unmodifiableMap.containsKey("Mexico")); - } - - @Test - @SuppressWarnings("deprecation") - public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { - - Map mutableMap = new HashMap<>(); - mutableMap.put("USA", "North America"); - - ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); - assertTrue(immutableMap.containsKey("USA")); - - assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); - - mutableMap.remove("USA"); - assertTrue(immutableMap.containsKey("USA")); - - mutableMap.put("Mexico", "North America"); - assertFalse(immutableMap.containsKey("Mexico")); - } - - @Test - @SuppressWarnings("deprecation") - public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { - - Map mutableMap = new HashMap<>(); - mutableMap.put("USA", "North America"); - - ImmutableMap immutableMap = ImmutableMap.builder() - .putAll(mutableMap) - .put("Costa Rica", "North America") - .build(); - assertTrue(immutableMap.containsKey("USA")); - assertTrue(immutableMap.containsKey("Costa Rica")); - - assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); - - mutableMap.remove("USA"); - assertTrue(immutableMap.containsKey("USA")); - - mutableMap.put("Mexico", "North America"); - assertFalse(immutableMap.containsKey("Mexico")); - } - - @Test - @SuppressWarnings("deprecation") - public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { - - ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); - assertTrue(immutableMap.containsKey("USA")); - assertTrue(immutableMap.containsKey("Costa Rica")); - - assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); - } - -} diff --git a/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java deleted file mode 100644 index dbad2e5b5e..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.map; - -import org.junit.Test; - -import java.util.Collections; -import java.util.Map; - -import static org.junit.Assert.*; - -public class KeyCheckUnitTest { - - @Test - public void whenKeyIsPresent_thenContainsKeyReturnsTrue() { - Map map = Collections.singletonMap("key", "value"); - - assertTrue(map.containsKey("key")); - assertFalse(map.containsKey("missing")); - } - - @Test - public void whenKeyHasNullValue_thenGetStillWorks() { - Map map = Collections.singletonMap("nothing", null); - - assertTrue(map.containsKey("nothing")); - assertNull(map.get("nothing")); - } -} \ No newline at end of file diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java deleted file mode 100644 index 721b48ea7b..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.baeldung.map; - -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.TreeMultimap; -import org.apache.commons.collections4.MultiMap; -import org.apache.commons.collections4.MultiMapUtils; -import org.apache.commons.collections4.MultiValuedMap; -import org.apache.commons.collections4.map.MultiValueMap; -import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; -import org.apache.commons.collections4.multimap.HashSetValuedHashMap; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.*; - -import static org.assertj.core.api.Assertions.assertThat; - -public class MapMultipleValuesUnitTest { - private static final Logger LOG = LoggerFactory.getLogger(MapMultipleValuesUnitTest.class); - - @Test - public void givenHashMap_whenPuttingTwice_thenReturningFirstValue() { - Map map = new HashMap<>(); - assertThat(map.put("key1", "value1")).isEqualTo(null); - assertThat(map.put("key1", "value2")).isEqualTo("value1"); - assertThat(map.get("key1")).isEqualTo("value2"); - } - - @Test - public void givenCollectionAsValue_whenPuttingTwice_thenReturningCollection() { - Map> map = new HashMap<>(); - List list = new ArrayList<>(); - map.put("key1", list); - map.get("key1").add("value1"); - map.get("key1").add("value2"); - assertThat(map.get("key1").get(0)).isEqualTo("value1"); - assertThat(map.get("key1").get(1)).isEqualTo("value2"); - } - - @Test - public void givenCollectionAsValueAndJava8_whenPuttingTwice_thenReturningCollection() { - Map> map = new HashMap<>(); - map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value1"); - map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value2"); - assertThat(map.get("key1").get(0)).isEqualTo("value1"); - assertThat(map.get("key1").get(1)).isEqualTo("value2"); - } - - @Test - public void givenMultiValueMap_whenPuttingTwice_thenReturningValues() { - MultiMap map = new MultiValueMap<>(); - map.put("key1", "value1"); - map.put("key1", "value2"); - assertThat((Collection) map.get("key1")) - .contains("value1", "value2"); - } - - @Test - public void givenArrayListValuedHashMap_whenPuttingDoubleValues_thenReturningAllValues() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("key1", "value1"); - map.put("key1", "value2"); - map.put("key1", "value2"); - assertThat((Collection) map.get("key1")) - .containsExactly("value1", "value2", "value2"); - } - - @Test - public void givenHashSetValuedHashMap_whenPuttingTwiceTheSame_thenReturningOneValue() { - MultiValuedMap map = new HashSetValuedHashMap<>(); - map.put("key1", "value1"); - map.put("key1", "value1"); - assertThat((Collection) map.get("key1")) - .containsExactly("value1"); - } - - @Test(expected = UnsupportedOperationException.class) - public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("key1", "value1"); - map.put("key1", "value2"); - MultiValuedMap immutableMap = - MultiMapUtils.unmodifiableMultiValuedMap(map); - immutableMap.put("key1", "value3"); - } - - @Test - public void givenArrayListMultiMap_whenInserting_thenCorrectOutput() { - Multimap map = ArrayListMultimap.create(); - map.put("key1", "value2"); - map.put("key1", "value1"); - assertThat((Collection) map.get("key1")) - .containsExactly("value2", "value1"); - } - - @Test - public void givenLinkedHashMultiMap_whenInserting_thenReturningValuesInInsertionOrder() { - Multimap map = LinkedHashMultimap.create(); - map.put("key1", "value3"); - map.put("key1", "value1"); - map.put("key1", "value2"); - assertThat((Collection) map.get("key1")) - .containsExactly("value3", "value1", "value2"); - } - - @Test - public void givenTreeMultimap_whenInserting_thenReturningValuesInNaturalOrder() { - Multimap map = TreeMultimap.create(); - map.put("key1", "value3"); - map.put("key1", "value1"); - map.put("key1", "value2"); - assertThat((Collection) map.get("key1")) - .containsExactly("value1", "value2", "value3"); - } - -} \ No newline at end of file diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java deleted file mode 100644 index eaf68ccba5..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java +++ /dev/null @@ -1,336 +0,0 @@ -package com.baeldung.map; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.*; -import java.util.Map.Entry; - -import static org.junit.Assert.*; - -public class MapUnitTest { - private static final Logger LOG = LoggerFactory.getLogger(MapUnitTest.class); - - - @Test - public void givenHashMap_whenRetrievesKeyset_thenCorrect() { - Map map = new HashMap<>(); - map.put("name", "baeldung"); - map.put("type", "blog"); - - Set keys = map.keySet(); - - assertEquals(2, keys.size()); - assertTrue(keys.contains("name")); - assertTrue(keys.contains("type")); - } - - @Test - public void givenHashMap_whenRetrievesValues_thenCorrect() { - Map map = new HashMap<>(); - map.put("name", "baeldung"); - map.put("type", "blog"); - - Collection values = map.values(); - - assertEquals(2, values.size()); - assertTrue(values.contains("baeldung")); - assertTrue(values.contains("blog")); - } - - @Test - public void givenHashMap_whenRetrievesEntries_thenCorrect() { - Map map = new HashMap<>(); - map.put("name", "baeldung"); - map.put("type", "blog"); - - Set> entries = map.entrySet(); - - assertEquals(2, entries.size()); - for (Entry e : entries) { - String key = e.getKey(); - String val = e.getValue(); - assertTrue(key.equals("name") || key.equals("type")); - assertTrue(val.equals("baeldung") || val.equals("blog")); - } - } - - @Test - public void givenKeySet_whenChangeReflectsInMap_thenCorrect() { - Map map = new HashMap<>(); - map.put("name", "baeldung"); - map.put("type", "blog"); - - assertEquals(2, map.size()); - - Set keys = map.keySet(); - - keys.remove("name"); - assertEquals(1, map.size()); - } - - @Test(expected = ConcurrentModificationException.class) - public void givenIterator_whenFailsFastOnModification_thenCorrect() { - Map map = new HashMap<>(); - map.put("name", "baeldung"); - map.put("type", "blog"); - - Set keys = map.keySet(); - Iterator it = keys.iterator(); - map.remove("type"); - while (it.hasNext()) { - String key = it.next(); - } - } - - public void givenIterator_whenRemoveWorks_thenCorrect() { - Map map = new HashMap<>(); - map.put("name", "baeldung"); - map.put("type", "blog"); - - Set keys = map.keySet(); - Iterator it = keys.iterator(); - while (it.hasNext()) { - it.next(); - it.remove(); - } - assertEquals(0, map.size()); - } - - @Test - public void whenHashCodeIsCalledOnPut_thenCorrect() { - MyKey key = new MyKey(1, "name"); - Map map = new HashMap<>(); - map.put(key, "val"); - } - - @Test - public void whenHashCodeIsCalledOnGet_thenCorrect() { - MyKey key = new MyKey(1, "name"); - Map map = new HashMap<>(); - map.put(key, "val"); - map.get(key); - } - - @Test - public void whenGetWorks_thenCorrect() { - Map map = new HashMap<>(); - map.put("key", "val"); - - String val = map.get("key"); - - assertEquals("val", val); - } - - @Test - public void givenNewKey_whenPutReturnsNull_thenCorrect() { - Map map = new HashMap<>(); - - String rtnVal = map.put("key1", "val1"); - - assertNull(rtnVal); - } - - @Test - public void givenUnmappedKey_whenGetReturnsNull_thenCorrect() { - Map map = new HashMap<>(); - - String rtnVal = map.get("key1"); - - assertNull(rtnVal); - } - - @Test - public void givenNullVal_whenPutReturnsNull_thenCorrect() { - Map map = new HashMap<>(); - - String rtnVal = map.put("key1", null); - - assertNull(rtnVal); - } - - @Test - public void givenNullKeyAndVal_whenAccepts_thenCorrect() { - Map map = new HashMap<>(); - - map.put(null, null); - } - - @Test - public void givenNullVal_whenRetrieves_thenCorrect() { - Map map = new HashMap<>(); - map.put("key", null); - - String val = map.get("key"); - - assertNull(val); - } - - @Test - public void whenContainsDistinguishesNullValues_thenCorrect() { - Map map = new HashMap<>(); - - String val1 = map.get("key"); - boolean valPresent = map.containsKey("key"); - - assertNull(val1); - assertFalse(valPresent); - - map.put("key", null); - String val = map.get("key"); - valPresent = map.containsKey("key"); - - assertNull(val); - assertTrue(valPresent); - - } - - @Test - public void whenPutReturnsPrevValue_thenCorrect() { - Map map = new HashMap<>(); - map.put("key1", "val1"); - String rtnVal = map.put("key1", "val2"); - - assertEquals("val1", rtnVal); - } - - @Test - public void whenCallsEqualsOnCollision_thenCorrect() { - HashMap map = new HashMap<>(); - MyKey k1 = new MyKey(1, "firstKey"); - MyKey k2 = new MyKey(2, "secondKey"); - MyKey k3 = new MyKey(2, "thirdKey"); - - LOG.debug("storing value for k1"); - map.put(k1, "firstValue"); - - LOG.debug("storing value for k2"); - map.put(k2, "secondValue"); - - LOG.debug("storing value for k3"); - map.put(k3, "thirdValue"); - - LOG.debug("retrieving value for k1"); - String v1 = map.get(k1); - - LOG.debug("retrieving value for k2"); - String v2 = map.get(k2); - - LOG.debug("retrieving value for k3"); - String v3 = map.get(k3); - - assertEquals("firstValue", v1); - assertEquals("secondValue", v2); - assertEquals("thirdValue", v3); - - } - - @Test - public void givenLinkedHashMap_whenGetsOrderedKeyset_thenCorrect() { - LinkedHashMap map = new LinkedHashMap<>(); - map.put(1, null); - map.put(2, null); - map.put(3, null); - map.put(4, null); - map.put(5, null); - Set keys = map.keySet(); - Integer[] arr = keys.toArray(new Integer[0]); - for (int i = 0; i < arr.length; i++) { - assertEquals(new Integer(i + 1), arr[i]); - - } - } - - @Test - public void givenLinkedHashMap_whenAccessOrderWorks_thenCorrect() { - LinkedHashMap map = new LinkedHashMap<>(16, .75f, true); - map.put(1, null); - map.put(2, null); - map.put(3, null); - map.put(4, null); - map.put(5, null); - Set keys = map.keySet(); - assertEquals("[1, 2, 3, 4, 5]", keys.toString()); - map.get(4); - assertEquals("[1, 2, 3, 5, 4]", keys.toString()); - map.get(1); - assertEquals("[2, 3, 5, 4, 1]", keys.toString()); - map.get(3); - assertEquals("[2, 5, 4, 1, 3]", keys.toString()); - } - - @Test - public void givenLinkedHashMap_whenRemovesEldestEntry_thenCorrect() { - LinkedHashMap map = new MyLinkedHashMap<>(16, .75f, true); - map.put(1, null); - map.put(2, null); - map.put(3, null); - map.put(4, null); - map.put(5, null); - Set keys = map.keySet(); - assertEquals("[1, 2, 3, 4, 5]", keys.toString()); - map.put(6, null); - assertEquals("[2, 3, 4, 5, 6]", keys.toString()); - map.put(7, null); - assertEquals("[3, 4, 5, 6, 7]", keys.toString()); - map.put(8, null); - assertEquals("[4, 5, 6, 7, 8]", keys.toString()); - } - - @Test - public void givenTreeMap_whenOrdersEntriesNaturally_thenCorrect() { - TreeMap map = new TreeMap<>(); - map.put(3, "val"); - map.put(2, "val"); - map.put(1, "val"); - map.put(5, "val"); - map.put(4, "val"); - assertEquals("[1, 2, 3, 4, 5]", map.keySet().toString()); - } - - @Test - public void givenTreeMap_whenOrdersEntriesNaturally_thenCorrect2() { - TreeMap map = new TreeMap<>(); - map.put("c", "val"); - map.put("b", "val"); - map.put("a", "val"); - map.put("e", "val"); - map.put("d", "val"); - - assertEquals("[a, b, c, d, e]", map.keySet().toString()); - } - - @Test - public void givenTreeMap_whenOrdersEntriesByComparator_thenCorrect() { - TreeMap map = new TreeMap<>(Comparator.reverseOrder()); - map.put(3, "val"); - map.put(2, "val"); - map.put(1, "val"); - map.put(5, "val"); - map.put(4, "val"); - - assertEquals("[5, 4, 3, 2, 1]", map.keySet().toString()); - } - - @Test - public void givenTreeMap_whenPerformsQueries_thenCorrect() { - TreeMap map = new TreeMap<>(); - map.put(3, "val"); - map.put(2, "val"); - map.put(1, "val"); - map.put(5, "val"); - map.put(4, "val"); - - Integer highestKey = map.lastKey(); - Integer lowestKey = map.firstKey(); - Set keysLessThan3 = map.headMap(3).keySet(); - Set keysGreaterThanEqTo3 = map.tailMap(3).keySet(); - - assertEquals(new Integer(5), highestKey); - assertEquals(new Integer(1), lowestKey); - assertEquals("[1, 2]", keysLessThan3.toString()); - assertEquals("[3, 4, 5]", keysGreaterThanEqTo3.toString()); - } - -} diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java deleted file mode 100644 index f8e4c8fd8a..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * - */ -package com.baeldung.map; - -import com.google.common.collect.HashBiMap; -import org.apache.commons.collections4.BidiMap; -import org.apache.commons.collections4.bidimap.DualHashBidiMap; -import org.junit.Test; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.stream.Collectors; - -import static org.junit.Assert.assertEquals; - -/** - * @author swpraman - * - */ -public class MapUtilUnitTest { - - - @Test - public void whenUsingImperativeWayForSingleKey_shouldReturnSingleKey() { - Map capitalCountryMap = new HashMap<>(); - capitalCountryMap.put("Tokyo", "Japan"); - capitalCountryMap.put("New Delhi", "India"); - assertEquals("New Delhi", MapUtil.getKey(capitalCountryMap, "India")); - } - - @Test - public void whenUsingImperativeWayForAllKeys_shouldReturnAllKeys() { - Map capitalCountryMap = new HashMap<>(); - capitalCountryMap.put("Tokyo", "Japan"); - capitalCountryMap.put("Berlin", "Germany"); - capitalCountryMap.put("Cape Town", "South Africa"); - capitalCountryMap.put("Pretoria", "South Africa"); - capitalCountryMap.put("Bloemfontein", "South Africa"); - - assertEquals(new HashSet(Arrays.asList( - new String[] {"Cape Town", "Pretoria", "Bloemfontein"})), - MapUtil.getKeys(capitalCountryMap, "South Africa")); - } - - @Test - public void whenUsingFunctionalWayForSingleKey_shouldReturnSingleKey() { - Map capitalCountryMap = new HashMap<>(); - capitalCountryMap.put("Tokyo", "Japan"); - capitalCountryMap.put("Berlin", "Germany"); - assertEquals("Berlin", MapUtil.keys(capitalCountryMap, "Germany").findFirst().get()); - } - - @Test - public void whenUsingFunctionalWayForAllKeys_shouldReturnAllKeys() { - Map capitalCountryMap = new HashMap<>(); - capitalCountryMap.put("Tokyo", "Japan"); - capitalCountryMap.put("Berlin", "Germany"); - capitalCountryMap.put("Cape Town", "South Africa"); - capitalCountryMap.put("Pretoria", "South Africa"); - capitalCountryMap.put("Bloemfontein", "South Africa"); - assertEquals(new HashSet(Arrays.asList( - new String[] {"Cape Town", "Pretoria", "Bloemfontein"})), - MapUtil.keys(capitalCountryMap, "South Africa").collect(Collectors.toSet())); - } - - @Test - public void whenUsingBidiMap_shouldReturnKey() { - BidiMap capitalCountryMap = new DualHashBidiMap(); - capitalCountryMap.put("Berlin", "Germany"); - capitalCountryMap.put("Cape Town", "South Africa"); - assertEquals("Berlin", capitalCountryMap.getKey("Germany")); - } - - @Test - public void whenUsingBidiMapAddDuplicateValue_shouldRemoveOldEntry() { - BidiMap capitalCountryMap = new DualHashBidiMap(); - capitalCountryMap.put("Berlin", "Germany"); - capitalCountryMap.put("Cape Town", "South Africa"); - capitalCountryMap.put("Pretoria", "South Africa"); - assertEquals("Pretoria", capitalCountryMap.getKey("South Africa")); - } - - @Test - public void whenUsingBiMap_shouldReturnKey() { - HashBiMap capitalCountryMap = HashBiMap.create(); - capitalCountryMap.put("Berlin", "Germany"); - capitalCountryMap.put("Cape Town", "South Africa"); - assertEquals("Berlin", capitalCountryMap.inverse().get("Germany")); - } - - @Test(expected=IllegalArgumentException.class) - public void whenUsingBiMapAddDuplicateValue_shouldThrowException() { - HashBiMap capitalCountryMap = HashBiMap.create(); - capitalCountryMap.put("Berlin", "Germany"); - capitalCountryMap.put("Cape Town", "South Africa"); - capitalCountryMap.put("Pretoria", "South Africa"); - assertEquals("Berlin", capitalCountryMap.inverse().get("Germany")); - } - -} diff --git a/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java deleted file mode 100644 index 686c1cef87..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.baeldung.map; - -import org.apache.commons.collections4.MultiMapUtils; -import org.apache.commons.collections4.MultiSet; -import org.apache.commons.collections4.MultiValuedMap; -import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; -import org.apache.commons.collections4.multimap.HashSetValuedHashMap; -import org.junit.Test; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - -public class MultiValuedMapUnitTest { - - @Test - public void givenMultiValuesMap_whenPuttingMultipleValuesUsingPutMethod_thenReturningAllValues() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - - map.put("fruits", "apple"); - map.put("fruits", "orange"); - - assertThat((Collection) map.get("fruits")).containsExactly("apple", "orange"); - - } - - @Test - public void givenMultiValuesMap_whenPuttingMultipleValuesUsingPutAllMethod_thenReturningAllValues() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - - map.putAll("vehicles", Arrays.asList("car", "bike")); - - assertThat((Collection) map.get("vehicles")).containsExactly("car", "bike"); - - } - - @Test - public void givenMultiValuesMap_whenGettingValueUsingGetMethod_thenReturningValue() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - - map.put("fruits", "apple"); - - assertThat((Collection) map.get("fruits")).containsExactly("apple"); - } - - @Test - public void givenMultiValuesMap_whenUsingEntriesMethod_thenReturningMappings() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - - Collection> entries = (Collection>) map.entries(); - - for(Map.Entry entry : entries) { - assertThat(entry.getKey()).contains("fruits"); - assertTrue(entry.getValue().equals("apple") || entry.getValue().equals("orange") ); - } - } - - @Test - public void givenMultiValuesMap_whenUsingKeysMethod_thenReturningAllKeys() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - - MultiSet keys = map.keys(); - - assertThat((keys)).contains("fruits", "vehicles"); - - } - - @Test - public void givenMultiValuesMap_whenUsingKeySetMethod_thenReturningAllKeys() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - - Set keys = map.keySet(); - - assertThat(keys).contains("fruits", "vehicles"); - - } - - @Test - public void givenMultiValuesMap_whenUsingValuesMethod_thenReturningAllValues() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - - assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); - } - - @Test - public void givenMultiValuesMap_whenUsingRemoveMethod_thenReturningUpdatedMap() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); - - map.remove("fruits"); - - assertThat(((Collection) map.values())).contains("car", "bike"); - - } - - @Test - public void givenMultiValuesMap_whenUsingRemoveMappingMethod_thenReturningUpdatedMapAfterMappingRemoved() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); - - map.removeMapping("fruits", "apple"); - - assertThat(((Collection) map.values())).contains("orange", "car", "bike"); - } - - @Test - public void givenMultiValuesMap_whenUsingClearMethod_thenReturningEmptyMap() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); - - map.clear(); - - assertTrue(map.isEmpty()); - } - - @Test - public void givenMultiValuesMap_whenUsingContainsKeyMethod_thenReturningTrue() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - - assertTrue(map.containsKey("fruits")); - } - - @Test - public void givenMultiValuesMap_whenUsingContainsValueMethod_thenReturningTrue() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - - assertTrue(map.containsValue("orange")); - } - - @Test - public void givenMultiValuesMap_whenUsingIsEmptyMethod_thenReturningFalse() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - - assertFalse(map.isEmpty()); - } - - @Test - public void givenMultiValuesMap_whenUsingSizeMethod_thenReturningElementCount() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("vehicles", "car"); - map.put("vehicles", "bike"); - - assertEquals(4, map.size()); - } - - @Test - public void givenArrayListValuedHashMap_whenPuttingDoubleValues_thenReturningAllValues() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - map.put("fruits", "orange"); - - assertThat((Collection) map.get("fruits")).containsExactly("apple", "orange", "orange"); - } - - @Test - public void givenHashSetValuedHashMap_whenPuttingTwiceTheSame_thenReturningOneValue() { - MultiValuedMap map = new HashSetValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "apple"); - - assertThat((Collection) map.get("fruits")).containsExactly("apple"); - } - - @Test(expected = UnsupportedOperationException.class) - public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() { - MultiValuedMap map = new ArrayListValuedHashMap<>(); - map.put("fruits", "apple"); - map.put("fruits", "orange"); - MultiValuedMap immutableMap = MultiMapUtils.unmodifiableMultiValuedMap(map); - - immutableMap.put("fruits", "banana"); - - } - - -} From cb7bd8d2f2d6e94ad5d8846886c041edbd8bbdcb Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 7 Apr 2020 14:50:03 +0530 Subject: [PATCH 332/530] JAVA-1188: Moved modules to core-java-modules --- .../core-java-collections-maps-2/README.md | 16 + .../core-java-collections-maps-2/pom.xml | 79 ++++ .../main/java/com/baeldung/map/Product.java | 133 +++++++ .../com/baeldung/map/convert/MapToString.java | 34 ++ .../com/baeldung/map/convert/StringToMap.java | 21 ++ .../baeldung/map/copyhashmap/CopyHashMap.java | 55 +++ .../map/initialize/MapInitializer.java | 80 +++++ .../baeldung/map/iteration/MapIteration.java | 74 ++++ .../java/com/baeldung/map/mapmax/MapMax.java | 92 +++++ .../com/baeldung/map/mergemaps/Employee.java | 60 ++++ .../com/baeldung/map/mergemaps/MergeMaps.java | 105 ++++++ .../map/primitives/PrimitiveMaps.java | 69 ++++ .../com/baeldung/map/sort/SortHashMap.java | 104 ++++++ .../com/baeldung/map/ProductUnitTest.java | 174 +++++++++ .../map/convert/MapToStringUnitTest.java | 48 +++ .../map/convert/StringToMapUnitTest.java | 23 ++ .../map/copyhashmap/CopyHashMapUnitTest.java | 76 ++++ .../baeldung/map/copyhashmap/Employee.java | 28 ++ .../initialize/MapInitializerUnitTest.java | 27 ++ .../baeldung/map/mapmax/MapMaxUnitTest.java | 58 +++ .../map/weakhashmap/WeakHashMapUnitTest.java | 72 ++++ .../core-java-collections-maps-3/README.md | 8 + .../core-java-collections-maps-3/pom.xml | 26 ++ .../compare/HashMapComparisonUnitTest.java | 225 ++++++++++++ .../TreeMapVsHashMapUnitTest.java | 58 +++ .../core-java-collections-maps/README.md | 16 + .../core-java-collections-maps/pom.xml | 35 ++ .../main/java/com/baeldung/map/MapUtil.java | 44 +++ .../src/main/java/com/baeldung/map/MyKey.java | 64 ++++ .../com/baeldung/map/MyLinkedHashMap.java | 23 ++ .../src/main/resources/logback.xml | 13 + .../baeldung/guava/GuavaBiMapUnitTest.java | 120 +++++++ .../baeldung/map/ImmutableMapUnitTest.java | 84 +++++ .../com/baeldung/map/KeyCheckUnitTest.java | 27 ++ .../map/MapMultipleValuesUnitTest.java | 119 +++++++ .../java/com/baeldung/map/MapUnitTest.java | 336 ++++++++++++++++++ .../com/baeldung/map/MapUtilUnitTest.java | 103 ++++++ .../baeldung/map/MultiValuedMapUnitTest.java | 227 ++++++++++++ core-java-modules/pom.xml | 3 + 39 files changed, 2959 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-2/README.md create mode 100644 core-java-modules/core-java-collections-maps-2/pom.xml create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/Product.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-3/README.md create mode 100644 core-java-modules/core-java-collections-maps-3/pom.xml create mode 100644 core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps/README.md create mode 100644 core-java-modules/core-java-collections-maps/pom.xml create mode 100644 core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java create mode 100644 core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyKey.java create mode 100644 core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java create mode 100644 core-java-modules/core-java-collections-maps/src/main/resources/logback.xml create mode 100644 core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-2/README.md b/core-java-modules/core-java-collections-maps-2/README.md new file mode 100644 index 0000000000..da9279b191 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/README.md @@ -0,0 +1,16 @@ +## Java Collections Cookbooks and Examples + +This module contains articles about Map data structures in Java. + +### Relevant Articles: +- [Map of Primitives in Java](https://www.baeldung.com/java-map-primitives) +- [Copying a HashMap in Java](https://www.baeldung.com/java-copy-hashmap) +- [A Guide to Java HashMap](https://www.baeldung.com/java-hashmap) +- [Guide to WeakHashMap in Java](https://www.baeldung.com/java-weakhashmap) +- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion) +- [Iterate over a Map in Java](https://www.baeldung.com/java-iterate-map) +- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps) +- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) +- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) +- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) +- More articles: [[<-- prev]](/core-java-collections-maps) [[next -->]](/core-java-collections-maps-3) diff --git a/core-java-modules/core-java-collections-maps-2/pom.xml b/core-java-modules/core-java-collections-maps-2/pom.xml new file mode 100644 index 0000000000..a08a4ac072 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + core-java-collections-maps-2 + 0.1.0-SNAPSHOT + core-java-collections-maps-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.eclipse.collections + eclipse-collections + ${eclipse-collections.version} + + + net.sf.trove4j + trove4j + ${trove4j.version} + + + it.unimi.dsi + fastutil + ${fastutil.version} + + + colt + colt + ${colt.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + one.util + streamex + ${streamex.version} + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + 0.6.5 + 4.1 + 1.7.0 + 8.2.0 + 3.0.2 + 8.1.0 + 1.2.0 + 3.11.1 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/Product.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/Product.java new file mode 100644 index 0000000000..5559895730 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/Product.java @@ -0,0 +1,133 @@ +package com.baeldung.map; + +import java.util.*; + +public class Product { + + private String name; + private String description; + private List tags; + + public Product(String name, String description) { + this.name = name; + this.description = description; + this.tags = new ArrayList<>(); + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public List getTags() { + return tags; + } + + public Product addTagsOfOtherProdcut(Product product) { + this.tags.addAll(product.getTags()); + return this; + } + + @Override + public boolean equals(Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Product product = (Product) o; + return Objects.equals(name, product.name) && + Objects.equals(description, product.description); + } + + @Override + public int hashCode() { + return Objects.hash(name, description); + } + + public static void forEach() { + + HashMap productsByName = new HashMap<>(); + productsByName.forEach( (key, product) + -> System.out.println("Key: " + key + " Product:" + product.getDescription()) + //do something with the key and value + ); + + //Prior to Java 8: + for(Map.Entry entry : productsByName.entrySet()) { + Product product = entry.getValue(); + String key = entry.getKey(); + //do something with the key and value + } + } + + public static void getOrDefault() { + + HashMap productsByName = new HashMap<>(); + Product chocolate = new Product("chocolate", "something sweet"); + Product defaultProduct = productsByName.getOrDefault("horse carriage", chocolate); + Product bike = productsByName.getOrDefault("E-Bike", chocolate); + + //Prior to Java 8: + Product bike2 = productsByName.containsKey("E-Bike") + ? productsByName.get("E-Bike") + : chocolate; + Product defaultProduct2 = productsByName.containsKey("horse carriage") + ? productsByName.get("horse carriage") + : chocolate; + } + + public static void putIfAbsent() { + + HashMap productsByName = new HashMap<>(); + Product chocolate = new Product("chocolate", "something sweet"); + productsByName.putIfAbsent("E-Bike", chocolate); + + //Prior to Java 8: + if(productsByName.containsKey("E-Bike")) { + productsByName.put("E-Bike", chocolate); + } + } + + public static void merge() { + + HashMap productsByName = new HashMap<>(); + Product eBike2 = new Product("E-Bike", "A bike with a battery"); + eBike2.getTags().add("sport"); + productsByName.merge("E-Bike", eBike2, Product::addTagsOfOtherProdcut); + + //Prior to Java 8: + if(productsByName.containsKey("E-Bike")) { + productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2); + } else { + productsByName.put("E-Bike", eBike2); + } + } + + public static void compute() { + + HashMap productsByName = new HashMap<>(); + Product eBike2 = new Product("E-Bike", "A bike with a battery"); + + productsByName.compute("E-Bike", (k,v) -> { + if(v != null) { + return v.addTagsOfOtherProdcut(eBike2); + } else { + return eBike2; + } + }); + + //Prior to Java 8: + if(productsByName.containsKey("E-Bike")) { + productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2); + } else { + productsByName.put("E-Bike", eBike2); + } + } +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java new file mode 100644 index 0000000000..d13be924ff --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java @@ -0,0 +1,34 @@ +package com.baeldung.map.convert; + +import com.google.common.base.Joiner; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; +import java.util.stream.Collectors; + +public class MapToString { + + public static String convertWithIteration(Map map) { + StringBuilder mapAsString = new StringBuilder("{"); + for (Integer key : map.keySet()) { + mapAsString.append(key + "=" + map.get(key) + ", "); + } + mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}"); + return mapAsString.toString(); + } + + public static String convertWithStream(Map map) { + String mapAsString = map.keySet().stream() + .map(key -> key + "=" + map.get(key)) + .collect(Collectors.joining(", ", "{", "}")); + return mapAsString; + } + + public static String convertWithGuava(Map map) { + return Joiner.on(",").withKeyValueSeparator("=").join(map); + } + + public static String convertWithApache(Map map) { + return StringUtils.join(map); + } +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java new file mode 100644 index 0000000000..416ba4dd9a --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java @@ -0,0 +1,21 @@ +package com.baeldung.map.convert; + +import com.google.common.base.Splitter; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +public class StringToMap { + + public static Map convertWithStream(String mapAsString) { + Map map = Arrays.stream(mapAsString.split(",")) + .map(entry -> entry.split("=")) + .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1])); + return map; + } + + public static Map convertWithGuava(String mapAsString) { + return Splitter.on(',').withKeyValueSeparator('=').split(mapAsString); + } +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java new file mode 100644 index 0000000000..cb18f3aa11 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java @@ -0,0 +1,55 @@ +package com.baeldung.map.copyhashmap; + +import org.apache.commons.lang3.SerializationUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; + +public class CopyHashMap { + + public static HashMap copyUsingConstructor(HashMap originalMap) { + return new HashMap(originalMap); + } + + public static HashMap copyUsingClone(HashMap originalMap) { + return (HashMap) originalMap.clone(); + } + + public static HashMap copyUsingPut(HashMap originalMap) { + HashMap shallowCopy = new HashMap(); + Set> entries = originalMap.entrySet(); + for(Map.Entry mapEntry: entries) { + shallowCopy.put(mapEntry.getKey(), mapEntry.getValue()); + } + + return shallowCopy; + } + + public static HashMap copyUsingPutAll(HashMap originalMap) { + HashMap shallowCopy = new HashMap(); + shallowCopy.putAll(originalMap); + + return shallowCopy; + } + + public static HashMap copyUsingJava8Stream(HashMap originalMap) { + Set> entries = originalMap.entrySet(); + HashMap shallowCopy = (HashMap) entries + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + return shallowCopy; + } + + public static HashMap shallowCopy(HashMap originalMap) { + return (HashMap) originalMap.clone(); + } + + public static HashMap deepCopy(HashMap originalMap) { + return SerializationUtils.clone(originalMap); + } + +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java new file mode 100644 index 0000000000..4d63abcfd0 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java @@ -0,0 +1,80 @@ +package com.baeldung.map.initialize; + +import java.util.AbstractMap; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class MapInitializer { + + public static Map articleMapOne; + static { + articleMapOne = new HashMap<>(); + articleMapOne.put("ar01", "Intro to Map"); + articleMapOne.put("ar02", "Some article"); + } + + public static Map createSingletonMap() { + Map passwordMap = Collections.singletonMap("username1", "password1"); + return passwordMap; + + } + + public Map createEmptyMap() { + Map emptyMap = Collections.emptyMap(); + return emptyMap; + } + + public Map createUsingDoubleBrace() { + Map doubleBraceMap = new HashMap() { + + /** + * + */ + private static final long serialVersionUID = 1L; + + { + put("key1", "value1"); + put("key2", "value2"); + } + }; + return doubleBraceMap; + } + + public Map createMapUsingStreamStringArray() { + Map map = Stream.of(new String[][] { { "Hello", "World" }, { "John", "Doe" }, }) + .collect(Collectors.toMap(data -> data[0], data -> data[1])); + + return map; + } + + public Map createMapUsingStreamObjectArray() { + Map map = Stream.of(new Object[][] { { "data1", 1 }, { "data2", 2 }, }) + .collect(Collectors.toMap(data -> (String) data[0], data -> (Integer) data[1])); + + return map; + } + + public Map createMapUsingStreamSimpleEntry() { + Map map = Stream.of(new AbstractMap.SimpleEntry<>("idea", 1), new AbstractMap.SimpleEntry<>("mobile", 2)) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + return map; + } + + public Map createMapUsingStreamSimpleImmutableEntry() { + Map map = Stream.of(new AbstractMap.SimpleImmutableEntry<>("idea", 1), new AbstractMap.SimpleImmutableEntry<>("mobile", 2)) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + return map; + } + + public Map createImmutableMapWithStreams() { + Map map = Stream.of(new String[][] { { "Hello", "World" }, { "John", "Doe" }, }) + .collect(Collectors.collectingAndThen(Collectors.toMap(data -> data[0], data -> data[1]), Collections:: unmodifiableMap)); + return map; + + } +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java new file mode 100644 index 0000000000..b0c32e1487 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java @@ -0,0 +1,74 @@ +package com.baeldung.map.iteration; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class MapIteration { + + public static void main(String[] args) { + MapIteration mapIteration = new MapIteration(); + Map map = new HashMap<>(); + + map.put("One", 1); + map.put("Three", 3); + map.put("Two", 2); + + System.out.println("Iterating Keys of Map Using KeySet"); + mapIteration.iterateKeys(map); + + System.out.println("Iterating Map Using Entry Set"); + mapIteration.iterateUsingEntrySet(map); + + System.out.println("Iterating Using Iterator and Map Entry"); + mapIteration.iterateUsingIteratorAndEntry(map); + + System.out.println("Iterating Using KeySet and For Each"); + mapIteration.iterateUsingKeySetAndForeach(map); + + System.out.println("Iterating Map Using Lambda Expression"); + mapIteration.iterateUsingLambda(map); + + System.out.println("Iterating Using Stream API"); + mapIteration.iterateUsingStreamAPI(map); + } + + public void iterateUsingEntrySet(Map map) { + for (Map.Entry entry : map.entrySet()) { + System.out.println(entry.getKey() + ":" + entry.getValue()); + } + } + + public void iterateUsingLambda(Map map) { + map.forEach((k, v) -> System.out.println((k + ":" + v))); + } + + public void iterateUsingIteratorAndEntry(Map map) { + Iterator> iterator = map.entrySet() + .iterator(); + while (iterator.hasNext()) { + Map.Entry pair = iterator.next(); + System.out.println(pair.getKey() + ":" + pair.getValue()); + } + } + + public void iterateUsingKeySetAndForeach(Map map) { + for (String key : map.keySet()) { + System.out.println(key + ":" + map.get(key)); + } + } + + public void iterateUsingStreamAPI(Map map) { + map.entrySet() + .stream() + .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); + } + + public void iterateKeys(Map map) { + for (String key : map.keySet()) { + System.out.println(key); + } + + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java new file mode 100644 index 0000000000..8c33c857ee --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java @@ -0,0 +1,92 @@ +package com.baeldung.map.mapmax; + +import java.util.*; +import java.util.Map.Entry; + +public class MapMax { + + public > V maxUsingIteration(Map map) { + + Map.Entry maxEntry = null; + + for (Map.Entry entry : map.entrySet()) { + + if (maxEntry == null || entry.getValue() + .compareTo(maxEntry.getValue()) > 0) { + maxEntry = entry; + } + } + + return maxEntry.getValue(); + } + + public > V maxUsingCollectionsMax(Map map) { + + Entry maxEntry = Collections.max(map.entrySet(), new Comparator>() { + public int compare(Entry e1, Entry e2) { + return e1.getValue() + .compareTo(e2.getValue()); + } + }); + + return maxEntry.getValue(); + } + + public > V maxUsingCollectionsMaxAndLambda(Map map) { + + Entry maxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue() + .compareTo(e2.getValue())); + + return maxEntry.getValue(); + } + + public > V maxUsingCollectionsMaxAndMethodReference(Map map) { + + Entry maxEntry = Collections.max(map.entrySet(), Comparator.comparing(Map.Entry::getValue)); + + return maxEntry.getValue(); + } + + public > V maxUsingStreamAndLambda(Map map) { + + Optional> maxEntry = map.entrySet() + .stream() + .max((Entry e1, Entry e2) -> e1.getValue() + .compareTo(e2.getValue())); + + return maxEntry.get() + .getValue(); + } + + public > V maxUsingStreamAndMethodReference(Map map) { + + Optional> maxEntry = map.entrySet() + .stream() + .max(Comparator.comparing(Map.Entry::getValue)); + + return maxEntry.get() + .getValue(); + } + + public static void main(String[] args) { + + Map map = new HashMap(); + + map.put(1, 3); + map.put(2, 4); + map.put(3, 5); + map.put(4, 6); + map.put(5, 7); + + MapMax mapMax = new MapMax(); + + System.out.println(mapMax.maxUsingIteration(map)); + System.out.println(mapMax.maxUsingCollectionsMax(map)); + System.out.println(mapMax.maxUsingCollectionsMaxAndLambda(map)); + System.out.println(mapMax.maxUsingCollectionsMaxAndMethodReference(map)); + System.out.println(mapMax.maxUsingStreamAndLambda(map)); + System.out.println(mapMax.maxUsingStreamAndMethodReference(map)); + + } + +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java new file mode 100644 index 0000000000..d7fb0d1a1d --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java @@ -0,0 +1,60 @@ +package com.baeldung.map.mergemaps; + +public class Employee implements Comparable { + + private Long id; + private String name; + + public Employee(Long id, String name) { + this.name = name; + this.id = id; + } + + 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Employee employee = (Employee) o; + + if (!id.equals(employee.id)) return false; + return name.equals(employee.name); + + } + + @Override + public int hashCode() { + int result = id.hashCode(); + result = 31 * result + name.hashCode(); + return result; + } + + @Override + public String toString() { + return "Employee{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } + + @Override + public int compareTo(Employee employee) { + return (int)(this.id - employee.getId()); + } +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java new file mode 100644 index 0000000000..4f187bad90 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java @@ -0,0 +1,105 @@ +package com.baeldung.map.mergemaps; + +import one.util.streamex.EntryStream; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class MergeMaps { + + private static Map map1 = new HashMap<>(); + private static Map map2 = new HashMap<>(); + + public static void main(String[] args) { + + initialize(); + + mergeFunction(); + + streamConcat(); + + streamOf(); + + streamEx(); + + streamMerge(); + } + + private static void streamMerge() { + + Map map3 = map2.entrySet() + .stream() + .collect( + Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (v1, v2) -> new Employee(v1.getId(), v2.getName()), + () -> new HashMap<>(map1) + ) + ); + + System.out.println(map3); + } + + private static void streamEx() { + Map map3 = EntryStream.of(map1) + .append(EntryStream.of(map2)) + .toMap((e1, e2) -> e1); + + System.out.println(map3); + + } + + private static void streamOf() { + Map map3 = Stream.of(map1, map2) + .flatMap(map -> map.entrySet().stream()) + .collect( + Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (v1, v2) -> new Employee(v1.getId(), v2.getName()) + ) + ); + + map3.entrySet().forEach(System.out::println); + } + + private static void streamConcat() { + Map result = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream()).collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (value1, value2) -> new Employee(value2.getId(), value1.getName()) + )); + + result.entrySet().forEach(System.out::println); + } + + private static void mergeFunction() { + Map map3 = new HashMap<>(map1); + + map2.forEach( + (key, value) -> map3.merge(key, value, (v1, v2) -> + new Employee(v1.getId(), v2.getName())) + ); + + map3.entrySet().forEach(System.out::println); + } + + + private static void initialize() { + Employee employee1 = new Employee(1L, "Henry"); + map1.put(employee1.getName(), employee1); + Employee employee2 = new Employee(22L, "Annie"); + map1.put(employee2.getName(), employee2); + Employee employee3 = new Employee(8L, "John"); + map1.put(employee3.getName(), employee3); + + Employee employee4 = new Employee(2L, "George"); + map2.put(employee4.getName(), employee4); + Employee employee5 = new Employee(3L, "Henry"); + map2.put(employee5.getName(), employee5); + } + +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java new file mode 100644 index 0000000000..30bec12ccc --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java @@ -0,0 +1,69 @@ +package com.baeldung.map.primitives; + +import cern.colt.map.AbstractIntDoubleMap; +import cern.colt.map.OpenIntDoubleHashMap; +import gnu.trove.map.TDoubleIntMap; +import gnu.trove.map.hash.TDoubleIntHashMap; +import it.unimi.dsi.fastutil.ints.Int2BooleanMap; +import it.unimi.dsi.fastutil.ints.Int2BooleanOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2BooleanSortedMap; +import it.unimi.dsi.fastutil.ints.Int2BooleanSortedMaps; +import org.eclipse.collections.api.map.primitive.ImmutableIntIntMap; +import org.eclipse.collections.api.map.primitive.MutableIntIntMap; +import org.eclipse.collections.api.map.primitive.MutableObjectDoubleMap; +import org.eclipse.collections.impl.factory.primitive.IntIntMaps; +import org.eclipse.collections.impl.factory.primitive.ObjectDoubleMaps; + +public class PrimitiveMaps { + + public static void main(String[] args) { + + eclipseCollectionsMap(); + troveMap(); + coltMap(); + fastutilMap(); + } + + private static void fastutilMap() { + Int2BooleanMap int2BooleanMap = new Int2BooleanOpenHashMap(); + int2BooleanMap.put(1, true); + int2BooleanMap.put(7, false); + int2BooleanMap.put(4, true); + + boolean value = int2BooleanMap.get(1); + + Int2BooleanSortedMap int2BooleanSorted = Int2BooleanSortedMaps.EMPTY_MAP; + } + + private static void coltMap() { + AbstractIntDoubleMap map = new OpenIntDoubleHashMap(); + map.put(1, 4.5); + double value = map.get(1); + } + + private static void eclipseCollectionsMap() { + MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty(); + mutableIntIntMap.addToValue(1, 1); + + ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty(); + + MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty(); + dObject.addToValue("price", 150.5); + dObject.addToValue("quality", 4.4); + dObject.addToValue("stability", 0.8); + } + + private static void troveMap() { + double[] doubles = new double[] {1.2, 4.5, 0.3}; + int[] ints = new int[] {1, 4, 0}; + + TDoubleIntMap doubleIntMap = new TDoubleIntHashMap(doubles, ints); + + doubleIntMap.put(1.2, 22); + doubleIntMap.put(4.5, 16); + + doubleIntMap.adjustValue(1.2, 1); + doubleIntMap.adjustValue(4.5, 4); + doubleIntMap.adjustValue(0.3, 7); + } +} diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java new file mode 100644 index 0000000000..14610ffb00 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java @@ -0,0 +1,104 @@ +package com.baeldung.map.sort; + +import com.baeldung.map.mergemaps.Employee; +import com.google.common.base.Functions; +import com.google.common.collect.ImmutableSortedMap; +import com.google.common.collect.Ordering; + +import java.util.*; +import java.util.stream.Collectors; + +public class SortHashMap { + + private static Map map = new HashMap<>(); + + public static void main(String[] args) { + + initialize(); + + treeMapSortByKey(); + + arrayListSortByValue(); + arrayListSortByKey(); + + sortStream(); + + sortGuava(); + + addDuplicates(); + + treeSetByKey(); + treeSetByValue(); + + } + + private static void sortGuava() { + final Ordering naturalOrdering = + Ordering.natural().onResultOf(Functions.forMap(map, null)); + + System.out.println(ImmutableSortedMap.copyOf(map, naturalOrdering)); + } + + private static void sortStream() { + map.entrySet().stream() + .sorted(Map.Entry.comparingByKey().reversed()) + .forEach(System.out::println); + + Map result = map.entrySet().stream() + .sorted(Map.Entry.comparingByValue()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (oldValue, newValue) -> oldValue, LinkedHashMap::new)); + + result.entrySet().forEach(System.out::println); + } + + private static void treeSetByValue() { + SortedSet values = new TreeSet<>(map.values()); + System.out.println(values); + } + + private static void treeSetByKey() { + SortedSet keysSet = new TreeSet<>(map.keySet()); + System.out.println(keysSet); + } + + private static void treeMapSortByKey() { + TreeMap sorted = new TreeMap<>(map); + sorted.putAll(map); + + sorted.entrySet().forEach(System.out::println); + + } + + private static void arrayListSortByValue() { + List employeeById = new ArrayList<>(map.values()); + + Collections.sort(employeeById); + + System.out.println(employeeById); + } + + private static void arrayListSortByKey() { + List employeeByKey = new ArrayList<>(map.keySet()); + Collections.sort(employeeByKey); + System.out.println(employeeByKey); + } + + private static void initialize() { + Employee employee1 = new Employee(1L, "Mher"); + map.put(employee1.getName(), employee1); + Employee employee2 = new Employee(22L, "Annie"); + map.put(employee2.getName(), employee2); + Employee employee3 = new Employee(8L, "John"); + map.put(employee3.getName(), employee3); + Employee employee4 = new Employee(2L, "George"); + map.put(employee4.getName(), employee4); + } + + private static void addDuplicates() { + Employee employee5 = new Employee(1L, "Mher"); + map.put(employee5.getName(), employee5); + Employee employee6 = new Employee(22L, "Annie"); + map.put(employee6.getName(), employee6); + } +} diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java new file mode 100644 index 0000000000..ba29d5c454 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java @@ -0,0 +1,174 @@ +package com.baeldung.map; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.*; + +class ProductUnitTest { + + + @Test + public void getExistingValue() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + + Product nextPurchase = productsByName.get("E-Bike"); + + assertEquals("A bike with a battery", nextPurchase.getDescription()); + } + + @Test + public void getNonExistingValue() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + + Product nextPurchase = productsByName.get("Car"); + + assertNull(nextPurchase); + } + + @Test + public void getExistingValueAfterSameKeyInsertedTwice() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + Product newEBike = new Product("E-Bike", "A bike with a better battery"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + productsByName.put(newEBike.getName(), newEBike); + + Product nextPurchase = productsByName.get("E-Bike"); + + assertEquals("A bike with a better battery", nextPurchase.getDescription()); + } + + @Test + public void getExistingValueWithNullKey() { + HashMap productsByName = new HashMap<>(); + + Product defaultProduct = new Product("Chocolate", "At least buy chocolate"); + + productsByName.put(null, defaultProduct); + productsByName.put(defaultProduct.getName(), defaultProduct); + + Product nextPurchase = productsByName.get(null); + assertEquals("At least buy chocolate", nextPurchase.getDescription()); + + nextPurchase = productsByName.get("Chocolate"); + assertEquals("At least buy chocolate", nextPurchase.getDescription()); + } + + @Test + public void insertSameObjectWithDifferentKey() { + HashMap productsByName = new HashMap<>(); + + Product defaultProduct = new Product("Chocolate", "At least buy chocolate"); + + productsByName.put(null, defaultProduct); + productsByName.put(defaultProduct.getName(), defaultProduct); + + assertSame(productsByName.get(null), productsByName.get("Chocolate")); + } + + @Test + public void checkIfKeyExists() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + + productsByName.put(eBike.getName(), eBike); + + assertTrue(productsByName.containsKey("E-Bike")); + } + + @Test + public void checkIfValueExists() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + + productsByName.put(eBike.getName(), eBike); + + assertTrue(productsByName.containsValue(eBike)); + } + + @Test + public void removeExistingKey() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + + productsByName.remove("E-Bike"); + + assertNull(productsByName.get("E-Bike")); + } + + @Test + public void givenMutableKeyWhenKeyChangeThenValueNotFound() { + // Given + MutableKey key = new MutableKey("initial"); + + Map items = new HashMap<>(); + items.put(key, "success"); + + // When + key.setName("changed"); + + // Then + assertNull(items.get(key)); + } + + static class MutableKey { + private String name; + + public MutableKey(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MutableKey that = (MutableKey) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + } + +} diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java new file mode 100644 index 0000000000..4517dea328 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.map.convert; + +import org.apache.commons.collections4.MapUtils; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +public class MapToStringUnitTest { + + private Map wordsByKey = new HashMap<>(); + + @BeforeEach + public void setup() { + wordsByKey.clear(); + wordsByKey.put(1, "one"); + wordsByKey.put(2, "two"); + wordsByKey.put(3, "three"); + wordsByKey.put(4, "four"); + } + + @Test + public void givenMap_WhenUsingIteration_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithIteration(wordsByKey); + Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); + } + + @Test + public void givenMap_WhenUsingStream_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithStream(wordsByKey); + Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); + } + + @Test + public void givenMap_WhenUsingGuava_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithGuava(wordsByKey); + Assert.assertEquals("1=one,2=two,3=three,4=four", mapAsString); + } + + @Test + public void givenMap_WhenUsingApache_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithApache(wordsByKey); + Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); + MapUtils.debugPrint(System.out, "Map as String", wordsByKey); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java new file mode 100644 index 0000000000..2f80b30871 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.map.convert; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +public class StringToMapUnitTest { + + @Test + public void givenString_WhenUsingStream_ThenResultingStringIsCorrect() { + Map wordsByKey = StringToMap.convertWithStream("1=one,2=two,3=three,4=four"); + Assert.assertEquals(4, wordsByKey.size()); + Assert.assertEquals("one", wordsByKey.get("1")); + } + + @Test + void givenString_WhenUsingGuava_ThenResultingStringIsCorrect() { + Map wordsByKey = StringToMap.convertWithGuava("1=one,2=two,3=three,4=four"); + Assert.assertEquals(4, wordsByKey.size()); + Assert.assertEquals("one", wordsByKey.get("1")); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java new file mode 100644 index 0000000000..e2d5e327e1 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java @@ -0,0 +1,76 @@ +package com.baeldung.map.copyhashmap; + +import com.google.common.collect.ImmutableMap; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CopyHashMapUnitTest { + + @Test + public void givenHashMap_whenShallowCopy_thenCopyisNotSameAsOriginal() { + + HashMap map = new HashMap<>(); + Employee emp1 = new Employee("John"); + Employee emp2 = new Employee("Norman"); + map.put("emp1",emp1); + map.put("emp2",emp2); + + HashMap shallowCopy = CopyHashMap.shallowCopy(map); + + assertThat(shallowCopy).isNotSameAs(map); + + } + + @Test + public void givenHashMap_whenShallowCopyModifyingOriginalObject_thenCopyShouldChange() { + + HashMap map = new HashMap<>(); + Employee emp1 = new Employee("John"); + Employee emp2 = new Employee("Norman"); + map.put("emp1",emp1); + map.put("emp2",emp2); + + HashMap shallowCopy = CopyHashMap.shallowCopy(map); + + emp1.setName("Johny"); + + assertThat(shallowCopy.get("emp1")).isEqualTo(map.get("emp1")); + + } + + @Test + public void givenHashMap_whenDeepCopyModifyingOriginalObject_thenCopyShouldNotChange() { + + HashMap map = new HashMap<>(); + Employee emp1 = new Employee("John"); + Employee emp2 = new Employee("Norman"); + map.put("emp1",emp1); + map.put("emp2",emp2); + HashMap deepCopy = CopyHashMap.deepCopy(map); + + emp1.setName("Johny"); + + assertThat(deepCopy.get("emp1")).isNotEqualTo(map.get("emp1")); + + } + + @Test + public void givenImmutableMap_whenCopyUsingGuava_thenCopyShouldNotChange() { + Employee emp1 = new Employee("John"); + Employee emp2 = new Employee("Norman"); + + Map map = ImmutableMap. builder() + .put("emp1",emp1) + .put("emp2",emp2) + .build(); + Map shallowCopy = ImmutableMap.copyOf(map); + + assertThat(shallowCopy).isSameAs(map); + + } + +} diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java new file mode 100644 index 0000000000..5db55c26ea --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java @@ -0,0 +1,28 @@ +package com.baeldung.map.copyhashmap; + +import java.io.Serializable; + +public class Employee implements Serializable{ + + private String name; + + public Employee(String name) { + super(); + this.name = name; + } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return this.name; + } + +} + + diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java new file mode 100644 index 0000000000..7c6dffe787 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.map.initialize; + +import org.junit.Test; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class MapInitializerUnitTest { + + @Test + public void givenStaticMap_whenUpdated_thenCorrect() { + + MapInitializer.articleMapOne.put("NewArticle1", "Convert array to List"); + + assertEquals(MapInitializer.articleMapOne.get("NewArticle1"), "Convert array to List"); + + } + + @Test(expected=UnsupportedOperationException.class) + public void givenSingleTonMap_whenEntriesAdded_throwsException() { + + Map map = MapInitializer.createSingletonMap(); + map.put("username2", "password2"); + } + +} diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java new file mode 100644 index 0000000000..30b945bfc8 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.map.mapmax; + + +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class MapMaxUnitTest { + + Map map = null; + MapMax mapMax = null; + + + @Before + public void setupTestData() { + map = new HashMap(); + map.put(23, 12); + map.put(46, 24); + map.put(27, 38); + mapMax = new MapMax(); + } + + @Test + public void givenMap_whenIterated_thenReturnMaxValue() { + assertEquals(new Integer(38), mapMax.maxUsingIteration(map)); + } + + @Test + public void givenMap_whenUsingCollectionsMax_thenReturnMaxValue() { + assertEquals(new Integer(38), mapMax.maxUsingCollectionsMax(map)); + } + + @Test + public void givenMap_whenUsingCollectionsMaxAndLambda_thenReturnMaxValue() { + assertEquals(new Integer(38), mapMax.maxUsingCollectionsMaxAndLambda(map)); + } + + @Test + public void givenMap_whenUsingCollectionsMaxAndMethodReference_thenReturnMaxValue() { + assertEquals(new Integer(38), mapMax.maxUsingCollectionsMaxAndMethodReference(map)); + } + + @Test + public void givenMap_whenUsingStreamAndLambda_thenReturnMaxValue() { + assertEquals(new Integer(38), mapMax.maxUsingStreamAndLambda(map)); + } + + @Test + public void givenMap_whenUsingStreamAndMethodReference_thenReturnMaxValue() { + assertEquals(new Integer(38), mapMax.maxUsingStreamAndMethodReference (map)); + } + + +} diff --git a/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java new file mode 100644 index 0000000000..293f24c378 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.map.weakhashmap; + + +import org.junit.Test; + +import java.util.WeakHashMap; +import java.util.concurrent.TimeUnit; + +import static com.jayway.awaitility.Awaitility.await; +import static org.junit.Assert.assertTrue; + +public class WeakHashMapUnitTest { + + @Test + public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObject() { + //given + WeakHashMap map = new WeakHashMap<>(); + BigImage bigImage = new BigImage("image_id"); + UniqueImageName imageName = new UniqueImageName("name_of_big_image"); + + map.put(imageName, bigImage); + assertTrue(map.containsKey(imageName)); + + //when big image key is not reference anywhere + imageName = null; + System.gc(); + + //then GC will finally reclaim that object + await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty); + } + + @Test + public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObjectButLeaveReferencedObject() { + //given + WeakHashMap map = new WeakHashMap<>(); + BigImage bigImageFirst = new BigImage("foo"); + UniqueImageName imageNameFirst = new UniqueImageName("name_of_big_image"); + + BigImage bigImageSecond = new BigImage("foo_2"); + UniqueImageName imageNameSecond = new UniqueImageName("name_of_big_image_2"); + + map.put(imageNameFirst, bigImageFirst); + map.put(imageNameSecond, bigImageSecond); + assertTrue(map.containsKey(imageNameFirst)); + assertTrue(map.containsKey(imageNameSecond)); + + //when + imageNameFirst = null; + System.gc(); + + //then + await().atMost(10, TimeUnit.SECONDS).until(() -> map.size() == 1); + await().atMost(10, TimeUnit.SECONDS).until(() -> map.containsKey(imageNameSecond)); + } + + + class BigImage { + public final String imageId; + + BigImage(String imageId) { + this.imageId = imageId; + } + } + + class UniqueImageName { + public final String imageName; + + UniqueImageName(String imageName) { + this.imageName = imageName; + } + } +} diff --git a/core-java-modules/core-java-collections-maps-3/README.md b/core-java-modules/core-java-collections-maps-3/README.md new file mode 100644 index 0000000000..142aa34800 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-3/README.md @@ -0,0 +1,8 @@ +## Java Collections Cookbooks and Examples + +This module contains articles about Map data structures in Java. + +### Relevant Articles: +- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) +- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) +- More articles: [[<-- prev]](/core-java-collections-maps-2) diff --git a/core-java-modules/core-java-collections-maps-3/pom.xml b/core-java-modules/core-java-collections-maps-3/pom.xml new file mode 100644 index 0000000000..95414c12c2 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-3/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + core-java-collections-maps-3 + 0.1.0-SNAPSHOT + core-java-collections-maps-3 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java new file mode 100644 index 0000000000..0edd0cd87b --- /dev/null +++ b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java @@ -0,0 +1,225 @@ +package com.baeldung.map.compare; + +import com.google.common.base.Equivalence; +import com.google.common.collect.MapDifference; +import com.google.common.collect.MapDifference.ValueDifference; +import com.google.common.collect.Maps; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.hamcrest.collection.IsMapContaining.hasKey; +import static org.junit.Assert.*; + +public class HashMapComparisonUnitTest { + + Map asiaCapital1; + Map asiaCapital2; + Map asiaCapital3; + + Map asiaCity1; + Map asiaCity2; + Map asiaCity3; + + @Before + public void setup(){ + asiaCapital1 = new HashMap(); + asiaCapital1.put("Japan", "Tokyo"); + asiaCapital1.put("South Korea", "Seoul"); + + asiaCapital2 = new HashMap(); + asiaCapital2.put("South Korea", "Seoul"); + asiaCapital2.put("Japan", "Tokyo"); + + asiaCapital3 = new HashMap(); + asiaCapital3.put("Japan", "Tokyo"); + asiaCapital3.put("China", "Beijing"); + + asiaCity1 = new HashMap(); + asiaCity1.put("Japan", new String[] { "Tokyo", "Osaka" }); + asiaCity1.put("South Korea", new String[] { "Seoul", "Busan" }); + + asiaCity2 = new HashMap(); + asiaCity2.put("South Korea", new String[] { "Seoul", "Busan" }); + asiaCity2.put("Japan", new String[] { "Tokyo", "Osaka" }); + + asiaCity3 = new HashMap(); + asiaCity3.put("Japan", new String[] { "Tokyo", "Osaka" }); + asiaCity3.put("China", new String[] { "Beijing", "Hong Kong" }); + } + + @Test + public void whenCompareTwoHashMapsUsingEquals_thenSuccess() { + assertTrue(asiaCapital1.equals(asiaCapital2)); + assertFalse(asiaCapital1.equals(asiaCapital3)); + } + + @Test + public void whenCompareTwoHashMapsWithArrayValuesUsingEquals_thenFail() { + assertFalse(asiaCity1.equals(asiaCity2)); + } + + @Test + public void whenCompareTwoHashMapsUsingStreamAPI_thenSuccess() { + assertTrue(areEqual(asiaCapital1, asiaCapital2)); + assertFalse(areEqual(asiaCapital1, asiaCapital3)); + } + + @Test + public void whenCompareTwoHashMapsWithArrayValuesUsingStreamAPI_thenSuccess() { + assertTrue(areEqualWithArrayValue(asiaCity1, asiaCity2)); + assertFalse(areEqualWithArrayValue(asiaCity1, asiaCity3)); + } + + @Test + public void whenCompareTwoHashMapKeys_thenSuccess() { + assertTrue(asiaCapital1.keySet().equals(asiaCapital2.keySet())); + assertFalse(asiaCapital1.keySet().equals(asiaCapital3.keySet())); + } + + @Test + public void whenCompareTwoHashMapKeyValuesUsingStreamAPI_thenSuccess() { + Map asiaCapital3 = new HashMap(); + asiaCapital3.put("Japan", "Tokyo"); + asiaCapital3.put("South Korea", "Seoul"); + asiaCapital3.put("China", "Beijing"); + + Map asiaCapital4 = new HashMap(); + asiaCapital4.put("South Korea", "Seoul"); + asiaCapital4.put("Japan", "Osaka"); + asiaCapital4.put("China", "Beijing"); + + Map result = areEqualKeyValues(asiaCapital3, asiaCapital4); + + assertEquals(3, result.size()); + assertThat(result, hasEntry("Japan", false)); + assertThat(result, hasEntry("South Korea", true)); + assertThat(result, hasEntry("China", true)); + } + + @Test + public void givenDifferentMaps_whenGetDiffUsingGuava_thenSuccess() { + Map asia1 = new HashMap(); + asia1.put("Japan", "Tokyo"); + asia1.put("South Korea", "Seoul"); + asia1.put("India", "New Delhi"); + + Map asia2 = new HashMap(); + asia2.put("Japan", "Tokyo"); + asia2.put("China", "Beijing"); + asia2.put("India", "Delhi"); + + MapDifference diff = Maps.difference(asia1, asia2); + Map> entriesDiffering = diff.entriesDiffering(); + + assertFalse(diff.areEqual()); + assertEquals(1, entriesDiffering.size()); + assertThat(entriesDiffering, hasKey("India")); + assertEquals("New Delhi", entriesDiffering.get("India").leftValue()); + assertEquals("Delhi", entriesDiffering.get("India").rightValue()); + } + + @Test + public void givenDifferentMaps_whenGetEntriesOnOneSideUsingGuava_thenSuccess() { + Map asia1 = new HashMap(); + asia1.put("Japan", "Tokyo"); + asia1.put("South Korea", "Seoul"); + asia1.put("India", "New Delhi"); + + Map asia2 = new HashMap(); + asia2.put("Japan", "Tokyo"); + asia2.put("China", "Beijing"); + asia2.put("India", "Delhi"); + + MapDifference diff = Maps.difference(asia1, asia2); + Map entriesOnlyOnRight = diff.entriesOnlyOnRight(); + Map entriesOnlyOnLeft = diff.entriesOnlyOnLeft(); + + assertEquals(1, entriesOnlyOnRight.size()); + assertThat(entriesOnlyOnRight, hasEntry("China", "Beijing")); + assertEquals(1, entriesOnlyOnLeft.size()); + assertThat(entriesOnlyOnLeft, hasEntry("South Korea", "Seoul")); + } + + @Test + public void givenDifferentMaps_whenGetCommonEntriesUsingGuava_thenSuccess() { + Map asia1 = new HashMap(); + asia1.put("Japan", "Tokyo"); + asia1.put("South Korea", "Seoul"); + asia1.put("India", "New Delhi"); + + Map asia2 = new HashMap(); + asia2.put("Japan", "Tokyo"); + asia2.put("China", "Beijing"); + asia2.put("India", "Delhi"); + + MapDifference diff = Maps.difference(asia1, asia2); + Map entriesInCommon = diff.entriesInCommon(); + + assertEquals(1, entriesInCommon.size()); + assertThat(entriesInCommon, hasEntry("Japan", "Tokyo")); + } + + @Test + public void givenSimilarMapsWithArrayValue_whenCompareUsingGuava_thenFail() { + MapDifference diff = Maps.difference(asiaCity1, asiaCity2); + assertFalse(diff.areEqual()); + } + + @Test + public void givenSimilarMapsWithArrayValue_whenCompareUsingGuavaEquivalence_thenSuccess() { + Equivalence eq = new Equivalence() { + @Override + protected boolean doEquivalent(String[] a, String[] b) { + return Arrays.equals(a, b); + } + + @Override + protected int doHash(String[] value) { + return value.hashCode(); + } + }; + + MapDifference diff = Maps.difference(asiaCity1, asiaCity2, eq); + assertTrue(diff.areEqual()); + + diff = Maps.difference(asiaCity1, asiaCity3, eq); + assertFalse(diff.areEqual()); + } + + // =========================================================================== + + private boolean areEqual(Map first, Map second) { + if (first.size() != second.size()) { + return false; + } + + return first.entrySet() + .stream() + .allMatch(e -> e.getValue() + .equals(second.get(e.getKey()))); + } + + private boolean areEqualWithArrayValue(Map first, Map second) { + if (first.size() != second.size()) { + return false; + } + + return first.entrySet() + .stream() + .allMatch(e -> Arrays.equals(e.getValue(), second.get(e.getKey()))); + } + + private Map areEqualKeyValues(Map first, Map second) { + return first.entrySet() + .stream() + .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().equals(second.get(e.getKey())))); + } + +} diff --git a/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java new file mode 100644 index 0000000000..1057e3b9f0 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.map.treemaphashmap; + +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +public class TreeMapVsHashMapUnitTest { + + @Test + public void whenInsertObjectsTreeMap_thenNaturalOrder() { + Map treemap = new TreeMap<>(); + treemap.put(3, "TreeMap"); + treemap.put(2, "vs"); + treemap.put(1, "HashMap"); + Assert.assertThat(treemap.keySet(), Matchers.contains(1, 2, 3)); + } + + @Test(expected = NullPointerException.class) + public void whenInsertNullInTreeMap_thenException() { + Map treemap = new TreeMap<>(); + treemap.put(null, "NullPointerException"); + } + + @Test + public void whenInsertObjectsHashMap_thenRandomOrder() { + Map hashmap = new HashMap<>(); + hashmap.put(3, "TreeMap"); + hashmap.put(2, "vs"); + hashmap.put(1, "HashMap"); + Assert.assertThat(hashmap.keySet(), Matchers.containsInAnyOrder(1, 2, 3)); + } + + @Test + public void whenInsertNullInHashMap_thenInsertsNull() { + Map hashmap = new HashMap<>(); + hashmap.put(null, null); + Assert.assertNull(hashmap.get(null)); + } + + @Test + public void givenHashMapAndTreeMap_whenputDuplicates_thenOnlyUnique() { + Map treeMap = new HashMap<>(); + treeMap.put(1, "Baeldung"); + treeMap.put(1, "Baeldung"); + + Assert.assertTrue(treeMap.size() == 1); + + Map treeMap2 = new TreeMap<>(); + treeMap2.put(1, "Baeldung"); + treeMap2.put(1, "Baeldung"); + + Assert.assertTrue(treeMap2.size() == 1); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps/README.md b/core-java-modules/core-java-collections-maps/README.md new file mode 100644 index 0000000000..1323fb97cd --- /dev/null +++ b/core-java-modules/core-java-collections-maps/README.md @@ -0,0 +1,16 @@ +## Java Collections Cookbooks and Examples + +This module contains articles about Map data structures in Java. + +### Relevant Articles: +- [Guide to the Guava BiMap](https://www.baeldung.com/guava-bimap) +- [A Guide to Java HashMap](https://www.baeldung.com/java-hashmap) +- [A Guide to LinkedHashMap in Java](https://www.baeldung.com/java-linked-hashmap) +- [A Guide to TreeMap in Java](https://www.baeldung.com/java-treemap) +- [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys) +- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value) +- [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists) +- [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) +- [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map) +- [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap-advanced) +- More articles: [[next -->]](/core-java-collections-maps-2) diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml new file mode 100644 index 0000000000..c0dd705c1c --- /dev/null +++ b/core-java-modules/core-java-collections-maps/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + core-java-collections-maps + 0.1.0-SNAPSHOT + core-java-collections-maps + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + 4.1 + 3.6.1 + + diff --git a/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java new file mode 100644 index 0000000000..91b7197a92 --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java @@ -0,0 +1,44 @@ +/** + * + */ +package com.baeldung.map; + +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Stream; + +/** + * @author swpraman + * + */ +public class MapUtil { + + public static Stream keys(Map map, V value) { + return map.entrySet() + .stream() + .filter(entry -> value.equals(entry.getValue())) + .map(Map.Entry::getKey); + } + + public static Set getKeys(Map map, V value) { + Set keys = new HashSet<>(); + for (Entry entry : map.entrySet()) { + if (entry.getValue().equals(value)) { + keys.add(entry.getKey()); + } + } + return keys; + } + + public static K getKey(Map map, V value) { + for (Entry entry : map.entrySet()) { + if (entry.getValue().equals(value)) { + return entry.getKey(); + } + } + return null; + } + +} diff --git a/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyKey.java b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyKey.java new file mode 100644 index 0000000000..9993d7862c --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyKey.java @@ -0,0 +1,64 @@ +package com.baeldung.map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MyKey { + private static final Logger LOG = LoggerFactory.getLogger(MyKey.class); + + private String name; + private int id; + + public MyKey(int id, String name) { + this.id = id; + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public int hashCode() { + LOG.debug("Calling hashCode()"); + return id; + } + + @Override + public String toString() { + return "MyKey [name=" + name + ", id=" + id + "]"; + } + + @Override + public boolean equals(Object obj) { + LOG.debug("Calling equals() for key: " + obj); + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MyKey other = (MyKey) obj; + if (id != other.id) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + +} diff --git a/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java new file mode 100644 index 0000000000..b687e57d85 --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java @@ -0,0 +1,23 @@ +package com.baeldung.map; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class MyLinkedHashMap extends LinkedHashMap { + + /** + * + */ + private static final long serialVersionUID = 1L; + private static final int MAX_ENTRIES = 5; + + public MyLinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { + super(initialCapacity, loadFactor, accessOrder); + } + + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_ENTRIES; + } + +} diff --git a/core-java-modules/core-java-collections-maps/src/main/resources/logback.xml b/core-java-modules/core-java-collections-maps/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java new file mode 100644 index 0000000000..b44d2db1aa --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java @@ -0,0 +1,120 @@ +package com.baeldung.guava; + +import static org.junit.Assert.*; +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import com.google.common.collect.BiMap; +import com.google.common.collect.EnumHashBiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.ImmutableBiMap; + +public class GuavaBiMapUnitTest { + @Test + public void whenQueryByValue_returnsKey() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + + final String countryCapitalName = capitalCountryBiMap.inverse().get("India"); + + assertEquals("New Delhi", countryCapitalName); + } + + @Test + public void whenCreateBiMapFromExistingMap_returnsKey() { + final Map capitalCountryMap = new HashMap<>(); + capitalCountryMap.put("New Delhi", "India"); + capitalCountryMap.put("Washingon, D.C.", "USA"); + capitalCountryMap.put("Moscow", "Russia"); + final BiMap capitalCountryBiMap = HashBiMap.create(capitalCountryMap); + + final String countryCapitalName = capitalCountryBiMap.inverse().get("India"); + + assertEquals("New Delhi", countryCapitalName); + } + + @Test + public void whenQueryByKey_returnsValue() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + + assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); + } + + @Test(expected = IllegalArgumentException.class) + public void whenSameValueIsPresent_throwsException() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.put("Trump", "USA"); + } + + @Test + public void givenSameValueIsPresent_whenForcePut_completesSuccessfully() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.forcePut("Trump", "USA"); + + assertEquals("USA", capitalCountryBiMap.get("Trump")); + assertEquals("Trump", capitalCountryBiMap.inverse().get("USA")); + } + + @Test + public void whenSameKeyIsPresent_replacesAlreadyPresent() { + final BiMap capitalCountryBiMap = HashBiMap.create(); + + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.put("Washingon, D.C.", "HongKong"); + + assertEquals("HongKong", capitalCountryBiMap.get("Washingon, D.C.")); + } + + @Test + public void whenUsingImmutableBiMap_allowsPutSuccessfully() { + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); + + assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenUsingImmutableBiMap_doesntAllowRemove() { + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); + + capitalCountryBiMap.remove("New Delhi"); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenUsingImmutableBiMap_doesntAllowPut() { + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); + + capitalCountryBiMap.put("New York", "USA"); + } + + private enum Operation { + ADD, SUBTRACT, MULTIPLY, DIVIDE + } + + @Test + public void whenUsingEnumAsKeyInMap_replacesAlreadyPresent() { + final BiMap operationStringBiMap = EnumHashBiMap.create(Operation.class); + + operationStringBiMap.put(Operation.ADD, "Add"); + operationStringBiMap.put(Operation.SUBTRACT, "Subtract"); + operationStringBiMap.put(Operation.MULTIPLY, "Multiply"); + operationStringBiMap.put(Operation.DIVIDE, "Divide"); + + assertEquals("Divide", operationStringBiMap.get(Operation.DIVIDE)); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java new file mode 100644 index 0000000000..d308aac7eb --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java @@ -0,0 +1,84 @@ +package com.baeldung.map; + +import com.google.common.collect.ImmutableMap; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + + +public class ImmutableMapUnitTest { + + @Test + public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); + assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertFalse(unmodifiableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertTrue(unmodifiableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); + assertTrue(immutableMap.containsKey("USA")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.builder() + .putAll(mutableMap) + .put("Costa Rica", "North America") + .build(); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + } + +} diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java new file mode 100644 index 0000000000..dbad2e5b5e --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.map; + +import org.junit.Test; + +import java.util.Collections; +import java.util.Map; + +import static org.junit.Assert.*; + +public class KeyCheckUnitTest { + + @Test + public void whenKeyIsPresent_thenContainsKeyReturnsTrue() { + Map map = Collections.singletonMap("key", "value"); + + assertTrue(map.containsKey("key")); + assertFalse(map.containsKey("missing")); + } + + @Test + public void whenKeyHasNullValue_thenGetStillWorks() { + Map map = Collections.singletonMap("nothing", null); + + assertTrue(map.containsKey("nothing")); + assertNull(map.get("nothing")); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java new file mode 100644 index 0000000000..721b48ea7b --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java @@ -0,0 +1,119 @@ +package com.baeldung.map; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.TreeMultimap; +import org.apache.commons.collections4.MultiMap; +import org.apache.commons.collections4.MultiMapUtils; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.map.MultiValueMap; +import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; +import org.apache.commons.collections4.multimap.HashSetValuedHashMap; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MapMultipleValuesUnitTest { + private static final Logger LOG = LoggerFactory.getLogger(MapMultipleValuesUnitTest.class); + + @Test + public void givenHashMap_whenPuttingTwice_thenReturningFirstValue() { + Map map = new HashMap<>(); + assertThat(map.put("key1", "value1")).isEqualTo(null); + assertThat(map.put("key1", "value2")).isEqualTo("value1"); + assertThat(map.get("key1")).isEqualTo("value2"); + } + + @Test + public void givenCollectionAsValue_whenPuttingTwice_thenReturningCollection() { + Map> map = new HashMap<>(); + List list = new ArrayList<>(); + map.put("key1", list); + map.get("key1").add("value1"); + map.get("key1").add("value2"); + assertThat(map.get("key1").get(0)).isEqualTo("value1"); + assertThat(map.get("key1").get(1)).isEqualTo("value2"); + } + + @Test + public void givenCollectionAsValueAndJava8_whenPuttingTwice_thenReturningCollection() { + Map> map = new HashMap<>(); + map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value1"); + map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value2"); + assertThat(map.get("key1").get(0)).isEqualTo("value1"); + assertThat(map.get("key1").get(1)).isEqualTo("value2"); + } + + @Test + public void givenMultiValueMap_whenPuttingTwice_thenReturningValues() { + MultiMap map = new MultiValueMap<>(); + map.put("key1", "value1"); + map.put("key1", "value2"); + assertThat((Collection) map.get("key1")) + .contains("value1", "value2"); + } + + @Test + public void givenArrayListValuedHashMap_whenPuttingDoubleValues_thenReturningAllValues() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("key1", "value1"); + map.put("key1", "value2"); + map.put("key1", "value2"); + assertThat((Collection) map.get("key1")) + .containsExactly("value1", "value2", "value2"); + } + + @Test + public void givenHashSetValuedHashMap_whenPuttingTwiceTheSame_thenReturningOneValue() { + MultiValuedMap map = new HashSetValuedHashMap<>(); + map.put("key1", "value1"); + map.put("key1", "value1"); + assertThat((Collection) map.get("key1")) + .containsExactly("value1"); + } + + @Test(expected = UnsupportedOperationException.class) + public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("key1", "value1"); + map.put("key1", "value2"); + MultiValuedMap immutableMap = + MultiMapUtils.unmodifiableMultiValuedMap(map); + immutableMap.put("key1", "value3"); + } + + @Test + public void givenArrayListMultiMap_whenInserting_thenCorrectOutput() { + Multimap map = ArrayListMultimap.create(); + map.put("key1", "value2"); + map.put("key1", "value1"); + assertThat((Collection) map.get("key1")) + .containsExactly("value2", "value1"); + } + + @Test + public void givenLinkedHashMultiMap_whenInserting_thenReturningValuesInInsertionOrder() { + Multimap map = LinkedHashMultimap.create(); + map.put("key1", "value3"); + map.put("key1", "value1"); + map.put("key1", "value2"); + assertThat((Collection) map.get("key1")) + .containsExactly("value3", "value1", "value2"); + } + + @Test + public void givenTreeMultimap_whenInserting_thenReturningValuesInNaturalOrder() { + Multimap map = TreeMultimap.create(); + map.put("key1", "value3"); + map.put("key1", "value1"); + map.put("key1", "value2"); + assertThat((Collection) map.get("key1")) + .containsExactly("value1", "value2", "value3"); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java new file mode 100644 index 0000000000..eaf68ccba5 --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java @@ -0,0 +1,336 @@ +package com.baeldung.map; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.Map.Entry; + +import static org.junit.Assert.*; + +public class MapUnitTest { + private static final Logger LOG = LoggerFactory.getLogger(MapUnitTest.class); + + + @Test + public void givenHashMap_whenRetrievesKeyset_thenCorrect() { + Map map = new HashMap<>(); + map.put("name", "baeldung"); + map.put("type", "blog"); + + Set keys = map.keySet(); + + assertEquals(2, keys.size()); + assertTrue(keys.contains("name")); + assertTrue(keys.contains("type")); + } + + @Test + public void givenHashMap_whenRetrievesValues_thenCorrect() { + Map map = new HashMap<>(); + map.put("name", "baeldung"); + map.put("type", "blog"); + + Collection values = map.values(); + + assertEquals(2, values.size()); + assertTrue(values.contains("baeldung")); + assertTrue(values.contains("blog")); + } + + @Test + public void givenHashMap_whenRetrievesEntries_thenCorrect() { + Map map = new HashMap<>(); + map.put("name", "baeldung"); + map.put("type", "blog"); + + Set> entries = map.entrySet(); + + assertEquals(2, entries.size()); + for (Entry e : entries) { + String key = e.getKey(); + String val = e.getValue(); + assertTrue(key.equals("name") || key.equals("type")); + assertTrue(val.equals("baeldung") || val.equals("blog")); + } + } + + @Test + public void givenKeySet_whenChangeReflectsInMap_thenCorrect() { + Map map = new HashMap<>(); + map.put("name", "baeldung"); + map.put("type", "blog"); + + assertEquals(2, map.size()); + + Set keys = map.keySet(); + + keys.remove("name"); + assertEquals(1, map.size()); + } + + @Test(expected = ConcurrentModificationException.class) + public void givenIterator_whenFailsFastOnModification_thenCorrect() { + Map map = new HashMap<>(); + map.put("name", "baeldung"); + map.put("type", "blog"); + + Set keys = map.keySet(); + Iterator it = keys.iterator(); + map.remove("type"); + while (it.hasNext()) { + String key = it.next(); + } + } + + public void givenIterator_whenRemoveWorks_thenCorrect() { + Map map = new HashMap<>(); + map.put("name", "baeldung"); + map.put("type", "blog"); + + Set keys = map.keySet(); + Iterator it = keys.iterator(); + while (it.hasNext()) { + it.next(); + it.remove(); + } + assertEquals(0, map.size()); + } + + @Test + public void whenHashCodeIsCalledOnPut_thenCorrect() { + MyKey key = new MyKey(1, "name"); + Map map = new HashMap<>(); + map.put(key, "val"); + } + + @Test + public void whenHashCodeIsCalledOnGet_thenCorrect() { + MyKey key = new MyKey(1, "name"); + Map map = new HashMap<>(); + map.put(key, "val"); + map.get(key); + } + + @Test + public void whenGetWorks_thenCorrect() { + Map map = new HashMap<>(); + map.put("key", "val"); + + String val = map.get("key"); + + assertEquals("val", val); + } + + @Test + public void givenNewKey_whenPutReturnsNull_thenCorrect() { + Map map = new HashMap<>(); + + String rtnVal = map.put("key1", "val1"); + + assertNull(rtnVal); + } + + @Test + public void givenUnmappedKey_whenGetReturnsNull_thenCorrect() { + Map map = new HashMap<>(); + + String rtnVal = map.get("key1"); + + assertNull(rtnVal); + } + + @Test + public void givenNullVal_whenPutReturnsNull_thenCorrect() { + Map map = new HashMap<>(); + + String rtnVal = map.put("key1", null); + + assertNull(rtnVal); + } + + @Test + public void givenNullKeyAndVal_whenAccepts_thenCorrect() { + Map map = new HashMap<>(); + + map.put(null, null); + } + + @Test + public void givenNullVal_whenRetrieves_thenCorrect() { + Map map = new HashMap<>(); + map.put("key", null); + + String val = map.get("key"); + + assertNull(val); + } + + @Test + public void whenContainsDistinguishesNullValues_thenCorrect() { + Map map = new HashMap<>(); + + String val1 = map.get("key"); + boolean valPresent = map.containsKey("key"); + + assertNull(val1); + assertFalse(valPresent); + + map.put("key", null); + String val = map.get("key"); + valPresent = map.containsKey("key"); + + assertNull(val); + assertTrue(valPresent); + + } + + @Test + public void whenPutReturnsPrevValue_thenCorrect() { + Map map = new HashMap<>(); + map.put("key1", "val1"); + String rtnVal = map.put("key1", "val2"); + + assertEquals("val1", rtnVal); + } + + @Test + public void whenCallsEqualsOnCollision_thenCorrect() { + HashMap map = new HashMap<>(); + MyKey k1 = new MyKey(1, "firstKey"); + MyKey k2 = new MyKey(2, "secondKey"); + MyKey k3 = new MyKey(2, "thirdKey"); + + LOG.debug("storing value for k1"); + map.put(k1, "firstValue"); + + LOG.debug("storing value for k2"); + map.put(k2, "secondValue"); + + LOG.debug("storing value for k3"); + map.put(k3, "thirdValue"); + + LOG.debug("retrieving value for k1"); + String v1 = map.get(k1); + + LOG.debug("retrieving value for k2"); + String v2 = map.get(k2); + + LOG.debug("retrieving value for k3"); + String v3 = map.get(k3); + + assertEquals("firstValue", v1); + assertEquals("secondValue", v2); + assertEquals("thirdValue", v3); + + } + + @Test + public void givenLinkedHashMap_whenGetsOrderedKeyset_thenCorrect() { + LinkedHashMap map = new LinkedHashMap<>(); + map.put(1, null); + map.put(2, null); + map.put(3, null); + map.put(4, null); + map.put(5, null); + Set keys = map.keySet(); + Integer[] arr = keys.toArray(new Integer[0]); + for (int i = 0; i < arr.length; i++) { + assertEquals(new Integer(i + 1), arr[i]); + + } + } + + @Test + public void givenLinkedHashMap_whenAccessOrderWorks_thenCorrect() { + LinkedHashMap map = new LinkedHashMap<>(16, .75f, true); + map.put(1, null); + map.put(2, null); + map.put(3, null); + map.put(4, null); + map.put(5, null); + Set keys = map.keySet(); + assertEquals("[1, 2, 3, 4, 5]", keys.toString()); + map.get(4); + assertEquals("[1, 2, 3, 5, 4]", keys.toString()); + map.get(1); + assertEquals("[2, 3, 5, 4, 1]", keys.toString()); + map.get(3); + assertEquals("[2, 5, 4, 1, 3]", keys.toString()); + } + + @Test + public void givenLinkedHashMap_whenRemovesEldestEntry_thenCorrect() { + LinkedHashMap map = new MyLinkedHashMap<>(16, .75f, true); + map.put(1, null); + map.put(2, null); + map.put(3, null); + map.put(4, null); + map.put(5, null); + Set keys = map.keySet(); + assertEquals("[1, 2, 3, 4, 5]", keys.toString()); + map.put(6, null); + assertEquals("[2, 3, 4, 5, 6]", keys.toString()); + map.put(7, null); + assertEquals("[3, 4, 5, 6, 7]", keys.toString()); + map.put(8, null); + assertEquals("[4, 5, 6, 7, 8]", keys.toString()); + } + + @Test + public void givenTreeMap_whenOrdersEntriesNaturally_thenCorrect() { + TreeMap map = new TreeMap<>(); + map.put(3, "val"); + map.put(2, "val"); + map.put(1, "val"); + map.put(5, "val"); + map.put(4, "val"); + assertEquals("[1, 2, 3, 4, 5]", map.keySet().toString()); + } + + @Test + public void givenTreeMap_whenOrdersEntriesNaturally_thenCorrect2() { + TreeMap map = new TreeMap<>(); + map.put("c", "val"); + map.put("b", "val"); + map.put("a", "val"); + map.put("e", "val"); + map.put("d", "val"); + + assertEquals("[a, b, c, d, e]", map.keySet().toString()); + } + + @Test + public void givenTreeMap_whenOrdersEntriesByComparator_thenCorrect() { + TreeMap map = new TreeMap<>(Comparator.reverseOrder()); + map.put(3, "val"); + map.put(2, "val"); + map.put(1, "val"); + map.put(5, "val"); + map.put(4, "val"); + + assertEquals("[5, 4, 3, 2, 1]", map.keySet().toString()); + } + + @Test + public void givenTreeMap_whenPerformsQueries_thenCorrect() { + TreeMap map = new TreeMap<>(); + map.put(3, "val"); + map.put(2, "val"); + map.put(1, "val"); + map.put(5, "val"); + map.put(4, "val"); + + Integer highestKey = map.lastKey(); + Integer lowestKey = map.firstKey(); + Set keysLessThan3 = map.headMap(3).keySet(); + Set keysGreaterThanEqTo3 = map.tailMap(3).keySet(); + + assertEquals(new Integer(5), highestKey); + assertEquals(new Integer(1), lowestKey); + assertEquals("[1, 2]", keysLessThan3.toString()); + assertEquals("[3, 4, 5]", keysGreaterThanEqTo3.toString()); + } + +} diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java new file mode 100644 index 0000000000..f8e4c8fd8a --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java @@ -0,0 +1,103 @@ +/** + * + */ +package com.baeldung.map; + +import com.google.common.collect.HashBiMap; +import org.apache.commons.collections4.BidiMap; +import org.apache.commons.collections4.bidimap.DualHashBidiMap; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertEquals; + +/** + * @author swpraman + * + */ +public class MapUtilUnitTest { + + + @Test + public void whenUsingImperativeWayForSingleKey_shouldReturnSingleKey() { + Map capitalCountryMap = new HashMap<>(); + capitalCountryMap.put("Tokyo", "Japan"); + capitalCountryMap.put("New Delhi", "India"); + assertEquals("New Delhi", MapUtil.getKey(capitalCountryMap, "India")); + } + + @Test + public void whenUsingImperativeWayForAllKeys_shouldReturnAllKeys() { + Map capitalCountryMap = new HashMap<>(); + capitalCountryMap.put("Tokyo", "Japan"); + capitalCountryMap.put("Berlin", "Germany"); + capitalCountryMap.put("Cape Town", "South Africa"); + capitalCountryMap.put("Pretoria", "South Africa"); + capitalCountryMap.put("Bloemfontein", "South Africa"); + + assertEquals(new HashSet(Arrays.asList( + new String[] {"Cape Town", "Pretoria", "Bloemfontein"})), + MapUtil.getKeys(capitalCountryMap, "South Africa")); + } + + @Test + public void whenUsingFunctionalWayForSingleKey_shouldReturnSingleKey() { + Map capitalCountryMap = new HashMap<>(); + capitalCountryMap.put("Tokyo", "Japan"); + capitalCountryMap.put("Berlin", "Germany"); + assertEquals("Berlin", MapUtil.keys(capitalCountryMap, "Germany").findFirst().get()); + } + + @Test + public void whenUsingFunctionalWayForAllKeys_shouldReturnAllKeys() { + Map capitalCountryMap = new HashMap<>(); + capitalCountryMap.put("Tokyo", "Japan"); + capitalCountryMap.put("Berlin", "Germany"); + capitalCountryMap.put("Cape Town", "South Africa"); + capitalCountryMap.put("Pretoria", "South Africa"); + capitalCountryMap.put("Bloemfontein", "South Africa"); + assertEquals(new HashSet(Arrays.asList( + new String[] {"Cape Town", "Pretoria", "Bloemfontein"})), + MapUtil.keys(capitalCountryMap, "South Africa").collect(Collectors.toSet())); + } + + @Test + public void whenUsingBidiMap_shouldReturnKey() { + BidiMap capitalCountryMap = new DualHashBidiMap(); + capitalCountryMap.put("Berlin", "Germany"); + capitalCountryMap.put("Cape Town", "South Africa"); + assertEquals("Berlin", capitalCountryMap.getKey("Germany")); + } + + @Test + public void whenUsingBidiMapAddDuplicateValue_shouldRemoveOldEntry() { + BidiMap capitalCountryMap = new DualHashBidiMap(); + capitalCountryMap.put("Berlin", "Germany"); + capitalCountryMap.put("Cape Town", "South Africa"); + capitalCountryMap.put("Pretoria", "South Africa"); + assertEquals("Pretoria", capitalCountryMap.getKey("South Africa")); + } + + @Test + public void whenUsingBiMap_shouldReturnKey() { + HashBiMap capitalCountryMap = HashBiMap.create(); + capitalCountryMap.put("Berlin", "Germany"); + capitalCountryMap.put("Cape Town", "South Africa"); + assertEquals("Berlin", capitalCountryMap.inverse().get("Germany")); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingBiMapAddDuplicateValue_shouldThrowException() { + HashBiMap capitalCountryMap = HashBiMap.create(); + capitalCountryMap.put("Berlin", "Germany"); + capitalCountryMap.put("Cape Town", "South Africa"); + capitalCountryMap.put("Pretoria", "South Africa"); + assertEquals("Berlin", capitalCountryMap.inverse().get("Germany")); + } + +} diff --git a/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java new file mode 100644 index 0000000000..686c1cef87 --- /dev/null +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java @@ -0,0 +1,227 @@ +package com.baeldung.map; + +import org.apache.commons.collections4.MultiMapUtils; +import org.apache.commons.collections4.MultiSet; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; +import org.apache.commons.collections4.multimap.HashSetValuedHashMap; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class MultiValuedMapUnitTest { + + @Test + public void givenMultiValuesMap_whenPuttingMultipleValuesUsingPutMethod_thenReturningAllValues() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + + map.put("fruits", "apple"); + map.put("fruits", "orange"); + + assertThat((Collection) map.get("fruits")).containsExactly("apple", "orange"); + + } + + @Test + public void givenMultiValuesMap_whenPuttingMultipleValuesUsingPutAllMethod_thenReturningAllValues() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + + map.putAll("vehicles", Arrays.asList("car", "bike")); + + assertThat((Collection) map.get("vehicles")).containsExactly("car", "bike"); + + } + + @Test + public void givenMultiValuesMap_whenGettingValueUsingGetMethod_thenReturningValue() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + + map.put("fruits", "apple"); + + assertThat((Collection) map.get("fruits")).containsExactly("apple"); + } + + @Test + public void givenMultiValuesMap_whenUsingEntriesMethod_thenReturningMappings() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + + Collection> entries = (Collection>) map.entries(); + + for(Map.Entry entry : entries) { + assertThat(entry.getKey()).contains("fruits"); + assertTrue(entry.getValue().equals("apple") || entry.getValue().equals("orange") ); + } + } + + @Test + public void givenMultiValuesMap_whenUsingKeysMethod_thenReturningAllKeys() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + + MultiSet keys = map.keys(); + + assertThat((keys)).contains("fruits", "vehicles"); + + } + + @Test + public void givenMultiValuesMap_whenUsingKeySetMethod_thenReturningAllKeys() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + + Set keys = map.keySet(); + + assertThat(keys).contains("fruits", "vehicles"); + + } + + @Test + public void givenMultiValuesMap_whenUsingValuesMethod_thenReturningAllValues() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + + assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); + } + + @Test + public void givenMultiValuesMap_whenUsingRemoveMethod_thenReturningUpdatedMap() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); + + map.remove("fruits"); + + assertThat(((Collection) map.values())).contains("car", "bike"); + + } + + @Test + public void givenMultiValuesMap_whenUsingRemoveMappingMethod_thenReturningUpdatedMapAfterMappingRemoved() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); + + map.removeMapping("fruits", "apple"); + + assertThat(((Collection) map.values())).contains("orange", "car", "bike"); + } + + @Test + public void givenMultiValuesMap_whenUsingClearMethod_thenReturningEmptyMap() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike"); + + map.clear(); + + assertTrue(map.isEmpty()); + } + + @Test + public void givenMultiValuesMap_whenUsingContainsKeyMethod_thenReturningTrue() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + + assertTrue(map.containsKey("fruits")); + } + + @Test + public void givenMultiValuesMap_whenUsingContainsValueMethod_thenReturningTrue() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + + assertTrue(map.containsValue("orange")); + } + + @Test + public void givenMultiValuesMap_whenUsingIsEmptyMethod_thenReturningFalse() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + + assertFalse(map.isEmpty()); + } + + @Test + public void givenMultiValuesMap_whenUsingSizeMethod_thenReturningElementCount() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("vehicles", "car"); + map.put("vehicles", "bike"); + + assertEquals(4, map.size()); + } + + @Test + public void givenArrayListValuedHashMap_whenPuttingDoubleValues_thenReturningAllValues() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + map.put("fruits", "orange"); + + assertThat((Collection) map.get("fruits")).containsExactly("apple", "orange", "orange"); + } + + @Test + public void givenHashSetValuedHashMap_whenPuttingTwiceTheSame_thenReturningOneValue() { + MultiValuedMap map = new HashSetValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "apple"); + + assertThat((Collection) map.get("fruits")).containsExactly("apple"); + } + + @Test(expected = UnsupportedOperationException.class) + public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() { + MultiValuedMap map = new ArrayListValuedHashMap<>(); + map.put("fruits", "apple"); + map.put("fruits", "orange"); + MultiValuedMap immutableMap = MultiMapUtils.unmodifiableMultiValuedMap(map); + + immutableMap.put("fruits", "banana"); + + } + + +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index ebdb11925b..3fc978a68c 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -42,6 +42,9 @@ core-java-collections-list core-java-collections-list-2 core-java-collections-list-3 + core-java-collections-maps + core-java-collections-maps-2 + core-java-collections-maps-3 core-java-concurrency-2 From 39abe6bfd14ee2f8f7f248f3c4e7d9feb0f86b01 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 7 Apr 2020 14:53:59 +0530 Subject: [PATCH 333/530] JAVA-1188: README changes --- core-java-modules/core-java-collections-maps-2/README.md | 2 +- core-java-modules/core-java-collections-maps-3/README.md | 2 +- core-java-modules/core-java-collections-maps/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-2/README.md b/core-java-modules/core-java-collections-maps-2/README.md index da9279b191..f49ba25c8c 100644 --- a/core-java-modules/core-java-collections-maps-2/README.md +++ b/core-java-modules/core-java-collections-maps-2/README.md @@ -13,4 +13,4 @@ This module contains articles about Map data structures in Java. - [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) - [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) -- More articles: [[<-- prev]](/core-java-collections-maps) [[next -->]](/core-java-collections-maps-3) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps) [[next -->]](/core-java-modules/core-java-collections-maps-3) diff --git a/core-java-modules/core-java-collections-maps-3/README.md b/core-java-modules/core-java-collections-maps-3/README.md index 142aa34800..64a3b75d83 100644 --- a/core-java-modules/core-java-collections-maps-3/README.md +++ b/core-java-modules/core-java-collections-maps-3/README.md @@ -5,4 +5,4 @@ This module contains articles about Map data structures in Java. ### Relevant Articles: - [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) - [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) -- More articles: [[<-- prev]](/core-java-collections-maps-2) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2) diff --git a/core-java-modules/core-java-collections-maps/README.md b/core-java-modules/core-java-collections-maps/README.md index 1323fb97cd..828f8992e1 100644 --- a/core-java-modules/core-java-collections-maps/README.md +++ b/core-java-modules/core-java-collections-maps/README.md @@ -13,4 +13,4 @@ This module contains articles about Map data structures in Java. - [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) - [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map) - [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap-advanced) -- More articles: [[next -->]](/core-java-collections-maps-2) +- More articles: [[next -->]](/core-java-modules/core-java-collections-maps-2) From 298cc81d7d16cfd9acbd9dc6ab9933f808414da7 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 7 Apr 2020 15:03:43 +0530 Subject: [PATCH 334/530] JAVA-1188: main pom changes to remove java-collections-maps --- pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pom.xml b/pom.xml index e21c13efc2..219c7ce599 100644 --- a/pom.xml +++ b/pom.xml @@ -453,9 +453,6 @@ java-collections-conversions java-collections-conversions-2 - java-collections-maps - java-collections-maps-2 - java-collections-maps-3 javafx From 2986e1ace50b1fe369b2e6856be3def7dc2b00c8 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:35:51 +0800 Subject: [PATCH 335/530] Update README.md --- persistence-modules/spring-hibernate4/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-hibernate4/README.md b/persistence-modules/spring-hibernate4/README.md index cfa13ca3b0..a5a72a9b7e 100644 --- a/persistence-modules/spring-hibernate4/README.md +++ b/persistence-modules/spring-hibernate4/README.md @@ -9,7 +9,6 @@ This module contains articles about Spring with Hibernate 4 - [Stored Procedures with Hibernate](https://www.baeldung.com/stored-procedures-with-hibernate-tutorial) - [Hibernate: save, persist, update, merge, saveOrUpdate](https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate) - [Eager/Lazy Loading In Hibernate](https://www.baeldung.com/hibernate-lazy-eager-loading) -- [The DAO with Spring and Hibernate](https://www.baeldung.com/persistence-layer-with-spring-and-hibernate) - [Auditing with JPA, Hibernate, and Spring Data JPA](https://www.baeldung.com/database-auditing-jpa) ### Quick Start From 83be0892e7d536956ddc0a65607ba16e0b4b8e07 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 7 Apr 2020 15:08:09 +0530 Subject: [PATCH 336/530] JAVA-1188: main pom changes to remove java-collections-maps --- pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pom.xml b/pom.xml index 219c7ce599..d5e2ddd0c7 100644 --- a/pom.xml +++ b/pom.xml @@ -962,9 +962,6 @@ java-collections-conversions java-collections-conversions-2 - java-collections-maps - java-collections-maps-2 - java-collections-maps-3 javafx From 6ffe07efff4ddda7822faa2ca4bcdea1b0e3b3e0 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:39:12 +0800 Subject: [PATCH 337/530] Update README.md --- core-java-modules/core-java-8-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md index 961941aac7..c1c09d2192 100644 --- a/core-java-modules/core-java-8-2/README.md +++ b/core-java-modules/core-java-8-2/README.md @@ -4,7 +4,6 @@ This module contains articles about Java 8 core features ### Relevant Articles: -- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution) - [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments) - [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit) - [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface) From 34927fcc12acb04047bd854a93157366b45896fd Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:44:36 +0800 Subject: [PATCH 338/530] Update README.md --- core-java-modules/core-java-collections/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-java-modules/core-java-collections/README.md b/core-java-modules/core-java-collections/README.md index 340c2b286e..12e3c5ac17 100644 --- a/core-java-modules/core-java-collections/README.md +++ b/core-java-modules/core-java-collections/README.md @@ -3,7 +3,6 @@ This module contains articles about Java collections ### Relevant Articles: -- [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection) - [Introduction to the Java ArrayDeque](https://www.baeldung.com/java-array-deque) - [An Introduction to Java.util.Hashtable Class](https://www.baeldung.com/java-hash-table) - [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe) @@ -13,4 +12,4 @@ This module contains articles about Java collections - [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack) - [Guide to the Java Queue Interface](https://www.baeldung.com/java-queue) - [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections) -- [[More -->]](/core-java-modules/core-java-collections-2) \ No newline at end of file +- [[More -->]](/core-java-modules/core-java-collections-2) From 959bf74b1e1cf184df9186ea7f68f7032d64f6a2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:48:34 +0800 Subject: [PATCH 339/530] Delete README.md --- apache-olingo/olingo2/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 apache-olingo/olingo2/README.md diff --git a/apache-olingo/olingo2/README.md b/apache-olingo/olingo2/README.md deleted file mode 100644 index 826cd0133e..0000000000 --- a/apache-olingo/olingo2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Intro to OData with Olingo](https://www.baeldung.com/olingo) From 9ae4555a4f031263925e7958dd76fc5277e65ec2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:52:32 +0800 Subject: [PATCH 340/530] Update README.md --- algorithms-miscellaneous-3/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md index 00b785c1b2..dd5bbac162 100644 --- a/algorithms-miscellaneous-3/README.md +++ b/algorithms-miscellaneous-3/README.md @@ -13,6 +13,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. - [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle) - [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique) - [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle) -- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency) - [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm) - More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4) From 0625de19744d47721bc313ce1ef193859cc536c6 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:54:20 +0800 Subject: [PATCH 341/530] Update README.md --- core-java-modules/core-java-collections-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md index de5daddb38..e5f6126811 100644 --- a/core-java-modules/core-java-collections-2/README.md +++ b/core-java-modules/core-java-collections-2/README.md @@ -12,4 +12,3 @@ - [Sorting in Java](https://www.baeldung.com/java-sorting) - [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size) - [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) -- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream) From 4ccdaeb5f1f5fa718f63e0ba1a46d38e5b14bce9 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:56:49 +0800 Subject: [PATCH 342/530] Update README.md --- spring-core-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 1fb591f693..0c0dac3dbf 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -7,7 +7,6 @@ This module contains articles about core Spring functionality - [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) - [Spring Profiles](http://www.baeldung.com/spring-profiles) - [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) -- [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring) - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) - [@Order in Spring](http://www.baeldung.com/spring-order) From 44517677a68e52717cacce6ab503249fe3d14ff6 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 17:59:28 +0800 Subject: [PATCH 343/530] Update README.md --- spring-core-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 0c0dac3dbf..a144f5203c 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -14,6 +14,5 @@ This module contains articles about core Spring functionality - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) -- [Guide to the Spring BeanFactory](https://www.baeldung.com/spring-beanfactory) - [Reading HttpServletRequest Multiple Times in Spring](https://www.baeldung.com/spring-reading-httpservletrequest-multiple-times) - More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3) From 694ed29f705e3e228b866625dbdfea0b11523ec3 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 7 Apr 2020 18:02:08 +0800 Subject: [PATCH 344/530] Update README.md --- spring-core-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-core-2/README.md b/spring-core-2/README.md index a144f5203c..947b816db8 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -14,5 +14,4 @@ This module contains articles about core Spring functionality - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) -- [Reading HttpServletRequest Multiple Times in Spring](https://www.baeldung.com/spring-reading-httpservletrequest-multiple-times) - More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3) From 8e107d118090a1704ae096aecf101c6dd3c37858 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Wed, 8 Apr 2020 02:26:53 +0530 Subject: [PATCH 345/530] BAEL-3895: HTTP/2 in Netty (#9036) * BAEL-3895 : HTTP/2 in Netty * BAEL-3895: Added Live Test in place of java client * BAEL-3895: Commented out netty module from main pom as it needs Java 13 --- netty/README.md | 6 + netty/pom.xml | 34 +++++ .../com/baeldung/netty/http2/Http2Util.java | 135 ++++++++++++++++++ .../http2/client/Http2ClientInitializer.java | 46 ++++++ .../client/Http2ClientResponseHandler.java | 128 +++++++++++++++++ .../http2/client/Http2SettingsHandler.java | 30 ++++ .../netty/http2/server/Http2Server.java | 59 ++++++++ .../server/Http2ServerResponseHandler.java | 52 +++++++ netty/src/main/resources/logback.xml | 13 ++ .../baeldung/netty/Http2ClientLiveTest.java | 91 ++++++++++++ pom.xml | 2 + 11 files changed, 596 insertions(+) create mode 100644 netty/README.md create mode 100644 netty/pom.xml create mode 100644 netty/src/main/java/com/baeldung/netty/http2/Http2Util.java create mode 100644 netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java create mode 100644 netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java create mode 100644 netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java create mode 100644 netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java create mode 100644 netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java create mode 100644 netty/src/main/resources/logback.xml create mode 100644 netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java diff --git a/netty/README.md b/netty/README.md new file mode 100644 index 0000000000..b006c1c686 --- /dev/null +++ b/netty/README.md @@ -0,0 +1,6 @@ +## Netty + +This module contains articles about Netty. + +### Relevant Articles: + diff --git a/netty/pom.xml b/netty/pom.xml new file mode 100644 index 0000000000..1a33eef92e --- /dev/null +++ b/netty/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + netty + 0.0.1-SNAPSHOT + netty + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + io.netty + netty-all + ${netty.version} + + + + org.conscrypt + conscrypt-openjdk-uber + 2.4.0 + + + + + + 4.1.48.Final + + + \ No newline at end of file diff --git a/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java b/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java new file mode 100644 index 0000000000..62b6d4c4ed --- /dev/null +++ b/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java @@ -0,0 +1,135 @@ +package com.baeldung.netty.http2; + +import static io.netty.handler.logging.LogLevel.INFO; + +import java.security.cert.CertificateException; + +import javax.net.ssl.SSLException; + +import com.baeldung.netty.http2.client.Http2ClientResponseHandler; +import com.baeldung.netty.http2.client.Http2SettingsHandler; +import com.baeldung.netty.http2.server.Http2ServerResponseHandler; + +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPipeline; +import io.netty.handler.codec.http.DefaultFullHttpRequest; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.handler.codec.http.HttpMethod; +import io.netty.handler.codec.http.HttpScheme; +import io.netty.handler.codec.http.HttpVersion; +import io.netty.handler.codec.http2.DefaultHttp2Connection; +import io.netty.handler.codec.http2.DelegatingDecompressorFrameListener; +import io.netty.handler.codec.http2.Http2Connection; +import io.netty.handler.codec.http2.Http2FrameCodecBuilder; +import io.netty.handler.codec.http2.Http2FrameLogger; +import io.netty.handler.codec.http2.Http2SecurityUtil; +import io.netty.handler.codec.http2.HttpConversionUtil; +import io.netty.handler.codec.http2.HttpToHttp2ConnectionHandler; +import io.netty.handler.codec.http2.HttpToHttp2ConnectionHandlerBuilder; +import io.netty.handler.codec.http2.InboundHttp2ToHttpAdapterBuilder; +import io.netty.handler.ssl.ApplicationProtocolConfig; +import io.netty.handler.ssl.ApplicationProtocolConfig.Protocol; +import io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior; +import io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior; +import io.netty.handler.ssl.ApplicationProtocolNames; +import io.netty.handler.ssl.ApplicationProtocolNegotiationHandler; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.SslProvider; +import io.netty.handler.ssl.SupportedCipherSuiteFilter; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import io.netty.handler.ssl.util.SelfSignedCertificate; + +public class Http2Util { + public static SslContext createSSLContext(boolean isServer) throws SSLException, CertificateException { + + SslContext sslCtx; + + SelfSignedCertificate ssc = new SelfSignedCertificate(); + + if (isServer) { + sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()) + .sslProvider(SslProvider.JDK) + .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE) + .applicationProtocolConfig(new ApplicationProtocolConfig(Protocol.ALPN, + SelectorFailureBehavior.NO_ADVERTISE, + SelectedListenerFailureBehavior.ACCEPT, ApplicationProtocolNames.HTTP_2, ApplicationProtocolNames.HTTP_1_1)) + .build(); + } else { + sslCtx = SslContextBuilder.forClient() + .sslProvider(SslProvider.JDK) + .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE) + .trustManager(InsecureTrustManagerFactory.INSTANCE) + .applicationProtocolConfig(new ApplicationProtocolConfig(Protocol.ALPN, + SelectorFailureBehavior.NO_ADVERTISE, + SelectedListenerFailureBehavior.ACCEPT, ApplicationProtocolNames.HTTP_2)) + .build(); + } + return sslCtx; + + } + + public static ApplicationProtocolNegotiationHandler getServerAPNHandler() { + ApplicationProtocolNegotiationHandler serverAPNHandler = new ApplicationProtocolNegotiationHandler(ApplicationProtocolNames.HTTP_2) { + + @Override + protected void configurePipeline(ChannelHandlerContext ctx, String protocol) throws Exception { + if (ApplicationProtocolNames.HTTP_2.equals(protocol)) { + ctx.pipeline() + .addLast(Http2FrameCodecBuilder.forServer() + .build(), new Http2ServerResponseHandler()); + return; + } + throw new IllegalStateException("Protocol: " + protocol + " not supported"); + } + }; + return serverAPNHandler; + + } + + public static ApplicationProtocolNegotiationHandler getClientAPNHandler(int maxContentLength, Http2SettingsHandler settingsHandler, Http2ClientResponseHandler responseHandler) { + final Http2FrameLogger logger = new Http2FrameLogger(INFO, Http2Util.class); + final Http2Connection connection = new DefaultHttp2Connection(false); + + HttpToHttp2ConnectionHandler connectionHandler = new HttpToHttp2ConnectionHandlerBuilder() + .frameListener(new DelegatingDecompressorFrameListener(connection, new InboundHttp2ToHttpAdapterBuilder(connection).maxContentLength(maxContentLength) + .propagateSettings(true) + .build())) + .frameLogger(logger) + .connection(connection) + .build(); + + ApplicationProtocolNegotiationHandler clientAPNHandler = new ApplicationProtocolNegotiationHandler(ApplicationProtocolNames.HTTP_2) { + @Override + protected void configurePipeline(ChannelHandlerContext ctx, String protocol) { + if (ApplicationProtocolNames.HTTP_2.equals(protocol)) { + ChannelPipeline p = ctx.pipeline(); + p.addLast(connectionHandler); + p.addLast(settingsHandler, responseHandler); + return; + } + ctx.close(); + throw new IllegalStateException("Protocol: " + protocol + " not supported"); + } + }; + + return clientAPNHandler; + + } + + public static FullHttpRequest createGetRequest(String host, int port) { + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.valueOf("HTTP/2.0"), HttpMethod.GET, "/", Unpooled.EMPTY_BUFFER); + request.headers() + .add(HttpHeaderNames.HOST, new String(host + ":" + port)); + request.headers() + .add(HttpConversionUtil.ExtensionHeaderNames.SCHEME.text(), HttpScheme.HTTPS); + request.headers() + .add(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); + request.headers() + .add(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.DEFLATE); + return request; + } +} diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java new file mode 100644 index 0000000000..d50240fcb2 --- /dev/null +++ b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java @@ -0,0 +1,46 @@ +package com.baeldung.netty.http2.client; + +import com.baeldung.netty.http2.Http2Util; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.ssl.SslContext; + +public class Http2ClientInitializer extends ChannelInitializer { + + private final SslContext sslCtx; + private final int maxContentLength; + private Http2SettingsHandler settingsHandler; + private Http2ClientResponseHandler responseHandler; + private String host; + private int port; + + public Http2ClientInitializer(SslContext sslCtx, int maxContentLength, String host, int port) { + this.sslCtx = sslCtx; + this.maxContentLength = maxContentLength; + this.host = host; + this.port = port; + } + + @Override + public void initChannel(SocketChannel ch) throws Exception { + + settingsHandler = new Http2SettingsHandler(ch.newPromise()); + responseHandler = new Http2ClientResponseHandler(); + + if (sslCtx != null) { + ChannelPipeline pipeline = ch.pipeline(); + pipeline.addLast(sslCtx.newHandler(ch.alloc(), host, port)); + pipeline.addLast(Http2Util.getClientAPNHandler(maxContentLength, settingsHandler, responseHandler)); + } + } + + public Http2SettingsHandler getSettingsHandler() { + return settingsHandler; + } + + public Http2ClientResponseHandler getResponseHandler() { + return responseHandler; + } +} diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java new file mode 100644 index 0000000000..4e17155bbc --- /dev/null +++ b/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java @@ -0,0 +1,128 @@ +package com.baeldung.netty.http2.client; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http2.HttpConversionUtil; +import io.netty.util.CharsetUtil; + +public class Http2ClientResponseHandler extends SimpleChannelInboundHandler { + + private final Logger logger = LoggerFactory.getLogger(Http2ClientResponseHandler.class); + private final Map streamidMap; + + public Http2ClientResponseHandler() { + streamidMap = new HashMap(); + } + + public MapValues put(int streamId, ChannelFuture writeFuture, ChannelPromise promise) { + return streamidMap.put(streamId, new MapValues(writeFuture, promise)); + } + + public String awaitResponses(long timeout, TimeUnit unit) { + + Iterator> itr = streamidMap.entrySet() + .iterator(); + + String response = null; + + while (itr.hasNext()) { + Entry entry = itr.next(); + ChannelFuture writeFuture = entry.getValue() + .getWriteFuture(); + + if (!writeFuture.awaitUninterruptibly(timeout, unit)) { + throw new IllegalStateException("Timed out waiting to write for stream id " + entry.getKey()); + } + if (!writeFuture.isSuccess()) { + throw new RuntimeException(writeFuture.cause()); + } + ChannelPromise promise = entry.getValue() + .getPromise(); + + if (!promise.awaitUninterruptibly(timeout, unit)) { + throw new IllegalStateException("Timed out waiting for response on stream id " + entry.getKey()); + } + if (!promise.isSuccess()) { + throw new RuntimeException(promise.cause()); + } + logger.info("---Stream id: " + entry.getKey() + " received---"); + response = entry.getValue().getResponse(); + + itr.remove(); + } + + return response; + + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, FullHttpResponse msg) throws Exception { + Integer streamId = msg.headers() + .getInt(HttpConversionUtil.ExtensionHeaderNames.STREAM_ID.text()); + if (streamId == null) { + logger.error("HttpResponseHandler unexpected message received: " + msg); + return; + } + + MapValues value = streamidMap.get(streamId); + + if (value == null) { + logger.error("Message received for unknown stream id " + streamId); + ctx.close(); + } else { + ByteBuf content = msg.content(); + if (content.isReadable()) { + int contentLength = content.readableBytes(); + byte[] arr = new byte[contentLength]; + content.readBytes(arr); + String response = new String(arr, 0, contentLength, CharsetUtil.UTF_8); + logger.info("Response from Server: "+ (response)); + value.setResponse(response); + } + + value.getPromise() + .setSuccess(); + } + } + + public static class MapValues { + ChannelFuture writeFuture; + ChannelPromise promise; + String response; + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public MapValues(ChannelFuture writeFuture2, ChannelPromise promise2) { + this.writeFuture = writeFuture2; + this.promise = promise2; + } + + public ChannelFuture getWriteFuture() { + return writeFuture; + } + + public ChannelPromise getPromise() { + return promise; + } + + } +} diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java b/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java new file mode 100644 index 0000000000..93841187c7 --- /dev/null +++ b/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java @@ -0,0 +1,30 @@ +package com.baeldung.netty.http2.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http2.Http2Settings; + +import java.util.concurrent.TimeUnit; + +public class Http2SettingsHandler extends SimpleChannelInboundHandler { + private final ChannelPromise promise; + + public Http2SettingsHandler(ChannelPromise promise) { + this.promise = promise; + } + + public void awaitSettings(long timeout, TimeUnit unit) throws Exception { + if (!promise.awaitUninterruptibly(timeout, unit)) { + throw new IllegalStateException("Timed out waiting for settings"); + } + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, Http2Settings msg) throws Exception { + promise.setSuccess(); + + ctx.pipeline() + .remove(this); + } +} diff --git a/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java b/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java new file mode 100644 index 0000000000..a8e9e59953 --- /dev/null +++ b/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java @@ -0,0 +1,59 @@ +package com.baeldung.netty.http2.server; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.netty.http2.Http2Util; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.ssl.SslContext; + +public final class Http2Server { + + private static final int PORT = 8443; + private static final Logger logger = LoggerFactory.getLogger(Http2Server.class); + + public static void main(String[] args) throws Exception { + SslContext sslCtx = Http2Util.createSSLContext(true); + + EventLoopGroup group = new NioEventLoopGroup(); + try { + ServerBootstrap b = new ServerBootstrap(); + b.option(ChannelOption.SO_BACKLOG, 1024); + b.group(group) + .channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.INFO)) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + if (sslCtx != null) { + ch.pipeline() + .addLast(sslCtx.newHandler(ch.alloc()), Http2Util.getServerAPNHandler()); + } + } + + }); + + Channel ch = b.bind(PORT) + .sync() + .channel(); + + logger.info("HTTP/2 Server is listening on https://127.0.0.1:" + PORT + '/'); + + ch.closeFuture() + .sync(); + } finally { + group.shutdownGracefully(); + } + } + +} diff --git a/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java b/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java new file mode 100644 index 0000000000..24c66f15bb --- /dev/null +++ b/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java @@ -0,0 +1,52 @@ +package com.baeldung.netty.http2.server; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandler.Sharable; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.handler.codec.http2.DefaultHttp2DataFrame; +import io.netty.handler.codec.http2.DefaultHttp2Headers; +import io.netty.handler.codec.http2.DefaultHttp2HeadersFrame; +import io.netty.handler.codec.http2.Http2Headers; +import io.netty.handler.codec.http2.Http2HeadersFrame; +import io.netty.util.CharsetUtil; + +@Sharable +public class Http2ServerResponseHandler extends ChannelDuplexHandler { + + static final ByteBuf RESPONSE_BYTES = Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8)); + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + cause.printStackTrace(); + ctx.close(); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof Http2HeadersFrame) { + Http2HeadersFrame msgHeader = (Http2HeadersFrame) msg; + if (msgHeader.isEndStream()) { + ByteBuf content = ctx.alloc() + .buffer(); + content.writeBytes(RESPONSE_BYTES.duplicate()); + + Http2Headers headers = new DefaultHttp2Headers().status(HttpResponseStatus.OK.codeAsText()); + ctx.write(new DefaultHttp2HeadersFrame(headers).stream(msgHeader.stream())); + ctx.write(new DefaultHttp2DataFrame(content, true).stream(msgHeader.stream())); + } + + } else { + super.channelRead(ctx, msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + +} diff --git a/netty/src/main/resources/logback.xml b/netty/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/netty/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java b/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java new file mode 100644 index 0000000000..6b9a53a1b3 --- /dev/null +++ b/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java @@ -0,0 +1,91 @@ +package com.baeldung.netty; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.concurrent.TimeUnit; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.netty.http2.Http2Util; +import com.baeldung.netty.http2.client.Http2ClientInitializer; +import com.baeldung.netty.http2.client.Http2ClientResponseHandler; +import com.baeldung.netty.http2.client.Http2SettingsHandler; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.ssl.SslContext; + +//Ensure the server class - Http2Server.java is already started before running this test +public class Http2ClientLiveTest { + + private static final Logger logger = LoggerFactory.getLogger(Http2ClientLiveTest.class); + + private static final String HOST = "127.0.0.1"; + private static final int PORT = 8443; + private SslContext sslCtx; + private Channel channel; + + @Before + public void setup() throws Exception { + sslCtx = Http2Util.createSSLContext(false); + } + + @Test + public void whenRequestSent_thenHelloWorldReceived() throws Exception { + + EventLoopGroup workerGroup = new NioEventLoopGroup(); + Http2ClientInitializer initializer = new Http2ClientInitializer(sslCtx, Integer.MAX_VALUE, HOST, PORT); + + try { + Bootstrap b = new Bootstrap(); + b.group(workerGroup); + b.channel(NioSocketChannel.class); + b.option(ChannelOption.SO_KEEPALIVE, true); + b.remoteAddress(HOST, PORT); + b.handler(initializer); + + channel = b.connect() + .syncUninterruptibly() + .channel(); + + logger.info("Connected to [" + HOST + ':' + PORT + ']'); + + Http2SettingsHandler http2SettingsHandler = initializer.getSettingsHandler(); + http2SettingsHandler.awaitSettings(60, TimeUnit.SECONDS); + + logger.info("Sending request(s)..."); + + FullHttpRequest request = Http2Util.createGetRequest(HOST, PORT); + + Http2ClientResponseHandler responseHandler = initializer.getResponseHandler(); + int streamId = 3; + + responseHandler.put(streamId, channel.write(request), channel.newPromise()); + channel.flush(); + String response = responseHandler.awaitResponses(60, TimeUnit.SECONDS); + + assertEquals("Hello World", response); + + logger.info("Finished HTTP/2 request(s)"); + + } finally { + workerGroup.shutdownGracefully(); + } + + } + + @After + public void cleanup() { + channel.close() + .syncUninterruptibly(); + } +} diff --git a/pom.xml b/pom.xml index e21c13efc2..5602e807b9 100644 --- a/pom.xml +++ b/pom.xml @@ -536,6 +536,7 @@ mybatis netflix-modules + ninja open-liberty @@ -1047,6 +1048,7 @@ mybatis netflix-modules + ninja open-liberty From 6640e14f8bec1c63a117a75acebc16a0e4fd14a6 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 8 Apr 2020 13:11:01 +0800 Subject: [PATCH 346/530] Update README.md --- logging-modules/log-mdc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logging-modules/log-mdc/README.md b/logging-modules/log-mdc/README.md index b676d3ba76..0d516619ef 100644 --- a/logging-modules/log-mdc/README.md +++ b/logging-modules/log-mdc/README.md @@ -1,7 +1,7 @@ ### Relevant Articles: - TBD - [Improved Java Logging with Mapped Diagnostic Context (MDC)](https://www.baeldung.com/mdc-in-log4j-2-logback) -- [Java Logging with Nested Diagnostic Context (NDC)](https:www.baeldung.com/java-logging-ndc-log4j) +- [Java Logging with Nested Diagnostic Context (NDC)](https://www.baeldung.com/java-logging-ndc-log4j) - [Drools Using Rules from Excel Files](https://www.baeldung.com/drools-excel) ### References From 15d4893d2e2742261e2661d3ffabcfca443a6851 Mon Sep 17 00:00:00 2001 From: Joao Esperancinha Date: Wed, 8 Apr 2020 08:13:28 +0200 Subject: [PATCH 347/530] [BAEL-2749] Bumps DBUnit to version 2.7.0 --- libraries-testing/pom.xml | 2 +- .../test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index c4d2786441..ad6c81a3d6 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -198,7 +198,7 @@ 3.6.2 2.0.0.0 1.4.200 - 2.6.0 + 2.7.0 3.14.0 1.8 1.8 diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java index 20b0337f4d..93c7e9a456 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/DataSourceDBUnitTest.java @@ -17,6 +17,7 @@ import org.junit.platform.commons.logging.LoggerFactory; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; @@ -33,7 +34,7 @@ public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase { private static final Logger logger = LoggerFactory.getLogger(DataSourceDBUnitTest.class); @Override - protected javax.sql.DataSource getDataSource() { + protected DataSource getDataSource() { JdbcDataSource dataSource = new JdbcDataSource(); dataSource.setURL(JDBC_URL); dataSource.setUser("sa"); From 5fc5e76929e92bb781dcc0dc707be61ffd98078b Mon Sep 17 00:00:00 2001 From: Aitor Cuesta Date: Wed, 8 Apr 2020 11:30:52 +0200 Subject: [PATCH 348/530] BAEL-3075 - PR reviews, removing Oracle jars, adding extra explanation/configuration to Oracle configurations --- .../spring-boot-persistence-2/README.md | 3 +- .../spring-boot-persistence-2/lib/ons.jar | Bin 139977 -> 0 bytes .../spring-boot-persistence-2/pom.xml | 101 ++++++++---------- .../configuration/OracleConfiguration.java | 2 + .../configuration/OracleUCPConfiguration.java | 4 +- 5 files changed, 53 insertions(+), 57 deletions(-) delete mode 100644 persistence-modules/spring-boot-persistence-2/lib/ons.jar diff --git a/persistence-modules/spring-boot-persistence-2/README.md b/persistence-modules/spring-boot-persistence-2/README.md index a74bf7ff02..fac8b75615 100644 --- a/persistence-modules/spring-boot-persistence-2/README.md +++ b/persistence-modules/spring-boot-persistence-2/README.md @@ -1,4 +1,3 @@ ### Relevant Articles: -- [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi) -- [Oracle Connection Pooling With Spring](https://www.baeldung.com/oracle-connection-pooling-with-spring) \ No newline at end of file +- [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi) \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-2/lib/ons.jar b/persistence-modules/spring-boot-persistence-2/lib/ons.jar deleted file mode 100644 index 637cf11887b54ddf4d567b7251ee51a18d235af7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139977 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 z 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 z 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

ewb;D-r7XArVu8KG|V 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 f6l~YCbtn6nEB3w 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 OhYSiT6$(iBp#BHktRXf4 diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 8f76bce1b3..c1afededb0 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.boot.persistence spring-boot-persistence-2 @@ -41,20 +41,20 @@ - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - net.bytebuddy - byte-buddy - + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + net.bytebuddy + byte-buddy + org.jdbi @@ -92,47 +92,23 @@ spring-boot-starter-test test - + - com.oracle - ojdbc8 - 12.2.0.1 - system - ${basedir}/lib/ojdbc8.jar - - - - com.oracle - ucp - 12.2.0.1 - system - ${basedir}/lib/ucp.jar - - - - com.oracle - ons - 12.2.0.1 - system - ${basedir}/lib/ons.jar - + com.mchange + c3p0 + ${c3p0.version} + - - com.mchange - c3p0 - ${c3p0.version} - + + org.apache.commons + commons-dbcp2 + + + + org.apache.tomcat + tomcat-jdbc + - - org.apache.commons - commons-dbcp2 - - - - org.apache.tomcat - tomcat-jdbc - - @@ -141,6 +117,23 @@ org.springframework.boot spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java + com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java + + + com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleLiveTest.java + com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java + + + diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java index 327374cb54..9cf7e27c99 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleConfiguration.java @@ -22,6 +22,8 @@ public class OracleConfiguration { dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); dataSource.setFastConnectionFailoverEnabled(true); dataSource.setImplicitCachingEnabled(true); + // Only with clients prior to v11.2 + // dataSource.setConnectionCachingEnabled(true); return dataSource; } } diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java index 67b4b40712..b4c1544149 100644 --- a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java +++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/oracle/pooling/configuration/OracleUCPConfiguration.java @@ -21,9 +21,11 @@ public class OracleUCPConfiguration { dataSource.setUser("books"); dataSource.setPassword("books"); dataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); - dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); + dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1"); + dataSource.setFastConnectionFailoverEnabled(true); dataSource.setInitialPoolSize(5); + dataSource.setMinPoolSize(5); dataSource.setMaxPoolSize(10); return dataSource; } From f9ac384b8567a06c65e7b1e47c3ec2c3026a8dda Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 8 Apr 2020 18:40:34 +0100 Subject: [PATCH 349/530] Added BAEL-3604 code (#9020) * Added BAEL-3604 code --- .../core-java-security-2/pom.xml | 11 ++++ .../com/baeldung/checksums/ChecksumUtils.java | 23 +++++++++ .../checksums/ChecksumUtilsUnitTest.java | 51 +++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 core-java-modules/core-java-security-2/src/main/java/com/baeldung/checksums/ChecksumUtils.java create mode 100644 core-java-modules/core-java-security-2/src/test/java/com/baeldung/checksums/ChecksumUtilsUnitTest.java diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml index 9315ab4af2..5db3b67c04 100644 --- a/core-java-modules/core-java-security-2/pom.xml +++ b/core-java-modules/core-java-security-2/pom.xml @@ -17,6 +17,7 @@ + commons-codec commons-codec @@ -36,6 +37,15 @@ ${assertj-core.version} test + + + + javax.xml.bind + jaxb-api + 2.3.1 + + + @@ -46,4 +56,5 @@ 3.10.0 + diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/checksums/ChecksumUtils.java b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/checksums/ChecksumUtils.java new file mode 100644 index 0000000000..d214a0f757 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/main/java/com/baeldung/checksums/ChecksumUtils.java @@ -0,0 +1,23 @@ +package com.baeldung.checksums; + +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.CRC32; +import java.util.zip.CheckedInputStream; +import java.util.zip.Checksum; + +public class ChecksumUtils { + + public static long getChecksumCRC32(byte[] bytes) { + Checksum crc32 = new CRC32(); + crc32.update(bytes, 0, bytes.length); + return crc32.getValue(); + } + + public static long getChecksumCRC32(InputStream stream, int bufferSize) throws IOException { + CheckedInputStream checkedInputStream = new CheckedInputStream(stream, new CRC32()); + byte[] buffer = new byte[bufferSize]; + while (checkedInputStream.read(buffer, 0, buffer.length) >= 0) {} + return checkedInputStream.getChecksum().getValue(); + } +} diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/checksums/ChecksumUtilsUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/checksums/ChecksumUtilsUnitTest.java new file mode 100644 index 0000000000..f5366917f6 --- /dev/null +++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/checksums/ChecksumUtilsUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.checksums; + + +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.jupiter.api.Assertions.*; + +class ChecksumUtilsUnitTest { + + byte[] arr; + + @Before + void setUp() { + arr = new byte[]{0,10,21,20,35,40,120,56,72,22}; + } + + @Test + void givenByteArray_whenChecksumCreated_checkCorrect() { + + long checksum = ChecksumUtils.getChecksumCRC32(arr); + + assertEquals(3915397664L, checksum); + } + + @Test + void givenTwoDifferentStrings_whenChecksumCreated_checkCollision() { + + String plumless = "plumless"; + String buckeroo = "buckeroo"; + + long plumlessChecksum = ChecksumUtils.getChecksumCRC32(plumless.getBytes()); + long buckerooChecksum = ChecksumUtils.getChecksumCRC32(buckeroo.getBytes()); + + assertEquals(plumlessChecksum, buckerooChecksum); + } + + @Test + void givenInputString_whenChecksumCreated_checkCorrect() throws IOException { + + InputStream inputStream = new ByteArrayInputStream(arr); + long checksum = ChecksumUtils.getChecksumCRC32(inputStream, 10); + + assertEquals(3915397664L, checksum); + + } +} \ No newline at end of file From 88cc732dc7bfffba9f086bd0d77f0487b56bd0bb Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Thu, 9 Apr 2020 10:30:04 +0300 Subject: [PATCH 350/530] BAEL-3649 Quick Guide to Spring Cloud Circuit Breaker (#8819) --- .../spring-cloud-circuit-breaker/README.md | 5 ++ .../spring-cloud-circuit-breaker/pom.xml | 55 ++++++++++++++ .../baeldung/circuitbreaker/AlbumService.java | 40 +++++++++++ .../baeldung/circuitbreaker/Controller.java | 18 +++++ .../baeldung/circuitbreaker/SpringApp.java | 71 +++++++++++++++++++ .../main/resources/fallback-album-list.json | 12 ++++ 6 files changed, 201 insertions(+) create mode 100644 spring-cloud/spring-cloud-circuit-breaker/README.md create mode 100644 spring-cloud/spring-cloud-circuit-breaker/pom.xml create mode 100644 spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/AlbumService.java create mode 100644 spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/Controller.java create mode 100644 spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/SpringApp.java create mode 100644 spring-cloud/spring-cloud-circuit-breaker/src/main/resources/fallback-album-list.json diff --git a/spring-cloud/spring-cloud-circuit-breaker/README.md b/spring-cloud/spring-cloud-circuit-breaker/README.md new file mode 100644 index 0000000000..040eb0ccee --- /dev/null +++ b/spring-cloud/spring-cloud-circuit-breaker/README.md @@ -0,0 +1,5 @@ +## Spring Cloud Circuit Breaker + +This module contains articles about Spring Cloud Circuit Breaker + +### Relevant Articles: diff --git a/spring-cloud/spring-cloud-circuit-breaker/pom.xml b/spring-cloud/spring-cloud-circuit-breaker/pom.xml new file mode 100644 index 0000000000..188fc4bf8e --- /dev/null +++ b/spring-cloud/spring-cloud-circuit-breaker/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + spring-cloud-circuit-breaker + spring-cloud-gateway + jar + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + .. + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot + + true + + + false + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.2.4.RELEASE + pom + import + + + + + + + org.springframework.cloud + spring-cloud-starter-circuitbreaker-resilience4j + 1.0.2.RELEASE + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/AlbumService.java b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/AlbumService.java new file mode 100644 index 0000000000..67163c8c9a --- /dev/null +++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/AlbumService.java @@ -0,0 +1,40 @@ +package com.baeldung.circuitbreaker; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.circuitbreaker.CircuitBreaker; +import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.nio.file.Files; +import java.nio.file.Paths; + +@Service +public class AlbumService { + + private static final Logger LOGGER = LoggerFactory.getLogger(AlbumService.class); + + @Autowired + private CircuitBreakerFactory circuitBreakerFactory; + + private RestTemplate restTemplate = new RestTemplate(); + + public String getAlbumList() { + CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker"); + String url = "https://jsonplaceholder.typicode.com/albums"; + + return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class), throwable -> getDefaultAlbumList()); + } + + private String getDefaultAlbumList() { + try { + return new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("fallback-album-list.json").toURI()))); + } catch (Exception e) { + LOGGER.error("error occurred while reading the file", e); + } + return null; + } + +} diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/Controller.java b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/Controller.java new file mode 100644 index 0000000000..10f7c57a7a --- /dev/null +++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/Controller.java @@ -0,0 +1,18 @@ +package com.baeldung.circuitbreaker; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class Controller { + + @Autowired + private AlbumService service; + + @GetMapping("/albums") + public String albums() { + return service.getAlbumList(); + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/SpringApp.java b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/SpringApp.java new file mode 100644 index 0000000000..f891e7693f --- /dev/null +++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/java/com/baeldung/circuitbreaker/SpringApp.java @@ -0,0 +1,71 @@ +package com.baeldung.circuitbreaker; + +import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig; +import io.github.resilience4j.timelimiter.TimeLimiterConfig; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory; +import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder; +import org.springframework.cloud.client.circuitbreaker.Customizer; +import org.springframework.context.annotation.Bean; + +import java.time.Duration; + +@SpringBootApplication +public class SpringApp { + + public static void main(String[] args) { + SpringApplication.run(SpringApp.class, args); + } + + @Bean + public Customizer globalCustomConfiguration() { + TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom() + .timeoutDuration(Duration.ofSeconds(4)) + .build(); + CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() + .failureRateThreshold(50) + .waitDurationInOpenState(Duration.ofMillis(1000)) + .slidingWindowSize(2) + .build(); + + return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) + .timeLimiterConfig(timeLimiterConfig) + .circuitBreakerConfig(circuitBreakerConfig) + .build()); + } + + @Bean + public Customizer specificCustomConfiguration1() { + + TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom() + .timeoutDuration(Duration.ofSeconds(4)) + .build(); + CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() + .failureRateThreshold(50) + .waitDurationInOpenState(Duration.ofMillis(1000)) + .slidingWindowSize(2) + .build(); + + return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig) + .timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker"); + } + + @Bean + public Customizer specificCustomConfiguration2() { + + TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom() + .timeoutDuration(Duration.ofSeconds(4)) + .build(); + CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() + .failureRateThreshold(50) + .waitDurationInOpenState(Duration.ofMillis(1000)) + .slidingWindowSize(2) + .build(); + + return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig) + .timeLimiterConfig(timeLimiterConfig).build(), + "circuitBreaker1", "circuitBreaker2", "circuitBreaker3"); + } + +} diff --git a/spring-cloud/spring-cloud-circuit-breaker/src/main/resources/fallback-album-list.json b/spring-cloud/spring-cloud-circuit-breaker/src/main/resources/fallback-album-list.json new file mode 100644 index 0000000000..001df7610a --- /dev/null +++ b/spring-cloud/spring-cloud-circuit-breaker/src/main/resources/fallback-album-list.json @@ -0,0 +1,12 @@ +[ + { + "userId": 1, + "id": 1, + "title": "quidem molestiae enim" + }, + { + "userId": 1, + "id": 2, + "title": "sunt qui excepturi placeat culpa" + } +] \ No newline at end of file From 3786d6309db285b8d8f2b999b2ee020593816050 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 9 Apr 2020 16:48:25 +0800 Subject: [PATCH 351/530] Update README.md --- java-numbers/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers/README.md b/java-numbers/README.md index 8f53006b38..f4b76c3c98 100644 --- a/java-numbers/README.md +++ b/java-numbers/README.md @@ -12,4 +12,5 @@ This module contains articles about numbers in Java. - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) - [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) +- [Using Math.sin with Degrees](https://www.baeldung.com/java-math-sin-degrees) - More articles: [[next -->]](/../java-numbers-2) From d29fef1f518a3d35cb35d74204ba468a263a825b Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Thu, 9 Apr 2020 16:50:03 +0800 Subject: [PATCH 352/530] Update README.md --- core-kotlin-modules/core-kotlin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-kotlin-modules/core-kotlin/README.md b/core-kotlin-modules/core-kotlin/README.md index 90caccf5c8..151da607ac 100644 --- a/core-kotlin-modules/core-kotlin/README.md +++ b/core-kotlin-modules/core-kotlin/README.md @@ -3,7 +3,7 @@ This module contains articles about Kotlin core features. ### Relevant articles: -- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin-intro) +- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin/tutorial) - [Kotlin Java Interoperability](https://www.baeldung.com/kotlin-java-interoperability) - [Get a Random Number in Kotlin](https://www.baeldung.com/kotlin-random-number) - [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project) From b132703ce9a61e3ca0a8b6ea69b9790075907265 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 9 Apr 2020 21:04:10 +0530 Subject: [PATCH 353/530] JWs module dependency fix --- jws/pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/jws/pom.xml b/jws/pom.xml index e6ab7e05ec..f867df8051 100644 --- a/jws/pom.xml +++ b/jws/pom.xml @@ -17,7 +17,7 @@ OpenNMS Repository - http://repo.opennms.org/maven2/ + https://repo.opennms.org/maven2/ @@ -27,11 +27,6 @@ jnlp-servlet ${jnlp-servlet.version} - - javax.samples.jnlp - jnlp-jardiff - ${jnlp-jardiff.version} - @@ -84,7 +79,6 @@ 3.0.2 - 1.6.0 1.6.0 From bcf5d50baa5e4b8ce46be437095123a985dcadda Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Thu, 9 Apr 2020 23:42:31 +0530 Subject: [PATCH 354/530] JAVA-1188: Removed duplicate entry from README --- core-java-modules/core-java-collections-maps/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-collections-maps/README.md b/core-java-modules/core-java-collections-maps/README.md index 828f8992e1..15cb32fbe8 100644 --- a/core-java-modules/core-java-collections-maps/README.md +++ b/core-java-modules/core-java-collections-maps/README.md @@ -4,7 +4,6 @@ This module contains articles about Map data structures in Java. ### Relevant Articles: - [Guide to the Guava BiMap](https://www.baeldung.com/guava-bimap) -- [A Guide to Java HashMap](https://www.baeldung.com/java-hashmap) - [A Guide to LinkedHashMap in Java](https://www.baeldung.com/java-linked-hashmap) - [A Guide to TreeMap in Java](https://www.baeldung.com/java-treemap) - [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys) From db789ae6748a944168dda12c507406e748405315 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Thu, 9 Apr 2020 20:55:15 +0200 Subject: [PATCH 355/530] JAVA-976: Fix spring-security-mvc-login configuration --- .../src/test/java/com/baeldung/SpringContextTest.java | 2 +- .../security/RedirectionSecurityIntegrationTest.java | 2 +- .../src/test/resources/mvc-servlet.xml | 8 -------- 3 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml diff --git a/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/SpringContextTest.java index 4cf3b736ea..dfc83a40b0 100644 --- a/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/SpringContextTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration({ "/RedirectionWebSecurityConfig.xml", "/mvc-servlet.xml" }) +@ContextConfiguration({ "/RedirectionWebSecurityConfig.xml" }) @WebAppConfiguration public class SpringContextTest { @Test diff --git a/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/security/RedirectionSecurityIntegrationTest.java b/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/security/RedirectionSecurityIntegrationTest.java index 1235e2e69f..e2b444de20 100644 --- a/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/security/RedirectionSecurityIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-login/src/test/java/com/baeldung/security/RedirectionSecurityIntegrationTest.java @@ -25,7 +25,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration({ "/RedirectionWebSecurityConfig.xml", "/mvc-servlet.xml" }) +@ContextConfiguration({ "/RedirectionWebSecurityConfig.xml" }) @WebAppConfiguration public class RedirectionSecurityIntegrationTest { diff --git a/spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml b/spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml deleted file mode 100644 index aee837c977..0000000000 --- a/spring-security-modules/spring-security-mvc-login/src/test/resources/mvc-servlet.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file From 06a4e640bb6da563db64c2d2d949b2ddbf4c73cf Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Fri, 10 Apr 2020 03:15:39 +0430 Subject: [PATCH 356/530] Fixed a few cassandra related issues --- persistence-modules/java-cassandra/pom.xml | 6 +++ .../src/test/resources/cassandra.yaml | 51 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 persistence-modules/java-cassandra/src/test/resources/cassandra.yaml diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml index 54879fb321..091efaeff4 100644 --- a/persistence-modules/java-cassandra/pom.xml +++ b/persistence-modules/java-cassandra/pom.xml @@ -18,6 +18,12 @@ cassandra-driver-core ${cassandra-driver-core.version} true + + + com.google.guava + guava + + diff --git a/persistence-modules/java-cassandra/src/test/resources/cassandra.yaml b/persistence-modules/java-cassandra/src/test/resources/cassandra.yaml new file mode 100644 index 0000000000..59687444d0 --- /dev/null +++ b/persistence-modules/java-cassandra/src/test/resources/cassandra.yaml @@ -0,0 +1,51 @@ +cluster_name: 'Test Cluster' +hinted_handoff_enabled: true +max_hint_window_in_ms: 10800000 +hinted_handoff_throttle_in_kb: 1024 +max_hints_delivery_threads: 2 +hints_directory: target/embeddedCassandra/hints +authenticator: AllowAllAuthenticator +authorizer: AllowAllAuthorizer +permissions_validity_in_ms: 2000 +partitioner: RandomPartitioner +data_file_directories: + - target/embeddedCassandra/data +commitlog_directory: target/embeddedCassandra/commitlog +cdc_raw_directory: target/embeddedCassandra/cdc +disk_failure_policy: stop +key_cache_size_in_mb: +key_cache_save_period: 14400 +row_cache_size_in_mb: 0 +row_cache_save_period: 0 +saved_caches_directory: target/embeddedCassandra/saved_caches +commitlog_sync: periodic +commitlog_sync_period_in_ms: 10000 +commitlog_segment_size_in_mb: 32 +concurrent_reads: 32 +concurrent_writes: 32 +trickle_fsync: false +trickle_fsync_interval_in_kb: 10240 +thrift_framed_transport_size_in_mb: 15 +thrift_max_message_length_in_mb: 16 +incremental_backups: false +snapshot_before_compaction: false +auto_snapshot: false +column_index_size_in_kb: 64 +compaction_throughput_mb_per_sec: 16 +read_request_timeout_in_ms: 5000 +range_request_timeout_in_ms: 10000 +write_request_timeout_in_ms: 2000 +cas_contention_timeout_in_ms: 1000 +truncate_request_timeout_in_ms: 60000 +request_timeout_in_ms: 10000 +cross_node_timeout: false +endpoint_snitch: SimpleSnitch +dynamic_snitch_update_interval_in_ms: 100 +dynamic_snitch_reset_interval_in_ms: 600000 +dynamic_snitch_badness_threshold: 0.1 +request_scheduler: org.apache.cassandra.scheduler.NoScheduler +index_interval: 128 +seed_provider: + - class_name: org.apache.cassandra.locator.SimpleSeedProvider + parameters: + - seeds: "127.0.0.1" From 7e26a04973e631dcb6ea88cf0e9fbc7b2ad35a34 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Fri, 10 Apr 2020 09:24:15 +0200 Subject: [PATCH 357/530] springboot shedlock building fix --- spring-boot-modules/spring-boot-libraries/pom.xml | 4 ++++ .../shedlock/SpringBootShedlockApplication.java} | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) rename spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/{Application.java => scheduling/shedlock/SpringBootShedlockApplication.java} (71%) diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index 2b1b1b7d12..090967d8a8 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -28,6 +28,10 @@ org.springframework.boot spring-boot-starter-tomcat + + org.springframework.boot + spring-boot-starter-data-jpa + org.springframework.boot spring-boot-starter-test diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SpringBootShedlockApplication.java similarity index 71% rename from spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/Application.java rename to spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SpringBootShedlockApplication.java index 15422e1065..cebb234036 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/Application.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SpringBootShedlockApplication.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.scheduling.shedlock; import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import org.springframework.boot.SpringApplication; @@ -8,8 +8,8 @@ import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") -public class Application { +public class SpringBootShedlockApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(SpringBootShedlockApplication.class, args); } } From 52ca4fbcd9e8d1d42eafdb1b4b16326fa09eb404 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 15:29:38 +0800 Subject: [PATCH 358/530] Update README.md --- core-java-modules/core-java-date-operations-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-date-operations-2/README.md b/core-java-modules/core-java-date-operations-2/README.md index 728162ca1a..19c7b98d30 100644 --- a/core-java-modules/core-java-date-operations-2/README.md +++ b/core-java-modules/core-java-date-operations-2/README.md @@ -7,4 +7,5 @@ This module contains articles about date operations in Java. - [Checking If Two Java Dates Are on the Same Day](https://www.baeldung.com/java-check-two-dates-on-same-day) - [Converting Java Date to OffsetDateTime](https://www.baeldung.com/java-convert-date-to-offsetdatetime) - [How to Set the JVM Time Zone](https://www.baeldung.com/java-jvm-time-zone) +- [How to determine day of week by passing specific date in Java?](https://www.baeldung.com/java-get-day-of-week) - [[<-- Prev]](/core-java-modules/core-java-date-operations-1) From bf764f5f44da4adf16a24d08313c85fecf4a93c2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 15:31:19 +0800 Subject: [PATCH 359/530] Update README.md --- spring-reactive-kotlin/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-reactive-kotlin/README.md b/spring-reactive-kotlin/README.md index 629f7e7f58..d6ce3b7645 100644 --- a/spring-reactive-kotlin/README.md +++ b/spring-reactive-kotlin/README.md @@ -4,3 +4,4 @@ This module contains articles about reactive Kotlin ### Relevant Articles: - [Spring Webflux with Kotlin](https://www.baeldung.com/spring-webflux-kotlin) +- [Kotlin Reactive Microservice With Spring Boot](https://www.baeldung.com/spring-boot-kotlin-reactive-microservice) From e1cf55dc822408210083eff3d52f6502d2c4060f Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 15:40:36 +0800 Subject: [PATCH 360/530] Update README.md --- core-java-modules/core-java-lang-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md index 65d40c6a26..3ade982397 100644 --- a/core-java-modules/core-java-lang-2/README.md +++ b/core-java-modules/core-java-lang-2/README.md @@ -10,4 +10,5 @@ This module contains articles about core features in the Java language - [How to Return Multiple Values From a Java Method](https://www.baeldung.com/java-method-return-multiple-values) - [Guide to the Java finally Keyword](https://www.baeldung.com/java-finally-keyword) - [The Java Headless Mode](https://www.baeldung.com/java-headless-mode) +- [Comparing Long Values in Java](https://www.baeldung.com/java-compare-long-values) - [[<-- Prev]](/core-java-modules/core-java-lang) From 404f13f940d2f2d7143f5d6bcd9231c27f63059a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 15:46:47 +0800 Subject: [PATCH 361/530] Update README.md --- spring-security-modules/spring-security-mvc/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-modules/spring-security-mvc/README.md b/spring-security-modules/spring-security-mvc/README.md index 7d1a492cd3..bb4cfe1a4f 100644 --- a/spring-security-modules/spring-security-mvc/README.md +++ b/spring-security-modules/spring-security-mvc/README.md @@ -10,6 +10,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [HttpSessionListener Example – Monitoring](https://www.baeldung.com/httpsessionlistener_with_metrics) - [Control the Session with Spring Security](https://www.baeldung.com/spring-security-session) +- [The Clear-Site-Data Header in Spring Security](https://www.baeldung.com/spring-security-clear-site-data-header) ### Build the Project From 721f339d8c32ba93f908e021a298e90666544ce5 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 15:50:44 +0800 Subject: [PATCH 362/530] Update README.md --- core-java-modules/core-java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-strings/README.md b/core-java-modules/core-java-strings/README.md index 4a418db29f..5daae8394a 100644 --- a/core-java-modules/core-java-strings/README.md +++ b/core-java-modules/core-java-strings/README.md @@ -12,3 +12,4 @@ This module contains articles about strings in Java. - [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions) - [Java Multi-line String](https://www.baeldung.com/java-multiline-string) - [Guide to Java String Pool](https://www.baeldung.com/java-string-pool) +- [Fixing “constant string too long” Build Error](https://www.baeldung.com/java-constant-string-too-long-error) From 086d6a9531a5f42f1284ed1809254d22226c688a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 15:54:59 +0800 Subject: [PATCH 363/530] Update README.md --- persistence-modules/hibernate-jpa/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate-jpa/README.md b/persistence-modules/hibernate-jpa/README.md index d0a253f028..fb48f975bc 100644 --- a/persistence-modules/hibernate-jpa/README.md +++ b/persistence-modules/hibernate-jpa/README.md @@ -13,3 +13,4 @@ This module contains articles specific to use of Hibernate as a JPA implementati - [Enabling Transaction Locks in Spring Data JPA](https://www.baeldung.com/java-jpa-transaction-locks) - [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception) - [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context) +- [Quick Guide to EntityManager#getReference()](https://www.baeldung.com/jpa-entity-manager-get-reference) From f88c53eb4921eb6aac480f4524912e8ef5620f10 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 15:57:27 +0800 Subject: [PATCH 364/530] Update README.md --- core-java-modules/core-java-regex/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-regex/README.md b/core-java-modules/core-java-regex/README.md index 21cd7a95a3..6fdea9f2ca 100644 --- a/core-java-modules/core-java-regex/README.md +++ b/core-java-modules/core-java-regex/README.md @@ -9,3 +9,4 @@ - [Pre-compile Regex Patterns Into Pattern Objects](https://www.baeldung.com/java-regex-pre-compile) - [Difference Between Java Matcher find() and matches()](https://www.baeldung.com/java-matcher-find-vs-matches) - [How to Use Regular Expressions to Replace Tokens in Strings](https://www.baeldung.com/java-regex-token-replacement) +- [Regular Expressions \s and \s+ in Java](https://www.baeldung.com/java-regex-s-splus) From 012465bed2504d614c0c694e24c0f023492ba1dc Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:00:00 +0800 Subject: [PATCH 365/530] Create README.md --- persistence-modules/spring-persistence-simple-2/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 persistence-modules/spring-persistence-simple-2/README.md diff --git a/persistence-modules/spring-persistence-simple-2/README.md b/persistence-modules/spring-persistence-simple-2/README.md new file mode 100644 index 0000000000..a6408df8f2 --- /dev/null +++ b/persistence-modules/spring-persistence-simple-2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Spring JdbcTemplate Unit Testing](https://www.baeldung.com/spring-jdbctemplate-testing) From 564e7fc0337630a6b7e53a49abbd018dabf3eb06 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:02:20 +0800 Subject: [PATCH 366/530] Create README.md --- algorithms-miscellaneous-6/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 algorithms-miscellaneous-6/README.md diff --git a/algorithms-miscellaneous-6/README.md b/algorithms-miscellaneous-6/README.md new file mode 100644 index 0000000000..d9d6483a39 --- /dev/null +++ b/algorithms-miscellaneous-6/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Boruvka’s Algorithm for Minimum Spanning Trees](https://www.baeldung.com/java-boruvka-algorithm) From 09b03f875416b14694b3491c46cbcf52e796bb91 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:05:30 +0800 Subject: [PATCH 367/530] Update README.md --- algorithms-miscellaneous-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms-miscellaneous-6/README.md b/algorithms-miscellaneous-6/README.md index d9d6483a39..99be63d7ca 100644 --- a/algorithms-miscellaneous-6/README.md +++ b/algorithms-miscellaneous-6/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Boruvka’s Algorithm for Minimum Spanning Trees](https://www.baeldung.com/java-boruvka-algorithm) +- [Gradient Descent in Java](https://www.baeldung.com/java-gradient-descent) From acdcb5cacab872b1ce9b907483efa67a67e9cc23 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:07:16 +0800 Subject: [PATCH 368/530] Update README.md --- core-java-modules/core-java-concurrency-basic-2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md index e3f7a94e14..c7143baf36 100644 --- a/core-java-modules/core-java-concurrency-basic-2/README.md +++ b/core-java-modules/core-java-concurrency-basic-2/README.md @@ -8,4 +8,5 @@ This module contains articles about basic Java concurrency - [Difference Between Wait and Sleep in Java](https://www.baeldung.com/java-wait-and-sleep) - [Guide to the Synchronized Keyword in Java](https://www.baeldung.com/java-synchronized) - [Life Cycle of a Thread in Java](https://www.baeldung.com/java-thread-lifecycle) -- [[<-- Prev]](/core-java-modules/core-java-concurrency-basic) \ No newline at end of file +- [Guide to AtomicMarkableReference](https://www.baeldung.com/java-atomicmarkablereference) +- [[<-- Prev]](/core-java-modules/core-java-concurrency-basic) From 88afc279cffb8c58ec7f0e5416a34d2efb5ca282 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:10:17 +0800 Subject: [PATCH 369/530] Update README.md --- core-java-modules/core-java-string-operations/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations/README.md b/core-java-modules/core-java-string-operations/README.md index 18a2649a6a..c40e56bc46 100644 --- a/core-java-modules/core-java-string-operations/README.md +++ b/core-java-modules/core-java-string-operations/README.md @@ -13,4 +13,5 @@ This module contains articles about string operations. - [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline) - [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring) - [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode) +- [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) - More articles: [[next -->]](../core-java-string-operations-2) From c34f99f42aac0ea22d6afbbbf356568c1afaa24c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:21:07 +0800 Subject: [PATCH 370/530] Update README.md --- libraries-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-3/README.md b/libraries-3/README.md index 62bd3b9f66..ec433960ef 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -16,3 +16,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Introduction to Takes](https://www.baeldung.com/java-takes) - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway) - [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro) +- [Quick Guide to Spring Cloud Circuit Breaker](https://www.baeldung.com/spring-cloud-circuit-breaker) From 45abeb493b4d34a3b6502faa632d0bcd160cc3c7 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:22:40 +0800 Subject: [PATCH 371/530] Update README.md --- core-java-modules/core-java-concurrency-advanced-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-advanced-3/README.md b/core-java-modules/core-java-concurrency-advanced-3/README.md index 2c554e948b..b11cde5158 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/README.md +++ b/core-java-modules/core-java-concurrency-advanced-3/README.md @@ -10,4 +10,5 @@ This module contains articles about advanced topics about multithreading with co - [Guide to RejectedExecutionHandler](https://www.baeldung.com/java-rejectedexecutionhandler) - [Guide to Work Stealing in Java](https://www.baeldung.com/java-work-stealing) - [Asynchronous Programming in Java](https://www.baeldung.com/java-asynchronous-programming) +- [Java Thread Deadlock and Livelock](https://www.baeldung.com/java-deadlock-livelock) - [[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2) From 76d15b81c505e8f82db8f70d786ee09c253622d6 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:25:53 +0800 Subject: [PATCH 372/530] Update README.md --- java-numbers-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers-3/README.md b/java-numbers-3/README.md index 598acfb927..f818bdb675 100644 --- a/java-numbers-3/README.md +++ b/java-numbers-3/README.md @@ -10,4 +10,5 @@ This module contains articles about numbers in Java. - [Generating Random Numbers in a Range in Java](https://www.baeldung.com/java-generating-random-numbers-in-range) - [Listing Numbers Within a Range in Java](https://www.baeldung.com/java-listing-numbers-within-a-range) - [Fibonacci Series in Java](https://www.baeldung.com/java-fibonacci) +- [Guide to the Number Class in Java](https://www.baeldung.com/java-number-class) - More articles: [[<-- prev]](/java-numbers-2) From cb016c1027f8ec8b9bcea4c87f88fd2a5a622fa0 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:28:18 +0800 Subject: [PATCH 373/530] Update README.md --- core-java-modules/core-java-security-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md index 2eb21fb77e..24a821bd4d 100644 --- a/core-java-modules/core-java-security-2/README.md +++ b/core-java-modules/core-java-security-2/README.md @@ -8,4 +8,5 @@ This module contains articles about core Java Security - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) +- [Checksums in Java](https://www.baeldung.com/java-checksums) - More articles: [[<-- prev]](/core-java-modules/core-java-security) From 618916b6ab8753bf6d419031d21e9e1db934e8f1 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:31:17 +0800 Subject: [PATCH 374/530] Update README.md --- guava-collections-map/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guava-collections-map/README.md b/guava-collections-map/README.md index b3ec5e2157..4f8743dcfb 100644 --- a/guava-collections-map/README.md +++ b/guava-collections-map/README.md @@ -9,4 +9,5 @@ This module contains articles about map collections in Guava - [Guide to Guava Multimap](https://www.baeldung.com/guava-multimap) - [Guide to Guava RangeMap](https://www.baeldung.com/guava-rangemap) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) -- [Guide to Guava ClassToInstanceMap](https://www.baeldung.com/guava-class-to-instance-map) \ No newline at end of file +- [Guide to Guava ClassToInstanceMap](https://www.baeldung.com/guava-class-to-instance-map) +- [Using Guava’s MapMaker](https://www.baeldung.com/guava-mapmaker) From 2b27994c13acca8ad0af453eb05c6e82749e6543 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:35:28 +0800 Subject: [PATCH 375/530] Update README.md --- spring-batch/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-batch/README.md b/spring-batch/README.md index d637de269c..3a89459629 100644 --- a/spring-batch/README.md +++ b/spring-batch/README.md @@ -3,6 +3,7 @@ This module contains articles about Spring Batch ### Relevant Articles: + - [Introduction to Spring Batch](https://www.baeldung.com/introduction-to-spring-batch) - [Spring Batch using Partitioner](https://www.baeldung.com/spring-batch-partitioner) - [Spring Batch – Tasklets vs Chunks](https://www.baeldung.com/spring-batch-tasklet-chunk) @@ -10,3 +11,4 @@ This module contains articles about Spring Batch - [Configuring Skip Logic in Spring Batch](https://www.baeldung.com/spring-batch-skip-logic) - [Testing a Spring Batch Job](https://www.baeldung.com/spring-batch-testing-job) - [Configuring Retry Logic in Spring Batch](https://www.baeldung.com/spring-batch-retry-logic) +- [Conditional Flow in Spring Batch](https://www.baeldung.com/spring-batch-conditional-flow) From 44f3912f83a0aa0f7aa4dcdec5a0496d020e7bfa Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:38:35 +0800 Subject: [PATCH 376/530] Update README.md --- core-kotlin-modules/core-kotlin-collections/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-kotlin-modules/core-kotlin-collections/README.md b/core-kotlin-modules/core-kotlin-collections/README.md index bbea5869af..f0da2b4cfd 100644 --- a/core-kotlin-modules/core-kotlin-collections/README.md +++ b/core-kotlin-modules/core-kotlin-collections/README.md @@ -8,3 +8,4 @@ This module contains articles about core Kotlin collections. - [Overview of Kotlin Collections API](https://www.baeldung.com/kotlin-collections-api) - [Converting a List to Map in Kotlin](https://www.baeldung.com/kotlin-list-to-map) - [Filtering Kotlin Collections](https://www.baeldung.com/kotlin-filter-collection) +- [Collection Transformations in Kotlin](https://www.baeldung.com/kotlin-collection-transformations) From fba81f5e629ca568d197622b6d32dbe1c653de15 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:40:10 +0800 Subject: [PATCH 377/530] Update README.md --- guava/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guava/README.md b/guava/README.md index c67a3604ea..71f76c1360 100644 --- a/guava/README.md +++ b/guava/README.md @@ -12,4 +12,4 @@ This module contains articles a Google Guava - [Guide to Mathematical Utilities in Guava](https://www.baeldung.com/guava-math) - [Bloom Filter in Java using Guava](https://www.baeldung.com/guava-bloom-filter) - [Quick Guide to the Guava RateLimiter](https://www.baeldung.com/guava-rate-limiter) - +- [Introduction to Guava Throwables](https://www.baeldung.com/guava-throwables) From a70207b99317ff43992f9704b1832de960132d79 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:42:37 +0800 Subject: [PATCH 378/530] Update README.md --- core-java-modules/core-java-14/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-14/README.md b/core-java-modules/core-java-14/README.md index 0e8278c4f6..13bb468b30 100644 --- a/core-java-modules/core-java-14/README.md +++ b/core-java-modules/core-java-14/README.md @@ -7,3 +7,4 @@ This module contains articles about Java 14. - [Guide to the @Serial Annotation in Java 14](https://www.baeldung.com/java-14-serial-annotation) - [Java Text Blocks](https://www.baeldung.com/java-text-blocks) - [Pattern Matching for instanceof in Java 14](https://www.baeldung.com/java-pattern-matching-instanceof) +- [Helpful NullPointerExceptions in Java 14](https://www.baeldung.com/java-14-nullpointerexception) From 28401da21a1410bd54c2c4be125d68ffc529f933 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:44:41 +0800 Subject: [PATCH 379/530] Create README.md --- libraries-concurrency/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 libraries-concurrency/README.md diff --git a/libraries-concurrency/README.md b/libraries-concurrency/README.md new file mode 100644 index 0000000000..d1ffe81fa8 --- /dev/null +++ b/libraries-concurrency/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Intro to Coroutines with Quasar](https://www.baeldung.com/java-quasar-coroutines) From a1b1870921120ac90c7b68fa3a19004f564b801a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:46:53 +0800 Subject: [PATCH 380/530] Update README.md --- core-java-modules/core-java-streams-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md index a739245399..05c4b99900 100644 --- a/core-java-modules/core-java-streams-3/README.md +++ b/core-java-modules/core-java-streams-3/README.md @@ -9,4 +9,5 @@ This module contains articles about the Stream API in Java. - [Guide to Java 8’s Collectors](https://www.baeldung.com/java-8-collectors) - [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams) - [Debugging Java 8 Streams with IntelliJ](https://www.baeldung.com/intellij-debugging-java-streams) +- [Add BigDecimals using the Stream API](https://www.baeldung.com/java-stream-add-bigdecimals) - More articles: [[<-- prev>]](/../core-java-streams-2) From 8e1787ffeacc858d72180a8d0919650feb796e2e Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:48:28 +0800 Subject: [PATCH 381/530] Update README.md --- spring-5-mvc/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-5-mvc/README.md b/spring-5-mvc/README.md index e98012c047..aff8bb227c 100644 --- a/spring-5-mvc/README.md +++ b/spring-5-mvc/README.md @@ -6,3 +6,4 @@ This module contains articles about Spring 5 model-view-controller (MVC) pattern - [Spring Boot and Kotlin](https://www.baeldung.com/spring-boot-kotlin) - [Spring MVC Streaming and SSE Request Processing](https://www.baeldung.com/spring-mvc-sse-streams) - [Interface Driven Controllers in Spring](https://www.baeldung.com/spring-interface-driven-controllers) +- [Returning Plain HTML From a Spring MVC Controller](https://www.baeldung.com/spring-mvc-return-html) From 08472ff2e9e2dc28f7d7975a9d01a81d2e330742 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:50:04 +0800 Subject: [PATCH 382/530] Update README.md --- spring-thymeleaf-3/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-thymeleaf-3/README.md b/spring-thymeleaf-3/README.md index e1ddd727d7..a8e234b067 100644 --- a/spring-thymeleaf-3/README.md +++ b/spring-thymeleaf-3/README.md @@ -2,4 +2,5 @@ This module contains articles about Spring with Thymeleaf -## Relevant Articles: \ No newline at end of file +## Relevant Articles: +- [Add CSS and JS to Thymeleaf](https://www.baeldung.com/spring-thymeleaf-css-js) From fd1b953c2760173a9679638862a3ad79216a7e50 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 10 Apr 2020 16:51:50 +0800 Subject: [PATCH 383/530] Update README.md --- spring-core-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-core-3/README.md b/spring-core-3/README.md index b2c4f694a8..6c210b23ef 100644 --- a/spring-core-3/README.md +++ b/spring-core-3/README.md @@ -10,4 +10,5 @@ This module contains articles about core Spring functionality - [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections) - [Design Patterns in the Spring Framework](https://www.baeldung.com/spring-framework-design-patterns) - [Injecting a Value in a Static Field in Spring](https://www.baeldung.com/spring-inject-static-field) +- [Difference Between BeanFactory and ApplicationContext](https://www.baeldung.com/spring-beanfactory-vs-applicationcontext) - More articles: [[<-- prev]](/spring-core-2) From 76cdbd811ebe8ad93758b22807b8ff4b331a50c5 Mon Sep 17 00:00:00 2001 From: patkorek Date: Fri, 10 Apr 2020 12:49:52 +0200 Subject: [PATCH 384/530] Modified one method --- .../com/baeldung/strings/ConvertStringToInt.groovy | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy index 3b179ee193..3b73c31596 100644 --- a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy +++ b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy @@ -62,10 +62,17 @@ class ConvertStringToInt { def stringNum = "123" int expectedInt = 123 int intNum = new Integer(stringNum).intValue() - int secondIntNum = new Integer(stringNum) assertEquals(intNum, expectedInt) - assertEquals(secondIntNum, expectedInt) + } + + @Test + void givenString_whenUsingNewInteger_thenConvertToInteger() { + def stringNum = "123" + int expectedInt = 123 + int intNum = new Integer(stringNum) + + assertEquals(intNum, expectedInt) } @Test From 949881921e6513972cc7143517c94b85b81f5644 Mon Sep 17 00:00:00 2001 From: patkorek Date: Fri, 10 Apr 2020 13:27:27 +0200 Subject: [PATCH 385/530] Added test case with isInteger() method. --- .../com/baeldung/strings/ConvertStringToInt.groovy | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy index 3b73c31596..7a4be4a957 100644 --- a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy +++ b/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy @@ -96,4 +96,15 @@ class ConvertStringToInt { def invalidString = null invalidString.toInteger() } + + @Test + void givenString_whenUsingIsInteger_thenCheckIfCorrectValue() { + def invalidString = "123a" + def validString = "123" + def invalidNum = invalidString?.isInteger() ? invalidString as Integer : false + def correctNum = validString?.isInteger() ? validString as Integer : false + + assertEquals(false, invalidNum) + assertEquals(123, correctNum) + } } From 5a1f7ffea8d617a80d38234bb0f097de49747aed Mon Sep 17 00:00:00 2001 From: gindex Date: Fri, 10 Apr 2020 13:36:51 +0200 Subject: [PATCH 386/530] Add blockingHelloWorld() --- .../java/com/baeldung/mono/MonoUnitTest.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java index b493cd1159..f9e67b0a2f 100644 --- a/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java +++ b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java @@ -12,13 +12,13 @@ import static org.junit.Assert.assertEquals; public class MonoUnitTest { @Test public void whenMonoProducesString_thenBlockAndConsume() { - String expected = "hello world!"; - String result1 = Mono.just(expected).block(); - assertEquals(expected, result1); + String result1 = blockingHelloWorld().block(); + assertEquals("Hello world!", result1); - String result2 = Mono.just(expected).block(Duration.of(1000, ChronoUnit.MILLIS)); - assertEquals(expected, result2); + String result2 = blockingHelloWorld() + .block(Duration.of(1000, ChronoUnit.MILLIS)); + assertEquals("Hello world!", result2); Optional result3 = Mono.empty().blockOptional(); assertEquals(Optional.empty(), result3); @@ -26,14 +26,18 @@ public class MonoUnitTest { @Test public void whenMonoProducesString_thenConsumeNonBlocking() { - String expected = "hello world!"; - Mono.just(expected) - .doOnNext(result -> assertEquals(expected, result)) + blockingHelloWorld() + .doOnNext(result -> assertEquals("Hello world!", result)) .subscribe(); - Mono.just(expected) - .subscribe(result -> assertEquals(expected, result)); + blockingHelloWorld() + .subscribe(result -> assertEquals("Hello world!", result)); } + + private Mono blockingHelloWorld() { + // blocking + return Mono.just("Hello world!"); + } } From c1b13d09314f92424cddca0c00171fc4ad87e139 Mon Sep 17 00:00:00 2001 From: Kirill Vlasov Date: Fri, 10 Apr 2020 20:21:01 +0500 Subject: [PATCH 387/530] BAEL-3969 Spring Security - Custom Logout Handler --- .../LogoutDemoApplication.java | 13 +++ .../customlogouthandler/MvcConfiguration.java | 51 +++++++++ .../services/UserCache.java | 33 ++++++ .../customlogouthandler/user/User.java | 61 ++++++++++ .../customlogouthandler/user/UserUtils.java | 13 +++ .../web/CustomLogoutHandler.java | 27 +++++ .../web/UserController.java | 30 +++++ ...application-customlogouthandler.properties | 5 + .../CustomLogoutHandlerIntegrationTest.java | 106 ++++++++++++++++++ .../resources/customlogouthandler/after.sql | 1 + .../application.properties | 5 + .../resources/customlogouthandler/before.sql | 1 + 12 files changed, 346 insertions(+) create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/LogoutDemoApplication.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/User.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-customlogouthandler.properties create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/after.sql create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties create mode 100644 spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/before.sql diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/LogoutDemoApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/LogoutDemoApplication.java new file mode 100644 index 0000000000..027334dd6b --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/LogoutDemoApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.customlogouthandler; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LogoutDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(LogoutDemoApplication.class, args); + } + +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java new file mode 100644 index 0000000000..36de049a31 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java @@ -0,0 +1,51 @@ +package com.baeldung.customlogouthandler; + +import com.baeldung.customlogouthandler.web.CustomLogoutHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler; + +import javax.sql.DataSource; + +@Configuration +@EnableWebSecurity +public class MvcConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private DataSource dataSource; + + @Autowired + private CustomLogoutHandler logoutHandler; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .httpBasic().and() + .authorizeRequests() + .antMatchers(HttpMethod.GET, "/user/**").hasRole("USER") + .and() + .logout() + .logoutUrl("/user/logout") + .addLogoutHandler(logoutHandler) + .logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK))) + .permitAll() + .and() + .csrf().disable() + .formLogin().disable(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.jdbcAuthentication() + .dataSource(dataSource) + .usersByUsernameQuery("select login, password, true from users where login=?") + .authoritiesByUsernameQuery("select login, role from users where login=?"); + } + +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java new file mode 100644 index 0000000000..56c4d1e7c9 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java @@ -0,0 +1,33 @@ +package com.baeldung.customlogouthandler.services; + +import com.baeldung.customlogouthandler.user.User; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +@Service +public class UserCache { + + @PersistenceContext + private EntityManager entityManager; + + private final ConcurrentMap store = new ConcurrentHashMap<>(256); + + public User getByLogin(String login) { + return store.computeIfAbsent(login, k -> entityManager.createQuery("from User where login=:login", User.class) + .setParameter("login", k) + .getSingleResult()); + } + + public void evictUser(String login) { + store.remove(login); + } + + public int size() { + return this.store.size(); + } + +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/User.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/User.java new file mode 100644 index 0000000000..ca3a998c5c --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/User.java @@ -0,0 +1,61 @@ +package com.baeldung.customlogouthandler.user; + +import javax.persistence.*; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(unique = true) + private String login; + + private String password; + + private String role; + + private String language; + + public Integer getId() { + return id; + } + + public void setId(Integer 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; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java new file mode 100644 index 0000000000..195497f7ba --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java @@ -0,0 +1,13 @@ +package com.baeldung.customlogouthandler.user; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +public class UserUtils { + + public static String getAuthenticatedUserLogin() { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + return auth != null ? ((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername() : null; + } + +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java new file mode 100644 index 0000000000..2a335cd122 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java @@ -0,0 +1,27 @@ +package com.baeldung.customlogouthandler.web; + +import com.baeldung.customlogouthandler.services.UserCache; +import com.baeldung.customlogouthandler.user.UserUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutHandler; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Service +public class CustomLogoutHandler implements LogoutHandler { + + private final UserCache userCache; + + public CustomLogoutHandler(UserCache userCache) { + this.userCache = userCache; + } + + @Override + public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + String login = UserUtils.getAuthenticatedUserLogin(); + userCache.evictUser(login); + } + +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java new file mode 100644 index 0000000000..18cd8dda98 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java @@ -0,0 +1,30 @@ +package com.baeldung.customlogouthandler.web; + +import com.baeldung.customlogouthandler.services.UserCache; +import com.baeldung.customlogouthandler.user.User; +import com.baeldung.customlogouthandler.user.UserUtils; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Controller +@RequestMapping(path = "/user") +public class UserController { + + private final UserCache userCache; + + public UserController(UserCache userCache) { + this.userCache = userCache; + } + + @GetMapping(path = "/language") + @ResponseBody + public String getLanguage() { + String login = UserUtils.getAuthenticatedUserLogin(); + User user = userCache.getByLogin(login); + return user.getLanguage(); + } + +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-customlogouthandler.properties b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-customlogouthandler.properties new file mode 100644 index 0000000000..2cb766378d --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-customlogouthandler.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/test +spring.datasource.username=test +spring.datasource.password=test + +spring.jpa.hibernate.ddl-auto=create \ No newline at end of file diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java new file mode 100644 index 0000000000..3c325a2006 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java @@ -0,0 +1,106 @@ +package com.baeldung.customlogouthandler; + +import com.baeldung.customlogouthandler.services.UserCache; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlGroup; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = {LogoutDemoApplication.class, MvcConfiguration.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SqlGroup({ + @Sql(value = "classpath:customlogouthandler/before.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD), + @Sql(value = "classpath:customlogouthandler/after.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) +}) +class CustomLogoutHandlerIntegrationTest { + + @Autowired + private TestRestTemplate restTemplate; + + @Autowired + private UserCache userCache; + + @LocalServerPort + private int port; + + @Test + public void whenLogin_thenUseUserCache() throws Exception { + // User cache should be empty on start + assertThat(userCache.size()).isEqualTo(0); + + // Request using first login + ResponseEntity response = restTemplate + .withBasicAuth("user", "pass") + .getForEntity(getLanguageUrl(), String.class); + + assertThat(response.getBody()).contains("english"); + + // User cache must contain the user + assertThat(userCache.size()).isEqualTo(1); + + // Getting the session cookie + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.add("Cookie", response.getHeaders().getFirst(HttpHeaders.SET_COOKIE)); + + // Request with the session cookie + response = restTemplate + .exchange(getLanguageUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getBody()).contains("english"); + + // Logging out using the session cookies + response = restTemplate.exchange(getLogoutUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getStatusCode().value()).isEqualTo(200); + } + + @Test + public void whenLogout_thenCacheIsEmpty() throws Exception { + // User cache should be empty on start + assertThat(userCache.size()).isEqualTo(0); + + // Request using first login + ResponseEntity response = restTemplate + .withBasicAuth("user", "pass") + .getForEntity(getLanguageUrl(), String.class); + + assertThat(response.getBody()).contains("english"); + + // User cache must contain the user + assertThat(userCache.size()).isEqualTo(1); + + // Getting the session cookie + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.add("Cookie", response.getHeaders().getFirst(HttpHeaders.SET_COOKIE)); + + // Logging out using the session cookies + response = restTemplate.exchange(getLogoutUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getStatusCode().value()).isEqualTo(200); + + // User cache must be empty now + // this is the reaction on custom logout filter execution + assertThat(userCache.size()).isEqualTo(0); + + // Assert unathorized request + response = restTemplate.exchange(getLanguageUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getStatusCode().value()).isEqualTo(401); + } + + private String getLanguageUrl() { + return "http://localhost:" + port + "/user/language"; + } + + private String getLogoutUrl() { + return "http://localhost:" + port + "/user/logout"; + } + +} diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/after.sql b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/after.sql new file mode 100644 index 0000000000..df6f312987 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/after.sql @@ -0,0 +1 @@ +delete from users; \ No newline at end of file diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties new file mode 100644 index 0000000000..8b6d47ebe9 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/develop +spring.datasource.username=develop +spring.datasource.password=develop + +spring.jpa.hibernate.ddl-auto=create diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/before.sql b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/before.sql new file mode 100644 index 0000000000..bb0a85f613 --- /dev/null +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/before.sql @@ -0,0 +1 @@ +insert into users (login, password, role, language) values ('user', '{noop}pass', 'ROLE_USER', 'english'); \ No newline at end of file From 82e69447a54a650c59953fed9b0fab312fe552e6 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Fri, 10 Apr 2020 21:58:48 +0200 Subject: [PATCH 388/530] BAEL-3730: Add example of usage CacheManagerCustomizer in Spring Boot (#9048) --- spring-caching/pom.xml | 4 ++++ .../caching/boot/CacheApplication.java | 14 +++++++++++ .../caching/boot/SimpleCacheCustomizer.java | 24 +++++++++++++++++++ .../SimpleCacheCustomizerIntegrationTest.java | 24 +++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java create mode 100644 spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java create mode 100644 spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java diff --git a/spring-caching/pom.xml b/spring-caching/pom.xml index c3ededbd14..d33f24de1f 100644 --- a/spring-caching/pom.xml +++ b/spring-caching/pom.xml @@ -19,6 +19,10 @@ org.springframework spring-context + + org.springframework.boot + spring-boot-starter-cache + org.springframework spring-web diff --git a/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java b/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java new file mode 100644 index 0000000000..714dc443e0 --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.caching.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@SpringBootApplication +@EnableCaching +public class CacheApplication { + + public static void main(String[] args) { + SpringApplication.run(CacheApplication.class, args); + } +} diff --git a/spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java b/spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java new file mode 100644 index 0000000000..a76a01caae --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java @@ -0,0 +1,24 @@ +package com.baeldung.caching.boot; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer; +import org.springframework.cache.concurrent.ConcurrentMapCacheManager; +import org.springframework.stereotype.Component; + +import static java.util.Arrays.asList; + +@Component +public class SimpleCacheCustomizer implements CacheManagerCustomizer { + + private static final Logger LOGGER = LoggerFactory.getLogger(SimpleCacheCustomizer.class); + + static final String USERS_CACHE = "users"; + static final String TRANSACTIONS_CACHE = "transactions"; + + @Override + public void customize(ConcurrentMapCacheManager cacheManager) { + LOGGER.info("Customizing Cache Manager"); + cacheManager.setCacheNames(asList(USERS_CACHE, TRANSACTIONS_CACHE)); + } +} diff --git a/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java b/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java new file mode 100644 index 0000000000..56a4bd4745 --- /dev/null +++ b/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java @@ -0,0 +1,24 @@ +package com.baeldung.caching.boot; + +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.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SimpleCacheCustomizerIntegrationTest { + + @Autowired + private CacheManager cacheManager; + + @Test + public void givenCacheManagerCustomizerWhenBootstrappedThenCacheManagerCustomized() { + assertThat(cacheManager.getCacheNames()) + .containsOnly(SimpleCacheCustomizer.USERS_CACHE, SimpleCacheCustomizer.TRANSACTIONS_CACHE); + } +} \ No newline at end of file From a6e5f78a488bbad61cf592185e9b1981cdd3140d Mon Sep 17 00:00:00 2001 From: mikr Date: Fri, 10 Apr 2020 23:59:34 +0200 Subject: [PATCH 389/530] JAVA-1225 Add dependency to Hibernate Code --- spring-boot-modules/spring-boot-springdoc/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml index c99a9c2b24..375cf06c2c 100644 --- a/spring-boot-modules/spring-boot-springdoc/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc/pom.xml @@ -37,6 +37,12 @@ test + + org.hibernate + hibernate-core + ${hibernate.version} + + org.springdoc @@ -61,6 +67,7 @@ 1.8 + 5.2.10.Final 1.2.32 From f154a172398ed6d3b8aa5cda91ad5d3cad08cde6 Mon Sep 17 00:00:00 2001 From: "ramprasad.devarakonda@gmail.com" Date: Tue, 24 Mar 2020 00:55:23 +0000 Subject: [PATCH 390/530] BAEL-3769 | Writing templates for test cases using JUnit 5 --- testing-modules/junit5-annotations/pom.xml | 9 +- .../junit5/templates/UserIdGenerator.java | 5 ++ .../junit5/templates/UserIdGeneratorImpl.java | 15 ++++ .../DisabledOnQAEnvironmentExtension.java | 27 ++++++ .../GenericTypedParameterResolver.java | 26 ++++++ .../UserIdGeneratorImplUnitTest.java | 18 ++++ .../templates/UserIdGeneratorTestCase.java | 37 ++++++++ ...eneratorTestInvocationContextProvider.java | 87 +++++++++++++++++++ .../src/test/resources/application.properties | 1 + 9 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGenerator.java create mode 100644 testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGeneratorImpl.java create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/DisabledOnQAEnvironmentExtension.java create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/GenericTypedParameterResolver.java create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorImplUnitTest.java create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestCase.java create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestInvocationContextProvider.java create mode 100644 testing-modules/junit5-annotations/src/test/resources/application.properties diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml index d0fba4d21b..9e51d0ab55 100644 --- a/testing-modules/junit5-annotations/pom.xml +++ b/testing-modules/junit5-annotations/pom.xml @@ -46,12 +46,19 @@ ${junit.platform.version} test + + org.assertj + assertj-core + ${assertj-core.version} + test + - 5.6.0 + 5.6.2 1.6.0 2.8.2 + 3.11.1 diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGenerator.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGenerator.java new file mode 100644 index 0000000000..f19adb13c8 --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGenerator.java @@ -0,0 +1,5 @@ +package com.baeldung.junit5.templates; + +public interface UserIdGenerator { + String generate(String firstName, String lastName); +} diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGeneratorImpl.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGeneratorImpl.java new file mode 100644 index 0000000000..b39b07bc4b --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/templates/UserIdGeneratorImpl.java @@ -0,0 +1,15 @@ +package com.baeldung.junit5.templates; + +public class UserIdGeneratorImpl implements UserIdGenerator { + private boolean isFeatureEnabled; + + public UserIdGeneratorImpl(boolean isFeatureEnabled) { + this.isFeatureEnabled = isFeatureEnabled; + } + + public String generate(String firstName, String lastName) { + String initialAndLastName = firstName.substring(0, 1) + .concat(lastName); + return isFeatureEnabled ? "bael".concat(initialAndLastName) : initialAndLastName; + } +} diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/DisabledOnQAEnvironmentExtension.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/DisabledOnQAEnvironmentExtension.java new file mode 100644 index 0000000000..cd8b7b677d --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/DisabledOnQAEnvironmentExtension.java @@ -0,0 +1,27 @@ +package com.baeldung.junit5.templates; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; + +import java.io.IOException; +import java.util.Properties; + +public class DisabledOnQAEnvironmentExtension implements ExecutionCondition { + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + Properties properties = new Properties(); + try { + properties.load(DisabledOnQAEnvironmentExtension.class.getClassLoader() + .getResourceAsStream("application.properties")); + if ("qa".equalsIgnoreCase(properties.getProperty("env"))) { + String reason = String.format("The test '%s' is disabled on QA environment", context.getDisplayName()); + System.out.println(reason); + return ConditionEvaluationResult.disabled(reason); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + return ConditionEvaluationResult.enabled("Test enabled"); + } +} \ No newline at end of file diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/GenericTypedParameterResolver.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/GenericTypedParameterResolver.java new file mode 100644 index 0000000000..76321be101 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/GenericTypedParameterResolver.java @@ -0,0 +1,26 @@ +package com.baeldung.junit5.templates; + +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; + +public class GenericTypedParameterResolver implements ParameterResolver { + T data; + + public GenericTypedParameterResolver(T data) { + this.data = data; + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return parameterContext.getParameter() + .getType() + .isInstance(data); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return data; + } +} diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorImplUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorImplUnitTest.java new file mode 100644 index 0000000000..a2306154a6 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorImplUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.junit5.templates; + +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; + +public class UserIdGeneratorImplUnitTest { + @TestTemplate + @ExtendWith(UserIdGeneratorTestInvocationContextProvider.class) + public void whenUserIdRequested_thenUserIdIsReturnedInCorrectFormat(UserIdGeneratorTestCase testCase) { + UserIdGenerator userIdGenerator = new UserIdGeneratorImpl(testCase.isFeatureEnabled()); + + String actualUserId = userIdGenerator.generate(testCase.getFirstName(), testCase.getLastName()); + + assertThat(actualUserId).isEqualTo(testCase.getExpectedUserId()); + } +} \ No newline at end of file diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestCase.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestCase.java new file mode 100644 index 0000000000..dd41dd5a27 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestCase.java @@ -0,0 +1,37 @@ +package com.baeldung.junit5.templates; + +public class UserIdGeneratorTestCase { + private String displayName; + private boolean isFeatureEnabled; + private String firstName; + private String lastName; + private String expectedUserId; + + public UserIdGeneratorTestCase(String displayName, boolean isFeatureEnabled, String firstName, String lastName, String expectedUserId) { + this.displayName = displayName; + this.isFeatureEnabled = isFeatureEnabled; + this.firstName = firstName; + this.lastName = lastName; + this.expectedUserId = expectedUserId; + } + + public String getDisplayName() { + return displayName; + } + + public boolean isFeatureEnabled() { + return isFeatureEnabled; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getExpectedUserId() { + return expectedUserId; + } +} diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestInvocationContextProvider.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestInvocationContextProvider.java new file mode 100644 index 0000000000..277ec03f05 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/templates/UserIdGeneratorTestInvocationContextProvider.java @@ -0,0 +1,87 @@ +package com.baeldung.junit5.templates; + +import org.junit.jupiter.api.extension.*; + +import java.util.List; +import java.util.stream.Stream; + +import static java.util.Arrays.asList; + +public class UserIdGeneratorTestInvocationContextProvider implements TestTemplateInvocationContextProvider { + + @Override + public boolean supportsTestTemplate(ExtensionContext extensionContext) { + return true; + } + + @Override + public Stream provideTestTemplateInvocationContexts(ExtensionContext extensionContext) { + boolean featureDisabled = false; + boolean featureEnabled = true; + return Stream.of( + featureDisabledContext( + new UserIdGeneratorTestCase( + "Given feature switch disabled When user name is John Smith Then generated userid is JSmith", + featureDisabled, "John", "Smith", "JSmith")), + featureEnabledContext( + new UserIdGeneratorTestCase( + "Given feature switch enabled When user name is John Smith Then generated userid is baelJSmith", + featureEnabled, "John", "Smith", "baelJSmith")) + ); + } + + private TestTemplateInvocationContext featureDisabledContext(UserIdGeneratorTestCase userIdGeneratorTestCase) { + return new TestTemplateInvocationContext() { + @Override + public String getDisplayName(int invocationIndex) { + return userIdGeneratorTestCase.getDisplayName(); + } + + @Override + public List getAdditionalExtensions() { + return asList( + new GenericTypedParameterResolver(userIdGeneratorTestCase), + new BeforeTestExecutionCallback() { + @Override + public void beforeTestExecution(ExtensionContext extensionContext) { + System.out.println("BeforeTestExecutionCallback:Disabled context"); + } + }, + new AfterTestExecutionCallback() { + @Override + public void afterTestExecution(ExtensionContext extensionContext) { + System.out.println("AfterTestExecutionCallback:Disabled context"); + } + }); + } + }; + } + + private TestTemplateInvocationContext featureEnabledContext(UserIdGeneratorTestCase userIdGeneratorTestCase) { + return new TestTemplateInvocationContext() { + @Override + public String getDisplayName(int invocationIndex) { + return userIdGeneratorTestCase.getDisplayName(); + } + + @Override + public List getAdditionalExtensions() { + return asList( + new GenericTypedParameterResolver(userIdGeneratorTestCase), + new DisabledOnQAEnvironmentExtension(), + new BeforeEachCallback() { + @Override + public void beforeEach(ExtensionContext extensionContext) { + System.out.println("BeforeEachCallback:Enabled context"); + } + }, + new AfterEachCallback() { + @Override + public void afterEach(ExtensionContext extensionContext) { + System.out.println("AfterEachCallback:Enabled context"); + } + }); + } + }; + } +} diff --git a/testing-modules/junit5-annotations/src/test/resources/application.properties b/testing-modules/junit5-annotations/src/test/resources/application.properties new file mode 100644 index 0000000000..bbfa14d866 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/resources/application.properties @@ -0,0 +1 @@ +env=qa \ No newline at end of file From 552c1d805b281c6c575b269892e58d9b13d84b5b Mon Sep 17 00:00:00 2001 From: patkorek Date: Sat, 11 Apr 2020 14:39:36 +0200 Subject: [PATCH 391/530] Moved to com.baeldung.stringtoint package. --- .../baeldung/{strings => stringtoint}/ConvertStringToInt.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-groovy/src/test/groovy/com/baeldung/{strings => stringtoint}/ConvertStringToInt.groovy (98%) diff --git a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy similarity index 98% rename from core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy rename to core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy index 7a4be4a957..48cf48fa8a 100644 --- a/core-groovy/src/test/groovy/com/baeldung/strings/ConvertStringToInt.groovy +++ b/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy @@ -1,4 +1,4 @@ -package com.baeldung.strings +package com.baeldung.stringtoint import org.junit.Test From 3bdfd8f72681b94c3ca21bea00bf039a387d89dd Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 11 Apr 2020 18:16:13 +0200 Subject: [PATCH 392/530] [JAVA-1265] Review build time * Migrate UserMapperUnitTest to UserMapperIntegrationTest as it uses Spring and takes a lot of time to execute --- jhipster-5/bookstore-monolith/pom.xml | 4 ++-- ...UserMapperUnitTest.java => UserMapperIntegrationTest.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/{UserMapperUnitTest.java => UserMapperIntegrationTest.java} (99%) diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-5/bookstore-monolith/pom.xml index 5eaf761921..233765e0f3 100644 --- a/jhipster-5/bookstore-monolith/pom.xml +++ b/jhipster-5/bookstore-monolith/pom.xml @@ -7,7 +7,7 @@ 0.0.1-SNAPSHOT war Bookstore - + jhipster-5 com.baeldung.jhipster @@ -982,7 +982,7 @@ com.github.eirslett - frontend-maven-plugin + frontend-maven-plugin ${frontend-maven-plugin.version} install-node-and-npm diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperUnitTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java similarity index 99% rename from jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperUnitTest.java rename to jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java index cd6a326c06..cd49135d63 100644 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperUnitTest.java +++ b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ @RunWith(SpringRunner.class) @SpringBootTest(classes = BookstoreApp.class) -public class UserMapperUnitTest { +public class UserMapperIntegrationTest { private static final String DEFAULT_LOGIN = "johndoe"; From bbae9153a8cb2fe1179736acb4fb38ede9e80e78 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 11 Apr 2020 22:39:52 +0530 Subject: [PATCH 393/530] Disabling JWS module --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8d4632fb3e..b3d949d495 100644 --- a/pom.xml +++ b/pom.xml @@ -803,7 +803,7 @@ jenkins/plugins jhipster - jws + libraries @@ -1296,7 +1296,7 @@ jenkins/plugins jhipster - jws + libraries From 5b88ab42df3e40721064ad4892b2ee62a9bf1bd4 Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sun, 12 Apr 2020 00:01:36 +0530 Subject: [PATCH 394/530] sync source code with article --- .../jackson/date/JacksonDateUnitTest.java | 20 ++++++- .../hibernate/audit/AuditorAwareImpl.java | 21 +++++++ .../baeldung/spring/PersistenceConfig.java | 2 +- .../spring-boot-annotations/pom.xml | 17 ++++++ .../ConditionalBeanConfiguration.java | 16 +++++ .../annotations/HealthCheckController.java | 16 +++++ .../annotations/HibernateCondition.java | 15 +++++ .../annotations/MySQLAutoconfiguration.java | 59 +++++++++++++++++++ .../WebApplicationSpecificConfiguration.java | 13 ++++ .../ConfigPropertiesDemoApplication.java | 2 +- .../com/baeldung/properties/Database.java | 33 +++++++++++ .../src/main/resources/application.properties | 6 +- .../DatabasePropertiesIntegrationTest.java | 30 ++++++++++ .../src/test/resources/application.properties | 6 +- .../web/config/MainWebAppInitializer.java | 32 ++++++++++ .../baeldung/spring/web/config/WebConfig.java | 8 +++ .../FooMappingExamplesController.java | 2 +- ...egrationTest.java => SpringRetryTest.java} | 2 +- .../web/config/MainWebAppInitializer.java | 16 +++++ .../web/controller/SecurityController.java | 2 +- 20 files changed, 310 insertions(+), 8 deletions(-) create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java create mode 100644 spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/ConditionalBeanConfiguration.java create mode 100644 spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HealthCheckController.java create mode 100644 spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HibernateCondition.java create mode 100644 spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/MySQLAutoconfiguration.java create mode 100644 spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/WebApplicationSpecificConfiguration.java create mode 100644 spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java create mode 100644 spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/spring/web/config/MainWebAppInitializer.java rename spring-scheduling/src/test/java/com/baeldung/springretry/{SpringRetryIntegrationTest.java => SpringRetryTest.java} (96%) create mode 100644 spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MainWebAppInitializer.java diff --git a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/date/JacksonDateUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/date/JacksonDateUnitTest.java index a264dd52f2..924ec1162f 100644 --- a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/date/JacksonDateUnitTest.java +++ b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/date/JacksonDateUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.jackson.date; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @@ -8,6 +9,8 @@ import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.Date; import java.util.TimeZone; @@ -30,7 +33,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; public class JacksonDateUnitTest { @Test - public void whenSerializingDateWithJackson_thenSerializedToNumber() throws JsonProcessingException, ParseException { + public void whenSerializingDateWithJackson_thenSerializedToTimestamp() throws JsonProcessingException, ParseException { final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm"); df.setTimeZone(TimeZone.getTimeZone("UTC")); @@ -61,6 +64,21 @@ public class JacksonDateUnitTest { final String result = mapper.writeValueAsString(event); assertThat(result, containsString("1970-01-01T02:30:00.000+00:00")); } + + @Test + public void whenDeserialisingZonedDateTimeWithDefaults_thenNotCorrect() + throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + ZonedDateTime now = ZonedDateTime.now(ZoneId.of("UTC")); + String converted = objectMapper.writeValueAsString(now); + + ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class); + System.out.println("serialized: " + now); + System.out.println("restored: " + restored); + assertThat(now, is(restored)); + } @Test public void whenSettingObjectMapperDateFormat_thenCorrect() throws JsonProcessingException, ParseException { diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java new file mode 100644 index 0000000000..d59497c2dc --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java @@ -0,0 +1,21 @@ +package com.baeldung.hibernate.audit; + +import java.util.Optional; + +import org.springframework.data.domain.AuditorAware; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +@Component("auditorProvider") +public class AuditorAwareImpl implements AuditorAware { + + @Override + public String getCurrentAuditor() { + return Optional.ofNullable(SecurityContextHolder.getContext()) + .map(e -> e.getAuthentication()) + .map(Authentication::getName) + .orElse(null); + } + +} diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java index b7cf0fadf2..195df6fb81 100644 --- a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java @@ -46,7 +46,7 @@ import com.google.common.base.Preconditions; @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager") -@EnableJpaAuditing +@EnableJpaAuditing(auditorAwareRef = "auditorProvider") @PropertySource({ "classpath:persistence-h2.properties" }) @ComponentScan({ "com.baeldung.persistence" }) public class PersistenceConfig { diff --git a/spring-boot-modules/spring-boot-annotations/pom.xml b/spring-boot-modules/spring-boot-annotations/pom.xml index 9ad63214ef..59de83b4e5 100644 --- a/spring-boot-modules/spring-boot-annotations/pom.xml +++ b/spring-boot-modules/spring-boot-annotations/pom.xml @@ -24,6 +24,22 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.zaxxer + HikariCP + + + + + + org.hibernate + hibernate-core + @@ -32,4 +48,5 @@ test + diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/ConditionalBeanConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/ConditionalBeanConfiguration.java new file mode 100644 index 0000000000..4719425663 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/ConditionalBeanConfiguration.java @@ -0,0 +1,16 @@ +package com.baeldung.annotations; + +import java.util.Properties; + +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ConditionalBeanConfiguration { + + @Conditional(HibernateCondition.class) + Properties additionalProperties() { + // application specific properties + return new Properties(); + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HealthCheckController.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HealthCheckController.java new file mode 100644 index 0000000000..e87ed6cb47 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HealthCheckController.java @@ -0,0 +1,16 @@ +package com.baeldung.annotations; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HealthCheckController { + + private static final String STATUS = "UP"; + + @GetMapping("/health") + public ResponseEntity healthCheck() { + return ResponseEntity.ok(STATUS); + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HibernateCondition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HibernateCondition.java new file mode 100644 index 0000000000..e2d77cc5d0 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/HibernateCondition.java @@ -0,0 +1,15 @@ +package com.baeldung.annotations; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class HibernateCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + // application specific condition check + return true; + } + +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/MySQLAutoconfiguration.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/MySQLAutoconfiguration.java new file mode 100644 index 0000000000..ba23267525 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/MySQLAutoconfiguration.java @@ -0,0 +1,59 @@ +package com.baeldung.annotations; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import javax.sql.DataSource; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.condition.ConditionalOnResource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; + +@Configuration +@ConditionalOnClass(DataSource.class) +public class MySQLAutoconfiguration { + + @Bean + @ConditionalOnBean(name = "dataSource") + LocalContainerEntityManagerFactoryBean entityManagerFactory() throws IOException { + final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + + final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + em.setJpaProperties(additionalProperties()); + return em; + } + + @Bean + @ConditionalOnProperty(name = "usemysql", havingValue = "local") + DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("org.hsqldb.jdbcDriver"); + dataSource.setUrl("jdbc:hsqldb:mem:testdb"); + dataSource.setUsername( "sa" ); + dataSource.setPassword( "" ); + return dataSource; + } + + @ConditionalOnResource(resources = "classpath:mysql.properties") + Properties additionalProperties() throws IOException { + final Properties additionalProperties = new Properties(); + + try (InputStream inputStream = new ClassPathResource("classpath:mysql.properties").getInputStream()) { + additionalProperties.load(inputStream); + } + + return additionalProperties; + } +} diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/WebApplicationSpecificConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/WebApplicationSpecificConfiguration.java new file mode 100644 index 0000000000..62f68bee29 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/WebApplicationSpecificConfiguration.java @@ -0,0 +1,13 @@ +package com.baeldung.annotations; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class WebApplicationSpecificConfiguration { + + @ConditionalOnWebApplication + HealthCheckController healthCheckController() { + return new HealthCheckController(); + } +} diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java index 41f26d51f7..e54f28837d 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java @@ -7,7 +7,7 @@ import org.springframework.context.annotation.ComponentScan; import com.baeldung.configurationproperties.ConfigProperties; @SpringBootApplication -@ComponentScan(basePackageClasses = { ConfigProperties.class, JsonProperties.class, CustomJsonProperties.class }) +@ComponentScan(basePackageClasses = { ConfigProperties.class, JsonProperties.class, CustomJsonProperties.class, Database.class }) public class ConfigPropertiesDemoApplication { public static void main(String[] args) { new SpringApplicationBuilder(ConfigPropertiesDemoApplication.class).initializers(new JsonPropertyContextInitializer()) diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java new file mode 100644 index 0000000000..6e798672e7 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/Database.java @@ -0,0 +1,33 @@ +package com.baeldung.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "database") +public class Database { + + private String url; + private String username; + private String password; + + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties index 2e06fad574..d4d1df7abc 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties @@ -1,4 +1,8 @@ management.endpoints.web.exposure.include=refresh spring.properties.refreshDelay=1000 spring.config.location=file:extra.properties -spring.main.allow-bean-definition-overriding=true \ No newline at end of file +spring.main.allow-bean-definition-overriding=true + +database.url=jdbc:postgresql:/localhost:5432/instance +database.username=foo +database.password=bar \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java new file mode 100644 index 0000000000..0b9bd797ae --- /dev/null +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.configurationproperties; + +import org.junit.Assert; +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.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.properties.ConfigPropertiesDemoApplication; +import com.baeldung.properties.Database; + + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConfigPropertiesDemoApplication.class) +@TestPropertySource("classpath:application.properties") +public class DatabasePropertiesIntegrationTest { + + @Autowired + private Database database; + + @Test + public void testDatabaseProperties() { + Assert.assertNotNull(database); + Assert.assertEquals("jdbc:postgresql:/localhost:5432/instance", database.getUrl()); + Assert.assertEquals("foo", database.getUsername()); + Assert.assertEquals("bar", database.getPassword()); + } +} diff --git a/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties index 2e06fad574..d4d1df7abc 100644 --- a/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties +++ b/spring-boot-modules/spring-boot-properties/src/test/resources/application.properties @@ -1,4 +1,8 @@ management.endpoints.web.exposure.include=refresh spring.properties.refreshDelay=1000 spring.config.location=file:extra.properties -spring.main.allow-bean-definition-overriding=true \ No newline at end of file +spring.main.allow-bean-definition-overriding=true + +database.url=jdbc:postgresql:/localhost:5432/instance +database.username=foo +database.password=bar \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/MainWebAppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/MainWebAppInitializer.java new file mode 100644 index 0000000000..3623217130 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/MainWebAppInitializer.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.web.config; + +import javax.servlet.MultipartConfigElement; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; + +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.support.GenericWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +public class MainWebAppInitializer implements WebApplicationInitializer { + + private String TMP_FOLDER = "/tmp"; + private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; + + @Override + public void onStartup(ServletContext sc) throws ServletException { + + ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet( + new GenericWebApplicationContext())); + + appServlet.setLoadOnStartup(1); + + MultipartConfigElement multipartConfigElement = new MultipartConfigElement(TMP_FOLDER, + MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); + + appServlet.setMultipartConfig(multipartConfigElement); + + } + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 96e300464b..768fda1c4a 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -12,6 +12,7 @@ import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; @@ -121,4 +122,11 @@ public class WebConfig implements WebMvcConfigurer { public ExcelPOIHelper excelPOIHelper() { return new ExcelPOIHelper(); } + + @Bean(name = "multipartResolver") + public CommonsMultipartResolver multipartResolver() { + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); + multipartResolver.setMaxUploadSize(100000); + return multipartResolver; + } } \ No newline at end of file diff --git a/spring-rest-http/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java b/spring-rest-http/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java index 543ba76273..cafd9a38e3 100644 --- a/spring-rest-http/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java +++ b/spring-rest-http/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java @@ -72,7 +72,7 @@ public class FooMappingExamplesController { @RequestMapping(value = "/foos", produces = { "application/json", "application/xml" }) @ResponseBody - public String getFoosAsJsonFromREST() { + public String getFoosAsJsonFromBrowser() { return "Get some Foos with Header New"; } diff --git a/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryIntegrationTest.java b/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryTest.java similarity index 96% rename from spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryIntegrationTest.java rename to spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryTest.java index 2e5fb75482..b22d5e620e 100644 --- a/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryIntegrationTest.java +++ b/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryTest.java @@ -12,7 +12,7 @@ import java.sql.SQLException; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) -public class SpringRetryIntegrationTest { +public class SpringRetryTest { @Autowired private MyService myService; diff --git a/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MainWebAppInitializer.java b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MainWebAppInitializer.java new file mode 100644 index 0000000000..f85f9f3fb0 --- /dev/null +++ b/spring-security-modules/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MainWebAppInitializer.java @@ -0,0 +1,16 @@ +package com.baeldung.session.web.config; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import org.springframework.web.WebApplicationInitializer; + +public class MainWebAppInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext sc) throws ServletException { + sc.getSessionCookieConfig().setHttpOnly(true); + sc.getSessionCookieConfig().setSecure(true); + } + +} diff --git a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController.java b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController.java index f35940f54c..ece442430f 100644 --- a/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController.java +++ b/spring-security-modules/spring-security-rest-custom/src/main/java/com/baeldung/web/controller/SecurityController.java @@ -18,7 +18,7 @@ public class SecurityController { @RequestMapping(value = "/username2", method = RequestMethod.GET) @ResponseBody - public String currentUserNameSimple(final Principal principal) { + public String currentUserName(final Principal principal) { return principal.getName(); } From 2478c10c84b0b3f72f9253fa0fb4f17c075a9607 Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sun, 12 Apr 2020 01:05:59 +0530 Subject: [PATCH 395/530] reverted the file name --- .../{SpringRetryTest.java => SpringRetryIntegrationTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-scheduling/src/test/java/com/baeldung/springretry/{SpringRetryTest.java => SpringRetryIntegrationTest.java} (96%) diff --git a/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryTest.java b/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryIntegrationTest.java similarity index 96% rename from spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryTest.java rename to spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryIntegrationTest.java index b22d5e620e..2e5fb75482 100644 --- a/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryTest.java +++ b/spring-scheduling/src/test/java/com/baeldung/springretry/SpringRetryIntegrationTest.java @@ -12,7 +12,7 @@ import java.sql.SQLException; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) -public class SpringRetryTest { +public class SpringRetryIntegrationTest { @Autowired private MyService myService; From b43d6e9bc8d2bf09f9588a250d61670b31e19936 Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sun, 12 Apr 2020 01:23:02 +0530 Subject: [PATCH 396/530] fix junit test case --- .../java/com/baeldung/hibernate/audit/AuditorAwareImpl.java | 2 -- .../main/java/com/baeldung/spring/PersistenceConfig.java | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java index d59497c2dc..7aef08b2ce 100644 --- a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/audit/AuditorAwareImpl.java @@ -5,9 +5,7 @@ import java.util.Optional; import org.springframework.data.domain.AuditorAware; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; -@Component("auditorProvider") public class AuditorAwareImpl implements AuditorAware { @Override diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java index 195df6fb81..6ae133ca7a 100644 --- a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java @@ -23,6 +23,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; +import com.baeldung.hibernate.audit.AuditorAwareImpl; import com.baeldung.persistence.dao.IBarAuditableDao; import com.baeldung.persistence.dao.IBarDao; import com.baeldung.persistence.dao.IFooAuditableDao; @@ -58,6 +59,11 @@ public class PersistenceConfig { super(); } + @Bean("auditorProvider") + public AuditorAwareImpl auditorAwareImpl() { + return new AuditorAwareImpl(); + } + @Bean public LocalSessionFactoryBean sessionFactory() { final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); From 7facbd6bf6458eba0dea40234f036077d48d799e Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sun, 12 Apr 2020 04:31:53 +0530 Subject: [PATCH 397/530] update artifictId in pom file --- ddd-modules/pom.xml | 2 +- jgit/pom.xml | 4 ++-- persistence-modules/r2dbc/pom.xml | 2 +- persistence-modules/sirix/pom.xml | 2 +- quarkus-extension/quarkus-liquibase/deployment/pom.xml | 6 +++--- quarkus-extension/quarkus-liquibase/pom.xml | 4 ++-- quarkus-extension/quarkus-liquibase/runtime/pom.xml | 6 +++--- spring-cloud/spring-cloud-openfeign/pom.xml | 4 ++-- spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml | 4 ++-- twitter4j/pom.xml | 4 ++-- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/ddd-modules/pom.xml b/ddd-modules/pom.xml index 38e48ff27d..c6dd6e1f25 100644 --- a/ddd-modules/pom.xml +++ b/ddd-modules/pom.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.dddmodules - dddmodules + ddd-modules 1.0 ddd-modules pom diff --git a/jgit/pom.xml b/jgit/pom.xml index eef3c9b8e8..d960843868 100644 --- a/jgit/pom.xml +++ b/jgit/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - JGit + jgit 1.0-SNAPSHOT - JGit + jgit jar http://maven.apache.org diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml index 55197ad560..70ff8d6a87 100644 --- a/persistence-modules/r2dbc/pom.xml +++ b/persistence-modules/r2dbc/pom.xml @@ -6,7 +6,7 @@ com.baeldung.examples.r2dbc r2dbc-example 0.0.1-SNAPSHOT - r2dbc-example + r2dbc Sample R2DBC Project diff --git a/persistence-modules/sirix/pom.xml b/persistence-modules/sirix/pom.xml index d8e065ec2f..0f114966f7 100644 --- a/persistence-modules/sirix/pom.xml +++ b/persistence-modules/sirix/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 io.sirix - core-api-tutorial + sirix 1.0-SNAPSHOT core-api-tutorial jar diff --git a/quarkus-extension/quarkus-liquibase/deployment/pom.xml b/quarkus-extension/quarkus-liquibase/deployment/pom.xml index c85d986390..5c6b56e152 100644 --- a/quarkus-extension/quarkus-liquibase/deployment/pom.xml +++ b/quarkus-extension/quarkus-liquibase/deployment/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - quarkus-liquibase-deployment - quarkus-liquibase-deployment + deployment + deployment com.baeldung.quarkus.liquibase @@ -58,4 +58,4 @@ 3.8.1 - \ No newline at end of file + diff --git a/quarkus-extension/quarkus-liquibase/pom.xml b/quarkus-extension/quarkus-liquibase/pom.xml index 9536561701..8ed6555ed7 100644 --- a/quarkus-extension/quarkus-liquibase/pom.xml +++ b/quarkus-extension/quarkus-liquibase/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.baeldung.quarkus.liquibase quarkus-liquibase-parent - quarkus-liquibase-parent + quarkus-liquibase pom @@ -23,4 +23,4 @@ 1.0.0.Final - \ No newline at end of file + diff --git a/quarkus-extension/quarkus-liquibase/runtime/pom.xml b/quarkus-extension/quarkus-liquibase/runtime/pom.xml index 83f7c8d4cc..760e6ab719 100644 --- a/quarkus-extension/quarkus-liquibase/runtime/pom.xml +++ b/quarkus-extension/quarkus-liquibase/runtime/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - quarkus-liquibase-runtime - quarkus-liquibase-runtime + runtime + runtime com.baeldung.quarkus.liquibase @@ -70,4 +70,4 @@ 3.8.1 - \ No newline at end of file + diff --git a/spring-cloud/spring-cloud-openfeign/pom.xml b/spring-cloud/spring-cloud-openfeign/pom.xml index e20fe338c1..df529d7fb1 100644 --- a/spring-cloud/spring-cloud-openfeign/pom.xml +++ b/spring-cloud/spring-cloud-openfeign/pom.xml @@ -3,9 +3,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.cloud - openfeign + spring-cloud-openfeign 0.0.1-SNAPSHOT - openfeign + spring-cloud-openfeign OpenFeign project for Spring Boot diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml b/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml index 441924f1d3..93255959e4 100644 --- a/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - SpringCloudTaskSink - SpringCloudTaskSink + springcloudtasksink + springcloudtasksink jar Demo project for Spring Boot diff --git a/twitter4j/pom.xml b/twitter4j/pom.xml index 6d98e2fe58..274b5c75c3 100644 --- a/twitter4j/pom.xml +++ b/twitter4j/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - Twitter4J - Twitter4J + twitter4J + twitter4J jar From 4a83c738350acd32e9c6d2035dce0a91238be503 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Sun, 12 Apr 2020 10:06:34 +0530 Subject: [PATCH 398/530] Adding codebase for the article tracked under BAEL-2046. (#9055) --- atomikos/README.md | 7 ++ atomikos/pom.xml | 119 ++++++++++++++++++ .../baeldung/atomikos/direct/Application.java | 53 ++++++++ .../baeldung/atomikos/spring/Application.java | 41 ++++++ .../atomikos/spring/config/Config.java | 68 ++++++++++ .../atomikos/spring/jpa/Application.java | 48 +++++++ .../atomikos/spring/jpa/config/Config.java | 38 ++++++ .../spring/jpa/inventory/Inventory.java | 31 +++++ .../spring/jpa/inventory/InventoryConfig.java | 53 ++++++++ .../jpa/inventory/InventoryRepository.java | 9 ++ .../atomikos/spring/jpa/order/Order.java | 42 +++++++ .../spring/jpa/order/OrderConfig.java | 53 ++++++++ .../spring/jpa/order/OrderRepository.java | 9 ++ atomikos/src/main/resources/logback.xml | 13 ++ atomikos/src/main/resources/schema.sql | 10 ++ .../main/resources/transactions.properties | 1 + .../atomikos/direct/ApplicationUnitTest.java | 118 +++++++++++++++++ .../atomikos/spring/ApplicationUnitTest.java | 108 ++++++++++++++++ .../spring/jpa/ApplicationUnitTest.java | 80 ++++++++++++ atomikos/src/test/resources/logback.xml | 13 ++ .../test/resources/transactions.properties | 1 + pom.xml | 4 + 22 files changed, 919 insertions(+) create mode 100644 atomikos/README.md create mode 100644 atomikos/pom.xml create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java create mode 100644 atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java create mode 100644 atomikos/src/main/resources/logback.xml create mode 100644 atomikos/src/main/resources/schema.sql create mode 100644 atomikos/src/main/resources/transactions.properties create mode 100644 atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java create mode 100644 atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java create mode 100644 atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java create mode 100644 atomikos/src/test/resources/logback.xml create mode 100644 atomikos/src/test/resources/transactions.properties diff --git a/atomikos/README.md b/atomikos/README.md new file mode 100644 index 0000000000..19f2e871d4 --- /dev/null +++ b/atomikos/README.md @@ -0,0 +1,7 @@ +## Atomikos + +This module contains articles about Atomikos + +### Relevant Articles: + +- [Guide Transactions Using Atomikos]() diff --git a/atomikos/pom.xml b/atomikos/pom.xml new file mode 100644 index 0000000000..881adae074 --- /dev/null +++ b/atomikos/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + atomikos + atomikos + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + com.atomikos + transactions-jdbc + ${atomikos-version} + + + com.atomikos + transactions-jms + ${atomikos-version} + + + com.atomikos + transactions-hibernate4 + ${atomikos-version} + + + org.springframework + spring-context + ${spring-version} + + + org.springframework + spring-tx + ${spring-version} + + + org.springframework.data + spring-data-jpa + 1.11.23.RELEASE + + + org.springframework + spring-test + ${spring-version} + test + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + provided + + + javax.transaction + jta + + + + + org.apache.activemq + activemq-core + 5.7.0 + + + org.apache.derby + derby + 10.8.1.2 + + + junit + junit + 4.12 + test + + + + javax.transaction + jta + 1.1 + + + org.apache.geronimo.specs + geronimo-jta_1.0.1B_spec + 1.0 + + + javax.validation + validation-api + 2.0.1.Final + + + org.hibernate.validator + hibernate-validator + 6.1.2.Final + + + javax.el + javax.el-api + 3.0.0 + + + org.glassfish.web + javax.el + 2.2.4 + + + + + 5.0.6 + 5.1.6.RELEASE + 5.4.3.Final + + + \ No newline at end of file diff --git a/atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java b/atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java new file mode 100644 index 0000000000..c51ce70dde --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java @@ -0,0 +1,53 @@ +package com.baeldung.atomikos.direct; + +import java.sql.Connection; +import java.sql.Statement; +import java.util.UUID; + +import javax.sql.DataSource; + +import com.atomikos.icatch.jta.UserTransactionImp; + +public class Application { + + private DataSource inventoryDataSource; + private DataSource orderDataSource; + + public Application(DataSource inventoryDataSource, DataSource orderDataSource) { + this.inventoryDataSource = inventoryDataSource; + this.orderDataSource = orderDataSource; + } + + public void placeOrder(String productId, int amount) throws Exception { + + UserTransactionImp utx = new UserTransactionImp(); + String orderId = UUID.randomUUID() + .toString(); + boolean rollback = false; + try { + utx.begin(); + Connection inventoryConnection = inventoryDataSource.getConnection(); + Connection orderConnection = orderDataSource.getConnection(); + Statement s1 = inventoryConnection.createStatement(); + String q1 = "update Inventory set balance = balance - " + amount + " where productId ='" + productId + "'"; + s1.executeUpdate(q1); + s1.close(); + Statement s2 = orderConnection.createStatement(); + String q2 = "insert into Orders values ( '" + orderId + "', '" + productId + "', " + amount + " )"; + s2.executeUpdate(q2); + s2.close(); + inventoryConnection.close(); + orderConnection.close(); + } catch (Exception e) { + System.out.println(e.getMessage()); + rollback = true; + } finally { + if (!rollback) + utx.commit(); + else + utx.rollback(); + } + + } + +} diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java new file mode 100644 index 0000000000..b480e68d8d --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java @@ -0,0 +1,41 @@ +package com.baeldung.atomikos.spring; + +import java.sql.Connection; +import java.sql.Statement; +import java.util.UUID; + +import javax.sql.DataSource; + +import org.springframework.transaction.annotation.Transactional; + +public class Application { + + private DataSource inventoryDataSource; + private DataSource orderDataSource; + + public Application(DataSource inventoryDataSource, DataSource orderDataSource) { + this.inventoryDataSource = inventoryDataSource; + this.orderDataSource = orderDataSource; + } + + @Transactional(rollbackFor = Exception.class) + public void placeOrder(String productId, int amount) throws Exception { + + String orderId = UUID.randomUUID() + .toString(); + Connection inventoryConnection = inventoryDataSource.getConnection(); + Connection orderConnection = orderDataSource.getConnection(); + Statement s1 = inventoryConnection.createStatement(); + String q1 = "update Inventory set balance = balance - " + amount + " where productId ='" + productId + "'"; + s1.executeUpdate(q1); + s1.close(); + Statement s2 = orderConnection.createStatement(); + String q2 = "insert into Orders values ( '" + orderId + "', '" + productId + "', " + amount + " )"; + s2.executeUpdate(q2); + s2.close(); + inventoryConnection.close(); + orderConnection.close(); + + } + +} diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java new file mode 100644 index 0000000000..c6ef83c4ca --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java @@ -0,0 +1,68 @@ +package com.baeldung.atomikos.spring.config; + +import java.util.Properties; + +import javax.transaction.SystemException; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.jta.JtaTransactionManager; + +import com.atomikos.icatch.jta.UserTransactionManager; +import com.atomikos.jdbc.AtomikosDataSourceBean; +import com.baeldung.atomikos.spring.Application; + +@Configuration +@EnableTransactionManagement +public class Config { + + @Bean(initMethod = "init", destroyMethod = "close") + public AtomikosDataSourceBean inventoryDataSource() { + AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); + dataSource.setLocalTransactionMode(true); + dataSource.setUniqueResourceName("db1"); + dataSource.setXaDataSourceClassName("org.apache.derby.jdbc.EmbeddedXADataSource"); + Properties xaProperties = new Properties(); + xaProperties.put("databaseName", "db1"); + xaProperties.put("createDatabase", "create"); + dataSource.setXaProperties(xaProperties); + dataSource.setPoolSize(10); + return dataSource; + } + + @Bean(initMethod = "init", destroyMethod = "close") + public AtomikosDataSourceBean orderDataSource() { + AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); + dataSource.setLocalTransactionMode(true); + dataSource.setUniqueResourceName("db2"); + dataSource.setXaDataSourceClassName("org.apache.derby.jdbc.EmbeddedXADataSource"); + Properties xaProperties = new Properties(); + xaProperties.put("databaseName", "db2"); + xaProperties.put("createDatabase", "create"); + dataSource.setXaProperties(xaProperties); + dataSource.setPoolSize(10); + return dataSource; + } + + @Bean(initMethod = "init", destroyMethod = "close") + public UserTransactionManager userTransactionManager() throws SystemException { + UserTransactionManager userTransactionManager = new UserTransactionManager(); + userTransactionManager.setTransactionTimeout(300); + userTransactionManager.setForceShutdown(true); + return userTransactionManager; + } + + @Bean + public JtaTransactionManager jtaTransactionManager() throws SystemException { + JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(); + jtaTransactionManager.setTransactionManager(userTransactionManager()); + jtaTransactionManager.setUserTransaction(userTransactionManager()); + return jtaTransactionManager; + } + + @Bean + public Application application() { + return new Application(inventoryDataSource(), orderDataSource()); + } +} \ No newline at end of file diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java new file mode 100644 index 0000000000..cf1fef2cd8 --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java @@ -0,0 +1,48 @@ +package com.baeldung.atomikos.spring.jpa; + +import java.util.Set; +import java.util.UUID; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.atomikos.spring.jpa.inventory.Inventory; +import com.baeldung.atomikos.spring.jpa.inventory.InventoryRepository; +import com.baeldung.atomikos.spring.jpa.order.Order; +import com.baeldung.atomikos.spring.jpa.order.OrderRepository; + +public class Application { + + @Autowired + private InventoryRepository inventoryRepository; + + @Autowired + private OrderRepository orderRepository; + + @Transactional(rollbackFor = Exception.class) + public void placeOrder(String productId, int amount) throws Exception { + + String orderId = UUID.randomUUID() + .toString(); + Inventory inventory = inventoryRepository.findOne(productId); + inventory.setBalance(inventory.getBalance() - amount); + inventoryRepository.save(inventory); + Order order = new Order(); + order.setOrderId(orderId); + order.setProductId(productId); + order.setAmount(new Long(amount)); + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + Set> violations = validator.validate(order); + if (violations.size() > 0) + throw new Exception("Invalid instance of an order."); + orderRepository.save(order); + + } + +} diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java new file mode 100644 index 0000000000..6716f19576 --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java @@ -0,0 +1,38 @@ +package com.baeldung.atomikos.spring.jpa.config; + +import javax.transaction.SystemException; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.jta.JtaTransactionManager; + +import com.atomikos.icatch.jta.UserTransactionManager; +import com.baeldung.atomikos.spring.jpa.Application; + +@Configuration +@EnableTransactionManagement +public class Config { + + @Bean(initMethod = "init", destroyMethod = "close") + public UserTransactionManager userTransactionManager() throws SystemException { + UserTransactionManager userTransactionManager = new UserTransactionManager(); + userTransactionManager.setTransactionTimeout(300); + userTransactionManager.setForceShutdown(true); + return userTransactionManager; + } + + @Bean + public JtaTransactionManager transactionManager() throws SystemException { + JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(); + jtaTransactionManager.setTransactionManager(userTransactionManager()); + jtaTransactionManager.setUserTransaction(userTransactionManager()); + return jtaTransactionManager; + } + + @Bean + public Application application() { + return new Application(); + } + +} \ No newline at end of file diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java new file mode 100644 index 0000000000..999879218c --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java @@ -0,0 +1,31 @@ +package com.baeldung.atomikos.spring.jpa.inventory; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "INVENTORY") +public class Inventory { + + @Id + private String productId; + private Long balance; + + public String getProductId() { + return productId; + } + + public void setProductId(String productId) { + this.productId = productId; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + +} diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java new file mode 100644 index 0000000000..5301ad6ff2 --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java @@ -0,0 +1,53 @@ +package com.baeldung.atomikos.spring.jpa.inventory; + +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; + +import com.atomikos.jdbc.AtomikosDataSourceBean; + +@Configuration +@EnableJpaRepositories(basePackages = "com.baeldung.atomikos.spring.jpa.inventory", entityManagerFactoryRef = "inventoryEntityManager", transactionManagerRef = "transactionManager") +public class InventoryConfig { + + @Bean(initMethod = "init", destroyMethod = "close") + public AtomikosDataSourceBean inventoryDataSource() { + AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); + dataSource.setLocalTransactionMode(true); + dataSource.setUniqueResourceName("db1"); + dataSource.setXaDataSourceClassName("org.apache.derby.jdbc.EmbeddedXADataSource"); + Properties xaProperties = new Properties(); + xaProperties.put("databaseName", "db1"); + xaProperties.put("createDatabase", "create"); + dataSource.setXaProperties(xaProperties); + dataSource.setPoolSize(10); + return dataSource; + } + + @Bean + public EntityManagerFactory inventoryEntityManager() { + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); + factory.setJpaVendorAdapter(vendorAdapter); + factory.setPackagesToScan("com.baeldung.atomikos.spring.jpa.inventory"); + factory.setDataSource(inventoryDataSource()); + Properties jpaProperties = new Properties(); + //jpaProperties.put("hibernate.show_sql", "true"); + //jpaProperties.put("hibernate.format_sql", "true"); + jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.DerbyDialect"); + jpaProperties.put("hibernate.current_session_context_class", "jta"); + jpaProperties.put("javax.persistence.transactionType", "jta"); + jpaProperties.put("hibernate.transaction.manager_lookup_class", "com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"); + jpaProperties.put("hibernate.hbm2ddl.auto", "create-drop"); + factory.setJpaProperties(jpaProperties); + factory.afterPropertiesSet(); + return factory.getObject(); + } + +} \ No newline at end of file diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java new file mode 100644 index 0000000000..c3868e51bf --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.atomikos.spring.jpa.inventory; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface InventoryRepository extends JpaRepository { + +} diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java new file mode 100644 index 0000000000..4b9ae2dd1d --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java @@ -0,0 +1,42 @@ +package com.baeldung.atomikos.spring.jpa.order; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.Max; + +@Entity +@Table(name = "ORDERS") +public class Order { + + @Id + private String orderId; + private String productId; + @Max(5) + private Long amount; + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public String getProductId() { + return productId; + } + + public void setProductId(String productId) { + this.productId = productId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + +} diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java new file mode 100644 index 0000000000..b4274bb64c --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java @@ -0,0 +1,53 @@ +package com.baeldung.atomikos.spring.jpa.order; + +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; + +import com.atomikos.jdbc.AtomikosDataSourceBean; + +@Configuration +@EnableJpaRepositories(basePackages = "com.baeldung.atomikos.spring.jpa.order", entityManagerFactoryRef = "orderEntityManager", transactionManagerRef = "transactionManager") +public class OrderConfig { + + @Bean(initMethod = "init", destroyMethod = "close") + public AtomikosDataSourceBean orderDataSource() { + AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); + dataSource.setLocalTransactionMode(true); + dataSource.setUniqueResourceName("db2"); + dataSource.setXaDataSourceClassName("org.apache.derby.jdbc.EmbeddedXADataSource"); + Properties xaProperties = new Properties(); + xaProperties.put("databaseName", "db2"); + xaProperties.put("createDatabase", "create"); + dataSource.setXaProperties(xaProperties); + dataSource.setPoolSize(10); + return dataSource; + } + + @Bean + public EntityManagerFactory orderEntityManager() { + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); + factory.setJpaVendorAdapter(vendorAdapter); + factory.setPackagesToScan("com.baeldung.atomikos.spring.jpa.order"); + factory.setDataSource(orderDataSource()); + Properties jpaProperties = new Properties(); + //jpaProperties.put("hibernate.show_sql", "true"); + //jpaProperties.put("hibernate.format_sql", "true"); + jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.DerbyDialect"); + jpaProperties.put("hibernate.current_session_context_class", "jta"); + jpaProperties.put("javax.persistence.transactionType", "jta"); + jpaProperties.put("hibernate.transaction.manager_lookup_class", "com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"); + jpaProperties.put("hibernate.hbm2ddl.auto", "create-drop"); + factory.setJpaProperties(jpaProperties); + factory.afterPropertiesSet(); + return factory.getObject(); + } + +} \ No newline at end of file diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java new file mode 100644 index 0000000000..2d5610ebca --- /dev/null +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.atomikos.spring.jpa.order; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrderRepository extends JpaRepository { + +} diff --git a/atomikos/src/main/resources/logback.xml b/atomikos/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/atomikos/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/atomikos/src/main/resources/schema.sql b/atomikos/src/main/resources/schema.sql new file mode 100644 index 0000000000..5136ad1284 --- /dev/null +++ b/atomikos/src/main/resources/schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE INVENTORY ( + productId VARCHAR PRIMARY KEY, + balance INT +); + +CREATE TABLE ORDERS ( + orderId VARCHAR PRIMARY KEY, + productId VARCHAR, + amount INT NOT NULL CHECK (amount <= 5) +); \ No newline at end of file diff --git a/atomikos/src/main/resources/transactions.properties b/atomikos/src/main/resources/transactions.properties new file mode 100644 index 0000000000..8e027032fa --- /dev/null +++ b/atomikos/src/main/resources/transactions.properties @@ -0,0 +1 @@ +com.atomikos.icatch.file=logs \ No newline at end of file diff --git a/atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java b/atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java new file mode 100644 index 0000000000..1a467807ba --- /dev/null +++ b/atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java @@ -0,0 +1,118 @@ +package com.baeldung.atomikos.direct; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; +import java.util.UUID; + +import javax.sql.DataSource; + +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; + +import com.atomikos.icatch.jta.UserTransactionImp; +import com.atomikos.jdbc.AtomikosDataSourceBean; + +public class ApplicationUnitTest { + + private static DataSource inventoryDataSource; + private static DataSource orderDataSource; + + private static String productId = UUID.randomUUID() + .toString(); + + @Test + @Ignore + public void testPlaceOrderSuccess() throws Exception { + int amount = 1; + long initialBalance = getBalance(inventoryDataSource, productId); + Application application = new Application(inventoryDataSource, orderDataSource); + application.placeOrder(productId, amount); + long finalBalance = getBalance(inventoryDataSource, productId); + assertEquals(initialBalance - amount, finalBalance); + } + + @Test + @Ignore + public void testPlaceOrderFailure() throws Exception { + int amount = 10; + long initialBalance = getBalance(inventoryDataSource, productId); + Application application = new Application(inventoryDataSource, orderDataSource); + application.placeOrder(productId, amount); + long finalBalance = getBalance(inventoryDataSource, productId); + assertEquals(initialBalance, finalBalance); + } + + @BeforeClass + public static void setUp() throws SQLException { + + inventoryDataSource = getDataSource("db1"); + orderDataSource = getDataSource("db2"); + Connection inventoryConnection = inventoryDataSource.getConnection(); + Connection orderConnection = orderDataSource.getConnection(); + String createInventoryTable = "create table Inventory ( " + " productId VARCHAR ( 100 ) PRIMARY KEY, balance INT )"; + String createInventoryRow = "insert into Inventory values ( '" + productId + "', 10000 )"; + Statement s1 = inventoryConnection.createStatement(); + try { + s1.executeUpdate(createInventoryTable); + } catch (Exception e) { + System.out.println("Inventory table exists"); + } + try { + s1.executeUpdate(createInventoryRow); + } catch (Exception e) { + System.out.println("Product row exists"); + } + s1.close(); + String createOrderTable = "create table Orders ( orderId VARCHAR ( 100 ) PRIMARY KEY, productId VARCHAR ( 100 ), amount INT NOT NULL CHECK (amount <= 5) )"; + Statement s2 = orderConnection.createStatement(); + try { + s2.executeUpdate(createOrderTable); + } catch (Exception e) { + System.out.println("Orders table exists"); + } + s2.close(); + inventoryConnection.close(); + orderConnection.close(); + } + + private static DataSource getDataSource(String db) { + + DataSource ds; + AtomikosDataSourceBean ads = new AtomikosDataSourceBean(); + ads.setXaDataSourceClassName("org.apache.derby.jdbc.EmbeddedXADataSource"); + Properties properties = new Properties(); + properties.put("databaseName", db); + properties.put("createDatabase", "create"); + ads.setXaProperties(properties); + ads.setUniqueResourceName(db); + ads.setPoolSize(10); // optional + ads.setBorrowConnectionTimeout(10); // optional + ds = ads; + return ds; + + } + + private static long getBalance(DataSource inventoryDataSource, String productId) throws Exception { + + UserTransactionImp utx = new UserTransactionImp(); + utx.begin(); + Connection inventoryConnection = inventoryDataSource.getConnection(); + Statement s1 = inventoryConnection.createStatement(); + String q1 = "select balance from Inventory where productId='" + productId + "'"; + ResultSet rs1 = s1.executeQuery(q1); + if (rs1 == null || !rs1.next()) + throw new Exception("Product not found: " + productId); + long balance = rs1.getLong(1); + inventoryConnection.close(); + utx.commit(); + return balance; + + } + +} diff --git a/atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java b/atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java new file mode 100644 index 0000000000..0c9392eac4 --- /dev/null +++ b/atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java @@ -0,0 +1,108 @@ +package com.baeldung.atomikos.spring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; + +import javax.sql.DataSource; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.atomikos.spring.config.Config; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { Config.class }) +public class ApplicationUnitTest { + + private static String productId = UUID.randomUUID() + .toString(); + + @Autowired + Application application; + + @Autowired + DataSource inventoryDataSource; + + @Autowired + DataSource orderDataSource; + + @Test + @Ignore + public void testPlaceOrderSuccess() throws Exception { + int amount = 1; + long initialBalance = getBalance(inventoryDataSource, productId); + application.placeOrder(productId, amount); + long finalBalance = getBalance(inventoryDataSource, productId); + assertEquals(initialBalance - amount, finalBalance); + } + + @Test + @Ignore + public void testPlaceOrderFailure() throws Exception { + int amount = 10; + long initialBalance = getBalance(inventoryDataSource, productId); + try { + application.placeOrder(productId, amount); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + long finalBalance = getBalance(inventoryDataSource, productId); + assertEquals(initialBalance, finalBalance); + } + + @Before + public void setUp() throws SQLException { + + Connection inventoryConnection = inventoryDataSource.getConnection(); + Connection orderConnection = orderDataSource.getConnection(); + String createInventoryTable = "create table Inventory ( " + " productId VARCHAR ( 100 ) PRIMARY KEY, balance INT )"; + String createInventoryRow = "insert into Inventory values ( '" + productId + "', 10000 )"; + Statement s1 = inventoryConnection.createStatement(); + try { + s1.executeUpdate(createInventoryTable); + } catch (Exception e) { + System.out.println("Inventory table exists"); + } + try { + s1.executeUpdate(createInventoryRow); + } catch (Exception e) { + System.out.println("Product row exists"); + } + s1.close(); + String createOrderTable = "create table Orders ( orderId VARCHAR ( 100 ) PRIMARY KEY, productId VARCHAR ( 100 ), amount INT NOT NULL CHECK (amount <= 5) )"; + Statement s2 = orderConnection.createStatement(); + try { + s2.executeUpdate(createOrderTable); + } catch (Exception e) { + System.out.println("Orders table exists"); + } + s2.close(); + inventoryConnection.close(); + orderConnection.close(); + } + + private static long getBalance(DataSource inventoryDataSource, String productId) throws Exception { + + Connection inventoryConnection = inventoryDataSource.getConnection(); + Statement s1 = inventoryConnection.createStatement(); + String q1 = "select balance from Inventory where productId='" + productId + "'"; + ResultSet rs1 = s1.executeQuery(q1); + if (rs1 == null || !rs1.next()) + throw new Exception("Product not found: " + productId); + long balance = rs1.getLong(1); + inventoryConnection.close(); + return balance; + + } + +} diff --git a/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java b/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java new file mode 100644 index 0000000000..e6a3c1982c --- /dev/null +++ b/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java @@ -0,0 +1,80 @@ +package com.baeldung.atomikos.spring.jpa; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.SQLException; +import java.util.UUID; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.atomikos.spring.jpa.config.Config; +import com.baeldung.atomikos.spring.jpa.inventory.Inventory; +import com.baeldung.atomikos.spring.jpa.inventory.InventoryConfig; +import com.baeldung.atomikos.spring.jpa.inventory.InventoryRepository; +import com.baeldung.atomikos.spring.jpa.order.OrderConfig; +import com.baeldung.atomikos.spring.jpa.order.OrderRepository; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { Config.class, InventoryConfig.class, OrderConfig.class }) +public class ApplicationUnitTest { + + private static String productId = UUID.randomUUID() + .toString(); + + @Autowired + Application application; + + @Autowired + InventoryRepository inventoryRepository; + + @Autowired + OrderRepository orderRepository; + + @Test + @Ignore + public void testPlaceOrderSuccess() throws Exception { + int amount = 1; + long initialBalance = getBalance(inventoryRepository, productId); + application.placeOrder(productId, amount); + long finalBalance = getBalance(inventoryRepository, productId); + assertEquals(initialBalance - amount, finalBalance); + } + + @Test + @Ignore + public void testPlaceOrderFailure() throws Exception { + int amount = 10; + long initialBalance = getBalance(inventoryRepository, productId); + try { + application.placeOrder(productId, amount); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + long finalBalance = getBalance(inventoryRepository, productId); + assertEquals(initialBalance, finalBalance); + } + + @Before + public void setUp() throws SQLException { + + Inventory inventory = new Inventory(); + inventory.setProductId(productId); + inventory.setBalance(new Long(10000)); + inventoryRepository.save(inventory); + + } + + private static long getBalance(InventoryRepository inventoryRepository, String productId) throws Exception { + + return inventoryRepository.findOne(productId) + .getBalance(); + + } + +} diff --git a/atomikos/src/test/resources/logback.xml b/atomikos/src/test/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/atomikos/src/test/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/atomikos/src/test/resources/transactions.properties b/atomikos/src/test/resources/transactions.properties new file mode 100644 index 0000000000..8e027032fa --- /dev/null +++ b/atomikos/src/test/resources/transactions.properties @@ -0,0 +1 @@ +com.atomikos.icatch.file=logs \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8d4632fb3e..8a8b8e1b55 100644 --- a/pom.xml +++ b/pom.xml @@ -564,6 +564,8 @@ rxjava-libraries rxjava-observables rxjava-operators + + atomikos @@ -1073,6 +1075,8 @@ rxjava-libraries rxjava-observables rxjava-operators + + atomikos From 40f2f2ea8a431fa6e675ce6d31900f515ea55e31 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Thu, 26 Mar 2020 12:29:05 +0200 Subject: [PATCH 399/530] BAEL-3926 - Java Map with case-insensitive keys --- .../core-java-collections-maps/pom.xml | 7 ++++ .../map/CaseInsensitiveMapUnitTest.java | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml index c0dd705c1c..b459213e17 100644 --- a/core-java-modules/core-java-collections-maps/pom.xml +++ b/core-java-modules/core-java-collections-maps/pom.xml @@ -26,10 +26,17 @@ ${assertj.version} test + + org.springframework + spring-core + ${spring.version} + test + 4.1 3.6.1 + 5.2.5.RELEASE diff --git a/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java new file mode 100644 index 0000000000..a2171aa326 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.map; + +import org.apache.commons.collections4.map.CaseInsensitiveMap; +import org.junit.Test; +import org.springframework.util.LinkedCaseInsensitiveMap; +import static org.junit.Assert.*; + +import java.util.TreeMap; + +public class CaseInsensitiveMapUnitTest { + @Test + public void givenCaseInsensitiveTreeMap_whenTwoEntriesAdded_thenSizeIsOne(){ + TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + treeMap.put("abc", 1); + treeMap.put("ABC", 2); + + assertEquals(treeMap.size(), 1); + } + + @Test + public void givenCommonsCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ + CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + commonsHashMap.put("abc", 1); + commonsHashMap.put("ABC", 2); + + assertEquals(commonsHashMap.get("aBc"), (Integer)2); + } + + @Test + public void givenLinkedCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ + LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + linkedHashMap.put("abc", 3); + linkedHashMap.remove("aBC"); + + assertEquals(linkedHashMap.size(), 0); + } +} From 7d9d3c5f607260be7a466600bb09b9926a252770 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 17:50:20 +0300 Subject: [PATCH 400/530] new module has been added --- .../core-java-collections-maps/pom.xml | 7 ---- java-collections-maps-3/README.md | 8 ++++ java-collections-maps-3/pom.xml | 39 +++++++++++++++++++ .../CaseInsensitiveMapUnitTest.java | 7 ++-- pom.xml | 10 ++++- 5 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 java-collections-maps-3/README.md create mode 100644 java-collections-maps-3/pom.xml rename {java-collections-maps/src/test/java/com/baeldung/map => java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys}/CaseInsensitiveMapUnitTest.java (84%) diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml index b459213e17..c0dd705c1c 100644 --- a/core-java-modules/core-java-collections-maps/pom.xml +++ b/core-java-modules/core-java-collections-maps/pom.xml @@ -26,17 +26,10 @@ ${assertj.version} test - - org.springframework - spring-core - ${spring.version} - test - 4.1 3.6.1 - 5.2.5.RELEASE diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md new file mode 100644 index 0000000000..9df666296b --- /dev/null +++ b/java-collections-maps-3/README.md @@ -0,0 +1,8 @@ +## Java Collections Cookbooks and Examples + +This module contains articles about Map data structures in Java. + +### Relevant Articles: +- [Java Map With Case-Insensitive Keys](https://www.baeldung.com/java-map-case-insensitive-keys) +- More articles: [[<-- prev>]](/../java-collections-maps) +- More articles: [[<-- prev>]](/../java-collections-maps-2) diff --git a/java-collections-maps-3/pom.xml b/java-collections-maps-3/pom.xml new file mode 100644 index 0000000000..0dd915c87b --- /dev/null +++ b/java-collections-maps-3/pom.xml @@ -0,0 +1,39 @@ + + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + 4.0.0 + java-collections-maps-3 + + + + org.springframework + spring-core + ${spring.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + + 4.1 + 3.6.1 + 5.2.5.RELEASE + + \ No newline at end of file diff --git a/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java similarity index 84% rename from java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java rename to java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index a2171aa326..b12080e368 100644 --- a/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -1,6 +1,7 @@ -package com.baeldung.map; +package com.baeldung.map.caseinsensitivekeys; import org.apache.commons.collections4.map.CaseInsensitiveMap; +import org.junit.Assert; import org.junit.Test; import org.springframework.util.LinkedCaseInsensitiveMap; import static org.junit.Assert.*; @@ -23,7 +24,7 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - assertEquals(commonsHashMap.get("aBc"), (Integer)2); + Assert.assertEquals(commonsHashMap.get("aBc"), (Integer)2); } @Test @@ -32,6 +33,6 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); - assertEquals(linkedHashMap.size(), 0); + Assert.assertEquals(linkedHashMap.size(), 0); } } diff --git a/pom.xml b/pom.xml index 8a8b8e1b55..cb0c0cf5d7 100644 --- a/pom.xml +++ b/pom.xml @@ -453,6 +453,9 @@ java-collections-conversions java-collections-conversions-2 + java-collections-maps + java-collections-maps-2 + java-collections-maps-3 javafx @@ -564,7 +567,7 @@ rxjava-libraries rxjava-observables rxjava-operators - + atomikos @@ -965,6 +968,9 @@ java-collections-conversions java-collections-conversions-2 + java-collections-maps + java-collections-maps-2 + java-collections-maps-3 javafx @@ -1075,7 +1081,7 @@ rxjava-libraries rxjava-observables rxjava-operators - + atomikos From 5137f8fa209d1a0c2f8847017cb959e0a6db69b1 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 17:58:34 +0300 Subject: [PATCH 401/530] tests has been added and split --- .../CaseInsensitiveMapUnitTest.java | 63 ++++++++++++++++++- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index b12080e368..b3653a97c2 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -15,7 +15,37 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("abc", 1); treeMap.put("ABC", 2); - assertEquals(treeMap.size(), 1); + assertEquals(1, treeMap.size()); + + } + + @Test + public void givenCommonsCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ + CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + commonsHashMap.put("abc", 1); + commonsHashMap.put("ABC", 2); + + assertEquals(1, commonsHashMap.size()); + + } + + @Test + public void givenLinkedCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ + LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + linkedHashMap.put("abc", 1); + linkedHashMap.put("ABC", 2); + + assertEquals(1, linkedHashMap.size()); + + } + + @Test + public void givenCaseInsensitiveTreeMap_whenSameEntryAdded_thenValueUpdated(){ + TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + treeMap.put("abc", 1); + treeMap.put("ABC", 2); + + Assert.assertEquals((Integer)2, treeMap.get("aBc")); } @Test @@ -24,7 +54,34 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - Assert.assertEquals(commonsHashMap.get("aBc"), (Integer)2); + Assert.assertEquals((Integer)2, commonsHashMap.get("aBc")); + } + + @Test + public void givenLinkedCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ + LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + linkedHashMap.put("abc", 1); + linkedHashMap.put("ABC", 2); + + Assert.assertEquals((Integer)2, linkedHashMap.get("aBc")); + } + + @Test + public void givenCaseInsensitiveTreeMap_whenEntryRemoved_thenSizeIsZero(){ + TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + treeMap.put("abc", 3); + treeMap.remove("aBC"); + + Assert.assertEquals(0, treeMap.size()); + } + + @Test + public void givenCommonsCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ + CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + commonsHashMap.put("abc", 3); + commonsHashMap.remove("aBC"); + + Assert.assertEquals(0, commonsHashMap.size()); } @Test @@ -33,6 +90,6 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); - Assert.assertEquals(linkedHashMap.size(), 0); + Assert.assertEquals(0, linkedHashMap.size()); } } From 9fc999311cdc4fa83b733631a4213b48728cb9d7 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 22:41:07 +0300 Subject: [PATCH 402/530] tests has been added and split --- java-collections-maps-3/README.md | 2 +- .../CaseInsensitiveMapUnitTest.java | 29 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md index 9df666296b..ab6a37d00c 100644 --- a/java-collections-maps-3/README.md +++ b/java-collections-maps-3/README.md @@ -3,6 +3,6 @@ This module contains articles about Map data structures in Java. ### Relevant Articles: -- [Java Map With Case-Insensitive Keys](https://www.baeldung.com/java-map-case-insensitive-keys) +- [Java Map With Case-Insensitive Keys](https://www.baeldung.com/java-map-with-case-insensitive-keys/) - More articles: [[<-- prev>]](/../java-collections-maps) - More articles: [[<-- prev>]](/../java-collections-maps-2) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index b3653a97c2..82feef869a 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -1,17 +1,16 @@ package com.baeldung.map.caseinsensitivekeys; import org.apache.commons.collections4.map.CaseInsensitiveMap; -import org.junit.Assert; import org.junit.Test; import org.springframework.util.LinkedCaseInsensitiveMap; -import static org.junit.Assert.*; - +import java.util.Map; import java.util.TreeMap; +import static org.junit.Assert.*; public class CaseInsensitiveMapUnitTest { @Test public void givenCaseInsensitiveTreeMap_whenTwoEntriesAdded_thenSizeIsOne(){ - TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 1); treeMap.put("ABC", 2); @@ -21,7 +20,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenCommonsCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ - CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + Map commonsHashMap = new CaseInsensitiveMap<>(); commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); @@ -41,20 +40,20 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenCaseInsensitiveTreeMap_whenSameEntryAdded_thenValueUpdated(){ - TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 1); treeMap.put("ABC", 2); - Assert.assertEquals((Integer)2, treeMap.get("aBc")); + assertEquals((Integer)2, treeMap.get("aBc")); } @Test public void givenCommonsCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ - CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + Map commonsHashMap = new CaseInsensitiveMap<>(); commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - Assert.assertEquals((Integer)2, commonsHashMap.get("aBc")); + assertEquals((Integer)2, commonsHashMap.get("aBc")); } @Test @@ -63,25 +62,25 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); - Assert.assertEquals((Integer)2, linkedHashMap.get("aBc")); + assertEquals((Integer)2, linkedHashMap.get("aBc")); } @Test public void givenCaseInsensitiveTreeMap_whenEntryRemoved_thenSizeIsZero(){ - TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 3); treeMap.remove("aBC"); - Assert.assertEquals(0, treeMap.size()); + assertEquals(0, treeMap.size()); } @Test public void givenCommonsCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ - CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + Map commonsHashMap = new CaseInsensitiveMap<>(); commonsHashMap.put("abc", 3); commonsHashMap.remove("aBC"); - Assert.assertEquals(0, commonsHashMap.size()); + assertEquals(0, commonsHashMap.size()); } @Test @@ -90,6 +89,6 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); - Assert.assertEquals(0, linkedHashMap.size()); + assertEquals(0, linkedHashMap.size()); } } From 640f8ce5d28cc78265d13e2f957895e36c7a719c Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 22:50:07 +0300 Subject: [PATCH 403/530] varius get cases --- .../map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index 82feef869a..60dd1da9c0 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -45,6 +45,7 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("ABC", 2); assertEquals((Integer)2, treeMap.get("aBc")); + assertEquals((Integer)2, treeMap.get("ABc")); } @Test @@ -54,6 +55,7 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("ABC", 2); assertEquals((Integer)2, commonsHashMap.get("aBc")); + assertEquals((Integer)2, commonsHashMap.get("ABc")); } @Test @@ -63,6 +65,7 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("ABC", 2); assertEquals((Integer)2, linkedHashMap.get("aBc")); + assertEquals((Integer)2, linkedHashMap.get("ABc")); } @Test From c2e37ce399ab221298a7914275a146c8ce23fb68 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Mon, 30 Mar 2020 13:28:29 +0300 Subject: [PATCH 404/530] changed README, assert has changed --- java-collections-maps-3/README.md | 2 +- .../CaseInsensitiveMapUnitTest.java | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md index ab6a37d00c..ed68eb00a0 100644 --- a/java-collections-maps-3/README.md +++ b/java-collections-maps-3/README.md @@ -3,6 +3,6 @@ This module contains articles about Map data structures in Java. ### Relevant Articles: -- [Java Map With Case-Insensitive Keys](https://www.baeldung.com/java-map-with-case-insensitive-keys/) + - More articles: [[<-- prev>]](/../java-collections-maps) - More articles: [[<-- prev>]](/../java-collections-maps-2) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index 60dd1da9c0..37d9af7535 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -25,7 +25,6 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("ABC", 2); assertEquals(1, commonsHashMap.size()); - } @Test @@ -35,7 +34,6 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("ABC", 2); assertEquals(1, linkedHashMap.size()); - } @Test @@ -44,8 +42,8 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("abc", 1); treeMap.put("ABC", 2); - assertEquals((Integer)2, treeMap.get("aBc")); - assertEquals((Integer)2, treeMap.get("ABc")); + assertEquals(2, treeMap.get("aBc").intValue()); + assertEquals(2, treeMap.get("ABc").intValue()); } @Test @@ -54,8 +52,8 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - assertEquals((Integer)2, commonsHashMap.get("aBc")); - assertEquals((Integer)2, commonsHashMap.get("ABc")); + assertEquals(2, commonsHashMap.get("aBc").intValue()); + assertEquals(2, commonsHashMap.get("ABc").intValue()); } @Test @@ -64,8 +62,8 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); - assertEquals((Integer)2, linkedHashMap.get("aBc")); - assertEquals((Integer)2, linkedHashMap.get("ABc")); + assertEquals(2, linkedHashMap.get("aBc").intValue()); + assertEquals(2, linkedHashMap.get("ABc").intValue()); } @Test From 46843866bd569096bed78d1d261a82363ada9ff2 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Thu, 2 Apr 2020 10:06:43 +0300 Subject: [PATCH 405/530] changed LinkedHashMap to Map interface --- .../map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index 37d9af7535..c64738a266 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -29,7 +29,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenLinkedCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ - LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); @@ -58,7 +58,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenLinkedCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ - LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); @@ -86,7 +86,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenLinkedCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ - LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); From 73892202d1aacee43417e413ba14a1ba3b90b67b Mon Sep 17 00:00:00 2001 From: omerfinger Date: Thu, 2 Apr 2020 12:18:03 +0300 Subject: [PATCH 406/530] changed LinkedHashMap to Map interface --- .../map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index c64738a266..833807c692 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -15,7 +15,6 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("ABC", 2); assertEquals(1, treeMap.size()); - } @Test From db989e2322d3214326c3b5b316d566e0260175bb Mon Sep 17 00:00:00 2001 From: omerfinger <43134354+omerfinger@users.noreply.github.com> Date: Wed, 8 Apr 2020 12:12:26 +0300 Subject: [PATCH 407/530] Revert to original pom settings --- java-collections-maps-3/pom.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/java-collections-maps-3/pom.xml b/java-collections-maps-3/pom.xml index 0dd915c87b..a397eaa033 100644 --- a/java-collections-maps-3/pom.xml +++ b/java-collections-maps-3/pom.xml @@ -8,9 +8,13 @@ 0.0.1-SNAPSHOT ../parent-java + 4.0.0 java-collections-maps-3 - + 0.1.0-SNAPSHOT + java-collections-maps-3 + jar + org.springframework @@ -36,4 +40,4 @@ 3.6.1 5.2.5.RELEASE - \ No newline at end of file + From 0b2e7e9f7c7089329e783fe3e096fe74cfe4767c Mon Sep 17 00:00:00 2001 From: omerfinger Date: Thu, 26 Mar 2020 12:29:05 +0200 Subject: [PATCH 408/530] BAEL-3926 - Java Map with case-insensitive keys --- .../core-java-collections-maps/pom.xml | 7 ++++ .../map/CaseInsensitiveMapUnitTest.java | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml index c0dd705c1c..b459213e17 100644 --- a/core-java-modules/core-java-collections-maps/pom.xml +++ b/core-java-modules/core-java-collections-maps/pom.xml @@ -26,10 +26,17 @@ ${assertj.version} test + + org.springframework + spring-core + ${spring.version} + test + 4.1 3.6.1 + 5.2.5.RELEASE diff --git a/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java new file mode 100644 index 0000000000..a2171aa326 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.map; + +import org.apache.commons.collections4.map.CaseInsensitiveMap; +import org.junit.Test; +import org.springframework.util.LinkedCaseInsensitiveMap; +import static org.junit.Assert.*; + +import java.util.TreeMap; + +public class CaseInsensitiveMapUnitTest { + @Test + public void givenCaseInsensitiveTreeMap_whenTwoEntriesAdded_thenSizeIsOne(){ + TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + treeMap.put("abc", 1); + treeMap.put("ABC", 2); + + assertEquals(treeMap.size(), 1); + } + + @Test + public void givenCommonsCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ + CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + commonsHashMap.put("abc", 1); + commonsHashMap.put("ABC", 2); + + assertEquals(commonsHashMap.get("aBc"), (Integer)2); + } + + @Test + public void givenLinkedCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ + LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + linkedHashMap.put("abc", 3); + linkedHashMap.remove("aBC"); + + assertEquals(linkedHashMap.size(), 0); + } +} From b2bc2dc00408c6d1fd223e73258f03a5aac4d5cf Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 17:50:20 +0300 Subject: [PATCH 409/530] new module has been added --- .../core-java-collections-maps/pom.xml | 7 -- java-collections-maps-3/pom.xml | 4 +- .../CaseInsensitiveMapUnitTest.java | 74 +++---------------- .../map/CaseInsensitiveMapUnitTest.java | 37 ---------- 4 files changed, 11 insertions(+), 111 deletions(-) delete mode 100644 java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml index b459213e17..c0dd705c1c 100644 --- a/core-java-modules/core-java-collections-maps/pom.xml +++ b/core-java-modules/core-java-collections-maps/pom.xml @@ -26,17 +26,10 @@ ${assertj.version} test - - org.springframework - spring-core - ${spring.version} - test - 4.1 3.6.1 - 5.2.5.RELEASE diff --git a/java-collections-maps-3/pom.xml b/java-collections-maps-3/pom.xml index a397eaa033..3888623a7f 100644 --- a/java-collections-maps-3/pom.xml +++ b/java-collections-maps-3/pom.xml @@ -8,13 +8,13 @@ 0.0.1-SNAPSHOT ../parent-java - + 4.0.0 java-collections-maps-3 0.1.0-SNAPSHOT java-collections-maps-3 jar - + org.springframework diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index 833807c692..b12080e368 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -1,94 +1,38 @@ package com.baeldung.map.caseinsensitivekeys; import org.apache.commons.collections4.map.CaseInsensitiveMap; +import org.junit.Assert; import org.junit.Test; import org.springframework.util.LinkedCaseInsensitiveMap; -import java.util.Map; -import java.util.TreeMap; import static org.junit.Assert.*; +import java.util.TreeMap; + public class CaseInsensitiveMapUnitTest { @Test public void givenCaseInsensitiveTreeMap_whenTwoEntriesAdded_thenSizeIsOne(){ - Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 1); treeMap.put("ABC", 2); - assertEquals(1, treeMap.size()); - } - - @Test - public void givenCommonsCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ - Map commonsHashMap = new CaseInsensitiveMap<>(); - commonsHashMap.put("abc", 1); - commonsHashMap.put("ABC", 2); - - assertEquals(1, commonsHashMap.size()); - } - - @Test - public void givenLinkedCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ - Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); - linkedHashMap.put("abc", 1); - linkedHashMap.put("ABC", 2); - - assertEquals(1, linkedHashMap.size()); - } - - @Test - public void givenCaseInsensitiveTreeMap_whenSameEntryAdded_thenValueUpdated(){ - Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - treeMap.put("abc", 1); - treeMap.put("ABC", 2); - - assertEquals(2, treeMap.get("aBc").intValue()); - assertEquals(2, treeMap.get("ABc").intValue()); + assertEquals(treeMap.size(), 1); } @Test public void givenCommonsCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ - Map commonsHashMap = new CaseInsensitiveMap<>(); + CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - assertEquals(2, commonsHashMap.get("aBc").intValue()); - assertEquals(2, commonsHashMap.get("ABc").intValue()); - } - - @Test - public void givenLinkedCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ - Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); - linkedHashMap.put("abc", 1); - linkedHashMap.put("ABC", 2); - - assertEquals(2, linkedHashMap.get("aBc").intValue()); - assertEquals(2, linkedHashMap.get("ABc").intValue()); - } - - @Test - public void givenCaseInsensitiveTreeMap_whenEntryRemoved_thenSizeIsZero(){ - Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - treeMap.put("abc", 3); - treeMap.remove("aBC"); - - assertEquals(0, treeMap.size()); - } - - @Test - public void givenCommonsCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ - Map commonsHashMap = new CaseInsensitiveMap<>(); - commonsHashMap.put("abc", 3); - commonsHashMap.remove("aBC"); - - assertEquals(0, commonsHashMap.size()); + Assert.assertEquals(commonsHashMap.get("aBc"), (Integer)2); } @Test public void givenLinkedCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ - Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); + LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); - assertEquals(0, linkedHashMap.size()); + Assert.assertEquals(linkedHashMap.size(), 0); } } diff --git a/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java deleted file mode 100644 index a2171aa326..0000000000 --- a/java-collections-maps/src/test/java/com/baeldung/map/CaseInsensitiveMapUnitTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.map; - -import org.apache.commons.collections4.map.CaseInsensitiveMap; -import org.junit.Test; -import org.springframework.util.LinkedCaseInsensitiveMap; -import static org.junit.Assert.*; - -import java.util.TreeMap; - -public class CaseInsensitiveMapUnitTest { - @Test - public void givenCaseInsensitiveTreeMap_whenTwoEntriesAdded_thenSizeIsOne(){ - TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - treeMap.put("abc", 1); - treeMap.put("ABC", 2); - - assertEquals(treeMap.size(), 1); - } - - @Test - public void givenCommonsCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ - CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); - commonsHashMap.put("abc", 1); - commonsHashMap.put("ABC", 2); - - assertEquals(commonsHashMap.get("aBc"), (Integer)2); - } - - @Test - public void givenLinkedCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ - LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); - linkedHashMap.put("abc", 3); - linkedHashMap.remove("aBC"); - - assertEquals(linkedHashMap.size(), 0); - } -} From da97125e2068af38e4e3dd53ba196a644b195aa4 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 17:58:34 +0300 Subject: [PATCH 410/530] tests has been added and split --- .../CaseInsensitiveMapUnitTest.java | 63 ++++++++++++++++++- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index b12080e368..b3653a97c2 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -15,7 +15,37 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("abc", 1); treeMap.put("ABC", 2); - assertEquals(treeMap.size(), 1); + assertEquals(1, treeMap.size()); + + } + + @Test + public void givenCommonsCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ + CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + commonsHashMap.put("abc", 1); + commonsHashMap.put("ABC", 2); + + assertEquals(1, commonsHashMap.size()); + + } + + @Test + public void givenLinkedCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ + LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + linkedHashMap.put("abc", 1); + linkedHashMap.put("ABC", 2); + + assertEquals(1, linkedHashMap.size()); + + } + + @Test + public void givenCaseInsensitiveTreeMap_whenSameEntryAdded_thenValueUpdated(){ + TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + treeMap.put("abc", 1); + treeMap.put("ABC", 2); + + Assert.assertEquals((Integer)2, treeMap.get("aBc")); } @Test @@ -24,7 +54,34 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - Assert.assertEquals(commonsHashMap.get("aBc"), (Integer)2); + Assert.assertEquals((Integer)2, commonsHashMap.get("aBc")); + } + + @Test + public void givenLinkedCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ + LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + linkedHashMap.put("abc", 1); + linkedHashMap.put("ABC", 2); + + Assert.assertEquals((Integer)2, linkedHashMap.get("aBc")); + } + + @Test + public void givenCaseInsensitiveTreeMap_whenEntryRemoved_thenSizeIsZero(){ + TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + treeMap.put("abc", 3); + treeMap.remove("aBC"); + + Assert.assertEquals(0, treeMap.size()); + } + + @Test + public void givenCommonsCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ + CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + commonsHashMap.put("abc", 3); + commonsHashMap.remove("aBC"); + + Assert.assertEquals(0, commonsHashMap.size()); } @Test @@ -33,6 +90,6 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); - Assert.assertEquals(linkedHashMap.size(), 0); + Assert.assertEquals(0, linkedHashMap.size()); } } From ac21dcc346f1c3debe4b8bd370f937c5aa6f7ba0 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 22:41:07 +0300 Subject: [PATCH 411/530] tests has been added and split --- .../CaseInsensitiveMapUnitTest.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index b3653a97c2..82feef869a 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -1,17 +1,16 @@ package com.baeldung.map.caseinsensitivekeys; import org.apache.commons.collections4.map.CaseInsensitiveMap; -import org.junit.Assert; import org.junit.Test; import org.springframework.util.LinkedCaseInsensitiveMap; -import static org.junit.Assert.*; - +import java.util.Map; import java.util.TreeMap; +import static org.junit.Assert.*; public class CaseInsensitiveMapUnitTest { @Test public void givenCaseInsensitiveTreeMap_whenTwoEntriesAdded_thenSizeIsOne(){ - TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 1); treeMap.put("ABC", 2); @@ -21,7 +20,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenCommonsCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ - CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + Map commonsHashMap = new CaseInsensitiveMap<>(); commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); @@ -41,20 +40,20 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenCaseInsensitiveTreeMap_whenSameEntryAdded_thenValueUpdated(){ - TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 1); treeMap.put("ABC", 2); - Assert.assertEquals((Integer)2, treeMap.get("aBc")); + assertEquals((Integer)2, treeMap.get("aBc")); } @Test public void givenCommonsCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ - CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + Map commonsHashMap = new CaseInsensitiveMap<>(); commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - Assert.assertEquals((Integer)2, commonsHashMap.get("aBc")); + assertEquals((Integer)2, commonsHashMap.get("aBc")); } @Test @@ -63,25 +62,25 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); - Assert.assertEquals((Integer)2, linkedHashMap.get("aBc")); + assertEquals((Integer)2, linkedHashMap.get("aBc")); } @Test public void givenCaseInsensitiveTreeMap_whenEntryRemoved_thenSizeIsZero(){ - TreeMap treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + Map treeMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 3); treeMap.remove("aBC"); - Assert.assertEquals(0, treeMap.size()); + assertEquals(0, treeMap.size()); } @Test public void givenCommonsCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ - CaseInsensitiveMap commonsHashMap = new CaseInsensitiveMap<>(); + Map commonsHashMap = new CaseInsensitiveMap<>(); commonsHashMap.put("abc", 3); commonsHashMap.remove("aBC"); - Assert.assertEquals(0, commonsHashMap.size()); + assertEquals(0, commonsHashMap.size()); } @Test @@ -90,6 +89,6 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); - Assert.assertEquals(0, linkedHashMap.size()); + assertEquals(0, linkedHashMap.size()); } } From dac08f02db475176443be050cc929b1c40699913 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sat, 28 Mar 2020 22:50:07 +0300 Subject: [PATCH 412/530] varius get cases --- .../map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index 82feef869a..60dd1da9c0 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -45,6 +45,7 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("ABC", 2); assertEquals((Integer)2, treeMap.get("aBc")); + assertEquals((Integer)2, treeMap.get("ABc")); } @Test @@ -54,6 +55,7 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("ABC", 2); assertEquals((Integer)2, commonsHashMap.get("aBc")); + assertEquals((Integer)2, commonsHashMap.get("ABc")); } @Test @@ -63,6 +65,7 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("ABC", 2); assertEquals((Integer)2, linkedHashMap.get("aBc")); + assertEquals((Integer)2, linkedHashMap.get("ABc")); } @Test From 22a94cd61c2b5f936e85aeecf6c52c7a5f9153d7 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Mon, 30 Mar 2020 13:28:29 +0300 Subject: [PATCH 413/530] changed README, assert has changed --- .../CaseInsensitiveMapUnitTest.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index 60dd1da9c0..37d9af7535 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -25,7 +25,6 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("ABC", 2); assertEquals(1, commonsHashMap.size()); - } @Test @@ -35,7 +34,6 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("ABC", 2); assertEquals(1, linkedHashMap.size()); - } @Test @@ -44,8 +42,8 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("abc", 1); treeMap.put("ABC", 2); - assertEquals((Integer)2, treeMap.get("aBc")); - assertEquals((Integer)2, treeMap.get("ABc")); + assertEquals(2, treeMap.get("aBc").intValue()); + assertEquals(2, treeMap.get("ABc").intValue()); } @Test @@ -54,8 +52,8 @@ public class CaseInsensitiveMapUnitTest { commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2); - assertEquals((Integer)2, commonsHashMap.get("aBc")); - assertEquals((Integer)2, commonsHashMap.get("ABc")); + assertEquals(2, commonsHashMap.get("aBc").intValue()); + assertEquals(2, commonsHashMap.get("ABc").intValue()); } @Test @@ -64,8 +62,8 @@ public class CaseInsensitiveMapUnitTest { linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); - assertEquals((Integer)2, linkedHashMap.get("aBc")); - assertEquals((Integer)2, linkedHashMap.get("ABc")); + assertEquals(2, linkedHashMap.get("aBc").intValue()); + assertEquals(2, linkedHashMap.get("ABc").intValue()); } @Test From 7848c39d7b634f6b90d3e2832429bfad5be311dd Mon Sep 17 00:00:00 2001 From: omerfinger Date: Thu, 2 Apr 2020 10:06:43 +0300 Subject: [PATCH 414/530] changed LinkedHashMap to Map interface --- .../map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index 37d9af7535..c64738a266 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -29,7 +29,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenLinkedCaseInsensitiveMap_whenTwoEntriesAdded_thenSizeIsOne(){ - LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); @@ -58,7 +58,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenLinkedCaseInsensitiveMap_whenSameEntryAdded_thenValueUpdated(){ - LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2); @@ -86,7 +86,7 @@ public class CaseInsensitiveMapUnitTest { @Test public void givenLinkedCaseInsensitiveMap_whenEntryRemoved_thenSizeIsZero(){ - LinkedCaseInsensitiveMap linkedHashMap = new LinkedCaseInsensitiveMap<>(); + Map linkedHashMap = new LinkedCaseInsensitiveMap<>(); linkedHashMap.put("abc", 3); linkedHashMap.remove("aBC"); From edb8e8b341e45de9c5aec23aedf309c3aeccec96 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Thu, 2 Apr 2020 12:18:03 +0300 Subject: [PATCH 415/530] changed LinkedHashMap to Map interface --- .../map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java index c64738a266..833807c692 100644 --- a/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java +++ b/java-collections-maps-3/src/test/java/com/baeldung/map/caseinsensitivekeys/CaseInsensitiveMapUnitTest.java @@ -15,7 +15,6 @@ public class CaseInsensitiveMapUnitTest { treeMap.put("ABC", 2); assertEquals(1, treeMap.size()); - } @Test From 33d6f3853c64ad9df288e39508753402a9e262dc Mon Sep 17 00:00:00 2001 From: Aitor Cuesta Date: Sun, 12 Apr 2020 10:46:36 +0200 Subject: [PATCH 416/530] BAEL-3075 - Undo whitespaces from pom.xml. README.md is replaced with the original version --- persistence-modules/spring-boot-persistence-2/README.md | 2 +- persistence-modules/spring-boot-persistence-2/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-2/README.md b/persistence-modules/spring-boot-persistence-2/README.md index fac8b75615..5d171fb2ca 100644 --- a/persistence-modules/spring-boot-persistence-2/README.md +++ b/persistence-modules/spring-boot-persistence-2/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi) \ No newline at end of file +- [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi) diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index c1afededb0..fd7cc467f9 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.boot.persistence spring-boot-persistence-2 From 7930d2c72e6e33d163a475abc7166e02cafb2d89 Mon Sep 17 00:00:00 2001 From: omerfinger Date: Sun, 12 Apr 2020 11:48:00 +0300 Subject: [PATCH 417/530] rebase parent pom on upstream --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index cb0c0cf5d7..24d9fd1d0b 100644 --- a/pom.xml +++ b/pom.xml @@ -453,8 +453,6 @@ java-collections-conversions java-collections-conversions-2 - java-collections-maps - java-collections-maps-2 java-collections-maps-3 @@ -968,8 +966,6 @@ java-collections-conversions java-collections-conversions-2 - java-collections-maps - java-collections-maps-2 java-collections-maps-3 From a0dd4a537db8332ab8790b0ee0dca3e7a42c3e5f Mon Sep 17 00:00:00 2001 From: gindex Date: Sun, 12 Apr 2020 13:01:52 +0200 Subject: [PATCH 418/530] Revert README.md to 1acadab1 --- reactor-core/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/reactor-core/README.md b/reactor-core/README.md index f2dbd77981..e3cca35f86 100644 --- a/reactor-core/README.md +++ b/reactor-core/README.md @@ -7,4 +7,3 @@ This module contains articles about Reactor Core. - [Intro To Reactor Core](https://www.baeldung.com/reactor-core) - [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams) - [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor) -- [How To Get String From Mono In Reactive Java](http://baeldung.com/string-from-mono/) \ No newline at end of file From 07b5c1f01020dfbd7a3dfa17054f21347d451c65 Mon Sep 17 00:00:00 2001 From: Kirill Vlasov Date: Sun, 12 Apr 2020 16:16:36 +0500 Subject: [PATCH 419/530] Code review fixes --- ...tion.java => CustomLogoutApplication.java} | 8 +- .../customlogouthandler/MvcConfiguration.java | 30 ++-- .../services/UserCache.java | 24 ++-- .../customlogouthandler/user/UserUtils.java | 5 +- .../web/CustomLogoutHandler.java | 13 +- .../web/UserController.java | 10 +- .../CustomLogoutHandlerIntegrationTest.java | 132 +++++++++--------- .../application.properties | 6 +- 8 files changed, 119 insertions(+), 109 deletions(-) rename spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/{LogoutDemoApplication.java => CustomLogoutApplication.java} (54%) diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/LogoutDemoApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/CustomLogoutApplication.java similarity index 54% rename from spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/LogoutDemoApplication.java rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/CustomLogoutApplication.java index 027334dd6b..39d867b1f4 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/LogoutDemoApplication.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/CustomLogoutApplication.java @@ -4,10 +4,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class LogoutDemoApplication { +public class CustomLogoutApplication { - public static void main(String[] args) { - SpringApplication.run(LogoutDemoApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(CustomLogoutApplication.class, args); + } } diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java index 36de049a31..3e17a7c397 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java @@ -1,6 +1,7 @@ package com.baeldung.customlogouthandler; -import com.baeldung.customlogouthandler.web.CustomLogoutHandler; +import javax.sql.DataSource; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -11,7 +12,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler; -import javax.sql.DataSource; +import com.baeldung.customlogouthandler.web.CustomLogoutHandler; @Configuration @EnableWebSecurity @@ -25,27 +26,30 @@ public class MvcConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { - http - .httpBasic().and() + http.httpBasic() + .and() .authorizeRequests() - .antMatchers(HttpMethod.GET, "/user/**").hasRole("USER") - .and() - .logout() + .antMatchers(HttpMethod.GET, "/user/**") + .hasRole("USER") + .and() + .logout() .logoutUrl("/user/logout") .addLogoutHandler(logoutHandler) .logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK))) .permitAll() - .and() - .csrf().disable() - .formLogin().disable(); + .and() + .csrf() + .disable() + .formLogin() + .disable(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication() - .dataSource(dataSource) - .usersByUsernameQuery("select login, password, true from users where login=?") - .authoritiesByUsernameQuery("select login, role from users where login=?"); + .dataSource(dataSource) + .usersByUsernameQuery("select login, password, true from users where login=?") + .authoritiesByUsernameQuery("select login, role from users where login=?"); } } diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java index 56c4d1e7c9..b86edc0dee 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/services/UserCache.java @@ -1,12 +1,14 @@ package com.baeldung.customlogouthandler.services; -import com.baeldung.customlogouthandler.user.User; -import org.springframework.stereotype.Service; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; + +import org.springframework.stereotype.Service; + +import com.baeldung.customlogouthandler.user.User; @Service public class UserCache { @@ -16,18 +18,18 @@ public class UserCache { private final ConcurrentMap store = new ConcurrentHashMap<>(256); - public User getByLogin(String login) { - return store.computeIfAbsent(login, k -> entityManager.createQuery("from User where login=:login", User.class) - .setParameter("login", k) - .getSingleResult()); + public User getByUserName(String userName) { + return store.computeIfAbsent(userName, k -> entityManager.createQuery("from User where login=:login", User.class) + .setParameter("login", k) + .getSingleResult()); } - public void evictUser(String login) { - store.remove(login); + public void evictUser(String userName) { + store.remove(userName); } public int size() { - return this.store.size(); + return store.size(); } } diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java index 195497f7ba..aa9a521b01 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/user/UserUtils.java @@ -5,8 +5,9 @@ import org.springframework.security.core.context.SecurityContextHolder; public class UserUtils { - public static String getAuthenticatedUserLogin() { - Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + public static String getAuthenticatedUserName() { + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); return auth != null ? ((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername() : null; } diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java index 2a335cd122..a89c9a570d 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/CustomLogoutHandler.java @@ -1,13 +1,14 @@ package com.baeldung.customlogouthandler.web; -import com.baeldung.customlogouthandler.services.UserCache; -import com.baeldung.customlogouthandler.user.UserUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutHandler; import org.springframework.stereotype.Service; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import com.baeldung.customlogouthandler.services.UserCache; +import com.baeldung.customlogouthandler.user.UserUtils; @Service public class CustomLogoutHandler implements LogoutHandler { @@ -20,8 +21,8 @@ public class CustomLogoutHandler implements LogoutHandler { @Override public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { - String login = UserUtils.getAuthenticatedUserLogin(); - userCache.evictUser(login); + String userName = UserUtils.getAuthenticatedUserName(); + userCache.evictUser(userName); } } diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java index 18cd8dda98..b2d332a1bb 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/web/UserController.java @@ -1,13 +1,13 @@ package com.baeldung.customlogouthandler.web; -import com.baeldung.customlogouthandler.services.UserCache; -import com.baeldung.customlogouthandler.user.User; -import com.baeldung.customlogouthandler.user.UserUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import com.baeldung.customlogouthandler.services.UserCache; +import com.baeldung.customlogouthandler.user.User; +import com.baeldung.customlogouthandler.user.UserUtils; @Controller @RequestMapping(path = "/user") @@ -22,8 +22,8 @@ public class UserController { @GetMapping(path = "/language") @ResponseBody public String getLanguage() { - String login = UserUtils.getAuthenticatedUserLogin(); - User user = userCache.getByLogin(login); + String userName = UserUtils.getAuthenticatedUserName(); + User user = userCache.getByUserName(userName); return user.getLanguage(); } diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java index 3c325a2006..cd8a1a72d6 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/com/baeldung/customlogouthandler/CustomLogoutHandlerIntegrationTest.java @@ -1,6 +1,7 @@ package com.baeldung.customlogouthandler; -import com.baeldung.customlogouthandler.services.UserCache; +import static org.assertj.core.api.Assertions.assertThat; + import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -11,96 +12,97 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.SqlGroup; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.assertj.core.api.Assertions.assertThat; +import com.baeldung.customlogouthandler.services.UserCache; @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = {LogoutDemoApplication.class, MvcConfiguration.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@SqlGroup({ - @Sql(value = "classpath:customlogouthandler/before.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD), - @Sql(value = "classpath:customlogouthandler/after.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) -}) +@SpringBootTest(classes = { CustomLogoutApplication.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SqlGroup({ @Sql(value = "classpath:customlogouthandler/before.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD), @Sql(value = "classpath:customlogouthandler/after.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) }) +@TestPropertySource(locations="classpath:customlogouthandler/application.properties") class CustomLogoutHandlerIntegrationTest { - @Autowired - private TestRestTemplate restTemplate; + @Autowired + private TestRestTemplate restTemplate; - @Autowired - private UserCache userCache; + @Autowired + private UserCache userCache; - @LocalServerPort - private int port; + @LocalServerPort + private int port; - @Test - public void whenLogin_thenUseUserCache() throws Exception { - // User cache should be empty on start - assertThat(userCache.size()).isEqualTo(0); + @Test + public void whenLogin_thenUseUserCache() { + // User cache should be empty on start + assertThat(userCache.size()).isEqualTo(0); - // Request using first login - ResponseEntity response = restTemplate - .withBasicAuth("user", "pass") - .getForEntity(getLanguageUrl(), String.class); + // Request using first login + ResponseEntity response = restTemplate.withBasicAuth("user", "pass") + .getForEntity(getLanguageUrl(), String.class); - assertThat(response.getBody()).contains("english"); + assertThat(response.getBody()).contains("english"); - // User cache must contain the user - assertThat(userCache.size()).isEqualTo(1); + // User cache must contain the user + assertThat(userCache.size()).isEqualTo(1); - // Getting the session cookie - HttpHeaders requestHeaders = new HttpHeaders(); - requestHeaders.add("Cookie", response.getHeaders().getFirst(HttpHeaders.SET_COOKIE)); + // Getting the session cookie + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.add("Cookie", response.getHeaders() + .getFirst(HttpHeaders.SET_COOKIE)); - // Request with the session cookie - response = restTemplate - .exchange(getLanguageUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); - assertThat(response.getBody()).contains("english"); + // Request with the session cookie + response = restTemplate.exchange(getLanguageUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getBody()).contains("english"); - // Logging out using the session cookies - response = restTemplate.exchange(getLogoutUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); - assertThat(response.getStatusCode().value()).isEqualTo(200); - } + // Logging out using the session cookies + response = restTemplate.exchange(getLogoutUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getStatusCode() + .value()).isEqualTo(200); + } - @Test - public void whenLogout_thenCacheIsEmpty() throws Exception { - // User cache should be empty on start - assertThat(userCache.size()).isEqualTo(0); + @Test + public void whenLogout_thenCacheIsEmpty() { + // User cache should be empty on start + assertThat(userCache.size()).isEqualTo(0); - // Request using first login - ResponseEntity response = restTemplate - .withBasicAuth("user", "pass") - .getForEntity(getLanguageUrl(), String.class); + // Request using first login + ResponseEntity response = restTemplate.withBasicAuth("user", "pass") + .getForEntity(getLanguageUrl(), String.class); - assertThat(response.getBody()).contains("english"); + assertThat(response.getBody()).contains("english"); - // User cache must contain the user - assertThat(userCache.size()).isEqualTo(1); + // User cache must contain the user + assertThat(userCache.size()).isEqualTo(1); - // Getting the session cookie - HttpHeaders requestHeaders = new HttpHeaders(); - requestHeaders.add("Cookie", response.getHeaders().getFirst(HttpHeaders.SET_COOKIE)); + // Getting the session cookie + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.add("Cookie", response.getHeaders() + .getFirst(HttpHeaders.SET_COOKIE)); - // Logging out using the session cookies - response = restTemplate.exchange(getLogoutUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); - assertThat(response.getStatusCode().value()).isEqualTo(200); + // Logging out using the session cookies + response = restTemplate.exchange(getLogoutUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getStatusCode() + .value()).isEqualTo(200); - // User cache must be empty now - // this is the reaction on custom logout filter execution - assertThat(userCache.size()).isEqualTo(0); + // User cache must be empty now + // this is the reaction on custom logout filter execution + assertThat(userCache.size()).isEqualTo(0); - // Assert unathorized request - response = restTemplate.exchange(getLanguageUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); - assertThat(response.getStatusCode().value()).isEqualTo(401); - } + // Assert unauthorized request + response = restTemplate.exchange(getLanguageUrl(), HttpMethod.GET, new HttpEntity(requestHeaders), String.class); + assertThat(response.getStatusCode() + .value()).isEqualTo(401); + } - private String getLanguageUrl() { - return "http://localhost:" + port + "/user/language"; - } + private String getLanguageUrl() { + return "http://localhost:" + port + "/user/language"; + } - private String getLogoutUrl() { - return "http://localhost:" + port + "/user/logout"; - } + private String getLogoutUrl() { + return "http://localhost:" + port + "/user/logout"; + } } diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties index 8b6d47ebe9..9edd853f2c 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties +++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties @@ -1,5 +1,5 @@ -spring.datasource.url=jdbc:postgresql://localhost:5432/develop -spring.datasource.username=develop -spring.datasource.password=develop +spring.datasource.url=jdbc:postgresql://localhost:5432/test +spring.datasource.username=test +spring.datasource.password=test spring.jpa.hibernate.ddl-auto=create From 856c0473068fef84d5a68c532bd2ecd28884ea38 Mon Sep 17 00:00:00 2001 From: Eric Martin Date: Sun, 12 Apr 2020 13:53:06 -0500 Subject: [PATCH 420/530] Update terraform/best-practices/k8s-modules/SETUP.md Co-Authored-By: KevinGilmore --- terraform/best-practices/k8s-modules/SETUP.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/terraform/best-practices/k8s-modules/SETUP.md b/terraform/best-practices/k8s-modules/SETUP.md index b7e4c2764d..f00247a293 100644 --- a/terraform/best-practices/k8s-modules/SETUP.md +++ b/terraform/best-practices/k8s-modules/SETUP.md @@ -4,7 +4,7 @@ This sample deploys two services behind a Kubernetes ingress. # Setup instructions -1. Mak sure you have a working Kubernetes environment. Use a simple command such as _kubectl get nodes_ and check its output. +1. Make sure you have a working Kubernetes environment. Use a simple command such as _kubectl get nodes_ and check its output. If you get a list of nodes that contains at least one _ready_ module, you're good to go 2. Download the Terraform package for your environment from Hashicorp's site. Unzip it and put the _terraform_ binary somewhere in the OS's PATH. @@ -18,4 +18,3 @@ This sample deploys two services behind a Kubernetes ingress. 6. Run _terraform destroy_ to remove the previously creates namespace. - From bf0ff591457cef341514a54764c1b944f87b7cd2 Mon Sep 17 00:00:00 2001 From: Eric Martin Date: Sun, 12 Apr 2020 13:53:19 -0500 Subject: [PATCH 421/530] Update terraform/best-practices/k8s-basic/SETUP.md Co-Authored-By: KevinGilmore --- terraform/best-practices/k8s-basic/SETUP.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/terraform/best-practices/k8s-basic/SETUP.md b/terraform/best-practices/k8s-basic/SETUP.md index 479bb75274..35e690d88e 100644 --- a/terraform/best-practices/k8s-basic/SETUP.md +++ b/terraform/best-practices/k8s-basic/SETUP.md @@ -1,6 +1,6 @@ # Setup instructions -1. Mak sure you have a working Kubernetes environment. Use a simple command such as _kubectl get nodes_ and check its output. +1. Make sure you have a working Kubernetes environment. Use a simple command such as _kubectl get nodes_ and check its output. If you get a list of nodes that contains at least one _ready_ module, you're good to go 2. Download the Terraform package for your environment from Hashicorp's site. Unzip it and put the _terraform_ binary somewhere in the OS's PATH. @@ -12,4 +12,3 @@ ''' 5. Wait until Terraform create all resources and run _kubectl get namespaces_. The output should now have a new "hello-terraform" namespace. 6. Run _terraform destroy_ to remove the previously creates namespace. - From 02a4eee18c9a91af3aa64747cdf036f0a645f464 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 13 Apr 2020 15:09:40 +0530 Subject: [PATCH 422/530] JAVA-620: New module core-java-io-conversions-2 --- .../core-java-io-conversions-2/README.md | 9 + .../core-java-io-conversions-2/pom.xml | 37 +++ .../InputStreamToByteBufferUnitTest.java | 56 ++++ .../JavaInputStreamToXUnitTest.java | 248 ++++++++++++++++++ .../src/test/resources/sample.txt | 1 + .../src/test/resources/targetFile.tmp | 1 + 6 files changed, 352 insertions(+) create mode 100644 core-java-modules/core-java-io-conversions-2/README.md create mode 100644 core-java-modules/core-java-io-conversions-2/pom.xml create mode 100644 core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java create mode 100644 core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java create mode 100644 core-java-modules/core-java-io-conversions-2/src/test/resources/sample.txt create mode 100644 core-java-modules/core-java-io-conversions-2/src/test/resources/targetFile.tmp diff --git a/core-java-modules/core-java-io-conversions-2/README.md b/core-java-modules/core-java-io-conversions-2/README.md new file mode 100644 index 0000000000..404d4aa400 --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/README.md @@ -0,0 +1,9 @@ +## Core Java IO Conversions + +This module contains articles about core Java input/output(IO) conversions. + +### Relevant Articles: +- [Java InputStream to String](https://www.baeldung.com/convert-input-stream-to-string) +- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes) +- [Java – Write an InputStream to a File](https://www.baeldung.com/convert-input-stream-to-a-file) +- More articles: [[<-- prev]](/core-java-modules/core-java-io-conversions) diff --git a/core-java-modules/core-java-io-conversions-2/pom.xml b/core-java-modules/core-java-io-conversions-2/pom.xml new file mode 100644 index 0000000000..e95d1f4b67 --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + core-java-io-conversions-2 + 0.1.0-SNAPSHOT + core-java-io-conversions-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + core-java-io-conversions + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java new file mode 100644 index 0000000000..c10aaae22a --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.inputstreamtobytes; + +import com.google.common.io.ByteSource; +import com.google.common.io.ByteStreams; +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; + +import static java.nio.channels.Channels.newChannel; +import static org.junit.Assert.assertEquals; + +public class InputStreamToByteBufferUnitTest { + + @Test + public void givenUsingCoreClasses_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch() throws IOException { + byte[] input = new byte[] { 0, 1, 2 }; + InputStream initialStream = new ByteArrayInputStream(input); + ByteBuffer byteBuffer = ByteBuffer.allocate(3); + while (initialStream.available() > 0) { + byteBuffer.put((byte) initialStream.read()); + } + + assertEquals(byteBuffer.position(), input.length); + } + + @Test + public void givenUsingGuava__whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch() throws IOException { + InputStream initialStream = ByteSource + .wrap(new byte[] { 0, 1, 2 }) + .openStream(); + byte[] targetArray = ByteStreams.toByteArray(initialStream); + ByteBuffer bufferByte = ByteBuffer.wrap(targetArray); + while (bufferByte.hasRemaining()) { + bufferByte.get(); + } + + assertEquals(bufferByte.position(), targetArray.length); + } + + @Test + public void givenUsingCommonsIo_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch() throws IOException { + byte[] input = new byte[] { 0, 1, 2 }; + InputStream initialStream = new ByteArrayInputStream(input); + ByteBuffer byteBuffer = ByteBuffer.allocate(3); + ReadableByteChannel channel = newChannel(initialStream); + IOUtils.readFully(channel, byteBuffer); + + assertEquals(byteBuffer.position(), input.length); + } + +} 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 new file mode 100644 index 0000000000..eb8c39f2d9 --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java @@ -0,0 +1,248 @@ +package com.baeldung.inputstreamtostring; + +import com.google.common.base.Charsets; +import com.google.common.io.ByteSource; +import com.google.common.io.ByteStreams; +import com.google.common.io.CharStreams; +import com.google.common.io.Files; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Scanner; +import java.util.UUID; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +@SuppressWarnings("unused") +public class JavaInputStreamToXUnitTest { + protected final Logger logger = LoggerFactory.getLogger(getClass()); + private static final int DEFAULT_SIZE = 1500000; + + // tests - InputStream to String + + @Test + public final void givenUsingJava5_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { + final String originalString = randomAlphabetic(DEFAULT_SIZE); + 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())))) { + int c; + while ((c = reader.read()) != -1) { + textBuilder.append((char) c); + } + } + assertEquals(textBuilder.toString(), originalString); + } + + @Test + public final void givenUsingJava7_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { + final String originalString = randomAlphabetic(DEFAULT_SIZE); + final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); // exampleString.getBytes(StandardCharsets.UTF_8); + + // When + String text; + try (Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name())) { + text = scanner.useDelimiter("\\A").next(); + } + + assertThat(text, equalTo(originalString)); + } + + @Test + public final void givenUsingGuava_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { + final String originalString = randomAlphabetic(DEFAULT_SIZE); + final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); + + final ByteSource byteSource = new ByteSource() { + @Override + public final InputStream openStream() throws IOException { + return inputStream; + } + }; + + final String text = byteSource.asCharSource(Charsets.UTF_8).read(); + + assertThat(text, equalTo(originalString)); + } + + @Test + public final void givenUsingGuavaAndJava7_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { + final String originalString = randomAlphabetic(DEFAULT_SIZE); + final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); + + // When + String text; + try (final Reader reader = new InputStreamReader(inputStream)) { + text = CharStreams.toString(reader); + } + + assertThat(text, equalTo(originalString)); + } + + @Test + public final void givenUsingCommonsIo_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { + final String originalString = randomAlphabetic(DEFAULT_SIZE); + final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); + + // When + final String text = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); + assertThat(text, equalTo(originalString)); + } + + @Test + public final void givenUsingCommonsIoWithCopy_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { + final String originalString = randomAlphabetic(DEFAULT_SIZE); + final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); + + // When + final StringWriter writer = new StringWriter(); + final String encoding = StandardCharsets.UTF_8.name(); + IOUtils.copy(inputStream, writer, encoding); + + assertThat(writer.toString(), equalTo(originalString)); + } + + @Test + public final void givenUsingTempFile_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { + final String originalString = randomAlphabetic(DEFAULT_SIZE); + final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); + + // When + Path tempFile = java.nio.file.Files.createTempDirectory("").resolve(UUID.randomUUID().toString() + ".tmp"); + java.nio.file.Files.copy(inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING); + String result = new String(java.nio.file.Files.readAllBytes(tempFile)); + + assertThat(result, equalTo(originalString)); + } + + // tests - InputStream to byte[] + + @Test + public final void givenUsingPlainJavaOnFixedSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { + final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); + final byte[] targetArray = new byte[initialStream.available()]; + initialStream.read(targetArray); + } + + @Test + public final void givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { + final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); + + final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; + final byte[] data = new byte[1024]; + while ((nRead = is.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + + buffer.flush(); + final byte[] byteArray = buffer.toByteArray(); + } + + @Test + public final void givenUsingGuava_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { + final InputStream initialStream = ByteSource.wrap(new byte[] { 0, 1, 2 }).openStream(); + final byte[] targetArray = ByteStreams.toByteArray(initialStream); + } + + @Test + public final void givenUsingCommonsIO_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { + final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); + final byte[] targetArray = IOUtils.toByteArray(initialStream); + } + + // tests - InputStream to File + + @Test + public final void whenConvertingToFile_thenCorrect() throws IOException { + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); + final byte[] buffer = new byte[initialStream.available()]; + initialStream.read(buffer); + + final File targetFile = new File("src/test/resources/targetFile.tmp"); + final OutputStream outStream = new FileOutputStream(targetFile); + outStream.write(buffer); + + IOUtils.closeQuietly(initialStream); + IOUtils.closeQuietly(outStream); + } + + @Test + public final void whenConvertingInProgressToFile_thenCorrect() throws IOException { + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); + final File targetFile = new File("src/test/resources/targetFile.tmp"); + final OutputStream outStream = new FileOutputStream(targetFile); + + final byte[] buffer = new byte[8 * 1024]; + int bytesRead; + while ((bytesRead = initialStream.read(buffer)) != -1) { + outStream.write(buffer, 0, bytesRead); + } + + IOUtils.closeQuietly(initialStream); + IOUtils.closeQuietly(outStream); + } + + @Test + public final void whenConvertingAnInProgressInputStreamToFile_thenCorrect2() throws IOException { + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); + final File targetFile = new File("src/test/resources/targetFile.tmp"); + + java.nio.file.Files.copy(initialStream, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + + IOUtils.closeQuietly(initialStream); + } + + @Test + public final void whenConvertingInputStreamToFile_thenCorrect3() throws IOException { + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); + final byte[] buffer = new byte[initialStream.available()]; + initialStream.read(buffer); + + final File targetFile = new File("src/test/resources/targetFile.tmp"); + Files.write(buffer, targetFile); + + IOUtils.closeQuietly(initialStream); + } + + @Test + public final void whenConvertingInputStreamToFile_thenCorrect4() throws IOException { + final InputStream initialStream = FileUtils.openInputStream(new File("src/test/resources/sample.txt")); + + final File targetFile = new File("src/test/resources/targetFile.tmp"); + + FileUtils.copyInputStreamToFile(initialStream, targetFile); + } + + @Test + public final void givenUsingPlainJava_whenConvertingAnInputStreamToString_thenCorrect() throws IOException { + String originalString = randomAlphabetic(8); + InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); + + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; + byte[] data = new byte[1024]; + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + + buffer.flush(); + byte[] byteArray = buffer.toByteArray(); + + String text = new String(byteArray, StandardCharsets.UTF_8); + assertThat(text, equalTo(originalString)); + } + +} diff --git a/core-java-modules/core-java-io-conversions-2/src/test/resources/sample.txt b/core-java-modules/core-java-io-conversions-2/src/test/resources/sample.txt new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/test/resources/sample.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/core-java-modules/core-java-io-conversions-2/src/test/resources/targetFile.tmp b/core-java-modules/core-java-io-conversions-2/src/test/resources/targetFile.tmp new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/test/resources/targetFile.tmp @@ -0,0 +1 @@ +Hello World \ No newline at end of file From b2cf180785486bb722f6f014199b92f376eac415 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 13 Apr 2020 15:10:22 +0530 Subject: [PATCH 423/530] JAVA-620: Moved articles to new module --- .../core-java-io-conversions/README.md | 3 +- .../InputStreamToByteBufferUnitTest.java | 56 ---- .../JavaInputStreamToXUnitTest.java | 248 ------------------ .../src/test/resources/targetFile.tmp | 1 - 4 files changed, 1 insertion(+), 307 deletions(-) delete mode 100644 core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java delete mode 100644 core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java delete mode 100644 core-java-modules/core-java-io-conversions/src/test/resources/targetFile.tmp diff --git a/core-java-modules/core-java-io-conversions/README.md b/core-java-modules/core-java-io-conversions/README.md index cdb7df04d0..1f12c87241 100644 --- a/core-java-modules/core-java-io-conversions/README.md +++ b/core-java-modules/core-java-io-conversions/README.md @@ -3,10 +3,8 @@ This module contains articles about core Java input/output(IO) conversions. ### Relevant Articles: -- [Java InputStream to String](https://www.baeldung.com/convert-input-stream-to-string) - [Java – Convert File to InputStream](https://www.baeldung.com/convert-file-to-input-stream) - [Java – Byte Array to Writer](https://www.baeldung.com/java-convert-byte-array-to-writer) -- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes) - [Java – String to Reader](https://www.baeldung.com/java-convert-string-to-reader) - [Java – Byte Array to Reader](https://www.baeldung.com/java-convert-byte-array-to-reader) - [Java – File to Reader](https://www.baeldung.com/java-convert-file-to-reader) @@ -15,3 +13,4 @@ This module contains articles about core Java input/output(IO) conversions. - [Java – Write a Reader to File](https://www.baeldung.com/java-write-reader-to-file) - [Java – Reader to Byte Array](https://www.baeldung.com/java-convert-reader-to-byte-array) - [Java – Reader to InputStream](https://www.baeldung.com/java-convert-reader-to-inputstream) +- More articles: [[next -->]](/core-java-modules/core-java-io-conversions-2) diff --git a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java deleted file mode 100644 index c10aaae22a..0000000000 --- a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtobytes/InputStreamToByteBufferUnitTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.baeldung.inputstreamtobytes; - -import com.google.common.io.ByteSource; -import com.google.common.io.ByteStreams; -import org.apache.commons.io.IOUtils; -import org.junit.Test; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.nio.channels.ReadableByteChannel; - -import static java.nio.channels.Channels.newChannel; -import static org.junit.Assert.assertEquals; - -public class InputStreamToByteBufferUnitTest { - - @Test - public void givenUsingCoreClasses_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch() throws IOException { - byte[] input = new byte[] { 0, 1, 2 }; - InputStream initialStream = new ByteArrayInputStream(input); - ByteBuffer byteBuffer = ByteBuffer.allocate(3); - while (initialStream.available() > 0) { - byteBuffer.put((byte) initialStream.read()); - } - - assertEquals(byteBuffer.position(), input.length); - } - - @Test - public void givenUsingGuava__whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch() throws IOException { - InputStream initialStream = ByteSource - .wrap(new byte[] { 0, 1, 2 }) - .openStream(); - byte[] targetArray = ByteStreams.toByteArray(initialStream); - ByteBuffer bufferByte = ByteBuffer.wrap(targetArray); - while (bufferByte.hasRemaining()) { - bufferByte.get(); - } - - assertEquals(bufferByte.position(), targetArray.length); - } - - @Test - public void givenUsingCommonsIo_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch() throws IOException { - byte[] input = new byte[] { 0, 1, 2 }; - InputStream initialStream = new ByteArrayInputStream(input); - ByteBuffer byteBuffer = ByteBuffer.allocate(3); - ReadableByteChannel channel = newChannel(initialStream); - IOUtils.readFully(channel, byteBuffer); - - assertEquals(byteBuffer.position(), input.length); - } - -} diff --git a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java deleted file mode 100644 index eb8c39f2d9..0000000000 --- a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/inputstreamtostring/JavaInputStreamToXUnitTest.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.baeldung.inputstreamtostring; - -import com.google.common.base.Charsets; -import com.google.common.io.ByteSource; -import com.google.common.io.ByteStreams; -import com.google.common.io.CharStreams; -import com.google.common.io.Files; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.Scanner; -import java.util.UUID; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; - -@SuppressWarnings("unused") -public class JavaInputStreamToXUnitTest { - protected final Logger logger = LoggerFactory.getLogger(getClass()); - private static final int DEFAULT_SIZE = 1500000; - - // tests - InputStream to String - - @Test - public final void givenUsingJava5_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { - final String originalString = randomAlphabetic(DEFAULT_SIZE); - 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())))) { - int c; - while ((c = reader.read()) != -1) { - textBuilder.append((char) c); - } - } - assertEquals(textBuilder.toString(), originalString); - } - - @Test - public final void givenUsingJava7_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { - final String originalString = randomAlphabetic(DEFAULT_SIZE); - final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); // exampleString.getBytes(StandardCharsets.UTF_8); - - // When - String text; - try (Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name())) { - text = scanner.useDelimiter("\\A").next(); - } - - assertThat(text, equalTo(originalString)); - } - - @Test - public final void givenUsingGuava_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { - final String originalString = randomAlphabetic(DEFAULT_SIZE); - final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); - - final ByteSource byteSource = new ByteSource() { - @Override - public final InputStream openStream() throws IOException { - return inputStream; - } - }; - - final String text = byteSource.asCharSource(Charsets.UTF_8).read(); - - assertThat(text, equalTo(originalString)); - } - - @Test - public final void givenUsingGuavaAndJava7_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { - final String originalString = randomAlphabetic(DEFAULT_SIZE); - final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); - - // When - String text; - try (final Reader reader = new InputStreamReader(inputStream)) { - text = CharStreams.toString(reader); - } - - assertThat(text, equalTo(originalString)); - } - - @Test - public final void givenUsingCommonsIo_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { - final String originalString = randomAlphabetic(DEFAULT_SIZE); - final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); - - // When - final String text = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); - assertThat(text, equalTo(originalString)); - } - - @Test - public final void givenUsingCommonsIoWithCopy_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { - final String originalString = randomAlphabetic(DEFAULT_SIZE); - final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); - - // When - final StringWriter writer = new StringWriter(); - final String encoding = StandardCharsets.UTF_8.name(); - IOUtils.copy(inputStream, writer, encoding); - - assertThat(writer.toString(), equalTo(originalString)); - } - - @Test - public final void givenUsingTempFile_whenConvertingAnInputStreamToAString_thenCorrect() throws IOException { - final String originalString = randomAlphabetic(DEFAULT_SIZE); - final InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); - - // When - Path tempFile = java.nio.file.Files.createTempDirectory("").resolve(UUID.randomUUID().toString() + ".tmp"); - java.nio.file.Files.copy(inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING); - String result = new String(java.nio.file.Files.readAllBytes(tempFile)); - - assertThat(result, equalTo(originalString)); - } - - // tests - InputStream to byte[] - - @Test - public final void givenUsingPlainJavaOnFixedSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { - final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); - final byte[] targetArray = new byte[initialStream.available()]; - initialStream.read(targetArray); - } - - @Test - public final void givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { - final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); - - final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - int nRead; - final byte[] data = new byte[1024]; - while ((nRead = is.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, nRead); - } - - buffer.flush(); - final byte[] byteArray = buffer.toByteArray(); - } - - @Test - public final void givenUsingGuava_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { - final InputStream initialStream = ByteSource.wrap(new byte[] { 0, 1, 2 }).openStream(); - final byte[] targetArray = ByteStreams.toByteArray(initialStream); - } - - @Test - public final void givenUsingCommonsIO_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException { - final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 }); - final byte[] targetArray = IOUtils.toByteArray(initialStream); - } - - // tests - InputStream to File - - @Test - public final void whenConvertingToFile_thenCorrect() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); - final byte[] buffer = new byte[initialStream.available()]; - initialStream.read(buffer); - - final File targetFile = new File("src/test/resources/targetFile.tmp"); - final OutputStream outStream = new FileOutputStream(targetFile); - outStream.write(buffer); - - IOUtils.closeQuietly(initialStream); - IOUtils.closeQuietly(outStream); - } - - @Test - public final void whenConvertingInProgressToFile_thenCorrect() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); - final File targetFile = new File("src/test/resources/targetFile.tmp"); - final OutputStream outStream = new FileOutputStream(targetFile); - - final byte[] buffer = new byte[8 * 1024]; - int bytesRead; - while ((bytesRead = initialStream.read(buffer)) != -1) { - outStream.write(buffer, 0, bytesRead); - } - - IOUtils.closeQuietly(initialStream); - IOUtils.closeQuietly(outStream); - } - - @Test - public final void whenConvertingAnInProgressInputStreamToFile_thenCorrect2() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); - final File targetFile = new File("src/test/resources/targetFile.tmp"); - - java.nio.file.Files.copy(initialStream, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - - IOUtils.closeQuietly(initialStream); - } - - @Test - public final void whenConvertingInputStreamToFile_thenCorrect3() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); - final byte[] buffer = new byte[initialStream.available()]; - initialStream.read(buffer); - - final File targetFile = new File("src/test/resources/targetFile.tmp"); - Files.write(buffer, targetFile); - - IOUtils.closeQuietly(initialStream); - } - - @Test - public final void whenConvertingInputStreamToFile_thenCorrect4() throws IOException { - final InputStream initialStream = FileUtils.openInputStream(new File("src/test/resources/sample.txt")); - - final File targetFile = new File("src/test/resources/targetFile.tmp"); - - FileUtils.copyInputStreamToFile(initialStream, targetFile); - } - - @Test - public final void givenUsingPlainJava_whenConvertingAnInputStreamToString_thenCorrect() throws IOException { - String originalString = randomAlphabetic(8); - InputStream inputStream = new ByteArrayInputStream(originalString.getBytes()); - - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - int nRead; - byte[] data = new byte[1024]; - while ((nRead = inputStream.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, nRead); - } - - buffer.flush(); - byte[] byteArray = buffer.toByteArray(); - - String text = new String(byteArray, StandardCharsets.UTF_8); - assertThat(text, equalTo(originalString)); - } - -} diff --git a/core-java-modules/core-java-io-conversions/src/test/resources/targetFile.tmp b/core-java-modules/core-java-io-conversions/src/test/resources/targetFile.tmp deleted file mode 100644 index 5e1c309dae..0000000000 --- a/core-java-modules/core-java-io-conversions/src/test/resources/targetFile.tmp +++ /dev/null @@ -1 +0,0 @@ -Hello World \ No newline at end of file From effbd4cb6e080136046ece92f38554d576c2f389 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 13 Apr 2020 15:10:47 +0530 Subject: [PATCH 424/530] JAVA-620: parent pom changes to include new module --- core-java-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 3fc978a68c..00ef24be92 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -69,6 +69,7 @@ core-java-io-2 core-java-io-apis core-java-io-conversions + core-java-io-conversions-2 core-java-jar core-java-jndi From dc0f9adabdba48b450814d8022f43361858e989e Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 13 Apr 2020 15:19:27 +0530 Subject: [PATCH 425/530] JAVA-620: Updated README --- core-java-modules/core-java-io-conversions-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-io-conversions-2/README.md b/core-java-modules/core-java-io-conversions-2/README.md index 404d4aa400..4a28bf37c5 100644 --- a/core-java-modules/core-java-io-conversions-2/README.md +++ b/core-java-modules/core-java-io-conversions-2/README.md @@ -1,4 +1,4 @@ -## Core Java IO Conversions +## Core Java IO Conversions (Part 2) This module contains articles about core Java input/output(IO) conversions. From a6b0996346beedb9066b1aa0ab334c65ee79080a Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 13 Apr 2020 22:34:36 +0530 Subject: [PATCH 426/530] BAEL-3909: Update README to include article in correct module --- core-java-modules/core-java-string-operations-2/README.md | 1 + core-java-modules/core-java-string-operations/README.md | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md index 5e92738f5c..bc00c6a915 100644 --- a/core-java-modules/core-java-string-operations-2/README.md +++ b/core-java-modules/core-java-string-operations-2/README.md @@ -11,4 +11,5 @@ This module contains articles about string operations. - [Case-Insensitive String Matching in Java](https://www.baeldung.com/java-case-insensitive-string-matching) - [L-Trim and R-Trim in Java](https://www.baeldung.com/l-trim-and-r-trim-in-java) - [L-Trim and R-Trim Alternatives in Java](https://www.baeldung.com/java-trim-alternatives) +- [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) - More articles: [[<-- prev]](../core-java-string-operations) diff --git a/core-java-modules/core-java-string-operations/README.md b/core-java-modules/core-java-string-operations/README.md index c40e56bc46..18a2649a6a 100644 --- a/core-java-modules/core-java-string-operations/README.md +++ b/core-java-modules/core-java-string-operations/README.md @@ -13,5 +13,4 @@ This module contains articles about string operations. - [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline) - [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring) - [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode) -- [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) - More articles: [[next -->]](../core-java-string-operations-2) From 676738e7cbe702b85cf11c84b526d18e5b47b503 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 13 Apr 2020 21:21:19 +0200 Subject: [PATCH 427/530] JAVA-1295: Fix node.left -> node.right --- data-structures/src/main/java/com/baeldung/tree/BinaryTree.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java index bb62714006..7469e8ba64 100644 --- a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java +++ b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java @@ -142,7 +142,7 @@ public class BinaryTree { nodes.add(node.left); } - if (node.left != null) { + if (node.right != null) { nodes.add(node.right); } } From 123485714d03e71beb5f313746fc082b0e755a82 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Tue, 14 Apr 2020 01:28:10 +0430 Subject: [PATCH 428/530] Renaming the Class to Reflect the Article Update --- .../concurrent/threadsafety/application/Application.java | 8 ++++---- .../callables/ExtrinsicLockCounterCallable.java | 6 +++--- .../{ExtrinsicLockCounter.java => ObjectLockCounter.java} | 4 ++-- ...ounterUnitTest.java => ObjectLockCounterUnitTest.java} | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) rename core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/{ExtrinsicLockCounter.java => ObjectLockCounter.java} (84%) rename core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/{ExtrinsicLockCounterUnitTest.java => ObjectLockCounterUnitTest.java} (82%) diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java index 5fcb28cd2a..ebd027ea68 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java @@ -9,7 +9,7 @@ import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCount import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable; import com.baeldung.concurrent.threadsafety.services.AtomicCounter; import com.baeldung.concurrent.threadsafety.services.Counter; -import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import com.baeldung.concurrent.threadsafety.services.ObjectLockCounter; import com.baeldung.concurrent.threadsafety.services.MessageService; import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter; import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter; @@ -48,9 +48,9 @@ public class Application { System.out.println(future3.get()); System.out.println(future4.get()); - ExtrinsicLockCounter extrinsicLockCounter = new ExtrinsicLockCounter(); - Future future5 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(extrinsicLockCounter)); - Future future6 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(extrinsicLockCounter)); + ObjectLockCounter objectLockCounter = new ObjectLockCounter(); + Future future5 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(objectLockCounter)); + Future future6 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(objectLockCounter)); System.out.println(future5.get()); System.out.println(future6.get()); diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java index 370e5d1f00..dcc929d3c4 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java @@ -1,13 +1,13 @@ package com.baeldung.concurrent.threadsafety.callables; -import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import com.baeldung.concurrent.threadsafety.services.ObjectLockCounter; import java.util.concurrent.Callable; public class ExtrinsicLockCounterCallable implements Callable { - private final ExtrinsicLockCounter counter; + private final ObjectLockCounter counter; - public ExtrinsicLockCounterCallable(ExtrinsicLockCounter counter) { + public ExtrinsicLockCounterCallable(ObjectLockCounter counter) { this.counter = counter; } diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ObjectLockCounter.java similarity index 84% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ObjectLockCounter.java index 0a6ff3f60e..f31cf899ba 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ObjectLockCounter.java @@ -1,11 +1,11 @@ package com.baeldung.concurrent.threadsafety.services; -public class ExtrinsicLockCounter { +public class ObjectLockCounter { private int counter; private final Object lock = new Object(); - public ExtrinsicLockCounter() { + public ObjectLockCounter() { this.counter = 0; } diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ObjectLockCounterUnitTest.java similarity index 82% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ObjectLockCounterUnitTest.java index 0fc3dd3a54..b0ac80a3aa 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ObjectLockCounterUnitTest.java @@ -1,7 +1,7 @@ package com.baeldung.concurrent.threadsafety; import com.baeldung.concurrent.threadsafety.callables.ExtrinsicLockCounterCallable; -import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import com.baeldung.concurrent.threadsafety.services.ObjectLockCounter; import org.junit.Test; import java.util.concurrent.ExecutorService; @@ -10,12 +10,12 @@ import java.util.concurrent.Future; import static org.assertj.core.api.Assertions.assertThat; -public class ExtrinsicLockCounterUnitTest { +public class ObjectLockCounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { ExecutorService executorService = Executors.newFixedThreadPool(2); - ExtrinsicLockCounter counter = new ExtrinsicLockCounter(); + ObjectLockCounter counter = new ObjectLockCounter(); Future future1 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(counter)); Future future2 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(counter)); From bc872d37428127eed4088f141205d1583588159c Mon Sep 17 00:00:00 2001 From: Benjamin Caure Date: Tue, 14 Apr 2020 07:08:04 +0200 Subject: [PATCH 429/530] BAEL-3943 Bson to json (#9079) --- persistence-modules/java-mongodb/README.md | 1 + .../com/baeldung/morphia/domain/Book.java | 88 ++++++++--- .../bsontojson/BsonToJsonIntegrationTest.java | 142 ++++++++++++++++++ .../bsontojson/JsonDateTimeConverter.java | 30 ++++ 4 files changed, 243 insertions(+), 18 deletions(-) create mode 100644 persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonIntegrationTest.java create mode 100644 persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JsonDateTimeConverter.java diff --git a/persistence-modules/java-mongodb/README.md b/persistence-modules/java-mongodb/README.md index a8539e644f..5c3c448b03 100644 --- a/persistence-modules/java-mongodb/README.md +++ b/persistence-modules/java-mongodb/README.md @@ -10,3 +10,4 @@ This module contains articles about MongoDB in Java. - [Geospatial Support in MongoDB](https://www.baeldung.com/mongodb-geospatial-support) - [Introduction to Morphia – Java ODM for MongoDB](https://www.baeldung.com/mongodb-morphia) - [MongoDB Aggregations Using Java](https://www.baeldung.com/java-mongodb-aggregations) +- [MongoDB BSON to JSON](https://www.baeldung.com/bson-to-json) diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java index 172c916ad9..4ed2ab8580 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java @@ -1,5 +1,7 @@ package com.baeldung.morphia.domain; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.HashSet; import java.util.Set; @@ -29,28 +31,13 @@ public class Book { private double cost; @Reference private Set companionBooks; + @Property + private LocalDateTime publishDate; public Book() { } - public String getTitle() { - return title; - } - - public String getAuthor() { - return author; - } - - public double getCost() { - return cost; - } - - public void addCompanionBooks(Book book) { - if (companionBooks != null) - this.companionBooks.add(book); - } - public Book(String isbn, String title, String author, double cost, Publisher publisher) { this.isbn = isbn; this.title = title; @@ -60,6 +47,71 @@ public class Book { this.companionBooks = new HashSet<>(); } + // Getters and setters ... + public String getIsbn() { + return isbn; + } + + public Book setIsbn(String isbn) { + this.isbn = isbn; + return this; + } + + public String getTitle() { + return title; + } + + public Book setTitle(String title) { + this.title = title; + return this; + } + + public String getAuthor() { + return author; + } + + public Book setAuthor(String author) { + this.author = author; + return this; + } + + public Publisher getPublisher() { + return publisher; + } + + public Book setPublisher(Publisher publisher) { + this.publisher = publisher; + return this; + } + + public double getCost() { + return cost; + } + + public Book setCost(double cost) { + this.cost = cost; + return this; + } + + public LocalDateTime getPublishDate() { + return publishDate; + } + + public Book setPublishDate(LocalDateTime publishDate) { + this.publishDate = publishDate; + return this; + } + + public Set getCompanionBooks() { + return companionBooks; + } + + public Book addCompanionBooks(Book book) { + if (companionBooks != null) + this.companionBooks.add(book); + return this; + } + @Override public String toString() { return "Book [isbn=" + isbn + ", title=" + title + ", author=" + author + ", publisher=" + publisher + ", cost=" + cost + "]"; @@ -113,4 +165,4 @@ public class Book { return true; } -} \ No newline at end of file +} diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonIntegrationTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonIntegrationTest.java new file mode 100644 index 0000000000..e382ea4ab2 --- /dev/null +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonIntegrationTest.java @@ -0,0 +1,142 @@ +package com.baeldung.bsontojson; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.bson.Document; +import org.bson.json.Converter; +import org.bson.json.JsonMode; +import org.bson.json.JsonWriterSettings; +import org.bson.json.StrictJsonWriter; +import org.bson.types.ObjectId; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.morphia.domain.Book; +import com.baeldung.morphia.domain.Publisher; +import com.mongodb.MongoClient; +import com.mongodb.client.MongoDatabase; + +import dev.morphia.Datastore; +import dev.morphia.Morphia; + +public class BsonToJsonIntegrationTest { + + private static final String DB_NAME = "library"; + private static Datastore datastore; + + @BeforeClass + public static void setUp() { + Morphia morphia = new Morphia(); + morphia.mapPackage("com.baeldung.morphia"); + datastore = morphia.createDatastore(new MongoClient(), DB_NAME); + datastore.ensureIndexes(); + + datastore.save(new Book() + .setIsbn("isbn") + .setTitle("title") + .setAuthor("author") + .setCost(3.95) + .setPublisher(new Publisher(new ObjectId("fffffffffffffffffffffffa"),"publisher")) + .setPublishDate(LocalDateTime.parse("2020-01-01T18:13:32Z", DateTimeFormatter.ISO_DATE_TIME)) + .addCompanionBooks(new Book().setIsbn("isbn2"))); + } + + @AfterClass + public static void tearDown() { + datastore.delete(datastore.createQuery(Book.class)); + } + + @Test + public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime() { + + String json = null; + try (MongoClient mongoClient = new MongoClient()) { + MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); + Document bson = mongoDatabase.getCollection("Books").find().first(); + json = bson.toJson(); + } + + String expectedJson = "{\"_id\": \"isbn\", " + + "\"className\": \"com.baeldung.morphia.domain.Book\", " + + "\"title\": \"title\", " + + "\"author\": \"author\", " + + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + + "\"name\": \"publisher\"}, " + + "\"price\": 3.95, " + + "\"publishDate\": {\"$date\": 1577898812000}}"; + + assertNotNull(json); + + assertEquals(expectedJson, json); + } + + + @Test + public void givenBsonDocument_whenUsingRelaxedJsonTransformation_thenJsonDateIsObjectIsoDate() { + + String json = null; + try (MongoClient mongoClient = new MongoClient()) { + MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); + Document bson = mongoDatabase.getCollection("Books").find().first(); + json = bson.toJson(JsonWriterSettings + .builder() + .outputMode(JsonMode.RELAXED) + .build()); + } + + String expectedJson = "{\"_id\": \"isbn\", " + + "\"className\": \"com.baeldung.morphia.domain.Book\", " + + "\"title\": \"title\", " + + "\"author\": \"author\", " + + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + + "\"name\": \"publisher\"}, " + + "\"price\": 3.95, " + + "\"publishDate\": {\"$date\": \"2020-01-01T17:13:32Z\"}}"; + + assertNotNull(json); + + assertEquals(expectedJson, json); + } + + @Test + public void givenBsonDocument_whenUsingCustomJsonTransformation_thenJsonDateIsStringField() { + + String json = null; + try (MongoClient mongoClient = new MongoClient()) { + MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); + Document bson = mongoDatabase.getCollection("Books").find().first(); + json = bson.toJson(JsonWriterSettings + .builder() + .dateTimeConverter(new JsonDateTimeConverter()) + .build()); + } + + String expectedJson = "{\"_id\": \"isbn\", " + + "\"className\": \"com.baeldung.morphia.domain.Book\", " + + "\"title\": \"title\", " + + "\"author\": \"author\", " + + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + + "\"name\": \"publisher\"}, " + + "\"price\": 3.95, " + + "\"publishDate\": \"2020-01-01T17:13:32Z\"}"; + + assertEquals(expectedJson, json); + + } + +} diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JsonDateTimeConverter.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JsonDateTimeConverter.java new file mode 100644 index 0000000000..46023e363f --- /dev/null +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JsonDateTimeConverter.java @@ -0,0 +1,30 @@ +package com.baeldung.bsontojson; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.TimeZone; + +import org.bson.json.Converter; +import org.bson.json.StrictJsonWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JsonDateTimeConverter implements Converter { + + private static final Logger LOGGER = LoggerFactory.getLogger(JsonDateTimeConverter.class); + static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT + .withZone(ZoneId.of("UTC")); + + @Override + public void convert(Long value, StrictJsonWriter writer) { + try { + Instant instant = new Date(value).toInstant(); + String s = DATE_TIME_FORMATTER.format(instant); + writer.writeString(s); + } catch (Exception e) { + LOGGER.error(String.format("Fail to convert offset %d to JSON date", value), e); + } + } +} From 405230e25bf2cf92932b16d6dcc64acff80b9846 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Tue, 14 Apr 2020 10:52:05 +0530 Subject: [PATCH 430/530] Testing multithreading (#9088) --- .../core-java-concurrency-testing/.gitignore | 26 --- .../core-java-concurrency-testing/pom.xml | 170 +++++++++--------- 2 files changed, 85 insertions(+), 111 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-testing/.gitignore diff --git a/core-java-modules/core-java-concurrency-testing/.gitignore b/core-java-modules/core-java-concurrency-testing/.gitignore deleted file mode 100644 index 3de4cc647e..0000000000 --- a/core-java-modules/core-java-concurrency-testing/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -*.class - -0.* - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* -.resourceCache - -# Packaged files # -*.jar -*.war -*.ear - -# Files generated by integration tests -*.txt -backup-pom.xml -/bin/ -/temp - -#IntelliJ specific -.idea/ -*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-testing/pom.xml b/core-java-modules/core-java-concurrency-testing/pom.xml index bb3e6f5152..51de83f67c 100644 --- a/core-java-modules/core-java-concurrency-testing/pom.xml +++ b/core-java-modules/core-java-concurrency-testing/pom.xml @@ -1,93 +1,93 @@ - 4.0.0 - core-java-concurrency-testing - 0.1.0-SNAPSHOT - core-java-concurrency-testing - jar + 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 + core-java-concurrency-testing + 0.1.0-SNAPSHOT + core-java-concurrency-testing + jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + - - - junit - junit - 4.13 - test - - - com.googlecode.thread-weaver - threadweaver - 0.2 - test - - - com.google.code.tempus-fugit - tempus-fugit - 1.1 - test - - - com.googlecode.multithreadedtc - multithreadedtc - 1.01 - test - - - org.openjdk.jcstress - jcstress-core - 0.5 - - + + + junit + junit + 4.13 + test + + + com.googlecode.thread-weaver + threadweaver + 0.2 + test + + + com.google.code.tempus-fugit + tempus-fugit + 1.1 + test + + + com.googlecode.multithreadedtc + multithreadedtc + 1.01 + test + + + org.openjdk.jcstress + jcstress-core + 0.5 + + - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - ${javac.target} - ${javac.target} - ${javac.target} - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${javac.target} + ${javac.target} + ${javac.target} + + - - org.apache.maven.plugins - maven-shade-plugin - 2.2 - - - main - package - - shade - - - jcstress - - - org.openjdk.jcstress.Main - - - META-INF/TestList - - - - - - - - + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + main + package + + shade + + + jcstress + + + org.openjdk.jcstress.Main + + + META-INF/TestList + + + + + + + + From 63027fd269c46259d39e56b9ddd87380e99a5232 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Tue, 14 Apr 2020 00:43:27 -0600 Subject: [PATCH 431/530] BAEL-3961 Using a list of values in a JDBCTemplate IN clause --- .../main/java/com/baeldung/jdbc/Employee.java | 7 +++ .../java/com/baeldung/jdbc/EmployeeDAO.java | 43 ++++++++++++- .../baeldung/jdbc/EmployeeDAOUnitTest.java | 63 +++++++++++++++++-- 3 files changed, 106 insertions(+), 7 deletions(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java index a43eb265c7..d5f87ca3df 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java @@ -9,6 +9,13 @@ public class Employee { private String address; + public Employee(int id, String firstName, String lastName, String address) { + setId(id); + setFirstName(firstName); + setLastName(lastName); + setAddress(address); + } + public int getId() { return id; } diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index b5bf9452ed..dec88ee1f6 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -1,21 +1,62 @@ package com.baeldung.jdbc; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.stereotype.Repository; @Repository public class EmployeeDAO { private JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate namedJdbcTemplate; public void setDataSource(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); + namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); } public int getCountOfEmployees() { return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class); } - + public List getEmployeesFromIdListNamed(List ids) { + SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); + List employees = namedJdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (:ids)", + parameters, + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + + return employees; + } + + public List getEmployeesFromIdList(List ids) { + String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); + List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (" + inSql +")", + ids.toArray(), + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + + return employees; + } + + public List getEmployeesFromLargeIdList(List ids) { + jdbcTemplate.execute("CREATE TEMPORARY TABLE employee_tmp (id INT NOT NULL)"); + + List employeeIds = new ArrayList<>(); + for (Integer id : ids) { + employeeIds.add(new Object[] { id }); + } + jdbcTemplate.batchUpdate("INSERT INTO employee_tmp VALUES(?)", employeeIds); + + List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + + return employees; + } + } diff --git a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java index 71e8fb4263..f21704221b 100644 --- a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java +++ b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java @@ -2,8 +2,12 @@ package com.baeldung.jdbc; import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.ArrayList; +import java.util.List; + import javax.sql.DataSource; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -14,13 +18,24 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.util.ReflectionTestUtils; - @RunWith(MockitoJUnitRunner.class) public class EmployeeDAOUnitTest { @Mock JdbcTemplate jdbcTemplate; + DataSource dataSource; + + @Before + public void setup() { + dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) + .generateUniqueName(true) + .addScript("classpath:jdbc/schema.sql") + .addScript("classpath:jdbc/test-data.sql") + .build(); + + } + @Test public void whenMockJdbcTemplate_thenReturnCorrectEmployeeCount() { EmployeeDAO employeeDAO = new EmployeeDAO(); @@ -38,14 +53,50 @@ public class EmployeeDAOUnitTest { @Test public void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount() { - DataSource dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) - .addScript("classpath:jdbc/schema.sql") - .addScript("classpath:jdbc/test-data.sql") - .build(); - EmployeeDAO employeeDAO = new EmployeeDAO(); employeeDAO.setDataSource(dataSource); assertEquals(4, employeeDAO.getCountOfEmployees()); } + + @Test + public void givenSmallIdList_whenGetEmployeesFromIdList_thenReturnCorrectEmployees() { + List ids = new ArrayList<>(); + ids.add(1); + ids.add(3); + ids.add(4); + EmployeeDAO employeeDAO = new EmployeeDAO(); + employeeDAO.setDataSource(dataSource); + + List employees = employeeDAO.getEmployeesFromIdList(ids); + + assertEquals(3, employees.size()); + assertEquals(1, employees.get(0).getId()); + assertEquals(3, employees.get(1).getId()); + assertEquals(4, employees.get(2).getId()); + + employees = employeeDAO.getEmployeesFromIdListNamed(ids); + + assertEquals(3, employees.size()); + assertEquals(1, employees.get(0).getId()); + assertEquals(3, employees.get(1).getId()); + assertEquals(4, employees.get(2).getId()); + } + + @Test + public void givenLargeIdList_whenGetEmployeesFromIdList_thenReturnCorrectEmployees() { + List ids = new ArrayList<>(); + ids.add(1); + ids.add(3); + ids.add(4); + EmployeeDAO employeeDAO = new EmployeeDAO(); + employeeDAO.setDataSource(dataSource); + + List employees = employeeDAO.getEmployeesFromLargeIdList(ids); + + assertEquals(3, employees.size()); + assertEquals(1, employees.get(0).getId()); + assertEquals(3, employees.get(1).getId()); + assertEquals(4, employees.get(2).getId()); + } } From 4556829955c8a4a6718ecf32776fc70f55a9ec25 Mon Sep 17 00:00:00 2001 From: mthomas Date: Tue, 14 Apr 2020 06:44:36 -0500 Subject: [PATCH 432/530] Rename classes --- .../{SafeAccount.java => StampedAccount.java} | 16 ++++++++-------- ...st.java => ThreadStampedAccountUnitTest.java} | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) rename core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/{SafeAccount.java => StampedAccount.java} (63%) rename core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/{ThreadSafeAccountUnitTest.java => ThreadStampedAccountUnitTest.java} (68%) diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java similarity index 63% rename from core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java rename to core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java index fe41429e22..1a46e1ba52 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java @@ -3,32 +3,32 @@ package com.baeldung.atomicstampedreference; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicStampedReference; -public class SafeAccount { +public class StampedAccount { private AtomicInteger stamp = new AtomicInteger(0); - private AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); + private AtomicStampedReference account = new AtomicStampedReference<>(0, 0); public int getBalance() { - return this.balance.get(new int[1]); + return this.account.get(new int[1]); } public int getStamp() { int[] stamps = new int[1]; - this.balance.get(stamps); + this.account.get(stamps); return stamps[0]; } public boolean deposit(int funds) { int[] stamps = new int[1]; - int current = this.balance.get(stamps); + int current = this.account.get(stamps); int newStamp = this.stamp.incrementAndGet(); - return this.balance.compareAndSet(current, current + funds, stamps[0], newStamp); + return this.account.compareAndSet(current, current + funds, stamps[0], newStamp); } public boolean withdrawal(int funds) { int[] stamps = new int[1]; - int current = this.balance.get(stamps); + int current = this.account.get(stamps); int newStamp = this.stamp.incrementAndGet(); - return this.balance.compareAndSet(current, current - funds, stamps[0], newStamp); + return this.account.compareAndSet(current, current - funds, stamps[0], newStamp); } } diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadStampedAccountUnitTest.java similarity index 68% rename from core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java rename to core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadStampedAccountUnitTest.java index bd33d5b4ec..ce83355073 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadStampedAccountUnitTest.java @@ -3,11 +3,11 @@ package com.baeldung.atomicstampedreference; import org.junit.Assert; import org.junit.Test; -public class ThreadSafeAccountUnitTest { +public class ThreadStampedAccountUnitTest { @Test - public void givenMultiThread_whenSafeAccount_thenSetBalance() throws InterruptedException { - SafeAccount account = new SafeAccount(); + public void givenMultiThread_whenStampedAccount_thenSetBalance() throws InterruptedException { + StampedAccount account = new StampedAccount(); Thread t = new Thread(() -> { while (!account.withdrawal(100)) Thread.yield(); From 78e180f35d3a6de9a05bd122df6614075332a6ac Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Tue, 14 Apr 2020 19:23:11 -0600 Subject: [PATCH 433/530] BAEL-3961 Make the program more robust by only create the table when necessary and clean all data in the temp table. --- .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 3 ++- .../src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index dec88ee1f6..25d280ad12 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -45,7 +45,8 @@ public class EmployeeDAO { } public List getEmployeesFromLargeIdList(List ids) { - jdbcTemplate.execute("CREATE TEMPORARY TABLE employee_tmp (id INT NOT NULL)"); + jdbcTemplate.execute("CREATE TEMPORARY TABLE IF NOT EXISTS employee_tmp (id INT NOT NULL)"); + jdbcTemplate.update("DELETE FROM employee_tmp"); List employeeIds = new ArrayList<>(); for (Integer id : ids) { diff --git a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java index f21704221b..369725bafd 100644 --- a/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java +++ b/persistence-modules/spring-persistence-simple-2/src/test/java/com/baeldung/jdbc/EmployeeDAOUnitTest.java @@ -98,5 +98,10 @@ public class EmployeeDAOUnitTest { assertEquals(1, employees.get(0).getId()); assertEquals(3, employees.get(1).getId()); assertEquals(4, employees.get(2).getId()); + + ids.clear(); + ids.add(2); + employees = employeeDAO.getEmployeesFromLargeIdList(ids); + assertEquals(1, employees.size()); } } From 7fdcf68ccb4ef95a7555095e5cccb46b25978f78 Mon Sep 17 00:00:00 2001 From: SippingCode <55111084+SippingCode@users.noreply.github.com> Date: Wed, 15 Apr 2020 07:26:52 +0200 Subject: [PATCH 434/530] BAEL 3970 - Manual logout with Spring Security (#9075) * Manual logout with Spring Security - Basic manual logout - logout with Clear Data Site Header * Add missing annotation for controller. Change mapping URL value. * Add intergration tests for manual logouts. * BAEL-3970 - Add asserts on test. Fix tests names. Remove unused imports. --- .../manuallogout/BasicAuthController.java | 32 +++++++++ .../manuallogout/ClearSiteDataController.java | 29 ++++++++ .../manuallogout/ManualLogoutApplication.java | 11 +++ .../SimpleSecurityConfiguration.java | 39 +++++++++++ .../ManualLogoutIntegrationTest.java | 70 +++++++++++++++++++ 5 files changed, 181 insertions(+) create mode 100644 spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java create mode 100644 spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java create mode 100644 spring-5-security/src/main/java/com/baeldung/manuallogout/ManualLogoutApplication.java create mode 100644 spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java create mode 100644 spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java new file mode 100644 index 0000000000..8f01940dce --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/manuallogout/BasicAuthController.java @@ -0,0 +1,32 @@ +package com.baeldung.manuallogout; + +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +@Controller +public class BasicAuthController { + + @RequestMapping(value = {"/basiclogout"}, method = RequestMethod.POST) + public String logout(HttpServletRequest request, HttpServletResponse response) { + HttpSession session; + SecurityContextHolder.clearContext(); + session = request.getSession(false); + if (session != null) { + session.invalidate(); + } + for (Cookie cookie : request.getCookies()) { + String cookieName = cookie.getName(); + Cookie cookieToDelete = new Cookie(cookieName, null); + cookieToDelete.setMaxAge(0); + response.addCookie(cookieToDelete); + } + return "redirect:/login?logout"; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java new file mode 100644 index 0000000000..7eef397da3 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/manuallogout/ClearSiteDataController.java @@ -0,0 +1,29 @@ +package com.baeldung.manuallogout; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.logout.HeaderWriterLogoutHandler; +import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter; +import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Controller +public class ClearSiteDataController { + + Directive[] SOURCE = {Directive.COOKIES, Directive.STORAGE, Directive.EXECUTION_CONTEXTS, Directive.CACHE}; + + @RequestMapping(value = {"/csdlogout"}, method = RequestMethod.POST) + public String logout(HttpServletRequest request, HttpServletResponse response) { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth != null) { + ClearSiteDataHeaderWriter csdHeaderWriter = new ClearSiteDataHeaderWriter(SOURCE); + new HeaderWriterLogoutHandler(csdHeaderWriter).logout(request, response, auth); + } + return "redirect:/login?logout"; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/ManualLogoutApplication.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/ManualLogoutApplication.java new file mode 100644 index 0000000000..50ea356f03 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/manuallogout/ManualLogoutApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.manuallogout; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ManualLogoutApplication { + public static void main(String[] args) { + SpringApplication.run(ManualLogoutApplication.class, args); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java b/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java new file mode 100644 index 0000000000..6f14f6fca2 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java @@ -0,0 +1,39 @@ +package com.baeldung.manuallogout; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class SimpleSecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.formLogin() + .loginProcessingUrl("/login") + .loginPage("/login") + .usernameParameter("username") + .passwordParameter("password") + .defaultSuccessUrl("/") + .failureUrl("/login?error"); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("user") + .password("password") + .roles("USER") + .and() + .withUser("manager") + .password("password") + .credentialsExpired(true) + .accountExpired(true) + .accountLocked(true) + .authorities("WRITE_PRIVILEGES", "READ_PRIVILEGES") + .roles("MANAGER"); + } +} diff --git a/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java b/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java new file mode 100644 index 0000000000..a64cb82910 --- /dev/null +++ b/spring-5-security/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java @@ -0,0 +1,70 @@ +package com.baeldung.manuallogout; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpSession; + +import static org.junit.Assert.assertNull; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@RunWith(SpringRunner.class) +@WebMvcTest() +public class ManualLogoutIntegrationTest { + + private static final String CLEAR_SITE_DATA_HEADER = "Clear-Site-Data"; + public static final int EXPIRY = 60 * 10; + public static final String COOKIE_NAME = "customerName"; + public static final String COOKIE_VALUE = "myName"; + public static final String ATTRIBUTE_NAME = "att"; + public static final String ATTRIBUTE_VALUE = "attvalue"; + + @Autowired + private MockMvc mockMvc; + + @WithMockUser(value = "spring") + @Test + public void givenLoggedUserWhenUserLogoutThenSessionCleared() throws Exception { + + MockHttpSession session = new MockHttpSession(); + session.setAttribute(ATTRIBUTE_NAME, ATTRIBUTE_VALUE); + + Cookie randomCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + randomCookie.setMaxAge(EXPIRY); // 10 minutes + + MockHttpServletRequest requestStateAfterLogout = this.mockMvc.perform(post("/basiclogout").secure(true).with(csrf()).session(session).cookie(randomCookie)) + .andExpect(status().is3xxRedirection()) + .andExpect(unauthenticated()) + .andExpect(cookie().maxAge(COOKIE_NAME, 0)) + .andReturn() + .getRequest(); + + HttpSession sessionStateAfterLogout = requestStateAfterLogout.getSession(); + assertNull(sessionStateAfterLogout.getAttribute(ATTRIBUTE_NAME)); + + + } + + @WithMockUser(value = "spring") + @Test + public void givenLoggedUserWhenUserLogoutThenClearDataSiteHeaderPresent() throws Exception { + + this.mockMvc.perform(post("/csdlogout").secure(true).with(csrf())) + .andDo(print()) + .andExpect(status().is3xxRedirection()) + .andExpect(header().exists(CLEAR_SITE_DATA_HEADER)) + .andReturn(); + } +} \ No newline at end of file From 8c77609793091995b2bf77f4dd3e14ada27a7997 Mon Sep 17 00:00:00 2001 From: Aitor Cuesta Date: Wed, 15 Apr 2020 08:01:26 +0200 Subject: [PATCH 435/530] BAEL-3075 - Removing byte-buddy dependency --- persistence-modules/spring-boot-persistence-2/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index fd7cc467f9..9f456fa8af 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -51,11 +51,6 @@ spring-boot-starter-data-jpa - - net.bytebuddy - byte-buddy - - org.jdbi jdbi3-spring4 From 86c4eea3dd95a0e98e6bb882e482fe0702adbd20 Mon Sep 17 00:00:00 2001 From: Belma Jakupovic Date: Wed, 15 Apr 2020 21:15:59 +0200 Subject: [PATCH 436/530] additional answers mockito change repository method (#9082) --- .../mockito/additionalanswers/BookRepository.java | 15 +++++++++++---- .../mockito/additionalanswers/BookService.java | 4 ++-- .../additionalanswers/BookServiceUnitTest.java | 12 ++++++------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java index 78187e3f01..677ee502b4 100644 --- a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java @@ -1,5 +1,9 @@ package com.baeldung.mockito.additionalanswers; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class BookRepository { public Book getByBookId(Long bookId) { return new Book(bookId, "To Kill a Mocking Bird", "Harper Lee", 256); @@ -9,9 +13,12 @@ public class BookRepository { return new Book(book.getBookId(), book.getTitle(), book.getAuthor(), book.getNumberOfPages()); } - public Book checkIfEquals(Book bookOne, Book bookTwo, Book bookThree) { - if (bookOne.equals(bookTwo) && bookTwo.equals(bookThree) && bookThree.equals(bookOne)) { - return bookOne; - } else return bookTwo; + public Book selectRandomBook(Book bookOne, Book bookTwo, Book bookThree) { + List selection = new ArrayList<>(); + selection.add(bookOne); + selection.add(bookTwo); + selection.add(bookThree); + Random random = new Random(); + return selection.get(random.nextInt(selection.size())); } } diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java index 92c01f8a70..4499a6524b 100644 --- a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java @@ -15,8 +15,8 @@ public class BookService { return bookRepository.save(book); } - public Book checkifEquals(Book book1, Book book2, Book book3) { - return bookRepository.checkIfEquals(book1, book2, book3); + public Book selectRandomBook(Book book1, Book book2, Book book3) { + return bookRepository.selectRandomBook(book1, book2, book3); } } diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java index c9527ec0ec..ee32bcf70c 100644 --- a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java @@ -34,9 +34,9 @@ public class BookServiceUnitTest { Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); - Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsSecondArg()); + Mockito.when(bookRepository.selectRandomBook(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsSecondArg()); - Book secondBook = bookService.checkifEquals(book1, book2, book3); + Book secondBook = bookService.selectRandomBook(book1, book2, book3); assertEquals(secondBook, book2); } @@ -47,9 +47,9 @@ public class BookServiceUnitTest { Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); - Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsLastArg()); + Mockito.when(bookRepository.selectRandomBook(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsLastArg()); - Book lastBook = bookService.checkifEquals(book1, book2, book3); + Book lastBook = bookService.selectRandomBook(book1, book2, book3); assertEquals(lastBook, book3); } @@ -59,9 +59,9 @@ public class BookServiceUnitTest { Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); - Mockito.when(bookRepository.checkIfEquals(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsArgAt(1)); + Mockito.when(bookRepository.selectRandomBook(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsArgAt(1)); - Book bookOnIndex = bookService.checkifEquals(book1, book2, book3); + Book bookOnIndex = bookService.selectRandomBook(book1, book2, book3); assertEquals(bookOnIndex, book2); } From 23099cff16320fcd96c677b824c10b3caa723574 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Wed, 15 Apr 2020 21:19:02 +0200 Subject: [PATCH 437/530] BAEL-3994: Add example of chaining methods returning Optionals (#9102) * BAEL-3994: Add example of chaining methods returning Optionals * BAEL-3994: Update --- .../orelseoptional/ItemsProvider.java | 21 +++++++++++++++ .../OrElseOptionalUnitTest.java | 26 +++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-optional/src/main/java/com/baeldung/orelseoptional/ItemsProvider.java diff --git a/core-java-modules/core-java-optional/src/main/java/com/baeldung/orelseoptional/ItemsProvider.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/orelseoptional/ItemsProvider.java new file mode 100644 index 0000000000..480dc782e4 --- /dev/null +++ b/core-java-modules/core-java-optional/src/main/java/com/baeldung/orelseoptional/ItemsProvider.java @@ -0,0 +1,21 @@ +package com.baeldung.orelseoptional; + +import java.util.Optional; + +public class ItemsProvider { + + Optional getEmptyItem() { + System.out.println("Returning an empty item"); + return Optional.empty(); + } + + Optional getNail() { + System.out.println("Returning a nail"); + return Optional.of("nail"); + } + + Optional getHammer() { + System.out.println("Returning a hammer"); + return Optional.of("hammer"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-optional/src/test/java/com/baeldung/orelseoptional/OrElseOptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/orelseoptional/OrElseOptionalUnitTest.java index 91aebbeebd..e3bdedcd82 100644 --- a/core-java-modules/core-java-optional/src/test/java/com/baeldung/orelseoptional/OrElseOptionalUnitTest.java +++ b/core-java-modules/core-java-optional/src/test/java/com/baeldung/orelseoptional/OrElseOptionalUnitTest.java @@ -1,10 +1,10 @@ package com.baeldung.orelseoptional; -import static org.junit.Assert.assertEquals; +import org.junit.Test; import java.util.Optional; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class OrElseOptionalUnitTest { @@ -25,6 +25,28 @@ public class OrElseOptionalUnitTest { assertEquals(fallbackOptionalString, OptionalUtils.or(optionalString, fallbackOptionalString)); } + @Test + public void givenTwoOptionalMethods_whenFirstEmpty_thenSecondEvaluated() { + ItemsProvider itemsProvider = new ItemsProvider(); + + Optional item = itemsProvider.getEmptyItem() + .map(Optional::of) + .orElseGet(itemsProvider::getNail); + + assertEquals(Optional.of("nail"), item); + } + + @Test + public void givenTwoOptionalMethods_whenFirstNonEmpty_thenSecondNotEvaluated() { + ItemsProvider itemsProvider = new ItemsProvider(); + + Optional item = itemsProvider.getNail() + .map(Optional::of) + .orElseGet(itemsProvider::getHammer); + + assertEquals(Optional.of("nail"), item); + } + // Uncomment code when code base is compatible with Java 9 // @Test // public void givenOptional_whenEmptyValue_thenCustomMessage() { From ddf9da34bfcee9a28c3384a72967cd37b8073016 Mon Sep 17 00:00:00 2001 From: mikr Date: Wed, 15 Apr 2020 22:29:52 +0200 Subject: [PATCH 438/530] JAVA-617 Split or move core-java-datetime-java8 module --- .../core-java-datetime-java8-2/README.md | 2 ++ .../com/baeldung/random/LegacyRandomDateTimes.java | 0 .../java/com/baeldung/random/RandomDateTimes.java | 0 .../main/java/com/baeldung/random/RandomDates.java | 0 .../main/java/com/baeldung/random/RandomTimes.java | 0 .../baeldung/localdate/LocalDateExampleUnitTest.java | 12 ++++++------ .../random/LegacyRandomDateTimesUnitTest.java | 0 .../com/baeldung/random/RandomDateTimesUnitTest.java | 0 .../com/baeldung/random/RandomDatesUnitTest.java | 0 .../com/baeldung/random/RandomTimesUnitTest.java | 0 core-java-modules/core-java-datetime-java8/README.md | 2 +- 11 files changed, 9 insertions(+), 7 deletions(-) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/main/java/com/baeldung/random/RandomDateTimes.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/main/java/com/baeldung/random/RandomDates.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/main/java/com/baeldung/random/RandomTimes.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/test/java/com/baeldung/random/RandomDatesUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-datetime-java8-2}/src/test/java/com/baeldung/random/RandomTimesUnitTest.java (100%) diff --git a/core-java-modules/core-java-datetime-java8-2/README.md b/core-java-modules/core-java-datetime-java8-2/README.md index e53d0236c2..f16563aacc 100644 --- a/core-java-modules/core-java-datetime-java8-2/README.md +++ b/core-java-modules/core-java-datetime-java8-2/README.md @@ -1,3 +1,5 @@ ### Relevant Articles: +- [Generating Random Dates in Java](https://www.baeldung.com/java-random-dates) - [Creating a LocalDate with Values in Java](https://www.baeldung.com/java-creating-localdate-with-values) +- [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) \ No newline at end of file diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java b/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java rename to core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/RandomDateTimes.java b/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDateTimes.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/RandomDateTimes.java rename to core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDateTimes.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/RandomDates.java b/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDates.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/RandomDates.java rename to core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDates.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/RandomTimes.java b/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomTimes.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/random/RandomTimes.java rename to core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomTimes.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java b/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java index dff15486a4..d65118ba3a 100644 --- a/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java +++ b/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java @@ -11,31 +11,31 @@ public class LocalDateExampleUnitTest { @Test public void givenValues_whenUsingOfMethod_thenLocalDate() { - assertEquals("2020-01-08", date.getCustomDateOne(2020, 1, 8)); + assertEquals("2020-01-08", date.getCustomDateOne(2020, 1, 8).toString()); } @Test public void givenValuesWithMonthEnum_whenUsingOfMethod_thenLocalDate() { - assertEquals("2020-01-08", date.getCustomDateTwo(2020, Month.JANUARY, 8)); + assertEquals("2020-01-08", date.getCustomDateTwo(2020, Month.JANUARY, 8).toString()); } @Test public void givenValues_whenUsingEpochDay_thenLocalDate() { - assertEquals("2020-01-08", date.getDateFromEpochDay(18269)); + assertEquals("2020-01-08", date.getDateFromEpochDay(18269).toString()); } @Test public void givenValues_whenUsingYearDay_thenLocalDate() { - assertEquals("2020-01-08", date.getDateFromYearAndDayOfYear(2020, 8)); + assertEquals("2020-01-08", date.getDateFromYearAndDayOfYear(2020, 8).toString()); } @Test public void givenValues_whenUsingParse_thenLocalDate() { - assertEquals("2020-01-08", date.getDateFromString("2020-01-08")); + assertEquals("2020-01-08", date.getDateFromString("2020-01-08").toString()); } @Test public void givenValuesWithFormatter_whenUsingParse_thenLocalDate() { - assertEquals("2020-01-08", date.getDateFromStringAndFormatter("8-Jan-2020", "d-MMM-yyyy")); + assertEquals("2020-01-08", date.getDateFromStringAndFormatter("8-Jan-2020", "d-MMM-yyyy").toString()); } } diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java b/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java rename to core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java b/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java rename to core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/RandomDatesUnitTest.java b/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/RandomDatesUnitTest.java rename to core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/RandomTimesUnitTest.java b/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomTimesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/random/RandomTimesUnitTest.java rename to core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomTimesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/README.md b/core-java-modules/core-java-datetime-java8/README.md index dfbe9c997f..c35683a589 100644 --- a/core-java-modules/core-java-datetime-java8/README.md +++ b/core-java-modules/core-java-datetime-java8/README.md @@ -13,4 +13,4 @@ This module contains articles about the Date and Time API introduced with Java 8 - [How to Get the Start and the End of a Day using Java](http://www.baeldung.com/java-day-start-end) - [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone) - [Comparing Dates in Java](https://www.baeldung.com/java-comparing-dates) -- [Generating Random Dates in Java](https://www.baeldung.com/java-random-dates) +- [[Next -->]](/core-java-modules/core-java-datetime-java8-2) From 926614e12944c6a12aae61c6af1e9be8c32f5efa Mon Sep 17 00:00:00 2001 From: mikr Date: Wed, 15 Apr 2020 23:04:39 +0200 Subject: [PATCH 439/530] JAVA-615 Split or move algorithms-sorting module --- algorithms-sorting-2/README.md | 4 ++++ .../algorithms}/bynumber/NaturalOrderComparators.java | 2 +- .../java/com/baeldung/algorithms/inoutsort/InOutSort.java | 0 .../com/baeldung/algorithms/stringsort/AnagramValidator.java | 0 .../bynumber/NaturalOrderComparatorsUnitTest.java | 3 +-- .../com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java | 0 .../algorithms/stringsort/AnagramValidatorUnitTest.java | 0 .../baeldung/algorithms/stringsort/SortStringUnitTest.java | 0 algorithms-sorting/README.md | 5 +---- 9 files changed, 7 insertions(+), 7 deletions(-) rename {algorithms-sorting/src/main/java/com/baeldung/algorithms/sort => algorithms-sorting-2/src/main/java/com/baeldung/algorithms}/bynumber/NaturalOrderComparators.java (94%) rename {algorithms-sorting => algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java (100%) rename {algorithms-sorting => algorithms-sorting-2}/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java (100%) rename {algorithms-sorting/src/test/java/com/baeldung/algorithms/sort => algorithms-sorting-2/src/test/java/com/baeldung/algorithms}/bynumber/NaturalOrderComparatorsUnitTest.java (95%) rename {algorithms-sorting => algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java (100%) rename {algorithms-sorting => algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java (100%) rename {algorithms-sorting => algorithms-sorting-2}/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java (100%) diff --git a/algorithms-sorting-2/README.md b/algorithms-sorting-2/README.md index 897621bc41..71c9b8f86c 100644 --- a/algorithms-sorting-2/README.md +++ b/algorithms-sorting-2/README.md @@ -1,3 +1,7 @@ ### Relevant Articles: +- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically) +- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers) +- [How an In-Place Sorting Algorithm Works](https://www.baeldung.com/java-in-place-sorting) - [Partitioning and Sorting Arrays with Many Repeated Entries](https://www.baeldung.com/java-sorting-arrays-with-repeated-entries) +- More articles: [[<-- prev]](/algorithms-sorting) diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparators.java b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java similarity index 94% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparators.java rename to algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java index b177bd60fc..148a9a21f9 100644 --- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparators.java +++ b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/bynumber/NaturalOrderComparators.java @@ -1,4 +1,4 @@ -package com.baeldung.algorithms.sort.bynumber; +package com.baeldung.algorithms.bynumber; import java.util.Comparator; diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java rename to algorithms-sorting-2/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java b/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java similarity index 100% rename from algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java rename to algorithms-sorting-2/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparatorsUnitTest.java b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java similarity index 95% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparatorsUnitTest.java rename to algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java index 2f05f62147..aaa5de87e1 100644 --- a/algorithms-sorting/src/test/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparatorsUnitTest.java +++ b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java @@ -1,6 +1,5 @@ -package com.baeldung.algorithms.sort.bynumber; +package com.baeldung.algorithms.bynumber; -import com.baeldung.algorithms.sort.bynumber.NaturalOrderComparators; import org.junit.Test; import java.util.ArrayList; diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java rename to algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java rename to algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java b/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java similarity index 100% rename from algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java rename to algorithms-sorting-2/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md index 15a5ec6e02..b4b90bf954 100644 --- a/algorithms-sorting/README.md +++ b/algorithms-sorting/README.md @@ -11,10 +11,7 @@ This module contains articles about sorting algorithms. - [Heap Sort in Java](https://www.baeldung.com/java-heap-sort) - [Shell Sort in Java](https://www.baeldung.com/java-shell-sort) - [Counting Sort in Java](https://www.baeldung.com/java-counting-sort) -- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers) -- [How an In-Place Sorting Algorithm Works](https://www.baeldung.com/java-in-place-sorting) - [Selection Sort in Java](https://www.baeldung.com/java-selection-sort) -- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers) - [Radix Sort in Java](https://www.baeldung.com/java-radix-sort) -- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically) - [Bucket Sort in Java](https://www.baeldung.com/java-bucket-sort) +- More articles: [[next -->]](/algorithms-sorintg-2) From 1239da8e6d88af335f060ae4f04e0ecade4a8fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20G=C5=82=C3=B3wka?= Date: Thu, 16 Apr 2020 21:23:23 +0200 Subject: [PATCH 440/530] BAEL-3505: Added util class to check server connection (#9013) * BAEL-3505: Added util class to check server connection * fixed formatting * removed unnecessary sout --- .../connectexception/ConnectionChecker.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 core-java-modules/core-java-networking-2/src/main/java/com/baeldung/connectexception/ConnectionChecker.java diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/connectexception/ConnectionChecker.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/connectexception/ConnectionChecker.java new file mode 100644 index 0000000000..360fb6ecaa --- /dev/null +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/connectexception/ConnectionChecker.java @@ -0,0 +1,24 @@ +package com.baeldung.connectexception; + +import java.net.ConnectException; +import java.net.Socket; + +public class ConnectionChecker { + public static void main(String[] args) { + String host = "localhost"; + int port = 5000; + + try { + Socket clientSocket = new Socket(host, port); + + // successfully connected to host, do something with opened socket + + clientSocket.close(); + } catch (ConnectException e) { + // host and port combination not valid + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} From 2815700ebffd2e4caf655aed04afb90dc7fffb44 Mon Sep 17 00:00:00 2001 From: vatsalgosar Date: Fri, 17 Apr 2020 01:10:04 +0530 Subject: [PATCH 441/530] BAEL-3919 (#9072) BAEL-3919 code --- .../ComputeIfAbsentUnitTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/computeifabsent/ComputeIfAbsentUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/computeifabsent/ComputeIfAbsentUnitTest.java b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/computeifabsent/ComputeIfAbsentUnitTest.java new file mode 100644 index 0000000000..391a059f05 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/computeifabsent/ComputeIfAbsentUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.map.computeifabsent; + +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class ComputeIfAbsentUnitTest { + + @Test + public void whenKeyIsPresent_thenFetchTheValue() { + Map stringLength = new HashMap<>(); + stringLength.put("John", 5); + assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 5); + } + + @Test + public void whenKeyIsNotPresent_thenComputeTheValueUsingMappingFunctionAndStore() { + Map stringLength = new HashMap<>(); + assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 4); + assertEquals((long)stringLength.get("John"), 4); + } + + @Test + public void whenMappingFunctionReturnsNull_thenDoNotRecordMapping() { + Map stringLength = new HashMap<>(); + assertEquals(stringLength.computeIfAbsent("John", s -> null), null); + assertNull(stringLength.get("John")); + } + + @Test(expected = RuntimeException.class) + public void whenMappingFunctionThrowsException_thenExceptionIsRethrown() { + Map stringLength = new HashMap<>(); + stringLength.computeIfAbsent("John", s -> {throw new RuntimeException();}); + } +} From 6ceff529ad9ed33614e52198018d31ac38961050 Mon Sep 17 00:00:00 2001 From: Mona Mohamadinia Date: Fri, 17 Apr 2020 00:17:10 +0430 Subject: [PATCH 442/530] Added a few code snippets (#9084) --- .../closure/StreamClosureSnippets.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/closure/StreamClosureSnippets.java diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/closure/StreamClosureSnippets.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/closure/StreamClosureSnippets.java new file mode 100644 index 0000000000..10e5716e31 --- /dev/null +++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/closure/StreamClosureSnippets.java @@ -0,0 +1,30 @@ +package com.baeldung.streams.closure; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.stream.Stream; + +/** + * Contains a couple of simple stream API usages. + */ +public class StreamClosureSnippets { + + public static void main(String[] args) throws IOException { + // Collection based streams shouldn't be closed + Arrays.asList("Red", "Blue", "Green") + .stream() + .filter(c -> c.length() > 4) + .map(String::toUpperCase) + .forEach(System.out::print); + + String[] colors = {"Red", "Blue", "Green"}; + Arrays.stream(colors).map(String::toUpperCase).forEach(System.out::println); + + // IO-Based Streams Should be Closed via Try with Resources + try (Stream lines = Files.lines(Paths.get("/path/tp/file"))) { + // lines will be closed after exiting the try block + } + } +} From e41a34fc057d591a67276c566f2c9db579103797 Mon Sep 17 00:00:00 2001 From: Dhrubajyoti Bhattacharjee Date: Fri, 17 Apr 2020 08:15:36 +0200 Subject: [PATCH 443/530] Bael 2980 move c ra sh article to new module (#9103) --- pom.xml | 1 + spring-mvc-crash/.gitignore | 13 ++ spring-mvc-crash/README.md | 11 ++ spring-mvc-crash/pom.xml | 176 ++++++++++++++++++ .../com/baeldung/spring/ClientWebConfig.java | 16 ++ .../baeldung/spring/ClientWebConfigJava.java | 33 ++++ .../spring/controller/WelcomeController.java | 18 ++ .../contentManagementWebMvcConfig.xml | 42 +++++ .../src/main/resources/logback.xml | 19 ++ .../src/main/resources/messages.properties | 2 + .../src/main/resources/webMvcConfig.xml | 38 ++++ .../WEB-INF/crash/commands/message.groovy | 14 ++ .../WEB-INF/crash/commands/message2.java | 14 ++ .../webapp/WEB-INF/crash/crash.properties | 1 + .../webapp/WEB-INF/crash/telnet.properties | 65 +++++++ .../src/main/webapp/WEB-INF/mvc-servlet.xml | 52 ++++++ .../src/main/webapp/WEB-INF/view/error.jsp | 20 ++ .../main/webapp/WEB-INF/view/errorPage.jsp | 10 + .../src/main/webapp/WEB-INF/view/welcome.jsp | 15 ++ .../src/main/webapp/WEB-INF/web.xml | 70 +++++++ spring-mvc-crash/src/main/webapp/index.jsp | 20 ++ .../src/main/webapp/jsp/ExampleThree.jsp | 10 + .../src/main/webapp/jsp/ExampleTwo.jsp | 13 ++ .../src/main/webapp/jsp/index.jsp | 12 ++ .../java/com/baeldung/SpringContextTest.java | 19 ++ spring-mvc-xml/README.md | 1 - 26 files changed, 704 insertions(+), 1 deletion(-) create mode 100644 spring-mvc-crash/.gitignore create mode 100644 spring-mvc-crash/README.md create mode 100644 spring-mvc-crash/pom.xml create mode 100644 spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfig.java create mode 100644 spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfigJava.java create mode 100644 spring-mvc-crash/src/main/java/com/baeldung/spring/controller/WelcomeController.java create mode 100644 spring-mvc-crash/src/main/resources/contentManagementWebMvcConfig.xml create mode 100644 spring-mvc-crash/src/main/resources/logback.xml create mode 100644 spring-mvc-crash/src/main/resources/messages.properties create mode 100644 spring-mvc-crash/src/main/resources/webMvcConfig.xml create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message.groovy create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message2.java create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/crash/crash.properties create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/crash/telnet.properties create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/mvc-servlet.xml create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/view/error.jsp create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/view/errorPage.jsp create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/view/welcome.jsp create mode 100644 spring-mvc-crash/src/main/webapp/WEB-INF/web.xml create mode 100644 spring-mvc-crash/src/main/webapp/index.jsp create mode 100644 spring-mvc-crash/src/main/webapp/jsp/ExampleThree.jsp create mode 100644 spring-mvc-crash/src/main/webapp/jsp/ExampleTwo.jsp create mode 100644 spring-mvc-crash/src/main/webapp/jsp/index.jsp create mode 100644 spring-mvc-crash/src/test/java/com/baeldung/SpringContextTest.java diff --git a/pom.xml b/pom.xml index 99d0943582..9e3b354d74 100644 --- a/pom.xml +++ b/pom.xml @@ -1202,6 +1202,7 @@ spring-mvc-views spring-mvc-webflow spring-mvc-xml + spring-mvc-crash spring-protobuf spring-quartz diff --git a/spring-mvc-crash/.gitignore b/spring-mvc-crash/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-mvc-crash/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-mvc-crash/README.md b/spring-mvc-crash/README.md new file mode 100644 index 0000000000..f158a947b6 --- /dev/null +++ b/spring-mvc-crash/README.md @@ -0,0 +1,11 @@ +## Spring MVC XML + +This module contains articles about Spring MVC with XML configuration + +### Relevant Articles: + +- [Getting Started with CRaSH](https://www.baeldung.com/jvm-crash-shell) + +## Spring MVC with XML Configuration Example Project + +- access a sample jsp page at: `http://localhost:8080/spring-mvc-crash/welcome.htm \ No newline at end of file diff --git a/spring-mvc-crash/pom.xml b/spring-mvc-crash/pom.xml new file mode 100644 index 0000000000..d23e18361b --- /dev/null +++ b/spring-mvc-crash/pom.xml @@ -0,0 +1,176 @@ + + + 4.0.0 + spring-mvc-crash + 0.1-SNAPSHOT + spring-mvc-xml + war + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + + + org.springframework + spring-web + ${org.springframework.version} + + + org.springframework + spring-webmvc + ${org.springframework.version} + + + + + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + provided + + + + javax.servlet + jstl + ${jstl.version} + runtime + + + + org.hibernate.validator + hibernate-validator + ${hibernate-validator.version} + + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + commons-io + commons-io + ${commons-io.version} + + + com.maxmind.geoip2 + geoip2 + ${geoip2.version} + + + com.fasterxml.jackson.core + jackson-databind + + + commons-logging + commons-logging + + + + + org.glassfish + javax.el + ${javax.el.version} + + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + + + org.crashub + crash.embed.spring + ${crash.version} + + + org.crashub + crash.cli + ${crash.version} + + + org.crashub + crash.connectors.telnet + ${crash.version} + + + log4j + log4j + + + + + + + org.codehaus.groovy + groovy + ${groovy.version} + + + + + spring-mvc-xml + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + + + + + + + 5.0.2.RELEASE + 1.5.10.RELEASE + + + 5.1.40 + + + 4.4.5 + 4.5.2 + + + 6.0.10.Final + 3.0.1-b08 + + + 19.0 + 2.8.0 + + + 1.6.1 + + 1.3.2 + 3.0.0-rc-3 + + + + diff --git a/spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfig.java b/spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfig.java new file mode 100644 index 0000000000..cc60a1ff8f --- /dev/null +++ b/spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfig.java @@ -0,0 +1,16 @@ +package com.baeldung.spring; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@ImportResource("classpath:webMvcConfig.xml") +@Configuration +@ComponentScan +public class ClientWebConfig implements WebMvcConfigurer { + + public ClientWebConfig() { + super(); + } +} \ No newline at end of file diff --git a/spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfigJava.java b/spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfigJava.java new file mode 100644 index 0000000000..55af23034f --- /dev/null +++ b/spring-mvc-crash/src/main/java/com/baeldung/spring/ClientWebConfigJava.java @@ -0,0 +1,33 @@ +package com.baeldung.spring; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; + +@ComponentScan("com.baeldung.spring") +public class ClientWebConfigJava implements WebMvcConfigurer { + + public ClientWebConfigJava() { + super(); + } + + @Bean + public ViewResolver viewResolver() { + final InternalResourceViewResolver bean = new InternalResourceViewResolver(); + + bean.setViewClass(JstlView.class); + bean.setPrefix("/WEB-INF/view/"); + bean.setSuffix(".jsp"); + + return bean; + } + + @Bean + public MethodValidationPostProcessor methodValidationPostProcessor() { + return new MethodValidationPostProcessor(); + } +} \ No newline at end of file diff --git a/spring-mvc-crash/src/main/java/com/baeldung/spring/controller/WelcomeController.java b/spring-mvc-crash/src/main/java/com/baeldung/spring/controller/WelcomeController.java new file mode 100644 index 0000000000..526833611b --- /dev/null +++ b/spring-mvc-crash/src/main/java/com/baeldung/spring/controller/WelcomeController.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.AbstractController; + +public class WelcomeController extends AbstractController { + @Override + protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + + ModelAndView model = new ModelAndView("welcome"); + model.addObject("msg", "Welcome to Introduction to CRaSH article from Baeldung"); + + return model; + } +} \ No newline at end of file diff --git a/spring-mvc-crash/src/main/resources/contentManagementWebMvcConfig.xml b/spring-mvc-crash/src/main/resources/contentManagementWebMvcConfig.xml new file mode 100644 index 0000000000..8a0671ca87 --- /dev/null +++ b/spring-mvc-crash/src/main/resources/contentManagementWebMvcConfig.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-mvc-crash/src/main/resources/logback.xml b/spring-mvc-crash/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/spring-mvc-crash/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-mvc-crash/src/main/resources/messages.properties b/spring-mvc-crash/src/main/resources/messages.properties new file mode 100644 index 0000000000..2a3cccf76c --- /dev/null +++ b/spring-mvc-crash/src/main/resources/messages.properties @@ -0,0 +1,2 @@ +required.name = Name is required! +NotEmpty.person.password = Password is required! \ No newline at end of file diff --git a/spring-mvc-crash/src/main/resources/webMvcConfig.xml b/spring-mvc-crash/src/main/resources/webMvcConfig.xml new file mode 100644 index 0000000000..4bdb405237 --- /dev/null +++ b/spring-mvc-crash/src/main/resources/webMvcConfig.xml @@ -0,0 +1,38 @@ + + + + + + + + + image/jpeg + image/png + + + + + + + + + + + + + + + + + + + diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message.groovy b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message.groovy new file mode 100644 index 0000000000..d66ab13d96 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message.groovy @@ -0,0 +1,14 @@ +import org.crsh.cli.Command; +import org.crsh.cli.Usage; +import org.crsh.cli.Option; + +class message { + + @Usage("show my own message") + @Command + Object main(@Usage("custom message") @Option(names=["m","message"]) String message) { + if (message == null) + message = "No message given..."; + return message; + } +} \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message2.java b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message2.java new file mode 100644 index 0000000000..d1ead88024 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/commands/message2.java @@ -0,0 +1,14 @@ +import org.crsh.command.BaseCommand; +import org.crsh.cli.Usage; +import org.crsh.cli.Command; +import org.crsh.cli.Option; + +public class message2 extends BaseCommand { + @Usage("show my own message using java") + @Command + public Object main(@Usage("custom message") @Option(names = { "m", "message" }) String message) { + if (message == null) + message = "No message given..."; + return message; + } +} \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/crash/crash.properties b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/crash.properties new file mode 100644 index 0000000000..f9ad0d7cf6 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/crash.properties @@ -0,0 +1 @@ +crash.telnet.port=50001 diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/crash/telnet.properties b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/telnet.properties new file mode 100644 index 0000000000..99071d09ff --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/crash/telnet.properties @@ -0,0 +1,65 @@ +############################ +# Telnet daemon properties # +############################ + +##################### +# Terminals Section # +##################### + +# List of terminals available and defined below +terminals=vt100,ansi,windoof,xterm + +# vt100 implementation and aliases +term.vt100.class=net.wimpi.telnetd.io.terminal.vt100 +term.vt100.aliases=default,vt100-am,vt102,dec-vt100 + +# ansi implementation and aliases +term.ansi.class=net.wimpi.telnetd.io.terminal.ansi +term.ansi.aliases=color-xterm,xterm-color,vt320,vt220,linux,screen + +# windoof implementation and aliases +term.windoof.class=net.wimpi.telnetd.io.terminal.Windoof +term.windoof.aliases= + +# xterm implementation and aliases +term.xterm.class=net.wimpi.telnetd.io.terminal.xterm +term.xterm.aliases= + +################## +# Shells Section # +################## + +# List of shells available and defined below +shells=simple + +# shell implementations +shell.simple.class=org.crsh.telnet.term.TelnetHandler + +##################### +# Listeners Section # +##################### +listeners=std + + +# std listener specific properties + +#Basic listener and connection management settings (port is commented because CRaSH configures it) +# std.port=5000 +std.floodprotection=5 +std.maxcon=25 + + +# Timeout Settings for connections (ms) +std.time_to_warning=3600000 +std.time_to_timedout=60000 + +# Housekeeping thread active every 1 secs +std.housekeepinginterval=1000 + +std.inputmode=character + +# Login shell +std.loginshell=simple + +# Connection filter class +std.connectionfilter=none \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-crash/src/main/webapp/WEB-INF/mvc-servlet.xml new file mode 100644 index 0000000000..46b159d984 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/mvc-servlet.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + welcomeController + welcomeController + + + + + + + + + + + + + + 5000 + + + + diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/view/error.jsp b/spring-mvc-crash/src/main/webapp/WEB-INF/view/error.jsp new file mode 100644 index 0000000000..8f3d83af17 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/view/error.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +SpringMVCExample + + + +

Pleas enter the correct details

+ + + + +
Retry
+ + + + \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/view/errorPage.jsp b/spring-mvc-crash/src/main/webapp/WEB-INF/view/errorPage.jsp new file mode 100644 index 0000000000..ba8a836285 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/view/errorPage.jsp @@ -0,0 +1,10 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%@ page session="false"%> + + + Home + + +

${errorMsg}

+ + diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/view/welcome.jsp b/spring-mvc-crash/src/main/webapp/WEB-INF/view/welcome.jsp new file mode 100644 index 0000000000..348ca652ff --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/view/welcome.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +Welcome Page + + +

Welcome to ${msg}

+
+

+ Go to spring handler mappings homepage + + \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/WEB-INF/web.xml b/spring-mvc-crash/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..4a3d6cb321 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,70 @@ + + + Spring MVC XML Application + + + + contextClass + + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + + contextConfigLocation + com.baeldung.spring + + + + org.springframework.web.context.ContextLoaderListener + + + org.crsh.plugin.WebPluginLifeCycle + + + + + mvc + org.springframework.web.servlet.DispatcherServlet + 1 + + + mvc + / + + + + + + ExampleOne + com.baeldung.jsp.ExampleOne + + + ExampleOne + /jsp/ExampleOne + + + ExampleThree + com.baeldung.jsp.ExampleThree + + + ExampleThree + /jsp/ExampleThree + + + + + + 10 + + + index.jsp + + + + /errors + + diff --git a/spring-mvc-crash/src/main/webapp/index.jsp b/spring-mvc-crash/src/main/webapp/index.jsp new file mode 100644 index 0000000000..149fc5fe0b --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/index.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +Spring MVC Examples + + + +

Spring MVC Examples

+ + + + \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/jsp/ExampleThree.jsp b/spring-mvc-crash/src/main/webapp/jsp/ExampleThree.jsp new file mode 100644 index 0000000000..665eb86a30 --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/jsp/ExampleThree.jsp @@ -0,0 +1,10 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Java Binding Example + + +

Bound Value

+

You said: ${text}

+ + \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/jsp/ExampleTwo.jsp b/spring-mvc-crash/src/main/webapp/jsp/ExampleTwo.jsp new file mode 100644 index 0000000000..7b2247638d --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/jsp/ExampleTwo.jsp @@ -0,0 +1,13 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Java in Static Page Example + + +

Java in Static Page Example

+ <% String[] arr = {"What's up?", "Hello", "It's a nice day today!"}; + String greetings = arr[(int)(Math.random() * arr.length)]; + %> +

<%= greetings %>

+ + \ No newline at end of file diff --git a/spring-mvc-crash/src/main/webapp/jsp/index.jsp b/spring-mvc-crash/src/main/webapp/jsp/index.jsp new file mode 100644 index 0000000000..58c464125d --- /dev/null +++ b/spring-mvc-crash/src/main/webapp/jsp/index.jsp @@ -0,0 +1,12 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + JSP Examples + + +

Simple JSP Examples

+

Invoke HTML rendered by Servlet: here

+

Java in static page: here

+

Java injected by Servlet: here

+ + \ No newline at end of file diff --git a/spring-mvc-crash/src/test/java/com/baeldung/SpringContextTest.java b/spring-mvc-crash/src/test/java/com/baeldung/SpringContextTest.java new file mode 100644 index 0000000000..62e34859ee --- /dev/null +++ b/spring-mvc-crash/src/test/java/com/baeldung/SpringContextTest.java @@ -0,0 +1,19 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import com.baeldung.spring.ClientWebConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = ClientWebConfig.class) +@WebAppConfiguration +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index 685e7686b1..0adf127aaa 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -17,7 +17,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) - [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) - [Debugging the Spring MVC 404 “No mapping found for HTTP request” Error](https://www.baeldung.com/spring-mvc-404-error) -- [Getting Started with CRaSH](https://www.baeldung.com/jvm-crash-shell) ## Spring MVC with XML Configuration Example Project From c72b6ce0114d63180adfaa8f2b056032b5bd8144 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 17 Apr 2020 12:29:42 +0530 Subject: [PATCH 444/530] JAVA-916: Migrate jhipster to parent-boot-2 --- hystrix/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hystrix/pom.xml b/hystrix/pom.xml index 8c505c9104..1cf8713b91 100644 --- a/hystrix/pom.xml +++ b/hystrix/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From dc0a41fd8ef0e6ad9c16c2267466416f0a87f195 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Fri, 17 Apr 2020 12:37:42 +0530 Subject: [PATCH 445/530] JAVA-915: Migrate hystrix to parent-boot-2 --- hystrix/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hystrix/pom.xml b/hystrix/pom.xml index 8c505c9104..1cf8713b91 100644 --- a/hystrix/pom.xml +++ b/hystrix/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From 29a2f0ece167b56f060bb7cbedc0cb73bbe07fb6 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 9 Apr 2020 08:24:04 +0200 Subject: [PATCH 446/530] [JAVA-616] core-java-arrays-sorting * Creation * Moved code from https://www.baeldung.com/java-sorting-arrays * Moved code from https://www.baeldung.com/java-check-sorted-array * Moved code from https://www.baeldung.com/java-invert-array * Moved code from https://www.baeldung.com/java-arrays-sort-vs-parallelsort --- .../core-java-arrays-2/README.md | 1 - .../core-java-arrays-sorting/README.md | 9 ++ .../core-java-arrays-sorting/pom.xml | 87 +++++++++++++++++++ .../com/baeldung/array/ArrayInverter.java | 0 .../baeldung/array/SortedArrayChecker.java | 2 - .../arraysort/ArraySortingBenchmark.java | 0 .../main/java/com/baeldung/sort/Employee.java | 48 ++++++++++ .../baeldung/array/ArrayInverterUnitTest.java | 0 .../array/SortedArrayCheckerUnitTest.java | 2 +- .../arraysort/SortComparisonUnitTest.java | 0 .../com/baeldung/sort/ArraySortUnitTest.java | 2 - core-java-modules/core-java-arrays/README.md | 3 - core-java-modules/pom.xml | 1 + 13 files changed, 146 insertions(+), 9 deletions(-) create mode 100644 core-java-modules/core-java-arrays-sorting/README.md create mode 100644 core-java-modules/core-java-arrays-sorting/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/main/java/com/baeldung/array/ArrayInverter.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/main/java/com/baeldung/array/SortedArrayChecker.java (97%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-sorting}/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java (100%) create mode 100644 core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java (98%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-sorting}/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-sorting}/src/test/java/com/baeldung/sort/ArraySortUnitTest.java (98%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index c4ae3f03f7..a78b3327b6 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -13,5 +13,4 @@ This module contains articles about Java arrays - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) - [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list) -- [Arrays.sort vs Arrays.parallelSort](https://www.baeldung.com/java-arrays-sort-vs-parallelsort) - [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-sorting/README.md b/core-java-modules/core-java-arrays-sorting/README.md new file mode 100644 index 0000000000..f83dd43526 --- /dev/null +++ b/core-java-modules/core-java-arrays-sorting/README.md @@ -0,0 +1,9 @@ +## Core Java Arrays - Sorting + +This module contains articles about sorting arrays in Java + +### Relevant Articles: +- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) +- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) +- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array) +- [Arrays.sort vs Arrays.parallelSort](https://www.baeldung.com/java-arrays-sort-vs-parallelsort) diff --git a/core-java-modules/core-java-arrays-sorting/pom.xml b/core-java-modules/core-java-arrays-sorting/pom.xml new file mode 100644 index 0000000000..127d921b2a --- /dev/null +++ b/core-java-modules/core-java-arrays-sorting/pom.xml @@ -0,0 +1,87 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + ../pom.xml + + 4.0.0 + + core-java-arrays-sorting + core-java-arrays-sorting + jar + + + + + org.apache.maven.plugins + maven-shade-plugin + ${shade.plugin.version} + + + package + + shade + + + benchmarks + + + org.openjdk.jmh.Main + + + + + + + + + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + com.google.guava + guava + ${guava.version} + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + 3.2.0 + + 3.9 + 28.2-jre + + 1.19 + + 3.10.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/ArrayInverter.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java rename to core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/ArrayInverter.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/SortedArrayChecker.java similarity index 97% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java rename to core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/SortedArrayChecker.java index 78a9a8f4d1..8fa64972f2 100644 --- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java +++ b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/array/SortedArrayChecker.java @@ -1,7 +1,5 @@ package com.baeldung.array; -import com.baeldung.arraycopy.model.Employee; - import java.util.Comparator; public class SortedArrayChecker { diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java rename to core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/arraysort/ArraySortingBenchmark.java diff --git a/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java new file mode 100644 index 0000000000..e9c737b74b --- /dev/null +++ b/core-java-modules/core-java-arrays-sorting/src/main/java/com/baeldung/sort/Employee.java @@ -0,0 +1,48 @@ +package com.baeldung.sort; + +import java.io.Serializable; + +public class Employee implements Serializable { + private static final long serialVersionUID = -2454619097207585825L; + private int id; + private String name; + private int age; + + public Employee() { + } + + public Employee(int id, String name) { + this.id = id; + this.name = name; + } + + public Employee(int id, String name, int age) { + this.id = id; + this.name = name; + this.age = age; + } + + public int getAge() { + return age; + } + + public int getId() { + return id; + } + + public void setAge(int age) { + this.age = age; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java similarity index 98% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java index 7971e0eab7..5411dcba72 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java +++ b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.array; -import com.baeldung.arraycopy.model.Employee; +import com.baeldung.sort.Employee; import org.junit.Before; import org.junit.Test; diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/arraysort/SortComparisonUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/sort/ArraySortUnitTest.java similarity index 98% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java rename to core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/sort/ArraySortUnitTest.java index 59035738fe..b89a870c51 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java +++ b/core-java-modules/core-java-arrays-sorting/src/test/java/com/baeldung/sort/ArraySortUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.sort; -import com.baeldung.arraycopy.model.Employee; import org.junit.Before; import org.junit.Test; @@ -86,5 +85,4 @@ public class ArraySortUnitTest { assertArrayEquals(new Employee[]{david, john, mary}, employees); } - } diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 9d9db9ab81..94351bbad6 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -10,7 +10,4 @@ This module contains articles about Java arrays - [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) -- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array) -- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) -- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 00ef24be92..aba97f4826 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -122,6 +122,7 @@ pre-jpms + core-java-arrays-sorting From 0593fce8a3def726abc84d91fec72f5941d66b86 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 20:54:17 +0200 Subject: [PATCH 447/530] [JAVA-616] core-java-arrays-guides * Creation * Moved code from https://www.baeldung.com/java-arrays-guide * Moved code from https://www.baeldung.com/java-util-arrays --- .../core-java-arrays-guides/README.md | 7 ++++ .../core-java-arrays-guides/pom.xml | 32 +++++++++++++++++++ .../baeldung/array/ArrayReferenceGuide.java | 0 .../arrays/ParallelPrefixBenchmark.java | 0 .../com/baeldung/arrays/ArraysUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 2 -- core-java-modules/pom.xml | 1 + 7 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-arrays-guides/README.md create mode 100644 core-java-modules/core-java-arrays-guides/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-guides}/src/main/java/com/baeldung/array/ArrayReferenceGuide.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-guides}/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-guides}/src/test/java/com/baeldung/arrays/ArraysUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-guides/README.md b/core-java-modules/core-java-arrays-guides/README.md new file mode 100644 index 0000000000..2e66080002 --- /dev/null +++ b/core-java-modules/core-java-arrays-guides/README.md @@ -0,0 +1,7 @@ +## Core Java Arrays - Guides + +This module contains complete guides about arrays in Java + +### Relevant Articles: +- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) +- [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays) \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-guides/pom.xml b/core-java-modules/core-java-arrays-guides/pom.xml new file mode 100644 index 0000000000..ef718d5117 --- /dev/null +++ b/core-java-modules/core-java-arrays-guides/pom.xml @@ -0,0 +1,32 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-guides + core-java-arrays-guides + jar + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + 1.19 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/ArrayReferenceGuide.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java rename to core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/ArrayReferenceGuide.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java rename to core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java b/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/ArraysUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java rename to core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/ArraysUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 94351bbad6..05c316cf7e 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -6,8 +6,6 @@ This module contains articles about Java arrays - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) - [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) - [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) -- [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays) - [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) -- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index aba97f4826..b23b7ba8f4 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -123,6 +123,7 @@ pre-jpms core-java-arrays-sorting + core-java-arrays-guides From 6af4961a79bc5d493f8bf36b86718600b8908d0b Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:01:14 +0200 Subject: [PATCH 448/530] [JAVA-616] core-java-arrays-multidimensional * Creation * Moved code from https://www.baeldung.com/java-jagged-arrays * Moved code from https://www.baeldung.com/java-loop-diagonal-array --- core-java-modules/core-java-arrays-2/README.md | 1 - .../core-java-arrays-multidimensional/README.md | 7 +++++++ .../core-java-arrays-multidimensional/pom.xml | 15 +++++++++++++++ .../com/baeldung/array/MultiDimensionalArray.java | 0 .../baeldung/array/looping/LoopDiagonally.java | 0 .../array/MultiDimensionalArrayUnitTest.java | 0 .../array/looping/LoopDiagonallyUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 1 - core-java-modules/pom.xml | 1 + 9 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-arrays-multidimensional/README.md create mode 100644 core-java-modules/core-java-arrays-multidimensional/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-multidimensional}/src/main/java/com/baeldung/array/MultiDimensionalArray.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-multidimensional}/src/main/java/com/baeldung/array/looping/LoopDiagonally.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-multidimensional}/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-multidimensional}/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index a78b3327b6..07c171dcd5 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -5,7 +5,6 @@ This module contains articles about Java arrays ## Relevant Articles - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array) - [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) - [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) - [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) diff --git a/core-java-modules/core-java-arrays-multidimensional/README.md b/core-java-modules/core-java-arrays-multidimensional/README.md new file mode 100644 index 0000000000..d92747a4fb --- /dev/null +++ b/core-java-modules/core-java-arrays-multidimensional/README.md @@ -0,0 +1,7 @@ +## Core Java Arrays - Multidimensional + +This module contains articles about multidimensional arrays in Java + +### Relevant Articles: +- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) +- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array) \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-multidimensional/pom.xml b/core-java-modules/core-java-arrays-multidimensional/pom.xml new file mode 100644 index 0000000000..6e49a20521 --- /dev/null +++ b/core-java-modules/core-java-arrays-multidimensional/pom.xml @@ -0,0 +1,15 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-multidimensional + core-java-arrays-multidimensional + jar + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/MultiDimensionalArray.java b/core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/MultiDimensionalArray.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/MultiDimensionalArray.java rename to core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/MultiDimensionalArray.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/looping/LoopDiagonally.java b/core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/looping/LoopDiagonally.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/looping/LoopDiagonally.java rename to core-java-modules/core-java-arrays-multidimensional/src/main/java/com/baeldung/array/looping/LoopDiagonally.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java b/core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java rename to core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java b/core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java rename to core-java-modules/core-java-arrays-multidimensional/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 05c316cf7e..7b5f21a1e6 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -6,6 +6,5 @@ This module contains articles about Java arrays - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) - [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) - [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) -- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index b23b7ba8f4..20a2add836 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -124,6 +124,7 @@ pre-jpms core-java-arrays-sorting core-java-arrays-guides + core-java-arrays-multidimensional From dcd863f5d67dea7c0533cbd04a234507ede70725 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:08:02 +0200 Subject: [PATCH 449/530] [JAVA-616] core-java-arrays-convert * Creation * Moved code from https://www.baeldung.com/java-convert-float-to-byte-array * Moved code from https://www.baeldung.com/java-stream-to-array --- .../core-java-arrays-2/README.md | 2 -- .../core-java-arrays-convert/README.md | 7 +++++ .../core-java-arrays-convert/pom.xml | 27 +++++++++++++++++++ .../array/conversions/FloatToByteArray.java | 0 .../conversions/StreamArrayConversion.java | 0 .../conversions/FloatToByteArrayUnitTest.java | 0 .../StreamArrayConversionUnitTest.java | 0 core-java-modules/pom.xml | 1 + 8 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-arrays-convert/README.md create mode 100644 core-java-modules/core-java-arrays-convert/pom.xml rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-convert}/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index 07c171dcd5..eefc6aa787 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -5,8 +5,6 @@ This module contains articles about Java arrays ## Relevant Articles - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) -- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) - [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) diff --git a/core-java-modules/core-java-arrays-convert/README.md b/core-java-modules/core-java-arrays-convert/README.md new file mode 100644 index 0000000000..4bd060a246 --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/README.md @@ -0,0 +1,7 @@ +## Core Java Arrays - Conversions + +This module contains articles about arrays conversion in Java + +## Relevant Articles +- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) +- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) diff --git a/core-java-modules/core-java-arrays-convert/pom.xml b/core-java-modules/core-java-arrays-convert/pom.xml new file mode 100644 index 0000000000..bd50289f47 --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/pom.xml @@ -0,0 +1,27 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-convert + core-java-arrays-convert + jar + + + + com.google.guava + guava + ${guava.version} + + + + + 28.2-jre + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java rename to core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java rename to core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java rename to core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java rename to core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 20a2add836..9926e7781a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -125,6 +125,7 @@ core-java-arrays-sorting core-java-arrays-guides core-java-arrays-multidimensional + core-java-arrays-convert From e36771a76366ab2fcfcd19c0a5ce8cfb97446fc4 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:16:30 +0200 Subject: [PATCH 450/530] [JAVA-616] core-java-arrays-operations-basic * Creation * Moved code from https://www.baeldung.com/java-initialize-array * Moved code from https://www.baeldung.com/java-common-array-operations * Moved code from https://www.baeldung.com/java-add-element-to-array-vs-list * Moved code from https://www.baeldung.com/java-array-contains-value * Moved code from https://www.baeldung.com/java-array-remove-element * Moved code from https://www.baeldung.com/java-array-remove-first-element * Moved code from https://www.baeldung.com/java-array-add-element-at-the-end --- .../core-java-arrays-2/README.md | 5 -- .../ArraysIntersectionOperations.java | 27 +++++++ .../operations/IntersectionUnitTest.java | 2 +- .../README.md | 19 +++++ .../core-java-arrays-operations-basic/pom.xml | 78 +++++++++++++++++++ .../array/AddElementToEndOfArray.java | 0 .../baeldung/array/ArrayBenchmarkRunner.java | 2 +- .../com/baeldung/array/ArrayInitializer.java | 0 .../array/RemoveElementFromAnArray.java | 0 .../baeldung/array/SearchArrayBenchmark.java} | 2 +- .../array/operations/ArrayOperations.java | 0 .../operations/ArrayListOperations.java | 0 .../array/AddElementToEndOfArrayUnitTest.java | 0 .../array/ArrayInitializerUnitTest.java | 0 .../RemoveElementFromAnArrayUnitTest.java | 0 .../operations/ArrayOperationsUnitTest.java | 0 .../RemoveFirstElementUnitTest.java | 0 .../ArrayListOperationsUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 2 - core-java-modules/pom.xml | 1 + 20 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java create mode 100644 core-java-modules/core-java-arrays-operations-basic/README.md create mode 100644 core-java-modules/core-java-arrays-operations-basic/pom.xml rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/AddElementToEndOfArray.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java (86%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/ArrayInitializer.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java (100%) rename core-java-modules/{core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java => core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java} (98%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/array/operations/ArrayOperations.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-basic}/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index eefc6aa787..bde6c6cc1e 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -4,10 +4,5 @@ This module contains articles about Java arrays ## Relevant Articles -- [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) -- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) -- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) -- [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list) - [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java new file mode 100644 index 0000000000..6c4ce837ad --- /dev/null +++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java @@ -0,0 +1,27 @@ +package com.baeldung.array.operations; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.stream.Stream; + +public class ArraysIntersectionOperations { + + public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b) { + return Stream.of(a) + .filter(Arrays.asList(b)::contains) + .toArray(Integer[]::new); + } + + public static Integer[] intersectionSet(final Integer[] a, final Integer[] b) { + return Stream.of(a) + .filter(Arrays.asList(b)::contains) + .distinct() + .toArray(Integer[]::new); + } + + public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b) { + return Stream.of(a) + .filter(new LinkedList<>(Arrays.asList(b))::remove) + .toArray(Integer[]::new); + } +} diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java index 1560cc5701..b0d4a80b06 100644 --- a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java +++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java @@ -2,7 +2,7 @@ package com.baeldung.array.operations; import org.junit.jupiter.api.Test; -import static com.baeldung.array.operations.ArrayOperations.*; +import static com.baeldung.array.operations.ArraysIntersectionOperations.*; import static org.assertj.core.api.Assertions.assertThat; class IntersectionUnitTest { diff --git a/core-java-modules/core-java-arrays-operations-basic/README.md b/core-java-modules/core-java-arrays-operations-basic/README.md new file mode 100644 index 0000000000..914d5a71bd --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/README.md @@ -0,0 +1,19 @@ +## Core Java Arrays - Basic Operations + +This module contains articles about basic operations on arrays in Java + +Basic operations would cover anything elementary we should expect to be able to achieve on a collection type: + +- Adding/Removing elements +- Getting elements +- Iterating + +### Relevant Articles: +- [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) +- [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) +- [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list) +- [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) +- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) +- [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) +- [[More advanced operations -->]](/core-java-modules/core-java-arrays-operations-advanced) diff --git a/core-java-modules/core-java-arrays-operations-basic/pom.xml b/core-java-modules/core-java-arrays-operations-basic/pom.xml new file mode 100644 index 0000000000..4480c14bb2 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/pom.xml @@ -0,0 +1,78 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-operations-basic + core-java-arrays-operations-basic + jar + + + + + org.apache.maven.plugins + maven-shade-plugin + ${shade.plugin.version} + + + package + + shade + + + benchmarks + + + org.openjdk.jmh.Main + + + + + + + + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + 3.2.0 + + 3.9 + + 1.19 + + 3.10.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/AddElementToEndOfArray.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/AddElementToEndOfArray.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java similarity index 86% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java index f35064b783..30c3978a3a 100644 --- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java +++ b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java @@ -9,7 +9,7 @@ public class ArrayBenchmarkRunner { public static void main(String[] args) throws Exception { Options options = new OptionsBuilder() - .include(SearchArrayUnitTest.class.getSimpleName()).threads(1) + .include(SearchArrayBenchmark.class.getSimpleName()).threads(1) .forks(1).shouldFailOnError(true).shouldDoGC(true) .jvmArgs("-server").build(); diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayInitializer.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/ArrayInitializer.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java similarity index 98% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java index bed58356cb..fc4b513250 100644 --- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java +++ b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/SearchArrayBenchmark.java @@ -8,7 +8,7 @@ import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.AverageTime) @Warmup(iterations = 5) @OutputTimeUnit(TimeUnit.MICROSECONDS) -public class SearchArrayUnitTest { +public class SearchArrayBenchmark { @State(Scope.Benchmark) public static class SearchData { diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/operations/ArrayOperations.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/array/operations/ArrayOperations.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java b/core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java rename to core-java-modules/core-java-arrays-operations-basic/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java rename to core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 7b5f21a1e6..7c7e6d0add 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -4,7 +4,5 @@ This module contains articles about Java arrays ### Relevant Articles: - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) -- [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) -- [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 9926e7781a..cf6e4c69cf 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -126,6 +126,7 @@ core-java-arrays-guides core-java-arrays-multidimensional core-java-arrays-convert + core-java-arrays-operations-basic From 50530b81b499cf4ed9248b0baed519230572c40f Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 21:45:37 +0200 Subject: [PATCH 451/530] [JAVA-616] core-java-arrays-operations-advanced * Creation * Moved code from https://www.baeldung.com/java-array-copy * Moved code from https://www.baeldung.com/java-arrays-deepequals * Moved code from https://www.baeldung.com/java-array-sum-average * Moved code from https://www.baeldung.com/java-array-intersection --- .../core-java-arrays-2/README.md | 1 - .../core-java-arrays-3/README.md | 1 - .../README.md | 16 +++++++++ .../pom.xml | 36 +++++++++++++++++++ .../baeldung/array/SumAndAverageInArray.java | 0 .../ArraysIntersectionOperations.java | 0 .../com/baeldung/arraycopy/model/Address.java | 0 .../baeldung/arraycopy/model/Employee.java | 0 .../array/SumAndAverageInArrayUnitTest.java | 0 .../operations/IntersectionUnitTest.java | 0 .../arraycopy/ArrayCopyUtilUnitTest.java | 0 .../deepequals/ArraysDeepEqualsUnitTest.java | 0 core-java-modules/core-java-arrays/README.md | 2 -- core-java-modules/pom.xml | 1 + 14 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 core-java-modules/core-java-arrays-operations-advanced/README.md create mode 100644 core-java-modules/core-java-arrays-operations-advanced/pom.xml rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/array/SumAndAverageInArray.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/arraycopy/model/Address.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/main/java/com/baeldung/arraycopy/model/Employee.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays-2 => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java (100%) rename core-java-modules/{core-java-arrays-3 => core-java-arrays-operations-advanced}/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java (100%) diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md index bde6c6cc1e..20a2ddec9f 100644 --- a/core-java-modules/core-java-arrays-2/README.md +++ b/core-java-modules/core-java-arrays-2/README.md @@ -4,5 +4,4 @@ This module contains articles about Java arrays ## Relevant Articles -- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) - [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-3/README.md b/core-java-modules/core-java-arrays-3/README.md index 255d3d097d..a96ddccabb 100644 --- a/core-java-modules/core-java-arrays-3/README.md +++ b/core-java-modules/core-java-arrays-3/README.md @@ -1,3 +1,2 @@ ### Relevant Articles: -- [Arrays.deepEquals](https://www.baeldung.com/java-arrays-deepequals) diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md new file mode 100644 index 0000000000..71f9ce0ac6 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/README.md @@ -0,0 +1,16 @@ +## Core Java Arrays - Advanced Operations + +This module contains articles about advanced operations on arrays in Java + +Advanced operations would be much logic or interactions with other arrays, such as: + +- Sum, average of elements +- Intersections +- ... + +### Relevant Articles: +- [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) +- [Arrays.deepEquals](https://www.baeldung.com/java-arrays-deepequals) +- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) +- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) +- [[More basic operations-->]](/core-java-modules/core-java-operations-basic) diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml new file mode 100644 index 0000000000..8989e91189 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -0,0 +1,36 @@ + + + + core-java-modules + com.baeldung.core-java-modules + 1.0.0-SNAPSHOT + + 4.0.0 + + core-java-arrays-operations-advanced + core-java-arrays-operations-advanced + jar + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + 3.9 + + 3.10.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/SumAndAverageInArray.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/SumAndAverageInArray.java diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/array/operations/ArraysIntersectionOperations.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Address.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Address.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Employee.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java rename to core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arraycopy/model/Employee.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java diff --git a/core-java-modules/core-java-arrays-3/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays-3/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java rename to core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 7c7e6d0add..efc6ab426d 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -3,6 +3,4 @@ This module contains articles about Java arrays ### Relevant Articles: -- [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) -- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index cf6e4c69cf..414313f918 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -127,6 +127,7 @@ core-java-arrays-multidimensional core-java-arrays-convert core-java-arrays-operations-basic + core-java-arrays-operations-advanced From 91922d655394434ff244ad4d2a2d2a7699c53ee3 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 10 Apr 2020 22:02:20 +0200 Subject: [PATCH 452/530] [JAVA-616] Cleaning code * Removed core-java-arrays* modules * Updated core-java-module/pom.xml --- .../core-java-arrays-2/README.md | 7 - core-java-modules/core-java-arrays-2/pom.xml | 86 --------- .../core-java-arrays-3/README.md | 2 - core-java-modules/core-java-arrays-3/pom.xml | 32 ---- core-java-modules/core-java-arrays/README.md | 6 - core-java-modules/core-java-arrays/pom.xml | 180 ------------------ core-java-modules/pom.xml | 16 +- 7 files changed, 7 insertions(+), 322 deletions(-) delete mode 100644 core-java-modules/core-java-arrays-2/README.md delete mode 100644 core-java-modules/core-java-arrays-2/pom.xml delete mode 100644 core-java-modules/core-java-arrays-3/README.md delete mode 100644 core-java-modules/core-java-arrays-3/pom.xml delete mode 100644 core-java-modules/core-java-arrays/README.md delete mode 100644 core-java-modules/core-java-arrays/pom.xml diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md deleted file mode 100644 index 20a2ddec9f..0000000000 --- a/core-java-modules/core-java-arrays-2/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## Core Java Arrays (Part 2) - -This module contains articles about Java arrays - -## Relevant Articles - -- [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays-2/pom.xml b/core-java-modules/core-java-arrays-2/pom.xml deleted file mode 100644 index 1445a322d7..0000000000 --- a/core-java-modules/core-java-arrays-2/pom.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - 4.0.0 - core-java-arrays-2 - 0.1.0-SNAPSHOT - core-java-arrays-2 - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - - - core-java-arrays-2 - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-shade-plugin - ${shade.plugin.version} - - - package - - shade - - - benchmarks - - - org.openjdk.jmh.Main - - - - - - - - - - - 1.19 - - 3.9 - - 3.10.0 - 3.2.0 - - - diff --git a/core-java-modules/core-java-arrays-3/README.md b/core-java-modules/core-java-arrays-3/README.md deleted file mode 100644 index a96ddccabb..0000000000 --- a/core-java-modules/core-java-arrays-3/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: - diff --git a/core-java-modules/core-java-arrays-3/pom.xml b/core-java-modules/core-java-arrays-3/pom.xml deleted file mode 100644 index 210375b878..0000000000 --- a/core-java-modules/core-java-arrays-3/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - core-java-arrays-3 - 0.1.0-SNAPSHOT - core-java-arrays-3 - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - org.assertj - assertj-core - ${assertj.version} - test - - - - - 3.14.0 - - - \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md deleted file mode 100644 index efc6ab426d..0000000000 --- a/core-java-modules/core-java-arrays/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Core Java Arrays - -This module contains articles about Java arrays - -### Relevant Articles: -- [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/core-java-arrays/pom.xml b/core-java-modules/core-java-arrays/pom.xml deleted file mode 100644 index ea28eb25eb..0000000000 --- a/core-java-modules/core-java-arrays/pom.xml +++ /dev/null @@ -1,180 +0,0 @@ - - - 4.0.0 - core-java-arrays - 0.1.0-SNAPSHOT - core-java-arrays - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - org.openjdk.jmh - jmh-core - ${jmh-core.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh-generator-annprocess.version} - - - - - core-java-arrays - - - src/main/resources - true - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - ${source.version} - ${target.version} - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - json - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - - - - - - 3.9 - - 1.19 - 1.19 - - - 3.10.0 - - - 3.0.0-M1 - 1.6.0 - 1.8 - 1.8 - - - diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 414313f918..b7454cc737 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -31,10 +31,14 @@ core-java-annotations - core-java-arrays - core-java-arrays-2 - core-java-arrays-3 + core-java-arrays-sorting + core-java-arrays-guides + core-java-arrays-multidimensional + core-java-arrays-convert + core-java-arrays-operations-basic + core-java-arrays-operations-advanced + core-java-collections core-java-collections-2 core-java-collections-3 @@ -122,12 +126,6 @@ pre-jpms - core-java-arrays-sorting - core-java-arrays-guides - core-java-arrays-multidimensional - core-java-arrays-convert - core-java-arrays-operations-basic - core-java-arrays-operations-advanced From 40fb82606a7a00044781ed96acf6132a88c6ee10 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 17 Apr 2020 21:05:33 +0200 Subject: [PATCH 453/530] [JAVA-616] Reworded operations modules descriptions --- .../core-java-arrays-operations-advanced/README.md | 9 +-------- .../core-java-arrays-operations-basic/README.md | 9 +-------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md index 71f9ce0ac6..af0c00641a 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/README.md +++ b/core-java-modules/core-java-arrays-operations-advanced/README.md @@ -1,16 +1,9 @@ ## Core Java Arrays - Advanced Operations -This module contains articles about advanced operations on arrays in Java - -Advanced operations would be much logic or interactions with other arrays, such as: - -- Sum, average of elements -- Intersections -- ... +This module contains articles about advanced operations on arrays in Java. They assume some background knowledge with arrays in Java. ### Relevant Articles: - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) - [Arrays.deepEquals](https://www.baeldung.com/java-arrays-deepequals) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) -- [[More basic operations-->]](/core-java-modules/core-java-operations-basic) 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 914d5a71bd..ca81c23c98 100644 --- a/core-java-modules/core-java-arrays-operations-basic/README.md +++ b/core-java-modules/core-java-arrays-operations-basic/README.md @@ -1,12 +1,6 @@ ## Core Java Arrays - Basic Operations -This module contains articles about basic operations on arrays in Java - -Basic operations would cover anything elementary we should expect to be able to achieve on a collection type: - -- Adding/Removing elements -- Getting elements -- Iterating +This module contains articles about Java array fundamentals. They assume no previous background knowledge on working with arrays. ### Relevant Articles: - [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) @@ -16,4 +10,3 @@ Basic operations would cover anything elementary we should expect to be able to - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) - [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) -- [[More advanced operations -->]](/core-java-modules/core-java-arrays-operations-advanced) From 5e223df9d6468d2df6991974d63c9982f4b2f085 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Fri, 17 Apr 2020 22:11:57 +0200 Subject: [PATCH 454/530] BAEL-3992: Remove jnlp dependencies from the pom.xml --- jws/pom.xml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/jws/pom.xml b/jws/pom.xml index f867df8051..be42798fd1 100644 --- a/jws/pom.xml +++ b/jws/pom.xml @@ -14,21 +14,6 @@ 1.0.0-SNAPSHOT - - - OpenNMS Repository - https://repo.opennms.org/maven2/ - - - - - - javax.samples.jnlp - jnlp-servlet - ${jnlp-servlet.version} - - - ${project.artifactId} @@ -79,7 +64,6 @@ 3.0.2 - 1.6.0 From 7678f4a0cc7feb670715f7f3c3124bbdebc9bec5 Mon Sep 17 00:00:00 2001 From: Kirill Vlasov Date: Sat, 18 Apr 2020 08:00:52 +0500 Subject: [PATCH 455/530] Code review --- .../java/com/baeldung/customlogouthandler/MvcConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java index 3e17a7c397..c363effb4e 100644 --- a/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java +++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/com/baeldung/customlogouthandler/MvcConfiguration.java @@ -35,7 +35,7 @@ public class MvcConfiguration extends WebSecurityConfigurerAdapter { .logout() .logoutUrl("/user/logout") .addLogoutHandler(logoutHandler) - .logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK))) + .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)) .permitAll() .and() .csrf() From 1ec2d9a4ed2b57380462ef06d710c90dc434b371 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 11:43:52 +0530 Subject: [PATCH 456/530] JAVA-627: Moved 2 articles from libraries-2 --- libraries-2/README.md | 2 - libraries-2/pom.xml | 26 +---- .../okhttp/ResponseDecoderUnitTest.java | 102 ------------------ .../com/baeldung/okhttp/SimpleEntity.java | 22 ---- 4 files changed, 1 insertion(+), 151 deletions(-) delete mode 100644 libraries-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java delete mode 100644 libraries-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java diff --git a/libraries-2/README.md b/libraries-2/README.md index eb45a3e426..edf513c6ee 100644 --- a/libraries-2/README.md +++ b/libraries-2/README.md @@ -14,11 +14,9 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Guide to Java Parallel Collectors Library](https://www.baeldung.com/java-parallel-collectors) - [Templating with Handlebars](https://www.baeldung.com/handlebars) - [A Guide to Crawler4j](https://www.baeldung.com/crawler4j) -- [Decode an OkHttp JSON Response](https://www.baeldung.com/okhttp-json-response) - [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map) - [Guide to MapDB](https://www.baeldung.com/mapdb) - [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos) - [JasperReports with Spring](https://www.baeldung.com/spring-jasper) -- [Jetty ReactiveStreams HTTP Client](https://www.baeldung.com/jetty-reactivestreams-http-client) - More articles [[<-- prev]](/libraries) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 474ff563c2..3aa36c3f90 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -75,28 +75,7 @@ - - - com.squareup.okhttp3 - okhttp - ${okhttp.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - com.google.code.gson - gson - ${gson.version} - - - com.squareup.okhttp3 - mockwebserver - ${mockwebserver.version} - test - + edu.uci.ics crawler4j @@ -151,9 +130,6 @@ 2.1.4.RELEASE 0.28.3 1.1.0 - 3.14.2 - 2.8.5 - 3.14.2 4.1.2 6.6.0 5.1.9.RELEASE diff --git a/libraries-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java b/libraries-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java deleted file mode 100644 index 11a295031a..0000000000 --- a/libraries-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.baeldung.okhttp; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.Gson; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.ResponseBody; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import java.io.InputStreamReader; - -public class ResponseDecoderUnitTest { - - @Rule public ExpectedException exceptionRule = ExpectedException.none(); - - @Rule public MockWebServer server = new MockWebServer(); - - SimpleEntity sampleResponse; - - MockResponse mockResponse; - - OkHttpClient client; - - @Before - public void setUp() { - sampleResponse = new SimpleEntity("Baeldung"); - client = new OkHttpClient.Builder().build(); - mockResponse = new MockResponse() - .setResponseCode(200) - .setHeader("Content-Type", "application/json") - .setBody(new Gson().toJson(sampleResponse)); - } - - @Test - public void givenJacksonDecoder_whenGetStringOfResponse_thenExpectSimpleEntity() throws Exception { - server.enqueue(mockResponse); - Request request = new Request.Builder() - .url(server.url("")) - .build(); - ResponseBody responseBody = client - .newCall(request) - .execute() - .body(); - - Assert.assertNotNull(responseBody); - Assert.assertNotEquals(0, responseBody.contentLength()); - - ObjectMapper objectMapper = new ObjectMapper(); - SimpleEntity entity = objectMapper.readValue(responseBody.string(), SimpleEntity.class); - - Assert.assertNotNull(entity); - Assert.assertEquals(sampleResponse.getName(), entity.getName()); - } - - @Test - public void givenGsonDecoder_whenGetByteStreamOfResponse_thenExpectSimpleEntity() throws Exception { - server.enqueue(mockResponse); - Request request = new Request.Builder() - .url(server.url("")) - .build(); - ResponseBody responseBody = client - .newCall(request) - .execute() - .body(); - - Assert.assertNotNull(responseBody); - Assert.assertNotEquals(0, responseBody.contentLength()); - - Gson gson = new Gson(); - SimpleEntity entity = gson.fromJson(new InputStreamReader(responseBody.byteStream()), SimpleEntity.class); - - Assert.assertNotNull(entity); - Assert.assertEquals(sampleResponse.getName(), entity.getName()); - } - - @Test - public void givenGsonDecoder_whenGetStringOfResponse_thenExpectSimpleEntity() throws Exception { - server.enqueue(mockResponse); - Request request = new Request.Builder() - .url(server.url("")) - .build(); - ResponseBody responseBody = client - .newCall(request) - .execute() - .body(); - - Assert.assertNotNull(responseBody); - - Gson gson = new Gson(); - SimpleEntity entity = gson.fromJson(responseBody.string(), SimpleEntity.class); - - Assert.assertNotNull(entity); - Assert.assertEquals(sampleResponse.getName(), entity.getName()); - } - -} diff --git a/libraries-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java b/libraries-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java deleted file mode 100644 index 211e43e556..0000000000 --- a/libraries-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.okhttp; - -public class SimpleEntity { - protected String name; - - public SimpleEntity(String name) { - this.name = name; - } - - //no-arg constructor, getters and setters here - - public SimpleEntity() { - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} From c990a29bf76f956f4bfcbdbdc32d3eb843e1fea7 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 11:44:19 +0530 Subject: [PATCH 457/530] JAVA-627: Moved 2 articles to libraries-http-2 --- libraries-http-2/README.md | 10 ++ libraries-http-2/pom.xml | 47 ++++++++ .../okhttp/ResponseDecoderUnitTest.java | 102 ++++++++++++++++++ .../com/baeldung/okhttp/SimpleEntity.java | 22 ++++ 4 files changed, 181 insertions(+) create mode 100644 libraries-http-2/README.md create mode 100644 libraries-http-2/pom.xml create mode 100644 libraries-http-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java create mode 100644 libraries-http-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java diff --git a/libraries-http-2/README.md b/libraries-http-2/README.md new file mode 100644 index 0000000000..5ba45eb4a9 --- /dev/null +++ b/libraries-http-2/README.md @@ -0,0 +1,10 @@ +## HTTP + +This module contains articles about HTTP libraries. + +### Relevant Articles: + +- [Jetty ReactiveStreams HTTP Client](https://www.baeldung.com/jetty-reactivestreams-http-client) +- [Decode an OkHttp JSON Response](https://www.baeldung.com/okhttp-json-response) +- More articles [[<-- prev]](/libraries-http) + diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml new file mode 100644 index 0000000000..c0a4f6455d --- /dev/null +++ b/libraries-http-2/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + libraries-http-2 + libraries-http-2 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.google.code.gson + gson + ${gson.version} + + + com.squareup.okhttp3 + mockwebserver + ${mockwebserver.version} + test + + + + + 3.14.2 + 2.8.5 + 3.14.2 + 2.9.8 + + + diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java new file mode 100644 index 0000000000..11a295031a --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/ResponseDecoderUnitTest.java @@ -0,0 +1,102 @@ +package com.baeldung.okhttp; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.ResponseBody; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.io.InputStreamReader; + +public class ResponseDecoderUnitTest { + + @Rule public ExpectedException exceptionRule = ExpectedException.none(); + + @Rule public MockWebServer server = new MockWebServer(); + + SimpleEntity sampleResponse; + + MockResponse mockResponse; + + OkHttpClient client; + + @Before + public void setUp() { + sampleResponse = new SimpleEntity("Baeldung"); + client = new OkHttpClient.Builder().build(); + mockResponse = new MockResponse() + .setResponseCode(200) + .setHeader("Content-Type", "application/json") + .setBody(new Gson().toJson(sampleResponse)); + } + + @Test + public void givenJacksonDecoder_whenGetStringOfResponse_thenExpectSimpleEntity() throws Exception { + server.enqueue(mockResponse); + Request request = new Request.Builder() + .url(server.url("")) + .build(); + ResponseBody responseBody = client + .newCall(request) + .execute() + .body(); + + Assert.assertNotNull(responseBody); + Assert.assertNotEquals(0, responseBody.contentLength()); + + ObjectMapper objectMapper = new ObjectMapper(); + SimpleEntity entity = objectMapper.readValue(responseBody.string(), SimpleEntity.class); + + Assert.assertNotNull(entity); + Assert.assertEquals(sampleResponse.getName(), entity.getName()); + } + + @Test + public void givenGsonDecoder_whenGetByteStreamOfResponse_thenExpectSimpleEntity() throws Exception { + server.enqueue(mockResponse); + Request request = new Request.Builder() + .url(server.url("")) + .build(); + ResponseBody responseBody = client + .newCall(request) + .execute() + .body(); + + Assert.assertNotNull(responseBody); + Assert.assertNotEquals(0, responseBody.contentLength()); + + Gson gson = new Gson(); + SimpleEntity entity = gson.fromJson(new InputStreamReader(responseBody.byteStream()), SimpleEntity.class); + + Assert.assertNotNull(entity); + Assert.assertEquals(sampleResponse.getName(), entity.getName()); + } + + @Test + public void givenGsonDecoder_whenGetStringOfResponse_thenExpectSimpleEntity() throws Exception { + server.enqueue(mockResponse); + Request request = new Request.Builder() + .url(server.url("")) + .build(); + ResponseBody responseBody = client + .newCall(request) + .execute() + .body(); + + Assert.assertNotNull(responseBody); + + Gson gson = new Gson(); + SimpleEntity entity = gson.fromJson(responseBody.string(), SimpleEntity.class); + + Assert.assertNotNull(entity); + Assert.assertEquals(sampleResponse.getName(), entity.getName()); + } + +} diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java new file mode 100644 index 0000000000..211e43e556 --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/SimpleEntity.java @@ -0,0 +1,22 @@ +package com.baeldung.okhttp; + +public class SimpleEntity { + protected String name; + + public SimpleEntity(String name) { + this.name = name; + } + + //no-arg constructor, getters and setters here + + public SimpleEntity() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} From c2ce41c539760ed954581e545db596b7a8270f4d Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 11:44:56 +0530 Subject: [PATCH 458/530] JAVA-627: Added next link in README for libraries-http --- libraries-http/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-http/README.md b/libraries-http/README.md index 1f065a9d4a..61b2904cee 100644 --- a/libraries-http/README.md +++ b/libraries-http/README.md @@ -14,3 +14,4 @@ This module contains articles about HTTP libraries. - [Creating REST Microservices with Javalin](https://www.baeldung.com/javalin-rest-microservices) - [A Quick Guide to Timeouts in OkHttp](https://www.baeldung.com/okhttp-timeouts) - [A Quick Guide to Post Requests with OkHttp](https://www.baeldung.com/okhttp-post) +- More articles [[next -->]](/libraries-http-2) From 24fb2dcccf1743fd8d800f4b25f50896373031d2 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 11:45:39 +0530 Subject: [PATCH 459/530] JAVA-627: Added new module libraries-http-2 to main pom --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 9e3b354d74..f6eabfa653 100644 --- a/pom.xml +++ b/pom.xml @@ -505,6 +505,7 @@ libraries-data-db libraries-data-io libraries-http + libraries-http-2 libraries-io libraries-primitive libraries-security @@ -1017,6 +1018,7 @@ libraries-data-db libraries-data-io libraries-http + libraries-http-2 libraries-io libraries-primitive libraries-security From 744d2b5733c7641da2f0f129e9d293ce58356efc Mon Sep 17 00:00:00 2001 From: mikr Date: Sat, 18 Apr 2020 14:22:10 +0200 Subject: [PATCH 460/530] JAVA-617 Rename core-java-datetime-java8 to core-java-8-datetime --- .../README.md | 0 .../pom.xml | 8 ++++---- .../java/com/baeldung/localdate/LocalDateExample.java | 0 .../java/com/baeldung/random/LegacyRandomDateTimes.java | 0 .../main/java/com/baeldung/random/RandomDateTimes.java | 0 .../src/main/java/com/baeldung/random/RandomDates.java | 0 .../src/main/java/com/baeldung/random/RandomTimes.java | 0 .../com/baeldung/localdate/LocalDateExampleUnitTest.java | 0 .../baeldung/random/LegacyRandomDateTimesUnitTest.java | 0 .../java/com/baeldung/random/RandomDateTimesUnitTest.java | 0 .../java/com/baeldung/random/RandomDatesUnitTest.java | 0 .../java/com/baeldung/random/RandomTimesUnitTest.java | 0 .../README.md | 0 .../pom.xml | 8 ++++---- .../baeldung/date/comparison/DateTimeComparisonUtils.java | 0 .../date/comparison/LegacyDateComparisonUtils.java | 0 .../java/com/baeldung/datetime/UseDateTimeFormatter.java | 0 .../src/main/java/com/baeldung/datetime/UseDuration.java | 0 .../src/main/java/com/baeldung/datetime/UseLocalDate.java | 0 .../main/java/com/baeldung/datetime/UseLocalDateTime.java | 0 .../src/main/java/com/baeldung/datetime/UseLocalTime.java | 0 .../java/com/baeldung/datetime/UseOffsetDateTime.java | 0 .../src/main/java/com/baeldung/datetime/UsePeriod.java | 0 .../src/main/java/com/baeldung/datetime/UseToInstant.java | 0 .../main/java/com/baeldung/datetime/UseZonedDateTime.java | 0 .../baeldung/temporaladjuster/CustomTemporalAdjuster.java | 0 .../date/comparison/DateTimeComparisonUtilsUnitTest.java | 0 .../Java8DateTimeApiGeneralComparisonsUnitTest.java | 0 .../comparison/LegacyDateComparisonUtilsUnitTest.java | 0 .../test/java/com/baeldung/dateapi/ConversionExample.java | 0 .../java/com/baeldung/dateapi/JavaDurationUnitTest.java | 0 .../java/com/baeldung/dateapi/JavaPeriodUnitTest.java | 0 .../java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java | 0 .../baeldung/datetime/UseDateTimeFormatterUnitTest.java | 0 .../com/baeldung/datetime/UseLocalDateTimeUnitTest.java | 0 .../java/com/baeldung/datetime/UseLocalDateUnitTest.java | 0 .../java/com/baeldung/datetime/UseLocalTimeUnitTest.java | 0 .../com/baeldung/datetime/UseOffsetDateTimeUnitTest.java | 0 .../java/com/baeldung/datetime/UsePeriodUnitTest.java | 0 .../java/com/baeldung/datetime/UseTimeZoneUnitTest.java | 0 .../java/com/baeldung/datetime/UseToInstantUnitTest.java | 0 .../com/baeldung/datetime/UseZonedDateTimeUnitTest.java | 0 .../temporaladjusters/CustomTemporalAdjusterUnitTest.java | 0 .../temporaladjusters/TemporalAdjustersUnitTest.java | 0 44 files changed, 8 insertions(+), 8 deletions(-) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/README.md (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/pom.xml (91%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/main/java/com/baeldung/localdate/LocalDateExample.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/main/java/com/baeldung/random/RandomDateTimes.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/main/java/com/baeldung/random/RandomDates.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/main/java/com/baeldung/random/RandomTimes.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/test/java/com/baeldung/random/RandomDatesUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8-2 => core-java-8-datetime-2}/src/test/java/com/baeldung/random/RandomTimesUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/README.md (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/pom.xml (91%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseDuration.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseLocalDate.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseLocalDateTime.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseLocalTime.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UsePeriod.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseToInstant.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/datetime/UseZonedDateTime.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/dateapi/ConversionExample.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java (100%) rename core-java-modules/{core-java-datetime-java8 => core-java-8-datetime}/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java (100%) diff --git a/core-java-modules/core-java-datetime-java8-2/README.md b/core-java-modules/core-java-8-datetime-2/README.md similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/README.md rename to core-java-modules/core-java-8-datetime-2/README.md diff --git a/core-java-modules/core-java-datetime-java8-2/pom.xml b/core-java-modules/core-java-8-datetime-2/pom.xml similarity index 91% rename from core-java-modules/core-java-datetime-java8-2/pom.xml rename to core-java-modules/core-java-8-datetime-2/pom.xml index a15113bddc..ce98b72781 100644 --- a/core-java-modules/core-java-datetime-java8-2/pom.xml +++ b/core-java-modules/core-java-8-datetime-2/pom.xml @@ -4,9 +4,9 @@ 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 - core-java-datetime-java8 + core-java-8-datetime ${project.parent.version} - core-java-datetime-java8 + core-java-8-datetime jar @@ -64,8 +64,8 @@ - 1.9 - 1.9 + 1.8 + 1.8 2.10 3.6.1 diff --git a/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/localdate/LocalDateExample.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdate/LocalDateExample.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/localdate/LocalDateExample.java rename to core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdate/LocalDateExample.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java rename to core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/LegacyRandomDateTimes.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDateTimes.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/RandomDateTimes.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDateTimes.java rename to core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/RandomDateTimes.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDates.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/RandomDates.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomDates.java rename to core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/RandomDates.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomTimes.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/RandomTimes.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/main/java/com/baeldung/random/RandomTimes.java rename to core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/random/RandomTimes.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java rename to core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdate/LocalDateExampleUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java rename to core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/LegacyRandomDateTimesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java rename to core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDateTimesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java rename to core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomTimesUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomTimesUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8-2/src/test/java/com/baeldung/random/RandomTimesUnitTest.java rename to core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomTimesUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/README.md b/core-java-modules/core-java-8-datetime/README.md similarity index 100% rename from core-java-modules/core-java-datetime-java8/README.md rename to core-java-modules/core-java-8-datetime/README.md diff --git a/core-java-modules/core-java-datetime-java8/pom.xml b/core-java-modules/core-java-8-datetime/pom.xml similarity index 91% rename from core-java-modules/core-java-datetime-java8/pom.xml rename to core-java-modules/core-java-8-datetime/pom.xml index a15113bddc..ce98b72781 100644 --- a/core-java-modules/core-java-datetime-java8/pom.xml +++ b/core-java-modules/core-java-8-datetime/pom.xml @@ -4,9 +4,9 @@ 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 - core-java-datetime-java8 + core-java-8-datetime ${project.parent.version} - core-java-datetime-java8 + core-java-8-datetime jar @@ -64,8 +64,8 @@ - 1.9 - 1.9 + 1.8 + 1.8 2.10 3.6.1 diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseDuration.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseDuration.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseDuration.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseDuration.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDate.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseLocalDate.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDate.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseLocalDate.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseLocalDateTime.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseLocalDateTime.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalTime.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseLocalTime.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalTime.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseLocalTime.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UsePeriod.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UsePeriod.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UsePeriod.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UsePeriod.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseToInstant.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseToInstant.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseToInstant.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseToInstant.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseZonedDateTime.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseZonedDateTime.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseZonedDateTime.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/datetime/UseZonedDateTime.java diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java b/core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java rename to core-java-modules/core-java-8-datetime/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/ConversionExample.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/ConversionExample.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/ConversionExample.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/ConversionExample.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java b/core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java similarity index 100% rename from core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java rename to core-java-modules/core-java-8-datetime/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java From 47595b7ccc555d5eee4b18fb192e4b4e9e1e3bcc Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 19:11:47 +0530 Subject: [PATCH 461/530] JAVA-914: Removed empty pom files --- cas/cas-server/pom.xml | 0 cas/pom.xml | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 cas/cas-server/pom.xml delete mode 100644 cas/pom.xml diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cas/pom.xml b/cas/pom.xml deleted file mode 100644 index e69de29bb2..0000000000 From 576bf0290361f26d7df8ea78d394239e8ff80c72 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 19:12:36 +0530 Subject: [PATCH 462/530] JAVA-914: Updated module README to include relevant info --- cas/README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cas/README.md b/cas/README.md index 16775a8a02..6ceeaea0c4 100644 --- a/cas/README.md +++ b/cas/README.md @@ -1,7 +1,18 @@ ## CAS -This module contains articles about the Central Authentication Service (CAS) +This module contains articles about the Central Authentication Service (CAS). + +The module consists of 2 submodules: +1. `cas-server` - it requires JDK11 and uses the Gradle War Overlay style to ease setup and deployment. To start the server, simply run: + +`./gradlew run + -Dorg.gradle.java.home=$JAVA11_HOME + -Pargs="-Dcas.standalone.configurationDirectory=/cas-server/src/main/resources/etc/cas/config"` + +The server starts at https://localhost:8443. `casuser`/`Mellon` are the username and password for logging in. + +2. `cas-secured-app` - A Maven based Springboot Application ### Relevant Articles: -- [CAS SSO With Spring Security](baeldung.com/spring-security-cas-sso) \ No newline at end of file +- [CAS SSO With Spring Security](https://www.baeldung.com/spring-security-cas-sso) \ No newline at end of file From e82bdc46d4c931cb14b03e8f69d433990d9df640 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 19:13:22 +0530 Subject: [PATCH 463/530] JAVA-914: Updated main pom to include cas as commented module --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9e3b354d74..394a566011 100644 --- a/pom.xml +++ b/pom.xml @@ -387,7 +387,7 @@ bazel blade bootique - + cdi checker-plugin @@ -900,7 +900,7 @@ bazel blade bootique - + cdi checker-plugin From 55c978c44aeac47437b28fe6850a695df9b8f5a6 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 19:17:28 +0530 Subject: [PATCH 464/530] Revert "JAVA-916: Migrate jhipster to parent-boot-2" This reverts commit c72b6ce0114d63180adfaa8f2b056032b5bd8144. --- hystrix/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hystrix/pom.xml b/hystrix/pom.xml index 1cf8713b91..8c505c9104 100644 --- a/hystrix/pom.xml +++ b/hystrix/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-2 + parent-boot-1 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-1 From d3f01d251cf8d9d1a8577ec32f367a24f7fa59f7 Mon Sep 17 00:00:00 2001 From: Krzysztof Woyke Date: Sat, 18 Apr 2020 16:51:27 +0200 Subject: [PATCH 465/530] BAEL-3992: Enable jws in the main pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9e3b354d74..3f16c4ddd0 100644 --- a/pom.xml +++ b/pom.xml @@ -806,7 +806,7 @@ jenkins/plugins jhipster - + jws libraries @@ -1303,7 +1303,7 @@ jenkins/plugins jhipster - + jws libraries From 95967877e946125d6ca13fd6df3f1a1f46240b8d Mon Sep 17 00:00:00 2001 From: Ankur Gupta Date: Sat, 18 Apr 2020 20:41:31 +0530 Subject: [PATCH 466/530] ankurguptajec@gmail.com (#9064) * Java Example of Hexagonal Architecture * removing unnecessary maven files from pull request and spaces in code * Removing unnecessary lines * Example code for using Multiple Cache Manager in SpringBoot * BAEL-3963:Using multiple cache managers in Spring * removing new module created in last pull request * Fixes as per editor Suggestions Co-authored-by: Ankur Gupta --- spring-caching/pom.xml | 106 ++++++++++-------- .../caching/boot/CacheApplication.java | 4 + .../bo/CustomerDetailBO.java | 28 +++++ .../bo/OrderDetailBO.java | 25 +++++ .../config/MultipleCacheManagerConfig.java | 40 +++++++ .../config/MultipleCacheResolver.java | 38 +++++++ .../MultipleCacheManagerController.java | 43 +++++++ .../multiplecachemanager/entity/Customer.java | 24 ++++ .../multiplecachemanager/entity/Item.java | 34 ++++++ .../multiplecachemanager/entity/Order.java | 44 ++++++++ .../repository/CustomerDetailRepository.java | 49 ++++++++ .../repository/OrderDetailRepository.java | 53 +++++++++ .../src/main/resources/application.properties | 8 ++ spring-caching/src/main/resources/data.sql | 7 ++ spring-caching/src/main/resources/schema.sql | 19 ++++ ...ltipleCacheManagerIntegrationUnitTest.java | 64 +++++++++++ 16 files changed, 542 insertions(+), 44 deletions(-) create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java create mode 100644 spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java create mode 100644 spring-caching/src/main/resources/application.properties create mode 100644 spring-caching/src/main/resources/data.sql create mode 100644 spring-caching/src/main/resources/schema.sql create mode 100644 spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationUnitTest.java diff --git a/spring-caching/pom.xml b/spring-caching/pom.xml index d33f24de1f..f56d3cf328 100644 --- a/spring-caching/pom.xml +++ b/spring-caching/pom.xml @@ -1,49 +1,67 @@ - - 4.0.0 - spring-caching - 0.1-SNAPSHOT - spring-caching - war + + 4.0.0 + spring-caching + 0.1-SNAPSHOT + spring-caching + war - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + - - - org.springframework - spring-context - - - org.springframework.boot - spring-boot-starter-cache - - - org.springframework - spring-web - - - org.springframework - spring-webmvc - - - org.ehcache - ehcache - - - org.springframework - spring-test - test - - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework + spring-context + + + org.springframework.boot + spring-boot-starter-cache + + + org.springframework + spring-web + + + org.springframework + spring-webmvc + + + org.ehcache + ehcache + + + org.springframework + spring-test + test + + + com.github.ben-manes.caffeine + caffeine + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + 3.5.2 + - - 3.5.2 - - \ No newline at end of file diff --git a/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java b/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java index 714dc443e0..afa1d0ec99 100644 --- a/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java +++ b/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java @@ -3,9 +3,13 @@ package com.baeldung.caching.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; +//import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @EnableCaching +//to run any module like ehcache,caching or multiplecachemanager in local machine +//add it's package for ComponentScan like below +//@ComponentScan("com.baeldung.multiplecachemanager") public class CacheApplication { public static void main(String[] args) { diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java new file mode 100644 index 0000000000..3da4c23e28 --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java @@ -0,0 +1,28 @@ +package com.baeldung.multiplecachemanager.bo; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; + +import com.baeldung.multiplecachemanager.entity.Customer; +import com.baeldung.multiplecachemanager.entity.Order; +import com.baeldung.multiplecachemanager.repository.CustomerDetailRepository; + +@Component +public class CustomerDetailBO { + + @Autowired + private CustomerDetailRepository customerDetailRepository; + + @Cacheable(cacheNames = "customers") + public Customer getCustomerDetail(Integer customerId) { + return customerDetailRepository.getCustomerDetail(customerId); + } + + @Cacheable(cacheNames = "customerOrders", cacheManager = "alternateCacheManager") + public List getCustomerOrders(Integer customerId) { + return customerDetailRepository.getCustomerOrders(customerId); + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java new file mode 100644 index 0000000000..390881167f --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java @@ -0,0 +1,25 @@ +package com.baeldung.multiplecachemanager.bo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; + +import com.baeldung.multiplecachemanager.entity.Order; +import com.baeldung.multiplecachemanager.repository.OrderDetailRepository; + +@Component +public class OrderDetailBO { + + @Autowired + private OrderDetailRepository orderDetailRepository; + + @Cacheable(cacheNames = "orders", cacheResolver = "cacheResolver") + public Order getOrderDetail(Integer orderId) { + return orderDetailRepository.getOrderDetail(orderId); + } + + @Cacheable(cacheNames = "orderprice", cacheResolver = "cacheResolver") + public double getOrderPrice(Integer orderId) { + return orderDetailRepository.getOrderPrice(orderId); + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java new file mode 100644 index 0000000000..247a9b596b --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java @@ -0,0 +1,40 @@ +package com.baeldung.multiplecachemanager.config; + +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.caffeine.CaffeineCacheManager; +import org.springframework.cache.concurrent.ConcurrentMapCacheManager; +import org.springframework.cache.interceptor.CacheResolver; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +//import org.springframework.context.annotation.Primary; + +import com.github.benmanes.caffeine.cache.Caffeine; + +@Configuration +@EnableCaching +public class MultipleCacheManagerConfig extends CachingConfigurerSupport { + + @Bean + //@Primary + public CacheManager cacheManager() { + CaffeineCacheManager cacheManager = new CaffeineCacheManager("customers", "orders"); + cacheManager.setCaffeine(Caffeine.newBuilder() + .initialCapacity(200) + .maximumSize(500) + .weakKeys() + .recordStats()); + return cacheManager; + } + + @Bean + public CacheManager alternateCacheManager() { + return new ConcurrentMapCacheManager("customerOrders", "orderprice"); + } + + @Bean + public CacheResolver cacheResolver() { + return new MultipleCacheResolver(alternateCacheManager(), cacheManager()); + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java new file mode 100644 index 0000000000..1bd869d98e --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java @@ -0,0 +1,38 @@ +package com.baeldung.multiplecachemanager.config; + +import java.util.ArrayList; +import java.util.Collection; + +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.interceptor.CacheOperationInvocationContext; +import org.springframework.cache.interceptor.CacheResolver; + +public class MultipleCacheResolver implements CacheResolver { + + private final CacheManager simpleCacheManager; + + private final CacheManager caffeineCacheManager; + + private static final String ORDER_CACHE = "orders"; + + private static final String ORDER_PRICE_CACHE = "orderprice"; + + public MultipleCacheResolver(CacheManager simpleCacheManager, CacheManager caffeineCacheManager) { + this.simpleCacheManager = simpleCacheManager; + this.caffeineCacheManager = caffeineCacheManager; + + } + + @Override + public Collection resolveCaches(CacheOperationInvocationContext context) { + Collection caches = new ArrayList(); + if ("getOrderDetail".equals(context.getMethod() + .getName())) { + caches.add(caffeineCacheManager.getCache(ORDER_CACHE)); + } else { + caches.add(simpleCacheManager.getCache(ORDER_PRICE_CACHE)); + } + return caches; + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java new file mode 100644 index 0000000000..17a73bb27a --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java @@ -0,0 +1,43 @@ +package com.baeldung.multiplecachemanager.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.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.multiplecachemanager.bo.CustomerDetailBO; +import com.baeldung.multiplecachemanager.bo.OrderDetailBO; +import com.baeldung.multiplecachemanager.entity.Customer; +import com.baeldung.multiplecachemanager.entity.Order; + +@RestController +public class MultipleCacheManagerController { + + @Autowired + private CustomerDetailBO customerDetailBO; + + @Autowired + private OrderDetailBO orderDetailBO; + + @GetMapping(value = "/getCustomer/{customerid}") + public Customer getCustomer(@PathVariable Integer customerid) { + return customerDetailBO.getCustomerDetail(customerid); + } + + @GetMapping(value = "/getCustomerOrders/{customerid}") + public List getCustomerOrders(@PathVariable Integer customerid) { + return customerDetailBO.getCustomerOrders(customerid); + } + + @GetMapping(value = "/getOrder/{orderid}") + public Order getOrder(@PathVariable Integer orderid) { + return orderDetailBO.getOrderDetail(orderid); + } + + @GetMapping(value = "/getOrderPrice/{orderid}") + public double getOrderPrice(@PathVariable Integer orderid) { + return orderDetailBO.getOrderPrice(orderid); + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java new file mode 100644 index 0000000000..cfae15f4e9 --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java @@ -0,0 +1,24 @@ +package com.baeldung.multiplecachemanager.entity; + +public class Customer { + + private int customerId; + + private String customerName; + + public int getCustomerId() { + return customerId; + } + + public void setCustomerId(int customerId) { + this.customerId = customerId; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java new file mode 100644 index 0000000000..4131464981 --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java @@ -0,0 +1,34 @@ +package com.baeldung.multiplecachemanager.entity; + +public class Item { + + private int itemId; + + private String itemDesc; + + private double itemPrice; + + public int getItemId() { + return itemId; + } + + public void setItemId(int itemId) { + this.itemId = itemId; + } + + public String getItemDesc() { + return itemDesc; + } + + public void setItemDesc(String itemDesc) { + this.itemDesc = itemDesc; + } + + public double getItemPrice() { + return itemPrice; + } + + public void setItemPrice(double itemPrice) { + this.itemPrice = itemPrice; + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java new file mode 100644 index 0000000000..15da60d6ea --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java @@ -0,0 +1,44 @@ +package com.baeldung.multiplecachemanager.entity; + +public class Order { + + private int orderId; + + private int itemId; + + private int quantity; + + private int customerId; + + public int getOrderId() { + return orderId; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } + + public int getItemId() { + return itemId; + } + + public void setItemId(int itemId) { + this.itemId = itemId; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public int getCustomerId() { + return customerId; + } + + public void setCustomerId(int customerId) { + this.customerId = customerId; + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java new file mode 100644 index 0000000000..aab011427d --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java @@ -0,0 +1,49 @@ +package com.baeldung.multiplecachemanager.repository; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowCallbackHandler; +import org.springframework.stereotype.Repository; + +import com.baeldung.multiplecachemanager.entity.Customer; +import com.baeldung.multiplecachemanager.entity.Order; + +@Repository +public class CustomerDetailRepository { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public Customer getCustomerDetail(Integer customerId) { + String customerQuery = "select * from customer where customerid = ? "; + Customer customer = new Customer(); + jdbcTemplate.query(customerQuery, new Object[] { customerId }, new RowCallbackHandler() { + public void processRow(ResultSet rs) throws SQLException { + customer.setCustomerId(rs.getInt("customerid")); + customer.setCustomerName(rs.getString("customername")); + } + }); + return customer; + } + + public List getCustomerOrders(Integer customerId) { + String customerOrderQuery = "select * from orderdetail where customerid = ? "; + List orders = new ArrayList(); + jdbcTemplate.query(customerOrderQuery, new Object[] { customerId }, new RowCallbackHandler() { + public void processRow(ResultSet rs) throws SQLException { + Order order = new Order(); + order.setCustomerId(rs.getInt("customerid")); + order.setItemId(rs.getInt("orderid")); + order.setOrderId(rs.getInt("orderid")); + order.setQuantity(rs.getInt("quantity")); + orders.add(order); + } + }); + return orders; + } +} diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java new file mode 100644 index 0000000000..58c0968e48 --- /dev/null +++ b/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java @@ -0,0 +1,53 @@ +package com.baeldung.multiplecachemanager.repository; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowCallbackHandler; +import org.springframework.stereotype.Repository; + +import com.baeldung.multiplecachemanager.entity.Item; +import com.baeldung.multiplecachemanager.entity.Order; + +@Repository +public class OrderDetailRepository { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public Order getOrderDetail(Integer orderId) { + String orderDetailQuery = "select * from orderdetail where orderid = ? "; + Order order = new Order(); + jdbcTemplate.query(orderDetailQuery, new Object[] { orderId }, new RowCallbackHandler() { + public void processRow(ResultSet rs) throws SQLException { + order.setCustomerId(rs.getInt("customerid")); + order.setOrderId(rs.getInt("orderid")); + order.setItemId(rs.getInt("itemid")); + order.setQuantity(rs.getInt("quantity")); + } + }); + return order; + } + + public double getOrderPrice(Integer orderId) { + + String orderItemJoinQuery = "select * from ( select * from orderdetail where orderid = ? ) o left join item on o.itemid = ITEM.itemid"; + Order order = new Order(); + Item item = new Item(); + + jdbcTemplate.query(orderItemJoinQuery, new Object[] { orderId }, new RowCallbackHandler() { + public void processRow(ResultSet rs) throws SQLException { + order.setCustomerId(rs.getInt("customerid")); + order.setOrderId(rs.getInt("orderid")); + order.setItemId(rs.getInt("itemid")); + order.setQuantity(rs.getInt("quantity")); + item.setItemDesc("itemdesc"); + item.setItemId(rs.getInt("itemid")); + item.setItemPrice(rs.getDouble("price")); + } + }); + return order.getQuantity() * item.getItemPrice(); + } +} diff --git a/spring-caching/src/main/resources/application.properties b/spring-caching/src/main/resources/application.properties new file mode 100644 index 0000000000..ee7b5e62c0 --- /dev/null +++ b/spring-caching/src/main/resources/application.properties @@ -0,0 +1,8 @@ +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= + +# Enabling H2 Console +spring.h2.console.enabled=true +spring.h2.console.path=/h2 diff --git a/spring-caching/src/main/resources/data.sql b/spring-caching/src/main/resources/data.sql new file mode 100644 index 0000000000..e4165ae71f --- /dev/null +++ b/spring-caching/src/main/resources/data.sql @@ -0,0 +1,7 @@ +INSERT INTO CUSTOMER VALUES(1001,'BAELDUNG'); + +INSERT INTO ITEM VALUES(10001,'ITEM1',50.0); +INSERT INTO ITEM VALUES(10002,'ITEM2',100.0); + +INSERT INTO ORDERDETAIL VALUES(300001,1001,10001,2); +INSERT INTO ORDERDETAIL VALUES(300002,1001,10002,5); \ No newline at end of file diff --git a/spring-caching/src/main/resources/schema.sql b/spring-caching/src/main/resources/schema.sql new file mode 100644 index 0000000000..5862499bc0 --- /dev/null +++ b/spring-caching/src/main/resources/schema.sql @@ -0,0 +1,19 @@ +CREATE TABLE CUSTOMER( + CUSTOMERID INT PRIMARY KEY, + CUSTOMERNAME VARCHAR(250) NOT NULL +); + +CREATE TABLE ITEM( +ITEMID INT PRIMARY KEY, +ITEMDESC VARCHAR(250), +PRICE DOUBLE +); + +CREATE TABLE ORDERDETAIL( +ORDERID INT PRIMARY KEY, +CUSTOMERID INT NOT NULL, +ITEMID INT NOT NULL, +QUANTITY INT, +FOREIGN KEY (customerid) references CUSTOMER(customerid), +FOREIGN KEY (itemid) references ITEM(itemid) +); \ No newline at end of file diff --git a/spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationUnitTest.java b/spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationUnitTest.java new file mode 100644 index 0000000000..e02e5da246 --- /dev/null +++ b/spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.multiplecachemanager; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.caffeine.CaffeineCache; +import org.springframework.util.Assert; + +import com.baeldung.multiplecachemanager.bo.OrderDetailBO; +import com.baeldung.multiplecachemanager.entity.Order; +import com.baeldung.multiplecachemanager.repository.OrderDetailRepository; + +@SpringBootApplication +@SpringBootTest +public class MultipleCacheManagerIntegrationUnitTest { + + @MockBean + private OrderDetailRepository orderDetailRepository; + + @Autowired + private OrderDetailBO orderDetailBO; + + @Autowired + private CacheManager cacheManager; + + @Autowired + private CacheManager alternateCacheManager; + + @Test + public void givenCacheResolverIsConfigured_whenCallGetOrderDetail_thenDataShouldBeInCaffieneCacheManager() { + Integer key = 30001; + cacheManager.getCache("orders") + .evict(key); + Order order = new Order(); + order.setCustomerId(1001); + order.setItemId(10001); + order.setOrderId(30001); + order.setQuantity(2); + Mockito.when(orderDetailRepository.getOrderDetail(key)) + .thenReturn(order); + orderDetailBO.getOrderDetail(key); + org.springframework.cache.caffeine.CaffeineCache cache = (CaffeineCache) cacheManager.getCache("orders"); + Assert.notNull(cache.get(key) + .get(), "caffieneCache should have had the data"); + } + + @Test + public void givenCacheResolverIsConfigured_whenCallGetOrderPrice_thenDataShouldBeInAlternateCacheManager() { + Integer key = 30001; + alternateCacheManager.getCache("orderprice") + .evict(key); + Mockito.when(orderDetailRepository.getOrderPrice(key)) + .thenReturn(500.0); + orderDetailBO.getOrderPrice(key); + Cache cache = alternateCacheManager.getCache("orderprice"); + Assert.notNull(cache.get(key) + .get(), "alternateCache should have had the data"); + } +} From 0f851a1d84ed31d8bf4f047d61f420ab7dfc1382 Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sat, 18 Apr 2020 20:57:13 +0530 Subject: [PATCH 467/530] update source code to sync with article --- .../baeldung/optional/OptionalUnitTest.java | 9 ++++ .../spring-boot-runtime/pom.xml | 4 +- .../com/baeldung/web/log/app/Application.java | 23 +--------- .../log/config/CustomWebAppInitializer.java | 25 ++++++++++ ....java => MyWebApplicationInitializer.java} | 7 +-- ...lesWithMavenPropertiesIntegrationTest.java | 2 +- .../mockito/MockitoAnnotationUnitTest.java | 46 +++++++++++++++++++ 7 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java rename spring-core-2/src/main/java/com/baeldung/spring/config/{MainWebAppInitializer.java => MyWebApplicationInitializer.java} (81%) diff --git a/core-java-modules/core-java-optional/src/test/java/com/baeldung/optional/OptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/optional/OptionalUnitTest.java index e5c4319bf7..de16e9b635 100644 --- a/core-java-modules/core-java-optional/src/test/java/com/baeldung/optional/OptionalUnitTest.java +++ b/core-java-modules/core-java-optional/src/test/java/com/baeldung/optional/OptionalUnitTest.java @@ -86,6 +86,15 @@ public class OptionalUnitTest { Optional opt = Optional.ofNullable(null); String name = opt.get(); } + + @Test + public void givenAnEmptyOptional_thenIsEmptyBehavesAsExpected() { + Optional opt = Optional.of("Baeldung"); + assertTrue(opt.isPresent()); + + opt = Optional.ofNullable(null); + assertFalse(opt.isPresent()); + } // Conditional Return With filter() @Test diff --git a/spring-boot-modules/spring-boot-runtime/pom.xml b/spring-boot-modules/spring-boot-runtime/pom.xml index df45537940..4de604f664 100644 --- a/spring-boot-modules/spring-boot-runtime/pom.xml +++ b/spring-boot-modules/spring-boot-runtime/pom.xml @@ -14,11 +14,11 @@ ../../parent-boot-2 - + diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java index f20fba737a..40f5341e29 100644 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java @@ -1,43 +1,22 @@ package com.baeldung.web.log.app; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; import org.springframework.context.annotation.PropertySource; import com.baeldung.web.log.config.CustomeRequestLoggingFilter; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - @EnableAutoConfiguration @ComponentScan("com.baeldung.web.log") @PropertySource("application-log.properties") @SpringBootApplication -public class Application extends SpringBootServletInitializer { +public class Application { public static void main(final String[] args) { SpringApplication.run(Application.class, args); } - - @Override - public void onStartup(ServletContext container) throws ServletException { - - AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); - context.setConfigLocation("com.baeldung.web.log"); - container.addListener(new ContextLoaderListener(context)); - - ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context)); - dispatcher.setLoadOnStartup(1); - dispatcher.addMapping("/"); - - container.addFilter("customRequestLoggingFilter", CustomeRequestLoggingFilter.class).addMappingForServletNames(null, false, "dispatcher"); - } } \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java new file mode 100644 index 0000000000..f51bb52990 --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java @@ -0,0 +1,25 @@ +package com.baeldung.web.log.config; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; +import org.springframework.web.WebApplicationInitializer; + +public class CustomWebAppInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext container) throws ServletException { + + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + context.setConfigLocation("com.baeldung.web.log"); + container.addListener(new ContextLoaderListener(context)); + + ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context)); + dispatcher.setLoadOnStartup(1); + dispatcher.addMapping("/"); + + container.addFilter("customRequestLoggingFilter", CustomeRequestLoggingFilter.class).addMappingForServletNames(null, false, "dispatcher"); + } +} \ No newline at end of file diff --git a/spring-core-2/src/main/java/com/baeldung/spring/config/MainWebAppInitializer.java b/spring-core-2/src/main/java/com/baeldung/spring/config/MyWebApplicationInitializer.java similarity index 81% rename from spring-core-2/src/main/java/com/baeldung/spring/config/MainWebAppInitializer.java rename to spring-core-2/src/main/java/com/baeldung/spring/config/MyWebApplicationInitializer.java index dd396a653f..034386ade9 100644 --- a/spring-core-2/src/main/java/com/baeldung/spring/config/MainWebAppInitializer.java +++ b/spring-core-2/src/main/java/com/baeldung/spring/config/MyWebApplicationInitializer.java @@ -6,15 +6,12 @@ import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; -import org.springframework.context.support.GenericApplicationContext; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; -public class MainWebAppInitializer implements WebApplicationInitializer +public class MyWebApplicationInitializer implements WebApplicationInitializer { /** @@ -22,7 +19,7 @@ public class MainWebAppInitializer implements WebApplicationInitializer */ @Override public void onStartup(final ServletContext sc) throws ServletException { - System.out.println("MainWebAppInitializer.onStartup()"); + System.out.println("MyWebApplicationInitializer.onStartup()"); // Create the 'root' Spring application context final AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); diff --git a/spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java index 60e9499d4b..1380e34ebd 100644 --- a/spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java +++ b/spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java @@ -16,7 +16,7 @@ public class SpringProfilesWithMavenPropertiesIntegrationTest { DatasourceConfig datasourceConfig; @Test - public void testSpringProfiles() { + public void setupDatasource() { Assert.assertTrue(datasourceConfig instanceof DevDatasourceConfig); } } \ No newline at end of file diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java index 731183bae2..27e3258efb 100644 --- a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java @@ -75,7 +75,53 @@ public class MockitoAnnotationUnitTest { Mockito.doReturn(100).when(spiedList).size(); assertEquals(100, spiedList.size()); } + + @Test + public void whenSpyingOnList_thenCorrect() { + List list = new ArrayList(); + List spyList = Mockito.spy(list); + + spyList.add("one"); + spyList.add("two"); + + Mockito.verify(spyList).add("one"); + Mockito.verify(spyList).add("two"); + + assertEquals(2, spyList.size()); + } + @Test + public void whenUsingTheSpyAnnotation_thenObjectIsSpied() { + spiedList.add("one"); + spiedList.add("two"); + + Mockito.verify(spiedList).add("one"); + Mockito.verify(spiedList).add("two"); + + assertEquals(2, spiedList.size()); + } + + @Test + public void whenStubASpy_thenStubbed() { + List list = new ArrayList(); + List spyList = Mockito.spy(list); + + assertEquals(0, spyList.size()); + + Mockito.doReturn(100).when(spyList).size(); + assertEquals(100, spyList.size()); + } + + @Test + public void whenCreateSpy_thenCreate() { + List spyList = Mockito.spy(new ArrayList<>()); + + spyList.add("one"); + Mockito.verify(spyList).add("one"); + + assertEquals(1, spyList.size()); + } + @Test public void whenNotUseCaptorAnnotation_thenCorrect() { final List mockList = Mockito.mock(List.class); From c540674c1845b569b6675e167bced64944f04c2d Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sat, 18 Apr 2020 21:00:01 +0530 Subject: [PATCH 468/530] update source code to sync with article --- spring-boot-modules/spring-boot-runtime/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-runtime/pom.xml b/spring-boot-modules/spring-boot-runtime/pom.xml index 4de604f664..df45537940 100644 --- a/spring-boot-modules/spring-boot-runtime/pom.xml +++ b/spring-boot-modules/spring-boot-runtime/pom.xml @@ -14,11 +14,11 @@ ../../parent-boot-2 - + From 374905467e7ed9769c9cd6d834652a7198a22350 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Sat, 18 Apr 2020 11:48:26 -0400 Subject: [PATCH 469/530] BAEL-3965: Created examples for instance and static factory methods. --- .../java/com/baeldung/factorymethod/Bar.java | 18 ++++++++++++++ .../java/com/baeldung/factorymethod/Foo.java | 5 ++++ .../factorymethod/InstanceBarFactory.java | 8 +++++++ .../factorymethod/InstanceFooFactory.java | 8 +++++++ .../factorymethod/SingletonBarFactory.java | 11 +++++++++ .../factorymethod/SingletonFooFactory.java | 10 ++++++++ .../InstanceBarFactoryIntegrationTest.java | 24 +++++++++++++++++++ .../InstanceFooFactoryIntegrationTest.java | 22 +++++++++++++++++ .../SingletonBarFactoryIntegrationTest.java | 24 +++++++++++++++++++ .../SingletonFooFactoryIntegrationTest.java | 22 +++++++++++++++++ .../factorymethod/instance-bar-config.xml | 20 ++++++++++++++++ .../factorymethod/instance-foo-config.xml | 18 ++++++++++++++ .../factorymethod/static-bar-config.xml | 20 ++++++++++++++++ .../factorymethod/static-foo-config.xml | 18 ++++++++++++++ 14 files changed, 228 insertions(+) create mode 100644 spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java create mode 100644 spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java create mode 100644 spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java create mode 100644 spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java create mode 100644 spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java create mode 100644 spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java create mode 100644 spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java create mode 100644 spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java create mode 100644 spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java create mode 100644 spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java create mode 100644 spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml create mode 100644 spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml create mode 100644 spring-core-3/src/test/resources/factorymethod/static-bar-config.xml create mode 100644 spring-core-3/src/test/resources/factorymethod/static-foo-config.xml diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java new file mode 100644 index 0000000000..22ef5b3429 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java @@ -0,0 +1,18 @@ +package com.baeldung.factorymethod; + +public class Bar { + + private String name; + + public Bar(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java new file mode 100644 index 0000000000..54bd0c9ff4 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java @@ -0,0 +1,5 @@ +package com.baeldung.factorymethod; + +public class Foo { + +} diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java new file mode 100644 index 0000000000..f834b82aee --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java @@ -0,0 +1,8 @@ +package com.baeldung.factorymethod; + +public class InstanceBarFactory { + + public Bar createInstance(String name) { + return new Bar(name); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java new file mode 100644 index 0000000000..c3125d3339 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java @@ -0,0 +1,8 @@ +package com.baeldung.factorymethod; + +public class InstanceFooFactory { + + public Foo createInstance() { + return new Foo(); + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java new file mode 100644 index 0000000000..93802819b1 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java @@ -0,0 +1,11 @@ +package com.baeldung.factorymethod; + +public class SingletonBarFactory { + + private static final Bar INSTANCE = new Bar("unnamed"); + + public static Bar createInstance(String name) { + INSTANCE.setName(name); + return INSTANCE; + } +} diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java new file mode 100644 index 0000000000..77d56cc7f6 --- /dev/null +++ b/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java @@ -0,0 +1,10 @@ +package com.baeldung.factorymethod; + +public class SingletonFooFactory { + + private static final Foo INSTANCE = new Foo(); + + public static Foo createInstance() { + return INSTANCE; + } +} diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java new file mode 100644 index 0000000000..b5728316e7 --- /dev/null +++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java @@ -0,0 +1,24 @@ +package com.baeldung.factorymethod; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("/factorymethod/instance-bar-config.xml") +public class InstanceBarFactoryIntegrationTest { + + @Autowired + private Bar instance; + + @Test + public void givenValidInstanceFactoryConfig_whenCreateInstance_thenNameIsCorrect() { + assertNotNull(instance); + assertEquals("someName", instance.getName()); + } +} diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java new file mode 100644 index 0000000000..6b1857c2f2 --- /dev/null +++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java @@ -0,0 +1,22 @@ +package com.baeldung.factorymethod; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("/factorymethod/instance-foo-config.xml") +public class InstanceFooFactoryIntegrationTest { + + @Autowired + private Foo foo; + + @Test + public void givenValidInstanceFactoryConfig_whenCreateFooInstance_thenInstanceIsNotNull() { + assertNotNull(foo); + } +} diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java new file mode 100644 index 0000000000..403b46156b --- /dev/null +++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java @@ -0,0 +1,24 @@ +package com.baeldung.factorymethod; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("/factorymethod/static-bar-config.xml") +public class SingletonBarFactoryIntegrationTest { + + @Autowired + private Bar instance; + + @Test + public void givenValidStaticFactoryConfig_whenCreateInstance_thenNameIsCorrect() { + assertNotNull(instance); + assertEquals("someName", instance.getName()); + } +} diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java new file mode 100644 index 0000000000..52154b81ab --- /dev/null +++ b/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java @@ -0,0 +1,22 @@ +package com.baeldung.factorymethod; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("/factorymethod/static-foo-config.xml") +public class SingletonFooFactoryIntegrationTest { + + @Autowired + private Foo singleton; + + @Test + public void givenValidStaticFactoryConfig_whenCreateInstance_thenInstanceIsNotNull() { + assertNotNull(singleton); + } +} diff --git a/spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml b/spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml new file mode 100644 index 0000000000..40d2f33683 --- /dev/null +++ b/spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml b/spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml new file mode 100644 index 0000000000..c45bef6a85 --- /dev/null +++ b/spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml b/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml new file mode 100644 index 0000000000..4d1befc645 --- /dev/null +++ b/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-core-3/src/test/resources/factorymethod/static-foo-config.xml b/spring-core-3/src/test/resources/factorymethod/static-foo-config.xml new file mode 100644 index 0000000000..83e61a656c --- /dev/null +++ b/spring-core-3/src/test/resources/factorymethod/static-foo-config.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file From 7186e90e46ea4c65d3a26f4c4b9ead06586a913d Mon Sep 17 00:00:00 2001 From: kwoyke Date: Sat, 18 Apr 2020 18:04:17 +0200 Subject: [PATCH 470/530] BAEL-4003: Add byte-buddy dependency (#9134) --- spring-boot-rest/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml index 10dacf99e8..a8500d50f2 100644 --- a/spring-boot-rest/pom.xml +++ b/spring-boot-rest/pom.xml @@ -79,6 +79,11 @@ modelmapper ${modelmapper.version} + + net.bytebuddy + byte-buddy + ${byte-buddy.version} + From 32461d70ed11d3f4249f933fe0a2983069c244d5 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 18 Apr 2020 22:26:54 +0530 Subject: [PATCH 471/530] JAVA-918: Migrate jjwt to parent-boot-2 --- jjwt/pom.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/jjwt/pom.xml b/jjwt/pom.xml index 073f12a922..aa238fafb5 100644 --- a/jjwt/pom.xml +++ b/jjwt/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 @@ -30,6 +30,11 @@ org.springframework.boot spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + io.jsonwebtoken From 591c168f247d80ce0c128e22161dd8b2e89cb96b Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sat, 18 Apr 2020 21:08:53 +0300 Subject: [PATCH 472/530] BAEL-3908_http2_client_in_jetty (#8981) * BAEL-3908 http2 in jetty - initial commit * BAEL-3908 - HTTP2 client in jetty * BAEL-3908 - http2 in jetty - code cleanup * BAEL-3908 - fixed indentation --- libraries-server/pom.xml | 42 +++++++++- libraries-server/src/main/config/jetty.xml | 79 ++++++++++++++++++ .../jetty/http2/Http2JettyServlet.java | 29 +++++++ .../src/main/resources/keystore.jks | Bin 0 -> 2206 bytes .../src/main/resources/truststore.jks | Bin 0 -> 916 bytes .../src/main/webapp/WEB-INF/web.xml | 33 ++++++++ libraries-server/src/main/webapp/http2.html | 14 ++++ .../images/homepage-latest_articles.jpg | Bin 0 -> 18501 bytes .../images/homepage-rest_with_spring.jpg | Bin 0 -> 18891 bytes .../webapp/images/homepage-weekly_reviews.jpg | Bin 0 -> 20814 bytes libraries-server/src/main/webapp/index.html | 12 +++ 11 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 libraries-server/src/main/config/jetty.xml create mode 100644 libraries-server/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java create mode 100644 libraries-server/src/main/resources/keystore.jks create mode 100644 libraries-server/src/main/resources/truststore.jks create mode 100644 libraries-server/src/main/webapp/WEB-INF/web.xml create mode 100644 libraries-server/src/main/webapp/http2.html create mode 100644 libraries-server/src/main/webapp/images/homepage-latest_articles.jpg create mode 100644 libraries-server/src/main/webapp/images/homepage-rest_with_spring.jpg create mode 100644 libraries-server/src/main/webapp/images/homepage-weekly_reviews.jpg create mode 100644 libraries-server/src/main/webapp/index.html diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml index a849708cd8..eb9cb61e56 100644 --- a/libraries-server/pom.xml +++ b/libraries-server/pom.xml @@ -5,6 +5,7 @@ libraries-server 0.0.1-SNAPSHOT libraries-server + war com.baeldung @@ -105,12 +106,51 @@ + + + + + org.eclipse.jetty + jetty-maven-plugin + ${jetty.version} + + 8888 + quit + + -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn.version}/alpn-boot-${alpn.version}.jar + + ${basedir}/src/main/config/jetty.xml + + / + + + + + org.eclipse.jetty.http2 + http2-server + ${jetty.version} + + + org.eclipse.jetty + jetty-alpn-openjdk8-server + ${jetty.version} + + + org.eclipse.jetty + jetty-servlets + ${jetty.version} + + + + + 3.6.2 4.5.3 - 9.4.8.v20171121 + 9.4.27.v20200227 4.1.20.Final + 8.1.11.v20170118 8.5.24 4.3.1 1.2.0 diff --git a/libraries-server/src/main/config/jetty.xml b/libraries-server/src/main/config/jetty.xml new file mode 100644 index 0000000000..fd4a50382b --- /dev/null +++ b/libraries-server/src/main/config/jetty.xml @@ -0,0 +1,79 @@ + + + + + + + src/main/resources/keystore.jks + storepwd + src/main/resources/truststore.jks + storepwd + TLSv1.2 + + + + + + + + + + + + + + + + + http/1.1 + + + + + + + + + + + + 8443 + + + + + + + + + + + + + + + + + + alpn + + + + + h2,h2-17 + + + + + + + + + + + + 8444 + + + + \ No newline at end of file diff --git a/libraries-server/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java b/libraries-server/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java new file mode 100644 index 0000000000..56b75c45d3 --- /dev/null +++ b/libraries-server/src/main/java/com/baeldung/jetty/http2/Http2JettyServlet.java @@ -0,0 +1,29 @@ +package com.baeldung.jetty.http2; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class Http2JettyServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.addHeader("Cache-control", "no-store, no-cache, must-revalidate"); + response.addDateHeader("Last-Modified", 0); + response.addDateHeader("Expires", 0); + + String requestPath = request.getRequestURI(); + InputStream input = getServletContext().getResourceAsStream(requestPath); + OutputStream output = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int read; + while ((read = input.read(buffer)) >= 0) { + output.write(buffer, 0, read); + } + } + +} diff --git a/libraries-server/src/main/resources/keystore.jks b/libraries-server/src/main/resources/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..428ba54776ede2fdcdeedd879edb927c2abd9953 GIT binary patch literal 2206 zcmcgt`9Bkm8{cNkoMUp6gmShKn!AQX*(l6Nj(i=TnQPOKYtv{*Wg>ItE=Q!pRYH8a z$Sp#S#2lYw#aw;$y9u4T}83H*%lp zAKZay0sy=q1Qoo85aAQh;$ zD(c2EIN#D7WwYDLKUg!CotQPD@dp;5FR#bgaace(^x$6g5frD~(_b(MI^J&*A2DRp zf5Q2onfE(zvUb9|9C`66)YFRNM6~xrz4;iVbU=P|*YT2eWHFJJtr+M@zt2qPm)K~rRcqcs=LM12)PX0TT%QO zlf*xkqD3}7l)1J`5W(>=9nR0e6j-<79<11v3ZuXXcQpoCsqY~n`$FN+S}hcVm5Y>G zXnD{@DYs1@{S0z(lW+?86LWKtku$$-(khsh>0qRUXn=84`GRn?77M^_JY`durnN;KE zW#OJ`h<6xcB{I))ekGpc*Ylt}0cx4|OMBDPQvx4`r`}4Ze5_ipdObGMTi3bZHd5PC zcY0;?uBWu$PSvjJeb87nY7ghNv?%M@SoDl6IWt`bQCosfSh$#D6$ea~QhKM^ud2Ut z+9PYJuVpoELmN-A`F$BicO{BSYg@#tS%avVfb}DxL)|NanJ)#zB!2~?#Ot%H7--9N zU$bs0fS5G!m5M4&WK3#a|H|Tgw*?X-;H+Lu@kwA>qSR~7UC7b)7MJXTn6PG>n@8jP zW+}F^X$$c;U~4ryqRF; z>`j!tbLMK4ZGyY643|~?%Mu#fm!l%wAKjBDmd+VYmp3S#$scD$~bxbf|z#)hShN0*AhRaPDcmqrftGlHq4^54MM$Xfy(2> zH8QYVMzmn_oHbvJCB`IN~E&{1*h&0gEM{e zKvWvzp(!BqMX8`t#)~0nq}Wa zr6>FRPyp;AAB&)1$5@;r$23J{K&~>TWjZf7V$wFzmGM95CXhFG1cJNVAXks}C+&2- zbf9Qn*D8N}Afd2kpwDxns3%1uaFhAqDV8ksWiWY|quuLGZ0)SqrJ!Y8yX}@}IyC$C zQ3rCUsn}#>F#D8%D?q~ySy4j&he%Bs{{7V%rl!ui`@KQP?NTi+_iN{cwom&9RaMRR zB~z!hz|0HAgB9_Ijvpe-zr#jLbckJsc>vmo{+im?t8lA;N#fD4?{lb&J0V8Gocq%; f1ihv=QIDh{M_<9V+45Z2{KE4_qW}V3B0uV%GgrOJ literal 0 HcmV?d00001 diff --git a/libraries-server/src/main/resources/truststore.jks b/libraries-server/src/main/resources/truststore.jks new file mode 100644 index 0000000000000000000000000000000000000000..839cb8c35151c2b7c64afca24b6b72caad070a05 GIT binary patch literal 916 zcmezO_TO6u1_mY|W(3o$xs} zE~X|%Muz1J{3AIFGbaABoD&*5saD@gH|APIn|qhRGl}gsUzm=o9G*UXZaLfkb^*)o zjA*-gTf)`m_MQJYE&gJ}p^PHkrj!4^W|XX5a=N7A{;n#yaON&k_bHloe-^*hm?Z91 zlB>xeD=<(C>yn{9D54u}krkl}HQ(Uscha(++qf!T9y+xaEfnXd1O zi0)T?voO%;QH9LK;*_O3mBblqm)!31vU@hm;^%>mh5U@y3R%l0gzi`2yxH!+?kPOi zt!Tnsz1x9B3U2~8STZp)GB6^C5HPs_Lx_=~O<3xi>MmQ;D_g$D<_pdct`+TyzWTQ= zW5Finm(sGEe;ty^>vg$!cV)t>;H#Mev23$*WWBpyJ}Ir;RW+Htrt6{Pk&qz&-XG2@ z8@{&Lu%DX7m47Uny+-3w`=4V611q#Ub(U`xZCtSK^2LO^3(s|HW&N14dV4@A&(kX% z*S_eUPs-bSWRp>avt;CP@7K+G&3=b&1eO-s3f`;Cf91p#$)FW&xME3L8sEBQQDVCvfG>mdwqnk+GXd2ihXqpv z;usF(WoYYmu8DZZa4%1z=+hI+*gpkUykAy5tj#grb*gH!M6TqIcifYBGVe^&T#-2O K*=+x>r_BKeJV|!| literal 0 HcmV?d00001 diff --git a/libraries-server/src/main/webapp/WEB-INF/web.xml b/libraries-server/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..75d7e11c64 --- /dev/null +++ b/libraries-server/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,33 @@ + + + + + http2Jetty + com.baeldung.jetty.http2.Http2JettyServlet + + + http2Jetty + /images/* + + + + push + org.eclipse.jetty.servlets.PushCacheFilter + + ports + 8444 + + + maxAssociations + 32 + + + + push + /* + + + \ No newline at end of file diff --git a/libraries-server/src/main/webapp/http2.html b/libraries-server/src/main/webapp/http2.html new file mode 100644 index 0000000000..4563945a5e --- /dev/null +++ b/libraries-server/src/main/webapp/http2.html @@ -0,0 +1,14 @@ + + + + Baeldung HTTP/2 Client in Jetty + + +

HTTP/2 Demo

+
+ latest articles + rest with spring + weekly reviews +
+ + \ No newline at end of file diff --git a/libraries-server/src/main/webapp/images/homepage-latest_articles.jpg b/libraries-server/src/main/webapp/images/homepage-latest_articles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59e78e456022f41f7f6167157d4a4dc08e944e27 GIT binary patch literal 18501 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 BH~s(s literal 0 HcmV?d00001 diff --git a/libraries-server/src/main/webapp/images/homepage-rest_with_spring.jpg b/libraries-server/src/main/webapp/images/homepage-rest_with_spring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43d9221e85f9186b8bbf9e12e5924421462ed04c GIT binary patch literal 18891 zcma&O1y~%x(>J(_EKYEDcZcBa1b24`?(XjHPH?v%!2-cugA+Uu+}&=I_y2x!_uV~L z+fPr|uey78rfX_yYHId<`F#t3A}c8)2>=2C03i4ScwYmAg1P@D2yg=e0$hWu{~|~T zNHBpbsJ{dW{f}V&672t=zoWsup&=omVW6R){};*s=<@&Fc<%$C!U7?Ht&l)e00b%! z5*7G903ZVYKnMs(@Z^C1CJ+oXEF=^h1U&G46#)BRg4e+Rmi~`z|Lxv?wLu_Cnx_PF z7hD5m$G^yj%rg3e1RlC47S9RGO{fCFzaSKvST-bn6?$A0sWX4%U&MsvD<*kJqQ1DP zw$pQwqsW0?AsB_xp=5v7>_));MnX86Q>#C1lJ&9$#z91U4CfH&+P>F!C5z61&81za z6Rsy<0V0S=e+-_P(uqK)v-v1{1vTII0Swc3qJU~oDW!-S+Z)qKV4+^X7>djau^Mpb>g*31g3w@}$eO!~X`P<)&jkfpx>2_umE-Hl)XxrVLw$mzoY%HtzJ0C}WA z@ie*!kYeb?#*03g0!=S;&i=!&U% zu7HrLVvm<)P5RdeGZF*Ad+CeNyIlXpzu7@3J|71(ebQQL^Vo4!>s|OOVWu_{JU9IF zm>=_q_jT2($cyd@vI1j%O|>_rk;Rc%;}b!n@LyHDHk_WJ!iGK!PMYVel?A!npqhZE zh5(l4s{uNNS~a+8s{!8Be@a8a)4|@@3}j0q)%}Bh>aRCfn7!6_lm`fd1%x;Yd^=1Swperp%|~Z}-U5FHCcrR&{uJvPpw$#wt|PjC zXR>n=2*yBy^hHnP^GBLr1lB4kHk~Zk{;mRm74<`XefG0(a}Q&;&pTj!%H_VP@UH+E z5&7zO_q#jsFY|vOup$$H74?7DV*nI11SALu1N%>nA^v^C|6%O^0|JIo#2EcURS!4q zt;+kq{9~XHsrSi#lkUj`{$+v4JrhkyCe=Az|AeZxE&TgWYPh}sWRo{(-qg=^p8psu z=uzdV+pidHlBi|>0PR$pdLCQ>wjT9LNd3P{2f#Ct-JD)OuDNy_J^%i16u>wW=KEg} zJR<)G$RAstyo`llMbbPt2V;I$THt#4`mXia8-@C}9^lY_01SM{cC^1b`T)dXx>*3d zLY};WF#yL48MFGjYcBR=@cu@8&7U^)g{D{Nzu!tswdZnn$g_!l?d5_@X`-d`iOz8l7ZLD=xhN0}0DFDc<<>V9u-*Zm|E(lU?g#8} z76=bzt^mVte}@3*{e4DlPv62C{&D}WRRDOw3I8tm-xdF#y`Vu*Fc6TiK)8P^4*CCo z#pk7yTK`Q0kr$EYz*70jhxm_0(MNwRVr~-Yqci%)lOFf*+(|DlSaogv<$<3@T5{dK zkBKM*{$)XJE114;Z(7&Ae>o_9|ASlQB|c|kxegphtbcn%FOZaBz#FY-LI0566chFL zv;+VKBGRUo+Vpgm2s$$#Z~h_x*ZY4Ph@gc5-yK0;VnJjfq_|Wt#v1U~nhM-9fopDm zUsv|p8xm?Cn?j_F6C*I>RUr0pVd{ghWY`*f4emFwm1kHmisO$IyP7j@_J^4(Y;04i z8XujjTFd1X?i4J89Mwr^^OfF-+i*}c;Uyv zEhzL21cNghmOztFu6=!hoB3&A9vHUM;fZZ)@9S&@7`qXC`D>E_19O6|eF%z@6l$-Y zY=ilMrfXNYWb(mNU)b%ST``ZVG5W1ANqcGUPYEsc2 z@xPRy*6Uc=-2PnbKUbT--TqJX0jv^&C}53%06;;&LV)0)|0)I~6a+L71cQc-0YF8; z#3mtS6;@|ag2f_ZW9J~J5D^oXP*yRf5>-`m)cDWE4u}SP2W;c`X%DlZ@icg3{V8_B5w8E-y$c)6xa#Iz39uvukP4%P@OO^sr znA0F!Ws3CV6Un`nrlC6)X8r8g_}DM{O7Rb^I5yak%)` zN%u!9=Pc)Fo9|T%nSm)G?6IBF$*8(GL#(l;L|Vh+M9G@8Y~tSt0zYAca?5pmC!NjL zxrFo02KwbFcWOlGE={`TChZ|bDaC;_(#+7fqjRvzobKvqRfBE=DnFE|P80*ylJijU;nuiJUw;`ueXs!6-hQ#P;J56xo%o8sV8 z@_}*^^{0dcNIo_^zvv#tqV>z?R%dWUh-w0pMn90ynB=LCIl9-Np`^h3%kH8fk^=U; z?4nHIqx0OtnTiszR0qWIioKanLUpy~h(=nD;ym-dJcT1lO||K<5qIzHHw@+=wh^>v zR4!e|>fHPq7$|ECzP)HQu`U2q7uuB&KyKIj-_xlV>)PUM*Q^DyRWaABb{ed&z5_~% zqa;P-*aqYXhO`MHLts*i2|nQDp1{HNHUvrVqnHg*u=z`x^g_^%=PQGFve+}(=FuK& z9B4iv4zY%s!b+ipvi`<-!Y`h{%PYl|(zMXCM6z(xOy@aV(-Ve$@tV_jq(fzBFzMJH zB17>>*XhRW*Rr1^y7CwM0jXTSpe){43pKphTO{*@Xv{>GyVo0xvoFEa^R>EBzNQpW z-stgW#n_WI*6X0m_}cwsFP6s2k}VcqyEa^w9y*E}-g&GB%M3^3C3G4}<**;k>>+WN z^Aa1^h9}h&l*r@+QP-f31p(_UHqA5L_T@qG#d{M+$_Q{bcQCWYprgsEvuRO>^<_62xP%$9B3Rkr9P&3!N z&JBduQBqz^m`@tPzwHoAh7^Lr_7?a_fuax?EUXDQk;CV9&q&d>8aCd0B=YI+fPz-0 zo|5_5@ookeCvU@5=Xbz7jd14gTvqOb1FR#Jb*|*{REanbbqaP%X34Kr!v;jWi;}JU zp2v0d-1_#)pbz$h_}>#SNG(M$(X&MMnqj zA9>}-)|5NP?nPxLoR18rOmHuBBKQHFQwpfkDrC(dp zdG<0(Nf6Y_(lGI)^ZhixPS{8aL8RvUq28kuFnXh%zI9~a5=g=U;LWT`$1=)(?_Z9q zE7F)8E{~J4>DqKW_m{5m<|bcFFc#BHvF1`nNorlkcH@^4st1dL_1Ky_tRMxpWv^ov#h5lv_IQvE8^HJ0%B} znA6R7T80T*ytRLjWhZmH5IYy1*3mcAeMK}L z?MPR?Eg_a|SZKM$^3zr68dktr%II9=0^0cbuBx};rt@6#^g1TNF^HlJx$qRxUh3?- zCrEM6e2&YUFU0NF*@;QC#DT}}i`n`17FS>?r6tyGIvIg8tx)$>zSy~ztA@!k#8z|f zj7jd#loME~w_|;;Msu`2>yQgdEDZ_hL1is#;#^{UO?okF5SYMj@*pRNL~+!+s=Tem z_@W&gC@>Bg+SIWCAEw8``J`XfO{sLxaP-3hr#B^g0)~HNd19r`-NHYib6F8~=X+mO zhjeV2S>9w$`@o6rRN^DcDiQhS$W`qQP?fC#i$|gn$oRU z?v62u<_;ku8vs*&5Y_aldDMJh=`yjrW@*M!X!mn-V&Q##J%dcsN&9d*!z-6%_6VEu zG$eBdjcm7qs#f`fij3#uXto=!w(sco%n5(J-ww`;gxnLaL#XKFV^gh-O-^Gf82vP# z5>x$~W&+biLFBkJa7Y;=fzcRCAt)GlzxQ1(D4MRhbuvl0GzWG%i9?PCS-H)eMj~)c zv~_=h)x;8aIG_D`I4RktKtSxSIKlONA$La$WOm&f*k#U+sx&c$rAonKl!DtDL!h^P zRL(ZE?1awDBmC`dxIf_?AhEl~jO-6SwTM_482~Elr5UoD=-HSflE%l#wU=O!`C-$59F3@uEd=_?j+7|H+ zaN_dyvD*f__ei^I4jbC6HyLTfguzchGqnC$@>fWrt?Z7P#O%kUh-99@1KwWS5#1As;%*N<dAZ>8M>7?U{?eEX`Zr+#vW|Dxck=0`IrkR>~8V|_QKW~x@31YcV# zwC$LqI5pWQvUnLeH)DaQg+@9)nF53J)HL#H-L{BLDcmsNsKNGannHEgJ%&;z{ZJFx z)nLNOQAjeWGQ?q9fbFO5TsD%F+RhH*HIhf_zryP$516!}UQ z#l|zm`mty2WjA-D{6X1CcIaUisk5V7r)9TE`)olk)Vs8$w!y?f!=eG!>%j9f*-7c{ zMOsG8n%Z{W_At9v#ppYMDFUVF46(9L!PuJS*8*j9zmv13oXh(T9X?#NHns_FuUHg$a@rEeObY@x=A4bu$9N}|3pa0zHv$?AK`L;w0B<-J1O*+*YSd(Yt| zg{914A%_v9Qk!K@+)}UH#>u;&yL>RfPY&~$r1rD*>ZB3E=bmzVHSg9iDZ^?ImKweu zlwFK_!`J28U!BrFIn`NBjg=L^u0qd1)i0BB8#_j|SMhCF^WWVNM4yzSg}Ss&STAmj z>OfV4@Od3xYDj*r600BKBs`f&nxsd+^DRjTtTOf!X|*U(Qu)%%(=>k_&6nfKB2m|t ziyd0AcCpkb`&w*A!@l4=?y|dy#-+!q`P9czZA_cMKIM{oz%!liay?zFRb17i^0fG? zc#zRkg!Q=FrP%A{vV=A59dOlHyP!+4ke_>)HHMO8dpr5ziH|Qr=*Ft<_W@Fu2V8;0 za%Da&7Y@>37^+9HJkBTb8G^$! zWf))ZJbp`Te+N{2Zv1_vC`9ZZecJ6mqCqDKx{4i|Gped|>(#TuK3?GFF-lyja$40Y zb!erP5FUeyl4=@i)3o51X`5qYn>(uv)UXL#X5u*YPcZzpf{Y3M3!?RQ_>gc)&Tinj zI?!^zdujxP5{CrsZ{_xo0?p$0G=OAf5@!8yEf5rrYBI%&5rHxS%+yHKa5%1s7+I8C zyDieHWzV?@E+)rJT>}_TMjuWfA6(E|agH3v7}|d5_@Ko*XBD%cgW8j^ZeaLEr@W+6 zw5%c*>9*X|k}QyWPUjw1_=B(0j&WjXpaD_qP?u6is>vKS3EImiLkKdMSFLHF&BxOf zMUwqiK_dV5M2;I}dV;O_LtUd`6)O?FN0@?kE@t-UHI25ql^ZSn#%xIB%VHfXE*I?z zvxT84KV8f7qr+n#g(f8T#oIiuJjcbwa=SPw*$n1t?y4Y4=2VydPZNIP_owFPH^DEI z8wLpi&Ty;!&lK{iW^=bl6VHU?9HlL3cFyhhi6U!~y`zTp7cY#wJZlj^-4_G^M7n6W{*cXW$H{vtAAFG1P$iIai3_ zaUWeI0-M+)+j-=W>&VLE=0DYLR#PJ0W58TaT~;jz^l_@zt2U<5eIvF{D(F3+1ys#Lzv%MBRVx03Q3$_b3v2@$=O*WIBbP2=#}g@=5A`p?S`$@`*&rbAL63z?$aG1 zjC)CPx*;yR_9PL0$m)lnBEg=WGOsC|e7NqB)q=uRh+3>MSv-%cux+@H^ zvJ7XU8_yX^_@B3rC7sB_eq+~ZB>0Lb{~1-Zp8_SB2hpHp92ncR<0^teIu9s9eH_y( zc)15h3#7r(0w5#=1PB@i9tsKu94!DsKtiFS0Z7qVp)ttVM3hlT$c>#?ghiEtlIGdP zR7{+czxOaH zz_x}#+eTAEemCzx#(LIc5=)x>Q*}#L8Nj_FWFq9^^2(?&4MFhXruMKNP|$lg1ws*(h{+-YNt&nwTTPeHU3k0d92X-hxY(e0cGw8QRz!Q> z^O8R=5(0epvy30j*9He8j{d03MSc-;V=XFT45#iw*1T+8Et1|T)3U$@c@jpr26b87 zZyIS?Gi1Y|#?|8|nI1SGBvc`Ze{P9dmLUvh@N{w#7JLUFpZ(=xvhhQ=22I?B>QekPuA`@De3f&OXD+@BU)FK zZo1=|scj74KUvA$t`^gGeNKV}rb2J0o8(+wd@n!bjpm7TN48st6T8O#x~8CETTa2n zaZU1RCsq&3?Ypk0cXA?mr3<N-=;&vSl_XA}CLg zs$=gNEcuZfy1BAT!=@h4(`tPMtlpjE zySK&bWIAq0#<=%>^wssLeJhHzI2_nBywT{*$-}HfVPHFNpw!T2)iu9y=DGy^je1>jqA5%%+^Bv_KFszO`{b|!pl&a(O z^hx2d~UXB41NU;nQ^M!3@VAyr}4CCka87F%U^^rq&m{ptz^ zr8v|52~^P6k}#Hx+p8bDzx%Ty5L=PMBj{NSK9g+(K&`C8ef_d(InmTF zL$Y7!xNQ^Es@L@nqO%P{|U;e z-Ioa1h%=ja0GqB32hp7gsLQ-6FSe=eoNMDesa#iuNzXWy`bKBH3qUL+Ii-b-ZGg}6 zUAj~O$?yKzkEu-h&~(otNklj3Mq`)!E{Pg(tLBA2Ye#EQIxUknkt_`{EaNJi^&82P zQkb`i`^Rw$jXlj_wV#vn+WLrPqY?tmFV_7XX zDF_lb^9_oPzp_UT%vx@iO7Kv&HP8vCP@;1Tyg+F!YKKXnfwI;Zkg;A)lMs`i)8O%33Cg4sVL2ObgM z%O?yQ{Kjg(rq1G3jZKp6UW$uwi^#8{@aBE?Vu$kF*svHls`|DNMr2Hz=y3USi@_1{ z#%jl4!t|#JMDd8DhKWN1)qz^=at3OKn#9_N`qINb;Ty75-sujvvQ zmA4~g-Gl!Qo4Q}&8+yNU7SgnNt=qlt&1eFw=!>*1%AR(qh_MaIhu%Kc$f?(MTrU@A z#Su*CS+iCV-Ats&p8mbmBvf-A$Oy*xXYZ?z$W*1tULV+;m;r!f50V1(>;6$?N%2FI zQT>Z4oRBdu@fzeYCXcmd4q6*6kXY0&W0KeGBk&DWNL{7wgU(S}PuTyx5fD*Vsrlf2 zl=eRwh7onu>fm85hAaO|L-}Q1U!(ZhZNXZo?SE-F9M)BTyjfDud9taReB}VbTOEDg zbFeM(z}q#wsr_AQo64#rA2&JNb721^t=K9}pF!lDmj3QYK9j>`j6q0Uy6L(0y3jFR z5E?G%Tj=$<^Rq8<;$Bi(EJR_lJq%L-pUrYA&jU!1pqJNP5mWu(6VjA4<^{~HLRUW5 zKth+dQCx{pTdNe2EOR>_lGt2>;+%V!TvO!MBm#ih_Dz&)dsJ6bP!G@C?-Gify)C%1 z_3oz~xrCg)LdDy}*u*-IazEo}O@bN>F3K@@3kXqGi4d(z=K`ffGD0 z`Svl>Fi~Fn_<@AZ%MvIFKCn-qy%Zrqh~NQ(KfVG*c4`j&=!|%514vKnR$U6*kb6)&A7S( zvG8JxN97cMxF(sAJ?szi33ByB)KXr!6^R+dwQd)G7NbWtL^#qaP3Fb(BHJ03nEe^U z$uBqvi)`*JXV9DPDBciHsW!JDu8on1UpLRjfa;4kG3>ANd0<9k ze9rV`st#A_WK75BWBSL{Rn6TWa#~WY!ElqYjYIC5Bz|4f#T)X?2|!;}WFCs1)wztN7@$Jbfg(JW?U!R6FG8LkLgZiL4pJty%nbl1G%` z|J7j)V~6h@u(qHjq7OyiDT6Ozme2Vl4sAS9+qRSY+6o*e?vc%IJEu5 zNe@*`^IfFTe%jNaLNB;sAthC$eK*1K=Y8e(oHqLKS|g>pXM&T6$%KsQ0|%2IHn}U3 z8?($#`?AMx&%U9>G}a_(p3V|vr><^XLj8WOH5c>piqw3R@){i1)JYZ^*M@|y4suGW z3m{d$KTj-+QZ(1<<+#q&Dynjd>gbxTlLT~?kJ79Ba=^9mw59x>{uYHa3>6X1{jw}A zF+yRD^m{3S=RLc+a{8%_-9;NmVuFOVvXnS=ZMI-6*(}jQlQ!FgR7RxFS2xlsg1uan@c0|1y4Ufcr03>nOi0y^g#8TP&8f3%QeniS@dLBXpTci2)7v$;Sruwiv~^Pq_)(`Y zWIUdFFV8Hw!XvZ1cdY^$T%g_@y?F1~?(9UFeqHPyd%+PCxUX8LjvO#1YFB~^{8Cqs z(1ki9METy5WXL^Y zr`X4k zM3Q)MR7WZDil3{1+2zY&^wlp$Fz&}b8%svzf<#^>2ml1}-|}(ad+j-VaRQzlG~Afc zpQR--A^2Zz5r45lz5}kch30EwE@oQ#_SSNc>g##E#TLPqQQXqN_B81o5TMmmj;6=- zkg<&J82I8!&4yJegq?m#5J-^VFrUh%G#EhL`G>fFC1knUhrg zM(e9P?!c_UGsxe?gKKa|8n0A>LGbgqW=3P}9Uz*bPKX2|f2*M16FQtz(H!JS?|>B7 z$}-swY#cl2xwwtIb1c7hpnTJ@up)3xO_T=NU_O##`^3xp)s_I&g)ackPg%A)T;vwm zmoQG1ta zX>AC1xReVVr z-Y8m?QH@a=YhTG^A&8(9LgSQINZ_RSwVRuCNxM6!h0pSlzkXKk zAG9`NWm+QrThF#i-Q=Xo4<*#+yi7;Y7O9397Tb6`u7#m#n%a6G_Q2A{ZtNYPDTy6j zAy*WuYOg%V?3YXB4# zRvb!%|Jlf$&_oMgXr7%B)U`&^JQ9aU;PIy*aPL~Of`%k!<)QGCn>)a|daR%Jb8azO zCfRK-1Yc*zSja)-O%(+xoMh4ii=XF((j}}WT?0T{FM5H*6icZPRSCD3iW?We0=Quk zenj~t4cfx!kB+u+)@yU5q}u)2SK@fYl`?joMh|$*U`xFF+^oRAh-14DE9`z`Hzi!S z6ys z`}o$`{J5#Txi`@9Bugfa9BQZU{=rCxglL4RV+AWOwc{X<6oxk#LH&tz03jVM^H&^6 zl_ldI3@R+nI%c^!;2^veiwMr+$oxxrx*NF(U!N2|OOYrs=DmwZYlbqZBLP+LQ;3D) z&n$u+*gpxJp@Y>3WP4SB-@L?tjX*LE#Xe?~S{fF*pc(pJO!MHI9NZHK2f_106>J%}J7*{exhBHB)P1hkPgG?j<+zEUP9zLA+j*C%K|do{4AL7YMtrf;afY7p9mN{rOcO_L6a@OcLeU4-#~DtzaK zdW^S6f;ezy6fbspAb5Ky3aDJ#4PUBXkYBrAjfFWG)njXoK zu$>cl>i)4|I3*FcCQrk z)$(Nm#hVlcK16&6XyF^pvD;8$w-WGnx@cl>PmlNg(aYBK{YhU)NL>7iIXj1q3p4)u zv`fI94*+1gjsFq!>}OgdO=U&lh8~G3G(qA-u?z(87(t`5q94rx6ad1G8JC

gHIi z1hTE3vHR9+{%2(o>O#btWHLWgv%V@4GfNpLpzHI1*wfWxK>&?d+5E)s!QL!!(|{?s zLFS&f-p^~7H#7z|H@24k+^dI2NACc2Ha&2g16=o$7C)!E|np-=Vn0tBEkkYKg4 z6e1;wydPmp;=B}tF>pLNc~cCQLysV_N_|e{^`f((QE@9d(*W_TN@bzVHp1;sKWV8! z5HWU;6V`8r5J*UbmL_5l1&6S-x9~H&PRbCPV47o*64@2`cN`-@RYyuZPIb5477g8v z1v!{7Jer&YJUf_~01mIf2n|TJ*)5g(oPO(H7#TA0WA|v~Uw)VfM*)zed!4p}R9KnP z$OpuDNO)n)C6nlbpYNWK^FzYNa1$-8)vH9PjCem+E1Qa)@fa%>mNlZJvJ&HzCr{v$O|Tb}E64Uj%x0Zc6SC%j~2V9{7P37`&B ziKerzUxz5f^ycBEt<_<`l51NTJ?p}ljFwgxYdafhj}s4^s6*j{rpDZ7XQT<{+zFZ= z%KUOSbZ#bCGPBi-A^k&nPl4pQvVsPgQ%HpDdo(|69l|PqWrg0Bxkv6tktau@;18)g zRP7Efc_x<+=~U2gN>TSwuLO(1GKUOCj<^8P2*~+DgOA<*AKL#Qx} zv=ot?lA&fcUA9Jjm*N5)wt5gwD#+fU)Xy>Ad2aRa&lk<&4$g3XIuKW=7+DI;q{^)M z;e-)RUSzqh^-!Nb8uWUYMBaZqmx=y#WR2C0C}DDGQIGY^q5*|M&08lB9_mYa@e1fz zu6dAJR*DlME+@M2nt)NuHVz&YP)H)c4dZK9qxAu2}i%5*hJ&(YnU~i+7f} zDs~<t#iz^7Zu zs-x=L%t!2?{>Gv-jEGQ-?}~e|FOC9?I>tX-uSHdxdKK>&Fnlj+-@@Tf0t0UpkcMCa zo3cgb#RA=iXLsdh$WCvi?0-VX4S-PPFtosjsEi~qDWcdwKEIIowjW76@kawl&-~)~ z)Ht=xW*Kyk#zwP^AaKO~P*6AuGJkPV0;2r{f{JHSVlfAb`GY%HFraDY5Wf%83Km%o6?L53ZvpIF{N3h2E@!DBM-?~WmPlK$ZG9=CooW*m)e~{3n$f<`%v4s zuQ$rjL*XJEz2}||d+8JU^iR?oG}u`*2o}leEuq8f$s>5%fS@-^qBB38JJNRm0Uh}x zw~2>-dZ~bk`k~tT2Y|XG=M?7yrB(%r{ij98Pq^gH-hd>--f(Z6KYIWiL==`6h#A$i zP-77!_u%hHgyQZUlfk#uKfV`Hps@?|M$Q`8&nD|frh>kpO9*I!9UguWb%TGh#RHwp508l7ia^#LGVtJ4=?cl_^hTi+i>)IsD@=g7SoOCd)%K(b< zyM*cq8XPZ(2=0Z2c!1Q@C>0|R$1_ilEvQjMA1^pR4AKKrvy^5o#p?PU@K)PX=Y@A& zFgbm><$M@fVF2R_sIQFU>e%lL$&)wuO~S*eB#cs4D+4Er`okMCkRSM9N-sm_6Y)ByNIrvWTYt(EIUn_{j@;@9yyM$_(M*0 zYjJ0X#r|MFB?DB9hZm?!Ij9Otnmge_1b5n44AgFT#))R9hO$23Hw@aNIh;5*G0>f0i)IHt=!Jak? z_>CEGUNJNT2nYrFFZ=lKqe1{QDjEm{i$n>X6qAgFl}#9foPu3M)G_d%!wr7H2Nv)S z7`&3kl*6r;#&@jtP_(#Qs)1xK3kb!(7%xf6ywipna;-Y4{f4wrmM^H|&GoR_Jm!!GU369g*^ zGig`>uDKW@sbWkcy+1wSepIXM2mXy*6{@>0-V67vJ9)4+bx~vIw>1=E+0wOl;gVJ# zBBL^CanddJZ4LUjN*Q4dcO&c%bmxdt{N5^?rSuRp4G^6E~tCcb9!C3@L9@<@l_>&o($AsTZf zDFQtjWm#-k@o(tiSWL8iw&qEa{n{@}@T+mYFoXelf??o1gEIsOc8Bl}Y5lUKp-;7N zEtH;VL^7rh?v1vX%Xzn3Y$GUie>g4(T%? zbN4q0#E5kVZlCWIc{E5ZZ1#j-seV*Ar_v%||Nq4tX^KSG4O?+eIdz(SxwxMR-ZHi_!fdUmv_GU9;)#2`$B4AYdh z2HF8up`TKTfKP$^?e5Z%u(LII$-{QkO%@paFKqtap-r}!T=r`MiNTvk1u5oG=@pzf zJKO|#46;2(QryzAGE{T>i!zK|Bj$LNm8V{N>0@vY)<_a*tv<+vJu;Tq%~*84Cl`io z1tT|PGseRBsoHH>sJ+`jII@|-4^ZEPhJCT2SP+M-@pF8(;Tc)r5&LmNgl&vB@zhb9 zyebPll(Po%)riST+5+FQ2;Z(BDJGIg7yzph7hk&tFifR081LZ~P7|A}?R^te;PN&M z(~S230ARY<3wCIW^|k7lUGjj1A`qv@3#Prhy$S5qfAf9^fNc~r*hWDCfiMuD{{#pD zkU$71Xb=Df1r-e&?6?SHV3M-1v1754Q~bwm0l!f9Uv3NX4D>TXPS` zouCfQ{&p)o@pk|g519!62|stDk64-Wh1vw2 zreA-$D9v04q$wOuK094^B6Smm4!zy(Ij{ksrCC} z)#!foCM#Pp`ymiwjNkS!(Pb zk;M|4HlNuLg_~e)YzEQzMCm)Y?*Pg;B;SKKG?M$tc%7RvJ{Tcgvhk@7@p7-=D<6e1ZCK$;T`=#?r0OMtDQNncIDNtQ#!70<~=$^?&uV& ztD8A=@0O^mSGKACsdIFT)zK|cx(1Ea@k6SvLHW1_!#j+{8Dj41h9Y?;3=gK?B$Sj? zASvGl#^?QN4K>TqI{bT04e4~lPYf%2!(=Udhg)G2PLqy+M22MImZlSV+Zxof`!$ok zT(X)=`(c_j!MHeNN>xLkmrcUgCBhO%+r!_Y0i@4XUnnYqvC3GBYPZ*Qc3Bwd?ri&# zNL3RymqjoNxhdLfd}$pZZ<}HUpcY~uoyz1BmrG4iDB;oQ;4?=cqUVmRg>w2NRREf8B|mPSmO;Sp=5auFDM~d7 z&JeN?6rU(l(4Cjn0>ec!_Az@FW0WA{WUz6caL?x*lyd( z?ffuW6jvbkqZoStsoskQTTzN2pf6YBRA~31YyGtGMf?Luro?sjiwca>>}#y!7o&+= ziw=XmY6*zL41jA^DgK&wYTfQhrE&8ZgqPQ_gC?TGy5&hiyL)Mfkh6_?Mt-3S3mxqN z+nrhY`Vn*W@u#J~q>J9I#?H3QiNu5pcYi_gFShK?6;&5-t30H*cpWW_KLl&_VB?~%}S%GzS?5GAYi0U#${T} z3XnUcH3vV>=uGQ&4XJ_5iR}bkoe!lRp*;ZvAd3Pq<9kFbE*CvL8VplOIDe<8poVOh zfrvLN-6CK&Rn#Q49E>DE!V!8d2b(rYRPcW*0HGmaU}2y^f0H-C-WVzX678P@M#cvA zzmjL6P)L+izBK+oXAyM{E}A13ZtA4aOat_l~p!SbJL^n>0 zHrLvlBeQj-60E-F+PBZC{b_Feg|EYz{ztluW>_LgecbeqcurV}K0&i5uMT@x>AEo~ zEo+>LTC!T6i)2ewooh&3H#3V$iAg4p%qT(5WLNE(f4yAiuwH1!20SAd8Krxc&IM@) z1d~ORdf64nlKz(X4BH1u?%bwo$+S{a9ggaXW!ZUkXAX9~xbS@UAbYFUE>(dk^|DhB z?~aS0Va>vYBSxnHPY0%%(-eF!%6EV}^R>?Y8}R#)A>Haj%$tew8%bNLzQ^wFfga}< z#TLd*ci#GNKVQS+Uq>^(MNiH8r0Ck+_(*lH#H)rKQ`)1RnqrPVuMn+Kuld`oX3pod zDxAMiF;<&huSav5IzP_qs83G*D)jEu*30CDa}KE&tY_OW=nw_by5qT(7XM!Xr3PC0 zA0~$$T>CPK*NU61c{|DPl(O!WkL9*(Muzuc*3h$A=E>hFHIv%*Q`MCENpH-F?I*z6 z^`&X;G~Z0n1|vb01Q@b8>^$@O8QkX^!&vx^({7f$`a75c&N0I|j+Cn5trn;IS_F5y zUMs5f`T4hR($A}yb<34a(ex)7Q*u8GVj%`m%%o}{Q!MnATC{S@D*BxM@bkNAh_0{< z%512F@dakdrgX$8*M^m;rWG@dBDmny=r{0dl!qy0F~#(iwn1<3H&WzB{$!7|?}@PL z_KRf?Dui&mF+ips%=-;|`OaBJCbE{m`MWIF$}e0~cW#NoCP!bPB40<8VvdejYHTWJ zkwC>%BtfR2naFeHP)N;r%%%da7jLQRCW)x;K4VcbL{isvy-bj4Eu3&U=UtjIqeioq zYw|c751o9?FFd8gUC=X|*_U04LI53KJ^R}gH8vt>j>P`5vkxhOrX_^>+A(@^TU=e- z@s#m)5e)imHva(1J*jCP5RQ>Qt-i7bQLP$gR+Xc&v@5=ctM9WKJej$iNYdBel7FVx z-UKYH2vhcOz-Is;09_+j=c=u)DYsb4U3r=0v!qb;^@U-RKd@VV5 zUkhg$f^;QM-*pG!`_{08N2($F?%NcURC-LGJQ>N@75@O?$4gG>y#@L*V?4FUsa_TO ziv1PcGBRZ*w217j6?Ox*mW~L?V$Fw%ydEsv(Wa+T}MiMKq5?#8S3kj~dPZYg9O7*g*OkLiQ$en2K!$IS#x2w@P zSDd%;Y1tZn{#G*)>$b3xbklEHpPLH{<1AWZD~Go;EY&T47{L}$y2-;D6lANKni0rt zp=6cuD&?CJh}U&mWww>s=@pAr9ULYh=@O&zt)m%A>JgOcDG@3{?iiyUNlM~YwWVER zLRbbsQ#mY(oA5EOpc1;h26vv+jPP%X9nBTbOBkmMxWR=gNuMrpO{HZ=bt{!D);UzI zNXu+vFSHJgJ9T{8w$LbbdV~HX2du1q0p@8awH?W$V&dZdGOHy=Oym^h4N;9`@LD#! zBMmtN99(MhsP4;&=q?+uQXz?}O}PNlu6mg^xM}|Yb3WWO{I-(eD=12sgK8#H4X6pL z8fR~_b$RcEqI=syFuP=@K6RGd7i{olwULC#&C1?Qdw9vJ;#oX$g+0xe_I&6|ogC>} zlq6LLD5LgipPjAT>54lVHR^bo+Ds>S%Cy}rPKssdY;B|J4`cbCsH3qR5y>72{@L2_ zgod~#f;=TIM2?hqmM*U47P#Sg5?#n+CBz_CO4@ZL8b%CKMk~k#H4>E!>!nLxq)b68 zsWpl`sJzltTI8DZlPh^u?9JF!_s)lF*J$9ntz7FVJLKhBYyb__s``BC$PTua(Deb# zSiKU_?J3vwGLec>iG&_$6Pkj6A;r;`L7~T^)FojukM;1eTeq7niSl=!FQ~kg+jibf zaN-dldqYzW=UaJPAH566{39!QMZ~|A4>mvZLR zZFzMs^&o!}8wMTZqa*UIwQZyl2Sfq~!_qNMO#^z`lE0D4m&o9I^>zoTc{j1<%XbHO z`?V}#oLVQM5~b9#bkx?~Pj}SbAI_fZ6c;0R3v)>e(H>Lo8)~)f^o=<%{%7Ue>Vm9F zPMfw%t4D=49*l8Dabkl;jWlS{%X4Vn$MHsA%L`vj>AOB9Dwh zAW*^HM*u`11;N1~K*9n40vK3mIB-ZP2zapf4FK#v7{7x4#r^+XAwNd``aXMbJN=g) z*Mwa0G&O6sQ~xcK$bdGM><<Ewn?LA&`A6k;1H zQWZ>&t}Wqi)=u;mNLoA_K~>#50Bd`8XBCmSRfhsI04>{I?B5mV(l)@`SL))Qz{12< z_!mUgDnYh@XU3}x06?Ph2LS-6`P9mwi`k=vJ4hTk55Alc;7Yf;<0zQwD#P=iBx_f^ zAwUv~W5k!1EoNP4W2-6~g>8W|5Le2HD`S&n`{R)dHnQHMMk%9^ofg&%XUD@vT>RX! zArjTqCy##$u|L$IJ1?Hgev&JzG-i_M)uVfG@!Hf^bvUgs`qKl!t*uQx*2{Hj_*2P` za@Ch6%Pc8W{;9)0@u{8){2(EyBWfjVi_1a3;9aH<&upbmSblH5ZItY=uWVN&0RRvc zu&0xRVEu?a<~R}Q?i3&N6-spRAwd=C`&Xs2cJN6%U4C`GO{|h2u($bL3xOEKcr_Gr zbm90BTMy(;+&RzoU}jhLAv0z>ARcKyL`MaWmBpH3Af=WO7p6OZDsnG~4hZJI;ea~U z(w0X^&OB_NooUSf`G;(pEX~xAsYpYeE9*;C(AWEl4$=wK*%q_&bjv^2aMLsHE)cx$Q}xhZV*i-T@*YvEVg1CmpO+B=#Q(6vmP@ zo|6Usv;~u>Z9iF#7566(h=2SQPCP3b`VG_@b0GYKyLICaoH|C$G~$>Tdx{$n2{Ci# zaSjL1A<+ol<{Y6AM1gXTLi`=*`wD6E>iB0S{1fP#3IPBLhXK$C@{a|9z4Vm5fthXx z{Y6uMvj(LT-`A((lgM<R5U$>dievIr;NH@eSGvp}7cMn*U~1sr?tTR8Paz zsPRPq@v{(eeBkvZI_1BlWo*WolboVGtkt@c$TzMG46QvGfdp3UK`qm`3kTevuzLqz zUVNhI@c+|}!0rPHpXYZ2;{4s<>qwdJL7<*VOpu1q3lzFfR1dQ1LH={+@E2IRz1-Ti zSIJ`lE6$$4zf&BBunNr-n5_zZT@ES&fH+PreV$tku1%*`^ZP>p_<7HeA8G%nGy01` z>cXyg_80!m|Mw&iWEcb>llb#={0}ZP3=}LF1mr&~0|MngIRBF@&!OU$zRTZ|oTlU+ zz$~72Aiv29*KK081JR%R0@#iTk#>$s=ALKC- z8k-dd3Z4ET1CS#(;(F%=C=>o-rh?l=(D&Nvl#k%T1qUD!g#IBm_8cug6TNw8IWbZ* z#h+rB#QC1IP+&;wxB$}RFOYxw4vZi1B zu9~%u^%MlMN6&JFEIO&r#3Xy$}P7>YWK zpLG4@K?+Mp*V1s68(IyA4ws^<~aP(-nm3Y1fTz^!w>IX3L+mVY32W>)&yK_)_;HQj~Pv7t|jhfWZE^U%J>g@E7^-$sgkpMgiFl7#K7- zG!z2lUmF6M4HOtO02K`#0~3V=2Ah;k#GH(riiH)6f|8w6R7_l1#f?KkRh`S&Y4D%# zUNAK9cffHw*V#&V_7u9^xj1CH^L?fM`A`E@p>qVEWQUy zwGNSv@Upf9IoM@yNjaz4@ESaaN}{?{btt34bAd9Xb1%jDBVwEIk)R0b7#o=e~DUT|)B>Q8ktk|Z+bCx_Gc(bXa#Dsnv zd#6l?)YNk(V>-b1hYTyXvqKxpfaiFJ-K5y8(sa|pAkdVuLJc0i33feto%Ck1b{|>t zzMUE3zXLq4e}A*(d$MpiRUbQ-9A>Gl;o>^=guu#Vs;-4d=hB?V#&xG$8`-LxxOw?b zU^2ooeRw&0gQ&6CkFDkf=W#sJ+f?@E*zmxqSl+54CmztxYvATjqgN-SQBCfMGP7q9 zsit8=Iw_OM%JL4-uLv*mx>Vt#%rHhb{l4hbt&6C&F&t-oHRPae1N8Y~X4esyLmUNB zcS6lXkQDU&&BTfkqEbHD26xPhT|vWYIm5AmJ(-9=MV1+>7F~%vmU`g8kV)U|suTb5 zx_%xG>OMpUAGU;NPem@u^>NG)3)6aiK-`9H3oU9mg}EJiSIv><(`bI-WX`@9gugW} zdTC=-DTR-pw;)M%TR>q$r@2mZjrcZA6&;eLQ`%9#gP$w0YF{QReVYp^*6p=rGLP4p zoEFs_$1f>Qf$uM&8rHhiYtrn{gtpIdpV~i1xy&TRB43*7j-?8Fm1mfL%-u&WED>`z z;zGQIi`rA34JQ4H3p1MK%9`su*wJe6gWR2=LuQtXMz~>Y;YX51k~YAcc>$3|O2$X~ z)ct_pPTaRF5gXC#*RSt#V>5kN(aCHCH74F+jW+F{+)475T(!449$@|S`3Wx{!K`IQF~o>JA66IC=Yapf|sj^o7Bh;5$2O;qPoQCS2+?F#{ zJe04ABWkKtgbIV@H8G`P%~Bk$JDJ_=#LC^*d9s`6_xg4U>J%f~$a&C(FdK?+8zL&)uzSYG9VQ z8;WYE@?`GW*7|{TK|Dx6uLHNcY0v2Z3C$s`j5#DfY{M~ft9n0!d0vjku`{DgTGOdo zF@2dbCNqT*(&N0NTr!zS^aN_SeYag$5vQne0uiS%R#-1Gc~zTDDC8g5JujnQcKt2* zs>gKFI?#EhH4_rWtW+T&$Kmj16nK6u1wUpfxIxSwQAF4aF`eXo@-=xtQA%q%TrOea zNG)Ka+DEycxov8ZD%0sQ8pDPZj*<)>A&(Uh<8UUOnyNfCb_y#YaB%j&lmDc`M^j5PZNg9wY$mRKg*qKpO4&ujMGdA&cK6~6g?wIGkaD+#a&>~cQkoQ)! z@%EpVtN*mDmH}#+oQXpX)bbvv<(nnl!sfnON-OR9MxZ`daEA!r(XzScS4tbG+)kM> zmN;Vqhd9=5o_h_`!WAvr@ilDYuVYL)lj)j>WSn3Uk;s0&xd+V9ybb`7w*pQ6kEt8!QDcMd7ZZkweE~(b5h@@(G*l3`FBL#x z%?TVfh$jj>N|M+u0PW)?i{53^%z=#1?X9QUq1q;TE@zi5u^^CbPnOqtq!-jN{pgf^ zi%@-=1UH4EPl>VJ1x)#Cxx0)5P4`RemK!H9=EKPZJP`Ojsfax89AZAj!a@rep4mf~m3y_QcuTVXbDJ}(aW}=H zPYto%nNWhQ&&4p{eePX2UW&C4)vvocMEqJDojo zSWLY27J=X$kS(kXZk#38KP6$q!)fu8!KDV6QAQncNp()_M=fh9hdTL=x|6<<3D5q2jzlmr{P--tie&)k9*YF`v`&Bekl=Lt zHopUe*%8g#TLh|z7hkdhCIFuqGX$CH2`UtiTM9zty=F5ql{Rf4 z>kcxSe7$OjtJAkf%kEv8nrAUSPnZs4KQ$pM#bz`j52yZob=|M9hcYRFXryy(sn@q% zymSWYuXp*DZH0*K@?zt?xTMslV)@LK5yqF^&J}#L-XZ6xw|Sn{)EPp{>G}6ieQX`{ z{I8+H^R;#bCjt$XNAb)r0{vSt-;svJn?=6#uWauC&34{FCLTR4)ib=WYDIM$atZ7} zIkUlKzNAkf?j>Vy^xD190-(3};)*43MOTxIvymV&!Z4aOVc@O9pP`HK&b*eXHD~)P z%I%0kQfXrwQ)8(|yJ)F@IkJ{^q#z#i|4)(#|Au|Tops9KudZJq0 zk?dg4W18-b9~f?4eA+AiGb($Y3vsxrG7Ma%@a6ZZ&^0z6H#vn5Lapf^vzR^V-e{5x z?)R>^A7c%1A-zu%yFE=Es@|dj)Aa z@BWZ|2P6vqHha|5(wgITRtd1C=FFm{FHdM+Y?qTCYKKP~X~7x#-Cd!IqSpK)qyoTw zhy8hBBcQo;hO|c1V&a|%vbWhp74~UDBRVsZXNd1^C0@hktdxx^?JyU(@FmA{z1cCc z(w6_rZaMZ8_j2PqAec9M19-i(`)3?PKvM=wMx-Pwnm`e9%#_Fai1(pWeY$=#Jtd`G zyRRl)G6(*cSffAM+JC&*gX}9~owZN~!2UV0B&bW7UstOpOOMAy!k~nq1;6Wj;7#ai zST(ncLZW&!sbxstM@zFx^Q>EPr>88KZAIYw?*JkN2#qX}$I*l<$K{%4xt-OO_OQAE z3)X0fOCi=~wDJi>nZ-Qw1c?rZC3Uf0wa_)L;eNX8HXMn2ogyu2Qun7r`tb%jR*88ci#}^C9!zp(ctB%QzTz9F`M6)d z|Akx>fj+$dO5S3e0Wo?$8{O^kd7{OEEf$oyekS3tIE58TUA<&Ne3(fi^oNYP#9yoYgp$*2hjJZZJVVETO6laRMCj!!RVG1I@QGZpJ8Q z=#N#lU+AfiqRuI{?hR>g;}xnewkq7XV6oFC1h>wRRBWqc;MQgY5F8IeXUpA!ky-m~ zm~`hK!^H(gV@n&#-EiRb=e`wSpfHhcG3YcW%2I5CSJ$WPs3`9sFv7-x{SI5U6>(~J z+ah$m*X44CDzh(qMntARIAAdf-S|)!cVwMmB_}+jB;Bwttp2ks@%rp#@%Ii_S7AVk z(=hAEh|+S)v9yF9PcKedLW8L{<3x05nWTro3@}Q*Bkg8_)V(Wv#CfI`#Nv+;5f@@E~mGH+6oRP2c22XBfp*2A+CwR<r*k#1pV0+>SD-`;F z@4)t+9dS_p7=}wl;@}qxHRO*h=ICUmXJ-X(7uabj{PI!G`k)2zP$tED=Hvi7wqyQ7 zwBH)tNESvd{aIp2gQZJmBx{7(aX4UbXs-DtU zr&3xQ1gz%l=eM2Hjbt;nEVf-N6MF`IQ=CUr{H9<1KZQX{dl?h}Xmb#>u!n_#goXLD z{09SvKn0+olR}cQimDi+V33frv51H{2PYTpvx_UMnlueUxrEL`Qm~Pb8dfcAzA*BMvJ+G_&>Kg=~^+-z){tpyA8Lk??1&%UL zZNpeC88M|&=#7PJsB%0-MM@qnn(gVO{dkg2PRy-PBWgy+7Ugidt9nYGVRfnLuhz&F zxREgPmvWmyPv<$*<+rK6GnNPDiAd?6tuk`>6%P z$a*7Pe6|Mn1&XQ?`~Nble(pl4$A~0mE%gEGlCs+81yvsY9ps?$$?Ge}{W_me9H$Rt zXrDE_+zV4|XfETt!+h3qDK0R@%Rf%feC)?jT1p$&JRJ)cuw+>Vg-NHgfW=#h5E<#i zcc}6u7!+9iQ~SEU+s{p2XgtJ?(ZMP~c#yy?_ytA;xHpb6fh+2Zwb0#WLak0!4@%mp ziR{h(iQe;2F@tkp*$9~{)`6r|J=7_3l`;WX2ScpK&z1(+;xlIXm+^u_dd-8_sOgoI zMe3UFjaw$wR5nE&4`eS!R|8r&Z2>DerqEkrctb_%=R_@;Ezx8(?uu|S&7$)T%l5SO z#22cRBFLLU7coV>4iAzP`{h_vns}_WR&z~ijv1bDWXiafcp(KX zuoG%1Ec$-er!^wbhONZyg>0!(T4>5)rv^7KV&}si?KqQS?t-807uaiIzBhVJ0-}MJ zR^q969;VqOewrc7rri}14;%nNgSyy#2aFs^UK|}otO=ik89=6v z{g!wRtBFOt&F^qOuI6hmF0oa54PlLuY@`61C_w&&|lcz?Ce6Ri+x8g&%zC zJDP(5edzI3wT-?JeI2^2j{sbW*V3tu4+HKuLv3Z zA0wvIhK1R2d}AyB(2J-0O654Q{740f&=UGb{ExLT`d&wl1OkC>i4<=zEiUZe;5B_1 zg{r0bM$gE5F=JofD>BuaCAaKh@OUF3_{38}Lh&l^* z43mwOu~DJ{$RCw%B~5=?%7`_xc!RnoQD6aTnhcM(le^UMP$A0hDgG#5pU=CYoA{`q zR>aAsbNx}exr1kYt!QHhZd2R{JhBwOc_DCgt{=>Ukw&P0CF9}ZCR??x6j#n;wC)W? zYQufRsv8$LI;iLE*l_a7)-r{kh!+SPUHB1pDh9riP7p*M?%aC$_#+TQQ#iscj2;5o zb9D9Yj~*L*#w9tSJ}_mIIVkJb_+JG&-EQP*VqQ1+H`ae&HuJ7x&~gXl6^kiH?`deK zJd`}CGrgTqL~KIvODk!6tnH$&{VK%AqnW>j8uF9$qix&m+_6+SwE9WLFq?>HKgzSG zs+=A!@_o!A*A)XBi%HRz`zV?Bj~?8A^?=DW@T9r_N@7q_(GBX4LLdFA-WJyGHiw6^fEIY!3}Z zR#ic7uHM@s4N;l+_C+aOV_z&+IIj+!w#op2L{3X zHyw9YBYrA+penwm-X%S*Dqpv9PWvxwp%+D5)k9@J1kJCXODEHb*gKInBVL@l=&>uu zRH`k!?n`6Uk~%C~N`7ni|ELW_1kEjIkvU$mn(J+o(fY#BE#FFi?WUlaV$C2xFaJo!*M z3K~okEqH&kqlVD0KDoqQB|d+koC9r|z8{(qQfqXaw7R~|N@}){Z_8b&dmi&+kW&w| zRNDlc&_rpaNpmq%Xs=H^vr6D(867llY5x3y>0Zmt$?vZ;+{jjw9aEv&ujoROwlWiU zn>VFEy~n(YT~TdVM#gCtXLx(?yvBH3I-pv_aur^ee{cz{E`L4GYQzI4l;MVRc>$cU z5ElwS5r}_ey)vc5(Xg#KMB|114)|t}y#&v{zd7HEB7q{wm7`2;JzYRjS08Y*t5YL0 zpQlDDzZ=!;n#$3^XetAIlhd;gVivIGM+=Jr_(zuVJX@VyqG6h-8qXr-s)VB9xw|c^iN3)f z#bZ5ee*i4KUI)fW!>gjYOhohg$CZY($D~@*@Jl3MCg|H=1pX{LU#bx#w5u{sJkRPQ zkW&^)bZ=6mEI9Y-BhXV7z^{wJ z!fE@_q#dX*yd~+W%RA?$LH+x(VpCV#yaJfbRln4WR@8Lc7~6+ z{9$&eD6oBXh~uEWVNOsZqx)S=iMO?|Q{IJmO9|vO)1!c*VIaW)(4a7ue|%B}1)`At zb(cv*K%O#7k@8^EjnnS!{J*|^36p|00F2^jP~E5175U5S+-2eT4@P>XRQnVZebHSx z?4%CQJ`~e>yE(CxhmRJO(+TKr(eB}R`hctR@^##XZDV{=*n&AT%#G zTy&jw)UtJ^W9+@{dCDVdb2Nrr3)A*K;X&JrQ?%?hiPw(9Pn7&L$H*kAWbqxRV^F;Y zuh;MgCxrSrGBC_W&?Et`b~{8H7o{T{GIR?oxY7#ibQ9v8${6#BS0tj5?^N90m{?IA z-2B<`NSPLbe*f2*%G$09)y>$Dj!7M)o6}q?y90g98oSg_#@LRzPy5CCR7=Dc%CTl-rrdYA;zTm)R2+0q zrDNSXVy7ot1s3_bQ+kbX`0U+ICtgBeY?R_qqDZ&duhMQ8Zx#psUkfmJ1?n|n=57;H ziN+r*16_unohfcoO%y z5TZYl)=|jvmL>wR08Gq21qURfoEu_d)lY*v-#fgM<6A*e66!nbPFRZivo z_OLsjr~6Cp*Ub%^k%t8OuUVBZ-E7-i94doui-;i$$V@VFGLN^4>e7 zjxB>Htxk9j{?0A3WEjSRlOMf5voy+;j9=*mwy}ahqB}{(h!7sWUcTC1KN33K!rT#; z>l_|3`Lw1J@yl|k=&JVWg1&jfC08w5SIpDl_u$ntBm$vgv4WkVl_pe@7@~G>qE^wVC_Iqo z!z*ig_29`Do9Q;cEAH&b5Wn1g(4KUHbBXV1 z^;MsVFvnLcINkHhqYXmN7RE3kX-$#YqSH-dv&1MZReYNWTcpk@`r4N`P=q@?@bRLj zl4&4#lre>RGZBg>WdMj5A-D-f&mM!PjmM}hy|C>({R^RGpe04-3-nqW^Kv7F!YRB& zMxkmJ1UZRlAy$hWXCERpm&B@^ba5dcwt&MI!Wt!80?8ghOA|wi;|rw8mcZ4>_zdY3tKPBREshG2X;BH^slj05VKS09)o-XMVCYYd91~#AjLB|X z;6KZGHr1mtL zf;gEZHGBI=B)i3~{iYuQ`#tAs0k`ZprE32O9kdm~gq?q}{aHU08wcjvdrhH zF3?vJ{PlB4xk+KNL3B#pZ}I)qD9t7*BxN1g=b4tfQ$m5pkDsXG1BpuaDX+O2TIXiS zmTJRBenb#`LZjo%nnWih`rLcg$WS2lmeJ1eiuN*iu{`~u>>!i0hx6RD4!jX6rU(v! zO`YOP0@SoVF>YC(GV%JvsW5bIz}#F90z65%R31un_=$WB==%&F+T*7+b3XDbx64eo z1=rOHV&t5kjqzGocZaSGiwL-Mt;U)D6xp>e?pyPo_?|11y@>Edx~92WKQxl>aLf~&*+8~khC>P)L4;L_VZSGIq~ zNcc9}iKxjW`;Yvw+{rji6!Uux~q=hF6Lo1T0Q zG@UvJCCfwFQ)JN}0&HFgERfCMZh_Dri;lyMDj zWv*_e(ROfq7FuXUrC$)6-q)o6t^JsZ&kdlUYsErUGo7HPQZDFh=#=JdL}R3=#;A5LSV2XY>G56N$%# z+%cY}iq2S0T&9U3Q1lC)s5l=Bu6zNJ$wCIg1HkSB^Y|vE>{i%Q6cqJRRe>U7$A&hVq5m%!7d%#mBhOXrd@MHLE0j|!Rb zP{!0bhr|?TBrlU(_Zh@@BK@sh!?c}>&9cGCOGrMehNu_kqY1Y&ujn(&l*dk`MnUX= zvFoVIikZmB;BJ^d);P0jkDQWcAx}mxqGMC&GK7fmK*sh8cwzmRPokUZ_ed*KkW4Gm zgjc+cQ6?V2@HnmQDu$wd%JkSVuS6)6W#rM*gy6F2q`c|1;>XF^ndJa-BtG(azH&XT zQ{RJ2P_7ksTe;72cKaY*3dG$p#hP2bfL@o=y zLNaVzCBYMN03H-{L~Nl{=B&f|;u>KvRe&MsFf+nQctSLv=rAvi@jCH*CRuAC%lt!& zvUs=Rye<$|yJAMu8o3L~SPw9<;MZYgFmPIy?5e++8~~OMR=U8k^o4~a3Ns1~886Y&c^D zbytD)xD5&b%MZJZT7m@fM<{~gP;{h-_9w)R#r(M%ea&zVjeYX5WHnDt#f;BN8R5kB z(2)x1HFUwl5U?U;@=J-IyBRN+xcH|6<`{A>DdFI2RlwH}x$$cJy3EX$a->5(aRI3L zK1%B|liM=a%4-U7(x4QRQQgeskU;##Mzkur8*ickKC7N!;SCrP_++Yoin$J08UK+1#@G^)I%Y%9HHykP<@f0W&z67#b1%L84plLSlqOkasgl=6dM(DfHSZ5Uw zq=H6;^Q){@1^_@26!qlwl$@^-K6q&KtRxU``rbK$MV5pjZPG=A6_CF+yge)H8qU9a zPlMufT{BJvhaXj=b?#0zmLDdVI33wVQ#l4d=!MPvp>0mQ5C`(&2|PGq6#bO!cE=(g zLdEZKT){`8vdaSl-YIc9c?uN4NkClqkgRa}sZq3Y2nM+c7hDBhCRZr$3&}0Pz^woe8j-e_@SY;RT1>ASGv@)Fw zFKXIPOq_T>DHpnh+Sd9VF!uUF#O#Vn#)5e=K^IMSz!?$F0zi>uzMid%9?WkuNH$N& z2x){6* zI>kuEW0a0O0L;z14@(xJHfiR~Cf@Zv`MHwz;7ZU*pnvK;Aa!F?cF24rt7kdC~S}FQw z9l6gE8NU2}2Xwv-`CIDpb1-rRv#PPpFBaRWfZ8?XW=<*~i44yzMxmytg0|-2No}Q? zL~Aiew3@oAeJw>wwKdt%A)gCP&`R6T&~O<>H7%B;dlk_+x#v60h=NQuAP=II2DcG1 zF)2oj#QDi#k4IsyvMvI3@>R}&3rZC~trJIrQ9DUBr>yh(N1YxDkKNaEoo}OPSPpjd zNT^8Z9!U^=iA(u??|}2E=eFOko&C%|UzBQF@fe`}J2b@0J&Gy?b$yx%4ey8x-q;Sp zxA(!m%%z7qNmrXxK>IPzb|Dchq&R8d6^9`5?eSnIjetF7@aa?G7^2HaRc8i-#B=2G zu(5>52UGke*8V|MUtObN_zS4oK$0sKr(y^L&cr{uUt=>kQe^UbC8+UzUlq-4+@- zpaq+E6kraMn$tPRS7-3Ph>bL4rDn3i&Bqbrr+k3ERj% zT5&4?9(0vvcDIUdNG~foubt>daf*5o46n65=-r=Ds-k2wN5eVH=ZqW1H=|t`me-De zVf7AR9|(c_fM~4@9-?l9R^3}&b8@juRYkun<6n+R`zz_UPd~k5)(NdJYPbn0x}pN< zxQrS0IYga_Bqdd414GThFPu(OLQ5f;w|X$yk69LKX5wE7B%3@BXW+k1`=giHln|Ua zFZY8s9a@*fh6IOMU@=9t1?)eXs4glZW|qP5c{$BM>gn`$B+-D@J6T*QG+bkZ15xR^ z!<(BQ1q`gY=%!y#rBKX8&FWE2^&(`@>Nt=P;Ud0S@pEh81b`{&2w{(n zROmV}x04|{ad*6;Jyn7JQr#LKeRcGp3&Nf(`|-nOF~qQLc@`yuW|9<19Y`dA-^@J0 zEzLwiGJ5TY@z0oH)tO}C2qd=P5N>)YbSnlIS_p;2hr$VhH|2NLIv5=mpTCT@!aFx0 z6d>&rbQ*pX-KfzLC`7_gznU%aw`k>tMZg+S8DD>)D_;>I6>TSjACijnlra4YK{EK3KQNG}oT*&6 zT~jogIXu`Ou3GAuwsMz*T9G9IG?J}T)o{ng-ZF&8rD!iytLXU#q5gf^trQP{$N#Gd zzN9Hz6#!0^+nFGuA0$EN^3)MtbnVnTuD`cQ;OkOX^fKVyLCO5J;0o3d&mPIdigs9w z>Q+R>TOAfWBNOgg)CemQ;)$%sg%}5T9%eoGti(zo>n3%m|dvJYJ@dLM}CW z27takFwYmXjU|BB5ssVBQA09tW=M@|o*`5|UQ@^D=WgOjz%>X5HYm+{vsp$`Beo!_ zF` zLsi+5f>=@D_E!KlYh0{V(wtFkRny8SjFTM;5S}-7`)cX2X)*0;+}9z|<$hBr0~JX> z?6Q1~!C9=SCH3kZkay|>(aq-aa@Q9!#$1MaOTo%I5;Y=?da6($oyNi}zan9)MV?m! zR8!>r+2e^7bk3QJGBVyF92IN5$MsFoZuOV0c3|}P?1Dxe;Ee%a^zlw}S4s{!{bzL- zrQo?Z31^}UI}f&Lee+si4er=N9YQJlwJC`d&>#~WE?9gBV8LplqVLlO<8}n>9Dvg2 z2R3FjS(->0_gxNzN%no_ZZ%!dE(2(SA$!P6d}^X(!-YVPl0k7-8q^(G^(C3Tuv8~w zaaMm>2NwY+AMvfzfPsw0Vl5S2O@Te(CmCwNkP zG)^MUDxlaziAjr@)tEz9!esyGZ~x)hXSI428*tfXY)#HAFMYN8yxH*c{$V{TrE9sS zE!hQ*VbV0Arp)|Oc_dAu2+$Zzc&}qJz_Wt0YSE-YZR}zx2$gnHp>|rL^6Q88S$Yn_ zqQi7RNPXYb81T?UPKH`Lal7HZ<0B}ju5rNUgL@}F=cgXjzBIu`VGm)fSIMFC7G@m* zMXA?1_Rd+ENuA)+N0a(kEf&w)!*A4DnpEAko{U$1%GHuJE96hMZg%7v

  • Dt2>W6b5o~w4CE5}?a6-m+1MpfWN;B- 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 literal 0 HcmV?d00001 diff --git a/libraries-server/src/main/webapp/index.html b/libraries-server/src/main/webapp/index.html new file mode 100644 index 0000000000..2497893d82 --- /dev/null +++ b/libraries-server/src/main/webapp/index.html @@ -0,0 +1,12 @@ + + + + Baeldung: HTTP2 Client in Jetty + + +

    HTTP/1.1

    +
    +

    HTTP/2 Push

    +
    + + \ No newline at end of file From c68c7648a3361ee26f35356e618ddc9ab189d3f0 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Sat, 18 Apr 2020 12:48:37 -0600 Subject: [PATCH 473/530] BAEL-3961 Remove address field of Employee class. --- .../main/java/com/baeldung/jdbc/Employee.java | 17 ++++------------- .../java/com/baeldung/jdbc/EmployeeDAO.java | 11 ++++++----- .../src/main/resources/jdbc/schema.sql | 3 +-- .../src/main/resources/jdbc/test-data.sql | 8 ++++---- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java index d5f87ca3df..bd6fe0fb15 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/Employee.java @@ -7,13 +7,11 @@ public class Employee { private String lastName; - private String address; - public Employee(int id, String firstName, String lastName, String address) { - setId(id); - setFirstName(firstName); - setLastName(lastName); - setAddress(address); + public Employee(int id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; } public int getId() { @@ -40,12 +38,5 @@ public class Employee { this.lastName = lastName; } - public String getAddress() { - return address; - } - - public void setAddress(final String address) { - this.address = address; - } } diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index 25d280ad12..8637f6f851 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -30,23 +30,22 @@ public class EmployeeDAO { SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); List employees = namedJdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (:ids)", parameters, - (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); return employees; } public List getEmployeesFromIdList(List ids) { String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); - List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (" + inSql +")", + List employees = jdbcTemplate.query(String.format("SELECT * FROM EMPLOYEE WHERE id IN (%s)", inSql), ids.toArray(), - (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); return employees; } public List getEmployeesFromLargeIdList(List ids) { jdbcTemplate.execute("CREATE TEMPORARY TABLE IF NOT EXISTS employee_tmp (id INT NOT NULL)"); - jdbcTemplate.update("DELETE FROM employee_tmp"); List employeeIds = new ArrayList<>(); for (Integer id : ids) { @@ -55,7 +54,9 @@ public class EmployeeDAO { jdbcTemplate.batchUpdate("INSERT INTO employee_tmp VALUES(?)", employeeIds); List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", - (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"), rs.getString("address"))); + (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); + + jdbcTemplate.update("DELETE FROM employee_tmp"); return employees; } diff --git a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql index 3401c5d963..be102431ca 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql +++ b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/schema.sql @@ -2,6 +2,5 @@ CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, FIRST_NAME varchar(255), - LAST_NAME varchar(255), - ADDRESS varchar(255) + LAST_NAME varchar(255) ); \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql index c1669c156d..5421c09849 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql +++ b/persistence-modules/spring-persistence-simple-2/src/main/resources/jdbc/test-data.sql @@ -1,4 +1,4 @@ -INSERT INTO EMPLOYEE VALUES (1, 'James', 'Gosling', 'Canada'); -INSERT INTO EMPLOYEE VALUES (2, 'Donald', 'Knuth', 'USA'); -INSERT INTO EMPLOYEE VALUES (3, 'Linus', 'Torvalds', 'Finland'); -INSERT INTO EMPLOYEE VALUES (4, 'Dennis', 'Ritchie', 'USA'); \ No newline at end of file +INSERT INTO EMPLOYEE VALUES (1, 'James', 'Gosling'); +INSERT INTO EMPLOYEE VALUES (2, 'Donald', 'Knuth'); +INSERT INTO EMPLOYEE VALUES (3, 'Linus', 'Torvalds'); +INSERT INTO EMPLOYEE VALUES (4, 'Dennis', 'Ritchie'); \ No newline at end of file From ffe8422ca234cbfac5c019137723f9dca643be89 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 18 Apr 2020 21:15:05 -0500 Subject: [PATCH 474/530] BAEL-3908: Update README file (#9141) * BAEL-3336 BAEL-3058 add links * BAEL-3319: add link * BAEL-3284: add link * BAEL-3198: add link to article * BAEL-3479: add link to article * BAEL-3485: add article link * SCALA-38: move to new package and add link back to article * SCALA-38: add imports back into unit test * BAEL-3908: add link back to article --- libraries-server/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-server/README.md b/libraries-server/README.md index d9e6b8b206..7e41f33a0c 100644 --- a/libraries-server/README.md +++ b/libraries-server/README.md @@ -13,3 +13,4 @@ This module contains articles about server libraries. - [MQTT Client in Java](https://www.baeldung.com/java-mqtt-client) - [Guide to XMPP Smack Client](https://www.baeldung.com/xmpp-smack-chat-client) - [A Guide to NanoHTTPD](https://www.baeldung.com/nanohttpd) +- [HTTP/2 in Jetty](https://www.baeldung.com/jetty-http-2) From 87ac7a74bedb559899383bea777a59670389f45d Mon Sep 17 00:00:00 2001 From: Yavuz Tas <12643010+yavuztas@users.noreply.github.com> Date: Sun, 19 Apr 2020 16:18:58 +0200 Subject: [PATCH 475/530] Update code base for BAEL-3872 (#9032) * resolve an sql syntax error for H2 version 1.4.200 * update spring and spring-data-jpa version to latest migrate spring-data-jpa Sort initializations to Sort.by static factory methods to fix compile errors * update hibernate version to latest * cleanup code * show how to get a bean object from factory bean as shown in the section 4 * update mysql version and fix tests under persistence.service * clean up code --- .../spring-persistence-simple/pom.xml | 15 +++++--- .../baeldung/config/PersistenceConfig.java | 24 +++++-------- .../baeldung/config/PersistenceJPAConfig.java | 15 ++++---- .../com/baeldung/jpa/dao/AbstractJpaDAO.java | 7 ++-- .../src/main/resources/hibernate5Config.xml | 2 +- .../src/main/resources/jdbc/schema.sql | 2 +- .../resources/persistence-mysql.properties | 4 +-- .../jpaquery/UserRepositoryCommon.java | 35 ++++++++----------- 8 files changed, 46 insertions(+), 58 deletions(-) diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml index 8a03310048..878c4592f9 100644 --- a/persistence-modules/spring-persistence-simple/pom.xml +++ b/persistence-modules/spring-persistence-simple/pom.xml @@ -24,7 +24,11 @@ spring-context ${org.springframework.version} - + + org.springframework + spring-aspects + ${org.springframework.version} + org.hibernate @@ -128,12 +132,13 @@ - 5.1.6.RELEASE + 5.2.5.RELEASE - 5.4.2.Final - 6.0.6 - 2.1.6.RELEASE + 5.4.13.Final + 8.0.19 + 1.4.200 + 2.2.6.RELEASE 9.0.0.M26 1.1 4.2.1 diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java index 569971e311..80f3ff14c5 100644 --- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java @@ -1,9 +1,7 @@ package com.baeldung.config; -import java.util.Properties; - -import javax.sql.DataSource; - +import com.baeldung.persistence.service.FooService; +import com.google.common.base.Preconditions; import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -23,16 +21,15 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -import com.baeldung.hibernate.dao.FooDao; -import com.baeldung.jpa.dao.IFooDao; -import com.google.common.base.Preconditions; +import javax.sql.DataSource; +import java.util.Properties; @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = { "com.baeldung.hibernate.dao" }, transactionManagerRef = "jpaTransactionManager") @EnableJpaAuditing @PropertySource({ "classpath:persistence-mysql.properties" }) -@ComponentScan({ "com.baeldung.persistence", "com.baeldung.hibernate.dao" }) +@ComponentScan(basePackages = { "com.baeldung.persistence.dao", "com.baeldung.jpa.dao" }) public class PersistenceConfig { @Autowired @@ -46,7 +43,7 @@ public class PersistenceConfig { public LocalSessionFactoryBean sessionFactory() { final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(restDataSource()); - sessionFactory.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + sessionFactory.setPackagesToScan("com.baeldung.persistence.model"); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; @@ -56,7 +53,7 @@ public class PersistenceConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(restDataSource()); - emf.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + emf.setPackagesToScan("com.baeldung.persistence.model"); final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); emf.setJpaVendorAdapter(vendorAdapter); @@ -96,18 +93,15 @@ public class PersistenceConfig { } @Bean - public IFooDao fooHibernateDao() { - return new FooDao(); + public FooService fooService() { + return new FooService(); } private final Properties hibernateProperties() { final Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - hibernateProperties.setProperty("hibernate.show_sql", "true"); - // hibernateProperties.setProperty("hibernate.format_sql", "true"); - // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); // Envers properties hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java index 7d3a881827..06cae493c9 100644 --- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java @@ -1,10 +1,6 @@ package com.baeldung.config; -import java.util.Properties; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - +import com.google.common.base.Preconditions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -21,7 +17,8 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -import com.google.common.base.Preconditions; +import javax.sql.DataSource; +import java.util.Properties; @Configuration @EnableTransactionManagement @@ -43,7 +40,7 @@ public class PersistenceJPAConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + em.setPackagesToScan("com.baeldung.persistence.model"); final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); @@ -64,9 +61,9 @@ public class PersistenceJPAConfig { } @Bean - public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) { + public PlatformTransactionManager transactionManager() { final JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(emf); + transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; } diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jpa/dao/AbstractJpaDAO.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jpa/dao/AbstractJpaDAO.java index 4fbc8464bb..a6542c5cb1 100644 --- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jpa/dao/AbstractJpaDAO.java +++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/jpa/dao/AbstractJpaDAO.java @@ -1,16 +1,15 @@ package com.baeldung.jpa.dao; -import java.io.Serializable; -import java.util.List; - import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import java.io.Serializable; +import java.util.List; public abstract class AbstractJpaDAO { private Class clazz; - @PersistenceContext + @PersistenceContext(unitName = "entityManagerFactory") private EntityManager entityManager; public final void setClazz(final Class clazzToSet) { diff --git a/persistence-modules/spring-persistence-simple/src/main/resources/hibernate5Config.xml b/persistence-modules/spring-persistence-simple/src/main/resources/hibernate5Config.xml index bbb61cb3e0..55546a862a 100644 --- a/persistence-modules/spring-persistence-simple/src/main/resources/hibernate5Config.xml +++ b/persistence-modules/spring-persistence-simple/src/main/resources/hibernate5Config.xml @@ -21,7 +21,7 @@ - + diff --git a/persistence-modules/spring-persistence-simple/src/main/resources/jdbc/schema.sql b/persistence-modules/spring-persistence-simple/src/main/resources/jdbc/schema.sql index c86d35cdae..ef4460e267 100644 --- a/persistence-modules/spring-persistence-simple/src/main/resources/jdbc/schema.sql +++ b/persistence-modules/spring-persistence-simple/src/main/resources/jdbc/schema.sql @@ -3,5 +3,5 @@ CREATE TABLE EMPLOYEE ID int NOT NULL PRIMARY KEY, FIRST_NAME varchar(255), LAST_NAME varchar(255), - ADDRESS varchar(255), + ADDRESS varchar(255) ); \ No newline at end of file diff --git a/persistence-modules/spring-persistence-simple/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-persistence-simple/src/main/resources/persistence-mysql.properties index b3cfd31f46..9ba4f7602a 100644 --- a/persistence-modules/spring-persistence-simple/src/main/resources/persistence-mysql.properties +++ b/persistence-modules/spring-persistence-simple/src/main/resources/persistence-mysql.properties @@ -1,7 +1,7 @@ # jdbc.X jdbc.driverClassName=com.mysql.cj.jdbc.Driver -jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate5_01?createDatabaseIfNotExist=true -jdbc.eventGeneratedId=tutorialuser +jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate5_01?createDatabaseIfNotExist=true&serverTimezone=UTC +jdbc.user=tutorialuser jdbc.pass=tutorialmy5ql # hibernate.X diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java index 69ddbb9b9f..5874b3c643 100644 --- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java +++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java @@ -1,25 +1,6 @@ package com.baeldung.spring.data.persistence.jpaquery; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Predicate; -import java.util.stream.Stream; - -import javax.persistence.EntityManager; -import javax.persistence.Query; - import com.baeldung.spring.data.persistence.config.PersistenceConfig; -import com.baeldung.spring.data.persistence.jpaquery.UserRepository; import com.baeldung.spring.data.persistence.model.User; import org.junit.After; import org.junit.Test; @@ -36,6 +17,16 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.transaction.annotation.Transactional; +import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.time.LocalDate; +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.*; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) @@ -283,7 +274,7 @@ public class UserRepositoryCommon { userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS)); userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS)); - List usersSortByName = userRepository.findAll(new Sort(Sort.Direction.ASC, "name")); + List usersSortByName = userRepository.findAll(Sort.by(Sort.Direction.ASC, "name")); assertThat(usersSortByName.get(0) .getName()).isEqualTo(USER_NAME_ADAM); @@ -295,7 +286,7 @@ public class UserRepositoryCommon { userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS)); userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS)); - userRepository.findAll(new Sort(Sort.Direction.ASC, "name")); + userRepository.findAll(Sort.by(Sort.Direction.ASC, "name")); List usersSortByNameLength = userRepository.findAll(Sort.by("LENGTH(name)")); @@ -459,6 +450,8 @@ public class UserRepositoryCommon { userRepository.save(usr01); userRepository.save(usr02); + System.out.println(TimeZone.getDefault()); + List users = userRepository.findUsersWithGmailAddress(); assertEquals(1, users.size()); assertEquals(usr02, users.get(0)); From ffc79e7edd3d9825ce3f9ab3aaedd73efb15564b Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 17 Apr 2020 21:25:03 +0200 Subject: [PATCH 476/530] [JAVA-630] vavr-2 module * Creation * Moved https://www.baeldung.com/vavr-either code * Moved https://www.baeldung.com/java-vavr code --- pom.xml | 6 +++-- vavr-2/README.md | 8 ++++++ vavr-2/pom.xml | 27 +++++++++++++++++++ .../com/baeldung/vavr/either/EitherDemo.java | 0 .../baeldung/vavr/either/EitherUnitTest.java | 0 .../CollectionsInteroperabilityUnitTest.java | 0 vavr/README.md | 3 +-- 7 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 vavr-2/README.md create mode 100644 vavr-2/pom.xml rename {vavr => vavr-2}/src/main/java/com/baeldung/vavr/either/EitherDemo.java (100%) rename {vavr => vavr-2}/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java (100%) rename {vavr => vavr-2}/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java (100%) diff --git a/pom.xml b/pom.xml index 02d1ab6cd2..1b3c98994f 100644 --- a/pom.xml +++ b/pom.xml @@ -812,7 +812,8 @@ libraries vaadin - vavr + vavr + vavr-2 @@ -1310,7 +1311,8 @@ libraries vaadin - vavr + vavr + vavr-2 diff --git a/vavr-2/README.md b/vavr-2/README.md new file mode 100644 index 0000000000..71814a08fd --- /dev/null +++ b/vavr-2/README.md @@ -0,0 +1,8 @@ +## Vavr + +This module contains articles about Vavr. + +### Relevant Articles: +- [Introduction to Vavr’s Either](https://www.baeldung.com/vavr-either) +- [Interoperability Between Java and Vavr](https://www.baeldung.com/java-vavr) +- [[<-- prev]](/vavr) diff --git a/vavr-2/pom.xml b/vavr-2/pom.xml new file mode 100644 index 0000000000..d20dd9afef --- /dev/null +++ b/vavr-2/pom.xml @@ -0,0 +1,27 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + vavr-2 + vavr-2 + jar + + + + io.vavr + vavr-test + ${vavr.version} + + + + + 0.9.1 + + \ No newline at end of file diff --git a/vavr/src/main/java/com/baeldung/vavr/either/EitherDemo.java b/vavr-2/src/main/java/com/baeldung/vavr/either/EitherDemo.java similarity index 100% rename from vavr/src/main/java/com/baeldung/vavr/either/EitherDemo.java rename to vavr-2/src/main/java/com/baeldung/vavr/either/EitherDemo.java diff --git a/vavr/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java b/vavr-2/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java similarity index 100% rename from vavr/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java rename to vavr-2/src/test/java/com/baeldung/vavr/either/EitherUnitTest.java diff --git a/vavr/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java b/vavr-2/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java similarity index 100% rename from vavr/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java rename to vavr-2/src/test/java/com/baeldung/vavr/interoperability/CollectionsInteroperabilityUnitTest.java diff --git a/vavr/README.md b/vavr/README.md index 2b8bb25356..e04e02069f 100644 --- a/vavr/README.md +++ b/vavr/README.md @@ -13,5 +13,4 @@ This module contains articles about Vavr. - [Guide to Collections API in Vavr](https://www.baeldung.com/vavr-collections) - [Collection Factory Methods for Vavr](https://www.baeldung.com/vavr-collection-factory-methods) - [Introduction to Future in Vavr](https://www.baeldung.com/vavr-future) -- [Introduction to Vavr’s Either](https://www.baeldung.com/vavr-either) -- [Interoperability Between Java and Vavr](https://www.baeldung.com/java-vavr) +- [[next -->]](/vavr-2) From 647a6dc798f3674e6072e88ad158d41534cba232 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 19 Apr 2020 18:54:43 +0200 Subject: [PATCH 477/530] JAVA-1130: Update the x509 mutual authentication codebase --- .../spring-security-x509/keystore/Makefile | 92 ------------------ .../keystore/keystore.jks | Bin 9310 -> 0 bytes .../src/main/resources/application.properties | 2 +- .../x509/X509AuthenticationServer.java | 8 +- .../src/main/resources/application.properties | 4 +- .../src/main/resources/keystore.jks | Bin 9310 -> 0 bytes .../spring-security-x509/store/clientBob.p12 | Bin 0 -> 4024 bytes .../spring-security-x509/store/keystore.jks | Bin 0 -> 3718 bytes .../spring-security-x509/store/rootCA.crt | 30 ++++++ .../spring-security-x509/store/truststore.jks | Bin 0 -> 1358 bytes 10 files changed, 39 insertions(+), 97 deletions(-) delete mode 100644 spring-security-modules/spring-security-x509/keystore/Makefile delete mode 100644 spring-security-modules/spring-security-x509/keystore/keystore.jks delete mode 100644 spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/keystore.jks create mode 100644 spring-security-modules/spring-security-x509/store/clientBob.p12 create mode 100644 spring-security-modules/spring-security-x509/store/keystore.jks create mode 100644 spring-security-modules/spring-security-x509/store/rootCA.crt create mode 100644 spring-security-modules/spring-security-x509/store/truststore.jks diff --git a/spring-security-modules/spring-security-x509/keystore/Makefile b/spring-security-modules/spring-security-x509/keystore/Makefile deleted file mode 100644 index 2cd7c55c5b..0000000000 --- a/spring-security-modules/spring-security-x509/keystore/Makefile +++ /dev/null @@ -1,92 +0,0 @@ -PASSWORD=changeit -KEYSTORE=keystore.jks -HOSTNAME=localhost -CLIENTNAME=cid -CLIENT_PRIVATE_KEY="${CLIENTNAME}_pk" - -# CN = Common Name -# OU = Organization Unit -# O = Organization Name -# L = Locality Name -# ST = State Name -# C = Country (2-letter Country Code) -# E = Email -DNAME_CA='CN=Baeldung CA,OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' -# For server certificates, the Common Name (CN) must be the hostname -DNAME_HOST='CN=$(HOSTNAME),OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' -DNAME_CLIENT='CN=$(CLIENTNAME),OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' -TRUSTSTORE=truststore.jks - -all: clean create-keystore add-host create-truststore add-client - -create-keystore: - # Generate a certificate authority (CA) - keytool -genkey -alias ca -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ - -validity 3650 -dname $(DNAME_CA) \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - -add-host: - # Generate a host certificate - keytool -genkey -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ - -validity 3650 -dname $(DNAME_HOST) \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Generate a host certificate signing request - keytool -certreq -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ - -validity 3650 -file "$(HOSTNAME).csr" \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Generate signed certificate with the certificate authority - keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ - -validity 3650 -sigalg SHA512withRSA \ - -infile "$(HOSTNAME).csr" -outfile "$(HOSTNAME).crt" -rfc \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Import signed certificate into the keystore - keytool -import -trustcacerts -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ - -file "$(HOSTNAME).crt" \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - -export-authority: - # Export certificate authority - keytool -export -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt -rfc \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - - -create-truststore: export-authority - # Import certificate authority into a new truststore - keytool -import -trustcacerts -noprompt -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - -add-client: - # Generate client certificate - keytool -genkey -alias $(CLIENT_PRIVATE_KEY) -ext san=dns:localhost,ip:127.0.0.1 \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ - -validity 3650 -dname $(DNAME_CLIENT) \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - # Generate a host certificate signing request - keytool -certreq -alias $(CLIENT_PRIVATE_KEY) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ - -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ - -validity 3650 -file "$(CLIENTNAME).csr" \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - # Generate signed certificate with the certificate authority - keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ - -validity 3650 -sigalg SHA512withRSA \ - -infile "$(CLIENTNAME).csr" -outfile "$(CLIENTNAME).crt" -rfc \ - -keystore $(KEYSTORE) -storepass $(PASSWORD) - # Import signed certificate into the truststore - keytool -import -trustcacerts -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ - -file "$(CLIENTNAME).crt" \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - # Export private certificate for importing into a browser - keytool -importkeystore -srcalias $(CLIENT_PRIVATE_KEY) -ext san=dns:localhost,ip:127.0.0.1 \ - -srckeystore $(TRUSTSTORE) -srcstorepass $(PASSWORD) \ - -destkeystore "$(CLIENTNAME).p12" -deststorepass $(PASSWORD) \ - -deststoretype PKCS12 - # Delete client private key as truststore should not contain any private keys - keytool -delete -alias $(CLIENT_PRIVATE_KEY) \ - -keystore $(TRUSTSTORE) -storepass $(PASSWORD) - -clean: - # Remove generated artifacts - find . \( -name "$(CLIENTNAME)*" -o -name "$(HOSTNAME)*" -o -name "$(KEYSTORE)" -o -name "$(TRUSTSTORE)" -o -name ca.crt \) -type f -exec rm -f {} \; diff --git a/spring-security-modules/spring-security-x509/keystore/keystore.jks b/spring-security-modules/spring-security-x509/keystore/keystore.jks deleted file mode 100644 index 044a820c39524f1ef3c470105dbaa82b63af0493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9310 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 DeRHq; diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties index 53dfe9976a..208cc90b47 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=keystore/keystore.jks +server.ssl.key-store=store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java index 050423238e..18bbfba835 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java @@ -23,7 +23,11 @@ public class X509AuthenticationServer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests().anyRequest().authenticated().and().x509().subjectPrincipalRegex("CN=(.*?)(?:,|$)").userDetailsService(userDetailsService()); + http.authorizeRequests().anyRequest().authenticated() + .and() + .x509() + .subjectPrincipalRegex("CN=(.*?)(?:,|$)") + .userDetailsService(userDetailsService()); } @Bean @@ -31,7 +35,7 @@ public class X509AuthenticationServer extends WebSecurityConfigurerAdapter { return new UserDetailsService() { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - if (username.equals("cid")) { + if (username.equals("Bob")) { return new User(username, "", AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER")); } throw new UsernameNotFoundException("User not found!"); diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties index 743c9c4582..b841a37916 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=../keystore/keystore.jks +server.ssl.key-store=store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit @@ -6,6 +6,6 @@ server.ssl.enabled=true server.port=8443 spring.security.user.name=Admin spring.security.user.password=admin -server.ssl.trust-store=../keystore/truststore.jks +server.ssl.trust-store=store/truststore.jks server.ssl.trust-store-password=changeit server.ssl.client-auth=need \ No newline at end of file diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/keystore.jks b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/keystore.jks deleted file mode 100644 index 044a820c39524f1ef3c470105dbaa82b63af0493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9310 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 DeRHq; diff --git a/spring-security-modules/spring-security-x509/store/clientBob.p12 b/spring-security-modules/spring-security-x509/store/clientBob.p12 new file mode 100644 index 0000000000000000000000000000000000000000..e5d6dbcefbfaffa2502b1ed9613bc1cb2f9ce573 GIT binary patch literal 4024 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 SChlA@P5Y@C!_vP&?!N$UlZxN~ literal 0 HcmV?d00001 diff --git a/spring-security-modules/spring-security-x509/store/keystore.jks b/spring-security-modules/spring-security-x509/store/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..8650651a1e0a884555a4219049340ce2314315cb GIT binary patch literal 3718 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 kxy)FR?K>|cBR4C9fw-ZlfiN3$C<`+Wk5gi5 zPD*KBx?XaAu7R95uaSX)iJ_&TnW34HMU*(NF^Fpp<>J=Z#H5652_q{5a}yIk1JGSu zOifIT49BM$^W7KtHD8{=CFWDwpFN*~jdU}7-`?18;<3|VO_vGD;VNb<+qW>AuXi$d z+oJIE)#-n`7izGno#5qty|q-+Pj^c!t5xPwt8FLS9Hi=PSA_?At#G$8^7(OTna9h| zU(*}v$}+D{xY!uv$o}!{!5pDUs)di5K5kjHEJR_(dAEf^p9QM-s5QNnDbY_8xtY14 ze!I&QbG^RL{d}_;m7|jnojABZ_RRSUl0hOS|L+8GPPIH${aC)WCOYZOTt~J`+Zx`v ztz#^&C$$!4y6MDMqL)gMoDi10a{ZzWX*Q8hF{?3UT-ajz-#M3b0%0(^X%jQz9 z(*yYS1gA(^+|%v*vt@(bb5C#m zqr1t9XZfFGFE&lnR$O%ml^CD z{o;x)T|blmM)~@se4iVSxWE5ot?8ft;N1Ti&QlKZ*s0xjVYUz0WGb8PGuz)oclE_t z3I!RT`y}!exvDpQUOri8a{s@3i;6{Rnm(@Ceb17c?{Bijs=xeyWd9n^_u8{|(slmd z`c=PJWtWE(8cY9e{TReJS2gx-OMJZeOF<@PMh3>k!3Kc_vcPmF%f}+dBJxQvl(Soo z=TPMDBWBa5xaB_Hp0vY29we>IB4HrbfL#GUNP#dT<9`-b17;wFoa}&U8<^}E8Pay; zebn#TwpV0c<<~9w^A_inu9@Bce!`dTz>_cDuzh;BWJe-bVHkJR^}E^gmn&{;WLWoL z=YyY9->QqOczDVCG3(*_sdj%nxGxn4#EB?QJhkkWuNxZ!|D1)ozi%GBU%N~2gvZ;M zYSlOf>+?yq*YDh&_v*{xX~Nw~>-svkta}=n{{GD#;jiq@(O);bXJxQh?wJ(Icy6(T zJR{?r4qs#K)+&R~#fi%%&gkfg+L^P8S8TSjj3&Q)!(BcRu5z}ms?ullcl}Xv&C)N< z@S3}Rf~>WXOOo6b?x(W*5A{kO-**E-gD3D1RFrm1-CeZKbAvKgL{4}&FC*7<$6{b(+^U$i;;V4Pmt zv=YHOzmC{4^Q{*|w<&tR_Lz90PnLUW66Z^n8$VZW(21SmsiDp~hdeXV-epP%lLX{{Pt~YuAkgeTRL%j-Pav1UuxNS z9G07G_!P#)_@z?sMs=5H(tpdsH0#^(y3D_O{F^7Y9jblszw$@S4hKVfYpsuWzDC@Z zySMI8(u4W>yZHG%nwAAWDG8X{u^;1It literal 0 HcmV?d00001 From 7b0c9d508f38ceb812bae691606755c53b897870 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 20 Apr 2020 12:00:03 +0300 Subject: [PATCH 478/530] Update README.md --- libraries-data-2/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md index 24618b5e37..f96fab5120 100644 --- a/libraries-data-2/README.md +++ b/libraries-data-2/README.md @@ -11,4 +11,7 @@ This module contains articles about libraries for data processing in Java. - [Guide to JMapper](https://www.baeldung.com/jmapper) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) - [Intro to Derive4J](https://www.baeldung.com/derive4j) -More articles: [[<-- prev]](/../libraries-data) \ No newline at end of file +More articles: [[<-- prev]](/../libraries-data) + +#Building the project +You can build the project from the command line using: mvn clean install, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: target/generated-sources/annotations to the project build path in your IDE. From f55d344629d3a148ed5fce139bf3fc688cf8962c Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 20 Apr 2020 12:01:27 +0300 Subject: [PATCH 479/530] Update README.md --- libraries-data-2/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md index f96fab5120..f992186bd9 100644 --- a/libraries-data-2/README.md +++ b/libraries-data-2/README.md @@ -13,5 +13,5 @@ This module contains articles about libraries for data processing in Java. - [Intro to Derive4J](https://www.baeldung.com/derive4j) More articles: [[<-- prev]](/../libraries-data) -#Building the project -You can build the project from the command line using: mvn clean install, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: target/generated-sources/annotations to the project build path in your IDE. +##### Building the project +You can build the project from the command line using: *mvn clean install*, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: *target/generated-sources/annotations* to the project build path in your IDE. From 8da24b4abe906ab8dae62e007a0f13b1d097c50b Mon Sep 17 00:00:00 2001 From: Vikas Rajput Date: Mon, 20 Apr 2020 19:01:55 +0300 Subject: [PATCH 480/530] BAEL-3557: Completed a simple web application in spring boot and groovy (#9152) Co-authored-by: Vikas Ramsingh Rajput --- spring-boot-groovy/pom.xml | 83 ++++++++++++++++ .../app/SpringBootGroovyApplication.groovy | 13 +++ .../app/controller/TodoController.groovy | 48 +++++++++ .../com/baeldung/app/entity/Todo.groovy | 23 +++++ .../app/repository/TodoRepository.groovy | 9 ++ .../baeldung/app/service/TodoService.groovy | 16 +++ .../app/service/impl/TodoServiceImpl.groovy | 40 ++++++++ .../src/main/resources/application.properties | 5 + .../com/baeldung/app/TodoAppUnitTest.groovy | 97 +++++++++++++++++++ 9 files changed, 334 insertions(+) create mode 100644 spring-boot-groovy/pom.xml create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy create mode 100644 spring-boot-groovy/src/main/resources/application.properties create mode 100644 spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy diff --git a/spring-boot-groovy/pom.xml b/spring-boot-groovy/pom.xml new file mode 100644 index 0000000000..f61398c5d6 --- /dev/null +++ b/spring-boot-groovy/pom.xml @@ -0,0 +1,83 @@ + + + + 4.0.0 + com.baeldung.app + spring-boot-groovy + spring-boot-groovy + war + Spring Boot Todo Application with Groovy + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.codehaus.groovy + groovy + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + runtime + + + net.bytebuddy + byte-buddy-dep + 1.10.9 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.9.0 + + + + addSources + addTestSources + generateStubs + compile + generateTestStubs + compileTests + removeStubs + removeTestStubs + + + + + + + + + com.baeldung.app.SpringBootGroovyApplication + + + diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy new file mode 100644 index 0000000000..226a2ff53d --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy @@ -0,0 +1,13 @@ +package com.baeldung.app + +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication + +import com.baeldung.app.SpringBootGroovyApplication + +@SpringBootApplication +class SpringBootGroovyApplication { + static void main(String[] args) { + SpringApplication.run SpringBootGroovyApplication, args + } +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy new file mode 100644 index 0000000000..02f6d0223b --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy @@ -0,0 +1,48 @@ +package com.baeldung.app.controller + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RestController + +import com.baeldung.app.entity.Todo +import com.baeldung.app.service.TodoService + +@RestController +@RequestMapping('todo') +public class TodoController { + + @Autowired + TodoService todoService + + @GetMapping + List getAllTodoList(){ + todoService.findAll() + } + + @PostMapping + Todo saveTodo(@RequestBody Todo todo){ + todoService.saveTodo todo + } + + @PutMapping + Todo updateTodo(@RequestBody Todo todo){ + todoService.updateTodo todo + } + + @DeleteMapping('/{todoId}') + deleteTodo(@PathVariable Integer todoId){ + todoService.deleteTodo todoId + } + + @GetMapping('/{todoId}') + Todo getTodoById(@PathVariable Integer todoId){ + todoService.findById todoId + } +} \ No newline at end of file diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy new file mode 100644 index 0000000000..9f1253c5b3 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy @@ -0,0 +1,23 @@ +package com.baeldung.app.entity + +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.GeneratedValue +import javax.persistence.GenerationType +import javax.persistence.Id +import javax.persistence.Table + +@Entity +@Table(name = 'todo') +class Todo { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Integer id + + @Column + String task + + @Column + Boolean isCompleted + +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy new file mode 100644 index 0000000000..c0b35cc37d --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy @@ -0,0 +1,9 @@ +package com.baeldung.app.repository + +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +import com.baeldung.app.entity.Todo + +@Repository +interface TodoRepository extends JpaRepository {} \ No newline at end of file diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy new file mode 100644 index 0000000000..0a59d93330 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy @@ -0,0 +1,16 @@ +package com.baeldung.app.service + +import com.baeldung.app.entity.Todo + +interface TodoService { + + List findAll() + + Todo findById(Integer todoId) + + Todo saveTodo(Todo todo) + + Todo updateTodo(Todo todo) + + Todo deleteTodo(Integer todoId) +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy new file mode 100644 index 0000000000..6d0ee03a9f --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy @@ -0,0 +1,40 @@ +package com.baeldung.app.service.impl + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +import com.baeldung.app.entity.Todo +import com.baeldung.app.repository.TodoRepository +import com.baeldung.app.service.TodoService + +@Service +class TodoServiceImpl implements TodoService { + + @Autowired + TodoRepository todoRepository + + @Override + List findAll() { + todoRepository.findAll() + } + + @Override + Todo findById(Integer todoId) { + todoRepository.findById todoId get() + } + + @Override + Todo saveTodo(Todo todo){ + todoRepository.save todo + } + + @Override + Todo updateTodo(Todo todo){ + todoRepository.save todo + } + + @Override + Todo deleteTodo(Integer todoId){ + todoRepository.deleteById todoId + } +} diff --git a/spring-boot-groovy/src/main/resources/application.properties b/spring-boot-groovy/src/main/resources/application.properties new file mode 100644 index 0000000000..8d53a190bb --- /dev/null +++ b/spring-boot-groovy/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:h2:mem:todo +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=sa +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy b/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy new file mode 100644 index 0000000000..faf2d64ba7 --- /dev/null +++ b/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy @@ -0,0 +1,97 @@ +package com.baeldung.app + +import static org.junit.jupiter.api.Assertions.assertEquals +import static org.junit.jupiter.api.Assertions.assertTrue + +import org.junit.BeforeClass +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.test.context.event.annotation.BeforeTestClass +import org.springframework.test.context.junit4.SpringRunner + +import com.baeldung.app.entity.Todo + +import io.restassured.RestAssured +import io.restassured.response.Response + +class TodoAppUnitTest { + static API_ROOT = 'http://localhost:8081/todo' + static readingTodoId + static writingTodoId + + @BeforeClass + static void populateDummyData() { + Todo readingTodo = new Todo(task: 'Reading', isCompleted: false) + Todo writingTodo = new Todo(task: 'Writing', isCompleted: false) + + final Response readingResponse = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(readingTodo).post(API_ROOT) + + Todo cookingTodoResponse = readingResponse.as Todo.class + readingTodoId = cookingTodoResponse.getId() + + final Response writingResponse = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(writingTodo).post(API_ROOT) + + Todo writingTodoResponse = writingResponse.as Todo.class + writingTodoId = writingTodoResponse.getId() + } + + @Test + void whenGetAllTodoList_thenOk(){ + final Response response = RestAssured.get(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + assertTrue response.as(List.class).size() > 0 + } + + @Test + void whenGetTodoById_thenOk(){ + final Response response = + RestAssured.get("$API_ROOT/$readingTodoId") + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + Todo todoResponse = response.as Todo.class + assertEquals readingTodoId,todoResponse.getId() + } + + @Test + void whenUpdateTodoById_thenOk(){ + Todo todo = new Todo(id:readingTodoId, isCompleted: true) + final Response response = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(todo).put(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + Todo todoResponse = response.as Todo.class + assertTrue todoResponse.getIsCompleted() + } + + @Test + void whenDeleteTodoById_thenOk(){ + final Response response = + RestAssured.given() + .delete("$API_ROOT/$writingTodoId") + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + } + + @Test + void whenSaveTodo_thenOk(){ + Todo todo = new Todo(task: 'Blogging', isCompleted: false) + final Response response = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(todo).post(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + } +} \ No newline at end of file From 6dcb364fe7ca11aab44ddb190227fb5a9cc0946a Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 20 Apr 2020 22:42:22 +0530 Subject: [PATCH 481/530] JAVA-917: Migrate jhipster-5 to parent-boot-2 --- jhipster-5/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jhipster-5/pom.xml b/jhipster-5/pom.xml index cebbe25d8b..2a5132e50e 100644 --- a/jhipster-5/pom.xml +++ b/jhipster-5/pom.xml @@ -9,10 +9,10 @@ pom - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From 1639ead274ffbb256016ec36f6fa6f7a1c08cd58 Mon Sep 17 00:00:00 2001 From: Donato Rimenti Date: Mon, 20 Apr 2020 19:36:51 +0200 Subject: [PATCH 482/530] [BAEL-3489] Added Java-R integration examples. --- libraries-data-2/pom.xml | 43 +++++++++++++++++++ .../main/java/com/baeldung/r/FastRMean.java | 28 ++++++++++++ .../main/java/com/baeldung/r/RCallerMean.java | 36 ++++++++++++++++ .../src/main/java/com/baeldung/r/RUtils.java | 30 +++++++++++++ .../main/java/com/baeldung/r/RenjinMean.java | 36 ++++++++++++++++ .../main/java/com/baeldung/r/RserveMean.java | 29 +++++++++++++ .../com/baeldung/r/FastRMeanUnitTest.java | 29 +++++++++++++ .../r/RCallerMeanIntegrationTest.java | 37 ++++++++++++++++ .../com/baeldung/r/RenjinMeanUnitTest.java | 37 ++++++++++++++++ libraries-data-2/src/test/resources/script.R | 3 ++ 10 files changed, 308 insertions(+) create mode 100644 libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java create mode 100644 libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java create mode 100644 libraries-data-2/src/main/java/com/baeldung/r/RUtils.java create mode 100644 libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java create mode 100644 libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java create mode 100644 libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java create mode 100644 libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java create mode 100644 libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java create mode 100644 libraries-data-2/src/test/resources/script.R diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index e6106c0fe3..ce15ef6c07 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -128,6 +128,24 @@ ${awaitility.version} test + + + org.rosuda.REngine + Rserve + ${rserve.version} + + + + com.github.jbytecode + RCaller + ${rcaller.version} + + + + org.renjin + renjin-script-engine + ${renjin.version} + @@ -137,6 +155,13 @@ http://repo.numericalmethod.com/maven/ default + + + + bedatadriven + bedatadriven public repo + https://nexus.bedatadriven.com/content/groups/public/ + @@ -153,6 +178,24 @@ 3.6.2 1.7.25 3.0.0 + RELEASE + 3.0 + 1.8.1 + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + com/baeldung/r/FastRMean.java + + + + + + \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java b/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java new file mode 100644 index 0000000000..52fb2d1506 --- /dev/null +++ b/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java @@ -0,0 +1,28 @@ +package com.baeldung.r; + +import java.io.IOException; +import java.net.URISyntaxException; + +/** + * FastR showcase. + * + * @author Donato Rimenti + */ +public class FastRMean { + + /** + * Invokes the customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + */ + public double mean(int[] values) { + Context polyglot = Context.newBuilder().allowAllAccess(true).build(); + String meanScriptContent = RUtils.getMeanScriptContent(); + polyglot.eval("R", meanScriptContent); + Value rBindings = polyglot.getBindings("R"); + Value rInput = rBindings.getMember("c").execute(values); + return rBindings.getMember("customMean").execute(rInput).asDouble(); + } + +} \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java b/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java new file mode 100644 index 0000000000..53e0ab9e31 --- /dev/null +++ b/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java @@ -0,0 +1,36 @@ +package com.baeldung.r; + +import java.io.IOException; +import java.net.URISyntaxException; + +import com.github.rcaller.rstuff.RCaller; +import com.github.rcaller.rstuff.RCallerOptions; +import com.github.rcaller.rstuff.RCode; + +/** + * RCaller showcase. + * + * @author Donato Rimenti + */ +public class RCallerMean { + + /** + * Invokes the customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + * @throws IOException if any error occurs + * @throws URISyntaxException if any error occurs + */ + public double mean(int[] values) throws IOException, URISyntaxException { + String fileContent = RUtils.getMeanScriptContent(); + RCode code = RCode.create(); + code.addRCode(fileContent); + code.addIntArray("input", values); + code.addRCode("result <- customMean(input)"); + RCaller caller = RCaller.create(code, RCallerOptions.create()); + caller.runAndReturnResult("result"); + return caller.getParser().getAsDoubleArray("result")[0]; + } + +} \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java b/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java new file mode 100644 index 0000000000..ad16fd5602 --- /dev/null +++ b/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java @@ -0,0 +1,30 @@ +package com.baeldung.r; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Collectors; + +/** + * Utility class for loading the script.R content. + * + * @author Donato Rimenti + */ +public class RUtils { + + /** + * Loads the script.R and returns its content as a string. + * + * @return the script.R content as a string + * @throws IOException if any error occurs + * @throws URISyntaxException if any error occurs + */ + static String getMeanScriptContent() throws IOException, URISyntaxException { + URI rScriptUri = RUtils.class.getClassLoader().getResource("script.R").toURI(); + Path inputScript = Paths.get(rScriptUri); + return Files.lines(inputScript).collect(Collectors.joining()); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java b/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java new file mode 100644 index 0000000000..befb7d522f --- /dev/null +++ b/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java @@ -0,0 +1,36 @@ +package com.baeldung.r; + +import java.io.IOException; +import java.net.URISyntaxException; + +import javax.script.ScriptException; + +import org.renjin.script.RenjinScriptEngine; +import org.renjin.sexp.DoubleArrayVector; + +/** + * Renjin showcase. + * + * @author Donato Rimenti + */ +public class RenjinMean { + + /** + * Invokes the customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + * @throws IOException if any error occurs + * @throws URISyntaxException if any error occurs + * @throws ScriptException if any error occurs + */ + public double mean(int[] values) throws IOException, URISyntaxException, ScriptException { + RenjinScriptEngine engine = new RenjinScriptEngine(); + String meanScriptContent = RUtils.getMeanScriptContent(); + engine.put("input", values); + engine.eval(meanScriptContent); + DoubleArrayVector result = (DoubleArrayVector) engine.eval("customMean(input)"); + return result.asReal(); + } + +} \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java b/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java new file mode 100644 index 0000000000..51aaa90648 --- /dev/null +++ b/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java @@ -0,0 +1,29 @@ +package com.baeldung.r; + +import org.rosuda.REngine.REXPMismatchException; +import org.rosuda.REngine.REngineException; +import org.rosuda.REngine.Rserve.RConnection; + +/** + * Rserve showcase. + * + * @author Donato Rimenti + */ +public class RserveMean { + + /** + * Connects to the Rserve istance listening on 127.0.0.1:6311 and invokes the + * customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + * @throws REngineException if any error occurs + * @throws REXPMismatchException if any error occurs + */ + public double mean(int[] values) throws REngineException, REXPMismatchException { + RConnection c = new RConnection(); + c.assign("input", values); + return c.eval("customMean(input)").asDouble(); + } + +} \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java b/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java new file mode 100644 index 0000000000..5cf8c63a56 --- /dev/null +++ b/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.r; + +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +/** + * Test for {@link FastRMean}. + * + * @author Donato Rimenti + */ +@Ignore +public class FastRMeanUnitTest { + + /** + * Object to test. + */ + private FastRMean fastrMean = new FastRMean(); + + /** + * Test for {@link FastRMeanUnitTest#mean(int[])}. + */ + @Test + public void givenValues_whenMean_thenCorrect() { + int[] input = { 1, 2, 3, 4, 5 }; + double result = fastrMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java b/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java new file mode 100644 index 0000000000..b68f259edd --- /dev/null +++ b/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java @@ -0,0 +1,37 @@ +package com.baeldung.r; + +import java.io.IOException; +import java.net.URISyntaxException; + +import javax.script.ScriptException; + +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +/** + * Test for {@link RCallerMean}. + * + * @author Donato Rimenti + */ +@Ignore +public class RCallerMeanIntegrationTest { + + /** + * Object to test. + */ + private RCallerMean rcallerMean = new RCallerMean(); + + /** + * Test for {@link RCallerMeanIntegrationTest#mean(int[])}. + * + * @throws ScriptException if an error occurs + * @throws URISyntaxException if an error occurs + */ + @Test + public void givenValues_whenMean_thenCorrect() throws IOException, URISyntaxException { + int[] input = { 1, 2, 3, 4, 5 }; + double result = rcallerMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java b/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java new file mode 100644 index 0000000000..e364d54632 --- /dev/null +++ b/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.r; + +import java.io.IOException; +import java.net.URISyntaxException; + +import javax.script.ScriptException; + +import org.junit.Test; + +import org.junit.Assert; + +/** + * Test for {@link RenjinMean}. + * + * @author Donato Rimenti + */ +public class RenjinMeanUnitTest { + + /** + * Object to test. + */ + private RenjinMean renjinMean = new RenjinMean(); + + /** + * Test for {@link RenjinMeanUnitTest#mean(int[])}. + * + * @throws ScriptException if an error occurs + * @throws URISyntaxException if an error occurs + * @throws IOException if an error occurs + */ + @Test + public void givenValues_whenMean_thenCorrect() throws IOException, URISyntaxException, ScriptException { + int[] input = { 1, 2, 3, 4, 5 }; + double result = renjinMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } +} \ No newline at end of file diff --git a/libraries-data-2/src/test/resources/script.R b/libraries-data-2/src/test/resources/script.R new file mode 100644 index 0000000000..08f859cc3d --- /dev/null +++ b/libraries-data-2/src/test/resources/script.R @@ -0,0 +1,3 @@ +customMean <- function(vector) { + mean(vector) +} \ No newline at end of file From fd318eb47615796d28901386aa158b51212db0fb Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 20 Apr 2020 23:15:30 +0530 Subject: [PATCH 483/530] JAVA-919: Migrate jmeter to parent-boot-2 --- jmeter/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jmeter/pom.xml b/jmeter/pom.xml index 64642695ff..945210edd7 100644 --- a/jmeter/pom.xml +++ b/jmeter/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From 16ca52363cef9a05a32113654ae290854cb27866 Mon Sep 17 00:00:00 2001 From: Donato Rimenti Date: Mon, 20 Apr 2020 20:11:06 +0200 Subject: [PATCH 484/530] Fixed test exclusions and added missing tests. --- libraries-data-2/pom.xml | 5 ++- .../baeldung/r/RserveMeanIntegrationTest.java | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index ce15ef6c07..0dadcbd8d4 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -189,10 +189,13 @@ org.apache.maven.plugins maven-compiler-plugin - + com/baeldung/r/FastRMean.java + + com/baeldung/r/FastRMeanUnitTest.java + diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java b/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java new file mode 100644 index 0000000000..95b344cb02 --- /dev/null +++ b/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.r; + +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.rosuda.REngine.REXPMismatchException; +import org.rosuda.REngine.REngineException; + +/** + * Test for {@link RserveMean}. + * + * @author Donato Rimenti + */ +@Ignore +public class RserveMeanIntegrationTest { + + /** + * Object to test. + */ + private RserveMean rserveMean = new RserveMean(); + + /** + * Test for {@link RserveMeanIntegrationTest#mean(int[])}. + * + * @throws REXPMismatchException if an error occurs + * @throws REngineException if an error occurs + */ + @Test + public void givenValues_whenMean_thenCorrect() throws REngineException, REXPMismatchException { + int[] input = { 1, 2, 3, 4, 5 }; + double result = rserveMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } +} \ No newline at end of file From 4fe86bb104b27cbb2601b0aac5f81a295fba0402 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Mon, 20 Apr 2020 23:42:21 +0530 Subject: [PATCH 485/530] JAVA-920: Migrate libraries-security to parent-boot-2 --- libraries-security/pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml index e287de4527..e02f766141 100644 --- a/libraries-security/pom.xml +++ b/libraries-security/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 @@ -23,7 +23,9 @@ org.springframework.security.oauth spring-security-oauth2 + ${spring-boot.version} + org.springframework spring-web From fdce9657e353378c627c5effde51c5cc36380ad2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:15:56 +0800 Subject: [PATCH 486/530] Update README.md --- netty/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/netty/README.md b/netty/README.md index b006c1c686..8b13789179 100644 --- a/netty/README.md +++ b/netty/README.md @@ -1,6 +1 @@ -## Netty - -This module contains articles about Netty. - -### Relevant Articles: From c367c05c53fdcc1c45642ae053143d5e91df961c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:16:07 +0800 Subject: [PATCH 487/530] Delete README.md --- netty/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 netty/README.md diff --git a/netty/README.md b/netty/README.md deleted file mode 100644 index 8b13789179..0000000000 --- a/netty/README.md +++ /dev/null @@ -1 +0,0 @@ - From b5603f9fce1721bafb94d3442360ede620e68d62 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:17:56 +0800 Subject: [PATCH 488/530] Update README.md --- java-collections-maps-3/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md index ed68eb00a0..8b13789179 100644 --- a/java-collections-maps-3/README.md +++ b/java-collections-maps-3/README.md @@ -1,8 +1 @@ -## Java Collections Cookbooks and Examples -This module contains articles about Map data structures in Java. - -### Relevant Articles: - -- More articles: [[<-- prev>]](/../java-collections-maps) -- More articles: [[<-- prev>]](/../java-collections-maps-2) From c9c48fda086801eb260c4e92facca1c6b7ad08a0 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:18:04 +0800 Subject: [PATCH 489/530] Delete README.md --- java-collections-maps-3/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 java-collections-maps-3/README.md diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md deleted file mode 100644 index 8b13789179..0000000000 --- a/java-collections-maps-3/README.md +++ /dev/null @@ -1 +0,0 @@ - From 6a41016938929ad22c46c9c1708d4dc1f9524aea Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:30:05 +0800 Subject: [PATCH 490/530] Update README.md --- guava/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guava/README.md b/guava/README.md index 71f76c1360..9c650dbc1d 100644 --- a/guava/README.md +++ b/guava/README.md @@ -13,3 +13,4 @@ This module contains articles a Google Guava - [Bloom Filter in Java using Guava](https://www.baeldung.com/guava-bloom-filter) - [Quick Guide to the Guava RateLimiter](https://www.baeldung.com/guava-rate-limiter) - [Introduction to Guava Throwables](https://www.baeldung.com/guava-throwables) +- [Guava Cache](https://www.baeldung.com/guava-cache) From 458c4d8505fe12160769b5208eb5b5e4c68b0b51 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:33:38 +0800 Subject: [PATCH 491/530] Update README.md --- core-kotlin-modules/core-kotlin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-kotlin-modules/core-kotlin/README.md b/core-kotlin-modules/core-kotlin/README.md index 151da607ac..90caccf5c8 100644 --- a/core-kotlin-modules/core-kotlin/README.md +++ b/core-kotlin-modules/core-kotlin/README.md @@ -3,7 +3,7 @@ This module contains articles about Kotlin core features. ### Relevant articles: -- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin/tutorial) +- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin-intro) - [Kotlin Java Interoperability](https://www.baeldung.com/kotlin-java-interoperability) - [Get a Random Number in Kotlin](https://www.baeldung.com/kotlin-random-number) - [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project) From 8c151edb1e887572eb77d05ae55f7f5766f65f87 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:36:40 +0800 Subject: [PATCH 492/530] Update README.md --- spring-boot-modules/spring-boot-testing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-testing/README.md b/spring-boot-modules/spring-boot-testing/README.md index 9bbaf337d7..192f5cee99 100644 --- a/spring-boot-modules/spring-boot-testing/README.md +++ b/spring-boot-modules/spring-boot-testing/README.md @@ -13,4 +13,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level) - [Embedded Redis Server with Spring Boot Test](https://www.baeldung.com/spring-embedded-redis) - [Testing Spring Boot @ConfigurationProperties](https://www.baeldung.com/spring-boot-testing-configurationproperties) -- [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing]() +- [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing](https://www.baeldung.com/spring-junit-prevent-runner-beans-testing-execution) From 34d94a78f0639095029abfc7acd3a85b0c6dabc7 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Tue, 21 Apr 2020 11:33:15 +0530 Subject: [PATCH 493/530] JAVA-920: Copied missing artifact so that live test runs ok --- .../src/main/resources/Baeldung.p12 | Bin 0 -> 2502 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 libraries-security/src/main/resources/Baeldung.p12 diff --git a/libraries-security/src/main/resources/Baeldung.p12 b/libraries-security/src/main/resources/Baeldung.p12 new file mode 100644 index 0000000000000000000000000000000000000000..65ec8bc8fec33120b2c11276883dde5dad7a3ea6 GIT binary patch literal 2502 zcmY+Ec{CJ^8pg-W7-KiSAxm~&AvE}qeFbou@HKRX#MCzW*R!0LL7Y% z7)Sr`m+g30_7yeFjs-&~fCI+{-yx;|%9MeT2(tgQ10!G4XA2 zkG>wSErwX=^nQsIu&jb*uF4fhJf{o`c{-h8IOQJ-3P1FiZj0wRF6K9 z8mc&Zv?tvBj9P!Y^4uoj2G=6#18%wBeI!8jBRU|{P+P>0Aj=k375X=>QV+%oS!bk}+lJ+=1;z2pF||>sP$r3Brd~; zK)4%I2x>Ka+<;kKSK~)>L|uxGz&8_NxTGL2SC%Ui58tY=@-RCRhmrcaiO=Kg3VLao zL4POxN4d@n*d5|D3|P>OiNs!L2y3}V91S9g=+MPm2z2B)8SfIlps2SxADFc?et7bp zX$NVVRh<~4WzxjUvYD%W)wYw9O8Brp^L0RcbZ~X#P4;$ zj@d^cTmNv5A?VBUvx?k4kPIs2@lgJ*dzk-y`e;r~_tMcguyihj(WZx;W7st6eU1^p zA%3;BP+|V=UsgnMaP2xR9K?kLwyMXM~nWS!589aEx|ZivtPE+FCig}|Cv7n z4X_Xg-u#7*)&HXc=rv2DY6l{514xv{C2smp+M* z0HVF+G4qecX9^nOQ_20k2BM02$9dQ593Rq`jJUz%jTp%B$M|BdRc91;W`+2m}mmXL+cwS z-&0lg5an|f6il`kXk#vPZhK2Z{$$;;@;0;b_10a*B5Rf5vKBR^@uJW`WS*}TZ=JLU zrj7F9)-nOh*HW4C!Otz_FqYnEa!4nC@x0Wy?`_DN=c%fjkhTs@U^UB&)l0w$4n{K* zxd;D}W@$I_F{l@h(sB)s*Iz+sw{FOEa8& z#EfydGU+EgJ3m#S4b&`TTCBfC)eJ1M>U(%yKc+7F3lI-0X##xff#=dtmj;cWs@*(1 zZXS(tbGXP@?braN#P>=GxwN^xFqQBRSvZbJniMWr*lo`MXc=JWLQ&?yr)-$(Q$h^t zmmrKH?`t%wDk~pX1aJ^CbU%HXCAh@rR6?f`m^|7yVOF)+`(Y=4B-tto(B<>E=#QYq z&@RDn^M$lUwdx-1I4h;lvzUX6)HqThjqi4SlgM#nYG;nAtd-nO%TPn)KA9c{jep;9 zv79sQ{V`P{aJuEBb+8(|yi8}R z6hXIAFE*35l(toZR?k^d;kDRbp0Bi3D0P+;?`sW)yZdU2IS(8r-PlbgD6J2GLhODl zx^Ea$kiSoZQ1qd#$ zrw<*y{e#y|n++B0#ujM&wp!KoH<8hT7JB{RiW`47kpL%2BP;hRkV5E^;HN+5b za*HI=nMx7`*nucDb(iCuuCi`KplQ=xzr^Ya{l%oz=!5s?{M_rv@Zq3;FGnmok06!C z!iZ>7b}M(R4R=#t|6J8 Date: Tue, 21 Apr 2020 14:11:41 +0800 Subject: [PATCH 494/530] Update README.md --- core-java-modules/core-java-string-operations-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md index bc00c6a915..45b02a3e10 100644 --- a/core-java-modules/core-java-string-operations-2/README.md +++ b/core-java-modules/core-java-string-operations-2/README.md @@ -9,7 +9,6 @@ This module contains articles about string operations. - [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case) - [Java String equalsIgnoreCase()](https://www.baeldung.com/java-string-equalsignorecase) - [Case-Insensitive String Matching in Java](https://www.baeldung.com/java-case-insensitive-string-matching) -- [L-Trim and R-Trim in Java](https://www.baeldung.com/l-trim-and-r-trim-in-java) - [L-Trim and R-Trim Alternatives in Java](https://www.baeldung.com/java-trim-alternatives) - [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) - More articles: [[<-- prev]](../core-java-string-operations) From b58db90f3bc2333a1b34ddbac2024f30bb358b84 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:13:43 +0800 Subject: [PATCH 495/530] Delete README.md --- maven-all/versions-maven-plugin/original/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 maven-all/versions-maven-plugin/original/README.md diff --git a/maven-all/versions-maven-plugin/original/README.md b/maven-all/versions-maven-plugin/original/README.md deleted file mode 100644 index 5652a9b7e4..0000000000 --- a/maven-all/versions-maven-plugin/original/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version) From 4a75b130579bd8e5641ed9b71f8d7aa13eb8c338 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:15:57 +0800 Subject: [PATCH 496/530] Update README.md --- persistence-modules/spring-jpa/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index 27a2fe8368..599a667a13 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -10,7 +10,7 @@ - [Self-Contained Testing Using an In-Memory Database](https://www.baeldung.com/spring-jpa-test-in-memory-database) - [A Guide to Spring AbstractRoutingDatasource](https://www.baeldung.com/spring-abstract-routing-data-source) - [Obtaining Auto-generated Keys in Spring JDBC](https://www.baeldung.com/spring-jdbc-autogenerated-keys) -- [Transactions with Spring 4 and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring) +- [Transactions with Spring and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring) - [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries) - [Many-To-Many Relationship in JPA](https://www.baeldung.com/jpa-many-to-many) - [Spring Persistence (Hibernate and JPA) with a JNDI datasource](https://www.baeldung.com/spring-persistence-hibernate-and-jpa-with-a-jndi-datasource/) From d17e2b5b93c5b6b1e247c894088d1027a760ebbe Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:18:12 +0800 Subject: [PATCH 497/530] Delete README.md --- spring-core-3/src/main/java/com/baeldung/factorybean/README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 spring-core-3/src/main/java/com/baeldung/factorybean/README.md diff --git a/spring-core-3/src/main/java/com/baeldung/factorybean/README.md b/spring-core-3/src/main/java/com/baeldung/factorybean/README.md deleted file mode 100644 index 13f9f379e0..0000000000 --- a/spring-core-3/src/main/java/com/baeldung/factorybean/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) From 62ccb01325e5c44a0de557ac071e157c491b8235 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:19:47 +0800 Subject: [PATCH 498/530] Delete README.md --- maven-all/maven/custom-rule/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 maven-all/maven/custom-rule/README.md diff --git a/maven-all/maven/custom-rule/README.md b/maven-all/maven/custom-rule/README.md deleted file mode 100644 index 44d43050e7..0000000000 --- a/maven-all/maven/custom-rule/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin) From b2af10c98ba1934ce0c6fda08b03e34cb4e97284 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:26:20 +0800 Subject: [PATCH 499/530] Delete README.md --- ddd-modules/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 ddd-modules/README.md diff --git a/ddd-modules/README.md b/ddd-modules/README.md deleted file mode 100644 index ba6b8d5016..0000000000 --- a/ddd-modules/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [DDD Bounded Contexts and Java Modules](https://www.baeldung.com/java-modules-ddd-bounded-contexts) From 3266970b400419ed5967b64f141e67038c51c061 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:27:38 +0800 Subject: [PATCH 500/530] Create README.md --- ddd-modules/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 ddd-modules/README.md diff --git a/ddd-modules/README.md b/ddd-modules/README.md new file mode 100644 index 0000000000..ba6b8d5016 --- /dev/null +++ b/ddd-modules/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [DDD Bounded Contexts and Java Modules](https://www.baeldung.com/java-modules-ddd-bounded-contexts) From bbb0511669cf61ef04b5dd1d4593f53dfa277137 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Tue, 21 Apr 2020 14:29:19 +0800 Subject: [PATCH 501/530] Update README.md --- maven-all/maven/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/maven-all/maven/README.md b/maven-all/maven/README.md index ced4a52703..c5f46ca184 100644 --- a/maven-all/maven/README.md +++ b/maven-all/maven/README.md @@ -7,7 +7,6 @@ have their own dedicated modules. - [Guide to the Core Maven Plugins](https://www.baeldung.com/core-maven-plugins) - [Maven Resources Plugin](https://www.baeldung.com/maven-resources-plugin) -- [Maven Compiler Plugin](https://www.baeldung.com/maven-compiler-plugin) - [Quick Guide to the Maven Surefire Plugin](https://www.baeldung.com/maven-surefire-plugin) - [The Maven Failsafe Plugin](https://www.baeldung.com/maven-failsafe-plugin) - [The Maven Verifier Plugin](https://www.baeldung.com/maven-verifier-plugin) From 64e47e7f77a887e29da95cc1443d66cddc9c73c6 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Tue, 21 Apr 2020 10:25:27 -0600 Subject: [PATCH 502/530] BAEL-3972: check user roles in Java --- .../app/controller/TaskController.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java index a084f14eca..95f855c1e5 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java @@ -1,8 +1,15 @@ package com.baeldung.app.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -10,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestMethod; import com.baeldung.app.entity.Task; import com.baeldung.app.service.TaskService; +import javax.servlet.http.HttpServletRequest; + @Controller @RequestMapping("api/tasks") public class TaskController { @@ -17,6 +26,9 @@ public class TaskController { @Autowired private TaskService taskService; + @Autowired(required = false) + private UserDetailsService userDetailsService; + @RequestMapping(method = RequestMethod.GET) public ResponseEntity> findAllTasks() { Iterable tasks = taskService.findAll(); @@ -30,4 +42,66 @@ public class TaskController { return ResponseEntity.ok().body(tasks); } + + /** + * Example of restricting specific endpoints to specific roles using @PreAuthorize. + */ + @GetMapping("/manager") + @PreAuthorize("hasRole('ROLE_MANAGER')") + public ResponseEntity> getAlManagerTasks() + { + Iterable tasks = taskService.findAll(); + + return ResponseEntity.ok().body(tasks); + } + + /** + * Example of restricting specific endpoints to specific roles using SecurityContext. + */ + @GetMapping("/actuator") + public ResponseEntity> getAlActuatorTasks() + { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ACTUATOR"))) + { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + + Iterable tasks = taskService.findAll(); + + return ResponseEntity.ok().body(tasks); + } + + /** + * Example of restricting specific endpoints to specific roles using UserDetailsService. + */ + @GetMapping("/admin") + public ResponseEntity> getAlAdminTasks() + { + if(userDetailsService != null) { + UserDetails details = userDetailsService.loadUserByUsername("pam"); + if (details != null && details.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + } + + Iterable tasks = taskService.findAll(); + + return ResponseEntity.ok().body(tasks); + } + + /** + * Example of restricting specific endpoints to specific roles using HttpServletRequest. + */ + @GetMapping("/admin2") + public ResponseEntity> getAlAdminTasksUsingServlet(HttpServletRequest request) + { + if (!request.isUserInRole("ROLE_ADMIN")) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + + Iterable tasks = taskService.findAll(); + + return ResponseEntity.ok().body(tasks); + } } From 553e4f1a0454f64390e5aeec4de6347a7a354ab7 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 21 Apr 2020 14:27:42 -0400 Subject: [PATCH 503/530] BAEL-3965: Moved examples to new spring-core module --- pom.xml | 2 + spring-core-4/README.md | 7 ++ spring-core-4/pom.xml | 88 +++++++++++++++++++ .../java/com/baeldung/factorymethod/Bar.java | 0 .../java/com/baeldung/factorymethod/Foo.java | 0 .../factorymethod/InstanceBarFactory.java | 0 .../factorymethod/InstanceFooFactory.java | 0 .../factorymethod/SingletonBarFactory.java | 0 .../factorymethod/SingletonFooFactory.java | 0 .../InstanceBarFactoryIntegrationTest.java | 0 .../InstanceFooFactoryIntegrationTest.java | 0 .../SingletonBarFactoryIntegrationTest.java | 0 .../SingletonFooFactoryIntegrationTest.java | 0 .../factorymethod/instance-bar-config.xml | 0 .../factorymethod/instance-foo-config.xml | 0 .../factorymethod/static-bar-config.xml | 18 ++-- .../factorymethod/static-foo-config.xml | 0 17 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 spring-core-4/README.md create mode 100644 spring-core-4/pom.xml rename {spring-core-3 => spring-core-4}/src/main/java/com/baeldung/factorymethod/Bar.java (100%) rename {spring-core-3 => spring-core-4}/src/main/java/com/baeldung/factorymethod/Foo.java (100%) rename {spring-core-3 => spring-core-4}/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java (100%) rename {spring-core-3 => spring-core-4}/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java (100%) rename {spring-core-3 => spring-core-4}/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java (100%) rename {spring-core-3 => spring-core-4}/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java (100%) rename {spring-core-3 => spring-core-4}/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java (100%) rename {spring-core-3 => spring-core-4}/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java (100%) rename {spring-core-3 => spring-core-4}/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java (100%) rename {spring-core-3 => spring-core-4}/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java (100%) rename {spring-core-3 => spring-core-4}/src/test/resources/factorymethod/instance-bar-config.xml (100%) rename {spring-core-3 => spring-core-4}/src/test/resources/factorymethod/instance-foo-config.xml (100%) rename {spring-core-3 => spring-core-4}/src/test/resources/factorymethod/static-bar-config.xml (54%) rename {spring-core-3 => spring-core-4}/src/test/resources/factorymethod/static-foo-config.xml (100%) diff --git a/pom.xml b/pom.xml index 9e3b354d74..ab6870c780 100644 --- a/pom.xml +++ b/pom.xml @@ -651,6 +651,7 @@ spring-core spring-core-2 spring-core-3 + spring-core-4 spring-cucumber spring-data-rest @@ -1155,6 +1156,7 @@ spring-core spring-core-2 spring-core-3 + spring-core-4 spring-cucumber spring-data-rest diff --git a/spring-core-4/README.md b/spring-core-4/README.md new file mode 100644 index 0000000000..f882c77179 --- /dev/null +++ b/spring-core-4/README.md @@ -0,0 +1,7 @@ +## Spring Core + +This module contains articles about core Spring functionality + +## Relevant Articles: + +- More articles: [[<-- prev]](/spring-core-3) diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml new file mode 100644 index 0000000000..06598fb41e --- /dev/null +++ b/spring-core-4/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + spring-core-4 + spring-core-4 + + + com.baeldung + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 + + + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + javax.annotation + javax.annotation-api + ${annotation-api.version} + + + org.springframework + spring-test + ${spring.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.version} + + + + + + 2.22.1 + 1.3.2 + 2.2.2.RELEASE + + + \ No newline at end of file diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/Bar.java similarity index 100% rename from spring-core-3/src/main/java/com/baeldung/factorymethod/Bar.java rename to spring-core-4/src/main/java/com/baeldung/factorymethod/Bar.java diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/Foo.java similarity index 100% rename from spring-core-3/src/main/java/com/baeldung/factorymethod/Foo.java rename to spring-core-4/src/main/java/com/baeldung/factorymethod/Foo.java diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java similarity index 100% rename from spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java rename to spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java similarity index 100% rename from spring-core-3/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java rename to spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java similarity index 100% rename from spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java rename to spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java diff --git a/spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java similarity index 100% rename from spring-core-3/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java rename to spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java similarity index 100% rename from spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java rename to spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java similarity index 100% rename from spring-core-3/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java rename to spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java similarity index 100% rename from spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java rename to spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java diff --git a/spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java similarity index 100% rename from spring-core-3/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java rename to spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java diff --git a/spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml b/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml similarity index 100% rename from spring-core-3/src/test/resources/factorymethod/instance-bar-config.xml rename to spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml diff --git a/spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml b/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml similarity index 100% rename from spring-core-3/src/test/resources/factorymethod/instance-foo-config.xml rename to spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml diff --git a/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml b/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml similarity index 54% rename from spring-core-3/src/test/resources/factorymethod/static-bar-config.xml rename to spring-core-4/src/test/resources/factorymethod/static-bar-config.xml index 4d1befc645..e709da36a1 100644 --- a/spring-core-3/src/test/resources/factorymethod/static-bar-config.xml +++ b/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml @@ -1,9 +1,9 @@ - - - + + + \ No newline at end of file diff --git a/spring-core-3/src/test/resources/factorymethod/static-foo-config.xml b/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml similarity index 100% rename from spring-core-3/src/test/resources/factorymethod/static-foo-config.xml rename to spring-core-4/src/test/resources/factorymethod/static-foo-config.xml From e01bab2ac0a217994918439b750858cf83889ce1 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 22 Apr 2020 15:42:16 +0530 Subject: [PATCH 504/530] JAVA-921: Migrate mesos-marathon to parent-boot-2 --- mesos-marathon/README.md | 2 +- mesos-marathon/pom.xml | 4 ++-- .../java/com/baeldung/DemoApplicationIntegrationTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mesos-marathon/README.md b/mesos-marathon/README.md index 65b2361698..8e5b8e4974 100644 --- a/mesos-marathon/README.md +++ b/mesos-marathon/README.md @@ -6,4 +6,4 @@ This module contains articles about Marathon and Mesos. - [Simple Jenkins Pipeline with Marathon and Mesos](https://www.baeldung.com/jenkins-pipeline-with-marathon-mesos) - To run the pipeline, please modify the dockerise.sh file with your own useranema and password for docker login. + To run the pipeline, please modify the dockerise.sh file with your own username and password for docker login. diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml index 4fb819c434..42798bb209 100644 --- a/mesos-marathon/pom.xml +++ b/mesos-marathon/pom.xml @@ -7,9 +7,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java b/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java index 85331516f9..dfe944a316 100644 --- a/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java +++ b/mesos-marathon/src/test/java/com/baeldung/DemoApplicationIntegrationTest.java @@ -3,8 +3,8 @@ package com.baeldung; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; From 56153d65d8134d26ef0f6a2a2759b822b3c6ca9f Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Wed, 22 Apr 2020 06:18:31 -0400 Subject: [PATCH 505/530] BAEL-3965: Corrected XML formatting in code examples --- .../factorymethod/instance-bar-config.xml | 20 +++++++++--------- .../factorymethod/instance-foo-config.xml | 20 +++++++++--------- .../factorymethod/static-bar-config.xml | 21 ++++++++----------- .../factorymethod/static-foo-config.xml | 21 ++++++++----------- 4 files changed, 38 insertions(+), 44 deletions(-) diff --git a/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml b/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml index 40d2f33683..a4281aee4e 100644 --- a/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml +++ b/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml @@ -1,19 +1,19 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/util + http://www.springframework.org/schema/util/spring-util.xsd"> + class="com.baeldung.factorymethod.InstanceBarFactory" /> + factory-bean="instanceBarFactory" + factory-method="createInstance"> diff --git a/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml b/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml index c45bef6a85..0f21f06f5a 100644 --- a/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml +++ b/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml @@ -1,18 +1,18 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/util + http://www.springframework.org/schema/util/spring-util.xsd"> + class="com.baeldung.factorymethod.InstanceFooFactory" /> + factory-bean="instanceFooFactory" + factory-method="createInstance" /> \ No newline at end of file diff --git a/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml b/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml index e709da36a1..2cacc293bc 100644 --- a/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml +++ b/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml @@ -1,19 +1,16 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/util + http://www.springframework.org/schema/util/spring-util.xsd"> + class="com.baeldung.factorymethod.SingletonBarFactory" + factory-method="createInstance"> diff --git a/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml b/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml index 83e61a656c..ffe1480638 100644 --- a/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml +++ b/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml @@ -1,18 +1,15 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/util + http://www.springframework.org/schema/util/spring-util.xsd"> + class="com.baeldung.factorymethod.SingletonFooFactory" + factory-method="createInstance" /> \ No newline at end of file From 0cf5e3662336102b3ce4a3ef045c27dadcdace76 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Wed, 22 Apr 2020 17:44:28 +0530 Subject: [PATCH 506/530] JAVA-922: Migrate flyway to parent-boot-2 --- persistence-modules/flyway/pom.xml | 6 +++--- .../flyway/src/main/resources/application.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml index 01b3dab6ee..f2e393abbf 100644 --- a/persistence-modules/flyway/pom.xml +++ b/persistence-modules/flyway/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 @@ -63,7 +63,7 @@ - 5.0.2 + 5.2.3 5.0.2 diff --git a/persistence-modules/flyway/src/main/resources/application.properties b/persistence-modules/flyway/src/main/resources/application.properties index 4d339eca5c..cee75fa4d9 100644 --- a/persistence-modules/flyway/src/main/resources/application.properties +++ b/persistence-modules/flyway/src/main/resources/application.properties @@ -1 +1 @@ -#flyway.enabled=false \ No newline at end of file +#spring.flyway.enabled=false \ No newline at end of file From 17d9e00dc3dd1cd6d6fb1a03d376a4c6c6e7e6b1 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Wed, 22 Apr 2020 20:21:36 +0530 Subject: [PATCH 507/530] BAEL-3988: Calling a SOAP web service in Java (#9166) --- jee-7/pom.xml | 23 ++++ .../soap/ws/client/generated/Country.java | 129 ++++++++++++++++++ .../ws/client/generated/CountryService.java | 34 +++++ .../generated/CountryServiceImplService.java | 91 ++++++++++++ .../soap/ws/client/generated/Currency.java | 37 +++++ .../ws/client/generated/ObjectFactory.java | 38 ++++++ .../ws/client/generated/package-info.java | 2 + .../com/baeldung/soap/ws/server/Country.java | 41 ++++++ .../soap/ws/server/CountryRepository.java | 43 ++++++ .../soap/ws/server/CountryService.java | 15 ++ .../soap/ws/server/CountryServiceImpl.java | 15 ++ .../ws/server/CountryServicePublisher.java | 19 +++ .../com/baeldung/soap/ws/server/Currency.java | 15 ++ jee-7/src/main/resources/country.wsdl | 40 ++++++ jee-7/src/main/resources/country.xsd | 21 +++ .../soap/ws/client/CountryClientLiveTest.java | 39 ++++++ 16 files changed, 602 insertions(+) create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java create mode 100644 jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java create mode 100644 jee-7/src/main/resources/country.wsdl create mode 100644 jee-7/src/main/resources/country.xsd create mode 100644 jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java diff --git a/jee-7/pom.xml b/jee-7/pom.xml index a2593e46a5..7352c6550a 100644 --- a/jee-7/pom.xml +++ b/jee-7/pom.xml @@ -242,6 +242,29 @@ + + + org.codehaus.mojo + jaxws-maven-plugin + 2.6 + + + wsimport-from-jdk + + wsimport + + + + + src/main/resources + + country.wsdl + + true + com.baeldung.soap.ws.client.generated + src/main/java + + diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java new file mode 100644 index 0000000000..6a810b9afa --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Country.java @@ -0,0 +1,129 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + +/** + *

    Java class for country complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType name="country">
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element name="capital" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
    + *         <element name="currency" type="{http://server.ws.soap.baeldung.com/}currency" minOccurs="0"/>
    + *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
    + *         <element name="population" type="{http://www.w3.org/2001/XMLSchema}int"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "country", propOrder = { "capital", "currency", "name", "population" }) +public class Country { + + protected String capital; + @XmlSchemaType(name = "string") + protected Currency currency; + protected String name; + protected int population; + + /** + * Gets the value of the capital property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCapital() { + return capital; + } + + /** + * Sets the value of the capital property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCapital(String value) { + this.capital = value; + } + + /** + * Gets the value of the currency property. + * + * @return + * possible object is + * {@link Currency } + * + */ + public Currency getCurrency() { + return currency; + } + + /** + * Sets the value of the currency property. + * + * @param value + * allowed object is + * {@link Currency } + * + */ + public void setCurrency(Currency value) { + this.currency = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the population property. + * + */ + public int getPopulation() { + return population; + } + + /** + * Sets the value of the population property. + * + */ + public void setPopulation(int value) { + this.population = value; + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java new file mode 100644 index 0000000000..bda4a305a5 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java @@ -0,0 +1,34 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebResult; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.ws.Action; + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.3.2 + * Generated source version: 2.2 + * + */ +@WebService(name = "CountryService", targetNamespace = "http://server.ws.soap.baeldung.com/") +@SOAPBinding(style = SOAPBinding.Style.RPC) +@XmlSeeAlso({ ObjectFactory.class }) +public interface CountryService { + + /** + * + * @param arg0 + * @return + * returns com.baeldung.soap.ws.client.generated.Country + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://server.ws.soap.baeldung.com/CountryService/findByNameRequest", output = "http://server.ws.soap.baeldung.com/CountryService/findByNameResponse") + public Country findByName(@WebParam(name = "arg0", partName = "arg0") String arg0); + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java new file mode 100644 index 0000000000..09f4c29202 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java @@ -0,0 +1,91 @@ + +package com.baeldung.soap.ws.client.generated; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.ws.Service; +import javax.xml.ws.WebEndpoint; +import javax.xml.ws.WebServiceClient; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.WebServiceFeature; + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.3.2 + * Generated source version: 2.2 + * + */ +@WebServiceClient(name = "CountryServiceImplService", targetNamespace = "http://server.ws.soap.baeldung.com/", wsdlLocation = "file:src/main/resources/country.wsdl") +public class CountryServiceImplService extends Service { + + private final static URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; + private final static WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; + private final static QName COUNTRYSERVICEIMPLSERVICE_QNAME = new QName("http://server.ws.soap.baeldung.com/", "CountryServiceImplService"); + + static { + URL url = null; + WebServiceException e = null; + try { + url = new URL("file:src/main/resources/country.wsdl"); + } catch (MalformedURLException ex) { + e = new WebServiceException(ex); + } + COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; + COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; + } + + public CountryServiceImplService() { + super(__getWsdlLocation(), COUNTRYSERVICEIMPLSERVICE_QNAME); + } + + public CountryServiceImplService(WebServiceFeature... features) { + super(__getWsdlLocation(), COUNTRYSERVICEIMPLSERVICE_QNAME, features); + } + + public CountryServiceImplService(URL wsdlLocation) { + super(wsdlLocation, COUNTRYSERVICEIMPLSERVICE_QNAME); + } + + public CountryServiceImplService(URL wsdlLocation, WebServiceFeature... features) { + super(wsdlLocation, COUNTRYSERVICEIMPLSERVICE_QNAME, features); + } + + public CountryServiceImplService(URL wsdlLocation, QName serviceName) { + super(wsdlLocation, serviceName); + } + + public CountryServiceImplService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) { + super(wsdlLocation, serviceName, features); + } + + /** + * + * @return + * returns CountryService + */ + @WebEndpoint(name = "CountryServiceImplPort") + public CountryService getCountryServiceImplPort() { + return super.getPort(new QName("http://server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService.class); + } + + /** + * + * @param features + * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features parameter will have their default values. + * @return + * returns CountryService + */ + @WebEndpoint(name = "CountryServiceImplPort") + public CountryService getCountryServiceImplPort(WebServiceFeature... features) { + return super.getPort(new QName("http://server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService.class, features); + } + + private static URL __getWsdlLocation() { + if (COUNTRYSERVICEIMPLSERVICE_EXCEPTION != null) { + throw COUNTRYSERVICEIMPLSERVICE_EXCEPTION; + } + return COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java new file mode 100644 index 0000000000..8b9355edc5 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java @@ -0,0 +1,37 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + +/** + *

    Java class for currency. + * + *

    The following schema fragment specifies the expected content contained within this class. + *

    + *

    + * <simpleType name="currency">
    + *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
    + *     <enumeration value="EUR"/>
    + *     <enumeration value="INR"/>
    + *     <enumeration value="USD"/>
    + *   </restriction>
    + * </simpleType>
    + * 
    + * + */ +@XmlType(name = "currency") +@XmlEnum +public enum Currency { + + EUR, INR, USD; + + public String value() { + return name(); + } + + public static Currency fromValue(String v) { + return valueOf(v); + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java new file mode 100644 index 0000000000..241debe758 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java @@ -0,0 +1,38 @@ + +package com.baeldung.soap.ws.client.generated; + +import javax.xml.bind.annotation.XmlRegistry; + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the com.baeldung.soap.ws.client.generated package. + *

    An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.soap.ws.client.generated + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Country } + * + */ + public Country createCountry() { + return new Country(); + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java new file mode 100644 index 0000000000..6df70b70f1 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java @@ -0,0 +1,2 @@ +@javax.xml.bind.annotation.XmlSchema(namespace = "http://server.ws.soap.baeldung.com/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +package com.baeldung.soap.ws.client.generated; diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java new file mode 100644 index 0000000000..62ea4a22ed --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/Country.java @@ -0,0 +1,41 @@ +package com.baeldung.soap.ws.server; + +public class Country { + protected String name; + protected int population; + protected String capital; + protected Currency currency; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getPopulation() { + return population; + } + + public void setPopulation(int population) { + this.population = population; + } + + public String getCapital() { + return capital; + } + + public void setCapital(String capital) { + this.capital = capital; + } + + public Currency getCurrency() { + return currency; + } + + public void setCurrency(Currency currency) { + this.currency = currency; + } + +} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java new file mode 100644 index 0000000000..558f7c1293 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java @@ -0,0 +1,43 @@ +package com.baeldung.soap.ws.server; + +import java.util.HashMap; +import java.util.Map; + +public class CountryRepository { + + private static final Map countries = new HashMap<>(); + + { + initData(); + } + + private final static void initData() { + Country usa = new Country(); + usa.setName("USA"); + usa.setCapital("Washington D.C."); + usa.setCurrency(Currency.USD); + usa.setPopulation(323947000); + + countries.put(usa.getName(), usa); + + Country india = new Country(); + india.setName("India"); + india.setCapital("New Delhi"); + india.setCurrency(Currency.INR); + india.setPopulation(1295210000); + + countries.put(india.getName(), india); + + Country france = new Country(); + france.setName("France"); + france.setCapital("Paris"); + france.setCurrency(Currency.EUR); + france.setPopulation(66710000); + + countries.put(france.getName(), france); + } + + public Country findCountry(String name) { + return countries.get(name); + } +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java new file mode 100644 index 0000000000..e3f68a4e59 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryService.java @@ -0,0 +1,15 @@ +package com.baeldung.soap.ws.server; + +import javax.jws.WebMethod; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; +import javax.jws.soap.SOAPBinding.Style; + +@WebService +@SOAPBinding(style=Style.RPC) +public interface CountryService { + + @WebMethod + Country findByName(String name); + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java new file mode 100644 index 0000000000..a8c6250354 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java @@ -0,0 +1,15 @@ +package com.baeldung.soap.ws.server; + +import javax.jws.WebService; + +@WebService(endpointInterface = "com.baeldung.soap.ws.server.CountryService") +public class CountryServiceImpl implements CountryService { + + private CountryRepository countryRepository = new CountryRepository(); + + @Override + public Country findByName(String name) { + return countryRepository.findCountry(name); + } + +} diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java new file mode 100644 index 0000000000..e7c1c480f4 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java @@ -0,0 +1,19 @@ +package com.baeldung.soap.ws.server; + +import javax.xml.ws.Endpoint; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class CountryServicePublisher { + + private static final Logger logger = LoggerFactory.getLogger(CountryServicePublisher.class); + + public static void main(String[] args) { + Endpoint endpoint = Endpoint.create(new CountryServiceImpl()); + endpoint.publish("http://localhost:8888/ws/country"); + + logger.info("Country web service ready to consume requests!"); + } +} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java b/jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java new file mode 100644 index 0000000000..d1b25a26c6 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/soap/ws/server/Currency.java @@ -0,0 +1,15 @@ +package com.baeldung.soap.ws.server; + +public enum Currency { + + EUR, INR, USD; + + public String value() { + return name(); + } + + public static Currency fromValue(String v) { + return valueOf(v); + } + +} diff --git a/jee-7/src/main/resources/country.wsdl b/jee-7/src/main/resources/country.wsdl new file mode 100644 index 0000000000..4d41fce322 --- /dev/null +++ b/jee-7/src/main/resources/country.wsdl @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/country.xsd b/jee-7/src/main/resources/country.xsd new file mode 100644 index 0000000000..c94b6047f9 --- /dev/null +++ b/jee-7/src/main/resources/country.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java b/jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java new file mode 100644 index 0000000000..ae423f9bdd --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/soap/ws/client/CountryClientLiveTest.java @@ -0,0 +1,39 @@ +package com.baeldung.soap.ws.client; + +import static org.junit.Assert.assertEquals; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.soap.ws.client.generated.CountryService; +import com.baeldung.soap.ws.client.generated.CountryServiceImplService; +import com.baeldung.soap.ws.client.generated.Currency; + +//Ensure that com.baeldung.soap.ws.server.CountryServicePublisher is running before executing this test +public class CountryClientLiveTest { + + private static CountryService countryService; + + @BeforeClass + public static void setup() { + CountryServiceImplService service = new CountryServiceImplService(); + countryService = service.getCountryServiceImplPort(); + } + + @Test + public void givenCountryService_whenCountryIndia_thenCapitalIsNewDelhi() { + assertEquals("New Delhi", countryService.findByName("India").getCapital()); + } + + @Test + public void givenCountryService_whenCountryFrance_thenPopulationCorrect() { + assertEquals(66710000, countryService.findByName("France").getPopulation()); + } + + @Test + public void givenCountryService_whenCountryUSA_thenCurrencyUSD() { + assertEquals(Currency.USD, countryService.findByName("USA").getCurrency()); + } + + +} From 28de9f499781531a65d71041ebd5101f1401793c Mon Sep 17 00:00:00 2001 From: Mona Mohamadinia Date: Wed, 22 Apr 2020 20:37:18 +0430 Subject: [PATCH 508/530] Added Log Group Sample (#9112) --- .../baeldung/group/LogGroupApplication.java | 26 +++++++++++++++++++ .../application-log-group.properties | 1 + 2 files changed, 27 insertions(+) create mode 100644 spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java create mode 100644 spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java b/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java new file mode 100644 index 0000000000..021f27bd98 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/group/LogGroupApplication.java @@ -0,0 +1,26 @@ +package com.baeldung.group; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@SpringBootApplication +@ActiveProfiles("log-group") +public class LogGroupApplication { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogGroupApplication.class); + + @RequestMapping("/log-group") + public void justLog() { + LOGGER.debug("Received a request"); + } + + public static void main(String[] args) { + SpringApplication.run(LogGroupApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties new file mode 100644 index 0000000000..6dfe11724e --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log-group.properties @@ -0,0 +1 @@ +logging.level.web=debug \ No newline at end of file From b2af9262a218ada40a62a3abeddfe0ae0a763a50 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Wed, 22 Apr 2020 18:15:29 +0200 Subject: [PATCH 509/530] JAVA-1130: Improvements after review --- .../spring-security-x509/README.md | 7 +++ .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 4 +- .../spring-security-x509/store/clientBob.p12 | Bin 4024 -> 4024 bytes .../spring-security-x509/store/keystore.jks | Bin 3718 -> 3793 bytes .../spring-security-x509/store/localhost.ext | 5 ++ .../spring-security-x509/store/rootCA.crt | 56 +++++++++--------- .../spring-security-x509/store/truststore.jks | Bin 1358 -> 1358 bytes 8 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 spring-security-modules/spring-security-x509/store/localhost.ext diff --git a/spring-security-modules/spring-security-x509/README.md b/spring-security-modules/spring-security-x509/README.md index b1eb0debf5..da431d862c 100644 --- a/spring-security-modules/spring-security-x509/README.md +++ b/spring-security-modules/spring-security-x509/README.md @@ -4,3 +4,10 @@ This module contains articles about X.509 authentication with Spring Security ### Relevant Articles: - [X.509 Authentication in Spring Security](https://www.baeldung.com/x-509-authentication-in-spring-security) + +###### Note for the [X.509 Authentication in Spring Security](https://www.baeldung.com/x-509-authentication-in-spring-security): +All the ready to use certificates are located in the [store](store) directory. The application is already configured to use these files. +This means the app works out of the box. + +However, it's highly recommended that you follow the article step by step and generate all the needed files by yourself. +This will let you understand the topic more deeply. \ No newline at end of file diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties index 208cc90b47..0ba5fa1b8c 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-basic-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=store/keystore.jks +server.ssl.key-store=../store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit diff --git a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties index b841a37916..fc2fc89396 100644 --- a/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-x509/spring-security-x509-client-auth/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.ssl.key-store=store/keystore.jks +server.ssl.key-store=../store/keystore.jks server.ssl.key-store-password=changeit server.ssl.key-alias=localhost server.ssl.key-password=changeit @@ -6,6 +6,6 @@ server.ssl.enabled=true server.port=8443 spring.security.user.name=Admin spring.security.user.password=admin -server.ssl.trust-store=store/truststore.jks +server.ssl.trust-store=../store/truststore.jks server.ssl.trust-store-password=changeit server.ssl.client-auth=need \ No newline at end of file diff --git a/spring-security-modules/spring-security-x509/store/clientBob.p12 b/spring-security-modules/spring-security-x509/store/clientBob.p12 index e5d6dbcefbfaffa2502b1ed9613bc1cb2f9ce573..b5de8ab129d23828273dd98f929290facba95900 100644 GIT binary patch delta 3873 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 delta 3873 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 diff --git a/spring-security-modules/spring-security-x509/store/keystore.jks b/spring-security-modules/spring-security-x509/store/keystore.jks index 8650651a1e0a884555a4219049340ce2314315cb..c317c1d5ba5ba67fe18af77ec98ce6085616a2f6 100644 GIT binary patch delta 3702 zcmV-+4vF!G9nl?-AAh2S4%Ywx35GC&34$;V1_~<%0R#am0uccL1pows32q45b)2B9 z{nOAXELhkqR{S7)Xfm1pgMI<&gX_`6Ee7hGdK00sMCxpCR{rC^V%B4p=q9hp%*pRd zy(-kChTC=RRgY_C%-j_u+A=R9ZuW`X9p(81-P%5wHo`&A5`XL~W?ZgUiix!;U&HN} z5QqjHKDvLzb(GmNYC9{w?TxBG-gm^R`*y-r1sI9-BEOd<7Q11`?lF)dL45#G$`X9K zC||$q?-C7yVG3yW9LQhKJS$$S*v|rsHl&=_E4m!}qJAGf3n?$5CveQ(7X*{Lc-+o% z{tT^NGhNizc7N|I@|KG9hy591(k{3a_xlP+*tcn|wIKL|0*Akk7#{8t5}Gb}E`zUVpuQW#rWXl2;4NmnU4NEI;tTTC5zLWpE7&Dqfhm?( zVUiK$2u|I4`YFu$q4R$V;>qQ%o}cuJRXC)oaxmV{!K36aILeW?u-@p(X%Px)9+ggf zk>->Y0UrFm{Wr!RO}PPX@SzYQcq@4j+z%lYVJ?b=P~Z?(8}Crm!jaKL)87Wj$F-=^HoQZjvgU#&1$Q%2NTQe}}Qv zgnCfbvW&7y-AlN5bALQ+vhCe8JyER4Ne>y2v5PMaFw_1} z6T<`T1?Cl)MJ<#($$E2G*zwXgwfE{3rA$=dIo^>^60;N8Tlr5evvh21DXa|{OoG9Z zz>CtLFVaEVDTu!4pZ{_-Z~6c;s<&7949lrAhB)QDa^Bo-$hRGUkrU5h-Z^>7d+LYg zzJJx>5@WFdadfVazRuxyYzQe0t@ae;CQw6Mn4x|ZPBglY^~d=IvsScS`rGdZz;!&o z@neg;c#v^N&($G&1QrNkTjuYy=HJ4M&UC_SSQ(N+0N^b##E&ds34L@#Je=-PiSKzR z`5>OrdS@@xTgm3`TIC4d?EiLIIEl ztF%c!)Ul%D+1CAC!_bTPqm%ldc3|NpdwR;AZbtnMreFUM=K?9^b>{%Kt~jdEqS(U# z9;TqUuP&UttInFJEJi_2B!6TWnOgmJ_ckUN*rf4q3U$?)6?(%d6-%ok3AzAktbe=e z9&!vvsV=#{@$_PjXY+$mdB_Y;?~6~^EB0FBkCPca>^au`V^VW9?04Wrgp}!wVyZ5B z-1g^GF~06>4p4+vav~WIAmse?oK`%E65X>?ya;Wi4;MB?3!-i|w_sHRQGiKm7i%)V zu&9=JV^tnfW=;rpSZ4bN75Q(91b>Fef>;?!#gJ^X%#s7iB|R;)J03^Nl;7JNcy@7c zt1g5+3Pv#%YeMnr+HC9lKf?oFM#D}Zm!#TJZrqOCIkFUAtIePmZ5*58H2c+#E^VDU zQCRNYnI6vV88lut1t`&}Hh0s8S-YP5eFqu79+K|!Z#&lMq2f|xjQxY5W`8J(kN#rA zgm^p~bejDd;?fUo7*pm04pu2U$WSj_~}#q7L;>U+Wt9?ATms`l)Jvl;-=|BFu0 ziFg}=vdTkM>yM%A3tQu(di_bEpcYwHVQXz(J_rXHW&-3j5?_;SdzM0P+e&&MM1s8-=oWovLXhr4*d4K3PiPs@MfQ~s7 zxDkXUV$5KpV%)jDyD1QW(uHSl=l*09h0`UDcVsSRcYz;$Zmpb`n~+kY_lDp%7u+ob zB6!7pE9``5Ge*&C+TD#Eh@les6`L|MS@wH$T5k3u?f`bT^RApoY!2rKEnMa;2Vf7IwNjZ_K)X}Ar67)+ zZ`Iqj>c{} zp-K3~0LzS4nv2(|rEuaY|J(#JLfhVfF$|v)A^w$1#hX}guYX@VUB5K^>Go>MO6&gL z>IFlKmYXewv4?#Ed{4H##RQZdyXvnkLMao%Wy6%>;2C~Hgw{9>2k))bgO=1Om5Jv} z_-ZffZ|RTc!8B}l$pF)4(eU^lE>t|344{l|bi2WA7m+9v78rda&2Z3>ijOgshSFID zEhH#&>(UD*=zqs9uiOQDVpn4DE%UZyVV5kOE!p?2_W@sDSTb2lt+0ru@@^9re&cu( z^zR#P@j-+~YOXo9lln-?ki0{3k$~toQh$7FqR)B|>%Xc2C z+IntMQAWvnf^A!tPOdC<-ua3dOaKan%HDpk*dl;~fX()j$;ng<+zYFg2Nx=!g?L_F zIBIK;`*5o8T4evbPR73*#waUYY70XK+f}^E?>XdMS%Vd4>G6ws*ozD>Il=q<6PJFe zVcgwoe1DKJWZVI}J@A|6tC6$>s5iD-F7eTs*XF%U>Gr$Y_uNX(p#_`{XiY?GjbMxa zR1?2FpO{frx_hbTyRwsxf-1m|i|G8=g@X#CZ4*l>m;*=oU5khvU2LN&Ls+#+bKFoL zqn-=Lp|L({09qw)U=Am%oqvKhp5Py*lsG%t$wunkdY7S;0R)&7n2Z&!J zz$$3k^S3b?DrL}v=G1L%+D|stxL%l(ok3l=Mx%@f5_8|$B~{UJV)5e}l?osu5S=EG z<{u9hRGG}gtBe80Yi?PkAqrBDRv9<2!@bp2Wca|s=^&BMU=%g6Xc7TH63tk7Y35Iu z3sZ-J73kBNh_f(pmEQ#$pX5YNFKf$N3OO~1^KuSOH@qYO000311z0XMFgXAK1pzRE z1pP3A0_C6s0s#U76e~$njGzm-?DC1D@MZVvDGxln*^}A{Fc&g1F*P$XFgIEk4Kgt> zG%_+VH8V0WHIDf^vpB#=xvCFC8B|Z}aa&c}_8?|m9A(jZ(=Rx0q@MN)ow{%q6 zaW4&=kMGdfXQG{HKG)?^&Qvg{mg#%Or5t0Yp6SQSd+jj}F@;*)k;*V(l%&e#P&g^& z?Fwt{QoIDYL6*!plM;=<`lLJl9$`cF3f^8{x&kZa5Wq3ah<_XE38ddpJe&u5Cul zkK^F=!FHJ(I{2g6lNVOoWw)0!5%JAurU`fUfvfNISzg46I1L8?DR{~2l;*){fB~_% zz>%qLs`p@#_#**)FEx_u@%A277h0Q_w7)$nWGxUYz=hzO*}-Rd-rk^ z4NF_!uGI&HeGCBC}L$w+zGR-(4|LKVV`ng01Da9C3p9r4tRyMJ_Xcb;&rjyNG{epc^~#Jtra z1X+S_6-Cj-xtci+wk$&+vbkRxQazSm)r-h!zvt};x#{)*y@?VuYyEV&Fv?HSQeDe5W-d#7dL4uUr)b0k$aYk`T1)rjVk-ztQ zHLYHC-G5u0>U{zO0RRD`L@+`y9|i+e9U}x7FcyFmT#=5y%UV;J9{$Nwxe(S4`kt;5 zFbM_&RUH!q0x$qD6b1uT9T5Z#FbjeSY;R*>Y-n$DbTADD2`Yw2hW8Bt0Sg5H1A+np z04}m8A#R5!CNIArXS~vvgfVY$M?H-dLDY;t=6{XJMxDF~xm&DE(RyX?Ej#0Y(^j^T zuF)F=(2eT&@xD>*>rPTkG!&qkqupM;Dn=FP`U7Ys3132A%@?oZoNID%u$q$vVWSgd97EpQ$(z>l6ojrmEd!JHq!%G)_`a$!oeM&Kj$UjNk()iv0|ja{rUaK4k`h?H zQ-60RDy|HsRpQMb`4dYb7|Rt{<)$fQTl0%F?2xCpA{*_c=o42%mL%`_ss2#;yRi0M zbi<$&q!B2et?sG}D-?~AQ@nQbe0dS}&2 zlAE`~y04eU$vjk4oiYGy{I~3Ccg8`;LVtnWwfmR$FOHTJc?gY~=imO+b(A&Bz7SD5 zpJ?@4_lM(X4rba|EI@*~MJ-N^`dK7b*c2_rm2+_$FewoiacKP2MOqwc39*D1Wbn=( z*B3W|4>7-@>AZP)2DgD9)%IUN0E#(&^i-5a&K1#MWco;RMH}WC=0#!|#1EK%se2*@ zfo?N!Wm&Kzt^p=pR_m8o$Ip}5P!nfkQJ*PaBX05UfEbB3(_Ci!t0`y;y@J+&67p7;vaovfB*O ze{@dZ{F!=%S2lS6FD2)g?~;mOm@M8-9#*16dgb)I=B;CZu4`ExEbLm74gg<AJV2^Wz|kSRC1|x9Jj$Z2Ib3?%Km&`VkWI9UKH89#g^ysggD0 zEtx(ff_qSGaP4{&3#sj>S~D}R&p#W*yrc!iep`$LGh?`W+iDEuG#54vf1VxAJ;UN0 zOQamspMQBwuEMPn(#dR4LP@jauDBl$TS2@otJ|zfcE&y02|DOBnIjKuQyu36NG$gj z2kHgJJ#vj+%4vTfVaI(^8Bm58QMdSS09T`Zw#vA1a&=1X;gQ}I_(a6<{Oppiy3qFy zU|!hZg-c_>RF7dt(dxT~&Ok*eoZrs|Sn{THx__nukuB-h5~^HdzkrDWk++QPIC~Mp zE5tfPT23=A{7*E-Qa{M3zw?6Gc0i&+Cg3qjl zO!)4$*8)Z9E##a%tN%;T_;tQ%FNAuGxW zkwo5XB#EhUtv07xaz~39ooh}#i)r!13x5FA!Xh2n6p71gwlrif^S5cow$xR375YCPj!TactuG38SS_u0{Wm}@14_%Nfoe{5V+3@0U{(83?Zr;PJczx zBOA^~ay$l@i5(`~9$Ajj#WOR&pC?Zc7B|KtDxGK5)`Z{}>h_FQ$>%JGteaaQaCsTj;N&3vutfk-b z#!a6MFREJXDWq-YbS)_%Tr#4zrqE=2@wx1v*ss zZiku<){?OlU0O9Ql(V2`={zHp_>^If3jsV=X`go#ux3Q5J~g$tYgm&!wj`&jf|QmC zabM`DhOMPU?4!98BXNC4?eIOFr$$mfUZ+~Qvgio4Q zyR+qNKl<|^t%B~|$h>INju24{z^kc2h!YF7nbVyj*EQ}tv9X2Vj0v&QNJ=o;3ZR3Q zrVNbv+~~%5)quqjwF* zH*AXzePYfzg8p$^-nIYU)_?YL@^T4d@COMX5l6K|ea$5BbzTA9h3|y2W8&ivAKj?Y znoV7ZmC*4+;&*Nf-_Eb3kFPpaKP!I-Guvf1a2l_?#<0p=GlbBNb?X*X;gbn3cF20p zO7Pw~Iq<&$HC)D)MI*)lT$oOhPC06RjYviY;D6E4^Fd}{ZNev(MnzQexrbsy7 zW8Lh?GB4z?$p&5)*5?x6bZBM`pAa2a9e~UEmjQ6hG*=L{*YA`LtLOu-lHT?oF&7>*JF+NUbW`#e>6NXE{W&tF+WcIKc8V3ORt@!-V zxKzOepBE((MSm8)nL{X6!v6{2dyR?Fbgz9L`AYsMrcpO{dv@3~@zEb#zDEplG{QM| z3)%B+cHY!rweAr~8Kd0}RW%PmfCqR%8H&Oji}YVA)oUgfY1S(Nu=o9O*}sbDAll<9 zsv_2}ao%z9kX_Dxh*H+2Q9i&?MO+2s)e-v5+knkWNaS=1eB&t44<8gmS3Tw zNS7!~6NW#Mci9t`T)xd7i(NpPX9UQcGBFtyO&{pi|H}o54J?w;BgsDAdM8DSYRzJ7 zgHGK3qVhI@pY7GGuOj;%+Zu*^qsCIBqCw9^)zG+6{j%Nw000311z0XMFgXAK1hz1O z1hO!K0-6F8QPe%3Ydb_hDypXV{TL8Co+%loE+%@+lEGi>K5TgoTa(g!U`KBR#5LfM}cR5Z|e|Q!)S6D+E z!?=1`N@jd0SXTZ^o+MC5Fd)hScBAk_0vSnG?SFqpiG_0gwF@4y>YX{^W!zdc;}o>z zyWiCFe~n@`8LO%&6SJalr<&F~QMl!Yg5ENXIxiw#>tLP?9J)dzOP5yxC_|hzNpRD} zft3W1O*c6GzF6SK?kcMqjo}W#FC9G*8Y#iVSfMo?E@bNZyGKcQLlh{F?gP?PzblKc zEb@4kJ%SiSXwRcXB~<(kBp#AP-^88=e>V;We>rp3FM$C>bvY5*vz;H|h?E(V<00A%!1_>&LNQUCp3a__9Nr`(L#2(<1y8T4AT8h8;eth~Df z#Mg%2^(`lwi6?~LzXr8bIUj>vwz+@oymr-Ci(0x_7VFJMQ}U2m(?zy@+B2dkYlcz} z(1(_8>&T$ZG2{eMB*eLXE8z zHrJtqCzCX^8n}1_PVPWVeznXBMwrC%Lw;<(4*j5H*rR~bhcvFy)mvr^1|P5Y!YnsG z*W*6X$OWGZzqwyPD~}nYLzcg0nTltAPy#Saauwp5Y|JynmSOI1rBUJ}HHni+$+eQ- xXq=dge{@X+ok({7p1I8BgvfmAtjW4EI5v&5?&En6N+7MDmg91K}-DNGm*vtR` diff --git a/spring-security-modules/spring-security-x509/store/localhost.ext b/spring-security-modules/spring-security-x509/store/localhost.ext new file mode 100644 index 0000000000..45324cc75a --- /dev/null +++ b/spring-security-modules/spring-security-x509/store/localhost.ext @@ -0,0 +1,5 @@ +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +subjectAltName = @alt_names +[alt_names] +DNS.1 = localhost diff --git a/spring-security-modules/spring-security-x509/store/rootCA.crt b/spring-security-modules/spring-security-x509/store/rootCA.crt index 12677eb99f..b2ab681744 100644 --- a/spring-security-modules/spring-security-x509/store/rootCA.crt +++ b/spring-security-modules/spring-security-x509/store/rootCA.crt @@ -1,30 +1,30 @@ -----BEGIN CERTIFICATE----- -MIIFDzCCAvegAwIBAgIUHBIbl/8i0uLnPD8BuNHninzcqEMwDQYJKoZIhvcNAQEL -BQAwFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMB4XDTIwMDQxOTE2MTYyOFoXDTMw -MDQxNzE2MTYyOFowFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAx5UzDt8Q+p8fAERc8mb8vPJTMi1oTe3YsMjj -QsMpRJBjVyQ2BLe0AzevQjDthCD56sv+u6EoBibIDQ3rtXUpTi20XQU6aaU6tsmG -QBp/PapXU0qoRzoyTPjSpkjp8/VngH52adeQ0YFSQQfxzcFsEpIlceKC8bSqplQg -mM9GoRLzEHu8JoLtHHQvZhTZabB/t0SUNy6O848OmoEjW2PCyMG/XczP0BlSFDT/ -3FIJlTnKe+MfhXxbYuydQQbStoDuRqkHxprjRaCT/PXeEuW68FahyiTgeKL5Ite9 -NI0k37mRsO/gMPIMgJDU0Soz0zcaRZdQDrxTZBk43i2O/LSwPtcpxvOy5JCLJSP7 -Ff6yx6BkkIAxLrWZGIQ0DiL4L+XocjEy3WMhzQ/ka6M1Zi0JxCRBOPpV2yO1GE7U -NUVvHaHijiJlXGZ/YGzplkLGaPIPGLHRsJFf9+IDepyJ9+E2mKD1rXAYXrcGW/Hk -Is1A2Je0iH4IjYTrieMSuHG4Jb0fytMAPoFOXnLS18xv7CPX0m9M2OIL9/kFfI+f -4M7/mEOUwQw+Jt9EAz9QsjUdZ0ybT0gtq9GaIHBo844YbyEKe7Hzp5Msk4/+3qJz -FHyC8ay73jkLDv1jOKr9D/wd/TOfSrytktcP+y96+gUdp1RxMxv9hfFSAZ0lXd2E -X18X6RECAwEAAaNTMFEwHQYDVR0OBBYEFPIRVQmLHgzCWfvENpeURm3jt2K4MB8G -A1UdIwQYMBaAFPIRVQmLHgzCWfvENpeURm3jt2K4MA8GA1UdEwEB/wQFMAMBAf8w -DQYJKoZIhvcNAQELBQADggIBAGa6bvEvira9FJ559bRvnqNsdaybj++Q9ItRyejs -BvLupLhhCnFWC1rX3WufpyGxgQCu4Lng+ZXtJxSo4dJL4wXDf5U+/EgL0nNQXhQh -kcqm2k1GBgAPnKEt+9nF3326EchI7Vx7JV4AO89ifdfc3Z7q9MOWE4siro6JtK7l -WWfv7LwT9QdDW/Ww7wUAOKdJYlUBzqMYHwEBnIhNMyuFejDzc2GmkZiIjFq5bKoN -FpsjHCkPH4DdDhQKdwa1JRvML7r8IkVqL3NoSp2vkB07MkRiHtQL5R2/wI/WhiK2 -19YPeEP2fQc5NduFAqyz8VaxwskwtjCjUxJHKpEzUTa1n53X+0jx6yw7bmDnE4SW -JEq9563apphJWeFTGCSuTvc98TcZvxWDW8FeLoaWdBF+Tohddje10BW2IUvrSJHI -jh0LpWIJ6QTY+amwLF2USSgnBZwPZT34PS81FYmA1bn/Sa6uWc/dPZg9lvwKU6ta -Z9K4loc8OF+FXQHruV+3tqzXybR9dZG3fvW4RPR9BgxApzSw8lYKAfR5Lth7ihVi -/zlxZjvbXy0D+4xPg5OGwn3g/3n4XLhAMT87KvHc9VjbHt6uwmLgny+6Dw9JXuTC -R004LuQe3wfUye4x9WmQD5Zlg1dENvezCG8l9z5LRUDF+Rh0qXPMpUCaCuT3TvEN -clOH +MIIFDzCCAvegAwIBAgIUDmhG1yLlF83ydOWPit8/MYNbaC8wDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMB4XDTIwMDQyMjE1MzEyMFoXDTMw +MDQyMDE1MzEyMFowFzEVMBMGA1UEAwwMQmFlbGR1bmcuY29tMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAmkOSeQRQBQdoJio7Odm19kKVm4Y1ju1zscGM +LBWQ4GU8d3Y5AiOVzHtYUbKyJvmmUSYOH/mYdQ8F5nKKaXhTz92LIMnSXnusAqdD +YSvKa+mBoMLsd4Gl9lljipTvRwkkPlPXGVBDEVzXPf32l+5YxpGZzyVyj0WYT1cP +sZyThbOwue4h6gwer4SZ0HNPSts8TG7oiA4UTZSN5hhhbJmRBc87Xz+hJOMayZp6 +HA3tGTlrTkP/Vc3nii/G9tBeydmTTKj+BGFQW4qzDG6nJVvYyB4iri4ActREREGD +ycPS7SVXqEcA4rvSMR7DYoHVLkOg0uiQDWtj4zYcN9qgWVjcnIlUSPxrCgdJbakl +lRzrVpbkdlOC3hFSytoOBmCPS56gJ5npeLFh6IoPPdoXJwIXIJ1twCWtKzvlvlzb +DkMDytRVk2LYjh7IvtAWPTz5QofRdd2fW6iAWPdWbwcnq1xjO5BT8uGj+zOiA19/ +T2YebwD+pLAUM2w0ykLm+bH+DiSRa76wpKxuo6sSUefkeEt8Avojwh8nNbEOvXhf +El4zyimwTlfUYnaKEllUjRWVPhQPGCeCBHe1ES8UFf8hqGS2LRjKAZK70OcFdLyd +18sas/EXkNbd+Mpgata/zO9Oy/3h+xY426T5bPAt+wU38yMUaE+z5BS84m2GOtuQ +nC3a/HcCAwEAAaNTMFEwHQYDVR0OBBYEFFyRjr/LWlOZHv7JU7kQ1g76nq4SMB8G +A1UdIwQYMBaAFFyRjr/LWlOZHv7JU7kQ1g76nq4SMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQELBQADggIBAJWjUR/HBw5f7ogfyCVK/5fJutOFIIHqzNhExvDe +5wu9msPRAj+5ruGHtMWwOKm5qT82gZKJnAVct8XZXTIHU8mKS5Lbk02hu3e2tR/0 +RCzH4TCCD3fDJaW/jAZyU3oPtvcCaSmPwibG7SvDXtUvSSwCW8Omg7WqhnSWGUOn +WH3105lw8UKRTg57CaNu0GunqO4r0GcrgVShNKjCvNv7nGcP3+KWouZekBdn/iY5 +3Q8llL8WUMOHRwH6Raa6CV+vckCthUSpJdBAgGN44QtkA0iL/afVuE7VuTqsnCBA +nbOz/ssZOP0TUVYwoRiDN50gJdB8IKMHZu9Px2m7fJuGgZ7QDe56+tePypgM9KDq +yx4MKMP3Qc5xLE4pGM9SI1sGo+waW0+gPShNECHY4z8fOHw5bn+J1mrEWQbHfMGg +Z/352qps5Hd6PljLAHmWAJL2nXS2zlXbccdYuv4ZtNIeDUT8eX/9NuJdXrITq9QQ +oSBmyzH1bUJi2/mULcFy0Ibcu+OY/r8t67NrGKwLPLyozScwnFQE9SZR9d2cu6sC +yxQtcd68vdvAIEDTk4DcSldeT44HIJ7RYQuBNZ5NU3SngMLDleec/3AZSUXTExFW +TrbMTb+djM+XcTkRyO0wO0MYpjKGqN3sAGfppx0G9kgmJ9HB38nZfvqj3G1L9YFQ +6kSA -----END CERTIFICATE----- diff --git a/spring-security-modules/spring-security-x509/store/truststore.jks b/spring-security-modules/spring-security-x509/store/truststore.jks index 56654d8894466a86807235b65167f49f0a4b5a1d..1d0d20058040144717dadcfbc0560b85a0e9a284 100644 GIT binary patch delta 1196 zcmV;d1XKIY3eF0U7zCn`0jiN48Wav_M%Nf4Kpw>G%_$TH8U|XFp-fvf0{#*c?3`e2WTcLJ2~04_Cl4LhBc1ubFsmUEESO8 zWjuFwIRYb<%zIc-va%-mrcoviANiPd4+Z9OifMRL&)th4$4Bia z?012s_E}?!lx=kPT~N<2D>O+Mrojf83mjR7m`53I|DTsU?*h>sFTJc2k1h5mL(94hCS4OP-)7 zndx}3Vd#nvJ=zy10v8~iZNMe1D?8=BT-y#q1IpA@lVaG89>~7X7Ck)qLWj|H-Je^i zfLQldZwDue;mcuRZ&`Xj<0CpEDSy?9>|UNg!muufOhVs?rWSyYV`l|B>?7$<@RceN2O6czs= zsARS+7|H>XyU^zabiAF{%Nn!s7m(K7_{v~v*1yc}PRsq_`xZFcr1@;{E&ByG^CJ{! zPqX9{yy9(!I@^$(O)c8|cLDUqf$GfIM8@#m=L@}>!_fjixvt@dw8gMEskx~?Hi43foCRFB#o1jl z2UE$4OOo4@O`*GYwzVJhL@dYQFoF+v!zHD^j0SR3dJneu0%<9a!Y0P;E5lyZFG(x{ zTf?S)0uGbLXl1mdkLd%&}*lt?kmt|D}hv@G^oP7+xwhn58vXJ zqUK(Z7iaz^Io%H>l)n~G!-q!!`bDO?316>rK&^#DsU^@rfMa;!3uFUGi~Xn7xK7o% zI;@-^K%KL*{>vFS{S#4EFrgTOH=Q6Q(0m}H2WIb2$7#EKn}&aZp3n{MdivLo%9srF zpz6yW3@F3*LC$e3PAM4AQX^XiqwE@6PoO<0O%Ng2<3Arbd^v7^iPmbwSq8^^!JudT z`P!;%1r6fJSyyuI7N zAVAZTfZR$~UQdn(AfC}-3xPGBO;dEIfWpI-=bZm=8A(Oc6A@NUw#-exos7?yaXAsl z?Jzq-7^X6YsNL)UXX&RM2KGoMC(*&*$=QDTqugyv^??{r>O_FH=7mnG%+_ZHZe9bIFXS%f5(+G4&M;^pC153T=Hi8yz)~rEoe>c*s#dsLc=LU zkYiUQHUzh{12?ZiFztjO`RdF5yP+rsCdds9>$P<$PA#-u1v+V^I=0D%KpKBNs#jA= zs7E?7O!(5KNa^$SXMlcoY1fd^fl@&S@y)?(5|Slx;)3zCs-{#Rn9oL`e-iT$d%Pxs z?HqJ3W)#_Juz$Bils7Jp^N$Xifg@XE!pOnDUChtW8B!E9|J+gul{w0L;~#~5TVm{; zK?c&cfbK@A2gaJ?MWB=X_1+TYy6{$^$|T@;qWL1%y)=y^-?@>n@8B@<41kc-(JC|3 zHyTBkP!7CPWEnW#Esp%Of3QB+DaP}%6SvqXz~vjvC*)R zU-#kzdYp;(;Wn6{^{sFiUbhBY@#G@SK-ibGh<*r-gzJgp61Z`=e z($~yy>?7CGZ%o+Y3-|d2e2<^t&i|N0l)(%>Cf`H@KTxtY9cN6NPe?7R(V8G|X!DL3 zZy^eMvGb>sER&D^-lB69e1h?;yWTkq4*g>|s{IfA9sM((O1!O-*AM$Idin(&r&Mt> z8~ugxQURSMUEPFVO`D}{P6^K)UQ zk(h{#TDfeh4Hlat94QYUfZYxh3U>yzB^%5yy8I$VYAi$Hno4Bo!9$F@#`!*ZeZsV zgq9>qz2~jkrkF`t;ZqnSu1@zo@i!U26@y#BUM_}~bP;||h+TF!wa^u|AxrB>k;sl6 z3#DQS=>*vMsjw_vlu0Nj1)L9MJ@`E@H5G|~)w%ykuC7_n-94B+mi!7+t6FE$xR!@J zIA4Wb0qeP6x3+(**U7Yfb&gHX@M8)j?l^w{ From 8985f601a7c9b32951f2fb369092f8ab89ca0741 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Wed, 22 Apr 2020 22:15:54 -0600 Subject: [PATCH 510/530] BAEL-3961 move the sql string into a new line to improve readability. --- .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index 8637f6f851..45f206a2b9 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -37,7 +37,8 @@ public class EmployeeDAO { public List getEmployeesFromIdList(List ids) { String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); - List employees = jdbcTemplate.query(String.format("SELECT * FROM EMPLOYEE WHERE id IN (%s)", inSql), + List employees = jdbcTemplate.query( + String.format("SELECT * FROM EMPLOYEE WHERE id IN (%s)", inSql), ids.toArray(), (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); @@ -53,7 +54,8 @@ public class EmployeeDAO { } jdbcTemplate.batchUpdate("INSERT INTO employee_tmp VALUES(?)", employeeIds); - List employees = jdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", + List employees = jdbcTemplate.query( + "SELECT * FROM EMPLOYEE WHERE id IN (SELECT id FROM employee_tmp)", (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); jdbcTemplate.update("DELETE FROM employee_tmp"); From 38f62ad24d646f18d66019eb808861462868ad80 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Wed, 22 Apr 2020 22:36:18 -0600 Subject: [PATCH 511/530] BAEL-3961 move the sql string into a new line to improve readability. --- .../src/main/java/com/baeldung/jdbc/EmployeeDAO.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java index 45f206a2b9..2ea42381eb 100644 --- a/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java +++ b/persistence-modules/spring-persistence-simple-2/src/main/java/com/baeldung/jdbc/EmployeeDAO.java @@ -28,7 +28,8 @@ public class EmployeeDAO { public List getEmployeesFromIdListNamed(List ids) { SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); - List employees = namedJdbcTemplate.query("SELECT * FROM EMPLOYEE WHERE id IN (:ids)", + List employees = namedJdbcTemplate.query( + "SELECT * FROM EMPLOYEE WHERE id IN (:ids)", parameters, (rs, rowNum) -> new Employee(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"))); From 8bd69814b04b55c54fb7da0c80682b5b84d2e742 Mon Sep 17 00:00:00 2001 From: Benjamin Caure Date: Thu, 23 Apr 2020 07:23:11 +0200 Subject: [PATCH 512/530] BAEL-3964 HTML emails with Thymeleaf and FreeMarker (#9119) --- spring-mvc-basics-2/README.md | 1 + .../ApplicationConfiguration.java | 30 +----- .../configuration/EmailConfiguration.java | 89 ++++++++++++++++++ .../spring/configuration/WebInitializer.java | 1 + .../spring/controller/MailController.java | 80 ++++++++++++---- .../baeldung/spring/domain/MailObject.java | 29 ++++++ .../baeldung/spring/mail/EmailService.java | 20 +++- .../spring/mail/EmailServiceImpl.java | 84 ++++++++++++++--- .../src/main/resources/mail-logo.png | Bin 0 -> 7391 bytes .../main/resources/mailMessages.properties | 5 + .../resources/mailMessages_fr_FR.properties | 5 + .../src/main/webapp/WEB-INF/views/emails.jsp | 7 +- .../webapp/WEB-INF/views/mail/sendHtml.jsp | 73 ++++++++++++++ .../views/mail/template-freemarker.ftl | 15 +++ .../views/mail/template-thymeleaf.html | 15 +++ .../java/com/baeldung/SpringContextTest.java | 3 +- .../rss/ArticleRssIntegrationTest.java | 4 +- 17 files changed, 396 insertions(+), 65 deletions(-) create mode 100644 spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java create mode 100644 spring-mvc-basics-2/src/main/resources/mail-logo.png create mode 100644 spring-mvc-basics-2/src/main/resources/mailMessages.properties create mode 100644 spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties create mode 100644 spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp create mode 100644 spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl create mode 100644 spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html diff --git a/spring-mvc-basics-2/README.md b/spring-mvc-basics-2/README.md index 9d1402a210..e52459bd6e 100644 --- a/spring-mvc-basics-2/README.md +++ b/spring-mvc-basics-2/README.md @@ -9,6 +9,7 @@ This module contains articles about Spring MVC - [Servlet Redirect vs Forward](https://www.baeldung.com/servlet-redirect-forward) - [Apache Tiles Integration with Spring MVC](https://www.baeldung.com/spring-mvc-apache-tiles) - [Guide to Spring Email](https://www.baeldung.com/spring-email) +- [Using ThymeLeaf and FreeMarker Emails Templates with Spring](https://www.baeldung.com/thymeleaf-freemarker-email) - [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405) - [Spring @RequestParam Annotation](https://www.baeldung.com/spring-request-param) - More articles: [[more -->]](/spring-mvc-basics-3) diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java index 941a984684..e70e801577 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java @@ -2,7 +2,6 @@ package com.baeldung.spring.configuration; import java.util.ArrayList; import java.util.List; -import java.util.Properties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -10,9 +9,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.feed.RssChannelHttpMessageConverter; -import org.springframework.mail.SimpleMailMessage; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; @@ -65,29 +61,5 @@ public class ApplicationConfiguration implements WebMvcConfigurer { converters.add(new RssChannelHttpMessageConverter()); converters.add(new JsonChannelHttpMessageConverter()); } - - @Bean - public SimpleMailMessage templateSimpleMessage() { - SimpleMailMessage message = new SimpleMailMessage(); - message.setText("This is the test email template for your email:\n%s\n"); - return message; - } - - @Bean - public JavaMailSender getJavaMailSender() { - JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost("smtp.gmail.com"); - mailSender.setPort(587); - - mailSender.setUsername("my.gmail@gmail.com"); - mailSender.setPassword("password"); - - Properties props = mailSender.getJavaMailProperties(); - props.put("mail.transport.protocol", "smtp"); - props.put("mail.smtp.auth", "true"); - props.put("mail.smtp.starttls.enable", "true"); - props.put("mail.debug", "true"); - - return mailSender; - } + } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java new file mode 100644 index 0000000000..1bbbc51304 --- /dev/null +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/EmailConfiguration.java @@ -0,0 +1,89 @@ +package com.baeldung.spring.configuration; + +import java.util.Properties; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; +import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; +import org.thymeleaf.spring4.SpringTemplateEngine; +import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; + +@Configuration +@ComponentScan(basePackages = { "com.baeldung.spring.mail" }) +public class EmailConfiguration { + + @Bean + public JavaMailSender getJavaMailSender() { + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + + mailSender.setHost("smtp.gmail.com"); + mailSender.setPort(587); + + mailSender.setUsername("my.gmail@gmail.com"); + mailSender.setPassword("password"); + + Properties props = mailSender.getJavaMailProperties(); + props.put("mail.transport.protocol", "smtp"); + props.put("mail.smtp.auth", "true"); + props.put("mail.smtp.starttls.enable", "false"); + props.put("mail.debug", "true"); + + return mailSender; + } + + @Bean + public SimpleMailMessage templateSimpleMessage() { + SimpleMailMessage message = new SimpleMailMessage(); + message.setText("This is the test email template for your email:\n%s\n"); + return message; + } + + @Bean + public SpringTemplateEngine thymeleafTemplateEngine() { + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + templateEngine.setTemplateResolver(thymeleafTemplateResolver()); + templateEngine.setTemplateEngineMessageSource(emailMessageSource()); + return templateEngine; + } + + @Bean + public SpringResourceTemplateResolver thymeleafTemplateResolver() { + SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); + templateResolver.setPrefix("/WEB-INF/views/mail/"); + templateResolver.setSuffix(".html"); + templateResolver.setTemplateMode("HTML"); + templateResolver.setCharacterEncoding("UTF-8"); + return templateResolver; + } + + @Bean + public FreeMarkerConfigurer freemarkerConfig() { + FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); + freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/views/mail"); + return freeMarkerConfigurer; + } + + @Bean + public FreeMarkerViewResolver freemarkerViewResolver() { + FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); + resolver.setCache(true); + resolver.setPrefix(""); + resolver.setSuffix(".ftl"); + return resolver; + } + + + @Bean + public ResourceBundleMessageSource emailMessageSource() { + final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + messageSource.setBasename("/mailMessages"); + return messageSource; + } + +} diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java index 74094a11c7..4d43549440 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/configuration/WebInitializer.java @@ -20,6 +20,7 @@ public class WebInitializer implements WebApplicationInitializer { // ctx.register(GroovyConfiguration.class); // ctx.register(JadeTemplateConfiguration.class); // ctx.register(PushConfiguration.class); + ctx.register(EmailConfiguration.class); // ctx.setServletContext(container); //ctx.register(TilesApplicationConfiguration.class); diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java index 16d1202eef..b6e19a4c39 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java @@ -1,10 +1,17 @@ package com.baeldung.spring.controller; -import com.baeldung.spring.mail.EmailServiceImpl; -import com.baeldung.spring.domain.MailObject; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import javax.mail.MessagingException; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.Errors; @@ -12,26 +19,21 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +import com.baeldung.spring.domain.MailObject; +import com.baeldung.spring.mail.EmailService; + +import freemarker.template.TemplateException; @Controller @RequestMapping("/mail") public class MailController { @Autowired - public EmailServiceImpl emailService; + public EmailService emailService; @Value("${attachment.invoice}") private String attachmentPath; - @Autowired - public SimpleMailMessage template; - private static final Map> labels; static { @@ -46,7 +48,7 @@ public class MailController { //Email with template props = new HashMap<>(); - props.put("headerText", "Send Email Using Template"); + props.put("headerText", "Send Email Using Text Template"); props.put("messageLabel", "Template Parameter"); props.put("additionalInfo", "The parameter value will be added to the following message template:
    " + @@ -60,6 +62,7 @@ public class MailController { props.put("messageLabel", "Message"); props.put("additionalInfo", "To make sure that you send an attachment with this email, change the value for the 'attachment.invoice' in the application.properties file to the path to the attachment."); labels.put("sendAttachment", props); + } @RequestMapping(method = RequestMethod.GET) @@ -85,6 +88,7 @@ public class MailController { return "mail/send"; } + @RequestMapping(value = "/send", method = RequestMethod.POST) public String createMail(Model model, @ModelAttribute("mailObject") @Valid MailObject mailObject, @@ -95,7 +99,7 @@ public class MailController { emailService.sendSimpleMessage(mailObject.getTo(), mailObject.getSubject(), mailObject.getText()); - return "redirect:/home"; + return "emails"; } @RequestMapping(value = "/sendTemplate", method = RequestMethod.POST) @@ -107,10 +111,9 @@ public class MailController { } emailService.sendSimpleMessageUsingTemplate(mailObject.getTo(), mailObject.getSubject(), - template, mailObject.getText()); - return "redirect:/home"; + return "redirect:/mail"; } @RequestMapping(value = "/sendAttachment", method = RequestMethod.POST) @@ -127,6 +130,47 @@ public class MailController { attachmentPath ); - return "redirect:/home"; + return "redirect:/mail"; + } + + + @RequestMapping(value = {"/sendHtml"}, method = RequestMethod.GET) + public String getHtmlMailView(Model model, + HttpServletRequest request) { + + Map templateEngines = new HashMap<>(); + templateEngines.put("Thymeleaf", "Thymeleaf"); + templateEngines.put("Freemarker", "Freemarker"); + model.addAttribute("mailObject", new MailObject()); + model.addAttribute("templateEngines", templateEngines); + return "mail/sendHtml"; + } + + @RequestMapping(value = "/sendHtml", method = RequestMethod.POST) + public String createHtmlMail(Model model, + @ModelAttribute("mailObject") @Valid MailObject mailObject, + Errors errors) throws IOException, MessagingException, TemplateException { + if (errors.hasErrors()) { + return "mail/send"; + } + + Map templateModel = new HashMap<>(); + templateModel.put("recipientName", mailObject.getRecipientName()); + templateModel.put("text", mailObject.getText()); + templateModel.put("senderName", mailObject.getSenderName()); + + if (mailObject.getTemplateEngine().equalsIgnoreCase("thymeleaf")) { + emailService.sendMessageUsingThymeleafTemplate( + mailObject.getTo(), + mailObject.getSubject(), + templateModel); + } else { + emailService.sendMessageUsingFreemarkerTemplate( + mailObject.getTo(), + mailObject.getSubject(), + templateModel); + } + + return "redirect:/mail"; } } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java index aceaf685fa..d425ca9a26 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java @@ -12,8 +12,11 @@ public class MailObject { @NotNull @Size(min = 1, message = "Please, set an email address to send the message to it") private String to; + private String recipientName; private String subject; private String text; + private String senderName; + private String templateEngine; public String getTo() { return to; @@ -38,4 +41,30 @@ public class MailObject { public void setText(String text) { this.text = text; } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getSenderName() { + return senderName; + } + + public void setSenderName(String senderName) { + this.senderName = senderName; + } + + public String getTemplateEngine() { + return templateEngine; + } + + public void setTemplateEngine(String templateEngine) { + this.templateEngine = templateEngine; + } + + } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java index 43d7378227..b7d5be09c8 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailService.java @@ -1,6 +1,11 @@ package com.baeldung.spring.mail; -import org.springframework.mail.SimpleMailMessage; +import java.io.IOException; +import java.util.Map; + +import javax.mail.MessagingException; + +import freemarker.template.TemplateException; /** * Created by Olga on 8/22/2016. @@ -11,10 +16,19 @@ public interface EmailService { String text); void sendSimpleMessageUsingTemplate(String to, String subject, - SimpleMailMessage template, - String ...templateArgs); + String ...templateModel); void sendMessageWithAttachment(String to, String subject, String text, String pathToAttachment); + + void sendMessageUsingThymeleafTemplate(String to, + String subject, + Map templateModel) + throws IOException, MessagingException; + + void sendMessageUsingFreemarkerTemplate(String to, + String subject, + Map templateModel) + throws IOException, TemplateException, MessagingException; } diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java index 039b970d8e..0592415ab5 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java @@ -1,26 +1,49 @@ package com.baeldung.spring.mail; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.FileSystemResource; -import org.springframework.mail.MailException; -import org.springframework.mail.SimpleMailMessage; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.stereotype.Component; - import java.io.File; +import java.io.IOException; +import java.util.Map; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.mail.MailException; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; +import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring4.SpringTemplateEngine; + +import freemarker.template.Template; +import freemarker.template.TemplateException; + /** * Created by Olga on 7/15/2016. */ -@Component +@Service("EmailService") public class EmailServiceImpl implements EmailService { @Autowired public JavaMailSender emailSender; + + @Autowired + public SimpleMailMessage template; + + @Autowired + private SpringTemplateEngine thymeleafTemplateEngine; + + @Autowired + private FreeMarkerConfigurer freemarkerConfigurer; + + @Value("classpath:/mail-logo.png") + Resource resourceFile; public void sendSimpleMessage(String to, String subject, String text) { try { @@ -38,9 +61,8 @@ public class EmailServiceImpl implements EmailService { @Override public void sendSimpleMessageUsingTemplate(String to, String subject, - SimpleMailMessage template, - String ...templateArgs) { - String text = String.format(template.getText(), templateArgs); + String ...templateModel) { + String text = String.format(template.getText(), templateModel); sendSimpleMessage(to, subject, text); } @@ -66,4 +88,42 @@ public class EmailServiceImpl implements EmailService { e.printStackTrace(); } } + + + @Override + public void sendMessageUsingThymeleafTemplate( + String to, String subject, Map templateModel) + throws MessagingException { + + Context thymeleafContext = new Context(); + thymeleafContext.setVariables(templateModel); + + String htmlBody = thymeleafTemplateEngine.process("template-thymeleaf.html", thymeleafContext); + + sendHtmlMessage(to, subject, htmlBody); + } + + @Override + public void sendMessageUsingFreemarkerTemplate( + String to, String subject, Map templateModel) + throws IOException, TemplateException, MessagingException { + + Template freemarkerTemplate = freemarkerConfigurer.createConfiguration().getTemplate("template-freemarker.ftl"); + String htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString(freemarkerTemplate, templateModel); + + sendHtmlMessage(to, subject, htmlBody); + } + + private void sendHtmlMessage(String to, String subject, String htmlBody) throws MessagingException { + + MimeMessage message = emailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + helper.setTo(to); + helper.setSubject(subject); + helper.setText(htmlBody, true); + helper.addInline("attachment.png", resourceFile); + emailSender.send(message); + + } + } diff --git a/spring-mvc-basics-2/src/main/resources/mail-logo.png b/spring-mvc-basics-2/src/main/resources/mail-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..edb83efbe3d4f083363fea616d5c0e2df6e1fe03 GIT binary patch literal 7391 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 TggyZsN(>c6O@%LVmf`;o*#$Af literal 0 HcmV?d00001 diff --git a/spring-mvc-basics-2/src/main/resources/mailMessages.properties b/spring-mvc-basics-2/src/main/resources/mailMessages.properties new file mode 100644 index 0000000000..46f7a80ed3 --- /dev/null +++ b/spring-mvc-basics-2/src/main/resources/mailMessages.properties @@ -0,0 +1,5 @@ +greetings=Hi {0}, +subscriptions=Please find below your current subscriptions to our forum: +regards=Regards, +unsubscribe=Unsubscribe from these emails here +signature={0} at Baeldung \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties b/spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties new file mode 100644 index 0000000000..6f300a9ab7 --- /dev/null +++ b/spring-mvc-basics-2/src/main/resources/mailMessages_fr_FR.properties @@ -0,0 +1,5 @@ +greetings=Bonjour {0}, +subscriptions=Voici vos différentes souscriptions sur notre forum : +regards=Cordialement, +unsubscribe=Se désinscrire de ces emails ici +signature={0} à Baeldung \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp index 63351bbf3a..dafa71cbb0 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/emails.jsp @@ -26,7 +26,7 @@ - + @@ -34,6 +34,11 @@ + + + + + diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp new file mode 100644 index 0000000000..f91a8826d1 --- /dev/null +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/sendHtml.jsp @@ -0,0 +1,73 @@ +<%-- + User: Benjamin CAURE + Date: 4/14/2020 +--%> +<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + Send HTML Email + + +

    +

    Send Email Using Text Template

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Enter email address
    + +
    + Enter the recipient name
    + +
    + Enter the subject
    + +
    + +
    + Enter the sender name
    + +
    + Select the template engine
    + +
    + +
    +
    +
    +
    +
    + + diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl new file mode 100644 index 0000000000..066fc0302c --- /dev/null +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-freemarker.ftl @@ -0,0 +1,15 @@ + + + + + + +

    Hi ${recipientName}

    +

    ${text}

    +

    Regards,

    +

    + ${senderName} at Baeldung
    + +

    + + diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html new file mode 100644 index 0000000000..b255b5dee5 --- /dev/null +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/views/mail/template-thymeleaf.html @@ -0,0 +1,15 @@ + + + + + + +

    +

    +

    +

    +
    + +

    + + diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java index ab0b23c4a5..5c276254d3 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/SpringContextTest.java @@ -7,10 +7,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import com.baeldung.spring.configuration.ApplicationConfiguration; +import com.baeldung.spring.configuration.EmailConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes={ApplicationConfiguration.class}) +@ContextConfiguration(classes={ApplicationConfiguration.class, EmailConfiguration.class}) @WebAppConfiguration public class SpringContextTest { diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java index fe7aeeb570..2ed70489c0 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java @@ -1,6 +1,8 @@ package com.baeldung.controller.rss; import com.baeldung.spring.configuration.ApplicationConfiguration; +import com.baeldung.spring.configuration.EmailConfiguration; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -13,7 +15,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@SpringJUnitWebConfig(ApplicationConfiguration.class) +@SpringJUnitWebConfig(classes={ApplicationConfiguration.class, EmailConfiguration.class}) public class ArticleRssIntegrationTest { public static final String APPLICATION_RSS_XML = "application/rss+xml"; public static final String APPLICATION_RSS_JSON = "application/rss+json"; From 62842f97cf2c1e1ce1ba94c5505d769acb0632a6 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Thu, 23 Apr 2020 13:10:29 +0530 Subject: [PATCH 513/530] JAVA-923: Migrate spring-data-dynamodb to parent-boot-2 --- persistence-modules/spring-data-dynamodb/pom.xml | 8 ++++---- .../spring/data/dynamodb/config/DynamoDBConfig.java | 4 ++-- .../data/dynamodb/repositories/ProductInfoRepository.java | 7 ++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/persistence-modules/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml index fceceb40ba..377e35b635 100644 --- a/persistence-modules/spring-data-dynamodb/pom.xml +++ b/persistence-modules/spring-data-dynamodb/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../parent-boot-2 @@ -19,7 +19,7 @@ org.springframework.data spring-data-releasetrain - Hopper-SR10 + Lovelace-SR16 pom import @@ -174,7 +174,7 @@ com.baeldung.Application 4.3.4.RELEASE 4.5.2 - 4.4.1 + 5.1.0 1.11.64 3.3.7-1 1.0.392 diff --git a/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java index 9278c0a12e..7e97e6b383 100644 --- a/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java +++ b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/config/DynamoDBConfig.java @@ -44,8 +44,8 @@ public class DynamoDBConfig { return new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey); } - @Bean(name = "mvcHandlerMappingIntrospector") - public HandlerMappingIntrospector mvcHandlerMappingIntrospector() { + @Bean(name = "mvcHandlerMappingIntrospectorCustom") + public HandlerMappingIntrospector mvcHandlerMappingIntrospectorCustom() { return new HandlerMappingIntrospector(context); } } diff --git a/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java index da47f033b6..6e8b493c3b 100644 --- a/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java +++ b/persistence-modules/spring-data-dynamodb/src/main/java/com/baeldung/spring/data/dynamodb/repositories/ProductInfoRepository.java @@ -1,12 +1,13 @@ package com.baeldung.spring.data.dynamodb.repositories; -import com.baeldung.spring.data.dynamodb.model.ProductInfo; +import java.util.Optional; + import org.socialsignin.spring.data.dynamodb.repository.EnableScan; import org.springframework.data.repository.CrudRepository; -import java.util.List; +import com.baeldung.spring.data.dynamodb.model.ProductInfo; @EnableScan public interface ProductInfoRepository extends CrudRepository { - List findById(String id); + Optional findById(String id); } From 7367f3b0ba099d02f98b78599ca6c860047595b8 Mon Sep 17 00:00:00 2001 From: Usman Mohyuddin Date: Thu, 23 Apr 2020 22:54:55 +0500 Subject: [PATCH 514/530] add code files for "How to determine the data type in Groovy" (#9123) * add code files for "How to groovy data types" add code files for "How to groovy data types" * added Tests in example * Update pom.xml change tab into spaces --- core-groovy-2/determine-datatype/pom.xml | 40 ++++++++++++++ .../groovy/determine/datatype/Person.groovy | 14 +++++ .../determine/datatype/PersonTest.groovy | 55 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 core-groovy-2/determine-datatype/pom.xml create mode 100644 core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy create mode 100644 core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy diff --git a/core-groovy-2/determine-datatype/pom.xml b/core-groovy-2/determine-datatype/pom.xml new file mode 100644 index 0000000000..0bcef4e5d8 --- /dev/null +++ b/core-groovy-2/determine-datatype/pom.xml @@ -0,0 +1,40 @@ + + 4.0.0 + com.baeldung.groovy + determine-datatype + 0.0.1-SNAPSHOT + + src + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + org.codehaus.gmaven + groovy-maven-plugin + + + org.codehaus.groovy + groovy-all + 2.0.6 + + + + + + + + + org.junit + junit5-engine + 5.0.0-ALPHA + + + \ No newline at end of file diff --git a/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy new file mode 100644 index 0000000000..1a89dce435 --- /dev/null +++ b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/Person.groovy @@ -0,0 +1,14 @@ +package com.baeldung.groovy.determine.datatype + +class Person { + + private int ageAsInt + private Double ageAsDouble + private String ageAsString + + Person() {} + Person(int ageAsInt) { this.ageAsInt = ageAsInt} + Person(Double ageAsDouble) { this.ageAsDouble = ageAsDouble} + Person(String ageAsString) { this.ageAsString = ageAsString} +} +class Student extends Person {} diff --git a/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy new file mode 100644 index 0000000000..56095a3f1b --- /dev/null +++ b/core-groovy-2/determine-datatype/src/com/baeldung/groovy/determine/datatype/PersonTest.groovy @@ -0,0 +1,55 @@ +package com.baeldung.groovy.determine.datatype; + +import org.junit.Assert +import org.junit.Test; + +public class PersonTest { + + @Test + public void givenWhenParameterTypeIsInteger_thenReturnTrue() { + Person personObj = new Person(10) + Assert.assertTrue(personObj.ageAsInt instanceof Integer); + } + + @Test + public void givenWhenParameterTypeIsDouble_thenReturnTrue() { + Person personObj = new Person(10.0) + Assert.assertTrue((personObj.ageAsDouble).getClass() == Double) + } + + @Test + public void givenWhenParameterTypeIsString_thenReturnTrue() { + Person personObj = new Person("10 years") + Assert.assertTrue(personObj.ageAsString.class == String) + } + + @Test + public void givenClassName_WhenParameterIsInteger_thenReturnTrue() { + Assert.assertTrue(Person.class.getDeclaredField('ageAsInt').type == int.class) + } + + @Test + public void givenWhenObjectIsInstanceOfType_thenReturnTrue() { + Person personObj = new Person() + Assert.assertTrue(personObj instanceof Person) + } + + @Test + public void givenWhenInstanceIsOfSubtype_thenReturnTrue() { + Student studentObj = new Student() + Assert.assertTrue(studentObj in Person) + } + + @Test + public void givenGroovyList_WhenFindClassName_thenReturnTrue() { + def ageList = ['ageAsString','ageAsDouble', 10] + Assert.assertTrue(ageList.class == ArrayList) + Assert.assertTrue(ageList.getClass() == ArrayList) + } + + @Test + public void givenGrooyMap_WhenFindClassName_thenReturnTrue() { + def ageMap = [ageAsString: '10 years', ageAsDouble: 10.0] + Assert.assertFalse(ageMap.class == LinkedHashMap) + } +} \ No newline at end of file From b31b84d475f77972c2fb512707489e0354c4169a Mon Sep 17 00:00:00 2001 From: Gergo Petrik Date: Fri, 24 Apr 2020 16:00:30 +0200 Subject: [PATCH 515/530] Mockint objectmapper with mockito (#9017) * Mockint objectmapper with mockito * enforcing naming convention for test classes * removed Spring * removed unattended changes * modified example * simplified call stack in flower validator --- spring-mockito/pom.xml | 2 +- testing-modules/mockito-2/pom.xml | 15 ++++++ .../baeldung/mockito/objectmapper/Flower.java | 32 +++++++++++ .../FlowerJsonStringValidator.java | 17 ++++++ .../FlowerJsonStringValidatorUnitTest.java | 53 +++++++++++++++++++ 5 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java create mode 100644 testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java diff --git a/spring-mockito/pom.xml b/spring-mockito/pom.xml index f3e0b04808..5d2cd7c445 100644 --- a/spring-mockito/pom.xml +++ b/spring-mockito/pom.xml @@ -28,7 +28,7 @@
    - 2.21.0 + 2.24.0 diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 76608a3039..340af89c82 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -14,8 +14,23 @@ ../../ + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + + + 2.21.0 + 2.10.3 diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java new file mode 100644 index 0000000000..bc366a39f9 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java @@ -0,0 +1,32 @@ +package com.baeldung.mockito.objectmapper; + +public class Flower { + + private String name; + private Integer petals; + + public Flower(String name, Integer petals) { + this.name = name; + this.petals = petals; + } + + public Flower() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getPetals() { + return petals; + } + + public void setPetals(Integer petals) { + this.petals = petals; + } + +} diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java new file mode 100644 index 0000000000..91bad66e6d --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java @@ -0,0 +1,17 @@ +package com.baeldung.mockito.objectmapper; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class FlowerJsonStringValidator { + private ObjectMapper objectMapper; + + public FlowerJsonStringValidator(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + public boolean flowerHasPetals(String jsonFlowerAsString) throws JsonProcessingException { + Flower flower = objectMapper.readValue(jsonFlowerAsString, Flower.class); + return flower.getPetals() > 0; + } +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java new file mode 100644 index 0000000000..31c3f0d01d --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.mockito.objectmapper; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class FlowerJsonStringValidatorUnitTest { + + @Mock + private ObjectMapper objectMapper; + + private FlowerJsonStringValidator flowerJsonStringValidator; + + @BeforeEach + public void setUp() { + flowerJsonStringValidator = new FlowerJsonStringValidator(objectMapper); + } + + @Test + public void whenCallingHasPetalsWithPetals_thenReturnsTrue() throws JsonProcessingException { + Flower rose = new Flower("testFlower", 100); + + when(objectMapper.readValue(anyString(), eq(Flower.class))).thenReturn(rose); + + assertTrue(flowerJsonStringValidator.flowerHasPetals("this can be a very long json flower")); + + verify(objectMapper, times(1)).readValue(anyString(), eq(Flower.class)); + } + + @Test + public void whenCallingHasPetalsWithZeroPetal_thenReturnsFalse() throws JsonProcessingException { + Flower rose = new Flower("testFlowerWithoutPetal", 0); + + when(objectMapper.readValue(anyString(), eq(Flower.class))).thenReturn(rose); + + assertFalse(flowerJsonStringValidator.flowerHasPetals("this can be a very long json flower")); + + verify(objectMapper, times(1)).readValue(anyString(), eq(Flower.class)); + } +} From 35f1a3eba55288d0141e6394a616691a6ed1c124 Mon Sep 17 00:00:00 2001 From: Roque Santos Date: Fri, 24 Apr 2020 11:10:44 -0300 Subject: [PATCH 516/530] BAEL-3927 : Encode a String to UTF-8 in Java (#8954) * BAEL-3927 : Encode a String to UTF-8 in Java * Update core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encode/StringEncodeUnitTest.java Co-Authored-By: KevinGilmore * BAEL-3927 : Applying suggested adjustments * BAEL-3927 : Simplifying the code snippets * BAEL-3927 : Coding styles adjustements * BAEL-3927 : Test adjustements to fit changes in article Co-authored-by: KevinGilmore --- .../encodetoutf8/StringEncodeUnitTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java new file mode 100644 index 0000000000..a73104b234 --- /dev/null +++ b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/encodetoutf8/StringEncodeUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.encodetoutf8; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.codec.binary.StringUtils; +import org.junit.Test; + +public class StringEncodeUnitTest { + + @Test + public void givenGermanAsciiString_whenComparing_thenCompareNotEquals() { + String germanString = "Entwickeln Sie mit Vergnügen"; + byte[] germanBytes = germanString.getBytes(); + + String asciiEncodedString = new String(germanBytes, StandardCharsets.US_ASCII); + + assertNotEquals(germanString, asciiEncodedString); + } + + @Test + public void givenUsAsciiString_whenComparing_thenCompareNotEquals() { + String englishString = "Develop with pleasure"; + byte[] englishBytes = englishString.getBytes(); + + String asciiEncondedEnglishString = new String(englishBytes, StandardCharsets.US_ASCII); + + assertEquals(englishString, asciiEncondedEnglishString); + } + + /* + * ApacheCommonsCodecEncode + */ + @Test + public void givenSomeUnencodedString_whenApacheCommonsCodecEncode_thenCompareEquals() { + String rawString = "Entwickeln Sie mit Vergnügen"; + byte[] bytes = StringUtils.getBytesUtf8(rawString); + + String utf8EncodedString = StringUtils.newStringUtf8(bytes); + + assertEquals(rawString, utf8EncodedString); + } + + /* + * CoreJavaEncode + */ + @Test + public void givenSomeUnencodedString_whenCoreJavaEncode_thenCompareEquals() { + String rawString = "Entwickeln Sie mit Vergnügen"; + byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8); + + String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8); + + assertEquals(rawString, utf8EncodedString); + } + + /* + * Java7StandardCharsetsEncode + */ + @Test + public void givenSomeUnencodedString_whenJava7StandardCharsetsEncode_thenCompareEquals() { + String rawString = "Entwickeln Sie mit Vergnügen"; + ByteBuffer buffer = StandardCharsets.UTF_8.encode(rawString); + + String utf8EncodedString = StandardCharsets.UTF_8.decode(buffer) + .toString(); + + assertEquals(rawString, utf8EncodedString); + } +} From 7d6e096d28e9c1585f52bb464e9150ebbd2ca3b1 Mon Sep 17 00:00:00 2001 From: Donato Rimenti Date: Fri, 24 Apr 2020 16:51:50 +0200 Subject: [PATCH 517/530] Fixed whitespace formatting. --- libraries-data-2/pom.xml | 77 +++++++++---------- .../main/java/com/baeldung/r/FastRMean.java | 33 ++++---- .../main/java/com/baeldung/r/RCallerMean.java | 37 ++++----- .../src/main/java/com/baeldung/r/RUtils.java | 27 ++++--- .../main/java/com/baeldung/r/RenjinMean.java | 34 ++++---- .../main/java/com/baeldung/r/RserveMean.java | 29 +++---- .../com/baeldung/r/FastRMeanUnitTest.java | 26 +++---- .../r/RCallerMeanIntegrationTest.java | 32 ++++---- .../com/baeldung/r/RenjinMeanUnitTest.java | 34 ++++---- .../baeldung/r/RserveMeanIntegrationTest.java | 32 ++++---- 10 files changed, 184 insertions(+), 177 deletions(-) diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index 0dadcbd8d4..73c5452f77 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -128,24 +128,21 @@ ${awaitility.version} test
    - - - org.rosuda.REngine - Rserve - ${rserve.version} - - - - com.github.jbytecode - RCaller - ${rcaller.version} - - - - org.renjin - renjin-script-engine - ${renjin.version} - + + org.rosuda.REngine + Rserve + ${rserve.version} + + + com.github.jbytecode + RCaller + ${rcaller.version} + + + org.renjin + renjin-script-engine + ${renjin.version} +
    @@ -157,11 +154,11 @@ - - bedatadriven - bedatadriven public repo - https://nexus.bedatadriven.com/content/groups/public/ - + + bedatadriven + bedatadriven public repo + https://nexus.bedatadriven.com/content/groups/public/ + @@ -183,22 +180,22 @@ 1.8.1 - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - com/baeldung/r/FastRMean.java - - - com/baeldung/r/FastRMeanUnitTest.java - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + com/baeldung/r/FastRMean.java + + + com/baeldung/r/FastRMeanUnitTest.java + + + + + \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java b/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java index 52fb2d1506..8348bfa403 100644 --- a/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java +++ b/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java @@ -10,19 +10,24 @@ import java.net.URISyntaxException; */ public class FastRMean { - /** - * Invokes the customMean R function passing the given values as arguments. - * - * @param values the input to the mean script - * @return the result of the R script - */ - public double mean(int[] values) { - Context polyglot = Context.newBuilder().allowAllAccess(true).build(); - String meanScriptContent = RUtils.getMeanScriptContent(); - polyglot.eval("R", meanScriptContent); - Value rBindings = polyglot.getBindings("R"); - Value rInput = rBindings.getMember("c").execute(values); - return rBindings.getMember("customMean").execute(rInput).asDouble(); - } + /** + * Invokes the customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + */ + public double mean(int[] values) { + Context polyglot = Context.newBuilder() + .allowAllAccess(true) + .build(); + String meanScriptContent = RUtils.getMeanScriptContent(); + polyglot.eval("R", meanScriptContent); + Value rBindings = polyglot.getBindings("R"); + Value rInput = rBindings.getMember("c") + .execute(values); + return rBindings.getMember("customMean") + .execute(rInput) + .asDouble(); + } } \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java b/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java index 53e0ab9e31..99edb8c043 100644 --- a/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java +++ b/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java @@ -14,23 +14,24 @@ import com.github.rcaller.rstuff.RCode; */ public class RCallerMean { - /** - * Invokes the customMean R function passing the given values as arguments. - * - * @param values the input to the mean script - * @return the result of the R script - * @throws IOException if any error occurs - * @throws URISyntaxException if any error occurs - */ - public double mean(int[] values) throws IOException, URISyntaxException { - String fileContent = RUtils.getMeanScriptContent(); - RCode code = RCode.create(); - code.addRCode(fileContent); - code.addIntArray("input", values); - code.addRCode("result <- customMean(input)"); - RCaller caller = RCaller.create(code, RCallerOptions.create()); - caller.runAndReturnResult("result"); - return caller.getParser().getAsDoubleArray("result")[0]; - } + /** + * Invokes the customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + * @throws IOException if any error occurs + * @throws URISyntaxException if any error occurs + */ + public double mean(int[] values) throws IOException, URISyntaxException { + String fileContent = RUtils.getMeanScriptContent(); + RCode code = RCode.create(); + code.addRCode(fileContent); + code.addIntArray("input", values); + code.addRCode("result <- customMean(input)"); + RCaller caller = RCaller.create(code, RCallerOptions.create()); + caller.runAndReturnResult("result"); + return caller.getParser() + .getAsDoubleArray("result")[0]; + } } \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java b/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java index ad16fd5602..a9393cdcc2 100644 --- a/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java +++ b/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java @@ -15,16 +15,19 @@ import java.util.stream.Collectors; */ public class RUtils { - /** - * Loads the script.R and returns its content as a string. - * - * @return the script.R content as a string - * @throws IOException if any error occurs - * @throws URISyntaxException if any error occurs - */ - static String getMeanScriptContent() throws IOException, URISyntaxException { - URI rScriptUri = RUtils.class.getClassLoader().getResource("script.R").toURI(); - Path inputScript = Paths.get(rScriptUri); - return Files.lines(inputScript).collect(Collectors.joining()); - } + /** + * Loads the script.R and returns its content as a string. + * + * @return the script.R content as a string + * @throws IOException if any error occurs + * @throws URISyntaxException if any error occurs + */ + static String getMeanScriptContent() throws IOException, URISyntaxException { + URI rScriptUri = RUtils.class.getClassLoader() + .getResource("script.R") + .toURI(); + Path inputScript = Paths.get(rScriptUri); + return Files.lines(inputScript) + .collect(Collectors.joining()); + } } \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java b/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java index befb7d522f..4576ec5fb4 100644 --- a/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java +++ b/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java @@ -15,22 +15,22 @@ import org.renjin.sexp.DoubleArrayVector; */ public class RenjinMean { - /** - * Invokes the customMean R function passing the given values as arguments. - * - * @param values the input to the mean script - * @return the result of the R script - * @throws IOException if any error occurs - * @throws URISyntaxException if any error occurs - * @throws ScriptException if any error occurs - */ - public double mean(int[] values) throws IOException, URISyntaxException, ScriptException { - RenjinScriptEngine engine = new RenjinScriptEngine(); - String meanScriptContent = RUtils.getMeanScriptContent(); - engine.put("input", values); - engine.eval(meanScriptContent); - DoubleArrayVector result = (DoubleArrayVector) engine.eval("customMean(input)"); - return result.asReal(); - } + /** + * Invokes the customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + * @throws IOException if any error occurs + * @throws URISyntaxException if any error occurs + * @throws ScriptException if any error occurs + */ + public double mean(int[] values) throws IOException, URISyntaxException, ScriptException { + RenjinScriptEngine engine = new RenjinScriptEngine(); + String meanScriptContent = RUtils.getMeanScriptContent(); + engine.put("input", values); + engine.eval(meanScriptContent); + DoubleArrayVector result = (DoubleArrayVector) engine.eval("customMean(input)"); + return result.asReal(); + } } \ No newline at end of file diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java b/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java index 51aaa90648..1aaa7fa847 100644 --- a/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java +++ b/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java @@ -11,19 +11,20 @@ import org.rosuda.REngine.Rserve.RConnection; */ public class RserveMean { - /** - * Connects to the Rserve istance listening on 127.0.0.1:6311 and invokes the - * customMean R function passing the given values as arguments. - * - * @param values the input to the mean script - * @return the result of the R script - * @throws REngineException if any error occurs - * @throws REXPMismatchException if any error occurs - */ - public double mean(int[] values) throws REngineException, REXPMismatchException { - RConnection c = new RConnection(); - c.assign("input", values); - return c.eval("customMean(input)").asDouble(); - } + /** + * Connects to the Rserve istance listening on 127.0.0.1:6311 and invokes the + * customMean R function passing the given values as arguments. + * + * @param values the input to the mean script + * @return the result of the R script + * @throws REngineException if any error occurs + * @throws REXPMismatchException if any error occurs + */ + public double mean(int[] values) throws REngineException, REXPMismatchException { + RConnection c = new RConnection(); + c.assign("input", values); + return c.eval("customMean(input)") + .asDouble(); + } } \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java b/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java index 5cf8c63a56..4e7426b75a 100644 --- a/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java +++ b/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java @@ -12,18 +12,18 @@ import org.junit.Test; @Ignore public class FastRMeanUnitTest { - /** - * Object to test. - */ - private FastRMean fastrMean = new FastRMean(); + /** + * Object to test. + */ + private FastRMean fastrMean = new FastRMean(); - /** - * Test for {@link FastRMeanUnitTest#mean(int[])}. - */ - @Test - public void givenValues_whenMean_thenCorrect() { - int[] input = { 1, 2, 3, 4, 5 }; - double result = fastrMean.mean(input); - Assert.assertEquals(3.0, result, 0.000001); - } + /** + * Test for {@link FastRMeanUnitTest#mean(int[])}. + */ + @Test + public void givenValues_whenMean_thenCorrect() { + int[] input = { 1, 2, 3, 4, 5 }; + double result = fastrMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } } \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java b/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java index b68f259edd..ce6b3a4332 100644 --- a/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java +++ b/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java @@ -17,21 +17,21 @@ import org.junit.Test; @Ignore public class RCallerMeanIntegrationTest { - /** - * Object to test. - */ - private RCallerMean rcallerMean = new RCallerMean(); + /** + * Object to test. + */ + private RCallerMean rcallerMean = new RCallerMean(); - /** - * Test for {@link RCallerMeanIntegrationTest#mean(int[])}. - * - * @throws ScriptException if an error occurs - * @throws URISyntaxException if an error occurs - */ - @Test - public void givenValues_whenMean_thenCorrect() throws IOException, URISyntaxException { - int[] input = { 1, 2, 3, 4, 5 }; - double result = rcallerMean.mean(input); - Assert.assertEquals(3.0, result, 0.000001); - } + /** + * Test for {@link RCallerMeanIntegrationTest#mean(int[])}. + * + * @throws ScriptException if an error occurs + * @throws URISyntaxException if an error occurs + */ + @Test + public void givenValues_whenMean_thenCorrect() throws IOException, URISyntaxException { + int[] input = { 1, 2, 3, 4, 5 }; + double result = rcallerMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } } \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java b/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java index e364d54632..f52d37d614 100644 --- a/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java +++ b/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java @@ -16,22 +16,22 @@ import org.junit.Assert; */ public class RenjinMeanUnitTest { - /** - * Object to test. - */ - private RenjinMean renjinMean = new RenjinMean(); + /** + * Object to test. + */ + private RenjinMean renjinMean = new RenjinMean(); - /** - * Test for {@link RenjinMeanUnitTest#mean(int[])}. - * - * @throws ScriptException if an error occurs - * @throws URISyntaxException if an error occurs - * @throws IOException if an error occurs - */ - @Test - public void givenValues_whenMean_thenCorrect() throws IOException, URISyntaxException, ScriptException { - int[] input = { 1, 2, 3, 4, 5 }; - double result = renjinMean.mean(input); - Assert.assertEquals(3.0, result, 0.000001); - } + /** + * Test for {@link RenjinMeanUnitTest#mean(int[])}. + * + * @throws ScriptException if an error occurs + * @throws URISyntaxException if an error occurs + * @throws IOException if an error occurs + */ + @Test + public void givenValues_whenMean_thenCorrect() throws IOException, URISyntaxException, ScriptException { + int[] input = { 1, 2, 3, 4, 5 }; + double result = renjinMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } } \ No newline at end of file diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java b/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java index 95b344cb02..23d42bd8e9 100644 --- a/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java +++ b/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java @@ -14,21 +14,21 @@ import org.rosuda.REngine.REngineException; @Ignore public class RserveMeanIntegrationTest { - /** - * Object to test. - */ - private RserveMean rserveMean = new RserveMean(); + /** + * Object to test. + */ + private RserveMean rserveMean = new RserveMean(); - /** - * Test for {@link RserveMeanIntegrationTest#mean(int[])}. - * - * @throws REXPMismatchException if an error occurs - * @throws REngineException if an error occurs - */ - @Test - public void givenValues_whenMean_thenCorrect() throws REngineException, REXPMismatchException { - int[] input = { 1, 2, 3, 4, 5 }; - double result = rserveMean.mean(input); - Assert.assertEquals(3.0, result, 0.000001); - } + /** + * Test for {@link RserveMeanIntegrationTest#mean(int[])}. + * + * @throws REXPMismatchException if an error occurs + * @throws REngineException if an error occurs + */ + @Test + public void givenValues_whenMean_thenCorrect() throws REngineException, REXPMismatchException { + int[] input = { 1, 2, 3, 4, 5 }; + double result = rserveMean.mean(input); + Assert.assertEquals(3.0, result, 0.000001); + } } \ No newline at end of file From 73f96969da098b873415b475f3ad1463dc4f45cd Mon Sep 17 00:00:00 2001 From: Paturi Radhe Sravan Date: Sat, 25 Apr 2020 03:06:41 +0530 Subject: [PATCH 518/530] BAEL-3567 An Introduction to Kaniko (#9150) * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3567 An Introduction to Kaniko * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3597 Cactoos * BAEL-3567 An Introduction to Kaniko * BAEL-3567 An Introduction to Kaniko --- kaniko/dockerfile | 2 ++ kaniko/pod.yaml | 19 +++++++++++++++++++ kaniko/volume-claim.yaml | 11 +++++++++++ kaniko/volume.yaml | 14 ++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 kaniko/dockerfile create mode 100644 kaniko/pod.yaml create mode 100644 kaniko/volume-claim.yaml create mode 100644 kaniko/volume.yaml diff --git a/kaniko/dockerfile b/kaniko/dockerfile new file mode 100644 index 0000000000..0290bf16ed --- /dev/null +++ b/kaniko/dockerfile @@ -0,0 +1,2 @@ +FROM ubuntu +ENTRYPOINT ["/bin/bash", "-c", "echo hello"] diff --git a/kaniko/pod.yaml b/kaniko/pod.yaml new file mode 100644 index 0000000000..17f9a81b6d --- /dev/null +++ b/kaniko/pod.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Pod +metadata: + name: kaniko +spec: + containers: + - name: kaniko + image: gcr.io/kaniko-project/executor:latest + args: ["--dockerfile=/workspace/dockerfile", + "--context=dir://workspace", + "--no-push"] + volumeMounts: + - name: dockerfile-storage + mountPath: /workspace + restartPolicy: Never + volumes: + - name: dockerfile-storage + persistentVolumeClaim: + claimName: dockerfile-claim diff --git a/kaniko/volume-claim.yaml b/kaniko/volume-claim.yaml new file mode 100644 index 0000000000..7a1abbf05c --- /dev/null +++ b/kaniko/volume-claim.yaml @@ -0,0 +1,11 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: dockerfile-claim +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi + storageClassName: local-storage diff --git a/kaniko/volume.yaml b/kaniko/volume.yaml new file mode 100644 index 0000000000..e44663ec5a --- /dev/null +++ b/kaniko/volume.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: dockerfile + labels: + type: local +spec: + capacity: + storage: 10Gi + accessModes: + - ReadWriteOnce + storageClassName: local-storage + hostPath: + path: /home/docker/kaniko # Path to the local mount directory that was setup From d090c9b059c5e3d2752a6d7422fe344cca8b1dd5 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Fri, 24 Apr 2020 22:28:04 -0500 Subject: [PATCH 519/530] BAEL-2893 BAEL-3927 update README files (#9171) * BAEL-3336 BAEL-3058 add links * BAEL-3319: add link * BAEL-3284: add link * BAEL-3198: add link to article * BAEL-3479: add link to article * BAEL-3485: add article link * SCALA-38: move to new package and add link back to article * SCALA-38: add imports back into unit test * BAEL-3908: add link back to article * BAEL-2893 BAEL-3927 add link back to article --- core-java-modules/core-java-string-operations-2/README.md | 1 + testing-modules/mockito-2/README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md index 45b02a3e10..2f54aa9467 100644 --- a/core-java-modules/core-java-string-operations-2/README.md +++ b/core-java-modules/core-java-string-operations-2/README.md @@ -11,4 +11,5 @@ This module contains articles about string operations. - [Case-Insensitive String Matching in Java](https://www.baeldung.com/java-case-insensitive-string-matching) - [L-Trim and R-Trim Alternatives in Java](https://www.baeldung.com/java-trim-alternatives) - [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) +- [Encode a String to UTF-8 in Java](https://www.baeldung.com/java-string-encode-utf-8) - More articles: [[<-- prev]](../core-java-string-operations) diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index 064366dfd5..6c9ddee01d 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -4,3 +4,4 @@ - [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) - [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) - [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis) +- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value) From 89fd7872c476c05a1a362f502910f31b59c4a916 Mon Sep 17 00:00:00 2001 From: sasam0320 <63002713+sasam0320@users.noreply.github.com> Date: Sat, 25 Apr 2020 07:32:20 +0200 Subject: [PATCH 520/530] BAEL-3973 (#9061) --- gradle/gradle-employee-app/.gitignore | 3 ++ gradle/gradle-employee-app/build.gradle | 38 +++++++++++++++++++ .../src/main/java/employee/Employee.java | 9 +++++ .../src/main/java/employee/EmployeeApp.java | 16 ++++++++ .../test/java/employee/EmployeeAppTest.java | 31 +++++++++++++++ gradle/settings.gradle | 2 +- 6 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 gradle/gradle-employee-app/.gitignore create mode 100644 gradle/gradle-employee-app/build.gradle create mode 100644 gradle/gradle-employee-app/src/main/java/employee/Employee.java create mode 100644 gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java create mode 100644 gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java diff --git a/gradle/gradle-employee-app/.gitignore b/gradle/gradle-employee-app/.gitignore new file mode 100644 index 0000000000..d347f664af --- /dev/null +++ b/gradle/gradle-employee-app/.gitignore @@ -0,0 +1,3 @@ +/.idea +/.gradle +/build diff --git a/gradle/gradle-employee-app/build.gradle b/gradle/gradle-employee-app/build.gradle new file mode 100644 index 0000000000..19b80c0c4a --- /dev/null +++ b/gradle/gradle-employee-app/build.gradle @@ -0,0 +1,38 @@ + +plugins { + id 'java-library' + id 'application' +} + +apply plugin: 'application' +mainClassName = 'employee.EmployeeApp' + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +println 'This is executed during configuration phase' + +task configured { + println 'The project is configured' +} + +task wrapper(type: Wrapper){ + gradleVersion = '5.3.1' +} + +repositories { + jcenter() +} + +dependencies { + + compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10' + testImplementation('junit:junit:4.13') + testRuntime('junit:junit:4.13') +} +test { + useJUnit() +} + diff --git a/gradle/gradle-employee-app/src/main/java/employee/Employee.java b/gradle/gradle-employee-app/src/main/java/employee/Employee.java new file mode 100644 index 0000000000..6940c8c28c --- /dev/null +++ b/gradle/gradle-employee-app/src/main/java/employee/Employee.java @@ -0,0 +1,9 @@ +package employee; + +public class Employee { + + String name; + String emailAddress; + int yearOfBirth; + +} \ No newline at end of file diff --git a/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java b/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java new file mode 100644 index 0000000000..48ef9f5d61 --- /dev/null +++ b/gradle/gradle-employee-app/src/main/java/employee/EmployeeApp.java @@ -0,0 +1,16 @@ +package employee; + +public class EmployeeApp { + + public static void main(String[] args){ + + Employee employee = new Employee(); + employee.name = "John"; + employee.emailAddress = "john@baeldung.com"; + employee.yearOfBirth = 1978; + System.out.println("Name: " + employee.name); + System.out.println("Email Address: " + employee.emailAddress); + System.out.println("Year Of Birth:" + employee.yearOfBirth); + } + +} diff --git a/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java b/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java new file mode 100644 index 0000000000..013bcc35b6 --- /dev/null +++ b/gradle/gradle-employee-app/src/test/java/employee/EmployeeAppTest.java @@ -0,0 +1,31 @@ +package employee; + +import employee.Employee; +import org.junit.*; +import static org.junit.Assert.*; + +public class EmployeeAppTest { + + @Test + public void testData(){ + + Employee testEmp = this.getEmployeeTest(); + + assertEquals(testEmp.name, "John"); + assertEquals(testEmp.emailAddress, "john@baeldung.com"); + assertEquals(testEmp.yearOfBirth, 1978); + + + } + + private Employee getEmployeeTest(){ + + Employee employee = new Employee(); + employee.name = "John"; + employee.emailAddress = "john@baeldung.com"; + employee.yearOfBirth = 1978; + + return employee; + } + +} \ No newline at end of file diff --git a/gradle/settings.gradle b/gradle/settings.gradle index f1d64de58a..59300f9281 100644 --- a/gradle/settings.gradle +++ b/gradle/settings.gradle @@ -1,10 +1,10 @@ rootProject.name = 'gradletutorial' - include 'greeting-library' include 'greeting-library-java' include 'greeter' include 'gradletaskdemo' include 'junit5' +include 'gradle-employee-app' println 'This will be executed during the initialization phase.' From fab18f2126b26d0dbe8f0e492e4d075f5a49bd57 Mon Sep 17 00:00:00 2001 From: sampadawagde Date: Sat, 25 Apr 2020 18:12:08 +0530 Subject: [PATCH 521/530] JAVA-926: Migrate spring-boot-custom-starter to parent-boot-2 --- .../test/java/{org => com}/baeldung/SpringContextTest.java | 0 .../greeter-spring-boot-sample-app/pom.xml | 4 ++-- .../test/java/{org => com}/baeldung/SpringContextTest.java | 0 .../spring-boot-custom-starter/greeter/pom.xml | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) rename spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/{org => com}/baeldung/SpringContextTest.java (100%) rename spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/{org => com}/baeldung/SpringContextTest.java (100%) diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/org/baeldung/SpringContextTest.java rename to spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml index 818ce5c107..8d328b88be 100644 --- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml +++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../../parent-boot-1 + ../../../parent-boot-2 diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/org/baeldung/SpringContextTest.java rename to spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml index 89119e2e99..47296990aa 100644 --- a/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml +++ b/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../../../parent-boot-1 + ../../../parent-boot-2 \ No newline at end of file From b7588a7a3335ade294b463b98c6775269701a885 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Sat, 25 Apr 2020 22:14:35 +0530 Subject: [PATCH 522/530] BAEL-3989: Calling a SOAP web service from Spring (#9174) --- spring-soap/pom.xml | 22 +++ .../springsoap/client/CountryClient.java | 26 ++++ .../client/CountryClientConfig.java | 25 +++ .../springsoap/client/gen/Country.java | 146 ++++++++++++++++++ .../springsoap/client/gen/Currency.java | 47 ++++++ .../client/gen/GetCountryRequest.java | 71 +++++++++ .../client/gen/GetCountryResponse.java | 71 +++++++++ .../springsoap/client/gen/ObjectFactory.java | 63 ++++++++ .../springsoap/client/gen/package-info.java | 9 ++ spring-soap/src/main/resources/countries.wsdl | 74 +++++++++ .../client/CountryClientLiveTest.java | 36 +++++ 11 files changed, 590 insertions(+) create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java create mode 100644 spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java create mode 100644 spring-soap/src/main/resources/countries.wsdl create mode 100644 spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml index 9403b70636..d0987329c0 100644 --- a/spring-soap/pom.xml +++ b/spring-soap/pom.xml @@ -58,6 +58,28 @@ + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + 0.14.0 + + + + generate + + + + + WSDL + ${project.basedir}/src/main/java + com.baeldung.springsoap.client.gen + ${project.basedir}/src/main/resources + + countries.wsdl + + + diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java new file mode 100644 index 0000000000..e0b9172ece --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClient.java @@ -0,0 +1,26 @@ +package com.baeldung.springsoap.client; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.ws.client.core.support.WebServiceGatewaySupport; + +import com.baeldung.springsoap.client.gen.GetCountryRequest; +import com.baeldung.springsoap.client.gen.GetCountryResponse; + +public class CountryClient extends WebServiceGatewaySupport { + + private static final Logger logger = LoggerFactory.getLogger(CountryClient.class); + + public GetCountryResponse getCountry(String country) { + + GetCountryRequest request = new GetCountryRequest(); + request.setName(country); + + logger.info("Requesting information for " + country); + + GetCountryResponse response = (GetCountryResponse) getWebServiceTemplate().marshalSendAndReceive(request); + + return response; + } + +} \ No newline at end of file diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java new file mode 100644 index 0000000000..8dabdbc00d --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/CountryClientConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.springsoap.client; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; + +@Configuration +public class CountryClientConfig { + + @Bean + public Jaxb2Marshaller marshaller() { + Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); + marshaller.setContextPath("com.baeldung.springsoap.client.gen"); + return marshaller; + } + + @Bean + public CountryClient countryClient(Jaxb2Marshaller marshaller) { + CountryClient client = new CountryClient(); + client.setDefaultUri("http://localhost:8080/ws"); + client.setMarshaller(marshaller); + client.setUnmarshaller(marshaller); + return client; + } +} \ No newline at end of file diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java new file mode 100644 index 0000000000..e17dce55f9 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Country.java @@ -0,0 +1,146 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

    Java class for country complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType name="country">
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
    + *         <element name="population" type="{http://www.w3.org/2001/XMLSchema}int"/>
    + *         <element name="capital" type="{http://www.w3.org/2001/XMLSchema}string"/>
    + *         <element name="currency" type="{http://www.baeldung.com/springsoap/gen}currency"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "country", propOrder = { + "name", + "population", + "capital", + "currency" +}) +public class Country { + + @XmlElement(required = true) + protected String name; + protected int population; + @XmlElement(required = true) + protected String capital; + @XmlElement(required = true) + @XmlSchemaType(name = "string") + protected Currency currency; + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the population property. + * + */ + public int getPopulation() { + return population; + } + + /** + * Sets the value of the population property. + * + */ + public void setPopulation(int value) { + this.population = value; + } + + /** + * Gets the value of the capital property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCapital() { + return capital; + } + + /** + * Sets the value of the capital property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCapital(String value) { + this.capital = value; + } + + /** + * Gets the value of the currency property. + * + * @return + * possible object is + * {@link Currency } + * + */ + public Currency getCurrency() { + return currency; + } + + /** + * Sets the value of the currency property. + * + * @param value + * allowed object is + * {@link Currency } + * + */ + public void setCurrency(Currency value) { + this.currency = value; + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java new file mode 100644 index 0000000000..12fdef58c2 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/Currency.java @@ -0,0 +1,47 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + + +/** + *

    Java class for currency. + * + *

    The following schema fragment specifies the expected content contained within this class. + *

    + *

    + * <simpleType name="currency">
    + *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
    + *     <enumeration value="GBP"/>
    + *     <enumeration value="EUR"/>
    + *     <enumeration value="PLN"/>
    + *   </restriction>
    + * </simpleType>
    + * 
    + * + */ +@XmlType(name = "currency") +@XmlEnum +public enum Currency { + + GBP, + EUR, + PLN; + + public String value() { + return name(); + } + + public static Currency fromValue(String v) { + return valueOf(v); + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java new file mode 100644 index 0000000000..5739ee3b96 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryRequest.java @@ -0,0 +1,71 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

    Java class for anonymous complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType>
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "name" +}) +@XmlRootElement(name = "getCountryRequest") +public class GetCountryRequest { + + @XmlElement(required = true) + protected String name; + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java new file mode 100644 index 0000000000..ba1ab56cf8 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/GetCountryResponse.java @@ -0,0 +1,71 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

    Java class for anonymous complex type. + * + *

    The following schema fragment specifies the expected content contained within this class. + * + *

    + * <complexType>
    + *   <complexContent>
    + *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    + *       <sequence>
    + *         <element name="country" type="{http://www.baeldung.com/springsoap/gen}country"/>
    + *       </sequence>
    + *     </restriction>
    + *   </complexContent>
    + * </complexType>
    + * 
    + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "country" +}) +@XmlRootElement(name = "getCountryResponse") +public class GetCountryResponse { + + @XmlElement(required = true) + protected Country country; + + /** + * Gets the value of the country property. + * + * @return + * possible object is + * {@link Country } + * + */ + public Country getCountry() { + return country; + } + + /** + * Sets the value of the country property. + * + * @param value + * allowed object is + * {@link Country } + * + */ + public void setCountry(Country value) { + this.country = value; + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java new file mode 100644 index 0000000000..88b27245be --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/ObjectFactory.java @@ -0,0 +1,63 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + + +package com.baeldung.springsoap.client.gen; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the com.baeldung.springsoap.client.gen package. + *

    An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.springsoap.client.gen + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link GetCountryRequest } + * + */ + public GetCountryRequest createGetCountryRequest() { + return new GetCountryRequest(); + } + + /** + * Create an instance of {@link GetCountryResponse } + * + */ + public GetCountryResponse createGetCountryResponse() { + return new GetCountryResponse(); + } + + /** + * Create an instance of {@link Country } + * + */ + public Country createCountry() { + return new Country(); + } + +} diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java new file mode 100644 index 0000000000..eefed169a8 --- /dev/null +++ b/spring-soap/src/main/java/com/baeldung/springsoap/client/gen/package-info.java @@ -0,0 +1,9 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.3.0 +// See https://javaee.github.io/jaxb-v2/ +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2020.04.25 at 03:18:49 PM IST +// + +@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.baeldung.com/springsoap/gen", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +package com.baeldung.springsoap.client.gen; diff --git a/spring-soap/src/main/resources/countries.wsdl b/spring-soap/src/main/resources/countries.wsdl new file mode 100644 index 0000000000..2a2eaf05bb --- /dev/null +++ b/spring-soap/src/main/resources/countries.wsdl @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java b/spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java new file mode 100644 index 0000000000..63dbe2a5cf --- /dev/null +++ b/spring-soap/src/test/java/com/baeldung/springsoap/client/CountryClientLiveTest.java @@ -0,0 +1,36 @@ +package com.baeldung.springsoap.client; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +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.springsoap.client.gen.Currency; +import com.baeldung.springsoap.client.gen.GetCountryResponse; + +//Ensure that the server - com.baeldung.springsoap.Application - is running before executing this test +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class) +public class CountryClientLiveTest { + + @Autowired + CountryClient client; + + @Test + public void givenCountryService_whenCountryPoland_thenCapitalIsWarsaw() { + GetCountryResponse response = client.getCountry("Poland"); + assertEquals("Warsaw", response.getCountry() + .getCapital()); + } + + @Test + public void givenCountryService_whenCountrySpain_thenCurrencyEUR() { + GetCountryResponse response = client.getCountry("Spain"); + assertEquals(Currency.EUR, response.getCountry() + .getCurrency()); + } +} From bd9c4945f7c1e96a64c944414f23b055f8e49482 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Sat, 25 Apr 2020 11:37:01 -0600 Subject: [PATCH 523/530] BAEL-3972: Fix formatting --- .../com/baeldung/app/controller/TaskController.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java index 95f855c1e5..67072b5d61 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java @@ -48,8 +48,7 @@ public class TaskController { */ @GetMapping("/manager") @PreAuthorize("hasRole('ROLE_MANAGER')") - public ResponseEntity> getAlManagerTasks() - { + public ResponseEntity> getAlManagerTasks() { Iterable tasks = taskService.findAll(); return ResponseEntity.ok().body(tasks); @@ -59,8 +58,7 @@ public class TaskController { * Example of restricting specific endpoints to specific roles using SecurityContext. */ @GetMapping("/actuator") - public ResponseEntity> getAlActuatorTasks() - { + public ResponseEntity> getAlActuatorTasks() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ACTUATOR"))) { @@ -76,8 +74,7 @@ public class TaskController { * Example of restricting specific endpoints to specific roles using UserDetailsService. */ @GetMapping("/admin") - public ResponseEntity> getAlAdminTasks() - { + public ResponseEntity> getAlAdminTasks() { if(userDetailsService != null) { UserDetails details = userDetailsService.loadUserByUsername("pam"); if (details != null && details.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) { @@ -94,8 +91,7 @@ public class TaskController { * Example of restricting specific endpoints to specific roles using HttpServletRequest. */ @GetMapping("/admin2") - public ResponseEntity> getAlAdminTasksUsingServlet(HttpServletRequest request) - { + public ResponseEntity> getAlAdminTasksUsingServlet(HttpServletRequest request) { if (!request.isUserInRole("ROLE_ADMIN")) { return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); } From fd5fcf29c55e234cb26262edf42b2c55ea55e7ef Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Sat, 25 Apr 2020 16:05:50 -0400 Subject: [PATCH 524/530] BAEL-3965: Removed unneeded dependencies --- spring-core-4/pom.xml | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml index 06598fb41e..53f7ca6912 100644 --- a/spring-core-4/pom.xml +++ b/spring-core-4/pom.xml @@ -14,26 +14,6 @@ - - org.springframework - spring-beans - ${spring.version} - - - org.springframework - spring-tx - ${spring.version} - - - org.springframework - spring-jdbc - ${spring.version} - - - org.springframework.boot - spring-boot-starter-web - ${spring.boot.version} - org.springframework spring-context @@ -44,11 +24,6 @@ spring-core ${spring.version} - - javax.annotation - javax.annotation-api - ${annotation-api.version} - org.springframework spring-test From ee898632d354bfeb972ba3a01217910834517535 Mon Sep 17 00:00:00 2001 From: Aaron Juarez Date: Sat, 25 Apr 2020 16:23:13 -0400 Subject: [PATCH 525/530] BAEL-3966: find object's class in Java (#9118) --- .../com/baeldung/objectclass/Borrower.java | 23 ++++++ .../java/com/baeldung/objectclass/Lender.java | 20 +++++ .../java/com/baeldung/objectclass/User.java | 12 +++ .../objectclass/CreditAppUnitTest.java | 74 +++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java new file mode 100644 index 0000000000..62062aa7fc --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Borrower.java @@ -0,0 +1,23 @@ +package com.baeldung.objectclass; + +import lombok.Data; + +@Data +public class Borrower extends User { + + private double totalLoanAmount; + + public double requestLoan(double amount) { + totalLoanAmount = amount; + return totalLoanAmount; + } + + public double increaseLoan(double increaseBy) { + return totalLoanAmount + increaseBy; + } + + public double payLoan(double amount) { + return totalLoanAmount - amount; + } + +} diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java new file mode 100644 index 0000000000..b45272cbb1 --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/Lender.java @@ -0,0 +1,20 @@ +package com.baeldung.objectclass; + +public class Lender extends User { + + private double totalInvestmentAmount; + + public double invest(double amount) { + totalInvestmentAmount = amount; + return totalInvestmentAmount; + } + + public double increaseInvestment(double increaseBy) { + return totalInvestmentAmount + increaseBy; + } + + public double collectDividends() { + return totalInvestmentAmount * 0.07; + } + +} diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java new file mode 100644 index 0000000000..b1f3887f2f --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/objectclass/User.java @@ -0,0 +1,12 @@ +package com.baeldung.objectclass; + +import lombok.Data; + +@Data +public class User { + + private String firstName; + private String lastName; + + +} diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java new file mode 100644 index 0000000000..8330ddbac5 --- /dev/null +++ b/core-java-modules/core-java/src/test/java/com/baeldung/objectclass/CreditAppUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.objectclass; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Test; + +public class CreditAppUnitTest { + + @Test + public void givenLender_whenInstanceOf_thenReturnTrue() { + User lender = new Lender(); + assertTrue(lender instanceof Lender); + assertTrue(lender instanceof User); + } + + @Test + public void givenUser_whenInstanceOfLender_thenDowncast() { + User user = new Lender(); + Lender lender = null; + + if(user instanceof Lender) { + lender = (Lender) user; + } + + assertNotNull(lender); + } + + @Test + public void givenUser_whenIsInstanceOfLender_thenDowncast() { + User user = new Lender(); + Lender lender = null; + + if(Lender.class.isInstance(user)) { + lender = (Lender) user; + } + + assertNotNull(lender); + } + + @Test + public void givenBorrower_whenLoanAmountIsDouble_thenRequestLoan() { + Borrower borrower = new Borrower(); + double amount = 100.0; + + //if(amount instanceof Double) // Compilation error, no autoboxing + if(Double.class.isInstance(amount)) { + borrower.requestLoan(amount); + } + assertEquals(100, borrower.getTotalLoanAmount()); + } + + @Test + public void givenBorrower_whenLoanAmountIsNotString_thenRequestLoan() { + Borrower borrower = new Borrower(); + Double amount = 100.0; + + //if(amount instanceof String) // Compilation error, incompatible operands + if(!String.class.isInstance(amount)) { + borrower.requestLoan(amount); + } + assertEquals(100, borrower.getTotalLoanAmount()); + } + + @Test + public void givenLender_whenGetClass_thenEqualsLenderType() { + User lender = new Lender(); + assertEquals(Lender.class, lender.getClass()); + assertNotEquals(User.class, lender.getClass()); + } + +} From b8d41e5613457b185324cc39630816d83ac1cf4f Mon Sep 17 00:00:00 2001 From: Vikas Rajput Date: Sun, 26 Apr 2020 11:51:21 +0530 Subject: [PATCH 526/530] Bael 3557 : renamed package name to more unique name - springwithgroovy (#9172) * BAEL-3557: Completed a simple web application in spring boot and groovy * BAEL-3557: renamed packagename from com.baeldung.app to more unique name - com.baeldung.springwithgroovy Co-authored-by: Vikas Ramsingh Rajput --- .../SpringBootGroovyApplication.groovy | 13 +++ .../controller/TodoController.groovy | 48 +++++++++ .../springwithgroovy/entity/Todo.groovy | 23 +++++ .../repository/TodoRepository.groovy | 9 ++ .../service/TodoService.groovy | 16 +++ .../service/impl/TodoServiceImpl.groovy | 40 ++++++++ .../springwithgroovy/TodoAppUnitTest.groovy | 97 +++++++++++++++++++ 7 files changed, 246 insertions(+) create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/SpringBootGroovyApplication.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/controller/TodoController.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/repository/TodoRepository.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/TodoService.groovy create mode 100644 spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/impl/TodoServiceImpl.groovy create mode 100644 spring-boot-groovy/src/test/groovy/com/baeldung/springwithgroovy/TodoAppUnitTest.groovy diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/SpringBootGroovyApplication.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/SpringBootGroovyApplication.groovy new file mode 100644 index 0000000000..4912b75a66 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/SpringBootGroovyApplication.groovy @@ -0,0 +1,13 @@ +package com.baeldung.springwithgroovy + +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication + +import com.baeldung.springwithgroovy.SpringBootGroovyApplication + +@SpringBootApplication +class SpringBootGroovyApplication { + static void main(String[] args) { + SpringApplication.run SpringBootGroovyApplication, args + } +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/controller/TodoController.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/controller/TodoController.groovy new file mode 100644 index 0000000000..9c6aee20d3 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/controller/TodoController.groovy @@ -0,0 +1,48 @@ +package com.baeldung.springwithgroovy.controller + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RestController + +import com.baeldung.springwithgroovy.entity.Todo +import com.baeldung.springwithgroovy.service.TodoService + +@RestController +@RequestMapping('todo') +public class TodoController { + + @Autowired + TodoService todoService + + @GetMapping + List getAllTodoList(){ + todoService.findAll() + } + + @PostMapping + Todo saveTodo(@RequestBody Todo todo){ + todoService.saveTodo todo + } + + @PutMapping + Todo updateTodo(@RequestBody Todo todo){ + todoService.updateTodo todo + } + + @DeleteMapping('/{todoId}') + deleteTodo(@PathVariable Integer todoId){ + todoService.deleteTodo todoId + } + + @GetMapping('/{todoId}') + Todo getTodoById(@PathVariable Integer todoId){ + todoService.findById todoId + } +} \ No newline at end of file diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy new file mode 100644 index 0000000000..000d981701 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy @@ -0,0 +1,23 @@ +package com.baeldung.springwithgroovy.entity + +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.GeneratedValue +import javax.persistence.GenerationType +import javax.persistence.Id +import javax.persistence.Table + +@Entity +@Table(name = 'todo') +class Todo { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Integer id + + @Column + String task + + @Column + Boolean isCompleted + +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/repository/TodoRepository.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/repository/TodoRepository.groovy new file mode 100644 index 0000000000..eb58cc0791 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/repository/TodoRepository.groovy @@ -0,0 +1,9 @@ +package com.baeldung.springwithgroovy.repository + +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +import com.baeldung.springwithgroovy.entity.Todo + +@Repository +interface TodoRepository extends JpaRepository {} \ No newline at end of file diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/TodoService.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/TodoService.groovy new file mode 100644 index 0000000000..c57af34cde --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/TodoService.groovy @@ -0,0 +1,16 @@ +package com.baeldung.springwithgroovy.service + +import com.baeldung.springwithgroovy.entity.Todo + +interface TodoService { + + List findAll() + + Todo findById(Integer todoId) + + Todo saveTodo(Todo todo) + + Todo updateTodo(Todo todo) + + Todo deleteTodo(Integer todoId) +} diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/impl/TodoServiceImpl.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/impl/TodoServiceImpl.groovy new file mode 100644 index 0000000000..943c1c6944 --- /dev/null +++ b/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/service/impl/TodoServiceImpl.groovy @@ -0,0 +1,40 @@ +package com.baeldung.springwithgroovy.service.impl + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +import com.baeldung.springwithgroovy.entity.Todo +import com.baeldung.springwithgroovy.repository.TodoRepository +import com.baeldung.springwithgroovy.service.TodoService + +@Service +class TodoServiceImpl implements TodoService { + + @Autowired + TodoRepository todoRepository + + @Override + List findAll() { + todoRepository.findAll() + } + + @Override + Todo findById(Integer todoId) { + todoRepository.findById todoId get() + } + + @Override + Todo saveTodo(Todo todo){ + todoRepository.save todo + } + + @Override + Todo updateTodo(Todo todo){ + todoRepository.save todo + } + + @Override + Todo deleteTodo(Integer todoId){ + todoRepository.deleteById todoId + } +} diff --git a/spring-boot-groovy/src/test/groovy/com/baeldung/springwithgroovy/TodoAppUnitTest.groovy b/spring-boot-groovy/src/test/groovy/com/baeldung/springwithgroovy/TodoAppUnitTest.groovy new file mode 100644 index 0000000000..bf8b0ff27f --- /dev/null +++ b/spring-boot-groovy/src/test/groovy/com/baeldung/springwithgroovy/TodoAppUnitTest.groovy @@ -0,0 +1,97 @@ +package com.baeldung.springwithgroovy + +import static org.junit.jupiter.api.Assertions.assertEquals +import static org.junit.jupiter.api.Assertions.assertTrue + +import org.junit.BeforeClass +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.test.context.event.annotation.BeforeTestClass +import org.springframework.test.context.junit4.SpringRunner + +import com.baeldung.springwithgroovy.entity.Todo + +import io.restassured.RestAssured +import io.restassured.response.Response + +class TodoAppUnitTest { + static API_ROOT = 'http://localhost:8081/todo' + static readingTodoId + static writingTodoId + + @BeforeClass + static void populateDummyData() { + Todo readingTodo = new Todo(task: 'Reading', isCompleted: false) + Todo writingTodo = new Todo(task: 'Writing', isCompleted: false) + + final Response readingResponse = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(readingTodo).post(API_ROOT) + + Todo cookingTodoResponse = readingResponse.as Todo.class + readingTodoId = cookingTodoResponse.getId() + + final Response writingResponse = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(writingTodo).post(API_ROOT) + + Todo writingTodoResponse = writingResponse.as Todo.class + writingTodoId = writingTodoResponse.getId() + } + + @Test + void whenGetAllTodoList_thenOk(){ + final Response response = RestAssured.get(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + assertTrue response.as(List.class).size() > 0 + } + + @Test + void whenGetTodoById_thenOk(){ + final Response response = + RestAssured.get("$API_ROOT/$readingTodoId") + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + Todo todoResponse = response.as Todo.class + assertEquals readingTodoId,todoResponse.getId() + } + + @Test + void whenUpdateTodoById_thenOk(){ + Todo todo = new Todo(id:readingTodoId, isCompleted: true) + final Response response = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(todo).put(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + Todo todoResponse = response.as Todo.class + assertTrue todoResponse.getIsCompleted() + } + + @Test + void whenDeleteTodoById_thenOk(){ + final Response response = + RestAssured.given() + .delete("$API_ROOT/$writingTodoId") + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + } + + @Test + void whenSaveTodo_thenOk(){ + Todo todo = new Todo(task: 'Blogging', isCompleted: false) + final Response response = + RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(todo).post(API_ROOT) + + assertEquals HttpStatus.OK.value(),response.getStatusCode() + } +} \ No newline at end of file From df179d642e3fef9da586f8fe2582fa6719d2fe53 Mon Sep 17 00:00:00 2001 From: Sampada <46674082+sampada07@users.noreply.github.com> Date: Sun, 26 Apr 2020 21:25:43 +0530 Subject: [PATCH 527/530] BAEL-3988: Calling a SOAP web service in Java (#9184) * BAEL-3988: Calling a SOAP web service in Java * BAEL-3988: modified generated class as per wsdl location change --- jee-7/pom.xml | 7 ++-- .../generated/CountryServiceImplService.java | 6 +-- jee-7/src/main/resources/country.wsdl | 40 ------------------- 3 files changed, 6 insertions(+), 47 deletions(-) delete mode 100644 jee-7/src/main/resources/country.wsdl diff --git a/jee-7/pom.xml b/jee-7/pom.xml index 7352c6550a..9077aae1a6 100644 --- a/jee-7/pom.xml +++ b/jee-7/pom.xml @@ -256,10 +256,9 @@ - src/main/resources - - country.wsdl - + + http://localhost:8888/ws/country?wsdl + true com.baeldung.soap.ws.client.generated src/main/java diff --git a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java index 09f4c29202..a6983938f5 100644 --- a/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java +++ b/jee-7/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java @@ -12,11 +12,11 @@ import javax.xml.ws.WebServiceFeature; /** * This class was generated by the JAX-WS RI. - * JAX-WS RI 2.3.2 + * JAX-WS RI 2.2.9-b130926.1035 * Generated source version: 2.2 * */ -@WebServiceClient(name = "CountryServiceImplService", targetNamespace = "http://server.ws.soap.baeldung.com/", wsdlLocation = "file:src/main/resources/country.wsdl") +@WebServiceClient(name = "CountryServiceImplService", targetNamespace = "http://server.ws.soap.baeldung.com/", wsdlLocation = "http://localhost:8888/ws/country?wsdl") public class CountryServiceImplService extends Service { private final static URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; @@ -27,7 +27,7 @@ public class CountryServiceImplService extends Service { URL url = null; WebServiceException e = null; try { - url = new URL("file:src/main/resources/country.wsdl"); + url = new URL("http://localhost:8888/ws/country?wsdl"); } catch (MalformedURLException ex) { e = new WebServiceException(ex); } diff --git a/jee-7/src/main/resources/country.wsdl b/jee-7/src/main/resources/country.wsdl deleted file mode 100644 index 4d41fce322..0000000000 --- a/jee-7/src/main/resources/country.wsdl +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From c7acf47138c929c59a35e545a3fe66d3225365eb Mon Sep 17 00:00:00 2001 From: "amit.pandey" Date: Sun, 26 Apr 2020 22:24:14 +0530 Subject: [PATCH 528/530] fix junit test cases --- .../batch/understanding/CustomCheckPointUnitTest.java | 9 +++------ .../batch/understanding/JobSequenceUnitTest.java | 6 +++--- .../batch/understanding/SimpleBatchLetUnitTest.java | 9 ++++----- .../batch/understanding/SimpleChunkUnitTest.java | 5 ++--- .../batch/understanding/SimpleErrorChunkUnitTest.java | 11 +++++------ jee-7/src/test/resources/jberet.properties | 1 + 6 files changed, 18 insertions(+), 23 deletions(-) create mode 100644 jee-7/src/test/resources/jberet.properties diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java index 744bdfc8f5..c607efeb24 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java @@ -1,20 +1,17 @@ package com.baeldung.batch.understanding; -import static org.junit.jupiter.api.Assertions.*; -import java.util.Map; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.Properties; + import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; -import javax.batch.runtime.Metric; import javax.batch.runtime.StepExecution; -import com.baeldung.batch.understanding.BatchTestHelper; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Disabled; -@Disabled("Should be fixed in BAEL-3812") class CustomCheckPointUnitTest { @Test public void givenChunk_whenCustomCheckPoint_thenCommitCountIsThree() throws Exception { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java index 88b981df92..4b27e5f5ec 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.batch.understanding; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.List; @@ -13,9 +15,7 @@ import javax.batch.runtime.JobExecution; import javax.batch.runtime.StepExecution; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Disabled; -@Disabled("Should be fixed in BAEL-3812") class JobSequenceUnitTest { @Test public void givenTwoSteps_thenBatch_CompleteWithSuccess() throws Exception { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java index 3babf9b5aa..788b75eb3e 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java @@ -1,17 +1,16 @@ package com.baeldung.batch.understanding; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Properties; import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; -import java.util.Properties; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; -@Disabled("Should be fixed in BAEL-3812") class SimpleBatchLetUnitTest { @Test public void givenBatchLet_thenBatch_CompleteWithSuccess() throws Exception { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java index 5871143fa3..9010c365a2 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.batch.understanding; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; import java.util.Map; @@ -14,9 +15,7 @@ import javax.batch.runtime.Metric; import javax.batch.runtime.StepExecution; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Disabled; -@Disabled("Should be fixed in BAEL-3812") class SimpleChunkUnitTest { @Test public void givenChunk_thenBatch_CompletesWithSucess() throws Exception { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java index c53561a0c0..bc410aec8d 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java @@ -1,19 +1,18 @@ package com.baeldung.batch.understanding; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; +import static org.junit.Assert.assertEquals; + +import java.util.List; +import java.util.Properties; import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; import javax.batch.runtime.StepExecution; -import java.util.List; -import java.util.Properties; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; -@Disabled("Should be fixed in BAEL-3812") class SimpleErrorChunkUnitTest { @Test diff --git a/jee-7/src/test/resources/jberet.properties b/jee-7/src/test/resources/jberet.properties new file mode 100644 index 0000000000..e8b9907de5 --- /dev/null +++ b/jee-7/src/test/resources/jberet.properties @@ -0,0 +1 @@ +db-url=jdbc:h2:mem:jberet-repo;DB_CLOSE_DELAY=-1 \ No newline at end of file From f1283f2424cc85aa6459898767c3f62be816d01b Mon Sep 17 00:00:00 2001 From: Belma Jakupovic Date: Mon, 27 Apr 2020 06:57:38 +0200 Subject: [PATCH 529/530] bjakupovic - single responsibility principle example (#9191) --- .../java/com/baeldung/s/TextManipulator.java | 35 +++++++++++++++++++ .../main/java/com/baeldung/s/TextPrinter.java | 23 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java create mode 100644 patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java diff --git a/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java b/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java new file mode 100644 index 0000000000..a6b32a0ff9 --- /dev/null +++ b/patterns/solid/src/main/java/com/baeldung/s/TextManipulator.java @@ -0,0 +1,35 @@ +package com.baeldung.s; + +public class TextManipulator { + private String text; + + public TextManipulator(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public void appendText(String newText) { + text = text.concat(newText); + } + + public void findWordAndReplace(String word, String replacementWord) { + if (text.contains(word)) { + text = text.replace(word, replacementWord); + } else System.out.println("Word you want to replace is not found in the text"); + } + + public void findWordAndDelete(String word) { + if (text.contains(word)) { + text = text.replace(word, ""); + } else System.out.println("Word you want to delete is not found in the text"); + } + + /* + * Bad practice when implementing SRP principle, not in the scope of this class + public void printText() { + System.out.println(textManipulator.getText()); + }*/ +} diff --git a/patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java b/patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java new file mode 100644 index 0000000000..d6a413e7ac --- /dev/null +++ b/patterns/solid/src/main/java/com/baeldung/s/TextPrinter.java @@ -0,0 +1,23 @@ +package com.baeldung.s; + +import java.util.Arrays; + +public class TextPrinter { + TextManipulator textManipulator; + + public TextPrinter(TextManipulator textManipulator) { + this.textManipulator = textManipulator; + } + + public void printText() { + System.out.println(textManipulator.getText()); + } + + public void printOutEachWordOfText() { + System.out.println(Arrays.toString(textManipulator.getText().split(" "))); + } + + public void printRangeOfCharacters(int startingIndex, int endIndex) { + System.out.println(textManipulator.getText().substring(startingIndex, endIndex)); + } +} From debb7dace50ee0ebe67e41872c132eafe83d8cbe Mon Sep 17 00:00:00 2001 From: Yevgen Pikus <4037842+gindex@users.noreply.github.com> Date: Mon, 27 Apr 2020 23:25:33 +0200 Subject: [PATCH 530/530] Add fold and reduce examples (#9188) Co-authored-by: Yevgen Pikus --- .../foldvsreduce/FoldAndReduceTest.kt | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt diff --git a/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt new file mode 100644 index 0000000000..7b263914c6 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-collections/src/test/kotlin/com/baeldung/foldvsreduce/FoldAndReduceTest.kt @@ -0,0 +1,59 @@ +package com.baeldung.foldvsreduce + +import org.junit.Test +import org.junit.jupiter.api.assertThrows +import java.lang.RuntimeException +import kotlin.test.assertEquals + +class FoldAndReduceTest { + + @Test + fun testReduceLimitations() { + val numbers: List = listOf(1, 2, 3) + val sum: Number = numbers.reduce { acc, next -> acc + next } + assertEquals(6, sum) + + val emptyList = listOf() + assertThrows { emptyList.reduce { acc, next -> acc + next } } + + // doesn't compile + // val sum = numbers.reduce { acc, next -> acc.toLong() + next.toLong()} + } + + @Test + fun testFold() { + + val numbers: List = listOf(1, 2, 3) + val sum: Int = numbers.fold(0, { acc, next -> acc + next }) + assertEquals(6, sum) + + //change result type + val sumLong: Long = numbers.fold(0L, { acc, next -> acc + next.toLong() }) + assertEquals(6L, sumLong) + + val emptyList = listOf() + val emptySum = emptyList.fold(0, { acc, next -> acc + next }) + assertEquals(0, emptySum) + + //power of changing result type + val (even, odd) = numbers.fold(Pair(listOf(), listOf()), { acc, next -> + if (next % 2 == 0) Pair(acc.first + next, acc.second) + else Pair(acc.first, acc.second + next) + }) + + assertEquals(listOf(2), even) + assertEquals(listOf(1, 3), odd) + } + + @Test + fun testVariationsOfFold() { + val numbers = listOf(1, 2, 3) + val reversed = numbers.foldRight(listOf(), { next, acc -> acc + next}) + assertEquals(listOf(3,2,1), reversed) + + val reversedIndexes = numbers.foldRightIndexed(listOf(), { i, _, acc -> acc + i }) + assertEquals(listOf(2,1,0), reversedIndexes) + } + + +} \ No newline at end of file