From e3a84dae5b623ed2245d35ccaf5073e5582113fa Mon Sep 17 00:00:00 2001 From: Dmytro Korniienko Date: Sun, 9 Sep 2018 13:13:17 +0300 Subject: [PATCH 01/55] BAEL-2070 Qualifier used instead of Primary to distinguish between different repository beans --- .../baeldung/dependency/exception/app/PurchaseDeptService.java | 3 ++- .../dependency/exception/repository/DressRepository.java | 3 ++- .../dependency/exception/repository/ShoeRepository.java | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java b/spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java index 1e6fad63aa..e0fe01acdd 100644 --- a/spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java +++ b/spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java @@ -1,13 +1,14 @@ package com.baeldung.dependency.exception.app; import com.baeldung.dependency.exception.repository.InventoryRepository; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @Service public class PurchaseDeptService { private InventoryRepository repository; - public PurchaseDeptService(InventoryRepository repository) { + public PurchaseDeptService(@Qualifier("dresses") InventoryRepository repository) { this.repository = repository; } } \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java b/spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java index 4a6c836143..5a1371ce04 100644 --- a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java +++ b/spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java @@ -1,9 +1,10 @@ package com.baeldung.dependency.exception.repository; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; -@Primary +@Qualifier("dresses") @Repository public class DressRepository implements InventoryRepository { } diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java b/spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java index 60495914cd..227d8934b6 100644 --- a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java +++ b/spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java @@ -1,7 +1,9 @@ package com.baeldung.dependency.exception.repository; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; +@Qualifier("shoes") @Repository public class ShoeRepository implements InventoryRepository { } From 9664247f4f426bea83b625a510b76ffe9068e08c Mon Sep 17 00:00:00 2001 From: Dmytro Korniienko Date: Mon, 10 Sep 2018 21:29:38 +0300 Subject: [PATCH 02/55] BAEL-2095 CrudRepository save() method --- .../baeldung/config/CustomConfiguration.java | 29 ++++++++++++++++ .../dao/repositories/InventoryRepository.java | 7 ++++ .../baeldung/domain/MerchandiseEntity.java | 34 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java diff --git a/spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java b/spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java new file mode 100644 index 0000000000..5af5351d76 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java @@ -0,0 +1,29 @@ +package com.baeldung.config; + +import com.baeldung.dao.repositories.InventoryRepository; +import com.baeldung.domain.MerchandiseEntity; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@EnableJpaRepositories(basePackageClasses = InventoryRepository.class) +@EntityScan(basePackageClasses = MerchandiseEntity.class) +public class CustomConfiguration { + public static void main(String[] args) { + ConfigurableApplicationContext context = SpringApplication.run(CustomConfiguration.class, args); + + InventoryRepository repo = context.getBean(InventoryRepository.class); + + MerchandiseEntity pants = new MerchandiseEntity("Pair of Pants"); + repo.save(pants); + + MerchandiseEntity shorts = new MerchandiseEntity("Pair of Shorts"); + repo.save(shorts); + + pants.setTitle("Branded Luxury Pants"); + repo.save(pants); + } +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java new file mode 100644 index 0000000000..a575f0b915 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.MerchandiseEntity; +import org.springframework.data.repository.CrudRepository; + +public interface InventoryRepository extends CrudRepository { +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java b/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java new file mode 100644 index 0000000000..921edf1b85 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java @@ -0,0 +1,34 @@ +package com.baeldung.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class MerchandiseEntity { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String title; + + public MerchandiseEntity() { + } + + public MerchandiseEntity(String title) { + this.title = title; + } + + public Long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} From 2e60aa32a251a43e3153c5aeb9609bde16995e60 Mon Sep 17 00:00:00 2001 From: Dmytro Korniienko Date: Tue, 11 Sep 2018 00:13:41 +0300 Subject: [PATCH 03/55] (REVERT) BAEL-2095 CrudRepository save() method --- .../baeldung/config/CustomConfiguration.java | 29 ---------------- .../dao/repositories/InventoryRepository.java | 7 ---- .../baeldung/domain/MerchandiseEntity.java | 34 ------------------- 3 files changed, 70 deletions(-) delete mode 100644 spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java delete mode 100644 spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java delete mode 100644 spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java diff --git a/spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java b/spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java deleted file mode 100644 index 5af5351d76..0000000000 --- a/spring-data-jpa/src/main/java/com/baeldung/config/CustomConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.config; - -import com.baeldung.dao.repositories.InventoryRepository; -import com.baeldung.domain.MerchandiseEntity; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@SpringBootApplication -@EnableJpaRepositories(basePackageClasses = InventoryRepository.class) -@EntityScan(basePackageClasses = MerchandiseEntity.class) -public class CustomConfiguration { - public static void main(String[] args) { - ConfigurableApplicationContext context = SpringApplication.run(CustomConfiguration.class, args); - - InventoryRepository repo = context.getBean(InventoryRepository.class); - - MerchandiseEntity pants = new MerchandiseEntity("Pair of Pants"); - repo.save(pants); - - MerchandiseEntity shorts = new MerchandiseEntity("Pair of Shorts"); - repo.save(shorts); - - pants.setTitle("Branded Luxury Pants"); - repo.save(pants); - } -} diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java deleted file mode 100644 index a575f0b915..0000000000 --- a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.MerchandiseEntity; -import org.springframework.data.repository.CrudRepository; - -public interface InventoryRepository extends CrudRepository { -} diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java b/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java deleted file mode 100644 index 921edf1b85..0000000000 --- a/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.domain; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -public class MerchandiseEntity { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - private String title; - - public MerchandiseEntity() { - } - - public MerchandiseEntity(String title) { - this.title = title; - } - - public Long getId() { - return id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } -} From acbd7ea6b2e8b5cfe534a01c3fe2388dd3bdc970 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Sat, 15 Sep 2018 22:07:27 +0200 Subject: [PATCH 04/55] added link --- libraries-data/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-data/README.md b/libraries-data/README.md index 652ae0e04c..63ee5f9947 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -11,3 +11,4 @@ - [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data) - [Guide to JMapper](https://www.baeldung.com/jmapper) - [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch) +- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline) From 68618ed5e03a2f24869d59067e15e2a7e26076f5 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Sat, 15 Sep 2018 22:08:35 +0200 Subject: [PATCH 05/55] added link --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index 233d986d98..8f0ab60a53 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -27,3 +27,4 @@ - [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string) - [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex) - [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string) +- [Get Substring from String in Java](https://www.baeldung.com/java-substring) From 69f149835bed8f569019829af163504ffbb232b0 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Sun, 16 Sep 2018 22:23:43 +0200 Subject: [PATCH 06/55] added link --- hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/hibernate5/README.md b/hibernate5/README.md index 8f2f8eb469..e42229a152 100644 --- a/hibernate5/README.md +++ b/hibernate5/README.md @@ -14,3 +14,4 @@ - [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) From 7b1e4c8e759329d78fc7999691f4d684666378e6 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Sun, 16 Sep 2018 22:25:10 +0200 Subject: [PATCH 07/55] added link --- jersey/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jersey/README.md b/jersey/README.md index 3121c560cf..89e93107f7 100644 --- a/jersey/README.md +++ b/jersey/README.md @@ -1,2 +1,3 @@ - [Jersey Filters and Interceptors](http://www.baeldung.com/jersey-filters-interceptors) - [Jersey MVC Support](https://www.baeldung.com/jersey-mvc) +- [Bean Validation in Jersey](https://www.baeldung.com/jersey-bean-validation) From 9280b9e81bd0e0ca2b3589e03ff3218f0db6f516 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Mon, 17 Sep 2018 20:21:35 +0200 Subject: [PATCH 08/55] added link --- core-java-collections/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index f187141712..4502998c52 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -49,3 +49,4 @@ - [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) - [](https://www.baeldung.com/java-hashset-arraylist-contains-performance) +- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall) From 2a7a33f71748db1ac7161de1f1bc650ca8fe9440 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:15:03 +0530 Subject: [PATCH 09/55] BAEL-2169 --- libraries-data/ebean/pom.xml | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 libraries-data/ebean/pom.xml diff --git a/libraries-data/ebean/pom.xml b/libraries-data/ebean/pom.xml new file mode 100644 index 0000000000..2e319e1523 --- /dev/null +++ b/libraries-data/ebean/pom.xml @@ -0,0 +1,59 @@ + + 4.0.0 + + com.baeldung + ebean + 0.0.1-SNAPSHOT + jar + + ebean + http://maven.apache.org + + + UTF-8 + + + + + io.ebean + ebean + 11.22.4 + + + com.h2database + h2 + 1.4.196 + + + ch.qos.logback + logback-classic + 1.2.3 + + + + + + + + io.ebean + ebean-maven-plugin + 11.11.2 + + + + main + process-classes + + debug=1 + + + enhance + + + + + + + + From 18f4728a9f4cc73a5f615ea2ec12c3229add6da3 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:17:40 +0530 Subject: [PATCH 10/55] Create Address.java --- .../com/baeldung/ebean/model/Address.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Address.java diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Address.java b/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Address.java new file mode 100644 index 0000000000..362e27c32a --- /dev/null +++ b/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Address.java @@ -0,0 +1,42 @@ +package com.baeldung.ebean.model; + +import javax.persistence.Entity; + +@Entity +public class Address extends BaseModel{ + + public Address(String addressLine1, String addressLine2, String city) { + super(); + this.addressLine1 = addressLine1; + this.addressLine2 = addressLine2; + this.city = city; + } + + private String addressLine1; + private String addressLine2; + private String city; + + public String getAddressLine1() { + return addressLine1; + } + public void setAddressLine1(String addressLine1) { + this.addressLine1 = addressLine1; + } + public String getAddressLine2() { + return addressLine2; + } + public void setAddressLine2(String addressLine2) { + this.addressLine2 = addressLine2; + } + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + @Override + public String toString() { + return "Address [id=" + id + ", addressLine1=" + addressLine1 + ", addressLine2=" + addressLine2 + ", city=" + city + "]"; + } + +} From a9d3d8ea07a81f2b8e7e753a2bb9fbe5ceb790a9 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:18:48 +0530 Subject: [PATCH 11/55] Add files via upload --- .../com/baeldung/ebean/model/BaseModel.java | 59 +++++++++++++++++++ .../com/baeldung/ebean/model/Customer.java | 42 +++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 libraries-data/ebean/src/main/java/com/baeldung/ebean/model/BaseModel.java create mode 100644 libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Customer.java diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/BaseModel.java b/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/BaseModel.java new file mode 100644 index 0000000000..7634df7aa0 --- /dev/null +++ b/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/BaseModel.java @@ -0,0 +1,59 @@ +package com.baeldung.ebean.model; + +import java.time.Instant; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Version; + +import io.ebean.annotation.WhenCreated; +import io.ebean.annotation.WhenModified; + +@MappedSuperclass +public abstract class BaseModel { + + @Id + protected long id; + + @Version + protected long version; + + @WhenCreated + protected Instant createdOn; + + @WhenModified + protected Instant modifiedOn; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Instant getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Instant createdOn) { + this.createdOn = createdOn; + } + + public Instant getModifiedOn() { + return modifiedOn; + } + + public void setModifiedOn(Instant modifiedOn) { + this.modifiedOn = modifiedOn; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + +} diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Customer.java b/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Customer.java new file mode 100644 index 0000000000..df1db82de4 --- /dev/null +++ b/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Customer.java @@ -0,0 +1,42 @@ +package com.baeldung.ebean.model; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.OneToOne; + +@Entity +public class Customer extends BaseModel { + + public Customer(String name, Address address) { + super(); + this.name = name; + this.address = address; + } + + private String name; + + @OneToOne(cascade = CascadeType.ALL) + Address address; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + @Override + public String toString() { + return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]"; + } + +} From 9510ca6fa1f066ad4328bfde92d4d8240d641ac5 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:19:55 +0530 Subject: [PATCH 12/55] Create App.java --- .../main/java/com/baeldung/ebean/app/App.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App.java diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App.java b/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App.java new file mode 100644 index 0000000000..161bf1e820 --- /dev/null +++ b/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App.java @@ -0,0 +1,75 @@ +package com.baeldung.ebean.app; + +import java.util.Arrays; + +import com.baeldung.ebean.model.Address; +import com.baeldung.ebean.model.Customer; + +import io.ebean.Ebean; +import io.ebean.EbeanServer; +import io.ebean.annotation.Transactional; + +public class App { + + public static void main(String[] args) { + insertAndDeleteInsideTransaction(); + crudOperations(); + queryCustomers(); + } + + @Transactional + public static void insertAndDeleteInsideTransaction() { + + Customer c1 = getCustomer(); + EbeanServer server = Ebean.getDefaultServer(); + server.save(c1); + Customer foundC1 = server.find(Customer.class, c1.getId()); + server.delete(foundC1); + } + + public static void crudOperations() { + + Address a1 = new Address("5, Wide Street", null, "New York"); + Customer c1 = new Customer("John Wide", a1); + + EbeanServer server = Ebean.getDefaultServer(); + server.save(c1); + + c1.setName("Jane Wide"); + c1.setAddress(null); + server.save(c1); + + Customer foundC1 = Ebean.find(Customer.class, c1.getId()); + + Ebean.delete(foundC1); + } + + public static void queryCustomers() { + Address a1 = new Address("1, Big Street", null, "New York"); + Customer c1 = new Customer("Big John", a1); + + Address a2 = new Address("2, Big Street", null, "New York"); + Customer c2 = new Customer("Big John", a2); + + Address a3 = new Address("3, Big Street", null, "San Jose"); + Customer c3 = new Customer("Big Bob", a3); + + Ebean.saveAll(Arrays.asList(c1, c2, c3)); + + Customer customer = Ebean.find(Customer.class) + .select("name") + .fetch("address", "city") + .where() + .eq("city", "San Jose") + .findOne(); + + Ebean.deleteAll(Arrays.asList(c1, c2, c3)); + } + + private static Customer getCustomer() { + Address a1 = new Address("1, Big Street", null, "New York"); + Customer c1 = new Customer("Big John", a1); + return c1; + } + +} From 8b8e3f2650c36840e7a57517dccdd6740a5c7800 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:20:22 +0530 Subject: [PATCH 13/55] Create App2.java --- .../java/com/baeldung/ebean/app/App2.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App2.java diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App2.java b/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App2.java new file mode 100644 index 0000000000..fba77007c6 --- /dev/null +++ b/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App2.java @@ -0,0 +1,26 @@ +package com.baeldung.ebean.app; + +import java.util.Properties; + +import io.ebean.EbeanServer; +import io.ebean.EbeanServerFactory; +import io.ebean.config.ServerConfig; + +public class App2 { + + public static void main(String[] args) { + ServerConfig cfg = new ServerConfig(); + cfg.setDefaultServer(true); + Properties properties = new Properties(); + properties.put("ebean.db.ddl.generate", "true"); + properties.put("ebean.db.ddl.run", "true"); + properties.put("datasource.db.username", "sa"); + properties.put("datasource.db.password", ""); + properties.put("datasource.db.databaseUrl", "jdbc:h2:mem:app2"); + properties.put("datasource.db.databaseDriver", "org.h2.Driver"); + cfg.loadFromProperties(properties); + EbeanServer server = EbeanServerFactory.create(cfg); + + } + +} From 9fcc873f6378cabf35970d31157f918be87c73be Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:20:58 +0530 Subject: [PATCH 14/55] Create application.properties --- .../ebean/src/main/resources/application.properties | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 libraries-data/ebean/src/main/resources/application.properties diff --git a/libraries-data/ebean/src/main/resources/application.properties b/libraries-data/ebean/src/main/resources/application.properties new file mode 100644 index 0000000000..9cc5cc170a --- /dev/null +++ b/libraries-data/ebean/src/main/resources/application.properties @@ -0,0 +1,7 @@ +ebean.db.ddl.generate=true +ebean.db.ddl.run=true + +datasource.db.username=sa +datasource.db.password= +datasource.db.databaseUrl=jdbc:h2:mem:customer +datasource.db.databaseDriver=org.h2.Driver From a22470ac23ebf9a50c5d5aed6e708e3f23078e19 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:21:19 +0530 Subject: [PATCH 15/55] Create ebean.mf --- libraries-data/ebean/src/main/resources/ebean.mf | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 libraries-data/ebean/src/main/resources/ebean.mf diff --git a/libraries-data/ebean/src/main/resources/ebean.mf b/libraries-data/ebean/src/main/resources/ebean.mf new file mode 100644 index 0000000000..f49fecc717 --- /dev/null +++ b/libraries-data/ebean/src/main/resources/ebean.mf @@ -0,0 +1,3 @@ +entity-packages: com.baeldung.ebean.model +transactional-packages: com.baeldung.ebean.app +querybean-packages: com.baeldung.ebean.app From 772179794686e62ebd6ffba2c3b067a6659c9185 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Fri, 28 Sep 2018 06:21:38 +0530 Subject: [PATCH 16/55] Create logback.yml --- libraries-data/ebean/src/main/resources/logback.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 libraries-data/ebean/src/main/resources/logback.yml diff --git a/libraries-data/ebean/src/main/resources/logback.yml b/libraries-data/ebean/src/main/resources/logback.yml new file mode 100644 index 0000000000..c838a19c6c --- /dev/null +++ b/libraries-data/ebean/src/main/resources/logback.yml @@ -0,0 +1,3 @@ + + + From f9065d21b777cc8e29da6138914fc5cd66f59803 Mon Sep 17 00:00:00 2001 From: Dmytro Korniienko Date: Mon, 1 Oct 2018 10:17:39 +0300 Subject: [PATCH 17/55] BAEL-2258 Guide to DateTimeFormatter. Tests added for various formatting patterns and styles --- .../DateTimeFormatterUnitTest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java b/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java index 4d95bc82e1..cbb84a8783 100644 --- a/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java @@ -3,11 +3,14 @@ package com.baeldung.internationalization; import org.junit.Assert; import org.junit.Test; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; +import java.time.temporal.ChronoUnit; import java.util.Locale; import java.util.TimeZone; @@ -43,4 +46,70 @@ public class DateTimeFormatterUnitTest { Assert.assertEquals("Monday, January 1, 2018 10:15:50 AM PST", formattedDateTime); Assert.assertEquals("lundi 1 janvier 2018 10 h 15 PST", frFormattedDateTime); } + + @Test + public void shoulPrintFormattedDate() { + String europeanDatePattern = "dd.MM.yyyy"; + DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern(europeanDatePattern); + LocalDate summerDay = LocalDate.of(2016, 7, 31); + Assert.assertEquals("31.07.2016", europeanDateFormatter.format(summerDay)); + } + + @Test + public void shouldPrintFormattedTime24() { + String timeColonPattern = "HH:mm:ss"; + DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern); + LocalTime colonTime = LocalTime.of(17, 35, 50); + Assert.assertEquals("17:35:50", timeColonFormatter.format(colonTime)); + } + + @Test + public void shouldPrintFormattedTimeWithMillis() { + String timeColonPattern = "HH:mm:ss SSS"; + DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern); + LocalTime colonTime = LocalTime.of(17, 35, 50).plus(329, ChronoUnit.MILLIS); + Assert.assertEquals("17:35:50 329", timeColonFormatter.format(colonTime)); + } + + @Test + public void shouldPrintFormattedTimePM() { + String timeColonPattern = "hh:mm:ss a"; + DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern); + LocalTime colonTime = LocalTime.of(17, 35, 50); + Assert.assertEquals("05:35:50 PM", timeColonFormatter.format(colonTime)); + } + + @Test + public void shouldPrintFormattedUTCRelatedZonedDateTime() { + String newYorkDateTimePattern = "dd.MM.yyyy HH:mm z"; + DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern(newYorkDateTimePattern); + LocalDateTime summerDay = LocalDateTime.of(2016, 7, 31, 14, 15); + Assert.assertEquals("31.07.2016 14:15 UTC-04:00", newYorkDateFormatter.format(ZonedDateTime.of(summerDay, ZoneId.of("UTC-4")))); + } + + @Test + public void shouldPrintFormattedNewYorkZonedDateTime() { + String newYorkDateTimePattern = "dd.MM.yyyy HH:mm z"; + DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern(newYorkDateTimePattern); + LocalDateTime summerDay = LocalDateTime.of(2016, 7, 31, 14, 15); + Assert.assertEquals("31.07.2016 14:15 EDT", newYorkDateFormatter.format(ZonedDateTime.of(summerDay, ZoneId.of("America/New_York")))); + } + + @Test + public void shouldPrintStyledDate() { + LocalDate anotherSummerDay = LocalDate.of(2016, 8, 23); + Assert.assertEquals("Tuesday, August 23, 2016", DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(anotherSummerDay)); + Assert.assertEquals("August 23, 2016", DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(anotherSummerDay)); + Assert.assertEquals("Aug 23, 2016", DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(anotherSummerDay)); + Assert.assertEquals("8/23/16", DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(anotherSummerDay)); + } + + @Test + public void shouldPrintStyledDateTime() { + LocalDateTime anotherSummerDay = LocalDateTime.of(2016, 8, 23, 13, 12, 45); + Assert.assertEquals("Tuesday, August 23, 2016 1:12:45 PM EET", DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withZone(ZoneId.of("Europe/Helsinki")).format(anotherSummerDay)); + Assert.assertEquals("August 23, 2016 1:12:45 PM EET", DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withZone(ZoneId.of("Europe/Helsinki")).format(anotherSummerDay)); + Assert.assertEquals("Aug 23, 2016 1:12:45 PM", DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withZone(ZoneId.of("Europe/Helsinki")).format(anotherSummerDay)); + Assert.assertEquals("8/23/16 1:12 PM", DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withZone(ZoneId.of("Europe/Helsinki")).format(anotherSummerDay)); + } } From 7f6df18b64e5defb7909d6aa08748bf1cda41fc5 Mon Sep 17 00:00:00 2001 From: Dmytro Korniienko Date: Wed, 3 Oct 2018 23:55:24 +0300 Subject: [PATCH 18/55] BAEL-2258 Guide to DateTimeFormatter. Predefined formatters tests added --- .../internationalization/DateTimeFormatterUnitTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java b/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java index cbb84a8783..1260a6db92 100644 --- a/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java @@ -48,7 +48,7 @@ public class DateTimeFormatterUnitTest { } @Test - public void shoulPrintFormattedDate() { + public void shouldPrintFormattedDate() { String europeanDatePattern = "dd.MM.yyyy"; DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern(europeanDatePattern); LocalDate summerDay = LocalDate.of(2016, 7, 31); @@ -112,4 +112,11 @@ public class DateTimeFormatterUnitTest { Assert.assertEquals("Aug 23, 2016 1:12:45 PM", DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withZone(ZoneId.of("Europe/Helsinki")).format(anotherSummerDay)); Assert.assertEquals("8/23/16 1:12 PM", DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withZone(ZoneId.of("Europe/Helsinki")).format(anotherSummerDay)); } + + @Test + public void shouldPrintFormattedDateTimeWithPredefined() { + Assert.assertEquals("2018-03-09", DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.of(2018, 3, 9))); + Assert.assertEquals("2018-03-09-03:00", DateTimeFormatter.ISO_OFFSET_DATE.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")))); + Assert.assertEquals("Fri, 9 Mar 2018 00:00:00 -0300", DateTimeFormatter.RFC_1123_DATE_TIME.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")))); + } } From 63e856a44d6a3303b6aa0c0884d7ec7843a2d1cb Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 4 Oct 2018 21:03:45 +0200 Subject: [PATCH 19/55] added README --- flyway-cdi-extension/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 flyway-cdi-extension/README.md diff --git a/flyway-cdi-extension/README.md b/flyway-cdi-extension/README.md new file mode 100644 index 0000000000..3e03d5aee8 --- /dev/null +++ b/flyway-cdi-extension/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [CDI Portable Extension and Flyway](https://www.baeldung.com/cdi-portable-extension) From 08e902cb26072d8959bbcc191a91d1737d235c7d Mon Sep 17 00:00:00 2001 From: Dmytro Korniienko Date: Thu, 4 Oct 2018 23:14:59 +0300 Subject: [PATCH 20/55] BAEL-2258 Guide to DateTimeFormatter. parse() method usage tests added --- .../DateTimeFormatterUnitTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java b/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java index 1260a6db92..36a5f6210b 100644 --- a/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/internationalization/DateTimeFormatterUnitTest.java @@ -9,6 +9,7 @@ import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.time.format.FormatStyle; import java.time.temporal.ChronoUnit; import java.util.Locale; @@ -119,4 +120,39 @@ public class DateTimeFormatterUnitTest { Assert.assertEquals("2018-03-09-03:00", DateTimeFormatter.ISO_OFFSET_DATE.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")))); Assert.assertEquals("Fri, 9 Mar 2018 00:00:00 -0300", DateTimeFormatter.RFC_1123_DATE_TIME.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")))); } + + @Test + public void shouldParseDateTime() { + Assert.assertEquals(LocalDate.of(2018, 3, 12), LocalDate.from(DateTimeFormatter.ISO_LOCAL_DATE.parse("2018-03-09")).plusDays(3)); + } + + @Test + public void shouldParseFormatStyleFull() { + ZonedDateTime dateTime = ZonedDateTime.from(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).parse("Tuesday, August 23, 2016 1:12:45 PM EET")); + Assert.assertEquals(ZonedDateTime.of(LocalDateTime.of(2016, 8, 23, 22, 12, 45), ZoneId.of("Europe/Bucharest")), dateTime.plusHours(9)); + } + + @Test + public void shouldParseDateWithCustomFormatter() { + DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + Assert.assertFalse(LocalDate.from(europeanDateFormatter.parse("15.08.2014")).isLeapYear()); + } + + @Test + public void shouldParseTimeWithCustomFormatter() { + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss a"); + Assert.assertTrue(LocalTime.from(timeFormatter.parse("12:25:30 AM")).isBefore(LocalTime.NOON)); + } + + @Test + public void shouldParseZonedDateTimeWithCustomFormatter() { + DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z"); + Assert.assertEquals(7200, ZonedDateTime.from(zonedFormatter.parse("31.07.2016 14:15 GMT+02:00")).getOffset().getTotalSeconds()); + } + + @Test(expected = DateTimeParseException.class) + public void shouldExpectAnExceptionIfDateTimeStringNotMatchPattern() { + DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z"); + ZonedDateTime.from(zonedFormatter.parse("31.07.2016 14:15")); + } } From 5022d3fbf95a82d085d992c3b0a3b2f0a9bee486 Mon Sep 17 00:00:00 2001 From: Josephine Barboza Date: Sat, 6 Oct 2018 01:32:25 +0530 Subject: [PATCH 21/55] Ebean Chnages --- libraries-data/ebean/pom.xml | 59 --------- libraries-data/pom.xml | 56 +++++---- .../main/java/com/baeldung/ebean/app/App.java | 0 .../java/com/baeldung/ebean/app/App2.java | 0 .../com/baeldung/ebean/model/Address.java | 0 .../com/baeldung/ebean/model/BaseModel.java | 118 +++++++++--------- .../com/baeldung/ebean/model/Customer.java | 84 ++++++------- .../src/main/resources/application.properties | 0 .../{ebean => }/src/main/resources/ebean.mf | 0 .../src/main/resources/logback.yml | 0 10 files changed, 136 insertions(+), 181 deletions(-) delete mode 100644 libraries-data/ebean/pom.xml rename libraries-data/{ebean => }/src/main/java/com/baeldung/ebean/app/App.java (100%) rename libraries-data/{ebean => }/src/main/java/com/baeldung/ebean/app/App2.java (100%) rename libraries-data/{ebean => }/src/main/java/com/baeldung/ebean/model/Address.java (100%) rename libraries-data/{ebean => }/src/main/java/com/baeldung/ebean/model/BaseModel.java (94%) rename libraries-data/{ebean => }/src/main/java/com/baeldung/ebean/model/Customer.java (95%) rename libraries-data/{ebean => }/src/main/resources/application.properties (100%) rename libraries-data/{ebean => }/src/main/resources/ebean.mf (100%) rename libraries-data/{ebean => }/src/main/resources/logback.yml (100%) diff --git a/libraries-data/ebean/pom.xml b/libraries-data/ebean/pom.xml deleted file mode 100644 index 2e319e1523..0000000000 --- a/libraries-data/ebean/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - 4.0.0 - - com.baeldung - ebean - 0.0.1-SNAPSHOT - jar - - ebean - http://maven.apache.org - - - UTF-8 - - - - - io.ebean - ebean - 11.22.4 - - - com.h2database - h2 - 1.4.196 - - - ch.qos.logback - logback-classic - 1.2.3 - - - - - - - - io.ebean - ebean-maven-plugin - 11.11.2 - - - - main - process-classes - - debug=1 - - - enhance - - - - - - - - diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 5b34a903ce..abbbe9c5de 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -249,6 +249,18 @@ ${awaitility.version} test + + + io.ebean + ebean + 11.22.4 + + + + ch.qos.logback + logback-classic + 1.2.3 + @@ -332,27 +344,7 @@ - - org.datanucleus - datanucleus-maven-plugin - ${datanucleus-maven-plugin.version} - - JDO - ${basedir}/datanucleus.properties - ${basedir}/log4j.properties - true - false - - - - - process-classes - - enhance - - - - + org.apache.maven.plugins @@ -380,6 +372,28 @@ + + + + io.ebean + ebean-maven-plugin + 11.11.2 + + + + main + process-classes + + debug=1 + + + enhance + + + + + + diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App.java b/libraries-data/src/main/java/com/baeldung/ebean/app/App.java similarity index 100% rename from libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App.java rename to libraries-data/src/main/java/com/baeldung/ebean/app/App.java diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App2.java b/libraries-data/src/main/java/com/baeldung/ebean/app/App2.java similarity index 100% rename from libraries-data/ebean/src/main/java/com/baeldung/ebean/app/App2.java rename to libraries-data/src/main/java/com/baeldung/ebean/app/App2.java diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Address.java b/libraries-data/src/main/java/com/baeldung/ebean/model/Address.java similarity index 100% rename from libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Address.java rename to libraries-data/src/main/java/com/baeldung/ebean/model/Address.java diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/BaseModel.java b/libraries-data/src/main/java/com/baeldung/ebean/model/BaseModel.java similarity index 94% rename from libraries-data/ebean/src/main/java/com/baeldung/ebean/model/BaseModel.java rename to libraries-data/src/main/java/com/baeldung/ebean/model/BaseModel.java index 7634df7aa0..1390507605 100644 --- a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/BaseModel.java +++ b/libraries-data/src/main/java/com/baeldung/ebean/model/BaseModel.java @@ -1,59 +1,59 @@ -package com.baeldung.ebean.model; - -import java.time.Instant; - -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; -import javax.persistence.Version; - -import io.ebean.annotation.WhenCreated; -import io.ebean.annotation.WhenModified; - -@MappedSuperclass -public abstract class BaseModel { - - @Id - protected long id; - - @Version - protected long version; - - @WhenCreated - protected Instant createdOn; - - @WhenModified - protected Instant modifiedOn; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Instant getCreatedOn() { - return createdOn; - } - - public void setCreatedOn(Instant createdOn) { - this.createdOn = createdOn; - } - - public Instant getModifiedOn() { - return modifiedOn; - } - - public void setModifiedOn(Instant modifiedOn) { - this.modifiedOn = modifiedOn; - } - - public long getVersion() { - return version; - } - - public void setVersion(long version) { - this.version = version; - } - -} +package com.baeldung.ebean.model; + +import java.time.Instant; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Version; + +import io.ebean.annotation.WhenCreated; +import io.ebean.annotation.WhenModified; + +@MappedSuperclass +public abstract class BaseModel { + + @Id + protected long id; + + @Version + protected long version; + + @WhenCreated + protected Instant createdOn; + + @WhenModified + protected Instant modifiedOn; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Instant getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Instant createdOn) { + this.createdOn = createdOn; + } + + public Instant getModifiedOn() { + return modifiedOn; + } + + public void setModifiedOn(Instant modifiedOn) { + this.modifiedOn = modifiedOn; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + +} diff --git a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Customer.java b/libraries-data/src/main/java/com/baeldung/ebean/model/Customer.java similarity index 95% rename from libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Customer.java rename to libraries-data/src/main/java/com/baeldung/ebean/model/Customer.java index df1db82de4..4dd629245a 100644 --- a/libraries-data/ebean/src/main/java/com/baeldung/ebean/model/Customer.java +++ b/libraries-data/src/main/java/com/baeldung/ebean/model/Customer.java @@ -1,42 +1,42 @@ -package com.baeldung.ebean.model; - -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.OneToOne; - -@Entity -public class Customer extends BaseModel { - - public Customer(String name, Address address) { - super(); - this.name = name; - this.address = address; - } - - private String name; - - @OneToOne(cascade = CascadeType.ALL) - Address address; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; - } - - @Override - public String toString() { - return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]"; - } - -} +package com.baeldung.ebean.model; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.OneToOne; + +@Entity +public class Customer extends BaseModel { + + public Customer(String name, Address address) { + super(); + this.name = name; + this.address = address; + } + + private String name; + + @OneToOne(cascade = CascadeType.ALL) + Address address; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + @Override + public String toString() { + return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]"; + } + +} diff --git a/libraries-data/ebean/src/main/resources/application.properties b/libraries-data/src/main/resources/application.properties similarity index 100% rename from libraries-data/ebean/src/main/resources/application.properties rename to libraries-data/src/main/resources/application.properties diff --git a/libraries-data/ebean/src/main/resources/ebean.mf b/libraries-data/src/main/resources/ebean.mf similarity index 100% rename from libraries-data/ebean/src/main/resources/ebean.mf rename to libraries-data/src/main/resources/ebean.mf diff --git a/libraries-data/ebean/src/main/resources/logback.yml b/libraries-data/src/main/resources/logback.yml similarity index 100% rename from libraries-data/ebean/src/main/resources/logback.yml rename to libraries-data/src/main/resources/logback.yml From 62d677ed30e1337e6829a547f59a571889fc94db Mon Sep 17 00:00:00 2001 From: Josephine Barboza Date: Sun, 7 Oct 2018 13:14:31 +0530 Subject: [PATCH 22/55] BAEL-2169 Guide to Ebean --- libraries-data/pom.xml | 207 +++++++++++------- .../main/java/com/baeldung/ebean/app/App.java | 2 +- .../com/baeldung/ebean/model/Address.java | 14 +- .../com/baeldung/ebean/model/BaseModel.java | 8 +- ...pplication.properties => ebean.properties} | 0 libraries-data/src/main/resources/logback.xml | 29 ++- libraries-data/src/main/resources/logback.yml | 3 - 7 files changed, 162 insertions(+), 101 deletions(-) rename libraries-data/src/main/resources/{application.properties => ebean.properties} (100%) delete mode 100644 libraries-data/src/main/resources/logback.yml diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index abbbe9c5de..e1318fd597 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 libraries-data @@ -13,6 +14,7 @@ + com.esotericsoftware kryo @@ -99,36 +101,49 @@ org.datanucleus javax.jdo ${javax.jdo.version} + org.datanucleus datanucleus-core ${datanucleus.version} + org.datanucleus datanucleus-api-jdo ${datanucleus.version} + + org.datanucleus datanucleus-rdbms ${datanucleus.version} + org.datanucleus datanucleus-maven-plugin ${datanucleus-maven-plugin.version} + + + log4j + log4j + + org.datanucleus datanucleus-xml ${datanucleus-xml.version} + org.datanucleus datanucleus-jdo-query ${datanucleus-jdo-query.version} + @@ -141,49 +156,55 @@ hazelcast ${hazelcast.version} - + com.googlecode.jmapper-framework jmapper-core ${jmapper.version} - - - org.apache.crunch - crunch-core - ${org.apache.crunch.crunch-core.version} - - - org.apache.hadoop - hadoop-client - ${org.apache.hadoop.hadoop-client} - provided - + + + org.apache.crunch + crunch-core + ${org.apache.crunch.crunch-core.version} + + + org.apache.hadoop + hadoop-client + ${org.apache.hadoop.hadoop-client} + provided + + + log4j + log4j + + + - - commons-cli - commons-cli - 1.2 - provided - - - commons-io - commons-io - 2.1 - provided - - - commons-httpclient - commons-httpclient - 3.0.1 - provided - - - commons-codec - commons-codec - - - + + commons-cli + commons-cli + 1.2 + provided + + + commons-io + commons-io + 2.1 + provided + + + commons-httpclient + commons-httpclient + 3.0.1 + provided + + + commons-codec + commons-codec + + + org.apache.flink flink-connector-kafka-0.11_2.11 @@ -249,19 +270,32 @@ ${awaitility.version} test - - + io.ebean ebean - 11.22.4 + ${ebean.version} - + + org.slf4j + slf4j-api + ${slf4j.version} + + ch.qos.logback logback-classic - 1.2.3 + ${logback.version} + + + ch.qos.logback + logback-core + ${logback.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} - @@ -280,16 +314,28 @@ - - - + + + - - + + - + @@ -344,35 +390,35 @@ - - - org.apache.maven.plugins - maven-assembly-plugin - 2.3 - - - src/main/assembly/hadoop-job.xml - - - - com.baeldung.crunch.WordCount - - - - - - make-assembly - package - - single - - - - + + + org.apache.maven.plugins + maven-assembly-plugin + 2.3 + + + src/main/assembly/hadoop-job.xml + + + + com.baeldung.crunch.WordCount + + + + + + make-assembly + package + + single + + + + - + io.ebean @@ -429,7 +475,10 @@ 5.0.4 1.6.0.1 0.15.0 - 2.2.0 + 2.2.0 + 11.22.4 + 1.7.25 + 1.0.1 diff --git a/libraries-data/src/main/java/com/baeldung/ebean/app/App.java b/libraries-data/src/main/java/com/baeldung/ebean/app/App.java index 161bf1e820..44a4fa8562 100644 --- a/libraries-data/src/main/java/com/baeldung/ebean/app/App.java +++ b/libraries-data/src/main/java/com/baeldung/ebean/app/App.java @@ -28,7 +28,7 @@ public class App { } public static void crudOperations() { - + Address a1 = new Address("5, Wide Street", null, "New York"); Customer c1 = new Customer("John Wide", a1); diff --git a/libraries-data/src/main/java/com/baeldung/ebean/model/Address.java b/libraries-data/src/main/java/com/baeldung/ebean/model/Address.java index 362e27c32a..dfcd90ffa7 100644 --- a/libraries-data/src/main/java/com/baeldung/ebean/model/Address.java +++ b/libraries-data/src/main/java/com/baeldung/ebean/model/Address.java @@ -3,7 +3,7 @@ package com.baeldung.ebean.model; import javax.persistence.Entity; @Entity -public class Address extends BaseModel{ +public class Address extends BaseModel { public Address(String addressLine1, String addressLine2, String city) { super(); @@ -11,32 +11,38 @@ public class Address extends BaseModel{ this.addressLine2 = addressLine2; this.city = city; } - + private String addressLine1; private String addressLine2; private String city; - + public String getAddressLine1() { return addressLine1; } + public void setAddressLine1(String addressLine1) { this.addressLine1 = addressLine1; } + public String getAddressLine2() { return addressLine2; } + public void setAddressLine2(String addressLine2) { this.addressLine2 = addressLine2; } + public String getCity() { return city; } + public void setCity(String city) { this.city = city; } + @Override public String toString() { return "Address [id=" + id + ", addressLine1=" + addressLine1 + ", addressLine2=" + addressLine2 + ", city=" + city + "]"; } - + } diff --git a/libraries-data/src/main/java/com/baeldung/ebean/model/BaseModel.java b/libraries-data/src/main/java/com/baeldung/ebean/model/BaseModel.java index 1390507605..547d5bf075 100644 --- a/libraries-data/src/main/java/com/baeldung/ebean/model/BaseModel.java +++ b/libraries-data/src/main/java/com/baeldung/ebean/model/BaseModel.java @@ -14,13 +14,13 @@ public abstract class BaseModel { @Id protected long id; - + @Version protected long version; - + @WhenCreated protected Instant createdOn; - + @WhenModified protected Instant modifiedOn; @@ -55,5 +55,5 @@ public abstract class BaseModel { public void setVersion(long version) { this.version = version; } - + } diff --git a/libraries-data/src/main/resources/application.properties b/libraries-data/src/main/resources/ebean.properties similarity index 100% rename from libraries-data/src/main/resources/application.properties rename to libraries-data/src/main/resources/ebean.properties diff --git a/libraries-data/src/main/resources/logback.xml b/libraries-data/src/main/resources/logback.xml index 7d900d8ea8..21f797ed71 100644 --- a/libraries-data/src/main/resources/logback.xml +++ b/libraries-data/src/main/resources/logback.xml @@ -1,13 +1,22 @@ - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries-data/src/main/resources/logback.yml b/libraries-data/src/main/resources/logback.yml deleted file mode 100644 index c838a19c6c..0000000000 --- a/libraries-data/src/main/resources/logback.yml +++ /dev/null @@ -1,3 +0,0 @@ - - - From 178c9435e973dfa573e1a208f1ca1ec4719a8753 Mon Sep 17 00:00:00 2001 From: moisko Date: Mon, 30 Jul 2018 10:30:46 +0300 Subject: [PATCH 23/55] BAEL2212: implement insertion sort in imperative and recursive way --- .../insertionsort/InsertionSort.java | 41 +++++++++++++++++++ .../insertionsort/InsertionSortUnitTest.java | 26 ++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java create mode 100644 algorithms/src/test/java/algorithms/insertionsort/InsertionSortUnitTest.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java b/algorithms/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java new file mode 100644 index 0000000000..02dd485cf1 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/insertionsort/InsertionSort.java @@ -0,0 +1,41 @@ +package com.baeldung.algorithms.insertionsort; + +public class InsertionSort { + + public static void insertionSortImperative(int[] input) { + for (int i = 1; i < input.length; i++) { + int key = input[i]; + int j = i - 1; + while (j >= 0 && input[j] > key) { + input[j + 1] = input[j]; + j = j - 1; + } + input[j + 1] = key; + } + } + + public static void insertionSortRecursive(int[] input) { + insertionSortRecursive(input, input.length); + } + + private static void insertionSortRecursive(int[] input, int i) { + // base case + if (i <= 1) { + return; + } + + // sort the first i - 1 elements of the array + insertionSortRecursive(input, i - 1); + + // then find the correct position of the element at position i + int key = input[i - 1]; + int j = i - 2; + // shifting the elements from their position by 1 + while (j >= 0 && input[j] > key) { + input[j + 1] = input[j]; + j = j - 1; + } + // inserting the key at the appropriate position + input[j + 1] = key; + } +} diff --git a/algorithms/src/test/java/algorithms/insertionsort/InsertionSortUnitTest.java b/algorithms/src/test/java/algorithms/insertionsort/InsertionSortUnitTest.java new file mode 100644 index 0000000000..a5d19cb41d --- /dev/null +++ b/algorithms/src/test/java/algorithms/insertionsort/InsertionSortUnitTest.java @@ -0,0 +1,26 @@ +package algorithms.insertionsort; + +import com.baeldung.algorithms.insertionsort.InsertionSort; +import org.junit.Test; + +import static org.junit.Assert.assertArrayEquals; + +public class InsertionSortUnitTest { + + @Test + public void givenUnsortedArray_whenInsertionSortImperatively_thenItIsSortedInAscendingOrder() { + int[] input = {6, 2, 3, 4, 5, 1}; + InsertionSort.insertionSortImperative(input); + int[] expected = {1, 2, 3, 4, 5, 6}; + assertArrayEquals("the two arrays are not equal", expected, input); + } + + @Test + public void givenUnsortedArray_whenInsertionSortRecursively_thenItIsSortedInAscendingOrder() { + // int[] input = {6, 4, 5, 2, 3, 1}; + int[] input = {6, 4}; + InsertionSort.insertionSortRecursive(input); + int[] expected = {1, 2, 3, 4, 5, 6}; + assertArrayEquals("the two arrays are not equal", expected, input); + } +} From 11dd36cb1a3b41da9b97720c71b4af27e8de56e0 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Mon, 8 Oct 2018 14:52:59 +0100 Subject: [PATCH 24/55] Adding files for the article BAEL-2257: Guide to OutputStream (#5386) --- .../baeldung/stream/OutputStreamExamples.java | 48 ++++++++++++ .../stream/OutputStreamExamplesTest.java | 76 +++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 core-java-io/src/main/java/com/baeldung/stream/OutputStreamExamples.java create mode 100644 core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesTest.java diff --git a/core-java-io/src/main/java/com/baeldung/stream/OutputStreamExamples.java b/core-java-io/src/main/java/com/baeldung/stream/OutputStreamExamples.java new file mode 100644 index 0000000000..c7168c5b26 --- /dev/null +++ b/core-java-io/src/main/java/com/baeldung/stream/OutputStreamExamples.java @@ -0,0 +1,48 @@ +package com.baeldung.stream; + +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; + +public class OutputStreamExamples { + + public void fileOutputStreamByteSequence(String file, String data) throws IOException { + byte[] bytes = data.getBytes(); + try (OutputStream out = new FileOutputStream(file)) { + out.write(bytes); + } + } + + public void fileOutputStreamByteSubSequence(String file, String data) throws IOException { + byte[] bytes = data.getBytes(); + try (OutputStream out = new FileOutputStream(file)) { + out.write(bytes, 6, 5); + } + } + + public void fileOutputStreamByteSingle(String file, String data) throws IOException { + byte[] bytes = data.getBytes(); + try (OutputStream out = new FileOutputStream(file)) { + out.write(bytes[6]); + } + } + + public void bufferedOutputStream(String file, String... data) throws IOException { + try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) { + for (String s : data) { + out.write(s.getBytes()); + out.write(" ".getBytes()); + } + } + } + + public void outputStreamWriter(String file, String data) throws IOException { + try (OutputStream out = new FileOutputStream(file); Writer writer = new OutputStreamWriter(out, "UTF-8")) { + writer.write(data); + } + } + +} diff --git a/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesTest.java b/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesTest.java new file mode 100644 index 0000000000..4ae1ce9aa7 --- /dev/null +++ b/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesTest.java @@ -0,0 +1,76 @@ +package com.baeldung.stream; + +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; + +public class OutputStreamExamplesTest { + + StringBuilder filePath = new StringBuilder(); + + @Before + public void init() { + filePath.append("src"); + filePath.append(File.separator); + filePath.append("test"); + filePath.append(File.separator); + filePath.append("resources"); + filePath.append(File.separator); + filePath.append("output_file.txt"); + } + + @Test + public void givenOutputStream_whenWriteSingleByteCalled_thenOutputCreated() throws IOException { + + final File file = new File(filePath.toString()); + OutputStreamExamples examples = new OutputStreamExamples(); + examples.fileOutputStreamByteSingle(filePath.toString(), "Hello World!"); + assertTrue(file.exists()); + file.delete(); + } + + @Test + public void givenOutputStream_whenWriteByteSequenceCalled_thenOutputCreated() throws IOException { + + final File file = new File(filePath.toString()); + OutputStreamExamples examples = new OutputStreamExamples(); + examples.fileOutputStreamByteSequence(filePath.toString(), "Hello World!"); + assertTrue(file.exists()); + file.delete(); + } + + @Test + public void givenOutputStream_whenWriteByteSubSequenceCalled_thenOutputCreated() throws IOException { + + final File file = new File(filePath.toString()); + OutputStreamExamples examples = new OutputStreamExamples(); + examples.fileOutputStreamByteSubSequence(filePath.toString(), "Hello World!"); + assertTrue(file.exists()); + file.delete(); + } + + @Test + public void givenBufferedOutputStream_whenCalled_thenOutputCreated() throws IOException { + + final File file = new File(filePath.toString()); + OutputStreamExamples examples = new OutputStreamExamples(); + examples.bufferedOutputStream(filePath.toString(), "Hello", "World!"); + assertTrue(file.exists()); + file.delete(); + } + + @Test + public void givenOutputStreamWriter_whenCalled_thenOutputCreated() throws IOException { + + final File file = new File(filePath.toString()); + OutputStreamExamples examples = new OutputStreamExamples(); + examples.outputStreamWriter(filePath.toString(), "Hello World!"); + assertTrue(file.exists()); + file.delete(); + } + +} From 37896ced0ea040b8c9111e2b21458ac88e9a6e8a Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 8 Oct 2018 23:09:44 +0300 Subject: [PATCH 25/55] remove diff-dates module --- .../com/baeldung/date/DateDiffUnitTest.java | 13 ++++ java-difference-date/README.md | 5 -- java-difference-date/pom.xml | 36 ----------- .../java/com/baeldung/DateDiffUnitTest.java | 61 ------------------- pom.xml | 2 - 5 files changed, 13 insertions(+), 104 deletions(-) delete mode 100644 java-difference-date/README.md delete mode 100644 java-difference-date/pom.xml delete mode 100644 java-difference-date/src/test/java/com/baeldung/DateDiffUnitTest.java diff --git a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java index 545009a2a9..58d192bfdb 100644 --- a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java @@ -5,7 +5,9 @@ import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Duration; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.Period; import java.util.Date; import java.util.Locale; import java.util.TimeZone; @@ -26,6 +28,17 @@ public class DateDiffUnitTest { assertEquals(diff, 6); } + + @Test + public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() { + LocalDate now = LocalDate.now(); + LocalDate sixDaysBehind = now.minusDays(6); + + Period period = Period.between(now, sixDaysBehind); + int diff = period.getDays(); + + assertEquals(diff, 6); + } @Test public void givenTwoDateTimesInJava8_whenDifferentiating_thenWeGetSix() { diff --git a/java-difference-date/README.md b/java-difference-date/README.md deleted file mode 100644 index 2a024c27a2..0000000000 --- a/java-difference-date/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## Relevant articles: - -- [Period and Duration in Java](http://www.baeldung.com/java-period-duration) -- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) -- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api) \ No newline at end of file diff --git a/java-difference-date/pom.xml b/java-difference-date/pom.xml deleted file mode 100644 index 8c87afc0a2..0000000000 --- a/java-difference-date/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - com.baeldung - java-difference-date - 0.0.1-SNAPSHOT - jar - java-difference-date - Difference between two dates in java - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - joda-time - joda-time - ${joda-time.version} - - - com.darwinsys - hirondelle-date4j - ${hirondelle-date4j.version} - - - - - 2.9.9 - 1.5.1 - - - diff --git a/java-difference-date/src/test/java/com/baeldung/DateDiffUnitTest.java b/java-difference-date/src/test/java/com/baeldung/DateDiffUnitTest.java deleted file mode 100644 index 2c5323be6f..0000000000 --- a/java-difference-date/src/test/java/com/baeldung/DateDiffUnitTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung; - -import org.joda.time.DateTime; -import org.junit.Test; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.Duration; -import java.time.ZonedDateTime; -import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; -import java.util.concurrent.TimeUnit; - -import static org.junit.Assert.assertEquals; - -public class DateDiffUnitTest { - @Test - public void givenTwoDatesBeforeJava8_whenDifferentiating_thenWeGetSix() throws ParseException { - SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH); - Date firstDate = sdf.parse("06/24/2017"); - Date secondDate = sdf.parse("06/30/2017"); - - long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime()); - long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); - - assertEquals(diff, 6); - } - - @Test - public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() { - ZonedDateTime now = ZonedDateTime.now(); - ZonedDateTime sixDaysBehind = now.minusDays(6); - - Duration duration = Duration.between(now, sixDaysBehind); - long diff = Math.abs(duration.toDays()); - - assertEquals(diff, 6); - } - - @Test - public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() { - DateTime now = DateTime.now(); - DateTime sixDaysBehind = now.minusDays(6); - - org.joda.time.Duration duration = new org.joda.time.Duration(now, sixDaysBehind); - long diff = Math.abs(duration.getStandardDays()); - - assertEquals(diff, 6); - } - - @Test - public void givenTwoDatesInDate4j_whenDifferentiating_thenWeGetSix() { - hirondelle.date4j.DateTime now = hirondelle.date4j.DateTime.now(TimeZone.getDefault()); - hirondelle.date4j.DateTime sixDaysBehind = now.minusDays(6); - - long diff = Math.abs(now.numDaysFrom(sixDaysBehind)); - - assertEquals(diff, 6); - } -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index ef34881cef..569b6a62be 100644 --- a/pom.xml +++ b/pom.xml @@ -665,7 +665,6 @@ dubbo flyway - java-difference-date jni jooby @@ -1138,7 +1137,6 @@ dubbo flyway - java-difference-date jni jooby From 45da250fffffffae062047e43973416232872624 Mon Sep 17 00:00:00 2001 From: clininger Date: Mon, 8 Oct 2018 07:33:16 +0700 Subject: [PATCH 26/55] BAEL-2184 Converting a Collection to ArrayList --- .../convertcollectiontoarraylist/Foo.java | 52 +++++++ .../FooUnitTest.java | 144 ++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java create mode 100644 core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java diff --git a/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java b/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java new file mode 100644 index 0000000000..3123295641 --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java @@ -0,0 +1,52 @@ +package com.baeldung.convertcollectiontoarraylist; + +/** + * This POJO is the element type of our collection. It has a deepCopy() method. + * + * @author chris + */ +public class Foo { + + private int id; + private String name; + private Foo parent; + + public Foo() { + } + + public Foo(int id, String name, Foo parent) { + this.id = id; + this.name = name; + this.parent = parent; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Foo getParent() { + return parent; + } + + public void setParent(Foo parent) { + this.parent = parent; + } + + public Foo deepCopy() { + return new Foo(this.id, this.name, + this.parent != null ? this.parent.deepCopy() : null); + } + +} diff --git a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java new file mode 100644 index 0000000000..fd07848383 --- /dev/null +++ b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java @@ -0,0 +1,144 @@ +package com.baeldung.convertcollectiontoarraylist; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Iterator; +import static java.util.stream.Collectors.toCollection; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author chris + */ +public class FooUnitTest { + private static Collection srcCollection = new HashSet<>(); + + public FooUnitTest() { + } + + @BeforeClass + public static void setUpClass() { + int i = 0; + Foo john = new Foo(i++, "John", null); + Foo mary = new Foo(i++, "Mary", null); + Foo sam = new Foo(i++, "Sam", john); + Foo alice = new Foo(i++, "Alice", john); + Foo buffy = new Foo(i++, "Buffy", sam); + srcCollection.add(john); + srcCollection.add(mary); + srcCollection.add(sam); + srcCollection.add(alice); + srcCollection.add(buffy); + } + + /** + * Section 3. Using the ArrayList Constructor + */ + @Test + public void testConstructor() { + ArrayList newList = new ArrayList<>(srcCollection); + verifyShallowCopy(srcCollection, newList); + } + + /** + * Section 4. Using the Streams API + */ + @Test + public void testStream() { + ArrayList newList = srcCollection.stream().collect(toCollection(ArrayList::new)); + verifyShallowCopy(srcCollection, newList); + } + + /** + * Section 5. Deep Copy + */ + @Test + public void testStreamDeepCopy() { + ArrayList newList = srcCollection.stream() + .map(foo -> foo.deepCopy()) + .collect(toCollection(ArrayList::new)); + verifyDeepCopy(srcCollection, newList); + } + + /** + * Section 6. Controlling the List Order + */ + @Test + public void testSortOrder() { + assertFalse("Oops: source collection is already sorted!", isSorted(srcCollection)); + ArrayList newList = srcCollection.stream() + .map(foo -> foo.deepCopy()) + .sorted(Comparator.comparing(Foo::getName)) + .collect(toCollection(ArrayList::new)); + assertTrue("ArrayList is not sorted by name", isSorted(newList)); + } + + /** + * Verify that the contents of the two collections are the same + * @param a + * @param b + */ + private void verifyShallowCopy(Collection a, Collection b) { + assertEquals("Collections have different lengths", a.size(), b.size()); + Iterator iterA = a.iterator(); + Iterator iterB = b.iterator(); + while (iterA.hasNext()) { + // use '==' to test instance identity + assertTrue("Foo instances differ!", iterA.next() == iterB.next()); + } + } + + /** + * Verify that the contents of the two collections are the same + * @param a + * @param b + */ + private void verifyDeepCopy(Collection a, Collection b) { + assertEquals("Collections have different lengths", a.size(), b.size()); + Iterator iterA = a.iterator(); + Iterator iterB = b.iterator(); + while (iterA.hasNext()) { + Foo nextA = iterA.next(); + Foo nextB = iterB.next(); + // should not be same instance + assertFalse("Foo instances are the same!", nextA == nextB); + // but should have same content + assertFalse("Foo instances have different content!", fooDiff(nextA, nextB)); + } + } + + /** + * Return true if the contents of a and b differ. Test parent recursively + * @param a + * @param b + * @return False if the two items are the same + */ + private boolean fooDiff(Foo a, Foo b) { + if (a != null && b != null) { + return a.getId() != b.getId() + || !a.getName().equals(b.getName()) + || fooDiff(a.getParent(), b.getParent()); + } + return !(a == null && b == null); + } + + /** + * @param c collection of Foo + * @return true if the collection is sorted by name + */ + private boolean isSorted(Collection c) { + String prevName = null; + for (Foo foo : c) { + if (prevName == null || foo.getName().compareTo(prevName) > 0) { + prevName = foo.getName(); + } else { + return false; + } + } + return true; + } +} From 7d64241f1634ebf68688a81bb431b7b90d704f68 Mon Sep 17 00:00:00 2001 From: clininger Date: Mon, 8 Oct 2018 08:21:35 +0700 Subject: [PATCH 27/55] BAEL-2184 test names --- .../convertcollectiontoarraylist/FooUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java index fd07848383..5b46434a0b 100644 --- a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java +++ b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java @@ -39,7 +39,7 @@ public class FooUnitTest { * Section 3. Using the ArrayList Constructor */ @Test - public void testConstructor() { + public void whenUsingConstructor_thenVerifyShallowCopy() { ArrayList newList = new ArrayList<>(srcCollection); verifyShallowCopy(srcCollection, newList); } @@ -48,7 +48,7 @@ public class FooUnitTest { * Section 4. Using the Streams API */ @Test - public void testStream() { + public void whenUsingStream_thenVerifyShallowCopy() { ArrayList newList = srcCollection.stream().collect(toCollection(ArrayList::new)); verifyShallowCopy(srcCollection, newList); } @@ -57,7 +57,7 @@ public class FooUnitTest { * Section 5. Deep Copy */ @Test - public void testStreamDeepCopy() { + public void whenUsingDeepCopy_thenVerifyDeepCopy() { ArrayList newList = srcCollection.stream() .map(foo -> foo.deepCopy()) .collect(toCollection(ArrayList::new)); @@ -68,7 +68,7 @@ public class FooUnitTest { * Section 6. Controlling the List Order */ @Test - public void testSortOrder() { + public void whenUsingSortedStream_thenVerifySortOrder() { assertFalse("Oops: source collection is already sorted!", isSorted(srcCollection)); ArrayList newList = srcCollection.stream() .map(foo -> foo.deepCopy()) From 3c0bd8e6e8a5f6db610e65270eb4bcb0c1b8813f Mon Sep 17 00:00:00 2001 From: clininger Date: Mon, 8 Oct 2018 08:42:33 +0700 Subject: [PATCH 28/55] BAEL-2184 formatting --- .../com/baeldung/convertcollectiontoarraylist/Foo.java | 4 ++-- .../convertcollectiontoarraylist/FooUnitTest.java | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java b/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java index 3123295641..5c9464182e 100644 --- a/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java +++ b/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java @@ -45,8 +45,8 @@ public class Foo { } public Foo deepCopy() { - return new Foo(this.id, this.name, - this.parent != null ? this.parent.deepCopy() : null); + return new Foo( + this.id, this.name, this.parent != null ? this.parent.deepCopy() : null); } } diff --git a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java index 5b46434a0b..2b5751ef9e 100644 --- a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java +++ b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java @@ -33,6 +33,9 @@ public class FooUnitTest { srcCollection.add(sam); srcCollection.add(alice); srcCollection.add(buffy); + + // make sure the collection isn't sorted accidentally + assertFalse("Oops: source collection is already sorted!", isSorted(srcCollection)); } /** @@ -50,6 +53,7 @@ public class FooUnitTest { @Test public void whenUsingStream_thenVerifyShallowCopy() { ArrayList newList = srcCollection.stream().collect(toCollection(ArrayList::new)); + verifyShallowCopy(srcCollection, newList); } @@ -61,6 +65,7 @@ public class FooUnitTest { ArrayList newList = srcCollection.stream() .map(foo -> foo.deepCopy()) .collect(toCollection(ArrayList::new)); + verifyDeepCopy(srcCollection, newList); } @@ -69,11 +74,11 @@ public class FooUnitTest { */ @Test public void whenUsingSortedStream_thenVerifySortOrder() { - assertFalse("Oops: source collection is already sorted!", isSorted(srcCollection)); ArrayList newList = srcCollection.stream() .map(foo -> foo.deepCopy()) .sorted(Comparator.comparing(Foo::getName)) .collect(toCollection(ArrayList::new)); + assertTrue("ArrayList is not sorted by name", isSorted(newList)); } @@ -130,7 +135,7 @@ public class FooUnitTest { * @param c collection of Foo * @return true if the collection is sorted by name */ - private boolean isSorted(Collection c) { + private static boolean isSorted(Collection c) { String prevName = null; for (Foo foo : c) { if (prevName == null || foo.getName().compareTo(prevName) > 0) { From 7538a4b534a22993e1f3e3eaa73fc55821bc6198 Mon Sep 17 00:00:00 2001 From: clininger Date: Tue, 9 Oct 2018 02:48:17 +0700 Subject: [PATCH 29/55] BAEL-2184 ignore netbeans project files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 180462a32f..7fe2778755 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,5 @@ jmeter/src/main/resources/*-JMeter.csv **/dist **/tmp **/out-tsc +**/nbproject/ +**/nb-configuration.xml \ No newline at end of file From 6d67e16b3978815e658a0c20d9ea6742e0ad9f73 Mon Sep 17 00:00:00 2001 From: Alejandro Gervasio Date: Mon, 8 Oct 2018 23:37:37 -0300 Subject: [PATCH 30/55] BAEL-2253 - Difference Between @NotNull, @NotEmpty and @NotBlank Constraints in Bean Validation (#5399) * Initial Commit * Update UserNotBlankUnitTest.java * Update UserNotEmptyUnitTest.java * Update UserNotNullUnitTest.java * Update pom.xml * Update pom.xml * Update pom.xml --- javaxval/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 63cb4c1d1d..86a7e6955b 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -63,11 +63,11 @@ 2.0.1.Final - 6.0.7.Final + 6.0.13.Final 3.0.0 - 2.2.6 + 3.0.0 5.0.2.RELEASE 4.12 3.11.1 - \ No newline at end of file + From ed2a28585ce6101783fd802ded7aafce7651b7a9 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Tue, 9 Oct 2018 13:10:13 +0300 Subject: [PATCH 31/55] fix unit test --- .../algorithms/insertionsort/InsertionSortUnitTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) rename algorithms/src/test/java/{ => com/baeldung}/algorithms/insertionsort/InsertionSortUnitTest.java (66%) diff --git a/algorithms/src/test/java/algorithms/insertionsort/InsertionSortUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java similarity index 66% rename from algorithms/src/test/java/algorithms/insertionsort/InsertionSortUnitTest.java rename to algorithms/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java index a5d19cb41d..b3d7e8c534 100644 --- a/algorithms/src/test/java/algorithms/insertionsort/InsertionSortUnitTest.java +++ b/algorithms/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java @@ -1,4 +1,4 @@ -package algorithms.insertionsort; +package com.baeldung.algorithms.insertionsort; import com.baeldung.algorithms.insertionsort.InsertionSort; import org.junit.Test; @@ -8,7 +8,7 @@ import static org.junit.Assert.assertArrayEquals; public class InsertionSortUnitTest { @Test - public void givenUnsortedArray_whenInsertionSortImperatively_thenItIsSortedInAscendingOrder() { + public void givenUnsortedArray_whenInsertionSortImperative_thenSortedAsc() { int[] input = {6, 2, 3, 4, 5, 1}; InsertionSort.insertionSortImperative(input); int[] expected = {1, 2, 3, 4, 5, 6}; @@ -16,9 +16,8 @@ public class InsertionSortUnitTest { } @Test - public void givenUnsortedArray_whenInsertionSortRecursively_thenItIsSortedInAscendingOrder() { - // int[] input = {6, 4, 5, 2, 3, 1}; - int[] input = {6, 4}; + public void givenUnsortedArray_whenInsertionSortRecursive_thenSortedAsc() { + int[] input = {6, 4, 5, 2, 3, 1}; InsertionSort.insertionSortRecursive(input); int[] expected = {1, 2, 3, 4, 5, 6}; assertArrayEquals("the two arrays are not equal", expected, input); From ee1b2cb40bd8158f8f5798d2a04efbd45afca225 Mon Sep 17 00:00:00 2001 From: clininger Date: Tue, 9 Oct 2018 21:20:09 +0700 Subject: [PATCH 32/55] BAEL-2184 sorted test not include deep copy --- .../com/baeldung/convertcollectiontoarraylist/FooUnitTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java index 2b5751ef9e..5be4121bc7 100644 --- a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java +++ b/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java @@ -75,7 +75,6 @@ public class FooUnitTest { @Test public void whenUsingSortedStream_thenVerifySortOrder() { ArrayList newList = srcCollection.stream() - .map(foo -> foo.deepCopy()) .sorted(Comparator.comparing(Foo::getName)) .collect(toCollection(ArrayList::new)); From 12c41c3531c5a00123040825a1e0ee798947b801 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 9 Oct 2018 20:40:58 +0530 Subject: [PATCH 33/55] BAEL-9148 Fix Java EE Annotations Project - Removed spring security related code from jee-7 project --- jee-7/README.md | 2 - .../springSecurity/ApplicationConfig.java | 13 ------ .../SecurityWebApplicationInitializer.java | 10 ---- .../springSecurity/SpringSecurityConfig.java | 46 ------------------- .../controller/HomeController.java | 28 ----------- .../controller/LoginController.java | 15 ------ .../main/webapp/WEB-INF/spring/security.xml | 23 ---------- jee-7/src/main/webapp/WEB-INF/views/admin.jsp | 12 ----- jee-7/src/main/webapp/WEB-INF/views/home.jsp | 26 ----------- jee-7/src/main/webapp/WEB-INF/views/login.jsp | 26 ----------- jee-7/src/main/webapp/WEB-INF/views/user.jsp | 12 ----- jee-7/src/main/webapp/WEB-INF/web.xml | 5 +- jee-7/src/main/webapp/index.jsp | 11 ----- jee-7/src/main/webapp/secure.jsp | 24 ---------- 14 files changed, 4 insertions(+), 249 deletions(-) delete mode 100755 jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java delete mode 100644 jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java delete mode 100644 jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java delete mode 100644 jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java delete mode 100644 jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java delete mode 100644 jee-7/src/main/webapp/WEB-INF/spring/security.xml delete mode 100644 jee-7/src/main/webapp/WEB-INF/views/admin.jsp delete mode 100644 jee-7/src/main/webapp/WEB-INF/views/home.jsp delete mode 100644 jee-7/src/main/webapp/WEB-INF/views/login.jsp delete mode 100644 jee-7/src/main/webapp/WEB-INF/views/user.jsp delete mode 100644 jee-7/src/main/webapp/index.jsp delete mode 100644 jee-7/src/main/webapp/secure.jsp diff --git a/jee-7/README.md b/jee-7/README.md index f0bd65fdf2..a2493e561b 100644 --- a/jee-7/README.md +++ b/jee-7/README.md @@ -5,5 +5,3 @@ - [Introduction to JAX-WS](http://www.baeldung.com/jax-ws) - [A Guide to Java EE Web-Related Annotations](http://www.baeldung.com/javaee-web-annotations) - [Introduction to Testing with Arquillian](http://www.baeldung.com/arquillian) -- [Securing Java EE with Spring Security](http://www.baeldung.com/java-ee-spring-security) -- [A Guide to Java EE Web-Related Annotations](https://www.baeldung.com/javaee-web-annotations) \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java b/jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java deleted file mode 100755 index f8e7982253..0000000000 --- a/jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.springSecurity; - -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; - -/** - * Application class required by JAX-RS. If you don't want to have any - * prefix in the URL, you can set the application path to "/". - */ -@ApplicationPath("/") -public class ApplicationConfig extends Application { - -} diff --git a/jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java b/jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java deleted file mode 100644 index e6a05f7b71..0000000000 --- a/jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.springSecurity; - -import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; - -public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { - - public SecurityWebApplicationInitializer() { - super(SpringSecurityConfig.class); - } -} diff --git a/jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java b/jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java deleted file mode 100644 index bda8930f36..0000000000 --- a/jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.springSecurity; - -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 SpringSecurityConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .inMemoryAuthentication() - .withUser("user1") - .password("user1Pass") - .roles("USER") - .and() - .withUser("admin") - .password("adminPass") - .roles("ADMIN"); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .csrf() - .disable() - .authorizeRequests() - .antMatchers("/auth/login*") - .anonymous() - .antMatchers("/home/admin*") - .hasRole("ADMIN") - .anyRequest() - .authenticated() - .and() - .formLogin() - .loginPage("/auth/login") - .defaultSuccessUrl("/home", true) - .failureUrl("/auth/login?error=true") - .and() - .logout() - .logoutSuccessUrl("/auth/login"); - } -} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java b/jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java deleted file mode 100644 index 53fd9f4b81..0000000000 --- a/jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.springSecurity.controller; - -import javax.mvc.annotation.Controller; -import javax.ws.rs.GET; -import javax.ws.rs.Path; - -@Path("/home") -@Controller -public class HomeController { - - @GET - public String home() { - return "home.jsp"; - } - - @GET - @Path("/user") - public String admin() { - return "user.jsp"; - } - - @GET - @Path("/admin") - public String user() { - return "admin.jsp"; - } - -} diff --git a/jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java b/jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java deleted file mode 100644 index a7e7bb471d..0000000000 --- a/jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.springSecurity.controller; - -import javax.mvc.annotation.Controller; -import javax.ws.rs.GET; -import javax.ws.rs.Path; - -@Path("/auth/login") -@Controller -public class LoginController { - - @GET - public String login() { - return "login.jsp"; - } -} diff --git a/jee-7/src/main/webapp/WEB-INF/spring/security.xml b/jee-7/src/main/webapp/WEB-INF/spring/security.xml deleted file mode 100644 index 777cd9461f..0000000000 --- a/jee-7/src/main/webapp/WEB-INF/spring/security.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/jee-7/src/main/webapp/WEB-INF/views/admin.jsp b/jee-7/src/main/webapp/WEB-INF/views/admin.jsp deleted file mode 100644 index b83ea09f5b..0000000000 --- a/jee-7/src/main/webapp/WEB-INF/views/admin.jsp +++ /dev/null @@ -1,12 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> - - - - -

Welcome to the ADMIN page

- - ">Logout - - - \ No newline at end of file diff --git a/jee-7/src/main/webapp/WEB-INF/views/home.jsp b/jee-7/src/main/webapp/WEB-INF/views/home.jsp deleted file mode 100644 index c6e129c9ce..0000000000 --- a/jee-7/src/main/webapp/WEB-INF/views/home.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> - - - - -

This is the body of the sample view

- - - This text is only visible to a user -

- ">Restricted Admin Page -

-
- - - This text is only visible to an admin -
- ">Admin Page -
-
- - ">Logout - - - \ No newline at end of file diff --git a/jee-7/src/main/webapp/WEB-INF/views/login.jsp b/jee-7/src/main/webapp/WEB-INF/views/login.jsp deleted file mode 100644 index d6f2e56f3a..0000000000 --- a/jee-7/src/main/webapp/WEB-INF/views/login.jsp +++ /dev/null @@ -1,26 +0,0 @@ - - - - -

Login

- -
- - - - - - - - - - - - - -
User:
Password:
- -
- - - \ No newline at end of file diff --git a/jee-7/src/main/webapp/WEB-INF/views/user.jsp b/jee-7/src/main/webapp/WEB-INF/views/user.jsp deleted file mode 100644 index 11b8155da7..0000000000 --- a/jee-7/src/main/webapp/WEB-INF/views/user.jsp +++ /dev/null @@ -1,12 +0,0 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> - - - - -

Welcome to the Restricted Admin page

- - ">Logout - - - \ No newline at end of file diff --git a/jee-7/src/main/webapp/WEB-INF/web.xml b/jee-7/src/main/webapp/WEB-INF/web.xml index 1bcbb96e24..e656ffc5be 100644 --- a/jee-7/src/main/webapp/WEB-INF/web.xml +++ b/jee-7/src/main/webapp/WEB-INF/web.xml @@ -1,5 +1,8 @@ - + 3.6.1 - 9 - 9 + 1.9 + 1.9 diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java b/java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java new file mode 100644 index 0000000000..355fef35c6 --- /dev/null +++ b/java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.zoneddatetime; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.logging.Logger; + +import org.junit.Test; + +public class ZonedDateTimeUnitTest { + + private static final Logger log = Logger.getLogger(ZonedDateTimeUnitTest.class.getName()); + + @Test + public void testZonedDateTimeToString() { + + ZonedDateTime zonedDateTimeNow = ZonedDateTime.now(ZoneId.of("UTC")); + ZonedDateTime zonedDateTimeOf = ZonedDateTime.of(2018, 01, 01, 0, 0, 0, 0, ZoneId.of("UTC")); + + LocalDateTime localDateTime = LocalDateTime.now(); + ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC")); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy - hh:mm:ss Z"); + String formattedString = zonedDateTime.format(formatter); + + DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/dd/yyyy - hh:mm:ss z"); + String formattedString2 = zonedDateTime.format(formatter2); + + log.info(formattedString); + log.info(formattedString2); + + } + + @Test + public void testZonedDateTimeFromString() { + + ZonedDateTime zonedDateTime = ZonedDateTime.parse("2011-12-03T10:15:30+01:00", DateTimeFormatter.ISO_ZONED_DATE_TIME); + + log.info(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME)); + } + +} From f916c468cdc15e9c9e08aff4700fc5406a2a2133 Mon Sep 17 00:00:00 2001 From: Josephine Barboza Date: Wed, 10 Oct 2018 16:51:44 +0530 Subject: [PATCH 42/55] BAEL-2169 Guide to Ebean --- libraries-data/pom.xml | 5 ----- libraries-data/src/main/resources/logback.xml | 12 +++--------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index e1318fd597..4b9701fe68 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -416,10 +416,6 @@ - - - - io.ebean ebean-maven-plugin @@ -439,7 +435,6 @@ - diff --git a/libraries-data/src/main/resources/logback.xml b/libraries-data/src/main/resources/logback.xml index 21f797ed71..9cce5fb855 100644 --- a/libraries-data/src/main/resources/logback.xml +++ b/libraries-data/src/main/resources/logback.xml @@ -7,15 +7,9 @@ - - - - - - - - - + + + From e83b7670548f576c54fc27328b47e53175a4b645 Mon Sep 17 00:00:00 2001 From: Josephine Barboza Date: Wed, 10 Oct 2018 19:12:51 +0530 Subject: [PATCH 43/55] Updated formatting --- libraries-data/pom.xml | 119 ++++++++---------- libraries-data/src/main/resources/logback.xml | 25 ++-- 2 files changed, 65 insertions(+), 79 deletions(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 4b9701fe68..6584ca6b23 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 libraries-data @@ -14,7 +13,6 @@ - com.esotericsoftware kryo @@ -101,49 +99,36 @@ org.datanucleus javax.jdo ${javax.jdo.version} - org.datanucleus datanucleus-core ${datanucleus.version} - org.datanucleus datanucleus-api-jdo ${datanucleus.version} - - org.datanucleus datanucleus-rdbms ${datanucleus.version} - org.datanucleus datanucleus-maven-plugin ${datanucleus-maven-plugin.version} - - - log4j - log4j - - org.datanucleus datanucleus-xml ${datanucleus-xml.version} - org.datanucleus datanucleus-jdo-query ${datanucleus-jdo-query.version} - @@ -156,13 +141,13 @@ hazelcast ${hazelcast.version} - + com.googlecode.jmapper-framework jmapper-core ${jmapper.version} - + org.apache.crunch crunch-core @@ -173,12 +158,6 @@ hadoop-client ${org.apache.hadoop.hadoop-client} provided - - - log4j - log4j - - @@ -314,28 +293,16 @@ - - - + + + - - + + - + @@ -390,7 +357,27 @@ - + + org.datanucleus + datanucleus-maven-plugin + ${datanucleus-maven-plugin.version} + + JDO + ${basedir}/datanucleus.properties + ${basedir}/log4j.properties + true + false + + + + + process-classes + + enhance + + + + org.apache.maven.plugins @@ -416,25 +403,25 @@ - - io.ebean - ebean-maven-plugin - 11.11.2 - - - - main - process-classes - - debug=1 - - - enhance - - - - - + + io.ebean + ebean-maven-plugin + 11.11.2 + + + + main + process-classes + + debug=1 + + + enhance + + + + + @@ -473,7 +460,7 @@ 2.2.0 11.22.4 1.7.25 - 1.0.1 + 1.0.1 - + \ No newline at end of file diff --git a/libraries-data/src/main/resources/logback.xml b/libraries-data/src/main/resources/logback.xml index 9cce5fb855..a57d22fcb2 100644 --- a/libraries-data/src/main/resources/logback.xml +++ b/libraries-data/src/main/resources/logback.xml @@ -1,16 +1,15 @@ - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file From 506a973c823f2d7dd0d871c27e1dd457810761b0 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 10 Oct 2018 19:43:24 +0530 Subject: [PATCH 44/55] BAEL-9148 Fix Java EE Annotations Project - Added new jee-7-security module that contains only security related code previously part of jee-7 module - Added new jee-7-security in parent pom.xml --- jee-7-security/README.md | 2 + jee-7-security/pom.xml | 102 ++++++++++++++++++ .../SecurityWebApplicationInitializer.java | 10 ++ .../springsecurity/SpringSecurityConfig.java | 46 ++++++++ .../controller/HomeController.java | 28 +++++ .../controller/LoginController.java | 16 +++ jee-7-security/src/main/resources/logback.xml | 13 +++ .../src/main/webapp/WEB-INF/beans.xml | 0 .../src/main/webapp/WEB-INF/faces-config.xml | 8 ++ .../main/webapp/WEB-INF/spring/security.xml | 23 ++++ .../src/main/webapp/WEB-INF/views/admin.jsp | 12 +++ .../src/main/webapp/WEB-INF/views/home.jsp | 26 +++++ .../src/main/webapp/WEB-INF/views/login.jsp | 26 +++++ .../src/main/webapp/WEB-INF/views/user.jsp | 12 +++ .../src/main/webapp/WEB-INF/web.xml | 71 ++++++++++++ jee-7-security/src/main/webapp/index.jsp | 11 ++ jee-7-security/src/main/webapp/secure.jsp | 24 +++++ pom.xml | 2 + 18 files changed, 432 insertions(+) create mode 100644 jee-7-security/README.md create mode 100644 jee-7-security/pom.xml create mode 100644 jee-7-security/src/main/java/com/baeldung/springsecurity/SecurityWebApplicationInitializer.java create mode 100644 jee-7-security/src/main/java/com/baeldung/springsecurity/SpringSecurityConfig.java create mode 100644 jee-7-security/src/main/java/com/baeldung/springsecurity/controller/HomeController.java create mode 100644 jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java create mode 100644 jee-7-security/src/main/resources/logback.xml create mode 100644 jee-7-security/src/main/webapp/WEB-INF/beans.xml create mode 100644 jee-7-security/src/main/webapp/WEB-INF/faces-config.xml create mode 100644 jee-7-security/src/main/webapp/WEB-INF/spring/security.xml create mode 100644 jee-7-security/src/main/webapp/WEB-INF/views/admin.jsp create mode 100644 jee-7-security/src/main/webapp/WEB-INF/views/home.jsp create mode 100644 jee-7-security/src/main/webapp/WEB-INF/views/login.jsp create mode 100644 jee-7-security/src/main/webapp/WEB-INF/views/user.jsp create mode 100644 jee-7-security/src/main/webapp/WEB-INF/web.xml create mode 100644 jee-7-security/src/main/webapp/index.jsp create mode 100644 jee-7-security/src/main/webapp/secure.jsp diff --git a/jee-7-security/README.md b/jee-7-security/README.md new file mode 100644 index 0000000000..314de6d957 --- /dev/null +++ b/jee-7-security/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Securing Java EE with Spring Security](http://www.baeldung.com/java-ee-spring-security) diff --git a/jee-7-security/pom.xml b/jee-7-security/pom.xml new file mode 100644 index 0000000000..622ca19903 --- /dev/null +++ b/jee-7-security/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + jee-7-security + 1.0-SNAPSHOT + war + jee-7-security + JavaEE 7 Spring Security Application + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + javax + javaee-api + ${javaee_api.version} + provided + + + com.sun.faces + jsf-api + ${com.sun.faces.jsf.version} + + + com.sun.faces + jsf-impl + ${com.sun.faces.jsf.version} + + + javax.servlet + jstl + ${jstl.version} + + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + + + javax.servlet.jsp + jsp-api + ${jsp-api.version} + provided + + + taglibs + standard + ${taglibs.standard.version} + + + + javax.mvc + javax.mvc-api + 1.0-pr + + + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + + + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + org.springframework.security + spring-security-taglibs + ${org.springframework.security.version} + + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + src/main/webapp + false + + + + + + + 7.0 + 2.2.14 + 2.2 + 1.1.2 + 4.2.3.RELEASE + + + diff --git a/jee-7-security/src/main/java/com/baeldung/springsecurity/SecurityWebApplicationInitializer.java b/jee-7-security/src/main/java/com/baeldung/springsecurity/SecurityWebApplicationInitializer.java new file mode 100644 index 0000000000..e3e2ed80e6 --- /dev/null +++ b/jee-7-security/src/main/java/com/baeldung/springsecurity/SecurityWebApplicationInitializer.java @@ -0,0 +1,10 @@ +package com.baeldung.springsecurity; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; + +public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { + + public SecurityWebApplicationInitializer() { + super(SpringSecurityConfig.class); + } +} diff --git a/jee-7-security/src/main/java/com/baeldung/springsecurity/SpringSecurityConfig.java b/jee-7-security/src/main/java/com/baeldung/springsecurity/SpringSecurityConfig.java new file mode 100644 index 0000000000..70be1f91ce --- /dev/null +++ b/jee-7-security/src/main/java/com/baeldung/springsecurity/SpringSecurityConfig.java @@ -0,0 +1,46 @@ +package com.baeldung.springsecurity; + +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 SpringSecurityConfig extends WebSecurityConfigurerAdapter { + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user1") + .password("user1Pass") + .roles("USER") + .and() + .withUser("admin") + .password("adminPass") + .roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .csrf() + .disable() + .authorizeRequests() + .antMatchers("/auth/login*") + .anonymous() + .antMatchers("/home/admin*") + .hasRole("ADMIN") + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage("/auth/login") + .defaultSuccessUrl("/home", true) + .failureUrl("/auth/login?error=true") + .and() + .logout() + .logoutSuccessUrl("/auth/login"); + } +} \ No newline at end of file diff --git a/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/HomeController.java b/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/HomeController.java new file mode 100644 index 0000000000..1662f38609 --- /dev/null +++ b/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/HomeController.java @@ -0,0 +1,28 @@ +package com.baeldung.springsecurity.controller; + +import javax.mvc.annotation.Controller; +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("/home") +@Controller +public class HomeController { + + @GET + public String home() { + return "home.jsp"; + } + + @GET + @Path("/user") + public String admin() { + return "user.jsp"; + } + + @GET + @Path("/admin") + public String user() { + return "admin.jsp"; + } + +} diff --git a/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java b/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java new file mode 100644 index 0000000000..a34abbfd2c --- /dev/null +++ b/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java @@ -0,0 +1,16 @@ +package com.baeldung.springsecurity.controller; + +import javax.mvc.annotation.Controller; +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("/login") +@Controller +public class LoginController { + + @GET + public String login() { + System.out.println("Login"); + return "login.jsp"; + } +} diff --git a/jee-7-security/src/main/resources/logback.xml b/jee-7-security/src/main/resources/logback.xml new file mode 100644 index 0000000000..c8c077ba1d --- /dev/null +++ b/jee-7-security/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/jee-7-security/src/main/webapp/WEB-INF/beans.xml b/jee-7-security/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/jee-7-security/src/main/webapp/WEB-INF/faces-config.xml b/jee-7-security/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000000..1f4085458f --- /dev/null +++ b/jee-7-security/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/WEB-INF/spring/security.xml b/jee-7-security/src/main/webapp/WEB-INF/spring/security.xml new file mode 100644 index 0000000000..777cd9461f --- /dev/null +++ b/jee-7-security/src/main/webapp/WEB-INF/spring/security.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/WEB-INF/views/admin.jsp b/jee-7-security/src/main/webapp/WEB-INF/views/admin.jsp new file mode 100644 index 0000000000..b83ea09f5b --- /dev/null +++ b/jee-7-security/src/main/webapp/WEB-INF/views/admin.jsp @@ -0,0 +1,12 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + +

Welcome to the ADMIN page

+ + ">Logout + + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/WEB-INF/views/home.jsp b/jee-7-security/src/main/webapp/WEB-INF/views/home.jsp new file mode 100644 index 0000000000..c6e129c9ce --- /dev/null +++ b/jee-7-security/src/main/webapp/WEB-INF/views/home.jsp @@ -0,0 +1,26 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + +

This is the body of the sample view

+ + + This text is only visible to a user +

+ ">Restricted Admin Page +

+
+ + + This text is only visible to an admin +
+ ">Admin Page +
+
+ + ">Logout + + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/WEB-INF/views/login.jsp b/jee-7-security/src/main/webapp/WEB-INF/views/login.jsp new file mode 100644 index 0000000000..d6f2e56f3a --- /dev/null +++ b/jee-7-security/src/main/webapp/WEB-INF/views/login.jsp @@ -0,0 +1,26 @@ + + + + +

Login

+ +
+ + + + + + + + + + + + + +
User:
Password:
+ +
+ + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/WEB-INF/views/user.jsp b/jee-7-security/src/main/webapp/WEB-INF/views/user.jsp new file mode 100644 index 0000000000..11b8155da7 --- /dev/null +++ b/jee-7-security/src/main/webapp/WEB-INF/views/user.jsp @@ -0,0 +1,12 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + +

Welcome to the Restricted Admin page

+ + ">Logout + + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/WEB-INF/web.xml b/jee-7-security/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..e656ffc5be --- /dev/null +++ b/jee-7-security/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,71 @@ + + + + + Faces Servlet + javax.faces.webapp.FacesServlet + + + Faces Servlet + *.jsf + + + javax.faces.PROJECT_STAGE + Development + + + State saving method: 'client' or 'server' (default). See JSF Specification section 2.5.2 + javax.faces.STATE_SAVING_METHOD + client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + index.jsf + welcome.jsf + index.html + index.jsp + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/index.jsp b/jee-7-security/src/main/webapp/index.jsp new file mode 100644 index 0000000000..93fef9713d --- /dev/null +++ b/jee-7-security/src/main/webapp/index.jsp @@ -0,0 +1,11 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Index Page + + + Non-secured Index Page +
+ Login + + \ No newline at end of file diff --git a/jee-7-security/src/main/webapp/secure.jsp b/jee-7-security/src/main/webapp/secure.jsp new file mode 100644 index 0000000000..0cadd2cd4f --- /dev/null +++ b/jee-7-security/src/main/webapp/secure.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %> + + + + + Home Page + + +

Home Page

+ +

+ Hello
+ Roles: +

+ +
+ + +
+ + \ No newline at end of file diff --git a/pom.xml b/pom.xml index ef34881cef..741391e09c 100644 --- a/pom.xml +++ b/pom.xml @@ -399,6 +399,7 @@ javafx jgroups jee-7 + jee-7-security jhipster jjwt jsf @@ -1303,6 +1304,7 @@ javafx jgroups jee-7 + jee-7-security jjwt jsf json-path From 6f619dec41a1ec14cc786c460fd4ab0ab58c01ae Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 10 Oct 2018 20:20:55 +0530 Subject: [PATCH 45/55] Update LoginController.java --- .../baeldung/springsecurity/controller/LoginController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java b/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java index a34abbfd2c..45d7ff3d2c 100644 --- a/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java +++ b/jee-7-security/src/main/java/com/baeldung/springsecurity/controller/LoginController.java @@ -4,13 +4,12 @@ import javax.mvc.annotation.Controller; import javax.ws.rs.GET; import javax.ws.rs.Path; -@Path("/login") +@Path("/auth/login") @Controller public class LoginController { @GET public String login() { - System.out.println("Login"); return "login.jsp"; } } From af818fddbf2793ae9dcfe8e324ded960e90b4786 Mon Sep 17 00:00:00 2001 From: Josephine Barboza Date: Wed, 10 Oct 2018 21:27:08 +0530 Subject: [PATCH 46/55] Upadated pom.xml --- libraries-data/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 6584ca6b23..bbf0c7832f 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -457,10 +457,10 @@ 5.0.4 1.6.0.1 0.15.0 - 2.2.0 + 2.2.0 11.22.4 1.7.25 - 1.0.1 + 1.0.1 - \ No newline at end of file + From 50ffa8118657386e61de03a7642033514db83cac Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 10 Oct 2018 20:04:51 +0300 Subject: [PATCH 47/55] add reactor core --- spring-data-mongodb/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index ad70d987bb..072ed7a2ac 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -34,6 +34,12 @@ ${mongodb-reactivestreams.version} + + io.projectreactor + reactor-core + ${projectreactor.version} + + io.projectreactor reactor-test @@ -109,6 +115,7 @@ 5.1.0.RELEASE 1.9.2 3.2.0.RELEASE + From 5ab63bb07b4fbbdd04932097f35d506590ec07aa Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 10 Oct 2018 20:16:49 +0300 Subject: [PATCH 48/55] fix javax el --- javaxval/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 86a7e6955b..0263fb68af 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -33,7 +33,7 @@ ${javax.el-api.version} - org.glassfish.web + org.glassfish javax.el ${javax.el.version} From 12b1a90a746a341834d831770ad905942ac1e9b8 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Wed, 10 Oct 2018 20:24:43 +0300 Subject: [PATCH 49/55] rebalancing the first and second default profiles --- pom.xml | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index 008d0aeac3..e6618da0a2 100644 --- a/pom.xml +++ b/pom.xml @@ -526,31 +526,6 @@ spring-resttemplate - spring-security-acl - spring-security-cache-control - spring-security-client/spring-security-jsp-authentication - spring-security-client/spring-security-jsp-authorize - spring-security-client/spring-security-jsp-config - spring-security-client/spring-security-mvc - spring-security-client/spring-security-thymeleaf-authentication - spring-security-client/spring-security-thymeleaf-authorize - spring-security-client/spring-security-thymeleaf-config - spring-security-core - spring-security-mvc-boot - spring-security-mvc-custom - spring-security-mvc-digest-auth - spring-security-mvc-ldap - spring-security-mvc-login - spring-security-mvc-persisted-remember-me - spring-security-mvc-session - spring-security-mvc-socket - spring-security-openid - - spring-security-rest-basic-auth - spring-security-rest-custom - spring-security-rest - spring-security-sso - spring-security-x509 @@ -719,7 +694,33 @@ - flyway-cdi-extension + flyway-cdi-extension + + spring-security-acl + spring-security-cache-control + spring-security-client/spring-security-jsp-authentication + spring-security-client/spring-security-jsp-authorize + spring-security-client/spring-security-jsp-config + spring-security-client/spring-security-mvc + spring-security-client/spring-security-thymeleaf-authentication + spring-security-client/spring-security-thymeleaf-authorize + spring-security-client/spring-security-thymeleaf-config + spring-security-core + spring-security-mvc-boot + spring-security-mvc-custom + spring-security-mvc-digest-auth + spring-security-mvc-ldap + spring-security-mvc-login + spring-security-mvc-persisted-remember-me + spring-security-mvc-session + spring-security-mvc-socket + spring-security-openid + + spring-security-rest-basic-auth + spring-security-rest-custom + spring-security-rest + spring-security-sso + spring-security-x509 From 26c9bdcc0d3bc2d6271b4c6ba3d0c90f8234bd96 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Wed, 10 Oct 2018 20:23:32 -0500 Subject: [PATCH 50/55] BAEL-2257: Renamed OutputStreamExamplesTest to *UnitTest --- ...tStreamExamplesTest.java => OutputStreamExamplesUnitTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core-java-io/src/test/java/com/baeldung/stream/{OutputStreamExamplesTest.java => OutputStreamExamplesUnitTest.java} (100%) diff --git a/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesTest.java b/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesUnitTest.java similarity index 100% rename from core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesTest.java rename to core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesUnitTest.java From e908b96eef76af840997567615047664d788aad7 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Wed, 10 Oct 2018 22:09:45 -0500 Subject: [PATCH 51/55] BAEL-2257: Renamed OutputStreamExamplesTest to *UnitTest --- .../java/com/baeldung/stream/OutputStreamExamplesUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesUnitTest.java b/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesUnitTest.java index 4ae1ce9aa7..aa949259a0 100644 --- a/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesUnitTest.java +++ b/core-java-io/src/test/java/com/baeldung/stream/OutputStreamExamplesUnitTest.java @@ -8,7 +8,7 @@ import java.io.IOException; import org.junit.Before; import org.junit.Test; -public class OutputStreamExamplesTest { +public class OutputStreamExamplesUnitTest { StringBuilder filePath = new StringBuilder(); From a915063c44f0d99966ba2e75ab8fd0e11453222a Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 11 Oct 2018 21:12:07 +0300 Subject: [PATCH 52/55] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index adb17ca7e5..8e0a5eb9ee 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,8 @@ In additional to Spring, the following technologies are in focus: `core Java`, ` Building the project ==================== To do the full build, do: `mvn install -Pdefault -Dgib.enabled=false` + + +Building a single module +==================== +To build a specific module run the command: `mvn clean install -Dgib.enabled=false` in the module directory From f824da90ba31a87f1331a3f4c36ae0f4fffc846e Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Fri, 12 Oct 2018 05:59:44 +0100 Subject: [PATCH 53/55] Converting DOM Document to File Issue: BAEL-2167 --- .../com/baeldung/xml/XMLDocumentWriter.java | 41 +++++++++++++++ .../xml/XMLDocumentWriterUnitTest.java | 52 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 xml/src/main/java/com/baeldung/xml/XMLDocumentWriter.java create mode 100644 xml/src/test/java/com/baeldung/xml/XMLDocumentWriterUnitTest.java diff --git a/xml/src/main/java/com/baeldung/xml/XMLDocumentWriter.java b/xml/src/main/java/com/baeldung/xml/XMLDocumentWriter.java new file mode 100644 index 0000000000..e33fc5fe1d --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/XMLDocumentWriter.java @@ -0,0 +1,41 @@ +package com.baeldung.xml; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; + +public class XMLDocumentWriter { + + public void write(Document document, String fileName, boolean excludeDeclaration, boolean prettyPrint) { + try(FileWriter writer = new FileWriter(new File(fileName))) { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + if(excludeDeclaration) { + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + } + if(prettyPrint) { + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + } + DOMSource source = new DOMSource(document); + StreamResult result = new StreamResult(writer); + transformer.transform(source, result); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } catch (TransformerConfigurationException e) { + throw new IllegalStateException(e); + } catch (TransformerException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/xml/src/test/java/com/baeldung/xml/XMLDocumentWriterUnitTest.java b/xml/src/test/java/com/baeldung/xml/XMLDocumentWriterUnitTest.java new file mode 100644 index 0000000000..68f787a054 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xml/XMLDocumentWriterUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.xml; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import java.io.File; + +public class XMLDocumentWriterUnitTest { + + @Test + public void givenXMLDocumentWhenWriteIsCalledThenXMLIsWrittenToFile() throws Exception { + Document document = createSampleDocument(); + new XMLDocumentWriter().write(document, "company_simple.xml", false, false); + } + + @Test + public void givenXMLDocumentWhenWriteIsCalledWithPrettyPrintThenFormattedXMLIsWrittenToFile() throws Exception { + Document document = createSampleDocument(); + new XMLDocumentWriter().write(document, "company_prettyprinted.xml", false, true); + } + + private Document createSampleDocument() throws ParserConfigurationException { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.newDocument(); + Element companyElement = document.createElement("Company"); + document.appendChild(companyElement); + Element departmentElement = document.createElement("Department"); + departmentElement.setAttribute("name", "Sales"); + companyElement.appendChild(departmentElement); + Element employee1 = document.createElement("Employee"); + employee1.setAttribute("name", "John Smith"); + departmentElement.appendChild(employee1); + Element employee2 = document.createElement("Employee"); + employee2.setAttribute("name", "Tim Dellor"); + departmentElement.appendChild(employee2); + return document; + } + + @After + public void cleanUp() throws Exception { + FileUtils.deleteQuietly(new File("company_simple.xml")); + FileUtils.deleteQuietly(new File("company_prettyprinted.xml")); + } +} From 44a3d36bd981f581bc97c85036fe25288744510b Mon Sep 17 00:00:00 2001 From: Andrey Shcherbakov Date: Fri, 12 Oct 2018 07:16:54 +0200 Subject: [PATCH 54/55] Implement a binary tree (#5431) * Add code for the article 'Java Primitives versus Objects' * Use JMH for benchmarking the primitive and wrapper classes * Uncomment the benchmarks and remove unused class * Add a binary search tree implementation * Add an example of how to use the binary tree class * Adjust the print statements --- .../com/baeldung/datastructures/Main.kt | 19 ++ .../com/baeldung/datastructures/Node.kt | 167 +++++++++ .../com/baeldung/datastructures/NodeTest.kt | 319 ++++++++++++++++++ 3 files changed, 505 insertions(+) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/datastructures/Main.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/datastructures/Node.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/datastructures/NodeTest.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/datastructures/Main.kt b/core-kotlin/src/main/kotlin/com/baeldung/datastructures/Main.kt new file mode 100644 index 0000000000..4fd8aa27c7 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/datastructures/Main.kt @@ -0,0 +1,19 @@ +package com.baeldung.datastructures + +/** + * Example of how to use the {@link Node} class. + * + */ +fun main(args: Array) { + val tree = Node(4) + val keys = arrayOf(8, 15, 21, 3, 7, 2, 5, 10, 2, 3, 4, 6, 11) + for (key in keys) { + tree.insert(key) + } + val node = tree.find(4)!! + println("Node with value ${node.key} [left = ${node.left?.key}, right = ${node.right?.key}]") + println("Delete node with key = 3") + node.delete(3) + print("Tree content after the node elimination: ") + println(tree.visit().joinToString { it.toString() }) +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/datastructures/Node.kt b/core-kotlin/src/main/kotlin/com/baeldung/datastructures/Node.kt new file mode 100644 index 0000000000..b81afe1e4c --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/datastructures/Node.kt @@ -0,0 +1,167 @@ +package com.baeldung.datastructures + +/** + * An ADT for a binary search tree. + * Note that this data type is neither immutable nor thread safe. + */ +class Node( + var key: Int, + var left: Node? = null, + var right: Node? = null) { + + /** + * Return a node with given value. If no such node exists, return null. + * @param value + */ + fun find(value: Int): Node? = when { + this.key > value -> left?.find(value) + this.key < value -> right?.find(value) + else -> this + + } + + /** + * Insert a given value into the tree. + * After insertion, the tree should contain a node with the given value. + * If the tree already contains the given value, nothing is performed. + * @param value + */ + fun insert(value: Int) { + if (value > this.key) { + if (this.right == null) { + this.right = Node(value) + } else { + this.right?.insert(value) + } + } else if (value < this.key) { + if (this.left == null) { + this.left = Node(value) + } else { + this.left?.insert(value) + } + } + } + + /** + * Delete the value from the given tree. If the tree does not contain the value, the tree remains unchanged. + * @param value + */ + fun delete(value: Int) { + when { + value > key -> scan(value, this.right, this) + value < key -> scan(value, this.left, this) + else -> removeNode(this, null) + } + } + + /** + * Scan the tree in the search of the given value. + * @param value + * @param node sub-tree that potentially might contain the sought value + * @param parent node's parent + */ + private fun scan(value: Int, node: Node?, parent: Node?) { + if (node == null) { + System.out.println("value " + value + + " seems not present in the tree.") + return + } + when { + value > node.key -> scan(value, node.right, node) + value < node.key -> scan(value, node.left, node) + value == node.key -> removeNode(node, parent) + } + + } + + /** + * Remove the node. + * + * Removal process depends on how many children the node has. + * + * @param node node that is to be removed + * @param parent parent of the node to be removed + */ + private fun removeNode(node: Node, parent: Node?) { + node.left?.let { leftChild -> + run { + node.right?.let { + removeTwoChildNode(node) + } ?: removeSingleChildNode(node, leftChild) + } + } ?: run { + node.right?.let { rightChild -> removeSingleChildNode(node, rightChild) } ?: removeNoChildNode(node, parent) + } + + + } + + /** + * Remove the node without children. + * @param node + * @param parent + */ + private fun removeNoChildNode(node: Node, parent: Node?) { + parent?.let { p -> + if (node == p.left) { + p.left = null + } else if (node == p.right) { + p.right = null + } + } ?: throw IllegalStateException( + "Can not remove the root node without child nodes") + + } + + /** + * Remove a node that has two children. + * + * The process of elimination is to find the biggest key in the left sub-tree and replace the key of the + * node that is to be deleted with that key. + */ + private fun removeTwoChildNode(node: Node) { + val leftChild = node.left!! + leftChild.right?.let { + val maxParent = findParentOfMaxChild(leftChild) + maxParent.right?.let { + node.key = it.key + maxParent.right = null + } ?: throw IllegalStateException("Node with max child must have the right child!") + + } ?: run { + node.key = leftChild.key + node.left = leftChild.left + } + + } + + /** + * Return a node whose right child contains the biggest value in the given sub-tree. + * Assume that the node n has a non-null right child. + * + * @param n + */ + private fun findParentOfMaxChild(n: Node): Node { + return n.right?.let { r -> r.right?.let { findParentOfMaxChild(r) } ?: n } + ?: throw IllegalArgumentException("Right child must be non-null") + + } + + /** + * Remove a parent that has only one child. + * Removal is effectively is just coping the data from the child parent to the parent parent. + * @param parent Node to be deleted. Assume that it has just one child + * @param child Assume it is a child of the parent + */ + private fun removeSingleChildNode(parent: Node, child: Node) { + parent.key = child.key + parent.left = child.left + parent.right = child.right + } + + fun visit(): Array { + val a = left?.visit() ?: emptyArray() + val b = right?.visit() ?: emptyArray() + return a + arrayOf(key) + b + } +} diff --git a/core-kotlin/src/test/kotlin/com/baeldung/datastructures/NodeTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/datastructures/NodeTest.kt new file mode 100644 index 0000000000..8a46c5f6ec --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/datastructures/NodeTest.kt @@ -0,0 +1,319 @@ +package com.baeldung.datastructures + +import org.junit.After +import org.junit.Assert.* +import org.junit.Before +import org.junit.Test + +class NodeTest { + + @Before + fun setUp() { + } + + @After + fun tearDown() { + } + + /** + * Test suit for finding the node by value + * Partition the tests as follows: + * 1. tree depth: 0, 1, > 1 + * 2. pivot depth location: not present, 0, 1, 2, > 2 + */ + + /** + * Find the node by value + * 1. tree depth: 0 + * 2. pivot depth location: not present + */ + @Test + fun givenDepthZero_whenPivotNotPresent_thenNull() { + val n = Node(1) + assertNull(n.find(2)) + } + + /** + * Find the node by value + * 1. tree depth: 0 + * 2. pivot depth location: 0 + */ + @Test + fun givenDepthZero_whenPivotDepthZero_thenReturnNodeItself() { + val n = Node(1) + assertEquals(n, n.find(1)) + } + + /** + * Find the node by value + * 1. tree depth: 1 + * 2. pivot depth location: not present + */ + @Test + fun givenDepthOne_whenPivotNotPresent_thenNull() { + val n = Node(1, Node(0)) + assertNull(n.find(2)) + } + + /** + * Find the node by value + * 1. tree depth: 1 + * 2. pivot depth location: not present + */ + @Test + fun givenDepthOne_whenPivotAtDepthOne_thenSuccess() { + val n = Node(1, Node(0)) + assertEquals(n.left, n.find(0) + ) + } + + @Test + fun givenDepthTwo_whenPivotAtDepth2_then_Success() { + val left = Node(1, Node(0), Node(2)) + val right = Node(5, Node(4), Node(6)) + val n = Node(3, left, right) + assertEquals(left.left, n.find(0)) + } + + + /** + * Test suit for inserting a value + * Partition the test as follows: + * 1. tree depth: 0, 1, 2, > 2 + * 2. depth to insert: 0, 1, > 1 + * 3. is duplicate: no, yes + * 4. sub-tree: left, right + */ + /** + * Test for inserting a value + * 1. tree depth: 0 + * 2. depth to insert: 1 + * 3. is duplicate: no + * 4. sub-tree: right + */ + @Test + fun givenTreeDepthZero_whenInsertNoDuplicateToRight_thenAddNode() { + val n = Node(1) + n.insert(2) + assertEquals(1, n.key) + with(n.right!!) { + assertEquals(2, key) + assertNull(left) + assertNull(right) + } + assertNull(n.left) + } + + /** + * Test for inserting a value + * 1. tree depth: 0 + * 2. depth to insert: 1 + * 3. is duplicate: no + * 4. sub-tree: right + */ + @Test + fun givenTreeDepthZero_whenInsertNoDuplicateToLeft_thenSuccess() { + val n = Node(1) + n.insert(0) + assertEquals(1, n.key) + with(n.left!!) { + assertEquals(0, key) + assertNull(left) + assertNull(right) + } + assertNull(n.right) + } + + /** + * Test for inserting a value + * 1. tree depth: 0 + * 2. depth to insert: 1 + * 3. is duplicate: yes + */ + @Test + fun givenTreeDepthZero_whenInsertDuplicate_thenSuccess() { + val n = Node(1) + n.insert(1) + assertEquals(1, n.key) + assertNull(n.right) + assertNull(n.left) + } + + + /** + * Test suit for inserting a value + * Partition the test as follows: + * 1. tree depth: 0, 1, 2, > 2 + * 2. depth to insert: 0, 1, > 1 + * 3. is duplicate: no, yes + * 4. sub-tree: left, right + */ + /** + * Test for inserting a value + * 1. tree depth: 1 + * 2. depth to insert: 1 + * 3. is duplicate: no + * 4. sub-tree: right + */ + @Test + fun givenTreeDepthOne_whenInsertNoDuplicateToRight_thenSuccess() { + val n = Node(10, Node(3)) + n.insert(15) + assertEquals(10, n.key) + with(n.right!!) { + assertEquals(15, key) + assertNull(left) + assertNull(right) + } + with(n.left!!) { + assertEquals(3, key) + assertNull(left) + assertNull(right) + } + } + + /** + * Test for inserting a value + * 1. tree depth: 1 + * 2. depth to insert: 1 + * 3. is duplicate: no + * 4. sub-tree: left + */ + @Test + fun givenTreeDepthOne_whenInsertNoDuplicateToLeft_thenAddNode() { + val n = Node(10, null, Node(15)) + n.insert(3) + assertEquals(10, n.key) + with(n.right!!) { + assertEquals(15, key) + assertNull(left) + assertNull(right) + } + with(n.left!!) { + assertEquals(3, key) + assertNull(left) + assertNull(right) + } + } + + /** + * Test for inserting a value + * 1. tree depth: 1 + * 2. depth to insert: 1 + * 3. is duplicate: yes + */ + @Test + fun givenTreeDepthOne_whenInsertDuplicate_thenNoChange() { + val n = Node(10, null, Node(15)) + n.insert(15) + assertEquals(10, n.key) + with(n.right!!) { + assertEquals(15, key) + assertNull(left) + assertNull(right) + } + assertNull(n.left) + } + + /** + * Test suit for removal + * Partition the input as follows: + * 1. tree depth: 0, 1, 2, > 2 + * 2. value to delete: absent, present + * 3. # child nodes: 0, 1, 2 + */ + /** + * Test for removal value + * 1. tree depth: 0 + * 2. value to delete: absent + */ + @Test + fun givenTreeDepthZero_whenValueAbsent_thenNoChange() { + val n = Node(1) + n.delete(0) + assertEquals(1, n.key) + assertNull(n.left) + assertNull(n.right) + } + + /** + * Test for removal + * 1. tree depth: 1 + * 2. value to delete: absent + */ + @Test + fun givenTreeDepthOne_whenValueAbsent_thenNoChange() { + val n = Node(1, Node(0), Node(2)) + n.delete(3) + assertEquals(1, n.key) + assertEquals(2, n.right!!.key) + with(n.left!!) { + assertEquals(0, key) + assertNull(left) + assertNull(right) + } + with(n.right!!) { + assertNull(left) + assertNull(right) + } + } + + /** + * Test suit for removal + * 1. tree depth: 1 + * 2. value to delete: present + * 3. # child nodes: 0 + */ + @Test + fun givenTreeDepthOne_whenNodeToDeleteHasNoChildren_thenChangeTree() { + val n = Node(1, Node(0)) + n.delete(0) + assertEquals(1, n.key) + assertNull(n.left) + assertNull(n.right) + } + + /** + * Test suit for removal + * 1. tree depth: 2 + * 2. value to delete: present + * 3. # child nodes: 1 + */ + @Test + fun givenTreeDepthTwo_whenNodeToDeleteHasOneChild_thenChangeTree() { + val n = Node(2, Node(0, null, Node(1)), Node(3)) + n.delete(0) + assertEquals(2, n.key) + with(n.right!!) { + assertEquals(3, key) + assertNull(left) + assertNull(right) + } + with(n.left!!) { + assertEquals(1, key) + assertNull(left) + assertNull(right) + } + } + + @Test + fun givenTreeDepthThree_whenNodeToDeleteHasTwoChildren_thenChangeTree() { + val l = Node(2, Node(1), Node(5, Node(4), Node(6))) + val r = Node(10, Node(9), Node(11)) + val n = Node(8, l, r) + n.delete(8) + assertEquals(6, n.key) + with(n.left!!) { + assertEquals(2, key) + assertEquals(1, left!!.key) + assertEquals(5, right!!.key) + assertEquals(4, right!!.left!!.key) + } + with(n.right!!) { + assertEquals(10, key) + assertEquals(9, left!!.key) + assertEquals(11, right!!.key) + } + } + +} From 15b7eacd4310b871769afe12a363f231fb924052 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Fri, 12 Oct 2018 10:21:35 +0300 Subject: [PATCH 55/55] cleanup work --- core-java-collections/pom.xml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core-java-collections/pom.xml b/core-java-collections/pom.xml index 694d2da5eb..b4a6e26d13 100644 --- a/core-java-collections/pom.xml +++ b/core-java-collections/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung core-java-collections 0.1.0-SNAPSHOT jar @@ -63,11 +62,17 @@ jmh-generator-annprocess ${openjdk.jmh.version} - - org.apache.commons - commons-exec - 1.3 - + + org.apache.commons + commons-exec + 1.3 + + + + one.util + streamex + 0.6.5 +