From b9465045c20a2df737d93cf7e204c1ab1d635589 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 11 Apr 2023 22:29:34 +0530 Subject: [PATCH 01/39] Java 19552 Move articles from spring-core-* module to spring-di-4 module (#13814) * JAVA-19552 Move articles from spring-core module to spring-di-4 module * JAVA-19552 Minor Correction --- spring-core-4/README.md | 1 - spring-core-5/README.md | 1 - .../src/main/resources/application.yml | 1 - .../src/test/resources/application.yml | 1 - spring-di-3/README.md | 2 +- spring-di-4/README.md | 9 ++++++ spring-di-4/pom.xml | 28 +++++++++++++++++++ .../component/inscope/AmbiguousBean.java | 0 .../component/inscope/BeanExample.java | 0 .../baeldung/component/inscope/BeanImplA.java | 0 .../baeldung/component/inscope/BeanImplB.java | 0 .../inscope/ComponentApplication.java | 0 .../component/inscope/ComponentExample.java | 0 .../component/inscope/ControllerExample.java | 0 .../component/inscope/CustomComponent.java | 0 .../inscope/CustomComponentExample.java | 0 .../component/inscope/RepositoryExample.java | 0 .../component/inscope/ServiceExample.java | 0 .../outsidescope/OutsideScopeBeanExample.java | 0 .../outsidescope/OutsideScopeExample.java | 0 .../scannedscope/ScannedScopeExample.java | 0 .../baeldung/sampleabstract/BallService.java | 0 .../sampleabstract/BasketballService.java | 0 .../com/baeldung/sampleabstract/DemoApp.java | 0 .../sampleabstract/LogRepository.java | 0 .../sampleabstract/RuleRepository.java | 0 .../src/main/resources/application.yml | 1 + .../component/inscope/ComponentUnitTest.java | 0 .../src/test/resources/application.yml | 1 + .../src/test/resources/logback-test.xml | 12 ++++++++ 30 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 spring-di-4/README.md create mode 100644 spring-di-4/pom.xml rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/BeanExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/BeanImplA.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/BeanImplB.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/ComponentApplication.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/ComponentExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/ControllerExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/CustomComponent.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/RepositoryExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/inscope/ServiceExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java (100%) rename {spring-core-5 => spring-di-4}/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java (100%) rename {spring-core-4 => spring-di-4}/src/main/java/com/baeldung/sampleabstract/BallService.java (100%) rename {spring-core-4 => spring-di-4}/src/main/java/com/baeldung/sampleabstract/BasketballService.java (100%) rename {spring-core-4 => spring-di-4}/src/main/java/com/baeldung/sampleabstract/DemoApp.java (100%) rename {spring-core-4 => spring-di-4}/src/main/java/com/baeldung/sampleabstract/LogRepository.java (100%) rename {spring-core-4 => spring-di-4}/src/main/java/com/baeldung/sampleabstract/RuleRepository.java (100%) create mode 100644 spring-di-4/src/main/resources/application.yml rename {spring-core-5 => spring-di-4}/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java (100%) create mode 100644 spring-di-4/src/test/resources/application.yml create mode 100644 spring-di-4/src/test/resources/logback-test.xml diff --git a/spring-core-4/README.md b/spring-core-4/README.md index 0338d5d6e8..6ade284e2e 100644 --- a/spring-core-4/README.md +++ b/spring-core-4/README.md @@ -6,6 +6,5 @@ This module contains articles about core Spring functionality - [Creating Spring Beans Through Factory Methods](https://www.baeldung.com/spring-beans-factory-methods) - [Spring BeanPostProcessor](https://www.baeldung.com/spring-beanpostprocessor) -- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) - [The Spring ApplicationContext](https://www.baeldung.com/spring-application-context) - More articles: [[<-- prev]](/spring-core-3) [[next -->]](/spring-core-5) diff --git a/spring-core-5/README.md b/spring-core-5/README.md index 13945c1f8b..cfcbf5380a 100644 --- a/spring-core-5/README.md +++ b/spring-core-5/README.md @@ -4,7 +4,6 @@ This module contains articles about core Spring functionality. ## Relevant Articles: -- [Spring @Component Annotation](https://www.baeldung.com/spring-component-annotation) - [Solving Spring’s “not eligible for auto-proxying” Warning](https://www.baeldung.com/spring-not-eligible-for-auto-proxying) - [Finding the Spring Version](https://www.baeldung.com/spring-find-version) - [How Does the Spring Singleton Bean Serve Concurrent Requests?](https://www.baeldung.com/spring-singleton-concurrent-requests) diff --git a/spring-core-5/src/main/resources/application.yml b/spring-core-5/src/main/resources/application.yml index 5c09fdb8b0..e69de29bb2 100644 --- a/spring-core-5/src/main/resources/application.yml +++ b/spring-core-5/src/main/resources/application.yml @@ -1 +0,0 @@ -ambiguous-bean: 'A' \ No newline at end of file diff --git a/spring-core-5/src/test/resources/application.yml b/spring-core-5/src/test/resources/application.yml index da23e59c24..e69de29bb2 100644 --- a/spring-core-5/src/test/resources/application.yml +++ b/spring-core-5/src/test/resources/application.yml @@ -1 +0,0 @@ -ambiguous-bean: 'B' \ No newline at end of file diff --git a/spring-di-3/README.md b/spring-di-3/README.md index 1ac280fef2..ffb81fbe7d 100644 --- a/spring-di-3/README.md +++ b/spring-di-3/README.md @@ -11,4 +11,4 @@ This module contains articles about dependency injection with Spring - [@Order in Spring](http://www.baeldung.com/spring-order) - [How to dynamically Autowire a Bean in Spring](https://www.baeldung.com/spring-dynamic-autowire) - [Spring @Import Annotation](https://www.baeldung.com/spring-import-annotation) -- More articles: [[<-- prev]](../spring-di-2) +- More articles: [[<-- prev]](../spring-di-2)[[more -->]](../spring-di-4) diff --git a/spring-di-4/README.md b/spring-di-4/README.md new file mode 100644 index 0000000000..d4b0d94385 --- /dev/null +++ b/spring-di-4/README.md @@ -0,0 +1,9 @@ +## Spring Dependency Injection + +This module contains articles about dependency injection with Spring + +### Relevant Articles + +- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) +- [Spring @Component Annotation](https://www.baeldung.com/spring-component-annotation) +- More articles: [[<-- prev]](../spring-di-3) diff --git a/spring-di-4/pom.xml b/spring-di-4/pom.xml new file mode 100644 index 0000000000..c6572495cb --- /dev/null +++ b/spring-di-4/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + spring-di-4 + 1.0-SNAPSHOT + spring-di-4 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + + \ No newline at end of file diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/AmbiguousBean.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/BeanExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/BeanExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/BeanExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/BeanExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplA.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplA.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplA.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplA.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplB.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplB.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/BeanImplB.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/BeanImplB.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentApplication.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentApplication.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentApplication.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentApplication.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ComponentExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ComponentExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ControllerExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ControllerExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ControllerExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ControllerExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponent.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponent.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponent.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponent.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/CustomComponentExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/RepositoryExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/RepositoryExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/RepositoryExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/RepositoryExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/inscope/ServiceExample.java b/spring-di-4/src/main/java/com/baeldung/component/inscope/ServiceExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/inscope/ServiceExample.java rename to spring-di-4/src/main/java/com/baeldung/component/inscope/ServiceExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java b/spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java rename to spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeBeanExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java b/spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java rename to spring-di-4/src/main/java/com/baeldung/component/outsidescope/OutsideScopeExample.java diff --git a/spring-core-5/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java b/spring-di-4/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java similarity index 100% rename from spring-core-5/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java rename to spring-di-4/src/main/java/com/baeldung/component/scannedscope/ScannedScopeExample.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/BallService.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/BallService.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java diff --git a/spring-core-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java similarity index 100% rename from spring-core-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java rename to spring-di-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java diff --git a/spring-di-4/src/main/resources/application.yml b/spring-di-4/src/main/resources/application.yml new file mode 100644 index 0000000000..5c09fdb8b0 --- /dev/null +++ b/spring-di-4/src/main/resources/application.yml @@ -0,0 +1 @@ +ambiguous-bean: 'A' \ No newline at end of file diff --git a/spring-core-5/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java b/spring-di-4/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java similarity index 100% rename from spring-core-5/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java rename to spring-di-4/src/test/java/com/baeldung/component/inscope/ComponentUnitTest.java diff --git a/spring-di-4/src/test/resources/application.yml b/spring-di-4/src/test/resources/application.yml new file mode 100644 index 0000000000..da23e59c24 --- /dev/null +++ b/spring-di-4/src/test/resources/application.yml @@ -0,0 +1 @@ +ambiguous-bean: 'B' \ No newline at end of file diff --git a/spring-di-4/src/test/resources/logback-test.xml b/spring-di-4/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8d4771e308 --- /dev/null +++ b/spring-di-4/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file From 6904c81c12cd8477c7d6bff31bdcede01fe98ff0 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 11 Apr 2023 22:37:52 +0530 Subject: [PATCH 02/39] JAVA-19533 Fix references to parents - Week 14 - 2023 (moved-1) (#13816) --- spring-core-6/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-core-6/pom.xml b/spring-core-6/pom.xml index cc494b3a57..736fa283e7 100644 --- a/spring-core-6/pom.xml +++ b/spring-core-6/pom.xml @@ -10,10 +10,10 @@ http://www.baeldung.com - org.springframework.boot - spring-boot-starter-parent - 3.0.1 - + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../parent-boot-3 From 0ac00ad38900df36e9f61d616a76e1976e29b77f Mon Sep 17 00:00:00 2001 From: Alex Tighe <599747+atighe@users.noreply.github.com> Date: Tue, 11 Apr 2023 14:15:40 -0400 Subject: [PATCH 03/39] BAEL-6229: loading multiple yaml files in spring boot (#13724) * BAEL-6229: committing new example for loading multiple yaml configuration files * BAEL-6229: updating README.md * BAEL-6229: adding example one code, commented out * Revert "BAEL-6229: updating README.md" This reverts commit 51cd2dcf97f797aa6a723888fd246ef0142242a3. * BAEL-6229: adding comments around commented out code for first example. --- .../multipleyaml/MultipleYamlApplication.java | 27 ++++++++++++++ .../MultipleYamlConfiguration.java | 35 +++++++++++++++++++ .../MultipleYamlPropertySourceFactory.java | 23 ++++++++++++ .../main/resources/application-students.yml | 3 ++ .../main/resources/application-teachers.yml | 3 ++ .../src/main/resources/application.yml | 4 +++ 6 files changed, 95 insertions(+) create mode 100644 spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlApplication.java create mode 100644 spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlConfiguration.java create mode 100644 spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlPropertySourceFactory.java create mode 100644 spring-boot-modules/spring-boot-properties-3/src/main/resources/application-students.yml create mode 100644 spring-boot-modules/spring-boot-properties-3/src/main/resources/application-teachers.yml diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlApplication.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlApplication.java new file mode 100644 index 0000000000..9dc754b24b --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlApplication.java @@ -0,0 +1,27 @@ +package com.baeldung.properties.multipleyaml; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MultipleYamlApplication implements CommandLineRunner { + + @Autowired + private MultipleYamlConfiguration config; + + public static void main(String[] args) { + SpringApplication springApp = new SpringApplication(MultipleYamlApplication.class); + + // Code from first example, uncomment to use multiple profiles + // springApp.setAdditionalProfiles("students", "teachers"); + + springApp.run(args); + } + + public void run(String... args) throws Exception { + System.out.println("Students: " + config.getStudents()); + System.out.println("Teachers: " + config.getTeachers()); + } +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlConfiguration.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlConfiguration.java new file mode 100644 index 0000000000..c46a321e24 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlConfiguration.java @@ -0,0 +1,35 @@ +package com.baeldung.properties.multipleyaml; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; + +import java.util.List; + +@Configuration +@ConfigurationProperties +@PropertySources({ + @PropertySource(value = "classpath:application-teachers.yml", factory = MultipleYamlPropertySourceFactory.class), + @PropertySource(value = "classpath:application-students.yml", factory = MultipleYamlPropertySourceFactory.class)}) +public class MultipleYamlConfiguration { + + List teachers; + List students; + + public void setTeachers(List teachers) { + this.teachers = teachers; + } + + public void setStudents(List students) { + this.students = students; + } + + public List getTeachers() { + return teachers; + } + + public List getStudents() { + return students; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlPropertySourceFactory.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlPropertySourceFactory.java new file mode 100644 index 0000000000..c09bd3c8b9 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/multipleyaml/MultipleYamlPropertySourceFactory.java @@ -0,0 +1,23 @@ +package com.baeldung.properties.multipleyaml; + +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.support.EncodedResource; +import org.springframework.core.io.support.PropertySourceFactory; + +import java.io.IOException; +import java.util.Properties; + +public class MultipleYamlPropertySourceFactory implements PropertySourceFactory { + + @Override + public PropertySource createPropertySource(String name, EncodedResource encodedResource) throws IOException { + YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); + factory.setResources(encodedResource.getResource()); + + Properties properties = factory.getObject(); + + return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties); + } +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-students.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-students.yml new file mode 100644 index 0000000000..f4aaf8ae4d --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-students.yml @@ -0,0 +1,3 @@ +students: + - Jane + - Michael \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-teachers.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-teachers.yml new file mode 100644 index 0000000000..f0d2080164 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application-teachers.yml @@ -0,0 +1,3 @@ +teachers: + - Margo + - Javier \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml index 2e28da5ad3..2c44065028 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml @@ -2,6 +2,10 @@ bael: root-level-property: defaultRootLevelValue spring: profiles: +# Multiple profiles for MultipleYamlApplication first example +# include: +# - teachers +# - students group: multidocument-integration: multidocument-integration-extension --- From 67d6b1533b6a47f999f3309ccae92ba183315f85 Mon Sep 17 00:00:00 2001 From: Alexandru Borza Date: Tue, 11 Apr 2023 21:21:36 +0300 Subject: [PATCH 04/39] Generating Time Based UUIDs (#13668) * time-based UUIDs * review * review --- core-java-modules/core-java-uuid/pom.xml | 17 +++++++- .../JavaUUIDCreatorBenchmark.java | 42 +++++++++++++++++++ .../timebaseduuid/JavaUUIDCreatorExample.java | 13 ++++++ .../timebaseduuid/UUIDCreatorBenchmark.java | 42 +++++++++++++++++++ .../timebaseduuid/UUIDCreatorExample.java | 13 ++++++ 5 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml index b97db174b4..c0e93c1d32 100644 --- a/core-java-modules/core-java-uuid/pom.xml +++ b/core-java-modules/core-java-uuid/pom.xml @@ -24,6 +24,21 @@ log4j-over-slf4j ${org.slf4j.version} + + com.github.f4b6a3 + uuid-creator + 5.2.0 + + + com.fasterxml.uuid + java-uuid-generator + 4.1.0 + + + com.github.f4b6a3 + tsid-creator + 5.2.3 + @@ -142,4 +157,4 @@ 3.0.0-M1 - \ No newline at end of file + diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java new file mode 100644 index 0000000000..20b2c127bd --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java @@ -0,0 +1,42 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class JavaUUIDCreatorBenchmark { + +public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + Map uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = Generators.timeBasedGenerator().generate(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); +} +} + diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java new file mode 100644 index 0000000000..b59d7e236a --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java @@ -0,0 +1,13 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; + +public class JavaUUIDCreatorExample { + + public static void main(String[] args) { + System.out.println("UUID Version 1: " + Generators.timeBasedGenerator().generate()); + System.out.println("UUID Version 6: " + Generators.timeBasedReorderedGenerator().generate()); + System.out.println("UUID Version 7: " + Generators.timeBasedEpochGenerator().generate()); + + } +} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java new file mode 100644 index 0000000000..d93cd73a25 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java @@ -0,0 +1,42 @@ +package com.baeldung.timebaseduuid; + +import com.github.f4b6a3.uuid.UuidCreator; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class UUIDCreatorBenchmark { + + public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + Map uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = UuidCreator.getTimeBased(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); + } +} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java new file mode 100644 index 0000000000..fad2f55c93 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java @@ -0,0 +1,13 @@ +package com.baeldung.timebaseduuid; + +import com.github.f4b6a3.uuid.UuidCreator; + +public class UUIDCreatorExample { + + public static void main(String[] args) { + System.out.println("UUID Version 1: " + UuidCreator.getTimeBased()); + System.out.println("UUID Version 6: " + UuidCreator.getTimeOrdered()); + System.out.println("UUID Version 7: " + UuidCreator.getTimeOrderedEpoch()); + } +} + From 2765db78aedacc8958fb805ab4af09f5819f87d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20W=C5=82odkowski?= <42499088+lukaswlodkowski@users.noreply.github.com> Date: Tue, 11 Apr 2023 21:08:05 +0200 Subject: [PATCH 05/39] [BAEL-6165] AWS Secrets Manager integration with Spring Boot for DB. (#13632) * [BAEL-6165] AWS Secrets Manager integration with Spring Boot for DB. * [BAEL-6165] Add other types of secrets as example * [BAEL-6165] externalize version to properties * [BTL-6165] create UserController --------- Co-authored-by: Lukasz Wlodkowski --- .../spring-boot-data-3/pom.xml | 19 ++++++++- ...StartWithAWSSecretsManagerApplication.java | 29 ++++++++++++++ .../controller/UserController.java | 38 ++++++++++++++++++ .../model/UserEntity.java | 40 +++++++++++++++++++ .../repository/UserRepository.java | 10 +++++ .../main/resources/application-aws.properties | 9 +++++ 6 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/StartWithAWSSecretsManagerApplication.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/controller/UserController.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/model/UserEntity.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/repository/UserRepository.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/resources/application-aws.properties diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index cf53c25697..fcf7451c61 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/pom.xml @@ -25,8 +25,13 @@ spring-boot-starter-data-jpa - com.mysql - mysql-connector-j + com.amazonaws.secretsmanager + aws-secretsmanager-jdbc + ${aws.secrets.manager.jdbc} + + + mysql + mysql-connector-java runtime @@ -34,6 +39,11 @@ spring-boot-starter-test test + + io.awspring.cloud + spring-cloud-starter-aws-secrets-manager-config + ${aws.secrets.manager.config} + @@ -45,4 +55,9 @@ + + 2.4.4 + 1.0.11 + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/StartWithAWSSecretsManagerApplication.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/StartWithAWSSecretsManagerApplication.java new file mode 100644 index 0000000000..0bcbef7729 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/StartWithAWSSecretsManagerApplication.java @@ -0,0 +1,29 @@ +package com.baeldung.startdbwithawssecretsmanager; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; + +import javax.annotation.PostConstruct; + +@SpringBootApplication +@Profile("aws") +public class StartWithAWSSecretsManagerApplication { + @Value("${api-key1}") + private String apiKeyValue1; + + @Value("${api-key2}") + private String apiKeyValue2; + + @PostConstruct + private void postConstruct() { + System.out.println(apiKeyValue1); + System.out.println(apiKeyValue2); + } + + public static void main(String[] args) { + SpringApplication.run(StartWithAWSSecretsManagerApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/controller/UserController.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/controller/UserController.java new file mode 100644 index 0000000000..08745db3f0 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/controller/UserController.java @@ -0,0 +1,38 @@ +package com.baeldung.startdbwithawssecretsmanager.controller; + +import com.baeldung.startdbwithawssecretsmanager.model.UserEntity; +import com.baeldung.startdbwithawssecretsmanager.repository.UserRepository; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("users") +public class UserController { + + private final UserRepository userRepository; + + public UserController(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @GetMapping(value = "/{id}", produces = "application/json") + public @ResponseBody UserEntity getUser(@PathVariable Long id) { + return userRepository.findById(id).get(); + } + + @PostMapping + public UserEntity createUser(@RequestBody UserEntity userEntity) { + return userRepository.save(userEntity); + } + + @DeleteMapping(value = "/{id}") + public void removeUser(@PathVariable Long id) { + userRepository.deleteById(id); + } +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/model/UserEntity.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/model/UserEntity.java new file mode 100644 index 0000000000..285e7094dd --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/model/UserEntity.java @@ -0,0 +1,40 @@ +package com.baeldung.startdbwithawssecretsmanager.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class UserEntity { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + public UserEntity() { + } + + public UserEntity(Long id, String name) { + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/repository/UserRepository.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/repository/UserRepository.java new file mode 100644 index 0000000000..e2abfe88e6 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/startdbwithawssecretsmanager/repository/UserRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.startdbwithawssecretsmanager.repository; + +import com.baeldung.startdbwithawssecretsmanager.model.UserEntity; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository + extends CrudRepository { +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/application-aws.properties b/spring-boot-modules/spring-boot-data-3/src/main/resources/application-aws.properties new file mode 100644 index 0000000000..07c4b0a4d6 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/application-aws.properties @@ -0,0 +1,9 @@ +spring.datasource.driver-class-name=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver +spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect +spring.datasource.url=jdbc-secretsmanager:mysql://database-1.cwhqvgjbpgfw.eu-central-1.rds.amazonaws.com:3306/test +spring.datasource.username=rds/credentials + +#Overwriting application.properties configuration back to default. +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=true + +spring.config.import=aws-secretsmanager:test/secret/ From 0d360a264b2317ce1f53533ea1e9f8de79d3d533 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 12 Apr 2023 07:24:52 +0530 Subject: [PATCH 06/39] Java 19533 Fix references to parents - Week 14 - 2023 (moved-1) (#13824) * JAVA-19533 Fix references to parents - Week 14 - 2023 (moved-1) * JAVA-19533 Fix references to parents - Week 14 - 2023 (moved-1) --- spring-boot-modules/spring-boot-redis/pom.xml | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/spring-boot-modules/spring-boot-redis/pom.xml b/spring-boot-modules/spring-boot-redis/pom.xml index 42aa1321d5..42dba1de2f 100644 --- a/spring-boot-modules/spring-boot-redis/pom.xml +++ b/spring-boot-modules/spring-boot-redis/pom.xml @@ -2,20 +2,19 @@ 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.0.2 - - com.baelding spring-boot-redis 0.0.1-SNAPSHOT spring-boot-redis Demo project for Spring Boot with Spring Data Redis - - 15 - + + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + org.springframework.boot @@ -66,4 +65,8 @@ + + 15 + + From d1984f843c90220b7bd3d59e970f9727578fa074 Mon Sep 17 00:00:00 2001 From: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Date: Wed, 12 Apr 2023 03:57:59 +0200 Subject: [PATCH 07/39] Move lombok-module to jdk9-and-above group (excluded lombok-custom) (#13771) * Move lombok-module to jdk9-and-above group (excluded lombok-custom) * Update lombok version * JAVA-18157: Update lombok version for lombok submodule, and add compiler plugin --- .../baeldung/lombok/valvar/ValExample.java | 1 - .../baeldung/lombok/valvar/VarExample.java | 1 - lombok-modules/lombok-custom/pom.xml | 16 +++++++++ lombok-modules/lombok/pom.xml | 36 ++++--------------- lombok-modules/pom.xml | 18 +++++++++- pom.xml | 6 ++-- 6 files changed, 44 insertions(+), 34 deletions(-) diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java index b7ecd95fa8..f436ef81dd 100644 --- a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/ValExample.java @@ -1,7 +1,6 @@ package com.baeldung.lombok.valvar; import lombok.val; -import lombok.var; import java.util.ArrayList; import java.util.HashMap; diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java index 6fabf66590..138264db09 100644 --- a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/valvar/VarExample.java @@ -1,6 +1,5 @@ package com.baeldung.lombok.valvar; -import lombok.var; import java.util.ArrayList; import java.util.Arrays; diff --git a/lombok-modules/lombok-custom/pom.xml b/lombok-modules/lombok-custom/pom.xml index c119900c8a..1f7f630772 100644 --- a/lombok-modules/lombok-custom/pom.xml +++ b/lombok-modules/lombok-custom/pom.xml @@ -53,11 +53,27 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + 1.14.8 1.8 3.3.0-v_771 + 1.8 + 1.8 \ No newline at end of file diff --git a/lombok-modules/lombok/pom.xml b/lombok-modules/lombok/pom.xml index 1be22f0bc2..57b2a5a999 100644 --- a/lombok-modules/lombok/pom.xml +++ b/lombok-modules/lombok/pom.xml @@ -40,41 +40,19 @@ true - - - org.projectlombok - lombok-maven-plugin - ${delombok-maven-plugin.version} - - - delombok - generate-sources - - delombok - - - ${project.basedir}/src/main/java - ${project.build.directory}/delombok - false - - skip - - false - - - - - - - - - + edge-SNAPSHOT 1.0.0.Final 1.18.20.0 23.0.0 + + + projectlombok.org + https://projectlombok.org/edge-releases + + \ No newline at end of file diff --git a/lombok-modules/pom.xml b/lombok-modules/pom.xml index 7ca303af9d..f2bfdb51c0 100644 --- a/lombok-modules/pom.xml +++ b/lombok-modules/pom.xml @@ -18,10 +18,21 @@ lombok lombok-2 - lombok-custom + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + @@ -32,4 +43,9 @@ + + 11 + 11 + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1cc5f92cf8..2548dbfbde 100644 --- a/pom.xml +++ b/pom.xml @@ -363,7 +363,7 @@ libraries-3 libraries-jdk8 - lombok-modules + lombok-modules/lombok-custom muleesb @@ -559,7 +559,7 @@ libraries-3 libraries-jdk8 - lombok-modules + lombok-modules/lombok-custom muleesb web-modules @@ -735,6 +735,7 @@ + lombok-modules osgi spring-katharsis logging-modules @@ -986,6 +987,7 @@ + lombok-modules osgi spring-katharsis logging-modules From 1d910fc1a3ec76bfafbdf8eceb785a96035b4566 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Wed, 12 Apr 2023 05:01:28 +0300 Subject: [PATCH 08/39] JAVA-18142 Removed jhipster-5 (#13813) --- jhipster-5/README.md | 3 - jhipster-5/bookstore-monolith/.editorconfig | 24 - jhipster-5/bookstore-monolith/.gitattributes | 148 - jhipster-5/bookstore-monolith/.gitignore | 146 - jhipster-5/bookstore-monolith/.huskyrc | 5 - .../bookstore-monolith/.jhipster/Book.json | 54 - .../.mvn/wrapper/MavenWrapperDownloader.java | 110 - .../.mvn/wrapper/maven-wrapper.jar | Bin 48337 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 - jhipster-5/bookstore-monolith/.prettierignore | 3 - jhipster-5/bookstore-monolith/.prettierrc | 12 - jhipster-5/bookstore-monolith/.yo-rc.json | 34 - jhipster-5/bookstore-monolith/README.md | 5 - jhipster-5/bookstore-monolith/angular.json | 39 - jhipster-5/bookstore-monolith/mvnw | 286 - jhipster-5/bookstore-monolith/mvnw.cmd | 161 - jhipster-5/bookstore-monolith/package.json | 128 - jhipster-5/bookstore-monolith/pom.xml | 1233 --- .../bookstore-monolith/postcss.config.js | 5 - jhipster-5/bookstore-monolith/proxy.conf.json | 7 - .../src/main/docker/.dockerignore | 14 - .../src/main/docker/Dockerfile | 20 - .../src/main/docker/app.yml | 15 - .../src/main/docker/entrypoint.sh | 4 - .../src/main/docker/mysql.yml | 13 - .../src/main/docker/sonar.yml | 7 - .../baeldung/jhipster5/ApplicationWebXml.java | 21 - .../com/baeldung/jhipster5/BookstoreApp.java | 98 - .../jhipster5/aop/logging/LoggingAspect.java | 98 - .../config/ApplicationProperties.java | 14 - .../jhipster5/config/AsyncConfiguration.java | 59 - .../config/CloudDatabaseConfiguration.java | 28 - .../baeldung/jhipster5/config/Constants.java | 17 - .../config/DatabaseConfiguration.java | 59 - .../config/DateTimeFormatConfiguration.java | 20 - .../jhipster5/config/DefaultProfileUtil.java | 51 - .../config/JacksonConfiguration.java | 63 - .../config/LiquibaseConfiguration.java | 50 - .../jhipster5/config/LocaleConfiguration.java | 27 - .../config/LoggingAspectConfiguration.java | 19 - .../config/LoggingConfiguration.java | 154 - .../config/SecurityConfiguration.java | 122 - .../jhipster5/config/WebConfigurer.java | 170 - .../config/audit/AuditEventConverter.java | 86 - .../jhipster5/config/audit/package-info.java | 4 - .../jhipster5/config/package-info.java | 4 - .../domain/AbstractAuditingEntity.java | 79 - .../baeldung/jhipster5/domain/Authority.java | 59 - .../com/baeldung/jhipster5/domain/Book.java | 153 - .../domain/PersistentAuditEvent.java | 109 - .../com/baeldung/jhipster5/domain/User.java | 231 - .../jhipster5/domain/package-info.java | 4 - .../repository/AuthorityRepository.java | 11 - .../jhipster5/repository/BookRepository.java | 15 - .../CustomAuditEventRepository.java | 89 - .../PersistenceAuditEventRepository.java | 25 - .../jhipster5/repository/UserRepository.java | 40 - .../jhipster5/repository/package-info.java | 4 - .../security/AuthoritiesConstants.java | 16 - .../security/CustomAuthenticationManager.java | 126 - .../security/DomainUserDetailsService.java | 62 - .../jhipster5/security/SecurityUtils.java | 76 - .../security/SpringSecurityAuditorAware.java | 20 - .../security/UserNotActivatedException.java | 19 - .../jhipster5/security/dto/LoginRequest.java | 30 - .../jhipster5/security/dto/LoginResponse.java | 50 - .../jhipster5/security/jwt/JWTConfigurer.java | 21 - .../jhipster5/security/jwt/JWTFilter.java | 48 - .../jhipster5/security/jwt/TokenProvider.java | 119 - .../jhipster5/security/package-info.java | 4 - .../jhipster5/service/AuditEventService.java | 51 - .../jhipster5/service/BookService.java | 50 - .../jhipster5/service/MailService.java | 105 - .../jhipster5/service/UserService.java | 273 - .../jhipster5/service/dto/BookDTO.java | 112 - .../service/dto/PasswordChangeDTO.java | 35 - .../jhipster5/service/dto/UserDTO.java | 199 - .../jhipster5/service/dto/package-info.java | 4 - .../service/impl/BookServiceImpl.java | 109 - .../jhipster5/service/mapper/BookMapper.java | 24 - .../service/mapper/EntityMapper.java | 21 - .../jhipster5/service/mapper/UserMapper.java | 81 - .../service/mapper/package-info.java | 4 - .../jhipster5/service/package-info.java | 4 - .../jhipster5/service/util/RandomUtil.java | 41 - .../jhipster5/web/rest/AccountResource.java | 179 - .../jhipster5/web/rest/AuditResource.java | 77 - .../jhipster5/web/rest/BookResource.java | 118 - .../jhipster5/web/rest/LogsResource.java | 36 - .../jhipster5/web/rest/UserJWTController.java | 71 - .../jhipster5/web/rest/UserResource.java | 183 - .../rest/errors/BadRequestAlertException.java | 42 - .../errors/CustomParameterizedException.java | 54 - .../errors/EmailAlreadyUsedException.java | 10 - .../rest/errors/EmailNotFoundException.java | 13 - .../web/rest/errors/ErrorConstants.java | 21 - .../web/rest/errors/ExceptionTranslator.java | 112 - .../web/rest/errors/FieldErrorVM.java | 33 - .../errors/InternalServerErrorException.java | 16 - .../rest/errors/InvalidPasswordException.java | 13 - .../errors/LoginAlreadyUsedException.java | 10 - .../web/rest/errors/package-info.java | 6 - .../jhipster5/web/rest/package-info.java | 4 - .../jhipster5/web/rest/util/HeaderUtil.java | 45 - .../web/rest/util/PaginationUtil.java | 45 - .../web/rest/vm/KeyAndPasswordVM.java | 27 - .../jhipster5/web/rest/vm/LoggerVM.java | 46 - .../jhipster5/web/rest/vm/LoginVM.java | 52 - .../jhipster5/web/rest/vm/ManagedUserVM.java | 35 - .../jhipster5/web/rest/vm/package-info.java | 4 - .../src/main/jib/entrypoint.sh | 4 - .../src/main/resources/.h2.server.properties | 5 - .../src/main/resources/banner.txt | 10 - .../main/resources/config/application-dev.yml | 122 - .../resources/config/application-prod.yml | 133 - .../main/resources/config/application-tls.yml | 20 - .../src/main/resources/config/application.yml | 140 - .../config/liquibase/authorities.csv | 3 - .../00000000000000_initial_schema.xml | 152 - .../20190319124041_added_entity_Book.xml | 50 - .../resources/config/liquibase/master.xml | 11 - .../main/resources/config/liquibase/users.csv | 5 - .../config/liquibase/users_authorities.csv | 6 - .../main/resources/config/tls/keystore.p12 | Bin 2607 -> 0 bytes .../main/resources/i18n/messages.properties | 21 - .../src/main/resources/logback-spring.xml | 66 - .../src/main/resources/templates/error.html | 163 - .../templates/mail/activationEmail.html | 25 - .../templates/mail/creationEmail.html | 25 - .../templates/mail/passwordResetEmail.html | 25 - .../src/main/webapp/404.html | 61 - .../main/webapp/app/account/account.module.ts | 30 - .../main/webapp/app/account/account.route.ts | 12 - .../account/activate/activate.component.html | 17 - .../account/activate/activate.component.ts | 37 - .../app/account/activate/activate.route.ts | 12 - .../app/account/activate/activate.service.ts | 16 - .../src/main/webapp/app/account/index.ts | 19 - .../password-reset-finish.component.html | 77 - .../finish/password-reset-finish.component.ts | 65 - .../finish/password-reset-finish.route.ts | 12 - .../finish/password-reset-finish.service.ts | 14 - .../init/password-reset-init.component.html | 46 - .../init/password-reset-init.component.ts | 43 - .../init/password-reset-init.route.ts | 12 - .../init/password-reset-init.service.ts | 14 - .../password-strength-bar.component.ts | 85 - .../password/password-strength-bar.scss | 23 - .../account/password/password.component.html | 77 - .../account/password/password.component.ts | 46 - .../app/account/password/password.route.ts | 14 - .../app/account/password/password.service.ts | 14 - .../account/register/register.component.html | 124 - .../account/register/register.component.ts | 71 - .../app/account/register/register.route.ts | 12 - .../app/account/register/register.service.ts | 14 - .../account/settings/settings.component.html | 80 - .../account/settings/settings.component.ts | 50 - .../app/account/settings/settings.route.ts | 14 - .../src/main/webapp/app/admin/admin.module.ts | 43 - .../src/main/webapp/app/admin/admin.route.ts | 18 - .../app/admin/audits/audit-data.model.ts | 3 - .../webapp/app/admin/audits/audit.model.ts | 5 - .../app/admin/audits/audits.component.html | 52 - .../app/admin/audits/audits.component.ts | 126 - .../webapp/app/admin/audits/audits.route.ts | 17 - .../webapp/app/admin/audits/audits.service.ts | 25 - .../configuration.component.html | 46 - .../configuration/configuration.component.ts | 43 - .../configuration/configuration.route.ts | 11 - .../configuration/configuration.service.ts | 67 - .../webapp/app/admin/docs/docs.component.html | 2 - .../webapp/app/admin/docs/docs.component.ts | 9 - .../main/webapp/app/admin/docs/docs.route.ts | 11 - .../admin/health/health-modal.component.html | 35 - .../admin/health/health-modal.component.ts | 41 - .../app/admin/health/health.component.html | 34 - .../app/admin/health/health.component.ts | 66 - .../webapp/app/admin/health/health.route.ts | 11 - .../webapp/app/admin/health/health.service.ts | 133 - .../src/main/webapp/app/admin/index.ts | 27 - .../main/webapp/app/admin/logs/log.model.ts | 3 - .../webapp/app/admin/logs/logs.component.html | 28 - .../webapp/app/admin/logs/logs.component.ts | 32 - .../main/webapp/app/admin/logs/logs.route.ts | 11 - .../webapp/app/admin/logs/logs.service.ts | 19 - .../app/admin/metrics/metrics.component.html | 56 - .../app/admin/metrics/metrics.component.ts | 42 - .../webapp/app/admin/metrics/metrics.route.ts | 11 - .../app/admin/metrics/metrics.service.ts | 18 - ...er-management-delete-dialog.component.html | 19 - ...user-management-delete-dialog.component.ts | 29 - .../user-management-detail.component.html | 47 - .../user-management-detail.component.ts | 20 - .../user-management-update.component.html | 118 - .../user-management-update.component.ts | 51 - .../user-management.component.html | 78 - .../user-management.component.ts | 144 - .../user-management/user-management.route.ts | 68 - .../src/main/webapp/app/app-routing.module.ts | 23 - .../src/main/webapp/app/app.constants.ts | 8 - .../src/main/webapp/app/app.main.ts | 14 - .../src/main/webapp/app/app.module.ts | 70 - .../webapp/app/blocks/config/prod.config.ts | 9 - .../blocks/config/uib-pagination.config.ts | 14 - .../interceptor/auth-expired.interceptor.ts | 25 - .../blocks/interceptor/auth.interceptor.ts | 27 - .../interceptor/errorhandler.interceptor.ts | 25 - .../interceptor/notification.interceptor.ts | 34 - .../webapp/app/core/auth/account.service.ts | 108 - .../webapp/app/core/auth/auth-jwt.service.ts | 59 - .../main/webapp/app/core/auth/csrf.service.ts | 11 - .../app/core/auth/state-storage.service.ts | 46 - .../core/auth/user-route-access-service.ts | 52 - .../src/main/webapp/app/core/core.module.ts | 24 - .../src/main/webapp/app/core/index.ts | 11 - .../app/core/login/login-modal.service.ts | 27 - .../webapp/app/core/login/login.service.ts | 38 - .../webapp/app/core/user/account.model.ts | 12 - .../main/webapp/app/core/user/user.model.ts | 47 - .../main/webapp/app/core/user/user.service.ts | 39 - .../book/book-delete-dialog.component.html | 19 - .../book/book-delete-dialog.component.ts | 65 - .../entities/book/book-detail.component.html | 49 - .../entities/book/book-detail.component.ts | 36 - .../entities/book/book-update.component.html | 100 - .../entities/book/book-update.component.ts | 53 - .../app/entities/book/book.component.html | 62 - .../app/entities/book/book.component.ts | 65 - .../webapp/app/entities/book/book.module.ts | 23 - .../webapp/app/entities/book/book.route.ts | 93 - .../webapp/app/entities/book/book.service.ts | 81 - .../main/webapp/app/entities/book/index.ts | 6 - .../main/webapp/app/entities/entity.module.ts | 19 - .../main/webapp/app/home/home.component.html | 41 - .../main/webapp/app/home/home.component.ts | 44 - .../src/main/webapp/app/home/home.module.ts | 12 - .../src/main/webapp/app/home/home.route.ts | 12 - .../src/main/webapp/app/home/home.scss | 23 - .../src/main/webapp/app/home/index.ts | 3 - .../app/layouts/error/error.component.html | 19 - .../app/layouts/error/error.component.ts | 28 - .../webapp/app/layouts/error/error.route.ts | 36 - .../app/layouts/footer/footer.component.html | 3 - .../app/layouts/footer/footer.component.ts | 7 - .../src/main/webapp/app/layouts/index.ts | 9 - .../app/layouts/main/main.component.html | 11 - .../webapp/app/layouts/main/main.component.ts | 31 - .../app/layouts/navbar/navbar.component.html | 133 - .../app/layouts/navbar/navbar.component.ts | 65 - .../webapp/app/layouts/navbar/navbar.route.ts | 9 - .../webapp/app/layouts/navbar/navbar.scss | 53 - .../layouts/profiles/page-ribbon.component.ts | 26 - .../app/layouts/profiles/page-ribbon.scss | 31 - .../layouts/profiles/profile-info.model.ts | 6 - .../app/layouts/profiles/profile.service.ts | 40 - .../src/main/webapp/app/polyfills.ts | 70 - .../app/shared/alert/alert-error.component.ts | 110 - .../app/shared/alert/alert.component.ts | 35 - .../auth/has-any-authority.directive.ts | 42 - .../app/shared/constants/error.constants.ts | 4 - .../app/shared/constants/input.constants.ts | 2 - .../shared/constants/pagination.constants.ts | 1 - .../src/main/webapp/app/shared/index.ts | 12 - .../app/shared/login/login.component.html | 35 - .../app/shared/login/login.component.ts | 87 - .../webapp/app/shared/model/book.model.ts | 21 - .../webapp/app/shared/shared-common.module.ts | 10 - .../webapp/app/shared/shared-libs.module.ts | 20 - .../main/webapp/app/shared/shared.module.ts | 21 - .../app/shared/util/datepicker-adapter.ts | 21 - .../webapp/app/shared/util/request-util.ts | 18 - .../src/main/webapp/app/vendor.ts | 81 - .../src/main/webapp/content/css/loading.css | 152 - .../images/jhipster_family_member_0.svg | 198 - .../jhipster_family_member_0_head-192.png | Bin 13322 -> 0 bytes .../jhipster_family_member_0_head-256.png | Bin 17812 -> 0 bytes .../jhipster_family_member_0_head-384.png | Bin 27723 -> 0 bytes .../jhipster_family_member_0_head-512.png | Bin 37449 -> 0 bytes .../images/jhipster_family_member_1.svg | 9387 ----------------- .../jhipster_family_member_1_head-192.png | Bin 19660 -> 0 bytes .../jhipster_family_member_1_head-256.png | Bin 29152 -> 0 bytes .../jhipster_family_member_1_head-384.png | Bin 48895 -> 0 bytes .../jhipster_family_member_1_head-512.png | Bin 68803 -> 0 bytes .../images/jhipster_family_member_2.svg | 841 -- .../jhipster_family_member_2_head-192.png | Bin 11463 -> 0 bytes .../jhipster_family_member_2_head-256.png | Bin 15638 -> 0 bytes .../jhipster_family_member_2_head-384.png | Bin 23850 -> 0 bytes .../jhipster_family_member_2_head-512.png | Bin 32300 -> 0 bytes .../images/jhipster_family_member_3.svg | 308 - .../jhipster_family_member_3_head-192.png | Bin 13573 -> 0 bytes .../jhipster_family_member_3_head-256.png | Bin 19239 -> 0 bytes .../jhipster_family_member_3_head-384.png | Bin 30253 -> 0 bytes .../jhipster_family_member_3_head-512.png | Bin 41857 -> 0 bytes .../webapp/content/images/logo-jhipster.png | Bin 1085 -> 0 bytes .../content/scss/_bootstrap-variables.scss | 42 - .../src/main/webapp/content/scss/global.scss | 226 - .../src/main/webapp/content/scss/vendor.scss | 12 - .../src/main/webapp/favicon.ico | Bin 1574 -> 0 bytes .../src/main/webapp/index.html | 108 - .../src/main/webapp/manifest.webapp | 31 - .../src/main/webapp/robots.txt | 11 - .../src/main/webapp/swagger-ui/index.html | 166 - .../config/WebConfigurerUnitTest.java | 189 - .../WebConfigurerUnitTestController.java | 16 - .../HibernateTimeZoneIntegrationTest.java | 176 - ...omAuditEventRepositoryIntegrationTest.java | 165 - .../repository/timezone/DateTimeWrapper.java | 131 - .../timezone/DateTimeWrapperRepository.java | 12 - ...mainUserDetailsServiceIntegrationTest.java | 127 - .../security/MockAuthenticationManager.java | 54 - .../security/SecurityUtilsUnitTest.java | 73 - .../security/jwt/JWTFilterUnitTest.java | 115 - .../security/jwt/TokenProviderUnitTest.java | 111 - .../service/MailServiceIntegrationTest.java | 187 - .../service/UserServiceIntegrationTest.java | 192 - .../mapper/UserMapperIntegrationTest.java | 150 - .../rest/AccountResourceIntegrationTest.java | 818 -- .../rest/AuditResourceIntegrationTest.java | 162 - .../web/rest/BookResourceIntegrationTest.java | 416 - .../web/rest/LogsResourceIntegrationTest.java | 66 - .../baeldung/jhipster5/web/rest/TestUtil.java | 141 - .../UserJWTControllerIntegrationTest.java | 125 - .../web/rest/UserResourceIntegrationTest.java | 596 -- .../ExceptionTranslatorIntegrationTest.java | 150 - .../ExceptionTranslatorTestController.java | 86 - .../web/rest/util/PaginationUtilUnitTest.java | 44 - .../src/test/javascript/jest-global-mocks.ts | 15 - .../src/test/javascript/jest.conf.js | 26 - .../src/test/javascript/jest.ts | 2 - .../activate/activate.component.spec.ts | 72 - .../password-reset-finish.component.spec.ts | 119 - .../password-reset-init.component.spec.ts | 110 - .../password-strength-bar.component.spec.ts | 48 - .../password/password.component.spec.ts | 89 - .../register/register.component.spec.ts | 118 - .../settings/settings.component.spec.ts | 81 - .../app/admin/audits/audits.component.spec.ts | 133 - .../app/admin/audits/audits.service.spec.ts | 59 - .../configuration.component.spec.ts | 71 - .../configuration.service.spec.ts | 64 - .../app/admin/health/health.component.spec.ts | 321 - .../app/admin/logs/logs.component.spec.ts | 77 - .../spec/app/admin/logs/logs.service.spec.ts | 58 - .../admin/metrics/metrics.component.spec.ts | 55 - .../app/admin/metrics/metrics.service.spec.ts | 57 - ...management-delete-dialog.component.spec.ts | 54 - .../user-management-detail.component.spec.ts | 65 - .../user-management-update.component.spec.ts | 99 - .../user-management.component.spec.ts | 85 - .../app/core/user/account.service.spec.ts | 102 - .../spec/app/core/user/user.service.spec.ts | 66 - .../book/book-delete-dialog.component.spec.ts | 52 - .../book/book-detail.component.spec.ts | 40 - .../book/book-update.component.spec.ts | 60 - .../app/entities/book/book.component.spec.ts | 51 - .../app/entities/book/book.service.spec.ts | 137 - .../alert/alert-error.component.spec.ts | 134 - .../app/shared/login/login.component.spec.ts | 157 - .../spec/helpers/mock-account.service.ts | 35 - .../spec/helpers/mock-active-modal.service.ts | 12 - .../spec/helpers/mock-alert.service.ts | 11 - .../helpers/mock-event-manager.service.ts | 12 - .../spec/helpers/mock-login.service.ts | 29 - .../spec/helpers/mock-route.service.ts | 29 - .../helpers/mock-state-storage.service.ts | 22 - .../test/javascript/spec/helpers/spyobject.ts | 69 - .../src/test/javascript/spec/test.module.ts | 63 - .../src/test/resources/config/application.yml | 105 - .../resources/i18n/messages_en.properties | 1 - .../src/test/resources/logback.xml | 42 - .../resources/templates/mail/testEmail.html | 1 - .../bookstore-monolith/tsconfig-aot.json | 28 - jhipster-5/bookstore-monolith/tsconfig.json | 25 - jhipster-5/bookstore-monolith/tslint.json | 76 - .../webpack/logo-jhipster.png | Bin 4459 -> 0 bytes .../bookstore-monolith/webpack/utils.js | 44 - .../webpack/webpack.common.js | 86 - .../bookstore-monolith/webpack/webpack.dev.js | 148 - .../webpack/webpack.prod.js | 144 - jhipster-5/pom.xml | 22 - pom.xml | 4 - 382 files changed, 33227 deletions(-) delete mode 100644 jhipster-5/README.md delete mode 100644 jhipster-5/bookstore-monolith/.editorconfig delete mode 100644 jhipster-5/bookstore-monolith/.gitattributes delete mode 100644 jhipster-5/bookstore-monolith/.gitignore delete mode 100644 jhipster-5/bookstore-monolith/.huskyrc delete mode 100644 jhipster-5/bookstore-monolith/.jhipster/Book.json delete mode 100644 jhipster-5/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.jar delete mode 100644 jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.properties delete mode 100644 jhipster-5/bookstore-monolith/.prettierignore delete mode 100644 jhipster-5/bookstore-monolith/.prettierrc delete mode 100644 jhipster-5/bookstore-monolith/.yo-rc.json delete mode 100644 jhipster-5/bookstore-monolith/README.md delete mode 100644 jhipster-5/bookstore-monolith/angular.json delete mode 100755 jhipster-5/bookstore-monolith/mvnw delete mode 100644 jhipster-5/bookstore-monolith/mvnw.cmd delete mode 100644 jhipster-5/bookstore-monolith/package.json delete mode 100644 jhipster-5/bookstore-monolith/pom.xml delete mode 100644 jhipster-5/bookstore-monolith/postcss.config.js delete mode 100644 jhipster-5/bookstore-monolith/proxy.conf.json delete mode 100644 jhipster-5/bookstore-monolith/src/main/docker/.dockerignore delete mode 100644 jhipster-5/bookstore-monolith/src/main/docker/Dockerfile delete mode 100644 jhipster-5/bookstore-monolith/src/main/docker/app.yml delete mode 100644 jhipster-5/bookstore-monolith/src/main/docker/entrypoint.sh delete mode 100644 jhipster-5/bookstore-monolith/src/main/docker/mysql.yml delete mode 100644 jhipster-5/bookstore-monolith/src/main/docker/sonar.yml delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/ApplicationWebXml.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/BookstoreApp.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/aop/logging/LoggingAspect.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/ApplicationProperties.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/AsyncConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/CloudDatabaseConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/Constants.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DatabaseConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DateTimeFormatConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DefaultProfileUtil.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/JacksonConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LiquibaseConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LocaleConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingAspectConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/SecurityConfiguration.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/WebConfigurer.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/AuditEventConverter.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/AbstractAuditingEntity.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Authority.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Book.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/PersistentAuditEvent.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/User.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/AuthorityRepository.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/BookRepository.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/CustomAuditEventRepository.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/PersistenceAuditEventRepository.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/UserRepository.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/AuthoritiesConstants.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/DomainUserDetailsService.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SecurityUtils.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SpringSecurityAuditorAware.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/UserNotActivatedException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTConfigurer.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTFilter.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/TokenProvider.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/AuditEventService.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/BookService.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/MailService.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/UserService.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/BookDTO.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/PasswordChangeDTO.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/UserDTO.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/impl/BookServiceImpl.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/BookMapper.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/EntityMapper.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/UserMapper.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/util/RandomUtil.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AccountResource.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AuditResource.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/BookResource.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/LogsResource.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserJWTController.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserResource.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/BadRequestAlertException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/CustomParameterizedException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailAlreadyUsedException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailNotFoundException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ErrorConstants.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslator.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/FieldErrorVM.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InternalServerErrorException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InvalidPasswordException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/LoginAlreadyUsedException.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/HeaderUtil.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/PaginationUtil.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/KeyAndPasswordVM.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoggerVM.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoginVM.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/ManagedUserVM.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/package-info.java delete mode 100644 jhipster-5/bookstore-monolith/src/main/jib/entrypoint.sh delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/.h2.server.properties delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/banner.txt delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/application-dev.yml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/application-prod.yml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/application-tls.yml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/application.yml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/master.xml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users.csv delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/config/tls/keystore.p12 delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/i18n/messages.properties delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/logback-spring.xml delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/templates/error.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/404.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/index.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/index.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/app-routing.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/app.constants.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/app.main.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/app.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/core.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/index.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/index.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.scss delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/home/index.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/index.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/polyfills.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/index.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/app/vendor.ts delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/css/loading.css delete mode 100755 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-192.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-256.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-384.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-512.png delete mode 100755 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-192.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-256.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-384.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-512.png delete mode 100755 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2.svg delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-192.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-256.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-384.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-512.png delete mode 100755 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3.svg delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-192.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-256.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-384.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-512.png delete mode 100755 jhipster-5/bookstore-monolith/src/main/webapp/content/images/logo-jhipster.png delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/scss/global.scss delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/content/scss/vendor.scss delete mode 100755 jhipster-5/bookstore-monolith/src/main/webapp/favicon.ico delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/index.html delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/manifest.webapp delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/robots.txt delete mode 100644 jhipster-5/bookstore-monolith/src/main/webapp/swagger-ui/index.html delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTestController.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/timezone/HibernateTimeZoneIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/CustomAuditEventRepositoryIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapper.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapperRepository.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/DomainUserDetailsServiceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/SecurityUtilsUnitTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/JWTFilterUnitTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/TokenProviderUnitTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/MailServiceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/UserServiceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AccountResourceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AuditResourceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/BookResourceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/LogsResourceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/TestUtil.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserJWTControllerIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserResourceIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorIntegrationTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorTestController.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/util/PaginationUtilUnitTest.java delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/jest-global-mocks.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/jest.conf.js delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/jest.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/javascript/spec/test.module.ts delete mode 100644 jhipster-5/bookstore-monolith/src/test/resources/config/application.yml delete mode 100644 jhipster-5/bookstore-monolith/src/test/resources/i18n/messages_en.properties delete mode 100644 jhipster-5/bookstore-monolith/src/test/resources/logback.xml delete mode 100644 jhipster-5/bookstore-monolith/src/test/resources/templates/mail/testEmail.html delete mode 100644 jhipster-5/bookstore-monolith/tsconfig-aot.json delete mode 100644 jhipster-5/bookstore-monolith/tsconfig.json delete mode 100644 jhipster-5/bookstore-monolith/tslint.json delete mode 100644 jhipster-5/bookstore-monolith/webpack/logo-jhipster.png delete mode 100644 jhipster-5/bookstore-monolith/webpack/utils.js delete mode 100644 jhipster-5/bookstore-monolith/webpack/webpack.common.js delete mode 100644 jhipster-5/bookstore-monolith/webpack/webpack.dev.js delete mode 100644 jhipster-5/bookstore-monolith/webpack/webpack.prod.js delete mode 100644 jhipster-5/pom.xml diff --git a/jhipster-5/README.md b/jhipster-5/README.md deleted file mode 100644 index ba05641af0..0000000000 --- a/jhipster-5/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## JHipster 5 - -This module contains articles about JHipster 5. This is an aggregator module, articles are in the relevant submodules. diff --git a/jhipster-5/bookstore-monolith/.editorconfig b/jhipster-5/bookstore-monolith/.editorconfig deleted file mode 100644 index a79c052f53..0000000000 --- a/jhipster-5/bookstore-monolith/.editorconfig +++ /dev/null @@ -1,24 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - -[*] - -# Change these settings to your own preference -indent_style = space -indent_size = 4 - -# We recommend you to keep these unchanged -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false - -[package.json] -indent_style = space -indent_size = 2 diff --git a/jhipster-5/bookstore-monolith/.gitattributes b/jhipster-5/bookstore-monolith/.gitattributes deleted file mode 100644 index c013844d10..0000000000 --- a/jhipster-5/bookstore-monolith/.gitattributes +++ /dev/null @@ -1,148 +0,0 @@ -# This file is inspired by https://github.com/alexkaratarakis/gitattributes -# -# Auto detect text files and perform LF normalization -# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ -* text=auto - -# The above will handle all files NOT found below -# These files are text and should be normalized (Convert crlf => lf) - -*.bat text eol=crlf -*.coffee text -*.css text -*.cql text -*.df text -*.ejs text -*.html text -*.java text -*.js text -*.json text -*.less text -*.properties text -*.sass text -*.scss text -*.sh text eol=lf -*.sql text -*.txt text -*.ts text -*.xml text -*.yaml text -*.yml text - -# Documents -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain -*.markdown text -*.md text -*.adoc text -*.textile text -*.mustache text -*.csv text -*.tab text -*.tsv text -*.txt text -AUTHORS text -CHANGELOG text -CHANGES text -CONTRIBUTING text -COPYING text -copyright text -*COPYRIGHT* text -INSTALL text -license text -LICENSE text -NEWS text -readme text -*README* text -TODO text - -# Graphics -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.tif binary -*.tiff binary -*.ico binary -# SVG treated as an asset (binary) by default. If you want to treat it as text, -# comment-out the following line and uncomment the line after. -*.svg binary -#*.svg text -*.eps binary - -# These files are binary and should be left untouched -# (binary is a macro for -text -diff) -*.class binary -*.jar binary -*.war binary - -## LINTERS -.csslintrc text -.eslintrc text -.jscsrc text -.jshintrc text -.jshintignore text -.stylelintrc text - -## CONFIGS -*.conf text -*.config text -.editorconfig text -.gitattributes text -.gitconfig text -.gitignore text -.htaccess text -*.npmignore text - -## HEROKU -Procfile text -.slugignore text - -## AUDIO -*.kar binary -*.m4a binary -*.mid binary -*.midi binary -*.mp3 binary -*.ogg binary -*.ra binary - -## VIDEO -*.3gpp binary -*.3gp binary -*.as binary -*.asf binary -*.asx binary -*.fla binary -*.flv binary -*.m4v binary -*.mng binary -*.mov binary -*.mp4 binary -*.mpeg binary -*.mpg binary -*.swc binary -*.swf binary -*.webm binary - -## ARCHIVES -*.7z binary -*.gz binary -*.rar binary -*.tar binary -*.zip binary - -## FONTS -*.ttf binary -*.eot binary -*.otf binary -*.woff binary -*.woff2 binary diff --git a/jhipster-5/bookstore-monolith/.gitignore b/jhipster-5/bookstore-monolith/.gitignore deleted file mode 100644 index b3f7df5404..0000000000 --- a/jhipster-5/bookstore-monolith/.gitignore +++ /dev/null @@ -1,146 +0,0 @@ -###################### -# Project Specific -###################### -/src/main/webapp/content/css/main.css -/target/www/** -/src/test/javascript/coverage/ - -###################### -# Node -###################### -/node/ -node_tmp/ -node_modules/ -npm-debug.log.* -/.awcache/* -/.cache-loader/* -package-lock.json - -###################### -# SASS -###################### -.sass-cache/ - -###################### -# Eclipse -###################### -*.pydevproject -.project -.metadata -tmp/ -tmp/**/* -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath -.factorypath -/src/main/resources/rebel.xml - -# External tool builders -.externalToolBuilders/** - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -###################### -# Intellij -###################### -.idea/ -*.iml -*.iws -*.ipr -*.ids -*.orig -classes/ -out/ - -###################### -# Visual Studio Code -###################### -.vscode/ - -###################### -# Maven -###################### -/log/ -/target/ - -###################### -# Gradle -###################### -.gradle/ -/build/ - -###################### -# Package Files -###################### -*.jar -*.war -*.ear -*.db - -###################### -# Windows -###################### -# Windows image file caches -Thumbs.db - -# Folder config file -Desktop.ini - -###################### -# Mac OSX -###################### -.DS_Store -.svn - -# Thumbnails -._* - -# Files that might appear on external disk -.Spotlight-V100 -.Trashes - -###################### -# Directories -###################### -/bin/ -/deploy/ - -###################### -# Logs -###################### -*.log* - -###################### -# Others -###################### -*.class -*.*~ -*~ -.merge_file* - -###################### -# Gradle Wrapper -###################### -!gradle/wrapper/gradle-wrapper.jar - -###################### -# Maven Wrapper -###################### -!.mvn/wrapper/maven-wrapper.jar - -###################### -# ESLint -###################### -.eslintcache diff --git a/jhipster-5/bookstore-monolith/.huskyrc b/jhipster-5/bookstore-monolith/.huskyrc deleted file mode 100644 index 9e18d87674..0000000000 --- a/jhipster-5/bookstore-monolith/.huskyrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "hooks": { - "pre-commit": "lint-staged" - } -} diff --git a/jhipster-5/bookstore-monolith/.jhipster/Book.json b/jhipster-5/bookstore-monolith/.jhipster/Book.json deleted file mode 100644 index 4c5bd1fa52..0000000000 --- a/jhipster-5/bookstore-monolith/.jhipster/Book.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "fluentMethods": true, - "clientRootFolder": "", - "relationships": [], - "fields": [ - { - "fieldName": "title", - "fieldType": "String", - "fieldValidateRules": [ - "required" - ] - }, - { - "fieldName": "author", - "fieldType": "String", - "fieldValidateRules": [ - "required" - ] - }, - { - "fieldName": "published", - "fieldType": "LocalDate", - "fieldValidateRules": [ - "required" - ] - }, - { - "fieldName": "quantity", - "fieldType": "Integer", - "fieldValidateRules": [ - "required", - "min" - ], - "fieldValidateRulesMin": 0 - }, - { - "fieldName": "price", - "fieldType": "Double", - "fieldValidateRules": [ - "required", - "min" - ], - "fieldValidateRulesMin": 0 - } - ], - "changelogDate": "20190319124041", - "dto": "mapstruct", - "searchEngine": false, - "service": "serviceImpl", - "entityTableName": "book", - "databaseType": "sql", - "jpaMetamodelFiltering": false, - "pagination": "no" -} diff --git a/jhipster-5/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java b/jhipster-5/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index 8fe1fab5a2..0000000000 --- a/jhipster-5/bookstore-monolith/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,110 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = - "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if (mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if (mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: : " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if (!outputFile.getParentFile().exists()) { - if (!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.jar b/jhipster-5/bookstore-monolith/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 01e67997377a393fd672c7dcde9dccbedf0cb1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48337 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - wget "$jarUrl" -O "$wrapperJarPath" - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - curl -o "$wrapperJarPath" "$jarUrl" - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/jhipster-5/bookstore-monolith/mvnw.cmd b/jhipster-5/bookstore-monolith/mvnw.cmd deleted file mode 100644 index e5cfb0ae9e..0000000000 --- a/jhipster-5/bookstore-monolith/mvnw.cmd +++ /dev/null @@ -1,161 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" -FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - echo Found %WRAPPER_JAR% -) else ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" - echo Finished downloading %WRAPPER_JAR% -) -@REM End of extension - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/jhipster-5/bookstore-monolith/package.json b/jhipster-5/bookstore-monolith/package.json deleted file mode 100644 index 46b920edb3..0000000000 --- a/jhipster-5/bookstore-monolith/package.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "name": "bookstore", - "version": "0.0.0", - "description": "Description for Bookstore", - "private": true, - "license": "UNLICENSED", - "cacheDirectories": [ - "node_modules" - ], - "dependencies": { - "@angular/common": "7.2.4", - "@angular/compiler": "7.2.4", - "@angular/core": "7.2.4", - "@angular/forms": "7.2.4", - "@angular/platform-browser": "7.2.4", - "@angular/platform-browser-dynamic": "7.2.4", - "@angular/router": "7.2.4", - "@fortawesome/angular-fontawesome": "0.3.0", - "@fortawesome/fontawesome-svg-core": "1.2.14", - "@fortawesome/free-solid-svg-icons": "5.7.1", - "@ng-bootstrap/ng-bootstrap": "4.0.2", - "@ngx-translate/core": "11.0.1", - "@ngx-translate/http-loader": "4.0.0", - "bootstrap": "4.2.1", - "core-js": "2.6.4", - "moment": "2.24.0", - "ng-jhipster": "0.9.1", - "ngx-cookie": "2.0.1", - "ngx-infinite-scroll": "7.0.1", - "ngx-webstorage": "2.0.1", - "rxjs": "6.4.0", - "swagger-ui": "2.2.10", - "tslib": "1.9.3", - "zone.js": "0.8.29" - }, - "devDependencies": { - "@angular/cli": "7.3.1", - "@angular/compiler-cli": "7.2.4", - "@ngtools/webpack": "7.3.1", - "@types/jest": "24.0.0", - "@types/node": "10.12.24", - "angular-router-loader": "0.8.5", - "angular2-template-loader": "0.6.2", - "autoprefixer": "9.4.7", - "browser-sync": "2.26.3", - "browser-sync-webpack-plugin": "2.2.2", - "cache-loader": "2.0.1", - "codelyzer": "4.5.0", - "copy-webpack-plugin": "4.6.0", - "css-loader": "2.1.0", - "file-loader": "3.0.1", - "fork-ts-checker-webpack-plugin": "0.5.2", - "friendly-errors-webpack-plugin": "1.7.0", - "generator-jhipster": "5.8.2", - "html-loader": "0.5.5", - "html-webpack-plugin": "3.2.0", - "husky": "1.3.1", - "jest": "24.1.0", - "jest-junit": "6.2.1", - "jest-preset-angular": "6.0.2", - "jest-sonar-reporter": "2.0.0", - "lint-staged": "8.1.3", - "mini-css-extract-plugin": "0.5.0", - "moment-locales-webpack-plugin": "1.0.7", - "optimize-css-assets-webpack-plugin": "5.0.1", - "prettier": "1.16.4", - "reflect-metadata": "0.1.13", - "rimraf": "2.6.3", - "simple-progress-webpack-plugin": "1.1.2", - "style-loader": "0.23.1", - "terser-webpack-plugin": "1.2.2", - "thread-loader": "2.1.2", - "to-string-loader": "1.1.5", - "ts-loader": "5.3.3", - "tslint": "5.12.1", - "tslint-config-prettier": "1.18.0", - "tslint-loader": "3.6.0", - "typescript": "3.2.4", - "sass": "1.17.0", - "sass-loader": "7.1.0", - "postcss-loader": "3.0.0", - "xml2js": "0.4.19", - "webpack": "4.29.3", - "webpack-cli": "3.2.3", - "webpack-dev-server": "3.1.14", - "webpack-merge": "4.2.1", - "webpack-notifier": "1.7.0", - "webpack-visualizer-plugin": "0.1.11", - "workbox-webpack-plugin": "3.6.3", - "write-file-webpack-plugin": "4.5.0" - }, - "engines": { - "node": ">=8.9.0" - }, - "lint-staged": { - "{,src/**/}*.{md,json,ts,css,scss}": [ - "prettier --write", - "git add" - ] - }, - "scripts": { - "prettier:format": "prettier --write \"{,src/**/}*.{md,json,ts,css,scss}\"", - "lint": "tslint --project tsconfig.json -e 'node_modules/**'", - "lint:fix": "npm run lint -- --fix", - "ngc": "ngc -p tsconfig-aot.json", - "cleanup": "rimraf target/{aot,www}", - "clean-www": "rimraf target//www/app/{src,target/}", - "start": "npm run webpack:dev", - "start-tls": "npm run webpack:dev -- --env.tls", - "serve": "npm run start", - "build": "npm run webpack:prod", - "test": "npm run lint && jest --coverage --logHeapUsage -w=2 --config src/test/javascript/jest.conf.js", - "test:watch": "npm run test -- --watch", - "webpack:dev": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --env.stats=minimal", - "webpack:dev-verbose": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --profile --progress --env.stats=normal", - "webpack:build:main": "npm run webpack -- --config webpack/webpack.dev.js --env.stats=minimal", - "webpack:build": "npm run cleanup && npm run webpack:build:main", - "webpack:prod:main": "npm run webpack -- --config webpack/webpack.prod.js --profile", - "webpack:prod": "npm run cleanup && npm run webpack:prod:main && npm run clean-www", - "webpack:test": "npm run test", - "webpack-dev-server": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js", - "webpack": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack.js" - }, - "jestSonar": { - "reportPath": "target/test-results/jest", - "reportFile": "TESTS-results-sonar.xml" - } -} diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-5/bookstore-monolith/pom.xml deleted file mode 100644 index ccaa802a39..0000000000 --- a/jhipster-5/bookstore-monolith/pom.xml +++ /dev/null @@ -1,1233 +0,0 @@ - - - 4.0.0 - - com.baeldung.jhipster5 - bookstore-monolith - 0.0.1-SNAPSHOT - war - bookstore-monolith - - - jhipster-5 - com.baeldung.jhipster - 1.0.0-SNAPSHOT - - - - - - - - - - - - - - - - io.github.jhipster - jhipster-dependencies - ${jhipster-dependencies.version} - pom - import - - - - - - - - io.github.jhipster - jhipster-framework - - - - com.fasterxml.jackson.datatype - jackson-datatype-hibernate5 - - - com.fasterxml.jackson.datatype - jackson-datatype-hppc - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - com.fasterxml.jackson.module - jackson-module-afterburner - - - com.h2database - h2 - test - - - com.jayway.jsonpath - json-path - test - - - - io.springfox - springfox-swagger2 - - - io.springfox - springfox-bean-validators - - - com.mattbertolini - liquibase-slf4j - - - com.zaxxer - HikariCP - - - commons-io - commons-io - - - org.apache.commons - commons-lang3 - - - org.assertj - assertj-core - test - - - org.hibernate - hibernate-jpamodelgen - provided - - - org.hibernate - hibernate-envers - - - org.hibernate.validator - hibernate-validator - - - org.liquibase - liquibase-core - - - net.logstash.logback - logstash-logback-encoder - - - org.mapstruct - mapstruct-jdk8 - - - org.mapstruct - mapstruct-processor - provided - - - org.springframework.boot - spring-boot-configuration-processor - provided - - - org.springframework.boot - spring-boot-loader-tools - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-aop - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-logging - - - org.springframework.boot - spring-boot-starter-mail - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-test - test - - - org.springframework.security - spring-security-test - test - - - org.zalando - problem-spring-web - - - io.jsonwebtoken - jjwt-api - - - io.jsonwebtoken - jjwt-impl - runtime - - - io.jsonwebtoken - jjwt-jackson - runtime - - - - org.springframework.boot - spring-boot-starter-cloud-connectors - - - - org.springframework.security - spring-security-data - - - io.micrometer - micrometer-registry-prometheus - - - io.dropwizard.metrics - metrics-core - - - net.bytebuddy - byte-buddy - ${byte-buddy.version} - test - - - - - - spring-boot:run - - - org.codehaus.mojo - properties-maven-plugin - 1.0.0 - - - - set-system-properties - - - - - org.slf4j.simpleLogger.log.com.github.eirslett - error - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - - - - org.hibernate - hibernate-jpamodelgen - ${hibernate.version} - - - - - - - org.apache.maven.plugins - maven-eclipse-plugin - - - org.apache.maven.plugins - maven-enforcer-plugin - - - org.apache.maven.plugins - maven-idea-plugin - - - org.apache.maven.plugins - maven-resources-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - - org.jacoco - jacoco-maven-plugin - - - org.sonarsource.scanner.maven - sonar-maven-plugin - - - org.liquibase - liquibase-maven-plugin - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - ${start-class} - true - true - - - - - com.google.cloud.tools - jib-maven-plugin - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - - com.github.eirslett - frontend-maven-plugin - ${frontend-maven-plugin.version} - - - pl.project13.maven - git-commit-id-plugin - ${git-commit-id-plugin.version} - - - - revision - - - - - false - true - - ^git.commit.id.abbrev$ - ^git.commit.id.describe$ - ^git.branch$ - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-maven-plugin.version} - - - pre-unit-tests - - prepare-agent - - - - ${project.testresult.directory}/coverage/jacoco/jacoco.exec - - - - - post-unit-test - test - - report - - - ${project.testresult.directory}/coverage/jacoco/jacoco.exec - ${project.testresult.directory}/coverage/jacoco - - - - - - com.google.cloud.tools - jib-maven-plugin - ${jib-maven-plugin.version} - - - openjdk:8-jre-alpine - - - bookstore:latest - - - - sh - - chmod +x /entrypoint.sh && sync && /entrypoint.sh - - - 8080 - - - ALWAYS - 0 - - true - - - - - org.liquibase - liquibase-maven-plugin - ${liquibase.version} - - ${project.basedir}/src/main/resources/config/liquibase/master.xml - ${project.basedir}/src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml - - - - Bookstore - - hibernate:spring:com.baeldung.jhipster5.domain?dialect=&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy - true - debug - - - - org.javassist - javassist - ${javassist.version} - - - org.liquibase.ext - liquibase-hibernate5 - ${liquibase-hibernate5.version} - - - org.springframework.boot - spring-boot-starter-data-jpa - ${spring-boot.version} - - - javax.validation - validation-api - ${validation-api.version} - - - - - maven-clean-plugin - ${maven-clean-plugin.version} - - - org.apache.maven.plugins - maven-eclipse-plugin - ${maven-eclipse-plugin.version} - - true - true - - - - org.apache.maven.plugins - maven-enforcer-plugin - ${maven-enforcer-plugin.version} - - - enforce-versions - - enforce - - - - - - - You are running an older version of Maven. JHipster requires at least Maven ${maven.version} - [${maven.version},) - - - - You are running an incompatible version of Java. JHipster requires JDK ${java.version} - [1.8,1.9) - - - - - - org.apache.maven.plugins - maven-idea-plugin - ${maven-idea-plugin.version} - - node_modules - - - - org.apache.maven.plugins - maven-resources-plugin - ${maven-resources-plugin.version} - - - default-resources - validate - - copy-resources - - - ${project.build.directory}/classes - false - - # - - - - src/main/resources/ - true - - config/*.yml - - - - src/main/resources/ - false - - config/*.yml - - - - - - - jib-www-resources - verify - - copy-resources - - - ${project.build.directory}/classes/static/ - - - ${project.build.directory}/www - false - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - alphabetical - - - false - ${sonar.junit.reportsPath} - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - - net.alchim31.maven - scala-maven-plugin - ${scala-maven-plugin.version} - - - compile - compile - - add-source - compile - - - - test-compile - test-compile - - add-source - testCompile - - - - - incremental - true - ${scala.version} - - - - org.sonarsource.scanner.maven - sonar-maven-plugin - ${sonar-maven-plugin.version} - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - - - - no-liquibase - - ,no-liquibase - - - - swagger - - ,swagger - - - - tls - - ,tls - - - - webpack - - - ${basedir}/target/www/app/main.bundle.js - - - - - org.springframework.boot - spring-boot-starter-undertow - - - org.springframework.boot - spring-boot-devtools - true - - - com.h2database - h2 - - - - - - com.github.eirslett - frontend-maven-plugin - - - install node and npm - - install-node-and-npm - - - ${node.version} - ${npm.version} - - - - npm install - - npm - - - - webpack build dev - - npm - - generate-resources - - run webpack:build - false - - - - - - org.apache.maven.plugins - maven-war-plugin - - false - target/www/ - - - src/main/webapp - - WEB-INF/** - - - - - - - - - - dev${profile.no-liquibase} - - - - dev - - true - - - - org.springframework.boot - spring-boot-starter-undertow - - - org.springframework.boot - spring-boot-devtools - true - - - com.h2database - h2 - - - - - - org.apache.maven.plugins - maven-war-plugin - - false - target/www/ - - - src/main/webapp - - WEB-INF/** - - - - - - - - - - dev${profile.tls}${profile.no-liquibase} - - - - prod - - - org.springframework.boot - spring-boot-starter-undertow - - - - - - maven-clean-plugin - - - - target/www/ - - - - - - org.apache.maven.plugins - maven-war-plugin - - false - target/www/ - - - src/main/webapp - - WEB-INF/** - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - ${start-class} - true - - - - - build-info - - - - - - com.github.eirslett - frontend-maven-plugin - - - install node and npm - - install-node-and-npm - - - ${node.version} - ${npm.version} - - - - npm install - - npm - - - install - - - - webpack build test - - npm - - test - - run webpack:test - false - - - - webpack build prod - - npm - - generate-resources - - run webpack:prod - false - - - - - - pl.project13.maven - git-commit-id-plugin - - - - - - prod${profile.swagger}${profile.no-liquibase} - - - - - cc - - - org.springframework.boot - spring-boot-starter-undertow - - - org.springframework.boot - spring-boot-devtools - true - - - - - - org.apache.maven.plugins - maven-war-plugin - - false - src/main/webapp/ - - - - org.springframework.boot - spring-boot-maven-plugin - - ${start-class} - true - true - true - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - default-compile - none - - - default-testCompile - none - - - - - net.alchim31.maven - scala-maven-plugin - - - - - - dev,swagger - - - - - IDE - - - org.mapstruct - mapstruct-processor - - - org.hibernate - hibernate-jpamodelgen - - - - - - eclipse - - - m2e.version - - - - - - - - org.eclipse.m2e - lifecycle-mapping - ${lifecycle-mapping.version} - - - - - - org.jacoco - - jacoco-maven-plugin - - - ${jacoco-maven-plugin.version} - - - prepare-agent - - - - - - - - - com.github.eirslett - frontend-maven-plugin - ${frontend-maven-plugin.version} - - install-node-and-npm - npm - - - - - - - - - - - - - - - - - default-first - - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - - - default-second - - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - - - integration-lite-first - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - - - integration-lite-second - - - - com.github.eirslett - frontend-maven-plugin - - - - install node and npm - none - - - npm install - none - - - webpack build dev - none - - - webpack build test - none - - - - - - - - - - - 3.0.0 - 1.8 - 2.12.6 - v10.15.0 - 6.4.1 - ${project.build.directory}/test-results - yyyyMMddHHmmss - ${java.version} - ${java.version} - -Djava.security.egd=file:/dev/./urandom -Xmx256m - jdt_apt - false - - - - - - - 2.1.1 - - 2.7.8 - - 5.2.17.Final - - 3.22.0-GA - - 3.5.5 - 3.6 - 2.0.1.Final - 1.2.0.Final - - - 3.1.0 - 3.8.0 - 2.10 - 3.0.0-M2 - 2.2.1 - 3.1.0 - 2.22.2 - 3.2.2 - 0.9.11 - 1.6 - 0.8.2 - 1.0.0 - 3.4.2 - 3.5.0.1254 - 2.2.5 - - - http://localhost:9001 - src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.* - S3437,S4502,S4684,UndocumentedApi,BoldAndItalicTagsCheck - - src/main/webapp/app/**/*.* - Web:BoldAndItalicTagsCheck - - src/main/java/**/* - squid:S3437 - - src/main/java/**/* - squid:UndocumentedApi - - src/main/java/**/* - squid:S4502 - - src/main/java/**/* - squid:S4684 - ${project.testresult.directory}/coverage/jacoco/jacoco.exec - jacoco - ${project.testresult.directory}/lcov.info - ${project.basedir}/src/main/ - ${project.testresult.directory} - ${project.basedir}/src/test/ - - - - diff --git a/jhipster-5/bookstore-monolith/postcss.config.js b/jhipster-5/bookstore-monolith/postcss.config.js deleted file mode 100644 index a26de7e9f1..0000000000 --- a/jhipster-5/bookstore-monolith/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: [ - require('autoprefixer') - ] -} diff --git a/jhipster-5/bookstore-monolith/proxy.conf.json b/jhipster-5/bookstore-monolith/proxy.conf.json deleted file mode 100644 index 8b41fdf7fa..0000000000 --- a/jhipster-5/bookstore-monolith/proxy.conf.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "*": { - "target": "http://localhost:8080", - "secure": false, - "loglevel": "debug" - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/docker/.dockerignore b/jhipster-5/bookstore-monolith/src/main/docker/.dockerignore deleted file mode 100644 index b03bdc71ee..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/docker/.dockerignore +++ /dev/null @@ -1,14 +0,0 @@ -# https://docs.docker.com/engine/reference/builder/#dockerignore-file -classes/ -generated-sources/ -generated-test-sources/ -h2db/ -maven-archiver/ -maven-status/ -reports/ -surefire-reports/ -test-classes/ -test-results/ -www/ -!*.jar -!*.war diff --git a/jhipster-5/bookstore-monolith/src/main/docker/Dockerfile b/jhipster-5/bookstore-monolith/src/main/docker/Dockerfile deleted file mode 100644 index 43fadcb6f8..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/docker/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM openjdk:8-jre-alpine - -ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \ - JHIPSTER_SLEEP=0 \ - JAVA_OPTS="" - -# Add a jhipster user to run our application so that it doesn't need to run as root -RUN adduser -D -s /bin/sh jhipster -WORKDIR /home/jhipster - -ADD entrypoint.sh entrypoint.sh -RUN chmod 755 entrypoint.sh && chown jhipster:jhipster entrypoint.sh -USER jhipster - -ENTRYPOINT ["./entrypoint.sh"] - -EXPOSE 8080 - -ADD *.war app.war - diff --git a/jhipster-5/bookstore-monolith/src/main/docker/app.yml b/jhipster-5/bookstore-monolith/src/main/docker/app.yml deleted file mode 100644 index f60f0f5038..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/docker/app.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: '2' -services: - bookstore-app: - image: bookstore - environment: - - _JAVA_OPTIONS=-Xmx512m -Xms256m - - SPRING_PROFILES_ACTIVE=prod,swagger - - SPRING_DATASOURCE_URL=jdbc:mysql://bookstore-mysql:3306/bookstore?useUnicode=true&characterEncoding=utf8&useSSL=false - - JHIPSTER_SLEEP=10 # gives time for the database to boot before the application - ports: - - 8080:8080 - bookstore-mysql: - extends: - file: mysql.yml - service: bookstore-mysql diff --git a/jhipster-5/bookstore-monolith/src/main/docker/entrypoint.sh b/jhipster-5/bookstore-monolith/src/main/docker/entrypoint.sh deleted file mode 100644 index ccffafb5a4..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/docker/entrypoint.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP} -exec java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar "${HOME}/app.war" "$@" diff --git a/jhipster-5/bookstore-monolith/src/main/docker/mysql.yml b/jhipster-5/bookstore-monolith/src/main/docker/mysql.yml deleted file mode 100644 index 13faba0457..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/docker/mysql.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: '2' -services: - bookstore-mysql: - image: mysql:5.7.20 - # volumes: - # - ~/volumes/jhipster/Bookstore/mysql/:/var/lib/mysql/ - environment: - - MYSQL_USER=root - - MYSQL_ALLOW_EMPTY_PASSWORD=yes - - MYSQL_DATABASE=bookstore - ports: - - 3306:3306 - command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp diff --git a/jhipster-5/bookstore-monolith/src/main/docker/sonar.yml b/jhipster-5/bookstore-monolith/src/main/docker/sonar.yml deleted file mode 100644 index 756175b7d0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/docker/sonar.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: '2' -services: - bookstore-sonar: - image: sonarqube:7.1 - ports: - - 9001:9000 - - 9092:9092 diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/ApplicationWebXml.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/ApplicationWebXml.java deleted file mode 100644 index ca65727e77..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/ApplicationWebXml.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.jhipster5; - -import com.baeldung.jhipster5.config.DefaultProfileUtil; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -/** - * This is a helper Java class that provides an alternative to creating a web.xml. - * This will be invoked only when the application is deployed to a Servlet container like Tomcat, JBoss etc. - */ -public class ApplicationWebXml extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - /** - * set a default to use when no profile is configured. - */ - DefaultProfileUtil.addDefaultProfile(application.application()); - return application.sources(BookstoreApp.class); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/BookstoreApp.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/BookstoreApp.java deleted file mode 100644 index e7ca925228..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/BookstoreApp.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.baeldung.jhipster5; - -import com.baeldung.jhipster5.config.ApplicationProperties; -import com.baeldung.jhipster5.config.DefaultProfileUtil; - -import io.github.jhipster.config.JHipsterConstants; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.core.env.Environment; - -import javax.annotation.PostConstruct; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Collection; - -@SpringBootApplication -@EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class}) -public class BookstoreApp { - - private static final Logger log = LoggerFactory.getLogger(BookstoreApp.class); - - private final Environment env; - - public BookstoreApp(Environment env) { - this.env = env; - } - - /** - * Initializes Bookstore. - *

- * Spring profiles can be configured with a program argument --spring.profiles.active=your-active-profile - *

- * You can find more information on how profiles work with JHipster on https://www.jhipster.tech/profiles/. - */ - @PostConstruct - public void initApplication() { - Collection activeProfiles = Arrays.asList(env.getActiveProfiles()); - if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { - log.error("You have misconfigured your application! It should not run " + - "with both the 'dev' and 'prod' profiles at the same time."); - } - if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_CLOUD)) { - log.error("You have misconfigured your application! It should not " + - "run with both the 'dev' and 'cloud' profiles at the same time."); - } - } - - /** - * Main method, used to run the application. - * - * @param args the command line arguments - */ - public static void main(String[] args) { - SpringApplication app = new SpringApplication(BookstoreApp.class); - DefaultProfileUtil.addDefaultProfile(app); - Environment env = app.run(args).getEnvironment(); - logApplicationStartup(env); - } - - private static void logApplicationStartup(Environment env) { - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - String serverPort = env.getProperty("server.port"); - String contextPath = env.getProperty("server.servlet.context-path"); - if (StringUtils.isBlank(contextPath)) { - contextPath = "/"; - } - String hostAddress = "localhost"; - try { - hostAddress = InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - log.warn("The host name could not be determined, using `localhost` as fallback"); - } - log.info("\n----------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}{}\n\t" + - "External: \t{}://{}:{}{}\n\t" + - "Profile(s): \t{}\n----------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - serverPort, - contextPath, - protocol, - hostAddress, - serverPort, - contextPath, - env.getActiveProfiles()); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/aop/logging/LoggingAspect.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/aop/logging/LoggingAspect.java deleted file mode 100644 index 0379637061..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/aop/logging/LoggingAspect.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.baeldung.jhipster5.aop.logging; - -import io.github.jhipster.config.JHipsterConstants; - -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; - -import java.util.Arrays; - -/** - * Aspect for logging execution of service and repository Spring components. - * - * By default, it only runs with the "dev" profile. - */ -@Aspect -public class LoggingAspect { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - private final Environment env; - - public LoggingAspect(Environment env) { - this.env = env; - } - - /** - * Pointcut that matches all repositories, services and Web REST endpoints. - */ - @Pointcut("within(@org.springframework.stereotype.Repository *)" + - " || within(@org.springframework.stereotype.Service *)" + - " || within(@org.springframework.web.bind.annotation.RestController *)") - public void springBeanPointcut() { - // Method is empty as this is just a Pointcut, the implementations are in the advices. - } - - /** - * Pointcut that matches all Spring beans in the application's main packages. - */ - @Pointcut("within(com.baeldung.jhipster5.repository..*)"+ - " || within(com.baeldung.jhipster5.service..*)"+ - " || within(com.baeldung.jhipster5.web.rest..*)") - public void applicationPackagePointcut() { - // Method is empty as this is just a Pointcut, the implementations are in the advices. - } - - /** - * Advice that logs methods throwing exceptions. - * - * @param joinPoint join point for advice - * @param e exception - */ - @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e") - public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) { - log.error("Exception in {}.{}() with cause = \'{}\' and exception = \'{}\'", joinPoint.getSignature().getDeclaringTypeName(), - joinPoint.getSignature().getName(), e.getCause() != null? e.getCause() : "NULL", e.getMessage(), e); - - } else { - log.error("Exception in {}.{}() with cause = {}", joinPoint.getSignature().getDeclaringTypeName(), - joinPoint.getSignature().getName(), e.getCause() != null? e.getCause() : "NULL"); - } - } - - /** - * Advice that logs when a method is entered and exited. - * - * @param joinPoint join point for advice - * @return result - * @throws Throwable throws IllegalArgumentException - */ - @Around("applicationPackagePointcut() && springBeanPointcut()") - public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { - if (log.isDebugEnabled()) { - log.debug("Enter: {}.{}() with argument[s] = {}", joinPoint.getSignature().getDeclaringTypeName(), - joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs())); - } - try { - Object result = joinPoint.proceed(); - if (log.isDebugEnabled()) { - log.debug("Exit: {}.{}() with result = {}", joinPoint.getSignature().getDeclaringTypeName(), - joinPoint.getSignature().getName(), result); - } - return result; - } catch (IllegalArgumentException e) { - log.error("Illegal argument: {} in {}.{}()", Arrays.toString(joinPoint.getArgs()), - joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); - - throw e; - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/ApplicationProperties.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/ApplicationProperties.java deleted file mode 100644 index 4ca3e9bd85..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/ApplicationProperties.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.jhipster5.config; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * Properties specific to Bookstore. - *

- * Properties are configured in the application.yml file. - * See {@link io.github.jhipster.config.JHipsterProperties} for a good example. - */ -@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) -public class ApplicationProperties { - -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/AsyncConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/AsyncConfiguration.java deleted file mode 100644 index 414fe152bf..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/AsyncConfiguration.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.baeldung.jhipster5.config; - -import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor; -import io.github.jhipster.config.JHipsterProperties; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.*; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.scheduling.annotation.SchedulingConfigurer; -import org.springframework.scheduling.config.ScheduledTaskRegistrar; - -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -@Configuration -@EnableAsync -@EnableScheduling -public class AsyncConfiguration implements AsyncConfigurer, SchedulingConfigurer { - - private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class); - - private final JHipsterProperties jHipsterProperties; - - public AsyncConfiguration(JHipsterProperties jHipsterProperties) { - this.jHipsterProperties = jHipsterProperties; - } - - @Override - @Bean(name = "taskExecutor") - public Executor getAsyncExecutor() { - log.debug("Creating Async Task Executor"); - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(jHipsterProperties.getAsync().getCorePoolSize()); - executor.setMaxPoolSize(jHipsterProperties.getAsync().getMaxPoolSize()); - executor.setQueueCapacity(jHipsterProperties.getAsync().getQueueCapacity()); - executor.setThreadNamePrefix("bookstore-Executor-"); - return new ExceptionHandlingAsyncTaskExecutor(executor); - } - - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return new SimpleAsyncUncaughtExceptionHandler(); - } - - @Override - public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { - taskRegistrar.setScheduler(scheduledTaskExecutor()); - } - - @Bean - public Executor scheduledTaskExecutor() { - return Executors.newScheduledThreadPool(jHipsterProperties.getAsync().getCorePoolSize()); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/CloudDatabaseConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/CloudDatabaseConfiguration.java deleted file mode 100644 index 887a1bae89..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/CloudDatabaseConfiguration.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.jhipster5.config; - -import io.github.jhipster.config.JHipsterConstants; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.cloud.config.java.AbstractCloudConfig; -import org.springframework.context.annotation.*; - -import javax.sql.DataSource; -import org.springframework.boot.context.properties.ConfigurationProperties; - - -@Configuration -@Profile(JHipsterConstants.SPRING_PROFILE_CLOUD) -public class CloudDatabaseConfiguration extends AbstractCloudConfig { - - private final Logger log = LoggerFactory.getLogger(CloudDatabaseConfiguration.class); - - private static final String CLOUD_CONFIGURATION_HIKARI_PREFIX = "spring.datasource.hikari"; - - @Bean - @ConfigurationProperties(CLOUD_CONFIGURATION_HIKARI_PREFIX) - public DataSource dataSource() { - log.info("Configuring JDBC datasource from a cloud provider"); - return connectionFactory().dataSource(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/Constants.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/Constants.java deleted file mode 100644 index dd8f717f98..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/Constants.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.jhipster5.config; - -/** - * Application constants. - */ -public final class Constants { - - // Regex for acceptable logins - public static final String LOGIN_REGEX = "^[_.@A-Za-z0-9-]*$"; - - public static final String SYSTEM_ACCOUNT = "system"; - public static final String ANONYMOUS_USER = "anonymoususer"; - public static final String DEFAULT_LANGUAGE = "en"; - - private Constants() { - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DatabaseConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DatabaseConfiguration.java deleted file mode 100644 index 007b1d6431..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DatabaseConfiguration.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.baeldung.jhipster5.config; - -import io.github.jhipster.config.JHipsterConstants; -import io.github.jhipster.config.h2.H2ConfigurationHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -import org.springframework.core.env.Environment; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import java.sql.SQLException; - -@Configuration -@EnableJpaRepositories("com.baeldung.jhipster5.repository") -@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware") -@EnableTransactionManagement -public class DatabaseConfiguration { - - private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class); - - private final Environment env; - - public DatabaseConfiguration(Environment env) { - this.env = env; - } - - /** - * Open the TCP port for the H2 database, so it is available remotely. - * - * @return the H2 database TCP server - * @throws SQLException if the server failed to start - */ - @Bean(initMethod = "start", destroyMethod = "stop") - @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) - public Object h2TCPServer() throws SQLException { - String port = getValidPortForH2(); - log.debug("H2 database is available on port {}", port); - return H2ConfigurationHelper.createServer(port); - } - - private String getValidPortForH2() { - int port = Integer.parseInt(env.getProperty("server.port")); - if (port < 10000) { - port = 10000 + port; - } else { - if (port < 63536) { - port = port + 2000; - } else { - port = port - 2000; - } - } - return String.valueOf(port); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DateTimeFormatConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DateTimeFormatConfiguration.java deleted file mode 100644 index 4415ce0b1e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DateTimeFormatConfiguration.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.jhipster5.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.format.FormatterRegistry; -import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * Configure the converters to use the ISO format for dates by default. - */ -@Configuration -public class DateTimeFormatConfiguration implements WebMvcConfigurer { - - @Override - public void addFormatters(FormatterRegistry registry) { - DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); - registrar.setUseIsoFormat(true); - registrar.registerFormatters(registry); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DefaultProfileUtil.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DefaultProfileUtil.java deleted file mode 100644 index 2cfe16a1ae..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/DefaultProfileUtil.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.jhipster5.config; - -import io.github.jhipster.config.JHipsterConstants; - -import org.springframework.boot.SpringApplication; -import org.springframework.core.env.Environment; - -import java.util.*; - -/** - * Utility class to load a Spring profile to be used as default - * when there is no spring.profiles.active set in the environment or as command line argument. - * If the value is not available in application.yml then dev profile will be used as default. - */ -public final class DefaultProfileUtil { - - private static final String SPRING_PROFILE_DEFAULT = "spring.profiles.default"; - - private DefaultProfileUtil() { - } - - /** - * Set a default to use when no profile is configured. - * - * @param app the Spring application - */ - public static void addDefaultProfile(SpringApplication app) { - Map defProperties = new HashMap<>(); - /* - * The default profile to use when no other profiles are defined - * This cannot be set in the application.yml file. - * See https://github.com/spring-projects/spring-boot/issues/1219 - */ - defProperties.put(SPRING_PROFILE_DEFAULT, JHipsterConstants.SPRING_PROFILE_DEVELOPMENT); - app.setDefaultProperties(defProperties); - } - - /** - * Get the profiles that are applied else get default profiles. - * - * @param env spring environment - * @return profiles - */ - public static String[] getActiveProfiles(Environment env) { - String[] profiles = env.getActiveProfiles(); - if (profiles.length == 0) { - return env.getDefaultProfiles(); - } - return profiles; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/JacksonConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/JacksonConfiguration.java deleted file mode 100644 index 119cd5f0c6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/JacksonConfiguration.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.jhipster5.config; - -import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.afterburner.AfterburnerModule; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.zalando.problem.ProblemModule; -import org.zalando.problem.violations.ConstraintViolationProblemModule; - -@Configuration -public class JacksonConfiguration { - - /** - * Support for Java date and time API. - * @return the corresponding Jackson module. - */ - @Bean - public JavaTimeModule javaTimeModule() { - return new JavaTimeModule(); - } - - @Bean - public Jdk8Module jdk8TimeModule() { - return new Jdk8Module(); - } - - - /* - * Support for Hibernate types in Jackson. - */ - @Bean - public Hibernate5Module hibernate5Module() { - return new Hibernate5Module(); - } - - /* - * Jackson Afterburner module to speed up serialization/deserialization. - */ - @Bean - public AfterburnerModule afterburnerModule() { - return new AfterburnerModule(); - } - - /* - * Module for serialization/deserialization of RFC7807 Problem. - */ - @Bean - ProblemModule problemModule() { - return new ProblemModule(); - } - - /* - * Module for serialization/deserialization of ConstraintViolationProblem. - */ - @Bean - ConstraintViolationProblemModule constraintViolationProblemModule() { - return new ConstraintViolationProblemModule(); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LiquibaseConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LiquibaseConfiguration.java deleted file mode 100644 index 4b2a7b1e66..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LiquibaseConfiguration.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.jhipster5.config; - -import javax.sql.DataSource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.core.task.TaskExecutor; - -import io.github.jhipster.config.JHipsterConstants; -import io.github.jhipster.config.liquibase.AsyncSpringLiquibase; -import liquibase.integration.spring.SpringLiquibase; - -@Configuration -public class LiquibaseConfiguration { - - private final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class); - - private final Environment env; - - - public LiquibaseConfiguration(Environment env) { - this.env = env; - } - - @Bean - public SpringLiquibase liquibase(@Qualifier("taskExecutor") TaskExecutor taskExecutor, - DataSource dataSource, LiquibaseProperties liquibaseProperties) { - - // Use liquibase.integration.spring.SpringLiquibase if you don't want Liquibase to start asynchronously - SpringLiquibase liquibase = new AsyncSpringLiquibase(taskExecutor, env); - liquibase.setDataSource(dataSource); - liquibase.setChangeLog("classpath:config/liquibase/master.xml"); - liquibase.setContexts(liquibaseProperties.getContexts()); - liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); - liquibase.setDropFirst(liquibaseProperties.isDropFirst()); - liquibase.setChangeLogParameters(liquibaseProperties.getParameters()); - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE)) { - liquibase.setShouldRun(false); - } else { - liquibase.setShouldRun(liquibaseProperties.isEnabled()); - log.debug("Configuring Liquibase"); - } - return liquibase; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LocaleConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LocaleConfiguration.java deleted file mode 100644 index 256c6b77b9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LocaleConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.jhipster5.config; - -import io.github.jhipster.config.locale.AngularCookieLocaleResolver; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.LocaleResolver; -import org.springframework.web.servlet.config.annotation.*; -import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; - -@Configuration -public class LocaleConfiguration implements WebMvcConfigurer { - - @Bean(name = "localeResolver") - public LocaleResolver localeResolver() { - AngularCookieLocaleResolver cookieLocaleResolver = new AngularCookieLocaleResolver(); - cookieLocaleResolver.setCookieName("NG_TRANSLATE_LANG_KEY"); - return cookieLocaleResolver; - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); - localeChangeInterceptor.setParamName("language"); - registry.addInterceptor(localeChangeInterceptor); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingAspectConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingAspectConfiguration.java deleted file mode 100644 index 25d7ba3792..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingAspectConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.jhipster5.config; - -import com.baeldung.jhipster5.aop.logging.LoggingAspect; - -import io.github.jhipster.config.JHipsterConstants; - -import org.springframework.context.annotation.*; -import org.springframework.core.env.Environment; - -@Configuration -@EnableAspectJAutoProxy -public class LoggingAspectConfiguration { - - @Bean - @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) - public LoggingAspect loggingAspect(Environment env) { - return new LoggingAspect(env); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingConfiguration.java deleted file mode 100644 index 9402a1bc36..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/LoggingConfiguration.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.baeldung.jhipster5.config; - -import java.net.InetSocketAddress; -import java.util.Iterator; - -import io.github.jhipster.config.JHipsterProperties; - -import ch.qos.logback.classic.AsyncAppender; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.boolex.OnMarkerEvaluator; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.LoggerContextListener; -import ch.qos.logback.core.Appender; -import ch.qos.logback.core.filter.EvaluatorFilter; -import ch.qos.logback.core.spi.ContextAwareBase; -import ch.qos.logback.core.spi.FilterReply; -import net.logstash.logback.appender.LogstashTcpSocketAppender; -import net.logstash.logback.encoder.LogstashEncoder; -import net.logstash.logback.stacktrace.ShortenedThrowableConverter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class LoggingConfiguration { - - private static final String LOGSTASH_APPENDER_NAME = "LOGSTASH"; - - private static final String ASYNC_LOGSTASH_APPENDER_NAME = "ASYNC_LOGSTASH"; - - private final Logger log = LoggerFactory.getLogger(LoggingConfiguration.class); - - private LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - - private final String appName; - - private final String serverPort; - - private final JHipsterProperties jHipsterProperties; - - public LoggingConfiguration(@Value("${spring.application.name}") String appName, @Value("${server.port}") String serverPort, - JHipsterProperties jHipsterProperties) { - this.appName = appName; - this.serverPort = serverPort; - this.jHipsterProperties = jHipsterProperties; - if (jHipsterProperties.getLogging().getLogstash().isEnabled()) { - addLogstashAppender(context); - addContextListener(context); - } - if (jHipsterProperties.getMetrics().getLogs().isEnabled()) { - setMetricsMarkerLogbackFilter(context); - } - } - - private void addContextListener(LoggerContext context) { - LogbackLoggerContextListener loggerContextListener = new LogbackLoggerContextListener(); - loggerContextListener.setContext(context); - context.addListener(loggerContextListener); - } - - private void addLogstashAppender(LoggerContext context) { - log.info("Initializing Logstash logging"); - - LogstashTcpSocketAppender logstashAppender = new LogstashTcpSocketAppender(); - logstashAppender.setName(LOGSTASH_APPENDER_NAME); - logstashAppender.setContext(context); - String customFields = "{\"app_name\":\"" + appName + "\",\"app_port\":\"" + serverPort + "\"}"; - - // More documentation is available at: https://github.com/logstash/logstash-logback-encoder - LogstashEncoder logstashEncoder = new LogstashEncoder(); - // Set the Logstash appender config from JHipster properties - logstashAppender.addDestinations(new InetSocketAddress(jHipsterProperties.getLogging().getLogstash().getHost(), jHipsterProperties.getLogging().getLogstash().getPort())); - - ShortenedThrowableConverter throwableConverter = new ShortenedThrowableConverter(); - throwableConverter.setRootCauseFirst(true); - logstashEncoder.setThrowableConverter(throwableConverter); - logstashEncoder.setCustomFields(customFields); - - logstashAppender.setEncoder(logstashEncoder); - logstashAppender.start(); - - // Wrap the appender in an Async appender for performance - AsyncAppender asyncLogstashAppender = new AsyncAppender(); - asyncLogstashAppender.setContext(context); - asyncLogstashAppender.setName(ASYNC_LOGSTASH_APPENDER_NAME); - asyncLogstashAppender.setQueueSize(jHipsterProperties.getLogging().getLogstash().getQueueSize()); - asyncLogstashAppender.addAppender(logstashAppender); - asyncLogstashAppender.start(); - - context.getLogger("ROOT").addAppender(asyncLogstashAppender); - } - - // Configure a log filter to remove "metrics" logs from all appenders except the "LOGSTASH" appender - private void setMetricsMarkerLogbackFilter(LoggerContext context) { - log.info("Filtering metrics logs from all appenders except the {} appender", LOGSTASH_APPENDER_NAME); - OnMarkerEvaluator onMarkerMetricsEvaluator = new OnMarkerEvaluator(); - onMarkerMetricsEvaluator.setContext(context); - onMarkerMetricsEvaluator.addMarker("metrics"); - onMarkerMetricsEvaluator.start(); - EvaluatorFilter metricsFilter = new EvaluatorFilter<>(); - metricsFilter.setContext(context); - metricsFilter.setEvaluator(onMarkerMetricsEvaluator); - metricsFilter.setOnMatch(FilterReply.DENY); - metricsFilter.start(); - - for (ch.qos.logback.classic.Logger logger : context.getLoggerList()) { - for (Iterator> it = logger.iteratorForAppenders(); it.hasNext();) { - Appender appender = it.next(); - if (!appender.getName().equals(ASYNC_LOGSTASH_APPENDER_NAME)) { - log.debug("Filter metrics logs from the {} appender", appender.getName()); - appender.setContext(context); - appender.addFilter(metricsFilter); - appender.start(); - } - } - } - } - - /** - * Logback configuration is achieved by configuration file and API. - * When configuration file change is detected, the configuration is reset. - * This listener ensures that the programmatic configuration is also re-applied after reset. - */ - class LogbackLoggerContextListener extends ContextAwareBase implements LoggerContextListener { - - @Override - public boolean isResetResistant() { - return true; - } - - @Override - public void onStart(LoggerContext context) { - addLogstashAppender(context); - } - - @Override - public void onReset(LoggerContext context) { - addLogstashAppender(context); - } - - @Override - public void onStop(LoggerContext context) { - // Nothing to do. - } - - @Override - public void onLevelChange(ch.qos.logback.classic.Logger logger, Level level) { - // Nothing to do. - } - } - -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/SecurityConfiguration.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/SecurityConfiguration.java deleted file mode 100644 index f07944271e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/SecurityConfiguration.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.baeldung.jhipster5.config; - -import com.baeldung.jhipster5.security.*; -import com.baeldung.jhipster5.security.jwt.*; - -import org.springframework.beans.factory.BeanInitializationException; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.web.filter.CorsFilter; -import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport; - -import javax.annotation.PostConstruct; - -@Configuration -@EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) -@Import(SecurityProblemSupport.class) -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { - - private final AuthenticationManagerBuilder authenticationManagerBuilder; - - private final UserDetailsService userDetailsService; - - private final TokenProvider tokenProvider; - - private final CorsFilter corsFilter; - - private final SecurityProblemSupport problemSupport; - - public SecurityConfiguration(AuthenticationManagerBuilder authenticationManagerBuilder, UserDetailsService userDetailsService, TokenProvider tokenProvider, CorsFilter corsFilter, SecurityProblemSupport problemSupport) { - this.authenticationManagerBuilder = authenticationManagerBuilder; - this.userDetailsService = userDetailsService; - this.tokenProvider = tokenProvider; - this.corsFilter = corsFilter; - this.problemSupport = problemSupport; - } - - @PostConstruct - public void init() { - try { - authenticationManagerBuilder - .userDetailsService(userDetailsService) - .passwordEncoder(passwordEncoder()); - } catch (Exception e) { - throw new BeanInitializationException("Security configuration failed", e); - } - } - - @Override - @Bean - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Override - public void configure(WebSecurity web) throws Exception { - web.ignoring() - .antMatchers(HttpMethod.OPTIONS, "/**") - .antMatchers("/app/**/*.{js,html}") - .antMatchers("/i18n/**") - .antMatchers("/content/**") - .antMatchers("/h2-console/**") - .antMatchers("/swagger-ui/index.html") - .antMatchers("/test/**"); - } - - @Override - public void configure(HttpSecurity http) throws Exception { - http - .csrf() - .disable() - .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) - .exceptionHandling() - .authenticationEntryPoint(problemSupport) - .accessDeniedHandler(problemSupport) - .and() - .headers() - .frameOptions() - .disable() - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .authorizeRequests() - .antMatchers("/api/books/purchase/**").authenticated() - .antMatchers("/api/register").permitAll() - .antMatchers("/api/activate").permitAll() - .antMatchers("/api/authenticate").permitAll() - .antMatchers("/api/account/reset-password/init").permitAll() - .antMatchers("/api/account/reset-password/finish").permitAll() - .antMatchers("/api/**").authenticated() - .antMatchers("/management/health").permitAll() - .antMatchers("/management/info").permitAll() - .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN) - .and() - .apply(securityConfigurerAdapter()); - - } - - private JWTConfigurer securityConfigurerAdapter() { - return new JWTConfigurer(tokenProvider); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/WebConfigurer.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/WebConfigurer.java deleted file mode 100644 index 26cfc92487..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/WebConfigurer.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.baeldung.jhipster5.config; - -import io.github.jhipster.config.JHipsterConstants; -import io.github.jhipster.config.JHipsterProperties; -import io.github.jhipster.config.h2.H2ConfigurationHelper; -import io.github.jhipster.web.filter.CachingHttpHeadersFilter; -import io.undertow.UndertowOptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; -import org.springframework.boot.web.server.*; -import org.springframework.boot.web.servlet.ServletContextInitializer; -import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -import javax.servlet.*; -import java.io.File; -import java.io.UnsupportedEncodingException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Paths; -import java.util.*; - -import static java.net.URLDecoder.decode; - -/** - * Configuration of web application with Servlet 3.0 APIs. - */ -@Configuration -public class WebConfigurer implements ServletContextInitializer, WebServerFactoryCustomizer { - - private final Logger log = LoggerFactory.getLogger(WebConfigurer.class); - - private final Environment env; - - private final JHipsterProperties jHipsterProperties; - - public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) { - - this.env = env; - this.jHipsterProperties = jHipsterProperties; - } - - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - if (env.getActiveProfiles().length != 0) { - log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles()); - } - EnumSet disps = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC); - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { - initCachingHttpHeadersFilter(servletContext, disps); - } - if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)) { - initH2Console(servletContext); - } - log.info("Web application fully configured"); - } - - /** - * Customize the Servlet engine: Mime types, the document root, the cache. - */ - @Override - public void customize(WebServerFactory server) { - setMimeMappings(server); - // When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets. - setLocationForStaticAssets(server); - - /* - * Enable HTTP/2 for Undertow - https://twitter.com/ankinson/status/829256167700492288 - * HTTP/2 requires HTTPS, so HTTP requests will fallback to HTTP/1.1. - * See the JHipsterProperties class and your application-*.yml configuration files - * for more information. - */ - if (jHipsterProperties.getHttp().getVersion().equals(JHipsterProperties.Http.Version.V_2_0) && - server instanceof UndertowServletWebServerFactory) { - - ((UndertowServletWebServerFactory) server) - .addBuilderCustomizers(builder -> - builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true)); - } - } - - private void setMimeMappings(WebServerFactory server) { - if (server instanceof ConfigurableServletWebServerFactory) { - MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT); - // IE issue, see https://github.com/jhipster/generator-jhipster/pull/711 - mappings.add("html", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase()); - // CloudFoundry issue, see https://github.com/cloudfoundry/gorouter/issues/64 - mappings.add("json", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase()); - ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; - servletWebServer.setMimeMappings(mappings); - } - } - - private void setLocationForStaticAssets(WebServerFactory server) { - if (server instanceof ConfigurableServletWebServerFactory) { - ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; - File root; - String prefixPath = resolvePathPrefix(); - root = new File(prefixPath + "target/www/"); - if (root.exists() && root.isDirectory()) { - servletWebServer.setDocumentRoot(root); - } - } - } - - /** - * Resolve path prefix to static resources. - */ - private String resolvePathPrefix() { - String fullExecutablePath; - try { - fullExecutablePath = decode(this.getClass().getResource("").getPath(), StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException e) { - /* try without decoding if this ever happens */ - fullExecutablePath = this.getClass().getResource("").getPath(); - } - String rootPath = Paths.get(".").toUri().normalize().getPath(); - String extractedPath = fullExecutablePath.replace(rootPath, ""); - int extractionEndIndex = extractedPath.indexOf("target/"); - if (extractionEndIndex <= 0) { - return ""; - } - return extractedPath.substring(0, extractionEndIndex); - } - - /** - * Initializes the caching HTTP Headers Filter. - */ - private void initCachingHttpHeadersFilter(ServletContext servletContext, - EnumSet disps) { - log.debug("Registering Caching HTTP Headers Filter"); - FilterRegistration.Dynamic cachingHttpHeadersFilter = - servletContext.addFilter("cachingHttpHeadersFilter", - new CachingHttpHeadersFilter(jHipsterProperties)); - - cachingHttpHeadersFilter.addMappingForUrlPatterns(disps, true, "/i18n/*"); - cachingHttpHeadersFilter.addMappingForUrlPatterns(disps, true, "/content/*"); - cachingHttpHeadersFilter.addMappingForUrlPatterns(disps, true, "/app/*"); - cachingHttpHeadersFilter.setAsyncSupported(true); - } - - @Bean - public CorsFilter corsFilter() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration config = jHipsterProperties.getCors(); - if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { - log.debug("Registering CORS filter"); - source.registerCorsConfiguration("/api/**", config); - source.registerCorsConfiguration("/management/**", config); - source.registerCorsConfiguration("/v2/api-docs", config); - } - return new CorsFilter(source); - } - - /** - * Initializes H2 console. - */ - private void initH2Console(ServletContext servletContext) { - log.debug("Initialize H2 console"); - H2ConfigurationHelper.initH2Console(servletContext); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/AuditEventConverter.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/AuditEventConverter.java deleted file mode 100644 index 6dd87bb82d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/AuditEventConverter.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.baeldung.jhipster5.config.audit; - -import com.baeldung.jhipster5.domain.PersistentAuditEvent; - -import org.springframework.boot.actuate.audit.AuditEvent; -import org.springframework.security.web.authentication.WebAuthenticationDetails; -import org.springframework.stereotype.Component; - -import java.util.*; - -@Component -public class AuditEventConverter { - - /** - * Convert a list of PersistentAuditEvent to a list of AuditEvent - * - * @param persistentAuditEvents the list to convert - * @return the converted list. - */ - public List convertToAuditEvent(Iterable persistentAuditEvents) { - if (persistentAuditEvents == null) { - return Collections.emptyList(); - } - List auditEvents = new ArrayList<>(); - for (PersistentAuditEvent persistentAuditEvent : persistentAuditEvents) { - auditEvents.add(convertToAuditEvent(persistentAuditEvent)); - } - return auditEvents; - } - - /** - * Convert a PersistentAuditEvent to an AuditEvent - * - * @param persistentAuditEvent the event to convert - * @return the converted list. - */ - public AuditEvent convertToAuditEvent(PersistentAuditEvent persistentAuditEvent) { - if (persistentAuditEvent == null) { - return null; - } - return new AuditEvent(persistentAuditEvent.getAuditEventDate(), persistentAuditEvent.getPrincipal(), - persistentAuditEvent.getAuditEventType(), convertDataToObjects(persistentAuditEvent.getData())); - } - - /** - * Internal conversion. This is needed to support the current SpringBoot actuator AuditEventRepository interface - * - * @param data the data to convert - * @return a map of String, Object - */ - public Map convertDataToObjects(Map data) { - Map results = new HashMap<>(); - - if (data != null) { - for (Map.Entry entry : data.entrySet()) { - results.put(entry.getKey(), entry.getValue()); - } - } - return results; - } - - /** - * Internal conversion. This method will allow to save additional data. - * By default, it will save the object as string - * - * @param data the data to convert - * @return a map of String, String - */ - public Map convertDataToStrings(Map data) { - Map results = new HashMap<>(); - - if (data != null) { - for (Map.Entry entry : data.entrySet()) { - // Extract the data that will be saved. - if (entry.getValue() instanceof WebAuthenticationDetails) { - WebAuthenticationDetails authenticationDetails = (WebAuthenticationDetails) entry.getValue(); - results.put("remoteAddress", authenticationDetails.getRemoteAddress()); - results.put("sessionId", authenticationDetails.getSessionId()); - } else { - results.put(entry.getKey(), Objects.toString(entry.getValue())); - } - } - } - return results; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/package-info.java deleted file mode 100644 index 49a2a73a61..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/audit/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Audit specific code. - */ -package com.baeldung.jhipster5.config.audit; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/package-info.java deleted file mode 100644 index 868155ce9f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/config/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Spring Framework configuration files. - */ -package com.baeldung.jhipster5.config; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/AbstractAuditingEntity.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/AbstractAuditingEntity.java deleted file mode 100644 index 861674ccc9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/AbstractAuditingEntity.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.baeldung.jhipster5.domain; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.hibernate.envers.Audited; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedBy; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import java.io.Serializable; -import java.time.Instant; -import javax.persistence.Column; -import javax.persistence.EntityListeners; -import javax.persistence.MappedSuperclass; - -/** - * Base abstract class for entities which will hold definitions for created, last modified by and created, - * last modified by date. - */ -@MappedSuperclass -@Audited -@EntityListeners(AuditingEntityListener.class) -public abstract class AbstractAuditingEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @CreatedBy - @Column(name = "created_by", nullable = false, length = 50, updatable = false) - @JsonIgnore - private String createdBy; - - @CreatedDate - @Column(name = "created_date", updatable = false) - @JsonIgnore - private Instant createdDate = Instant.now(); - - @LastModifiedBy - @Column(name = "last_modified_by", length = 50) - @JsonIgnore - private String lastModifiedBy; - - @LastModifiedDate - @Column(name = "last_modified_date") - @JsonIgnore - private Instant lastModifiedDate = Instant.now(); - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public String getLastModifiedBy() { - return lastModifiedBy; - } - - public void setLastModifiedBy(String lastModifiedBy) { - this.lastModifiedBy = lastModifiedBy; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Authority.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Authority.java deleted file mode 100644 index fbd4596fc7..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Authority.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.baeldung.jhipster5.domain; - -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Column; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.io.Serializable; - -/** - * An authority (a security role) used by Spring Security. - */ -@Entity -@Table(name = "jhi_authority") -public class Authority implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull - @Size(max = 50) - @Id - @Column(length = 50) - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - Authority authority = (Authority) o; - - return !(name != null ? !name.equals(authority.name) : authority.name != null); - } - - @Override - public int hashCode() { - return name != null ? name.hashCode() : 0; - } - - @Override - public String toString() { - return "Authority{" + - "name='" + name + '\'' + - "}"; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Book.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Book.java deleted file mode 100644 index 16771d9e09..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/Book.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.baeldung.jhipster5.domain; - - - -import javax.persistence.*; -import javax.validation.constraints.*; - -import java.io.Serializable; -import java.time.LocalDate; -import java.util.Objects; - -/** - * A Book. - */ -@Entity -@Table(name = "book") -public class Book implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Column(name = "title", nullable = false) - private String title; - - @NotNull - @Column(name = "author", nullable = false) - private String author; - - @NotNull - @Column(name = "published", nullable = false) - private LocalDate published; - - @NotNull - @Min(value = 0) - @Column(name = "quantity", nullable = false) - private Integer quantity; - - @NotNull - @DecimalMin(value = "0") - @Column(name = "price", nullable = false) - private Double price; - - // jhipster-needle-entity-add-field - JHipster will add fields here, do not remove - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public Book title(String title) { - this.title = title; - return this; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getAuthor() { - return author; - } - - public Book author(String author) { - this.author = author; - return this; - } - - public void setAuthor(String author) { - this.author = author; - } - - public LocalDate getPublished() { - return published; - } - - public Book published(LocalDate published) { - this.published = published; - return this; - } - - public void setPublished(LocalDate published) { - this.published = published; - } - - public Integer getQuantity() { - return quantity; - } - - public Book quantity(Integer quantity) { - this.quantity = quantity; - return this; - } - - public void setQuantity(Integer quantity) { - this.quantity = quantity; - } - - public Double getPrice() { - return price; - } - - public Book price(Double price) { - this.price = price; - return this; - } - - public void setPrice(Double price) { - this.price = price; - } - // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here, do not remove - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Book book = (Book) o; - if (book.getId() == null || getId() == null) { - return false; - } - return Objects.equals(getId(), book.getId()); - } - - @Override - public int hashCode() { - return Objects.hashCode(getId()); - } - - @Override - public String toString() { - return "Book{" + - "id=" + getId() + - ", title='" + getTitle() + "'" + - ", author='" + getAuthor() + "'" + - ", published='" + getPublished() + "'" + - ", quantity=" + getQuantity() + - ", price=" + getPrice() + - "}"; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/PersistentAuditEvent.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/PersistentAuditEvent.java deleted file mode 100644 index 15e2eeda5a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/PersistentAuditEvent.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.baeldung.jhipster5.domain; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.time.Instant; -import java.util.HashMap; -import java.util.Objects; -import java.util.Map; - -/** - * Persist AuditEvent managed by the Spring Boot actuator. - * - * @see org.springframework.boot.actuate.audit.AuditEvent - */ -@Entity -@Table(name = "jhi_persistent_audit_event") -public class PersistentAuditEvent implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "event_id") - private Long id; - - @NotNull - @Column(nullable = false) - private String principal; - - @Column(name = "event_date") - private Instant auditEventDate; - - @Column(name = "event_type") - private String auditEventType; - - @ElementCollection - @MapKeyColumn(name = "name") - @Column(name = "value") - @CollectionTable(name = "jhi_persistent_audit_evt_data", joinColumns=@JoinColumn(name="event_id")) - private Map data = new HashMap<>(); - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getPrincipal() { - return principal; - } - - public void setPrincipal(String principal) { - this.principal = principal; - } - - public Instant getAuditEventDate() { - return auditEventDate; - } - - public void setAuditEventDate(Instant auditEventDate) { - this.auditEventDate = auditEventDate; - } - - public String getAuditEventType() { - return auditEventType; - } - - public void setAuditEventType(String auditEventType) { - this.auditEventType = auditEventType; - } - - public Map getData() { - return data; - } - - public void setData(Map data) { - this.data = data; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - PersistentAuditEvent persistentAuditEvent = (PersistentAuditEvent) o; - return !(persistentAuditEvent.getId() == null || getId() == null) && Objects.equals(getId(), persistentAuditEvent.getId()); - } - - @Override - public int hashCode() { - return Objects.hashCode(getId()); - } - - @Override - public String toString() { - return "PersistentAuditEvent{" + - "principal='" + principal + '\'' + - ", auditEventDate=" + auditEventDate + - ", auditEventType='" + auditEventType + '\'' + - '}'; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/User.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/User.java deleted file mode 100644 index ff12d1ca9c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/User.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.baeldung.jhipster5.domain; - -import com.baeldung.jhipster5.config.Constants; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.apache.commons.lang3.StringUtils; -import org.hibernate.annotations.BatchSize; -import javax.validation.constraints.Email; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; -import java.io.Serializable; -import java.util.HashSet; -import java.util.Locale; -import java.util.Objects; -import java.util.Set; -import java.time.Instant; - -/** - * A user. - */ -@Entity -@Table(name = "jhi_user") - -public class User extends AbstractAuditingEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Pattern(regexp = Constants.LOGIN_REGEX) - @Size(min = 1, max = 50) - @Column(length = 50, unique = true, nullable = false) - private String login; - - @JsonIgnore - @NotNull - @Size(min = 60, max = 60) - @Column(name = "password_hash", length = 60, nullable = false) - private String password; - - @Size(max = 50) - @Column(name = "first_name", length = 50) - private String firstName; - - @Size(max = 50) - @Column(name = "last_name", length = 50) - private String lastName; - - @Email - @Size(min = 5, max = 254) - @Column(length = 254, unique = true) - private String email; - - @NotNull - @Column(nullable = false) - private boolean activated = false; - - @Size(min = 2, max = 6) - @Column(name = "lang_key", length = 6) - private String langKey; - - @Size(max = 256) - @Column(name = "image_url", length = 256) - private String imageUrl; - - @Size(max = 20) - @Column(name = "activation_key", length = 20) - @JsonIgnore - private String activationKey; - - @Size(max = 20) - @Column(name = "reset_key", length = 20) - @JsonIgnore - private String resetKey; - - @Column(name = "reset_date") - private Instant resetDate = null; - - @JsonIgnore - @ManyToMany - @JoinTable( - name = "jhi_user_authority", - joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, - inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")}) - - @BatchSize(size = 20) - private Set authorities = new HashSet<>(); - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getLogin() { - return login; - } - - // Lowercase the login before saving it in database - public void setLogin(String login) { - this.login = StringUtils.lowerCase(login, Locale.ENGLISH); - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getImageUrl() { - return imageUrl; - } - - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; - } - - public boolean getActivated() { - return activated; - } - - public void setActivated(boolean activated) { - this.activated = activated; - } - - public String getActivationKey() { - return activationKey; - } - - public void setActivationKey(String activationKey) { - this.activationKey = activationKey; - } - - public String getResetKey() { - return resetKey; - } - - public void setResetKey(String resetKey) { - this.resetKey = resetKey; - } - - public Instant getResetDate() { - return resetDate; - } - - public void setResetDate(Instant resetDate) { - this.resetDate = resetDate; - } - - public String getLangKey() { - return langKey; - } - - public void setLangKey(String langKey) { - this.langKey = langKey; - } - - public Set getAuthorities() { - return authorities; - } - - public void setAuthorities(Set authorities) { - this.authorities = authorities; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - User user = (User) o; - return !(user.getId() == null || getId() == null) && Objects.equals(getId(), user.getId()); - } - - @Override - public int hashCode() { - return Objects.hashCode(getId()); - } - - @Override - public String toString() { - return "User{" + - "login='" + login + '\'' + - ", firstName='" + firstName + '\'' + - ", lastName='" + lastName + '\'' + - ", email='" + email + '\'' + - ", imageUrl='" + imageUrl + '\'' + - ", activated='" + activated + '\'' + - ", langKey='" + langKey + '\'' + - ", activationKey='" + activationKey + '\'' + - "}"; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/package-info.java deleted file mode 100644 index eba92a598e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/domain/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * JPA domain objects. - */ -package com.baeldung.jhipster5.domain; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/AuthorityRepository.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/AuthorityRepository.java deleted file mode 100644 index 310735eb57..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/AuthorityRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.jhipster5.repository; - -import com.baeldung.jhipster5.domain.Authority; - -import org.springframework.data.jpa.repository.JpaRepository; - -/** - * Spring Data JPA repository for the Authority entity. - */ -public interface AuthorityRepository extends JpaRepository { -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/BookRepository.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/BookRepository.java deleted file mode 100644 index ebd3117e65..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/BookRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.jhipster5.repository; - -import com.baeldung.jhipster5.domain.Book; -import org.springframework.data.jpa.repository.*; -import org.springframework.stereotype.Repository; - - -/** - * Spring Data repository for the Book entity. - */ -@SuppressWarnings("unused") -@Repository -public interface BookRepository extends JpaRepository { - -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/CustomAuditEventRepository.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/CustomAuditEventRepository.java deleted file mode 100644 index faa788ff5f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/CustomAuditEventRepository.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.baeldung.jhipster5.repository; - -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.actuate.audit.AuditEvent; -import org.springframework.boot.actuate.audit.AuditEventRepository; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.time.Instant; -import java.util.*; - -/** - * An implementation of Spring Boot's AuditEventRepository. - */ -@Repository -public class CustomAuditEventRepository implements AuditEventRepository { - - private static final String AUTHORIZATION_FAILURE = "AUTHORIZATION_FAILURE"; - - /** - * Should be the same as in Liquibase migration. - */ - protected static final int EVENT_DATA_COLUMN_MAX_LENGTH = 255; - - private final PersistenceAuditEventRepository persistenceAuditEventRepository; - - private final AuditEventConverter auditEventConverter; - - private final Logger log = LoggerFactory.getLogger(getClass()); - - public CustomAuditEventRepository(PersistenceAuditEventRepository persistenceAuditEventRepository, - AuditEventConverter auditEventConverter) { - - this.persistenceAuditEventRepository = persistenceAuditEventRepository; - this.auditEventConverter = auditEventConverter; - } - - @Override - public List find(String principal, Instant after, String type) { - Iterable persistentAuditEvents = - persistenceAuditEventRepository.findByPrincipalAndAuditEventDateAfterAndAuditEventType(principal, after, type); - return auditEventConverter.convertToAuditEvent(persistentAuditEvents); - } - - @Override - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void add(AuditEvent event) { - if (!AUTHORIZATION_FAILURE.equals(event.getType()) && - !Constants.ANONYMOUS_USER.equals(event.getPrincipal())) { - - PersistentAuditEvent persistentAuditEvent = new PersistentAuditEvent(); - persistentAuditEvent.setPrincipal(event.getPrincipal()); - persistentAuditEvent.setAuditEventType(event.getType()); - persistentAuditEvent.setAuditEventDate(event.getTimestamp()); - Map eventData = auditEventConverter.convertDataToStrings(event.getData()); - persistentAuditEvent.setData(truncate(eventData)); - persistenceAuditEventRepository.save(persistentAuditEvent); - } - } - - /** - * Truncate event data that might exceed column length. - */ - private Map truncate(Map data) { - Map results = new HashMap<>(); - - if (data != null) { - for (Map.Entry entry : data.entrySet()) { - String value = entry.getValue(); - if (value != null) { - int length = value.length(); - if (length > EVENT_DATA_COLUMN_MAX_LENGTH) { - value = value.substring(0, EVENT_DATA_COLUMN_MAX_LENGTH); - log.warn("Event data for {} too long ({}) has been truncated to {}. Consider increasing column width.", - entry.getKey(), length, EVENT_DATA_COLUMN_MAX_LENGTH); - } - } - results.put(entry.getKey(), value); - } - } - return results; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/PersistenceAuditEventRepository.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/PersistenceAuditEventRepository.java deleted file mode 100644 index 2eb6f3b847..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/PersistenceAuditEventRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.jhipster5.repository; - -import com.baeldung.jhipster5.domain.PersistentAuditEvent; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.time.Instant; -import java.util.List; - -/** - * Spring Data JPA repository for the PersistentAuditEvent entity. - */ -public interface PersistenceAuditEventRepository extends JpaRepository { - - List findByPrincipal(String principal); - - List findByAuditEventDateAfter(Instant after); - - List findByPrincipalAndAuditEventDateAfter(String principal, Instant after); - - List findByPrincipalAndAuditEventDateAfterAndAuditEventType(String principal, Instant after, String type); - - Page findAllByAuditEventDateBetween(Instant fromDate, Instant toDate, Pageable pageable); -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/UserRepository.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/UserRepository.java deleted file mode 100644 index 42a5588b22..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/UserRepository.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.jhipster5.repository; - -import com.baeldung.jhipster5.domain.User; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.EntityGraph; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; -import java.time.Instant; - -/** - * Spring Data JPA repository for the User entity. - */ -@Repository -public interface UserRepository extends JpaRepository { - - Optional findOneByActivationKey(String activationKey); - - List findAllByActivatedIsFalseAndCreatedDateBefore(Instant dateTime); - - Optional findOneByResetKey(String resetKey); - - Optional findOneByEmailIgnoreCase(String email); - - Optional findOneByLogin(String login); - - @EntityGraph(attributePaths = "authorities") - Optional findOneWithAuthoritiesById(Long id); - - @EntityGraph(attributePaths = "authorities") - Optional findOneWithAuthoritiesByLogin(String login); - - @EntityGraph(attributePaths = "authorities") - Optional findOneWithAuthoritiesByEmail(String email); - - Page findAllByLoginNot(Pageable pageable, String login); -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/package-info.java deleted file mode 100644 index a5002eb201..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/repository/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Spring Data JPA repositories. - */ -package com.baeldung.jhipster5.repository; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/AuthoritiesConstants.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/AuthoritiesConstants.java deleted file mode 100644 index 6ecf44394f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/AuthoritiesConstants.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.jhipster5.security; - -/** - * Constants for Spring Security authorities. - */ -public final class AuthoritiesConstants { - - public static final String ADMIN = "ROLE_ADMIN"; - - public static final String USER = "ROLE_USER"; - - public static final String ANONYMOUS = "ROLE_ANONYMOUS"; - - private AuthoritiesConstants() { - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java deleted file mode 100644 index 0a7dd66b24..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/CustomAuthenticationManager.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.baeldung.jhipster5.security; - -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.security.dto.LoginRequest; -import com.baeldung.jhipster5.security.dto.LoginResponse; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.UserDTO; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.AuthenticationServiceException; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -import java.util.Collection; -import java.util.Collections; -import java.util.stream.Collectors; - -@Component -public class CustomAuthenticationManager implements AuthenticationManager { - - private final static Logger LOG = LoggerFactory.getLogger(CustomAuthenticationManager.class); - - private final String REMOTE_LOGIN_URL = "https://example.com/login"; - - private final RestTemplate restTemplate = new RestTemplate(); - - @Autowired - private UserService userService; - - @Override - public Authentication authenticate(Authentication authentication) throws AuthenticationException { - - LoginRequest loginRequest = new LoginRequest(); - loginRequest.setUsername(authentication.getPrincipal().toString()); - loginRequest.setPassword(authentication.getCredentials().toString()); - - try - { - ResponseEntity response = - restTemplate.postForEntity( - REMOTE_LOGIN_URL, - loginRequest, - LoginResponse.class); - - if(response.getStatusCode().is2xxSuccessful()) - { - // - // Need to create a new local user if this is the first time logging in; this - // is required so they can be issued JWTs. We can use this flow to also keep - // our local use entry up to date with data from the remote service if needed - // (for example, if the first and last name might change, this is where we would - // update the local user entry) - // - - User user = userService.getUserWithAuthoritiesByLogin(authentication.getPrincipal().toString()) - .orElseGet(() -> userService.createUser(createUserDTO(response.getBody(), authentication))); - return createAuthentication(authentication, user); - } - else - { - throw new BadCredentialsException("Invalid username or password"); - } - } - catch (Exception e) - { - LOG.warn("Failed to authenticate", e); - throw new AuthenticationServiceException("Failed to login", e); - } - } - - /** - * Creates a new authentication with basic roles - * @param auth Contains auth details that will be copied into the new one. - * @param user User object representing who is logging in - * @return Authentication - */ - private Authentication createAuthentication(Authentication auth, User user) { - - // - // Honor any roles the user already has set; default is just USER role - // but could be modified after account creation - // - - Collection authorities = user - .getAuthorities() - .stream() - .map(a -> new SimpleGrantedAuthority(a.getName())) - .collect(Collectors.toSet()); - - UsernamePasswordAuthenticationToken token - = new UsernamePasswordAuthenticationToken( - user.getId(), - auth.getCredentials().toString(), - authorities); - - return token; - } - - /** - * Creates a new UserDTO with basic info. - * @param loginResponse Response from peloton login API - * @param authentication Contains user login info (namely username and password) - * @return UserDTO - */ - private UserDTO createUserDTO(LoginResponse loginResponse, Authentication authentication) { - - UserDTO dto = new UserDTO(); - - dto.setActivated(true); - dto.setEmail(loginResponse.getEmail()); - dto.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - dto.setFirstName(loginResponse.getFirstName()); - dto.setLastName(loginResponse.getLastName()); - - return dto; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/DomainUserDetailsService.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/DomainUserDetailsService.java deleted file mode 100644 index d0014096df..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/DomainUserDetailsService.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.jhipster5.security; - -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * Authenticate a user from the database. - */ -@Component("userDetailsService") -public class DomainUserDetailsService implements UserDetailsService { - - private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class); - - private final UserRepository userRepository; - - public DomainUserDetailsService(UserRepository userRepository) { - this.userRepository = userRepository; - } - - @Override - @Transactional - public UserDetails loadUserByUsername(final String login) { - log.debug("Authenticating {}", login); - - if (new EmailValidator().isValid(login, null)) { - return userRepository.findOneWithAuthoritiesByEmail(login) - .map(user -> createSpringSecurityUser(login, user)) - .orElseThrow(() -> new UsernameNotFoundException("User with email " + login + " was not found in the database")); - } - - String lowercaseLogin = login.toLowerCase(Locale.ENGLISH); - return userRepository.findOneWithAuthoritiesByLogin(lowercaseLogin) - .map(user -> createSpringSecurityUser(lowercaseLogin, user)) - .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database")); - - } - - private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) { - if (!user.getActivated()) { - throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated"); - } - List grantedAuthorities = user.getAuthorities().stream() - .map(authority -> new SimpleGrantedAuthority(authority.getName())) - .collect(Collectors.toList()); - return new org.springframework.security.core.userdetails.User(user.getLogin(), - user.getPassword(), - grantedAuthorities); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SecurityUtils.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SecurityUtils.java deleted file mode 100644 index 462bb8abc9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SecurityUtils.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.baeldung.jhipster5.security; - -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; - -import java.util.Optional; - -/** - * Utility class for Spring Security. - */ -public final class SecurityUtils { - - private SecurityUtils() { - } - - /** - * Get the login of the current user. - * - * @return the login of the current user - */ - public static Optional getCurrentUserLogin() { - SecurityContext securityContext = SecurityContextHolder.getContext(); - return Optional.ofNullable(securityContext.getAuthentication()) - .map(authentication -> { - if (authentication.getPrincipal() instanceof UserDetails) { - UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal(); - return springSecurityUser.getUsername(); - } else if (authentication.getPrincipal() instanceof String) { - return (String) authentication.getPrincipal(); - } - return null; - }); - } - - /** - * Get the JWT of the current user. - * - * @return the JWT of the current user - */ - public static Optional getCurrentUserJWT() { - SecurityContext securityContext = SecurityContextHolder.getContext(); - return Optional.ofNullable(securityContext.getAuthentication()) - .filter(authentication -> authentication.getCredentials() instanceof String) - .map(authentication -> (String) authentication.getCredentials()); - } - - /** - * Check if a user is authenticated. - * - * @return true if the user is authenticated, false otherwise - */ - public static boolean isAuthenticated() { - SecurityContext securityContext = SecurityContextHolder.getContext(); - return Optional.ofNullable(securityContext.getAuthentication()) - .map(authentication -> authentication.getAuthorities().stream() - .noneMatch(grantedAuthority -> grantedAuthority.getAuthority().equals(AuthoritiesConstants.ANONYMOUS))) - .orElse(false); - } - - /** - * If the current user has a specific authority (security role). - *

- * The name of this method comes from the isUserInRole() method in the Servlet API - * - * @param authority the authority to check - * @return true if the current user has the authority, false otherwise - */ - public static boolean isCurrentUserInRole(String authority) { - SecurityContext securityContext = SecurityContextHolder.getContext(); - return Optional.ofNullable(securityContext.getAuthentication()) - .map(authentication -> authentication.getAuthorities().stream() - .anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals(authority))) - .orElse(false); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SpringSecurityAuditorAware.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SpringSecurityAuditorAware.java deleted file mode 100644 index c1d6405ae3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/SpringSecurityAuditorAware.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.jhipster5.security; - -import com.baeldung.jhipster5.config.Constants; - -import java.util.Optional; - -import org.springframework.data.domain.AuditorAware; -import org.springframework.stereotype.Component; - -/** - * Implementation of AuditorAware based on Spring Security. - */ -@Component -public class SpringSecurityAuditorAware implements AuditorAware { - - @Override - public Optional getCurrentAuditor() { - return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT)); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/UserNotActivatedException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/UserNotActivatedException.java deleted file mode 100644 index 4b2d91983c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/UserNotActivatedException.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.jhipster5.security; - -import org.springframework.security.core.AuthenticationException; - -/** - * This exception is thrown in case of a not activated user trying to authenticate. - */ -public class UserNotActivatedException extends AuthenticationException { - - private static final long serialVersionUID = 1L; - - public UserNotActivatedException(String message) { - super(message); - } - - public UserNotActivatedException(String message, Throwable t) { - super(message, t); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java deleted file mode 100644 index f45c23fa39..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.jhipster5.security.dto; - -/** - * Simple DTO representing a login request to a remote service. - */ -public class LoginRequest { - - private String username; - - private String password; - - public LoginRequest() { - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java deleted file mode 100644 index ad1fe37a2f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/dto/LoginResponse.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.jhipster5.security.dto; - -/** - * Simple DTO representing the response of logging in using a remote service. - */ -public class LoginResponse { - - private String username; - - private String firstName; - - private String lastName; - - private String email; - - public LoginResponse() { - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTConfigurer.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTConfigurer.java deleted file mode 100644 index 944255e37d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTConfigurer.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.jhipster5.security.jwt; - -import org.springframework.security.config.annotation.SecurityConfigurerAdapter; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.DefaultSecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -public class JWTConfigurer extends SecurityConfigurerAdapter { - - private TokenProvider tokenProvider; - - public JWTConfigurer(TokenProvider tokenProvider) { - this.tokenProvider = tokenProvider; - } - - @Override - public void configure(HttpSecurity http) throws Exception { - JWTFilter customFilter = new JWTFilter(tokenProvider); - http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTFilter.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTFilter.java deleted file mode 100644 index cf1060282c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/JWTFilter.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.jhipster5.security.jwt; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.GenericFilterBean; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -/** - * Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is - * found. - */ -public class JWTFilter extends GenericFilterBean { - - public static final String AUTHORIZATION_HEADER = "Authorization"; - - private TokenProvider tokenProvider; - - public JWTFilter(TokenProvider tokenProvider) { - this.tokenProvider = tokenProvider; - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; - String jwt = resolveToken(httpServletRequest); - if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) { - Authentication authentication = this.tokenProvider.getAuthentication(jwt); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - filterChain.doFilter(servletRequest, servletResponse); - } - - private String resolveToken(HttpServletRequest request){ - String bearerToken = request.getHeader(AUTHORIZATION_HEADER); - if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { - return bearerToken.substring(7); - } - return null; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/TokenProvider.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/TokenProvider.java deleted file mode 100644 index 248d45e050..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/jwt/TokenProvider.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.baeldung.jhipster5.security.jwt; - -import java.nio.charset.StandardCharsets; -import java.security.Key; -import java.util.*; -import java.util.stream.Collectors; -import javax.annotation.PostConstruct; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.User; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import io.github.jhipster.config.JHipsterProperties; -import io.jsonwebtoken.*; -import io.jsonwebtoken.io.Decoders; -import io.jsonwebtoken.security.Keys; - -@Component -public class TokenProvider { - - private final Logger log = LoggerFactory.getLogger(TokenProvider.class); - - private static final String AUTHORITIES_KEY = "auth"; - - private Key key; - - private long tokenValidityInMilliseconds; - - private long tokenValidityInMillisecondsForRememberMe; - - private final JHipsterProperties jHipsterProperties; - - public TokenProvider(JHipsterProperties jHipsterProperties) { - this.jHipsterProperties = jHipsterProperties; - } - - @PostConstruct - public void init() { - byte[] keyBytes; - String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret(); - if (!StringUtils.isEmpty(secret)) { - log.warn("Warning: the JWT key used is not Base64-encoded. " + - "We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security."); - keyBytes = secret.getBytes(StandardCharsets.UTF_8); - } else { - log.debug("Using a Base64-encoded JWT secret key"); - keyBytes = Decoders.BASE64.decode(jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret()); - } - this.key = Keys.hmacShaKeyFor(keyBytes); - this.tokenValidityInMilliseconds = - 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds(); - this.tokenValidityInMillisecondsForRememberMe = - 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt() - .getTokenValidityInSecondsForRememberMe(); - } - - public String createToken(Authentication authentication, boolean rememberMe) { - String authorities = authentication.getAuthorities().stream() - .map(GrantedAuthority::getAuthority) - .collect(Collectors.joining(",")); - - long now = (new Date()).getTime(); - Date validity; - if (rememberMe) { - validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe); - } else { - validity = new Date(now + this.tokenValidityInMilliseconds); - } - - return Jwts.builder() - .setSubject(authentication.getName()) - .claim(AUTHORITIES_KEY, authorities) - .signWith(key, SignatureAlgorithm.HS512) - .setExpiration(validity) - .compact(); - } - - public Authentication getAuthentication(String token) { - Claims claims = Jwts.parser() - .setSigningKey(key) - .parseClaimsJws(token) - .getBody(); - - Collection authorities = - Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(",")) - .map(SimpleGrantedAuthority::new) - .collect(Collectors.toList()); - - User principal = new User(claims.getSubject(), "", authorities); - - return new UsernamePasswordAuthenticationToken(principal, token, authorities); - } - - public boolean validateToken(String authToken) { - try { - Jwts.parser().setSigningKey(key).parseClaimsJws(authToken); - return true; - } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) { - log.info("Invalid JWT signature."); - log.trace("Invalid JWT signature trace: {}", e); - } catch (ExpiredJwtException e) { - log.info("Expired JWT token."); - log.trace("Expired JWT token trace: {}", e); - } catch (UnsupportedJwtException e) { - log.info("Unsupported JWT token."); - log.trace("Unsupported JWT token trace: {}", e); - } catch (IllegalArgumentException e) { - log.info("JWT token compact of handler are invalid."); - log.trace("JWT token compact of handler are invalid trace: {}", e); - } - return false; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/package-info.java deleted file mode 100644 index 4759050c56..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/security/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Spring Security configuration. - */ -package com.baeldung.jhipster5.security; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/AuditEventService.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/AuditEventService.java deleted file mode 100644 index 852eb951c9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/AuditEventService.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.jhipster5.service; - -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.repository.PersistenceAuditEventRepository; -import org.springframework.boot.actuate.audit.AuditEvent; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.Instant; -import java.util.Optional; - -/** - * Service for managing audit events. - *

- * This is the default implementation to support SpringBoot Actuator AuditEventRepository - */ -@Service -@Transactional -public class AuditEventService { - - private final PersistenceAuditEventRepository persistenceAuditEventRepository; - - private final AuditEventConverter auditEventConverter; - - public AuditEventService( - PersistenceAuditEventRepository persistenceAuditEventRepository, - AuditEventConverter auditEventConverter) { - - this.persistenceAuditEventRepository = persistenceAuditEventRepository; - this.auditEventConverter = auditEventConverter; - } - - public Page findAll(Pageable pageable) { - return persistenceAuditEventRepository.findAll(pageable) - .map(auditEventConverter::convertToAuditEvent); - } - - public Page findByDates(Instant fromDate, Instant toDate, Pageable pageable) { - return persistenceAuditEventRepository.findAllByAuditEventDateBetween(fromDate, toDate, pageable) - .map(auditEventConverter::convertToAuditEvent); - } - - public Optional find(Long id) { - return Optional.ofNullable(persistenceAuditEventRepository.findById(id)) - .filter(Optional::isPresent) - .map(Optional::get) - .map(auditEventConverter::convertToAuditEvent); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/BookService.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/BookService.java deleted file mode 100644 index 6422d1a424..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/BookService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.jhipster5.service; - -import com.baeldung.jhipster5.service.dto.BookDTO; - -import java.util.List; -import java.util.Optional; - -/** - * Service Interface for managing Book. - */ -public interface BookService { - - /** - * Save a book. - * - * @param bookDTO the entity to save - * @return the persisted entity - */ - BookDTO save(BookDTO bookDTO); - - /** - * Get all the books. - * - * @return the list of entities - */ - List findAll(); - - - /** - * Get the "id" book. - * - * @param id the id of the entity - * @return the entity - */ - Optional findOne(Long id); - - /** - * Delete the "id" book. - * - * @param id the id of the entity - */ - void delete(Long id); - - /** - * Simulates purchasing a book by reducing the stock of a book by 1. - * @param id the id of the book - * @return Updated BookDTO, empty if not found, or throws exception if an error occurs. - */ - Optional purchase(Long id); -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/MailService.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/MailService.java deleted file mode 100644 index b15a7faff2..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/MailService.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.baeldung.jhipster5.service; - -import com.baeldung.jhipster5.domain.User; - -import io.github.jhipster.config.JHipsterProperties; - -import java.nio.charset.StandardCharsets; -import java.util.Locale; -import javax.mail.internet.MimeMessage; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.MessageSource; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.thymeleaf.context.Context; -import org.thymeleaf.spring5.SpringTemplateEngine; - -/** - * Service for sending emails. - *

- * We use the @Async annotation to send emails asynchronously. - */ -@Service -public class MailService { - - private final Logger log = LoggerFactory.getLogger(MailService.class); - - private static final String USER = "user"; - - private static final String BASE_URL = "baseUrl"; - - private final JHipsterProperties jHipsterProperties; - - private final JavaMailSender javaMailSender; - - private final MessageSource messageSource; - - private final SpringTemplateEngine templateEngine; - - public MailService(JHipsterProperties jHipsterProperties, JavaMailSender javaMailSender, - MessageSource messageSource, SpringTemplateEngine templateEngine) { - - this.jHipsterProperties = jHipsterProperties; - this.javaMailSender = javaMailSender; - this.messageSource = messageSource; - this.templateEngine = templateEngine; - } - - @Async - public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) { - log.debug("Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}", - isMultipart, isHtml, to, subject, content); - - // Prepare message using a Spring helper - MimeMessage mimeMessage = javaMailSender.createMimeMessage(); - try { - MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, StandardCharsets.UTF_8.name()); - message.setTo(to); - message.setFrom(jHipsterProperties.getMail().getFrom()); - message.setSubject(subject); - message.setText(content, isHtml); - javaMailSender.send(mimeMessage); - log.debug("Sent email to User '{}'", to); - } catch (Exception e) { - if (log.isDebugEnabled()) { - log.warn("Email could not be sent to user '{}'", to, e); - } else { - log.warn("Email could not be sent to user '{}': {}", to, e.getMessage()); - } - } - } - - @Async - public void sendEmailFromTemplate(User user, String templateName, String titleKey) { - Locale locale = Locale.forLanguageTag(user.getLangKey()); - Context context = new Context(locale); - context.setVariable(USER, user); - context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl()); - String content = templateEngine.process(templateName, context); - String subject = messageSource.getMessage(titleKey, null, locale); - sendEmail(user.getEmail(), subject, content, false, true); - - } - - @Async - public void sendActivationEmail(User user) { - log.debug("Sending activation email to '{}'", user.getEmail()); - sendEmailFromTemplate(user, "mail/activationEmail", "email.activation.title"); - } - - @Async - public void sendCreationEmail(User user) { - log.debug("Sending creation email to '{}'", user.getEmail()); - sendEmailFromTemplate(user, "mail/creationEmail", "email.activation.title"); - } - - @Async - public void sendPasswordResetMail(User user) { - log.debug("Sending password reset email to '{}'", user.getEmail()); - sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title"); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/UserService.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/UserService.java deleted file mode 100644 index 82d028f3ca..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/UserService.java +++ /dev/null @@ -1,273 +0,0 @@ -package com.baeldung.jhipster5.service; - -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.AuthorityRepository; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.security.SecurityUtils; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.service.util.RandomUtil; -import com.baeldung.jhipster5.web.rest.errors.*; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.*; -import java.util.stream.Collectors; - -/** - * Service class for managing users. - */ -@Service -@Transactional -public class UserService { - - private final Logger log = LoggerFactory.getLogger(UserService.class); - - private final UserRepository userRepository; - - private final PasswordEncoder passwordEncoder; - - private final AuthorityRepository authorityRepository; - - public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder, AuthorityRepository authorityRepository) { - this.userRepository = userRepository; - this.passwordEncoder = passwordEncoder; - this.authorityRepository = authorityRepository; - } - - public Optional activateRegistration(String key) { - log.debug("Activating user for activation key {}", key); - return userRepository.findOneByActivationKey(key) - .map(user -> { - // activate given user for the registration key. - user.setActivated(true); - user.setActivationKey(null); - log.debug("Activated user: {}", user); - return user; - }); - } - - public Optional completePasswordReset(String newPassword, String key) { - log.debug("Reset user password for reset key {}", key); - return userRepository.findOneByResetKey(key) - .filter(user -> user.getResetDate().isAfter(Instant.now().minusSeconds(86400))) - .map(user -> { - user.setPassword(passwordEncoder.encode(newPassword)); - user.setResetKey(null); - user.setResetDate(null); - return user; - }); - } - - public Optional requestPasswordReset(String mail) { - return userRepository.findOneByEmailIgnoreCase(mail) - .filter(User::getActivated) - .map(user -> { - user.setResetKey(RandomUtil.generateResetKey()); - user.setResetDate(Instant.now()); - return user; - }); - } - - public User registerUser(UserDTO userDTO, String password) { - userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()).ifPresent(existingUser -> { - boolean removed = removeNonActivatedUser(existingUser); - if (!removed) { - throw new LoginAlreadyUsedException(); - } - }); - userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()).ifPresent(existingUser -> { - boolean removed = removeNonActivatedUser(existingUser); - if (!removed) { - throw new EmailAlreadyUsedException(); - } - }); - User newUser = new User(); - String encryptedPassword = passwordEncoder.encode(password); - newUser.setLogin(userDTO.getLogin().toLowerCase()); - // new user gets initially a generated password - newUser.setPassword(encryptedPassword); - newUser.setFirstName(userDTO.getFirstName()); - newUser.setLastName(userDTO.getLastName()); - newUser.setEmail(userDTO.getEmail().toLowerCase()); - newUser.setImageUrl(userDTO.getImageUrl()); - newUser.setLangKey(userDTO.getLangKey()); - // new user is not active - newUser.setActivated(false); - // new user gets registration key - newUser.setActivationKey(RandomUtil.generateActivationKey()); - Set authorities = new HashSet<>(); - authorityRepository.findById(AuthoritiesConstants.USER).ifPresent(authorities::add); - newUser.setAuthorities(authorities); - userRepository.save(newUser); - log.debug("Created Information for User: {}", newUser); - return newUser; - } - - private boolean removeNonActivatedUser(User existingUser){ - if (existingUser.getActivated()) { - return false; - } - userRepository.delete(existingUser); - userRepository.flush(); - return true; - } - - public User createUser(UserDTO userDTO) { - User user = new User(); - user.setLogin(userDTO.getLogin().toLowerCase()); - user.setFirstName(userDTO.getFirstName()); - user.setLastName(userDTO.getLastName()); - user.setEmail(userDTO.getEmail().toLowerCase()); - user.setImageUrl(userDTO.getImageUrl()); - if (userDTO.getLangKey() == null) { - user.setLangKey(Constants.DEFAULT_LANGUAGE); // default language - } else { - user.setLangKey(userDTO.getLangKey()); - } - String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); - user.setPassword(encryptedPassword); - user.setResetKey(RandomUtil.generateResetKey()); - user.setResetDate(Instant.now()); - user.setActivated(true); - if (userDTO.getAuthorities() != null) { - Set authorities = userDTO.getAuthorities().stream() - .map(authorityRepository::findById) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toSet()); - user.setAuthorities(authorities); - } - userRepository.save(user); - log.debug("Created Information for User: {}", user); - return user; - } - - /** - * Update basic information (first name, last name, email, language) for the current user. - * - * @param firstName first name of user - * @param lastName last name of user - * @param email email id of user - * @param langKey language key - * @param imageUrl image URL of user - */ - public void updateUser(String firstName, String lastName, String email, String langKey, String imageUrl) { - SecurityUtils.getCurrentUserLogin() - .flatMap(userRepository::findOneByLogin) - .ifPresent(user -> { - user.setFirstName(firstName); - user.setLastName(lastName); - user.setEmail(email.toLowerCase()); - user.setLangKey(langKey); - user.setImageUrl(imageUrl); - log.debug("Changed Information for User: {}", user); - }); - } - - /** - * Update all information for a specific user, and return the modified user. - * - * @param userDTO user to update - * @return updated user - */ - public Optional updateUser(UserDTO userDTO) { - return Optional.of(userRepository - .findById(userDTO.getId())) - .filter(Optional::isPresent) - .map(Optional::get) - .map(user -> { - user.setLogin(userDTO.getLogin().toLowerCase()); - user.setFirstName(userDTO.getFirstName()); - user.setLastName(userDTO.getLastName()); - user.setEmail(userDTO.getEmail().toLowerCase()); - user.setImageUrl(userDTO.getImageUrl()); - user.setActivated(userDTO.isActivated()); - user.setLangKey(userDTO.getLangKey()); - Set managedAuthorities = user.getAuthorities(); - managedAuthorities.clear(); - userDTO.getAuthorities().stream() - .map(authorityRepository::findById) - .filter(Optional::isPresent) - .map(Optional::get) - .forEach(managedAuthorities::add); - log.debug("Changed Information for User: {}", user); - return user; - }) - .map(UserDTO::new); - } - - public void deleteUser(String login) { - userRepository.findOneByLogin(login).ifPresent(user -> { - userRepository.delete(user); - log.debug("Deleted User: {}", user); - }); - } - - public void changePassword(String currentClearTextPassword, String newPassword) { - SecurityUtils.getCurrentUserLogin() - .flatMap(userRepository::findOneByLogin) - .ifPresent(user -> { - String currentEncryptedPassword = user.getPassword(); - if (!passwordEncoder.matches(currentClearTextPassword, currentEncryptedPassword)) { - throw new InvalidPasswordException(); - } - String encryptedPassword = passwordEncoder.encode(newPassword); - user.setPassword(encryptedPassword); - log.debug("Changed password for User: {}", user); - }); - } - - @Transactional(readOnly = true) - public Page getAllManagedUsers(Pageable pageable) { - return userRepository.findAllByLoginNot(pageable, Constants.ANONYMOUS_USER).map(UserDTO::new); - } - - @Transactional(readOnly = true) - public Optional getUserWithAuthoritiesByLogin(String login) { - return userRepository.findOneWithAuthoritiesByLogin(login); - } - - @Transactional(readOnly = true) - public Optional getUserWithAuthorities(Long id) { - return userRepository.findOneWithAuthoritiesById(id); - } - - @Transactional(readOnly = true) - public Optional getUserWithAuthorities() { - return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin); - } - - /** - * Not activated users should be automatically deleted after 3 days. - *

- * This is scheduled to get fired everyday, at 01:00 (am). - */ - @Scheduled(cron = "0 0 1 * * ?") - public void removeNotActivatedUsers() { - userRepository - .findAllByActivatedIsFalseAndCreatedDateBefore(Instant.now().minus(3, ChronoUnit.DAYS)) - .forEach(user -> { - log.debug("Deleting not activated user {}", user.getLogin()); - userRepository.delete(user); - }); - } - - /** - * @return a list of all the authorities - */ - public List getAuthorities() { - return authorityRepository.findAll().stream().map(Authority::getName).collect(Collectors.toList()); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/BookDTO.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/BookDTO.java deleted file mode 100644 index 5aa550e989..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/BookDTO.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.baeldung.jhipster5.service.dto; -import java.time.LocalDate; -import javax.validation.constraints.*; -import java.io.Serializable; -import java.util.Objects; - -/** - * A DTO for the Book entity. - */ -public class BookDTO implements Serializable { - - private Long id; - - @NotNull - private String title; - - @NotNull - private String author; - - @NotNull - private LocalDate published; - - @NotNull - @Min(value = 0) - private Integer quantity; - - @NotNull - @DecimalMin(value = "0") - private Double price; - - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public LocalDate getPublished() { - return published; - } - - public void setPublished(LocalDate published) { - this.published = published; - } - - public Integer getQuantity() { - return quantity; - } - - public void setQuantity(Integer quantity) { - this.quantity = quantity; - } - - public Double getPrice() { - return price; - } - - public void setPrice(Double price) { - this.price = price; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - BookDTO bookDTO = (BookDTO) o; - if (bookDTO.getId() == null || getId() == null) { - return false; - } - return Objects.equals(getId(), bookDTO.getId()); - } - - @Override - public int hashCode() { - return Objects.hashCode(getId()); - } - - @Override - public String toString() { - return "BookDTO{" + - "id=" + getId() + - ", title='" + getTitle() + "'" + - ", author='" + getAuthor() + "'" + - ", published='" + getPublished() + "'" + - ", quantity=" + getQuantity() + - ", price=" + getPrice() + - "}"; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/PasswordChangeDTO.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/PasswordChangeDTO.java deleted file mode 100644 index 0711c97f44..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/PasswordChangeDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.jhipster5.service.dto; - -/** - * A DTO representing a password change required data - current and new password. - */ -public class PasswordChangeDTO { - private String currentPassword; - private String newPassword; - - public PasswordChangeDTO() { - // Empty constructor needed for Jackson. - } - - public PasswordChangeDTO(String currentPassword, String newPassword) { - this.currentPassword = currentPassword; - this.newPassword = newPassword; - } - - public String getCurrentPassword() { - - return currentPassword; - } - - public void setCurrentPassword(String currentPassword) { - this.currentPassword = currentPassword; - } - - public String getNewPassword() { - return newPassword; - } - - public void setNewPassword(String newPassword) { - this.newPassword = newPassword; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/UserDTO.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/UserDTO.java deleted file mode 100644 index 9142b3825e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/UserDTO.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.baeldung.jhipster5.service.dto; - -import com.baeldung.jhipster5.config.Constants; - -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; - -import javax.validation.constraints.*; -import java.time.Instant; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * A DTO representing a user, with his authorities. - */ -public class UserDTO { - - private Long id; - - @NotBlank - @Pattern(regexp = Constants.LOGIN_REGEX) - @Size(min = 1, max = 50) - private String login; - - @Size(max = 50) - private String firstName; - - @Size(max = 50) - private String lastName; - - @Email - @Size(min = 5, max = 254) - private String email; - - @Size(max = 256) - private String imageUrl; - - private boolean activated = false; - - @Size(min = 2, max = 6) - private String langKey; - - private String createdBy; - - private Instant createdDate; - - private String lastModifiedBy; - - private Instant lastModifiedDate; - - private Set authorities; - - public UserDTO() { - // Empty constructor needed for Jackson. - } - - public UserDTO(User user) { - this.id = user.getId(); - this.login = user.getLogin(); - this.firstName = user.getFirstName(); - this.lastName = user.getLastName(); - this.email = user.getEmail(); - this.activated = user.getActivated(); - this.imageUrl = user.getImageUrl(); - this.langKey = user.getLangKey(); - this.createdBy = user.getCreatedBy(); - this.createdDate = user.getCreatedDate(); - this.lastModifiedBy = user.getLastModifiedBy(); - this.lastModifiedDate = user.getLastModifiedDate(); - this.authorities = user.getAuthorities().stream() - .map(Authority::getName) - .collect(Collectors.toSet()); - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getLogin() { - return login; - } - - public void setLogin(String login) { - this.login = login; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getImageUrl() { - return imageUrl; - } - - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; - } - - public boolean isActivated() { - return activated; - } - - public void setActivated(boolean activated) { - this.activated = activated; - } - - public String getLangKey() { - return langKey; - } - - public void setLangKey(String langKey) { - this.langKey = langKey; - } - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - public Instant getCreatedDate() { - return createdDate; - } - - public void setCreatedDate(Instant createdDate) { - this.createdDate = createdDate; - } - - public String getLastModifiedBy() { - return lastModifiedBy; - } - - public void setLastModifiedBy(String lastModifiedBy) { - this.lastModifiedBy = lastModifiedBy; - } - - public Instant getLastModifiedDate() { - return lastModifiedDate; - } - - public void setLastModifiedDate(Instant lastModifiedDate) { - this.lastModifiedDate = lastModifiedDate; - } - - public Set getAuthorities() { - return authorities; - } - - public void setAuthorities(Set authorities) { - this.authorities = authorities; - } - - @Override - public String toString() { - return "UserDTO{" + - "login='" + login + '\'' + - ", firstName='" + firstName + '\'' + - ", lastName='" + lastName + '\'' + - ", email='" + email + '\'' + - ", imageUrl='" + imageUrl + '\'' + - ", activated=" + activated + - ", langKey='" + langKey + '\'' + - ", createdBy=" + createdBy + - ", createdDate=" + createdDate + - ", lastModifiedBy='" + lastModifiedBy + '\'' + - ", lastModifiedDate=" + lastModifiedDate + - ", authorities=" + authorities + - "}"; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/package-info.java deleted file mode 100644 index 87951796ea..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/dto/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Data Transfer Objects. - */ -package com.baeldung.jhipster5.service.dto; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/impl/BookServiceImpl.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/impl/BookServiceImpl.java deleted file mode 100644 index 23cd59584c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/impl/BookServiceImpl.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.baeldung.jhipster5.service.impl; - -import com.baeldung.jhipster5.service.BookService; -import com.baeldung.jhipster5.domain.Book; -import com.baeldung.jhipster5.repository.BookRepository; -import com.baeldung.jhipster5.service.dto.BookDTO; -import com.baeldung.jhipster5.service.mapper.BookMapper; -import com.baeldung.jhipster5.web.rest.errors.BadRequestAlertException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * Service Implementation for managing Book. - */ -@Service -@Transactional -public class BookServiceImpl implements BookService { - - private final Logger log = LoggerFactory.getLogger(BookServiceImpl.class); - - private final BookRepository bookRepository; - - private final BookMapper bookMapper; - - public BookServiceImpl(BookRepository bookRepository, BookMapper bookMapper) { - this.bookRepository = bookRepository; - this.bookMapper = bookMapper; - } - - /** - * Save a book. - * - * @param bookDTO the entity to save - * @return the persisted entity - */ - @Override - public BookDTO save(BookDTO bookDTO) { - log.debug("Request to save Book : {}", bookDTO); - Book book = bookMapper.toEntity(bookDTO); - book = bookRepository.save(book); - return bookMapper.toDto(book); - } - - /** - * Get all the books. - * - * @return the list of entities - */ - @Override - @Transactional(readOnly = true) - public List findAll() { - log.debug("Request to get all Books"); - return bookRepository.findAll().stream() - .map(bookMapper::toDto) - .collect(Collectors.toCollection(LinkedList::new)); - } - - - /** - * Get one book by id. - * - * @param id the id of the entity - * @return the entity - */ - @Override - @Transactional(readOnly = true) - public Optional findOne(Long id) { - log.debug("Request to get Book : {}", id); - return bookRepository.findById(id) - .map(bookMapper::toDto); - } - - /** - * Delete the book by id. - * - * @param id the id of the entity - */ - @Override - public void delete(Long id) { - log.debug("Request to delete Book : {}", id); - bookRepository.deleteById(id); - } - - @Override - public Optional purchase(Long id) { - Optional bookDTO = findOne(id); - if(bookDTO.isPresent()) { - int quantity = bookDTO.get().getQuantity(); - if(quantity > 0) { - bookDTO.get().setQuantity(quantity - 1); - Book book = bookMapper.toEntity(bookDTO.get()); - book = bookRepository.save(book); - return bookDTO; - } - else { - throw new BadRequestAlertException("Book is not in stock", "book", "notinstock"); - } - } - return Optional.empty(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/BookMapper.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/BookMapper.java deleted file mode 100644 index cd24c7088e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/BookMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.jhipster5.service.mapper; - -import com.baeldung.jhipster5.domain.*; -import com.baeldung.jhipster5.service.dto.BookDTO; - -import org.mapstruct.*; - -/** - * Mapper for the entity Book and its DTO BookDTO. - */ -@Mapper(componentModel = "spring", uses = {}) -public interface BookMapper extends EntityMapper { - - - - default Book fromId(Long id) { - if (id == null) { - return null; - } - Book book = new Book(); - book.setId(id); - return book; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/EntityMapper.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/EntityMapper.java deleted file mode 100644 index 68af78179d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/EntityMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.jhipster5.service.mapper; - -import java.util.List; - -/** - * Contract for a generic dto to entity mapper. - * - * @param - DTO type parameter. - * @param - Entity type parameter. - */ - -public interface EntityMapper { - - E toEntity(D dto); - - D toDto(E entity); - - List toEntity(List dtoList); - - List toDto(List entityList); -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/UserMapper.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/UserMapper.java deleted file mode 100644 index 485c03813e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/UserMapper.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.baeldung.jhipster5.service.mapper; - -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.service.dto.UserDTO; - -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * Mapper for the entity User and its DTO called UserDTO. - * - * Normal mappers are generated using MapStruct, this one is hand-coded as MapStruct - * support is still in beta, and requires a manual step with an IDE. - */ -@Service -public class UserMapper { - - public List usersToUserDTOs(List users) { - return users.stream() - .filter(Objects::nonNull) - .map(this::userToUserDTO) - .collect(Collectors.toList()); - } - - public UserDTO userToUserDTO(User user) { - return new UserDTO(user); - } - - public List userDTOsToUsers(List userDTOs) { - return userDTOs.stream() - .filter(Objects::nonNull) - .map(this::userDTOToUser) - .collect(Collectors.toList()); - } - - public User userDTOToUser(UserDTO userDTO) { - if (userDTO == null) { - return null; - } else { - User user = new User(); - user.setId(userDTO.getId()); - user.setLogin(userDTO.getLogin()); - user.setFirstName(userDTO.getFirstName()); - user.setLastName(userDTO.getLastName()); - user.setEmail(userDTO.getEmail()); - user.setImageUrl(userDTO.getImageUrl()); - user.setActivated(userDTO.isActivated()); - user.setLangKey(userDTO.getLangKey()); - Set authorities = this.authoritiesFromStrings(userDTO.getAuthorities()); - user.setAuthorities(authorities); - return user; - } - } - - - private Set authoritiesFromStrings(Set authoritiesAsString) { - Set authorities = new HashSet<>(); - - if(authoritiesAsString != null){ - authorities = authoritiesAsString.stream().map(string -> { - Authority auth = new Authority(); - auth.setName(string); - return auth; - }).collect(Collectors.toSet()); - } - - return authorities; - } - - public User userFromId(Long id) { - if (id == null) { - return null; - } - User user = new User(); - user.setId(id); - return user; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/package-info.java deleted file mode 100644 index 7d402321e7..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/mapper/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * MapStruct mappers for mapping domain objects and Data Transfer Objects. - */ -package com.baeldung.jhipster5.service.mapper; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/package-info.java deleted file mode 100644 index a54ed5cca0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Service layer beans. - */ -package com.baeldung.jhipster5.service; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/util/RandomUtil.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/util/RandomUtil.java deleted file mode 100644 index 97e4d9c672..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/service/util/RandomUtil.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.jhipster5.service.util; - -import org.apache.commons.lang3.RandomStringUtils; - -/** - * Utility class for generating random Strings. - */ -public final class RandomUtil { - - private static final int DEF_COUNT = 20; - - private RandomUtil() { - } - - /** - * Generate a password. - * - * @return the generated password - */ - public static String generatePassword() { - return RandomStringUtils.randomAlphanumeric(DEF_COUNT); - } - - /** - * Generate an activation key. - * - * @return the generated activation key - */ - public static String generateActivationKey() { - return RandomStringUtils.randomNumeric(DEF_COUNT); - } - - /** - * Generate a reset key. - * - * @return the generated reset key - */ - public static String generateResetKey() { - return RandomStringUtils.randomNumeric(DEF_COUNT); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AccountResource.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AccountResource.java deleted file mode 100644 index 2109e93999..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AccountResource.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - - -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.SecurityUtils; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.PasswordChangeDTO; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.web.rest.errors.*; -import com.baeldung.jhipster5.web.rest.vm.KeyAndPasswordVM; -import com.baeldung.jhipster5.web.rest.vm.ManagedUserVM; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import java.util.*; - -/** - * REST controller for managing the current user's account. - */ -@RestController -@RequestMapping("/api") -public class AccountResource { - - private final Logger log = LoggerFactory.getLogger(AccountResource.class); - - private final UserRepository userRepository; - - private final UserService userService; - - private final MailService mailService; - - public AccountResource(UserRepository userRepository, UserService userService, MailService mailService) { - - this.userRepository = userRepository; - this.userService = userService; - this.mailService = mailService; - } - - /** - * POST /register : register the user. - * - * @param managedUserVM the managed user View Model - * @throws InvalidPasswordException 400 (Bad Request) if the password is incorrect - * @throws EmailAlreadyUsedException 400 (Bad Request) if the email is already used - * @throws LoginAlreadyUsedException 400 (Bad Request) if the login is already used - */ - @PostMapping("/register") - @ResponseStatus(HttpStatus.CREATED) - public void registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) { - if (!checkPasswordLength(managedUserVM.getPassword())) { - throw new InvalidPasswordException(); - } - User user = userService.registerUser(managedUserVM, managedUserVM.getPassword()); - mailService.sendActivationEmail(user); - } - - /** - * GET /activate : activate the registered user. - * - * @param key the activation key - * @throws RuntimeException 500 (Internal Server Error) if the user couldn't be activated - */ - @GetMapping("/activate") - public void activateAccount(@RequestParam(value = "key") String key) { - Optional user = userService.activateRegistration(key); - if (!user.isPresent()) { - throw new InternalServerErrorException("No user was found for this activation key"); - } - } - - /** - * GET /authenticate : check if the user is authenticated, and return its login. - * - * @param request the HTTP request - * @return the login if the user is authenticated - */ - @GetMapping("/authenticate") - public String isAuthenticated(HttpServletRequest request) { - log.debug("REST request to check if the current user is authenticated"); - return request.getRemoteUser(); - } - - /** - * GET /account : get the current user. - * - * @return the current user - * @throws RuntimeException 500 (Internal Server Error) if the user couldn't be returned - */ - @GetMapping("/account") - public UserDTO getAccount() { - return userService.getUserWithAuthorities() - .map(UserDTO::new) - .orElseThrow(() -> new InternalServerErrorException("User could not be found")); - } - - /** - * POST /account : update the current user information. - * - * @param userDTO the current user information - * @throws EmailAlreadyUsedException 400 (Bad Request) if the email is already used - * @throws RuntimeException 500 (Internal Server Error) if the user login wasn't found - */ - @PostMapping("/account") - public void saveAccount(@Valid @RequestBody UserDTO userDTO) { - String userLogin = SecurityUtils.getCurrentUserLogin().orElseThrow(() -> new InternalServerErrorException("Current user login not found")); - Optional existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); - if (existingUser.isPresent() && (!existingUser.get().getLogin().equalsIgnoreCase(userLogin))) { - throw new EmailAlreadyUsedException(); - } - Optional user = userRepository.findOneByLogin(userLogin); - if (!user.isPresent()) { - throw new InternalServerErrorException("User could not be found"); - } - userService.updateUser(userDTO.getFirstName(), userDTO.getLastName(), userDTO.getEmail(), - userDTO.getLangKey(), userDTO.getImageUrl()); - } - - /** - * POST /account/change-password : changes the current user's password - * - * @param passwordChangeDto current and new password - * @throws InvalidPasswordException 400 (Bad Request) if the new password is incorrect - */ - @PostMapping(path = "/account/change-password") - public void changePassword(@RequestBody PasswordChangeDTO passwordChangeDto) { - if (!checkPasswordLength(passwordChangeDto.getNewPassword())) { - throw new InvalidPasswordException(); - } - userService.changePassword(passwordChangeDto.getCurrentPassword(), passwordChangeDto.getNewPassword()); - } - - /** - * POST /account/reset-password/init : Send an email to reset the password of the user - * - * @param mail the mail of the user - * @throws EmailNotFoundException 400 (Bad Request) if the email address is not registered - */ - @PostMapping(path = "/account/reset-password/init") - public void requestPasswordReset(@RequestBody String mail) { - mailService.sendPasswordResetMail( - userService.requestPasswordReset(mail) - .orElseThrow(EmailNotFoundException::new) - ); - } - - /** - * POST /account/reset-password/finish : Finish to reset the password of the user - * - * @param keyAndPassword the generated key and the new password - * @throws InvalidPasswordException 400 (Bad Request) if the password is incorrect - * @throws RuntimeException 500 (Internal Server Error) if the password could not be reset - */ - @PostMapping(path = "/account/reset-password/finish") - public void finishPasswordReset(@RequestBody KeyAndPasswordVM keyAndPassword) { - if (!checkPasswordLength(keyAndPassword.getNewPassword())) { - throw new InvalidPasswordException(); - } - Optional user = - userService.completePasswordReset(keyAndPassword.getNewPassword(), keyAndPassword.getKey()); - - if (!user.isPresent()) { - throw new InternalServerErrorException("No user was found for this reset key"); - } - } - - private static boolean checkPasswordLength(String password) { - return !StringUtils.isEmpty(password) && - password.length() >= ManagedUserVM.PASSWORD_MIN_LENGTH && - password.length() <= ManagedUserVM.PASSWORD_MAX_LENGTH; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AuditResource.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AuditResource.java deleted file mode 100644 index d0182d5d9d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/AuditResource.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.service.AuditEventService; -import com.baeldung.jhipster5.web.rest.util.PaginationUtil; - -import io.github.jhipster.web.util.ResponseUtil; -import org.springframework.boot.actuate.audit.AuditEvent; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.List; - -/** - * REST controller for getting the audit events. - */ -@RestController -@RequestMapping("/management/audits") -public class AuditResource { - - private final AuditEventService auditEventService; - - public AuditResource(AuditEventService auditEventService) { - this.auditEventService = auditEventService; - } - - /** - * GET /audits : get a page of AuditEvents. - * - * @param pageable the pagination information - * @return the ResponseEntity with status 200 (OK) and the list of AuditEvents in body - */ - @GetMapping - public ResponseEntity> getAll(Pageable pageable) { - Page page = auditEventService.findAll(pageable); - HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/management/audits"); - return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); - } - - /** - * GET /audits : get a page of AuditEvents between the fromDate and toDate. - * - * @param fromDate the start of the time period of AuditEvents to get - * @param toDate the end of the time period of AuditEvents to get - * @param pageable the pagination information - * @return the ResponseEntity with status 200 (OK) and the list of AuditEvents in body - */ - @GetMapping(params = {"fromDate", "toDate"}) - public ResponseEntity> getByDates( - @RequestParam(value = "fromDate") LocalDate fromDate, - @RequestParam(value = "toDate") LocalDate toDate, - Pageable pageable) { - - Page page = auditEventService.findByDates( - fromDate.atStartOfDay(ZoneId.systemDefault()).toInstant(), - toDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant(), - pageable); - HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/management/audits"); - return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); - } - - /** - * GET /audits/:id : get an AuditEvent by id. - * - * @param id the id of the entity to get - * @return the ResponseEntity with status 200 (OK) and the AuditEvent in body, or status 404 (Not Found) - */ - @GetMapping("/{id:.+}") - public ResponseEntity get(@PathVariable Long id) { - return ResponseUtil.wrapOrNotFound(auditEventService.find(id)); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/BookResource.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/BookResource.java deleted file mode 100644 index 0360ea05ed..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/BookResource.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.baeldung.jhipster5.web.rest; -import com.baeldung.jhipster5.service.BookService; -import com.baeldung.jhipster5.web.rest.errors.BadRequestAlertException; -import com.baeldung.jhipster5.web.rest.util.HeaderUtil; -import com.baeldung.jhipster5.service.dto.BookDTO; -import io.github.jhipster.web.util.ResponseUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.net.URI; -import java.net.URISyntaxException; - -import java.util.List; -import java.util.Optional; - -/** - * REST controller for managing Book. - */ -@RestController -@RequestMapping("/api") -public class BookResource { - - private final Logger log = LoggerFactory.getLogger(BookResource.class); - - private static final String ENTITY_NAME = "book"; - - private final BookService bookService; - - public BookResource(BookService bookService) { - this.bookService = bookService; - } - - /** - * POST /books : Create a new book. - * - * @param bookDTO the bookDTO to create - * @return the ResponseEntity with status 201 (Created) and with body the new bookDTO, or with status 400 (Bad Request) if the book has already an ID - * @throws URISyntaxException if the Location URI syntax is incorrect - */ - @PostMapping("/books") - public ResponseEntity createBook(@Valid @RequestBody BookDTO bookDTO) throws URISyntaxException { - log.debug("REST request to save Book : {}", bookDTO); - if (bookDTO.getId() != null) { - throw new BadRequestAlertException("A new book cannot already have an ID", ENTITY_NAME, "idexists"); - } - BookDTO result = bookService.save(bookDTO); - return ResponseEntity.created(new URI("/api/books/" + result.getId())) - .headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getId().toString())) - .body(result); - } - - /** - * PUT /books : Updates an existing book. - * - * @param bookDTO the bookDTO to update - * @return the ResponseEntity with status 200 (OK) and with body the updated bookDTO, - * or with status 400 (Bad Request) if the bookDTO is not valid, - * or with status 500 (Internal Server Error) if the bookDTO couldn't be updated - * @throws URISyntaxException if the Location URI syntax is incorrect - */ - @PutMapping("/books") - public ResponseEntity updateBook(@Valid @RequestBody BookDTO bookDTO) throws URISyntaxException { - log.debug("REST request to update Book : {}", bookDTO); - if (bookDTO.getId() == null) { - throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); - } - BookDTO result = bookService.save(bookDTO); - return ResponseEntity.ok() - .headers(HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, bookDTO.getId().toString())) - .body(result); - } - - /** - * GET /books : get all the books. - * - * @return the ResponseEntity with status 200 (OK) and the list of books in body - */ - @GetMapping("/books") - public List getAllBooks() { - log.debug("REST request to get all Books"); - return bookService.findAll(); - } - - /** - * GET /books/:id : get the "id" book. - * - * @param id the id of the bookDTO to retrieve - * @return the ResponseEntity with status 200 (OK) and with body the bookDTO, or with status 404 (Not Found) - */ - @GetMapping("/books/{id}") - public ResponseEntity getBook(@PathVariable Long id) { - log.debug("REST request to get Book : {}", id); - Optional bookDTO = bookService.findOne(id); - return ResponseUtil.wrapOrNotFound(bookDTO); - } - - /** - * DELETE /books/:id : delete the "id" book. - * - * @param id the id of the bookDTO to delete - * @return the ResponseEntity with status 200 (OK) - */ - @DeleteMapping("/books/{id}") - public ResponseEntity deleteBook(@PathVariable Long id) { - log.debug("REST request to delete Book : {}", id); - bookService.delete(id); - return ResponseEntity.ok().headers(HeaderUtil.createEntityDeletionAlert(ENTITY_NAME, id.toString())).build(); - } - - @GetMapping("/books/purchase/{id}") - public ResponseEntity purchase(@PathVariable Long id) { - Optional bookDTO = bookService.purchase(id); - return ResponseUtil.wrapOrNotFound(bookDTO); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/LogsResource.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/LogsResource.java deleted file mode 100644 index f35b5f2d5c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/LogsResource.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.web.rest.vm.LoggerVM; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.LoggerContext; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * Controller for view and managing Log Level at runtime. - */ -@RestController -@RequestMapping("/management") -public class LogsResource { - - @GetMapping("/logs") - public List getList() { - LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - return context.getLoggerList() - .stream() - .map(LoggerVM::new) - .collect(Collectors.toList()); - } - - @PutMapping("/logs") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void changeLevel(@RequestBody LoggerVM jsonLogger) { - LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - context.getLogger(jsonLogger.getName()).setLevel(Level.valueOf(jsonLogger.getLevel())); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserJWTController.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserJWTController.java deleted file mode 100644 index aeea587089..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserJWTController.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.security.jwt.JWTFilter; -import com.baeldung.jhipster5.security.jwt.TokenProvider; -import com.baeldung.jhipster5.web.rest.vm.LoginVM; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * Controller to authenticate users. - */ -@RestController -@RequestMapping("/api") -public class UserJWTController { - - private final TokenProvider tokenProvider; - - private final AuthenticationManager authenticationManager; - - public UserJWTController(TokenProvider tokenProvider, AuthenticationManager authenticationManager) { - this.tokenProvider = tokenProvider; - this.authenticationManager = authenticationManager; - } - - @PostMapping("/authenticate") - public ResponseEntity authorize(@Valid @RequestBody LoginVM loginVM) { - - UsernamePasswordAuthenticationToken authenticationToken = - new UsernamePasswordAuthenticationToken(loginVM.getUsername(), loginVM.getPassword()); - - Authentication authentication = this.authenticationManager.authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe(); - String jwt = tokenProvider.createToken(authentication, rememberMe); - HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); - return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK); - } - - /** - * Object to return as body in JWT Authentication. - */ - static class JWTToken { - - private String idToken; - - JWTToken(String idToken) { - this.idToken = idToken; - } - - @JsonProperty("id_token") - String getIdToken() { - return idToken; - } - - void setIdToken(String idToken) { - this.idToken = idToken; - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserResource.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserResource.java deleted file mode 100644 index a95acf6759..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/UserResource.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.web.rest.errors.BadRequestAlertException; -import com.baeldung.jhipster5.web.rest.errors.EmailAlreadyUsedException; -import com.baeldung.jhipster5.web.rest.errors.LoginAlreadyUsedException; -import com.baeldung.jhipster5.web.rest.util.HeaderUtil; -import com.baeldung.jhipster5.web.rest.util.PaginationUtil; -import io.github.jhipster.web.util.ResponseUtil; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.*; - -/** - * REST controller for managing users. - *

- * This class accesses the User entity, and needs to fetch its collection of authorities. - *

- * For a normal use-case, it would be better to have an eager relationship between User and Authority, - * and send everything to the client side: there would be no View Model and DTO, a lot less code, and an outer-join - * which would be good for performance. - *

- * We use a View Model and a DTO for 3 reasons: - *

    - *
  • We want to keep a lazy association between the user and the authorities, because people will - * quite often do relationships with the user, and we don't want them to get the authorities all - * the time for nothing (for performance reasons). This is the #1 goal: we should not impact our users' - * application because of this use-case.
  • - *
  • Not having an outer join causes n+1 requests to the database. This is not a real issue as - * we have by default a second-level cache. This means on the first HTTP call we do the n+1 requests, - * but then all authorities come from the cache, so in fact it's much better than doing an outer join - * (which will get lots of data from the database, for each HTTP call).
  • - *
  • As this manages users, for security reasons, we'd rather have a DTO layer.
  • - *
- *

- * Another option would be to have a specific JPA entity graph to handle this case. - */ -@RestController -@RequestMapping("/api") -public class UserResource { - - private final Logger log = LoggerFactory.getLogger(UserResource.class); - - private final UserService userService; - - private final UserRepository userRepository; - - private final MailService mailService; - - public UserResource(UserService userService, UserRepository userRepository, MailService mailService) { - - this.userService = userService; - this.userRepository = userRepository; - this.mailService = mailService; - } - - /** - * POST /users : Creates a new user. - *

- * Creates a new user if the login and email are not already used, and sends an - * mail with an activation link. - * The user needs to be activated on creation. - * - * @param userDTO the user to create - * @return the ResponseEntity with status 201 (Created) and with body the new user, or with status 400 (Bad Request) if the login or email is already in use - * @throws URISyntaxException if the Location URI syntax is incorrect - * @throws BadRequestAlertException 400 (Bad Request) if the login or email is already in use - */ - @PostMapping("/users") - @PreAuthorize("hasRole(\"" + AuthoritiesConstants.ADMIN + "\")") - public ResponseEntity createUser(@Valid @RequestBody UserDTO userDTO) throws URISyntaxException { - log.debug("REST request to save User : {}", userDTO); - - if (userDTO.getId() != null) { - throw new BadRequestAlertException("A new user cannot already have an ID", "userManagement", "idexists"); - // Lowercase the user login before comparing with database - } else if (userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()).isPresent()) { - throw new LoginAlreadyUsedException(); - } else if (userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()).isPresent()) { - throw new EmailAlreadyUsedException(); - } else { - User newUser = userService.createUser(userDTO); - mailService.sendCreationEmail(newUser); - return ResponseEntity.created(new URI("/api/users/" + newUser.getLogin())) - .headers(HeaderUtil.createAlert( "A user is created with identifier " + newUser.getLogin(), newUser.getLogin())) - .body(newUser); - } - } - - /** - * PUT /users : Updates an existing User. - * - * @param userDTO the user to update - * @return the ResponseEntity with status 200 (OK) and with body the updated user - * @throws EmailAlreadyUsedException 400 (Bad Request) if the email is already in use - * @throws LoginAlreadyUsedException 400 (Bad Request) if the login is already in use - */ - @PutMapping("/users") - @PreAuthorize("hasRole(\"" + AuthoritiesConstants.ADMIN + "\")") - public ResponseEntity updateUser(@Valid @RequestBody UserDTO userDTO) { - log.debug("REST request to update User : {}", userDTO); - Optional existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); - if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { - throw new EmailAlreadyUsedException(); - } - existingUser = userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()); - if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { - throw new LoginAlreadyUsedException(); - } - Optional updatedUser = userService.updateUser(userDTO); - - return ResponseUtil.wrapOrNotFound(updatedUser, - HeaderUtil.createAlert("A user is updated with identifier " + userDTO.getLogin(), userDTO.getLogin())); - } - - /** - * GET /users : get all users. - * - * @param pageable the pagination information - * @return the ResponseEntity with status 200 (OK) and with body all users - */ - @GetMapping("/users") - public ResponseEntity> getAllUsers(Pageable pageable) { - final Page page = userService.getAllManagedUsers(pageable); - HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/users"); - return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); - } - - /** - * @return a string list of the all of the roles - */ - @GetMapping("/users/authorities") - @PreAuthorize("hasRole(\"" + AuthoritiesConstants.ADMIN + "\")") - public List getAuthorities() { - return userService.getAuthorities(); - } - - /** - * GET /users/:login : get the "login" user. - * - * @param login the login of the user to find - * @return the ResponseEntity with status 200 (OK) and with body the "login" user, or with status 404 (Not Found) - */ - @GetMapping("/users/{login:" + Constants.LOGIN_REGEX + "}") - public ResponseEntity getUser(@PathVariable String login) { - log.debug("REST request to get User : {}", login); - return ResponseUtil.wrapOrNotFound( - userService.getUserWithAuthoritiesByLogin(login) - .map(UserDTO::new)); - } - - /** - * DELETE /users/:login : delete the "login" User. - * - * @param login the login of the user to delete - * @return the ResponseEntity with status 200 (OK) - */ - @DeleteMapping("/users/{login:" + Constants.LOGIN_REGEX + "}") - @PreAuthorize("hasRole(\"" + AuthoritiesConstants.ADMIN + "\")") - public ResponseEntity deleteUser(@PathVariable String login) { - log.debug("REST request to delete User: {}", login); - userService.deleteUser(login); - return ResponseEntity.ok().headers(HeaderUtil.createAlert( "A user is deleted with identifier " + login, login)).build(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/BadRequestAlertException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/BadRequestAlertException.java deleted file mode 100644 index c4c403351a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/BadRequestAlertException.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import org.zalando.problem.AbstractThrowableProblem; -import org.zalando.problem.Status; - -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -public class BadRequestAlertException extends AbstractThrowableProblem { - - private static final long serialVersionUID = 1L; - - private final String entityName; - - private final String errorKey; - - public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { - this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); - } - - public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { - super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); - this.entityName = entityName; - this.errorKey = errorKey; - } - - public String getEntityName() { - return entityName; - } - - public String getErrorKey() { - return errorKey; - } - - private static Map getAlertParameters(String entityName, String errorKey) { - Map parameters = new HashMap<>(); - parameters.put("message", "error." + errorKey); - parameters.put("params", entityName); - return parameters; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/CustomParameterizedException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/CustomParameterizedException.java deleted file mode 100644 index 8c3df82b83..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/CustomParameterizedException.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import org.zalando.problem.AbstractThrowableProblem; - -import java.util.HashMap; -import java.util.Map; - -import static org.zalando.problem.Status.BAD_REQUEST; - -/** - * Custom, parameterized exception, which can be translated on the client side. - * For example: - * - *

- * throw new CustomParameterizedException("myCustomError", "hello", "world");
- * 
- * - * Can be translated with: - * - *
- * "error.myCustomError" :  "The server says {{param0}} to {{param1}}"
- * 
- */ -public class CustomParameterizedException extends AbstractThrowableProblem { - - private static final long serialVersionUID = 1L; - - private static final String PARAM = "param"; - - public CustomParameterizedException(String message, String... params) { - this(message, toParamMap(params)); - } - - public CustomParameterizedException(String message, Map paramMap) { - super(ErrorConstants.PARAMETERIZED_TYPE, "Parameterized Exception", BAD_REQUEST, null, null, null, toProblemParameters(message, paramMap)); - } - - public static Map toParamMap(String... params) { - Map paramMap = new HashMap<>(); - if (params != null && params.length > 0) { - for (int i = 0; i < params.length; i++) { - paramMap.put(PARAM + i, params[i]); - } - } - return paramMap; - } - - public static Map toProblemParameters(String message, Map paramMap) { - Map parameters = new HashMap<>(); - parameters.put("message", message); - parameters.put("params", paramMap); - return parameters; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailAlreadyUsedException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailAlreadyUsedException.java deleted file mode 100644 index b3dcc0279e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailAlreadyUsedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -public class EmailAlreadyUsedException extends BadRequestAlertException { - - private static final long serialVersionUID = 1L; - - public EmailAlreadyUsedException() { - super(ErrorConstants.EMAIL_ALREADY_USED_TYPE, "Email is already in use!", "userManagement", "emailexists"); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailNotFoundException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailNotFoundException.java deleted file mode 100644 index b93081cacb..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/EmailNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import org.zalando.problem.AbstractThrowableProblem; -import org.zalando.problem.Status; - -public class EmailNotFoundException extends AbstractThrowableProblem { - - private static final long serialVersionUID = 1L; - - public EmailNotFoundException() { - super(ErrorConstants.EMAIL_NOT_FOUND_TYPE, "Email address not registered", Status.BAD_REQUEST); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ErrorConstants.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ErrorConstants.java deleted file mode 100644 index 06be9254a9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ErrorConstants.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import java.net.URI; - -public final class ErrorConstants { - - public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; - public static final String ERR_VALIDATION = "error.validation"; - public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; - public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); - public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); - public static final URI PARAMETERIZED_TYPE = URI.create(PROBLEM_BASE_URL + "/parameterized"); - public static final URI ENTITY_NOT_FOUND_TYPE = URI.create(PROBLEM_BASE_URL + "/entity-not-found"); - public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password"); - public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used"); - public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used"); - public static final URI EMAIL_NOT_FOUND_TYPE = URI.create(PROBLEM_BASE_URL + "/email-not-found"); - - private ErrorConstants() { - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslator.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslator.java deleted file mode 100644 index 3f7cc6b565..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslator.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import com.baeldung.jhipster5.web.rest.util.HeaderUtil; - -import org.springframework.dao.ConcurrencyFailureException; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.context.request.NativeWebRequest; -import org.zalando.problem.DefaultProblem; -import org.zalando.problem.Problem; -import org.zalando.problem.ProblemBuilder; -import org.zalando.problem.Status; -import org.zalando.problem.spring.web.advice.ProblemHandling; -import org.zalando.problem.violations.ConstraintViolationProblem; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.stream.Collectors; - -/** - * Controller advice to translate the server side exceptions to client-friendly json structures. - * The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807) - */ -@ControllerAdvice -public class ExceptionTranslator implements ProblemHandling { - - private static final String FIELD_ERRORS_KEY = "fieldErrors"; - private static final String MESSAGE_KEY = "message"; - private static final String PATH_KEY = "path"; - private static final String VIOLATIONS_KEY = "violations"; - - /** - * Post-process the Problem payload to add the message key for the front-end if needed - */ - @Override - public ResponseEntity process(@Nullable ResponseEntity entity, NativeWebRequest request) { - if (entity == null) { - return entity; - } - Problem problem = entity.getBody(); - if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) { - return entity; - } - ProblemBuilder builder = Problem.builder() - .withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType()) - .withStatus(problem.getStatus()) - .withTitle(problem.getTitle()) - .with(PATH_KEY, request.getNativeRequest(HttpServletRequest.class).getRequestURI()); - - if (problem instanceof ConstraintViolationProblem) { - builder - .with(VIOLATIONS_KEY, ((ConstraintViolationProblem) problem).getViolations()) - .with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION); - } else { - builder - .withCause(((DefaultProblem) problem).getCause()) - .withDetail(problem.getDetail()) - .withInstance(problem.getInstance()); - problem.getParameters().forEach(builder::with); - if (!problem.getParameters().containsKey(MESSAGE_KEY) && problem.getStatus() != null) { - builder.with(MESSAGE_KEY, "error.http." + problem.getStatus().getStatusCode()); - } - } - return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode()); - } - - @Override - public ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) { - BindingResult result = ex.getBindingResult(); - List fieldErrors = result.getFieldErrors().stream() - .map(f -> new FieldErrorVM(f.getObjectName(), f.getField(), f.getCode())) - .collect(Collectors.toList()); - - Problem problem = Problem.builder() - .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE) - .withTitle("Method argument not valid") - .withStatus(defaultConstraintViolationStatus()) - .with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION) - .with(FIELD_ERRORS_KEY, fieldErrors) - .build(); - return create(ex, problem, request); - } - - @ExceptionHandler - public ResponseEntity handleNoSuchElementException(NoSuchElementException ex, NativeWebRequest request) { - Problem problem = Problem.builder() - .withStatus(Status.NOT_FOUND) - .with(MESSAGE_KEY, ErrorConstants.ENTITY_NOT_FOUND_TYPE) - .build(); - return create(ex, problem, request); - } - - @ExceptionHandler - public ResponseEntity handleBadRequestAlertException(BadRequestAlertException ex, NativeWebRequest request) { - return create(ex, request, HeaderUtil.createFailureAlert(ex.getEntityName(), ex.getErrorKey(), ex.getMessage())); - } - - @ExceptionHandler - public ResponseEntity handleConcurrencyFailure(ConcurrencyFailureException ex, NativeWebRequest request) { - Problem problem = Problem.builder() - .withStatus(Status.CONFLICT) - .with(MESSAGE_KEY, ErrorConstants.ERR_CONCURRENCY_FAILURE) - .build(); - return create(ex, problem, request); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/FieldErrorVM.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/FieldErrorVM.java deleted file mode 100644 index 349f548850..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/FieldErrorVM.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import java.io.Serializable; - -public class FieldErrorVM implements Serializable { - - private static final long serialVersionUID = 1L; - - private final String objectName; - - private final String field; - - private final String message; - - public FieldErrorVM(String dto, String field, String message) { - this.objectName = dto; - this.field = field; - this.message = message; - } - - public String getObjectName() { - return objectName; - } - - public String getField() { - return field; - } - - public String getMessage() { - return message; - } - -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InternalServerErrorException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InternalServerErrorException.java deleted file mode 100644 index 13e128237b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InternalServerErrorException.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import org.zalando.problem.AbstractThrowableProblem; -import org.zalando.problem.Status; - -/** - * Simple exception with a message, that returns an Internal Server Error code. - */ -public class InternalServerErrorException extends AbstractThrowableProblem { - - private static final long serialVersionUID = 1L; - - public InternalServerErrorException(String message) { - super(ErrorConstants.DEFAULT_TYPE, message, Status.INTERNAL_SERVER_ERROR); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InvalidPasswordException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InvalidPasswordException.java deleted file mode 100644 index 6bb91247ff..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/InvalidPasswordException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import org.zalando.problem.AbstractThrowableProblem; -import org.zalando.problem.Status; - -public class InvalidPasswordException extends AbstractThrowableProblem { - - private static final long serialVersionUID = 1L; - - public InvalidPasswordException() { - super(ErrorConstants.INVALID_PASSWORD_TYPE, "Incorrect password", Status.BAD_REQUEST); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/LoginAlreadyUsedException.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/LoginAlreadyUsedException.java deleted file mode 100644 index 987a94193d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/LoginAlreadyUsedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -public class LoginAlreadyUsedException extends BadRequestAlertException { - - private static final long serialVersionUID = 1L; - - public LoginAlreadyUsedException() { - super(ErrorConstants.LOGIN_ALREADY_USED_TYPE, "Login name already used!", "userManagement", "userexists"); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/package-info.java deleted file mode 100644 index 7f57af4429..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/errors/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Specific errors used with Zalando's "problem-spring-web" library. - * - * More information on https://github.com/zalando/problem-spring-web - */ -package com.baeldung.jhipster5.web.rest.errors; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/package-info.java deleted file mode 100644 index 75bf6840f6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Spring MVC REST controllers. - */ -package com.baeldung.jhipster5.web.rest; diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/HeaderUtil.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/HeaderUtil.java deleted file mode 100644 index 91fdd68261..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/HeaderUtil.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.jhipster5.web.rest.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpHeaders; - -/** - * Utility class for HTTP headers creation. - */ -public final class HeaderUtil { - - private static final Logger log = LoggerFactory.getLogger(HeaderUtil.class); - - private static final String APPLICATION_NAME = "bookstoreApp"; - - private HeaderUtil() { - } - - public static HttpHeaders createAlert(String message, String param) { - HttpHeaders headers = new HttpHeaders(); - headers.add("X-" + APPLICATION_NAME + "-alert", message); - headers.add("X-" + APPLICATION_NAME + "-params", param); - return headers; - } - - public static HttpHeaders createEntityCreationAlert(String entityName, String param) { - return createAlert("A new " + entityName + " is created with identifier " + param, param); - } - - public static HttpHeaders createEntityUpdateAlert(String entityName, String param) { - return createAlert("A " + entityName + " is updated with identifier " + param, param); - } - - public static HttpHeaders createEntityDeletionAlert(String entityName, String param) { - return createAlert("A " + entityName + " is deleted with identifier " + param, param); - } - - public static HttpHeaders createFailureAlert(String entityName, String errorKey, String defaultMessage) { - log.error("Entity processing failed, {}", defaultMessage); - HttpHeaders headers = new HttpHeaders(); - headers.add("X-" + APPLICATION_NAME + "-error", defaultMessage); - headers.add("X-" + APPLICATION_NAME + "-params", entityName); - return headers; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/PaginationUtil.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/PaginationUtil.java deleted file mode 100644 index 9928dbe171..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/util/PaginationUtil.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.jhipster5.web.rest.util; - -import org.springframework.data.domain.Page; -import org.springframework.http.HttpHeaders; -import org.springframework.web.util.UriComponentsBuilder; - -/** - * Utility class for handling pagination. - * - *

- * Pagination uses the same principles as the GitHub API, - * and follow RFC 5988 (Link header). - */ -public final class PaginationUtil { - - private PaginationUtil() { - } - - public static HttpHeaders generatePaginationHttpHeaders(Page page, String baseUrl) { - - HttpHeaders headers = new HttpHeaders(); - headers.add("X-Total-Count", Long.toString(page.getTotalElements())); - String link = ""; - if ((page.getNumber() + 1) < page.getTotalPages()) { - link = "<" + generateUri(baseUrl, page.getNumber() + 1, page.getSize()) + ">; rel=\"next\","; - } - // prev link - if ((page.getNumber()) > 0) { - link += "<" + generateUri(baseUrl, page.getNumber() - 1, page.getSize()) + ">; rel=\"prev\","; - } - // last and first link - int lastPage = 0; - if (page.getTotalPages() > 0) { - lastPage = page.getTotalPages() - 1; - } - link += "<" + generateUri(baseUrl, lastPage, page.getSize()) + ">; rel=\"last\","; - link += "<" + generateUri(baseUrl, 0, page.getSize()) + ">; rel=\"first\""; - headers.add(HttpHeaders.LINK, link); - return headers; - } - - private static String generateUri(String baseUrl, int page, int size) { - return UriComponentsBuilder.fromUriString(baseUrl).queryParam("page", page).queryParam("size", size).toUriString(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/KeyAndPasswordVM.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/KeyAndPasswordVM.java deleted file mode 100644 index 840fa02cfc..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/KeyAndPasswordVM.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.jhipster5.web.rest.vm; - -/** - * View Model object for storing the user's key and password. - */ -public class KeyAndPasswordVM { - - private String key; - - private String newPassword; - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getNewPassword() { - return newPassword; - } - - public void setNewPassword(String newPassword) { - this.newPassword = newPassword; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoggerVM.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoggerVM.java deleted file mode 100644 index 952e7df298..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoggerVM.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.jhipster5.web.rest.vm; - -import ch.qos.logback.classic.Logger; - -/** - * View Model object for storing a Logback logger. - */ -public class LoggerVM { - - private String name; - - private String level; - - public LoggerVM(Logger logger) { - this.name = logger.getName(); - this.level = logger.getEffectiveLevel().toString(); - } - - public LoggerVM() { - // Empty public constructor used by Jackson. - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getLevel() { - return level; - } - - public void setLevel(String level) { - this.level = level; - } - - @Override - public String toString() { - return "LoggerVM{" + - "name='" + name + '\'' + - ", level='" + level + '\'' + - '}'; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoginVM.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoginVM.java deleted file mode 100644 index 8fc119ab69..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/LoginVM.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.jhipster5.web.rest.vm; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * View Model object for storing a user's credentials. - */ -public class LoginVM { - - @NotNull - @Size(min = 1, max = 50) - private String username; - - @NotNull - @Size(min = ManagedUserVM.PASSWORD_MIN_LENGTH, max = ManagedUserVM.PASSWORD_MAX_LENGTH) - private String password; - - private Boolean rememberMe; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public Boolean isRememberMe() { - return rememberMe; - } - - public void setRememberMe(Boolean rememberMe) { - this.rememberMe = rememberMe; - } - - @Override - public String toString() { - return "LoginVM{" + - "username='" + username + '\'' + - ", rememberMe=" + rememberMe + - '}'; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/ManagedUserVM.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/ManagedUserVM.java deleted file mode 100644 index 314577c456..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/ManagedUserVM.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.jhipster5.web.rest.vm; - -import com.baeldung.jhipster5.service.dto.UserDTO; -import javax.validation.constraints.Size; - -/** - * View Model extending the UserDTO, which is meant to be used in the user management UI. - */ -public class ManagedUserVM extends UserDTO { - - public static final int PASSWORD_MIN_LENGTH = 4; - - public static final int PASSWORD_MAX_LENGTH = 100; - - @Size(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH) - private String password; - - public ManagedUserVM() { - // Empty constructor needed for Jackson. - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - @Override - public String toString() { - return "ManagedUserVM{" + - "} " + super.toString(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/package-info.java b/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/package-info.java deleted file mode 100644 index ff58799037..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/java/com/baeldung/jhipster5/web/rest/vm/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * View Models used by Spring MVC REST controllers. - */ -package com.baeldung.jhipster5.web.rest.vm; diff --git a/jhipster-5/bookstore-monolith/src/main/jib/entrypoint.sh b/jhipster-5/bookstore-monolith/src/main/jib/entrypoint.sh deleted file mode 100644 index b3c4541011..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/jib/entrypoint.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP} -exec java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "com.baeldung.jhipster5.BookstoreApp" "$@" diff --git a/jhipster-5/bookstore-monolith/src/main/resources/.h2.server.properties b/jhipster-5/bookstore-monolith/src/main/resources/.h2.server.properties deleted file mode 100644 index 99767b3a8a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/.h2.server.properties +++ /dev/null @@ -1,5 +0,0 @@ -#H2 Server Properties -0=JHipster H2 (Memory)|org.h2.Driver|jdbc\:h2\:mem\:bookstore|Bookstore -webAllowOthers=true -webPort=8082 -webSSL=false diff --git a/jhipster-5/bookstore-monolith/src/main/resources/banner.txt b/jhipster-5/bookstore-monolith/src/main/resources/banner.txt deleted file mode 100644 index e0bc55aaff..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/banner.txt +++ /dev/null @@ -1,10 +0,0 @@ - - ${AnsiColor.GREEN} ██╗${AnsiColor.RED} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗ - ${AnsiColor.GREEN} ██║${AnsiColor.RED} ██║ ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗ - ${AnsiColor.GREEN} ██║${AnsiColor.RED} ████████║ ██║ ███████╔╝ ╚█████╗ ██║ ██████╗ ███████╔╝ - ${AnsiColor.GREEN}██╗ ██║${AnsiColor.RED} ██╔═══██║ ██║ ██╔════╝ ╚═══██╗ ██║ ██╔═══╝ ██╔══██║ - ${AnsiColor.GREEN}╚██████╔╝${AnsiColor.RED} ██║ ██║ ████████╗ ██║ ██████╔╝ ██║ ████████╗ ██║ ╚██╗ - ${AnsiColor.GREEN} ╚═════╝ ${AnsiColor.RED} ╚═╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═╝ - -${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} :: -:: https://www.jhipster.tech ::${AnsiColor.DEFAULT} diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application-dev.yml b/jhipster-5/bookstore-monolith/src/main/resources/config/application-dev.yml deleted file mode 100644 index 64742feb45..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/application-dev.yml +++ /dev/null @@ -1,122 +0,0 @@ -# =================================================================== -# Spring Boot configuration for the "dev" profile. -# -# This configuration overrides the application.yml file. -# -# More information on profiles: https://www.jhipster.tech/profiles/ -# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# =================================================================== -# Standard Spring Boot properties. -# Full reference is available at: -# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html -# =================================================================== - -logging: - level: - ROOT: DEBUG - io.github.jhipster: DEBUG - com.baeldung.jhipster5: DEBUG - -spring: - profiles: - active: dev - include: - - swagger - # Uncomment to activate TLS for the dev profile - #- tls - devtools: - restart: - enabled: true - additional-exclude: .h2.server.properties - livereload: - enabled: false # we use Webpack dev server + BrowserSync for livereload - jackson: - serialization: - indent-output: true - datasource: - type: com.zaxxer.hikari.HikariDataSource - url: jdbc:h2:mem:bookstore;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE - username: Bookstore - password: - hikari: - poolName: Hikari - auto-commit: false - h2: - console: - enabled: false - jpa: - database-platform: io.github.jhipster.domain.util.FixedH2Dialect - database: H2 - show-sql: true - properties: - hibernate.id.new_generator_mappings: true - hibernate.connection.provider_disables_autocommit: true - hibernate.cache.use_second_level_cache: false - hibernate.cache.use_query_cache: false - hibernate.generate_statistics: true - liquibase: - contexts: dev - mail: - host: localhost - port: 25 - username: - password: - messages: - cache-duration: PT1S # 1 second, see the ISO 8601 standard - thymeleaf: - cache: false - -server: - port: 8080 - -# =================================================================== -# JHipster specific properties -# -# Full reference is available at: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -jhipster: - http: - version: V_1_1 # To use HTTP/2 you will need to activate TLS (see application-tls.yml) - # CORS is only enabled by default with the "dev" profile, so BrowserSync can access the API - cors: - allowed-origins: "*" - allowed-methods: "*" - allowed-headers: "*" - exposed-headers: "Authorization,Link,X-Total-Count" - allow-credentials: true - max-age: 1800 - security: - authentication: - jwt: - # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) - base64-secret: NDJmOTVlZjI2NzhlZDRjNmVkNTM1NDE2NjkyNDljZDJiNzBlMjI5YmZjMjY3MzdjZmZlMjI3NjE4OTRkNzc5MWYzNDNlYWMzYmJjOWRmMjc5ZWQyZTZmOWZkOTMxZWZhNWE1MTVmM2U2NjFmYjhlNDc2Y2Q3NzliMGY0YzFkNmI= - # Token is valid 24 hours - token-validity-in-seconds: 86400 - token-validity-in-seconds-for-remember-me: 2592000 - mail: # specific JHipster mail property, for standard properties see MailProperties - from: Bookstore@localhost - base-url: http://127.0.0.1:8080 - metrics: - logs: # Reports metrics in the logs - enabled: false - report-frequency: 60 # in seconds - logging: - logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration - enabled: false - host: localhost - port: 5000 - queue-size: 512 - -# =================================================================== -# Application specific properties -# Add your own application properties here, see the ApplicationProperties class -# to have type-safe configuration, like in the JHipsterProperties above -# -# More documentation is available at: -# https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# application: diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application-prod.yml b/jhipster-5/bookstore-monolith/src/main/resources/config/application-prod.yml deleted file mode 100644 index d698099fac..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/application-prod.yml +++ /dev/null @@ -1,133 +0,0 @@ -# =================================================================== -# Spring Boot configuration for the "prod" profile. -# -# This configuration overrides the application.yml file. -# -# More information on profiles: https://www.jhipster.tech/profiles/ -# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# =================================================================== -# Standard Spring Boot properties. -# Full reference is available at: -# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html -# =================================================================== - -logging: - level: - ROOT: INFO - com.baeldung.jhipster5: INFO - io.github.jhipster: INFO - -spring: - devtools: - restart: - enabled: false - livereload: - enabled: false - datasource: - type: com.zaxxer.hikari.HikariDataSource - url: jdbc:mysql://localhost:3306/Bookstore?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC - username: root - password: - hikari: - poolName: Hikari - auto-commit: false - data-source-properties: - cachePrepStmts: true - prepStmtCacheSize: 250 - prepStmtCacheSqlLimit: 2048 - useServerPrepStmts: true - jpa: - database-platform: org.hibernate.dialect.MySQL5InnoDBDialect - database: MYSQL - show-sql: false - properties: - hibernate.id.new_generator_mappings: true - hibernate.connection.provider_disables_autocommit: true - hibernate.cache.use_second_level_cache: false - hibernate.cache.use_query_cache: false - hibernate.generate_statistics: true - liquibase: - contexts: prod - mail: - host: localhost - port: 25 - username: - password: - thymeleaf: - cache: true - -# =================================================================== -# To enable TLS in production, generate a certificate using: -# keytool -genkey -alias bookstore -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 -# -# You can also use Let's Encrypt: -# https://maximilian-boehm.com/hp2121/Create-a-Java-Keystore-JKS-from-Let-s-Encrypt-Certificates.htm -# -# Then, modify the server.ssl properties so your "server" configuration looks like: -# -# server: -# port: 443 -# ssl: -# key-store: classpath:config/tls/keystore.p12 -# key-store-password: password -# key-store-type: PKCS12 -# key-alias: bookstore -# # The ciphers suite enforce the security by deactivating some old and deprecated SSL cipher, this list was tested against SSL Labs (https://www.ssllabs.com/ssltest/) -# ciphers: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA -# =================================================================== -server: - port: 8080 - compression: - enabled: true - mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json - min-response-size: 1024 - -# =================================================================== -# JHipster specific properties -# -# Full reference is available at: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -jhipster: - http: - version: V_1_1 # To use HTTP/2 you will need SSL support (see above the "server.ssl" configuration) - cache: # Used by the CachingHttpHeadersFilter - timeToLiveInDays: 1461 - security: - authentication: - jwt: - # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) - # As this is the PRODUCTION configuration, you MUST change the default key, and store it securely: - # - In the JHipster Registry (which includes a Spring Cloud Config server) - # - In a separate `application-prod.yml` file, in the same folder as your executable WAR file - # - In the `JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET` environment variable - base64-secret: NDJmOTVlZjI2NzhlZDRjNmVkNTM1NDE2NjkyNDljZDJiNzBlMjI5YmZjMjY3MzdjZmZlMjI3NjE4OTRkNzc5MWYzNDNlYWMzYmJjOWRmMjc5ZWQyZTZmOWZkOTMxZWZhNWE1MTVmM2U2NjFmYjhlNDc2Y2Q3NzliMGY0YzFkNmI= - # Token is valid 24 hours - token-validity-in-seconds: 86400 - token-validity-in-seconds-for-remember-me: 2592000 - mail: # specific JHipster mail property, for standard properties see MailProperties - from: Bookstore@localhost - base-url: http://my-server-url-to-change # Modify according to your server's URL - metrics: - logs: # Reports metrics in the logs - enabled: false - report-frequency: 60 # in seconds - logging: - logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration - enabled: false - host: localhost - port: 5000 - queue-size: 512 - -# =================================================================== -# Application specific properties -# Add your own application properties here, see the ApplicationProperties class -# to have type-safe configuration, like in the JHipsterProperties above -# -# More documentation is available at: -# https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# application: diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application-tls.yml b/jhipster-5/bookstore-monolith/src/main/resources/config/application-tls.yml deleted file mode 100644 index c4e0565cc7..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/application-tls.yml +++ /dev/null @@ -1,20 +0,0 @@ -# =================================================================== -# Activate this profile to enable TLS and HTTP/2. -# -# JHipster has generated a self-signed certificate, which will be used to encrypt traffic. -# As your browser will not understand this certificate, you will need to import it. -# -# Another (easiest) solution with Chrome is to enable the "allow-insecure-localhost" flag -# at chrome://flags/#allow-insecure-localhost -# =================================================================== -server: - ssl: - key-store: classpath:config/tls/keystore.p12 - key-store-password: password - key-store-type: PKCS12 - key-alias: selfsigned - ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - enabled-protocols: TLSv1.2 -jhipster: - http: - version: V_2_0 diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/application.yml b/jhipster-5/bookstore-monolith/src/main/resources/config/application.yml deleted file mode 100644 index 5b28b7f00d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/application.yml +++ /dev/null @@ -1,140 +0,0 @@ -# =================================================================== -# Spring Boot configuration. -# -# This configuration will be overridden by the Spring profile you use, -# for example application-dev.yml if you use the "dev" profile. -# -# More information on profiles: https://www.jhipster.tech/profiles/ -# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# =================================================================== -# Standard Spring Boot properties. -# Full reference is available at: -# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html -# =================================================================== - -management: - endpoints: - web: - base-path: /management - exposure: - include: ["configprops", "env", "health", "info", "threaddump", "logfile", "jhi-metrics", "prometheus" ] - endpoint: - health: - show-details: when-authorized - jhi-metrics: - enabled: true - info: - git: - mode: full - health: - mail: - enabled: false # When using the MailService, configure an SMTP server and set this to true - metrics: - export: - # Prometheus is the default metrics backend - prometheus: - enabled: true - step: 60 - binders: - jvm: - enabled: true - processor: - enabled: true - uptime: - enabled: true - logback: - enabled: true - files: - enabled: true - integration: - enabled: true - distribution: - percentiles-histogram: - all: true - percentiles: - all: 0, 0.5, 0.75, 0.95, 0.99, 1.0 - web: - server: - auto-time-requests: true - -spring: - application: - name: Bookstore - profiles: - # The commented value for `active` can be replaced with valid Spring profiles to load. - # Otherwise, it will be filled in by maven when building the WAR file - # Either way, it can be overridden by `--spring.profiles.active` value passed in the commandline or `-Dspring.profiles.active` set in `JAVA_OPTS` - active: #spring.profiles.active# - jpa: - open-in-view: false - properties: - hibernate.jdbc.time_zone: UTC - hibernate: - ddl-auto: none - naming: - physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy - implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy - messages: - basename: i18n/messages - mvc: - favicon: - enabled: false - thymeleaf: - mode: HTML - -server: - servlet: - session: - cookie: - http-only: true - -# Properties to be exposed on the /info management endpoint -info: - # Comma separated list of profiles that will trigger the ribbon to show - display-ribbon-on-profiles: "dev" - -# =================================================================== -# JHipster specific properties -# -# Full reference is available at: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -jhipster: - async: - core-pool-size: 2 - max-pool-size: 50 - queue-capacity: 10000 - # By default CORS is disabled. Uncomment to enable. - #cors: - #allowed-origins: "*" - #allowed-methods: "*" - #allowed-headers: "*" - #exposed-headers: "Authorization,Link,X-Total-Count" - #allow-credentials: true - #max-age: 1800 - mail: - from: Bookstore@localhost - swagger: - default-include-pattern: /api/.* - title: Bookstore API - description: Bookstore API documentation - version: 0.0.1 - terms-of-service-url: - contact-name: - contact-url: - contact-email: - license: - license-url: - -# =================================================================== -# Application specific properties -# Add your own application properties here, see the ApplicationProperties class -# to have type-safe configuration, like in the JHipsterProperties above -# -# More documentation is available at: -# https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# application: diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv b/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv deleted file mode 100644 index af5c6dfa18..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/authorities.csv +++ /dev/null @@ -1,3 +0,0 @@ -name -ROLE_ADMIN -ROLE_USER diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml b/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml deleted file mode 100644 index dd4b01d487..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml b/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml deleted file mode 100644 index f040387cf1..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/changelog/20190319124041_added_entity_Book.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/master.xml b/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/master.xml deleted file mode 100644 index e045ee0100..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/master.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users.csv b/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users.csv deleted file mode 100644 index b25922b699..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users.csv +++ /dev/null @@ -1,5 +0,0 @@ -id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by -1;system;$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG;System;System;system@localhost;;true;en;system;system -2;anonymoususer;$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO;Anonymous;User;anonymous@localhost;;true;en;system;system -3;admin;$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC;Administrator;Administrator;admin@localhost;;true;en;system;system -4;user;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;User;User;user@localhost;;true;en;system;system diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv b/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv deleted file mode 100644 index 06c5feeeea..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/config/liquibase/users_authorities.csv +++ /dev/null @@ -1,6 +0,0 @@ -user_id;authority_name -1;ROLE_ADMIN -1;ROLE_USER -3;ROLE_ADMIN -3;ROLE_USER -4;ROLE_USER diff --git a/jhipster-5/bookstore-monolith/src/main/resources/config/tls/keystore.p12 b/jhipster-5/bookstore-monolith/src/main/resources/config/tls/keystore.p12 deleted file mode 100644 index 364fad7435e01dddac14970a653b7a82c9e83089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 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 C+svr| diff --git a/jhipster-5/bookstore-monolith/src/main/resources/i18n/messages.properties b/jhipster-5/bookstore-monolith/src/main/resources/i18n/messages.properties deleted file mode 100644 index 52a60093c5..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/i18n/messages.properties +++ /dev/null @@ -1,21 +0,0 @@ -# Error page -error.title=Your request cannot be processed -error.subtitle=Sorry, an error has occurred. -error.status=Status: -error.message=Message: - -# Activation email -email.activation.title=Bookstore account activation -email.activation.greeting=Dear {0} -email.activation.text1=Your Bookstore account has been created, please click on the URL below to activate it: -email.activation.text2=Regards, -email.signature=Bookstore Team. - -# Creation email -email.creation.text1=Your Bookstore account has been created, please click on the URL below to access it: - -# Reset email -email.reset.title=Bookstore password reset -email.reset.greeting=Dear {0} -email.reset.text1=For your Bookstore account a password reset was requested, please click on the URL below to reset it: -email.reset.text2=Regards, diff --git a/jhipster-5/bookstore-monolith/src/main/resources/logback-spring.xml b/jhipster-5/bookstore-monolith/src/main/resources/logback-spring.xml deleted file mode 100644 index 4aa548af35..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/error.html b/jhipster-5/bookstore-monolith/src/main/resources/templates/error.html deleted file mode 100644 index 08616bcf1e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/templates/error.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Your request cannot be processed - - - -

-

Your request cannot be processed :(

- -

Sorry, an error has occurred.

- - Status:  ()
- - Message: 
-
- - - -
- - diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html b/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html deleted file mode 100644 index cb021d8e6a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/activationEmail.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - JHipster activation - - - - -

- Dear -

-

- Your JHipster account has been created, please click on the URL below to activate it: -

-

- Activation link -

-

- Regards, -
- JHipster. -

- - diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html b/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html deleted file mode 100644 index dc0cff5883..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/creationEmail.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - JHipster creation - - - - -

- Dear -

-

- Your JHipster account has been created, please click on the URL below to access it: -

-

- Login link -

-

- Regards, -
- JHipster. -

- - diff --git a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html b/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html deleted file mode 100644 index f44511265b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/resources/templates/mail/passwordResetEmail.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - JHipster password reset - - - - -

- Dear -

-

- For your JHipster account a password reset was requested, please click on the URL below to reset it: -

-

- Login link -

-

- Regards, -
- JHipster. -

- - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/404.html b/jhipster-5/bookstore-monolith/src/main/webapp/404.html deleted file mode 100644 index 3fdc0bee1a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/404.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Page Not Found - - - - - -

Page Not Found

-

Sorry, but the page you were trying to view does not exist.

- - - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.module.ts deleted file mode 100644 index a167cab1c2..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { BookstoreSharedModule } from 'app/shared'; - -import { - PasswordStrengthBarComponent, - RegisterComponent, - ActivateComponent, - PasswordComponent, - PasswordResetInitComponent, - PasswordResetFinishComponent, - SettingsComponent, - accountState -} from './'; - -@NgModule({ - imports: [BookstoreSharedModule, RouterModule.forChild(accountState)], - declarations: [ - ActivateComponent, - RegisterComponent, - PasswordComponent, - PasswordStrengthBarComponent, - PasswordResetInitComponent, - PasswordResetFinishComponent, - SettingsComponent - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class BookstoreAccountModule {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts deleted file mode 100644 index cba5d40716..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/account.route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Routes } from '@angular/router'; - -import { settingsRoute } from './'; - -const ACCOUNT_ROUTES = [settingsRoute]; - -export const accountState: Routes = [ - { - path: '', - children: ACCOUNT_ROUTES - } -]; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html deleted file mode 100644 index c7078ede86..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
-
-

Activation

- -
- Your user account has been activated. Please - sign in. -
- -
- Your user could not be activated. Please use the registration form to sign up. -
- -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts deleted file mode 100644 index 5c398073c3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { ActivatedRoute } from '@angular/router'; - -import { LoginModalService } from 'app/core'; -import { ActivateService } from './activate.service'; - -@Component({ - selector: 'jhi-activate', - templateUrl: './activate.component.html' -}) -export class ActivateComponent implements OnInit { - error: string; - success: string; - modalRef: NgbModalRef; - - constructor(private activateService: ActivateService, private loginModalService: LoginModalService, private route: ActivatedRoute) {} - - ngOnInit() { - this.route.queryParams.subscribe(params => { - this.activateService.get(params['key']).subscribe( - () => { - this.error = null; - this.success = 'OK'; - }, - () => { - this.success = null; - this.error = 'ERROR'; - } - ); - }); - } - - login() { - this.modalRef = this.loginModalService.open(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts deleted file mode 100644 index b415b17a18..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Route } from '@angular/router'; - -import { ActivateComponent } from './activate.component'; - -export const activateRoute: Route = { - path: 'activate', - component: ActivateComponent, - data: { - authorities: [], - pageTitle: 'Activation' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts deleted file mode 100644 index adade9efad..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/activate/activate.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class ActivateService { - constructor(private http: HttpClient) {} - - get(key: string): Observable { - return this.http.get(SERVER_API_URL + 'api/activate', { - params: new HttpParams().set('key', key) - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/index.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/index.ts deleted file mode 100644 index aeada0551c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -export * from './activate/activate.component'; -export * from './activate/activate.service'; -export * from './activate/activate.route'; -export * from './password/password.component'; -export * from './password/password-strength-bar.component'; -export * from './password/password.service'; -export * from './password/password.route'; -export * from './password-reset/finish/password-reset-finish.component'; -export * from './password-reset/finish/password-reset-finish.service'; -export * from './password-reset/finish/password-reset-finish.route'; -export * from './password-reset/init/password-reset-init.component'; -export * from './password-reset/init/password-reset-init.service'; -export * from './password-reset/init/password-reset-init.route'; -export * from './register/register.component'; -export * from './register/register.service'; -export * from './register/register.route'; -export * from './settings/settings.component'; -export * from './settings/settings.route'; -export * from './account.route'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html deleted file mode 100644 index 6d6baea694..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html +++ /dev/null @@ -1,77 +0,0 @@ -
-
-
-

Reset password

- -
- The password reset key is missing. -
- -
-

Choose a new password

-
- -
-

Your password couldn't be reset. Remember a password request is only valid for 24 hours.

-
- -

- Your password has been reset. Please - sign in. -

- -
- The password and its confirmation do not match! -
- -
-
-
- - -
- - Your password is required. - - - Your password is required to be at least 4 characters. - - - Your password cannot be longer than 50 characters. - -
- -
- -
- - -
- - Your password confirmation is required. - - - Your password confirmation is required to be at least 4 characters. - - - Your password confirmation cannot be longer than 50 characters. - -
-
- -
-
- -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts deleted file mode 100644 index 72aac25c96..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, OnInit, AfterViewInit, Renderer, ElementRef } from '@angular/core'; -import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { ActivatedRoute } from '@angular/router'; - -import { LoginModalService } from 'app/core'; -import { PasswordResetFinishService } from './password-reset-finish.service'; - -@Component({ - selector: 'jhi-password-reset-finish', - templateUrl: './password-reset-finish.component.html' -}) -export class PasswordResetFinishComponent implements OnInit, AfterViewInit { - confirmPassword: string; - doNotMatch: string; - error: string; - keyMissing: boolean; - resetAccount: any; - success: string; - modalRef: NgbModalRef; - key: string; - - constructor( - private passwordResetFinishService: PasswordResetFinishService, - private loginModalService: LoginModalService, - private route: ActivatedRoute, - private elementRef: ElementRef, - private renderer: Renderer - ) {} - - ngOnInit() { - this.route.queryParams.subscribe(params => { - this.key = params['key']; - }); - this.resetAccount = {}; - this.keyMissing = !this.key; - } - - ngAfterViewInit() { - if (this.elementRef.nativeElement.querySelector('#password') != null) { - this.renderer.invokeElementMethod(this.elementRef.nativeElement.querySelector('#password'), 'focus', []); - } - } - - finishReset() { - this.doNotMatch = null; - this.error = null; - if (this.resetAccount.password !== this.confirmPassword) { - this.doNotMatch = 'ERROR'; - } else { - this.passwordResetFinishService.save({ key: this.key, newPassword: this.resetAccount.password }).subscribe( - () => { - this.success = 'OK'; - }, - () => { - this.success = null; - this.error = 'ERROR'; - } - ); - } - } - - login() { - this.modalRef = this.loginModalService.open(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts deleted file mode 100644 index a09cba9377..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Route } from '@angular/router'; - -import { PasswordResetFinishComponent } from './password-reset-finish.component'; - -export const passwordResetFinishRoute: Route = { - path: 'reset/finish', - component: PasswordResetFinishComponent, - data: { - authorities: [], - pageTitle: 'Password' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts deleted file mode 100644 index 706bdaa5b1..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class PasswordResetFinishService { - constructor(private http: HttpClient) {} - - save(keyAndPassword: any): Observable { - return this.http.post(SERVER_API_URL + 'api/account/reset-password/finish', keyAndPassword); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html deleted file mode 100644 index 7fe7b0bdec..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
-
-
-

Reset your password

- -
- Email address isn't registered! Please check and try again. -
- -
-

Enter the email address you used to register.

-
- -
-

Check your emails for details on how to reset your password.

-
- -
-
- - -
- - Your email is required. - - - Your email is invalid. - - - Your email is required to be at least 5 characters. - - - Your email cannot be longer than 100 characters. - -
-
- -
-
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts deleted file mode 100644 index e32617341c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component, OnInit, AfterViewInit, Renderer, ElementRef } from '@angular/core'; -import { EMAIL_NOT_FOUND_TYPE } from 'app/shared'; -import { PasswordResetInitService } from './password-reset-init.service'; - -@Component({ - selector: 'jhi-password-reset-init', - templateUrl: './password-reset-init.component.html' -}) -export class PasswordResetInitComponent implements OnInit, AfterViewInit { - error: string; - errorEmailNotExists: string; - resetAccount: any; - success: string; - - constructor(private passwordResetInitService: PasswordResetInitService, private elementRef: ElementRef, private renderer: Renderer) {} - - ngOnInit() { - this.resetAccount = {}; - } - - ngAfterViewInit() { - this.renderer.invokeElementMethod(this.elementRef.nativeElement.querySelector('#email'), 'focus', []); - } - - requestReset() { - this.error = null; - this.errorEmailNotExists = null; - - this.passwordResetInitService.save(this.resetAccount.email).subscribe( - () => { - this.success = 'OK'; - }, - response => { - this.success = null; - if (response.status === 400 && response.error.type === EMAIL_NOT_FOUND_TYPE) { - this.errorEmailNotExists = 'ERROR'; - } else { - this.error = 'ERROR'; - } - } - ); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts deleted file mode 100644 index a1708c98b3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Route } from '@angular/router'; - -import { PasswordResetInitComponent } from './password-reset-init.component'; - -export const passwordResetInitRoute: Route = { - path: 'reset/request', - component: PasswordResetInitComponent, - data: { - authorities: [], - pageTitle: 'Password' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts deleted file mode 100644 index c24ccf94d2..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class PasswordResetInitService { - constructor(private http: HttpClient) {} - - save(mail: string): Observable { - return this.http.post(SERVER_API_URL + 'api/account/reset-password/init', mail); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts deleted file mode 100644 index 4159fde882..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.component.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Component, ElementRef, Input, Renderer } from '@angular/core'; - -@Component({ - selector: 'jhi-password-strength-bar', - template: ` -
- Password strength: -
    -
  • -
  • -
  • -
  • -
  • -
-
- `, - styleUrls: ['password-strength-bar.scss'] -}) -export class PasswordStrengthBarComponent { - colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0']; - - constructor(private renderer: Renderer, private elementRef: ElementRef) {} - - measureStrength(p: string): number { - let force = 0; - const regex = /[$-/:-?{-~!"^_`\[\]]/g; // " - const lowerLetters = /[a-z]+/.test(p); - const upperLetters = /[A-Z]+/.test(p); - const numbers = /[0-9]+/.test(p); - const symbols = regex.test(p); - - const flags = [lowerLetters, upperLetters, numbers, symbols]; - const passedMatches = flags.filter((isMatchedFlag: boolean) => { - return isMatchedFlag === true; - }).length; - - force += 2 * p.length + (p.length >= 10 ? 1 : 0); - force += passedMatches * 10; - - // penalty (short password) - force = p.length <= 6 ? Math.min(force, 10) : force; - - // penalty (poor variety of characters) - force = passedMatches === 1 ? Math.min(force, 10) : force; - force = passedMatches === 2 ? Math.min(force, 20) : force; - force = passedMatches === 3 ? Math.min(force, 40) : force; - - return force; - } - - getColor(s: number): any { - let idx = 0; - if (s <= 10) { - idx = 0; - } else if (s <= 20) { - idx = 1; - } else if (s <= 30) { - idx = 2; - } else if (s <= 40) { - idx = 3; - } else { - idx = 4; - } - return { idx: idx + 1, col: this.colors[idx] }; - } - - @Input() - set passwordToCheck(password: string) { - if (password) { - const c = this.getColor(this.measureStrength(password)); - const element = this.elementRef.nativeElement; - if (element.className) { - this.renderer.setElementClass(element, element.className, false); - } - const lis = element.getElementsByTagName('li'); - for (let i = 0; i < lis.length; i++) { - if (i < c.idx) { - this.renderer.setElementStyle(lis[i], 'backgroundColor', c.col); - } else { - this.renderer.setElementStyle(lis[i], 'backgroundColor', '#DDD'); - } - } - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss deleted file mode 100644 index 9744b9b784..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password-strength-bar.scss +++ /dev/null @@ -1,23 +0,0 @@ -/* ========================================================================== -start Password strength bar style -========================================================================== */ -ul#strength { - display: inline; - list-style: none; - margin: 0; - margin-left: 15px; - padding: 0; - vertical-align: 2px; -} - -.point { - background: #ddd; - border-radius: 2px; - display: inline-block; - height: 5px; - margin-right: 1px; - width: 20px; - &:last-child { - margin: 0 !important; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.html deleted file mode 100644 index 79fb60c3bc..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.html +++ /dev/null @@ -1,77 +0,0 @@ -
-
-
-

Password for [{{account.login}}]

- -
- Password changed! -
-
- An error has occurred! The password could not be changed. -
- -
- The password and its confirmation do not match! -
- -
- -
- - -
- - Your password is required. - -
-
-
- - -
- - Your password is required. - - - Your password is required to be at least 4 characters. - - - Your password cannot be longer than 50 characters. - -
- -
-
- - -
- - Your confirmation password is required. - - - Your confirmation password is required to be at least 4 characters. - - - Your confirmation password cannot be longer than 50 characters. - -
-
- - -
-
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts deleted file mode 100644 index 3004effa57..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { AccountService } from 'app/core'; -import { PasswordService } from './password.service'; - -@Component({ - selector: 'jhi-password', - templateUrl: './password.component.html' -}) -export class PasswordComponent implements OnInit { - doNotMatch: string; - error: string; - success: string; - account: any; - currentPassword: string; - newPassword: string; - confirmPassword: string; - - constructor(private passwordService: PasswordService, private accountService: AccountService) {} - - ngOnInit() { - this.accountService.identity().then(account => { - this.account = account; - }); - } - - changePassword() { - if (this.newPassword !== this.confirmPassword) { - this.error = null; - this.success = null; - this.doNotMatch = 'ERROR'; - } else { - this.doNotMatch = null; - this.passwordService.save(this.newPassword, this.currentPassword).subscribe( - () => { - this.error = null; - this.success = 'OK'; - }, - () => { - this.success = null; - this.error = 'ERROR'; - } - ); - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts deleted file mode 100644 index 4bb115fd44..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Route } from '@angular/router'; - -import { UserRouteAccessService } from 'app/core'; -import { PasswordComponent } from './password.component'; - -export const passwordRoute: Route = { - path: 'password', - component: PasswordComponent, - data: { - authorities: ['ROLE_USER'], - pageTitle: 'Password' - }, - canActivate: [UserRouteAccessService] -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts deleted file mode 100644 index 028df7b0e4..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/password/password.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class PasswordService { - constructor(private http: HttpClient) {} - - save(newPassword: string, currentPassword: string): Observable { - return this.http.post(SERVER_API_URL + 'api/account/change-password', { currentPassword, newPassword }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.html deleted file mode 100644 index 596f782828..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.html +++ /dev/null @@ -1,124 +0,0 @@ -
-
-
-

Registration

- -
- Registration saved! Please check your email for confirmation. -
- -
- Registration failed! Please try again later. -
- -
- Login name already registered! Please choose another one. -
- -
- Email is already in use! Please choose another one. -
- -
- The password and its confirmation do not match! -
-
-
-
-
-
-
- - -
- - Your username is required. - - - Your username is required to be at least 1 character. - - - Your username cannot be longer than 50 characters. - - - Your username can only contain letters and digits. - -
-
-
- - -
- - Your email is required. - - - Your email is invalid. - - - Your email is required to be at least 5 characters. - - - Your email cannot be longer than 100 characters. - -
-
-
- - -
- - Your password is required. - - - Your password is required to be at least 4 characters. - - - Your password cannot be longer than 50 characters. - -
- -
-
- - -
- - Your confirmation password is required. - - - Your confirmation password is required to be at least 4 characters. - - - Your confirmation password cannot be longer than 50 characters. - -
-
- - -
-

-
- If you want to - sign in, you can try the default accounts:
- Administrator (login="admin" and password="admin")
- User (login="user" and password="user").
-
-
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts deleted file mode 100644 index 85244d2970..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.component.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Component, OnInit, AfterViewInit, Renderer, ElementRef } from '@angular/core'; -import { HttpErrorResponse } from '@angular/common/http'; -import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; - -import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared'; -import { LoginModalService } from 'app/core'; -import { Register } from './register.service'; - -@Component({ - selector: 'jhi-register', - templateUrl: './register.component.html' -}) -export class RegisterComponent implements OnInit, AfterViewInit { - confirmPassword: string; - doNotMatch: string; - error: string; - errorEmailExists: string; - errorUserExists: string; - registerAccount: any; - success: boolean; - modalRef: NgbModalRef; - - constructor( - private loginModalService: LoginModalService, - private registerService: Register, - private elementRef: ElementRef, - private renderer: Renderer - ) {} - - ngOnInit() { - this.success = false; - this.registerAccount = {}; - } - - ngAfterViewInit() { - this.renderer.invokeElementMethod(this.elementRef.nativeElement.querySelector('#login'), 'focus', []); - } - - register() { - if (this.registerAccount.password !== this.confirmPassword) { - this.doNotMatch = 'ERROR'; - } else { - this.doNotMatch = null; - this.error = null; - this.errorUserExists = null; - this.errorEmailExists = null; - this.registerAccount.langKey = 'en'; - this.registerService.save(this.registerAccount).subscribe( - () => { - this.success = true; - }, - response => this.processError(response) - ); - } - } - - openLogin() { - this.modalRef = this.loginModalService.open(); - } - - private processError(response: HttpErrorResponse) { - this.success = null; - if (response.status === 400 && response.error.type === LOGIN_ALREADY_USED_TYPE) { - this.errorUserExists = 'ERROR'; - } else if (response.status === 400 && response.error.type === EMAIL_ALREADY_USED_TYPE) { - this.errorEmailExists = 'ERROR'; - } else { - this.error = 'ERROR'; - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts deleted file mode 100644 index 626cd32ff9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Route } from '@angular/router'; - -import { RegisterComponent } from './register.component'; - -export const registerRoute: Route = { - path: 'register', - component: RegisterComponent, - data: { - authorities: [], - pageTitle: 'Registration' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts deleted file mode 100644 index dfe6f1da6a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/register/register.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class Register { - constructor(private http: HttpClient) {} - - save(account: any): Observable { - return this.http.post(SERVER_API_URL + 'api/register', account); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html deleted file mode 100644 index bae1bb67e6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.html +++ /dev/null @@ -1,80 +0,0 @@ -
-
-
-

User settings for [{{settingsAccount.login}}]

- -
- Settings saved! -
- - - -
- -
- - -
- - Your first name is required. - - - Your first name is required to be at least 1 character. - - - Your first name cannot be longer than 50 characters. - -
-
-
- - -
- - Your last name is required. - - - Your last name is required to be at least 1 character. - - - Your last name cannot be longer than 50 characters. - -
-
-
- - -
- - Your email is required. - - - Your email is invalid. - - - Your email is required to be at least 5 characters. - - - Your email cannot be longer than 100 characters. - -
-
- -
-
-
- -
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts deleted file mode 100644 index 92afaca793..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { AccountService } from 'app/core'; - -@Component({ - selector: 'jhi-settings', - templateUrl: './settings.component.html' -}) -export class SettingsComponent implements OnInit { - error: string; - success: string; - settingsAccount: any; - languages: any[]; - - constructor(private accountService: AccountService) {} - - ngOnInit() { - this.accountService.identity().then(account => { - this.settingsAccount = this.copyAccount(account); - }); - } - - save() { - this.accountService.save(this.settingsAccount).subscribe( - () => { - this.error = null; - this.success = 'OK'; - this.accountService.identity(true).then(account => { - this.settingsAccount = this.copyAccount(account); - }); - }, - () => { - this.success = null; - this.error = 'ERROR'; - } - ); - } - - copyAccount(account) { - return { - activated: account.activated, - email: account.email, - firstName: account.firstName, - langKey: account.langKey, - lastName: account.lastName, - login: account.login, - imageUrl: account.imageUrl - }; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts deleted file mode 100644 index 3c9cf18e15..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/account/settings/settings.route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Route } from '@angular/router'; - -import { UserRouteAccessService } from 'app/core'; -import { SettingsComponent } from './settings.component'; - -export const settingsRoute: Route = { - path: 'settings', - component: SettingsComponent, - data: { - authorities: ['ROLE_USER'], - pageTitle: 'Settings' - }, - canActivate: [UserRouteAccessService] -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts deleted file mode 100644 index 4e46e0fe13..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.module.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { BookstoreSharedModule } from 'app/shared'; -/* jhipster-needle-add-admin-module-import - JHipster will add admin modules imports here */ - -import { - adminState, - AuditsComponent, - UserMgmtComponent, - UserMgmtDetailComponent, - UserMgmtUpdateComponent, - UserMgmtDeleteDialogComponent, - LogsComponent, - JhiMetricsMonitoringComponent, - JhiHealthModalComponent, - JhiHealthCheckComponent, - JhiConfigurationComponent, - JhiDocsComponent -} from './'; - -@NgModule({ - imports: [ - BookstoreSharedModule, - RouterModule.forChild(adminState) - /* jhipster-needle-add-admin-module - JHipster will add admin modules here */ - ], - declarations: [ - AuditsComponent, - UserMgmtComponent, - UserMgmtDetailComponent, - UserMgmtUpdateComponent, - UserMgmtDeleteDialogComponent, - LogsComponent, - JhiConfigurationComponent, - JhiHealthCheckComponent, - JhiHealthModalComponent, - JhiDocsComponent, - JhiMetricsMonitoringComponent - ], - entryComponents: [UserMgmtDeleteDialogComponent, JhiHealthModalComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class BookstoreAdminModule {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts deleted file mode 100644 index 88c7e575f0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/admin.route.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Routes } from '@angular/router'; - -import { auditsRoute, configurationRoute, docsRoute, healthRoute, logsRoute, metricsRoute, userMgmtRoute } from './'; - -import { UserRouteAccessService } from 'app/core'; - -const ADMIN_ROUTES = [auditsRoute, configurationRoute, docsRoute, healthRoute, logsRoute, ...userMgmtRoute, metricsRoute]; - -export const adminState: Routes = [ - { - path: '', - data: { - authorities: ['ROLE_ADMIN'] - }, - canActivate: [UserRouteAccessService], - children: ADMIN_ROUTES - } -]; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts deleted file mode 100644 index a2506c4090..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit-data.model.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class AuditData { - constructor(public remoteAddress: string, public sessionId: string) {} -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts deleted file mode 100644 index 6497fb444e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audit.model.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { AuditData } from './audit-data.model'; - -export class Audit { - constructor(public data: AuditData, public principal: string, public timestamp: string, public type: string) {} -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html deleted file mode 100644 index 38af44044a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.html +++ /dev/null @@ -1,52 +0,0 @@ -
-

Audits

- -
-
-

Filter by date

-
-
- from -
- - -
- To -
- -
-
-
- -
- - - - - - - - - - - - - - - - - -
DateUserStateExtra data
{{audit.timestamp| date:'medium'}}{{audit.principal}}{{audit.type}} - {{audit.data.message}} - Remote Address {{audit.data.remoteAddress}} -
-
-
-
- -
-
- -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts deleted file mode 100644 index 21739275f2..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.component.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { HttpResponse } from '@angular/common/http'; -import { DatePipe } from '@angular/common'; -import { ActivatedRoute, Router } from '@angular/router'; -import { JhiParseLinks, JhiAlertService } from 'ng-jhipster'; - -import { ITEMS_PER_PAGE } from 'app/shared'; -import { Audit } from './audit.model'; -import { AuditsService } from './audits.service'; - -@Component({ - selector: 'jhi-audit', - templateUrl: './audits.component.html' -}) -export class AuditsComponent implements OnInit, OnDestroy { - audits: Audit[]; - fromDate: string; - itemsPerPage: any; - links: any; - page: number; - routeData: any; - predicate: any; - previousPage: any; - reverse: boolean; - toDate: string; - totalItems: number; - - constructor( - private auditsService: AuditsService, - private alertService: JhiAlertService, - private parseLinks: JhiParseLinks, - private activatedRoute: ActivatedRoute, - private datePipe: DatePipe, - private router: Router - ) { - this.itemsPerPage = ITEMS_PER_PAGE; - this.routeData = this.activatedRoute.data.subscribe(data => { - this.page = data['pagingParams'].page; - this.previousPage = data['pagingParams'].page; - this.reverse = data['pagingParams'].ascending; - this.predicate = data['pagingParams'].predicate; - }); - } - - ngOnInit() { - this.today(); - this.previousMonth(); - this.loadAll(); - } - - ngOnDestroy() { - this.routeData.unsubscribe(); - } - - previousMonth() { - const dateFormat = 'yyyy-MM-dd'; - let fromDate: Date = new Date(); - - if (fromDate.getMonth() === 0) { - fromDate = new Date(fromDate.getFullYear() - 1, 11, fromDate.getDate()); - } else { - fromDate = new Date(fromDate.getFullYear(), fromDate.getMonth() - 1, fromDate.getDate()); - } - - this.fromDate = this.datePipe.transform(fromDate, dateFormat); - } - - today() { - const dateFormat = 'yyyy-MM-dd'; - // Today + 1 day - needed if the current day must be included - const today: Date = new Date(); - today.setDate(today.getDate() + 1); - const date = new Date(today.getFullYear(), today.getMonth(), today.getDate()); - this.toDate = this.datePipe.transform(date, dateFormat); - } - - loadAll() { - this.auditsService - .query({ - page: this.page - 1, - size: this.itemsPerPage, - sort: this.sort(), - fromDate: this.fromDate, - toDate: this.toDate - }) - .subscribe( - (res: HttpResponse) => this.onSuccess(res.body, res.headers), - (res: HttpResponse) => this.onError(res.body) - ); - } - - sort() { - const result = [this.predicate + ',' + (this.reverse ? 'asc' : 'desc')]; - if (this.predicate !== 'id') { - result.push('id'); - } - return result; - } - - loadPage(page: number) { - if (page !== this.previousPage) { - this.previousPage = page; - this.transition(); - } - } - - transition() { - this.router.navigate(['/admin/audits'], { - queryParams: { - page: this.page, - sort: this.predicate + ',' + (this.reverse ? 'asc' : 'desc') - } - }); - this.loadAll(); - } - - private onSuccess(data, headers) { - this.links = this.parseLinks.parse(headers.get('link')); - this.totalItems = headers.get('X-Total-Count'); - this.audits = data; - } - - private onError(error) { - this.alertService.error(error.error, error.message, null); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts deleted file mode 100644 index 87af5c6e8c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.route.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Route } from '@angular/router'; -import { JhiPaginationUtil, JhiResolvePagingParams } from 'ng-jhipster'; - -import { AuditsComponent } from './audits.component'; - -export const auditsRoute: Route = { - path: 'audits', - component: AuditsComponent, - resolve: { - pagingParams: JhiResolvePagingParams - }, - data: { - pageTitle: 'Audits', - defaultSort: 'auditEventDate,desc' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts deleted file mode 100644 index 78e8cca7e2..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/audits/audits.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { createRequestOption } from 'app/shared'; -import { SERVER_API_URL } from 'app/app.constants'; -import { Audit } from './audit.model'; - -@Injectable({ providedIn: 'root' }) -export class AuditsService { - constructor(private http: HttpClient) {} - - query(req: any): Observable> { - const params: HttpParams = createRequestOption(req); - params.set('fromDate', req.fromDate); - params.set('toDate', req.toDate); - - const requestURL = SERVER_API_URL + 'management/audits'; - - return this.http.get(requestURL, { - params, - observe: 'response' - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html deleted file mode 100644 index 02a4a96433..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
-

Configuration

- - Filter (by prefix) -

Spring configuration

- - - - - - - - - - - - - -
PrefixProperties
{{entry.prefix}} -
-
{{key}}
-
- {{entry.properties[key] | json}} -
-
-
-
-

{{key}}

- - - - - - - - - - - - - -
PropertyValue
{{item.key}} - {{item.val}} -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts deleted file mode 100644 index 6867210c91..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { JhiConfigurationService } from './configuration.service'; - -@Component({ - selector: 'jhi-configuration', - templateUrl: './configuration.component.html' -}) -export class JhiConfigurationComponent implements OnInit { - allConfiguration: any = null; - configuration: any = null; - configKeys: any[]; - filter: string; - orderProp: string; - reverse: boolean; - - constructor(private configurationService: JhiConfigurationService) { - this.configKeys = []; - this.filter = ''; - this.orderProp = 'prefix'; - this.reverse = false; - } - - keys(dict): Array { - return dict === undefined ? [] : Object.keys(dict); - } - - ngOnInit() { - this.configurationService.get().subscribe(configuration => { - this.configuration = configuration; - - for (const config of configuration) { - if (config.properties !== undefined) { - this.configKeys.push(Object.keys(config.properties)); - } - } - }); - - this.configurationService.getEnv().subscribe(configuration => { - this.allConfiguration = configuration; - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts deleted file mode 100644 index f4ad9c3688..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Route } from '@angular/router'; - -import { JhiConfigurationComponent } from './configuration.component'; - -export const configurationRoute: Route = { - path: 'jhi-configuration', - component: JhiConfigurationComponent, - data: { - pageTitle: 'Configuration' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts deleted file mode 100644 index 5f9dfd491c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/configuration/configuration.service.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class JhiConfigurationService { - constructor(private http: HttpClient) {} - - get(): Observable { - return this.http.get(SERVER_API_URL + 'management/configprops', { observe: 'response' }).pipe( - map((res: HttpResponse) => { - const properties: any[] = []; - const propertiesObject = this.getConfigPropertiesObjects(res.body); - for (const key in propertiesObject) { - if (propertiesObject.hasOwnProperty(key)) { - properties.push(propertiesObject[key]); - } - } - - return properties.sort((propertyA, propertyB) => { - return propertyA.prefix === propertyB.prefix ? 0 : propertyA.prefix < propertyB.prefix ? -1 : 1; - }); - }) - ); - } - - getConfigPropertiesObjects(res: Object) { - // This code is for Spring Boot 2 - if (res['contexts'] !== undefined) { - for (const key in res['contexts']) { - // If the key is not bootstrap, it will be the ApplicationContext Id - // For default app, it is baseName - // For microservice, it is baseName-1 - if (!key.startsWith('bootstrap')) { - return res['contexts'][key]['beans']; - } - } - } - // by default, use the default ApplicationContext Id - return res['contexts']['Bookstore']['beans']; - } - - getEnv(): Observable { - return this.http.get(SERVER_API_URL + 'management/env', { observe: 'response' }).pipe( - map((res: HttpResponse) => { - const properties: any = {}; - const propertySources = res.body['propertySources']; - - for (const propertyObject of propertySources) { - const name = propertyObject['name']; - const detailProperties = propertyObject['properties']; - const vals: any[] = []; - for (const keyDetail in detailProperties) { - if (detailProperties.hasOwnProperty(keyDetail)) { - vals.push({ key: keyDetail, val: detailProperties[keyDetail]['value'] }); - } - } - properties[name] = vals; - } - return properties; - }) - ); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html deleted file mode 100644 index 30efbbb93e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.html +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts deleted file mode 100644 index b338e7c3a6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'jhi-docs', - templateUrl: './docs.component.html' -}) -export class JhiDocsComponent { - constructor() {} -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts deleted file mode 100644 index d7df51b935..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/docs/docs.route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Route } from '@angular/router'; - -import { JhiDocsComponent } from './docs.component'; - -export const docsRoute: Route = { - path: 'docs', - component: JhiDocsComponent, - data: { - pageTitle: 'API' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html deleted file mode 100644 index efc125e3a0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.html +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts deleted file mode 100644 index 28128bf321..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health-modal.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { JhiHealthService } from './health.service'; - -@Component({ - selector: 'jhi-health-modal', - templateUrl: './health-modal.component.html' -}) -export class JhiHealthModalComponent { - currentHealth: any; - - constructor(private healthService: JhiHealthService, public activeModal: NgbActiveModal) {} - - baseName(name) { - return this.healthService.getBaseName(name); - } - - subSystemName(name) { - return this.healthService.getSubSystemName(name); - } - - readableValue(value: number) { - if (this.currentHealth.name === 'diskSpace') { - // Should display storage space in an human readable unit - const val = value / 1073741824; - if (val > 1) { - // Value - return val.toFixed(2) + ' GB'; - } else { - return (value / 1048576).toFixed(2) + ' MB'; - } - } - - if (typeof value === 'object') { - return JSON.stringify(value); - } else { - return value.toString(); - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html deleted file mode 100644 index b314daa0ba..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.html +++ /dev/null @@ -1,34 +0,0 @@ -
-

- Health Checks - -

-
- - - - - - - - - - - - - - - -
Service NameStatusDetails
{{ baseName(health.name) }} {{subSystemName(health.name)}} - - {{health.status}} - - - - - -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts deleted file mode 100644 index ada3ef62f4..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { JhiHealthService } from './health.service'; -import { JhiHealthModalComponent } from './health-modal.component'; - -@Component({ - selector: 'jhi-health', - templateUrl: './health.component.html' -}) -export class JhiHealthCheckComponent implements OnInit { - healthData: any; - updatingHealth: boolean; - - constructor(private modalService: NgbModal, private healthService: JhiHealthService) {} - - ngOnInit() { - this.refresh(); - } - - baseName(name: string) { - return this.healthService.getBaseName(name); - } - - getBadgeClass(statusState) { - if (statusState === 'UP') { - return 'badge-success'; - } else { - return 'badge-danger'; - } - } - - refresh() { - this.updatingHealth = true; - - this.healthService.checkHealth().subscribe( - health => { - this.healthData = this.healthService.transformHealthData(health); - this.updatingHealth = false; - }, - error => { - if (error.status === 503) { - this.healthData = this.healthService.transformHealthData(error.error); - this.updatingHealth = false; - } - } - ); - } - - showHealth(health: any) { - const modalRef = this.modalService.open(JhiHealthModalComponent); - modalRef.componentInstance.currentHealth = health; - modalRef.result.then( - result => { - // Left blank intentionally, nothing to do here - }, - reason => { - // Left blank intentionally, nothing to do here - } - ); - } - - subSystemName(name: string) { - return this.healthService.getSubSystemName(name); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts deleted file mode 100644 index 0b67775651..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Route } from '@angular/router'; - -import { JhiHealthCheckComponent } from './health.component'; - -export const healthRoute: Route = { - path: 'jhi-health', - component: JhiHealthCheckComponent, - data: { - pageTitle: 'Health Checks' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts deleted file mode 100644 index 4c1b0e5ec8..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/health/health.service.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class JhiHealthService { - separator: string; - - constructor(private http: HttpClient) { - this.separator = '.'; - } - - checkHealth(): Observable { - return this.http.get(SERVER_API_URL + 'management/health'); - } - - transformHealthData(data): any { - const response = []; - this.flattenHealthData(response, null, data.details); - return response; - } - - getBaseName(name): string { - if (name) { - const split = name.split('.'); - return split[0]; - } - } - - getSubSystemName(name): string { - if (name) { - const split = name.split('.'); - split.splice(0, 1); - const remainder = split.join('.'); - return remainder ? ' - ' + remainder : ''; - } - } - - /* private methods */ - private addHealthObject(result, isLeaf, healthObject, name): any { - const healthData: any = { - name - }; - - const details = {}; - let hasDetails = false; - - for (const key in healthObject) { - if (healthObject.hasOwnProperty(key)) { - const value = healthObject[key]; - if (key === 'status' || key === 'error') { - healthData[key] = value; - } else { - if (!this.isHealthObject(value)) { - details[key] = value; - hasDetails = true; - } - } - } - } - - // Add the details - if (hasDetails) { - healthData.details = details; - } - - // Only add nodes if they provide additional information - if (isLeaf || hasDetails || healthData.error) { - result.push(healthData); - } - return healthData; - } - - private flattenHealthData(result, path, data): any { - for (const key in data) { - if (data.hasOwnProperty(key)) { - const value = data[key]; - if (this.isHealthObject(value)) { - if (this.hasSubSystem(value)) { - this.addHealthObject(result, false, value, this.getModuleName(path, key)); - this.flattenHealthData(result, this.getModuleName(path, key), value); - } else { - this.addHealthObject(result, true, value, this.getModuleName(path, key)); - } - } - } - } - return result; - } - - private getModuleName(path, name): string { - let result; - if (path && name) { - result = path + this.separator + name; - } else if (path) { - result = path; - } else if (name) { - result = name; - } else { - result = ''; - } - return result; - } - - private hasSubSystem(healthObject): boolean { - let result = false; - - for (const key in healthObject) { - if (healthObject.hasOwnProperty(key)) { - const value = healthObject[key]; - if (value && value.status) { - result = true; - } - } - } - return result; - } - - private isHealthObject(healthObject): boolean { - let result = false; - - for (const key in healthObject) { - if (healthObject.hasOwnProperty(key)) { - if (key === 'status') { - result = true; - } - } - } - return result; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/index.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/index.ts deleted file mode 100644 index 7f631ffb9b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -export * from './audits/audits.component'; -export * from './audits/audits.service'; -export * from './audits/audits.route'; -export * from './audits/audit.model'; -export * from './audits/audit-data.model'; -export * from './configuration/configuration.component'; -export * from './configuration/configuration.service'; -export * from './configuration/configuration.route'; -export * from './docs/docs.component'; -export * from './docs/docs.route'; -export * from './health/health.component'; -export * from './health/health-modal.component'; -export * from './health/health.service'; -export * from './health/health.route'; -export * from './logs/logs.component'; -export * from './logs/logs.service'; -export * from './logs/logs.route'; -export * from './logs/log.model'; -export * from './metrics/metrics.component'; -export * from './metrics/metrics.service'; -export * from './metrics/metrics.route'; -export * from './user-management/user-management-update.component'; -export * from './user-management/user-management-delete-dialog.component'; -export * from './user-management/user-management-detail.component'; -export * from './user-management/user-management.component'; -export * from './user-management/user-management.route'; -export * from './admin.route'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts deleted file mode 100644 index 3f27b6728c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/log.model.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class Log { - constructor(public name: string, public level: string) {} -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html deleted file mode 100644 index cf5d6a046f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.html +++ /dev/null @@ -1,28 +0,0 @@ -
-

Logs

- -

There are {{ loggers.length }} loggers.

- - Filter - - - - - - - - - - - - - -
NameLevel
{{logger.name | slice:0:140}} - - - - - - -
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts deleted file mode 100644 index 28547f9ae6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { Log } from './log.model'; -import { LogsService } from './logs.service'; - -@Component({ - selector: 'jhi-logs', - templateUrl: './logs.component.html' -}) -export class LogsComponent implements OnInit { - loggers: Log[]; - filter: string; - orderProp: string; - reverse: boolean; - - constructor(private logsService: LogsService) { - this.filter = ''; - this.orderProp = 'name'; - this.reverse = false; - } - - ngOnInit() { - this.logsService.findAll().subscribe(response => (this.loggers = response.body)); - } - - changeLevel(name: string, level: string) { - const log = new Log(name, level); - this.logsService.changeLevel(log).subscribe(() => { - this.logsService.findAll().subscribe(response => (this.loggers = response.body)); - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts deleted file mode 100644 index cfa87715d8..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Route } from '@angular/router'; - -import { LogsComponent } from './logs.component'; - -export const logsRoute: Route = { - path: 'logs', - component: LogsComponent, - data: { - pageTitle: 'Logs' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts deleted file mode 100644 index 71a596b0ab..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/logs/logs.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; -import { Log } from './log.model'; - -@Injectable({ providedIn: 'root' }) -export class LogsService { - constructor(private http: HttpClient) {} - - changeLevel(log: Log): Observable> { - return this.http.put(SERVER_API_URL + 'management/logs', log, { observe: 'response' }); - } - - findAll(): Observable> { - return this.http.get(SERVER_API_URL + 'management/logs', { observe: 'response' }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html deleted file mode 100644 index 75902d8fb3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.html +++ /dev/null @@ -1,56 +0,0 @@ -
-

- Application Metrics - -

- -

JVM Metrics

-
- - - - - -
- -
-

Garbage collector statistics

- -
- -
Updating...
- - - - -
- - - - - - - - - -
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts deleted file mode 100644 index ed508c8187..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { JhiMetricsService } from './metrics.service'; - -@Component({ - selector: 'jhi-metrics', - templateUrl: './metrics.component.html' -}) -export class JhiMetricsMonitoringComponent implements OnInit { - metrics: any = {}; - threadData: any = {}; - updatingMetrics = true; - JCACHE_KEY: string; - - constructor(private modalService: NgbModal, private metricsService: JhiMetricsService) { - this.JCACHE_KEY = 'jcache.statistics'; - } - - ngOnInit() { - this.refresh(); - } - - refresh() { - this.updatingMetrics = true; - this.metricsService.getMetrics().subscribe(metrics => { - this.metrics = metrics; - this.metricsService.threadDump().subscribe(data => { - this.threadData = data.threads; - this.updatingMetrics = false; - }); - }); - } - - isObjectExisting(metrics: any, key: string) { - return metrics && metrics[key]; - } - - isObjectExistingAndNotEmpty(metrics: any, key: string) { - return this.isObjectExisting(metrics, key) && JSON.stringify(metrics[key]) !== '{}'; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts deleted file mode 100644 index abc18b8254..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Route } from '@angular/router'; - -import { JhiMetricsMonitoringComponent } from './metrics.component'; - -export const metricsRoute: Route = { - path: 'jhi-metrics', - component: JhiMetricsMonitoringComponent, - data: { - pageTitle: 'Application Metrics' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts deleted file mode 100644 index 15cfe3536c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/metrics/metrics.service.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class JhiMetricsService { - constructor(private http: HttpClient) {} - - getMetrics(): Observable { - return this.http.get(SERVER_API_URL + 'management/jhi-metrics'); - } - - threadDump(): Observable { - return this.http.get(SERVER_API_URL + 'management/threaddump'); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html deleted file mode 100644 index adb1a908da..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - - -
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts deleted file mode 100644 index d7674f6cd9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { JhiEventManager } from 'ng-jhipster'; - -import { User, UserService } from 'app/core'; - -@Component({ - selector: 'jhi-user-mgmt-delete-dialog', - templateUrl: './user-management-delete-dialog.component.html' -}) -export class UserMgmtDeleteDialogComponent { - user: User; - - constructor(private userService: UserService, public activeModal: NgbActiveModal, private eventManager: JhiEventManager) {} - - clear() { - this.activeModal.dismiss('cancel'); - } - - confirmDelete(login) { - this.userService.delete(login).subscribe(response => { - this.eventManager.broadcast({ - name: 'userListModification', - content: 'Deleted a user' - }); - this.activeModal.dismiss(true); - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html deleted file mode 100644 index 051f335ded..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.html +++ /dev/null @@ -1,47 +0,0 @@ -
-
-
-

- User [{{user.login}}] -

-
-
Login
-
- {{user.login}} - - -
-
First Name
-
{{user.firstName}}
-
Last Name
-
{{user.lastName}}
-
Email
-
{{user.email}}
-
Created By
-
{{user.createdBy}}
-
Created Date
-
{{user.createdDate | date:'dd/MM/yy HH:mm' }}
-
Last Modified By
-
{{user.lastModifiedBy}}
-
Last Modified Date
-
{{user.lastModifiedDate | date:'dd/MM/yy HH:mm'}}
-
Profiles
-
-
    -
  • - {{authority}} -
  • -
-
-
- -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts deleted file mode 100644 index 0b323d89a0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-detail.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; - -import { User } from 'app/core'; - -@Component({ - selector: 'jhi-user-mgmt-detail', - templateUrl: './user-management-detail.component.html' -}) -export class UserMgmtDetailComponent implements OnInit { - user: User; - - constructor(private route: ActivatedRoute) {} - - ngOnInit() { - this.route.data.subscribe(({ user }) => { - this.user = user.body ? user.body : user; - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html deleted file mode 100644 index b2d04b4227..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.html +++ /dev/null @@ -1,118 +0,0 @@ -
-
-
-

- Create or edit a User -

-
- -
- - -
- -
- - - -
- - This field is required. - - - - This field cannot be longer than 50 characters. - - - - This field can only contain letters, digits and e-mail addresses. - -
-
-
- - - -
- - This field cannot be longer than 50 characters. - -
-
-
- - - -
- - This field cannot be longer than 50 characters. - -
-
-
- - - -
- - This field is required. - - - - This field cannot be longer than 100 characters. - - - - This field is required to be at least 5 characters. - - - - Your email is invalid. - -
-
-
- -
- -
- - -
-
-
- - -
-
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts deleted file mode 100644 index e51e4f4a33..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management-update.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; - -import { User, UserService } from 'app/core'; - -@Component({ - selector: 'jhi-user-mgmt-update', - templateUrl: './user-management-update.component.html' -}) -export class UserMgmtUpdateComponent implements OnInit { - user: User; - languages: any[]; - authorities: any[]; - isSaving: boolean; - - constructor(private userService: UserService, private route: ActivatedRoute, private router: Router) {} - - ngOnInit() { - this.isSaving = false; - this.route.data.subscribe(({ user }) => { - this.user = user.body ? user.body : user; - }); - this.authorities = []; - this.userService.authorities().subscribe(authorities => { - this.authorities = authorities; - }); - } - - previousState() { - window.history.back(); - } - - save() { - this.isSaving = true; - if (this.user.id !== null) { - this.userService.update(this.user).subscribe(response => this.onSaveSuccess(response), () => this.onSaveError()); - } else { - this.user.langKey = 'en'; - this.userService.create(this.user).subscribe(response => this.onSaveSuccess(response), () => this.onSaveError()); - } - } - - private onSaveSuccess(result) { - this.isSaving = false; - this.previousState(); - } - - private onSaveError() { - this.isSaving = false; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html deleted file mode 100644 index 4592998c1f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.html +++ /dev/null @@ -1,78 +0,0 @@ -
-

- Users - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ID Login Email ProfilesCreated Date Last Modified By Last Modified Date
{{user.id}}{{user.login}}{{user.email}} - - - -
- {{ authority }} -
-
{{user.createdDate | date:'dd/MM/yy HH:mm'}}{{user.lastModifiedBy}}{{user.lastModifiedDate | date:'dd/MM/yy HH:mm'}} -
- - - -
-
-
-
-
- -
-
- -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts deleted file mode 100644 index 439442e3b6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.component.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { HttpResponse } from '@angular/common/http'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { ActivatedRoute, Router } from '@angular/router'; -import { JhiEventManager, JhiParseLinks, JhiAlertService } from 'ng-jhipster'; - -import { ITEMS_PER_PAGE } from 'app/shared'; -import { AccountService, UserService, User } from 'app/core'; -import { UserMgmtDeleteDialogComponent } from 'app/admin'; - -@Component({ - selector: 'jhi-user-mgmt', - templateUrl: './user-management.component.html' -}) -export class UserMgmtComponent implements OnInit, OnDestroy { - currentAccount: any; - users: User[]; - error: any; - success: any; - routeData: any; - links: any; - totalItems: any; - itemsPerPage: any; - page: any; - predicate: any; - previousPage: any; - reverse: any; - - constructor( - private userService: UserService, - private alertService: JhiAlertService, - private accountService: AccountService, - private parseLinks: JhiParseLinks, - private activatedRoute: ActivatedRoute, - private router: Router, - private eventManager: JhiEventManager, - private modalService: NgbModal - ) { - this.itemsPerPage = ITEMS_PER_PAGE; - this.routeData = this.activatedRoute.data.subscribe(data => { - this.page = data['pagingParams'].page; - this.previousPage = data['pagingParams'].page; - this.reverse = data['pagingParams'].ascending; - this.predicate = data['pagingParams'].predicate; - }); - } - - ngOnInit() { - this.accountService.identity().then(account => { - this.currentAccount = account; - this.loadAll(); - this.registerChangeInUsers(); - }); - } - - ngOnDestroy() { - this.routeData.unsubscribe(); - } - - registerChangeInUsers() { - this.eventManager.subscribe('userListModification', response => this.loadAll()); - } - - setActive(user, isActivated) { - user.activated = isActivated; - - this.userService.update(user).subscribe(response => { - if (response.status === 200) { - this.error = null; - this.success = 'OK'; - this.loadAll(); - } else { - this.success = null; - this.error = 'ERROR'; - } - }); - } - - loadAll() { - this.userService - .query({ - page: this.page - 1, - size: this.itemsPerPage, - sort: this.sort() - }) - .subscribe( - (res: HttpResponse) => this.onSuccess(res.body, res.headers), - (res: HttpResponse) => this.onError(res.body) - ); - } - - trackIdentity(index, item: User) { - return item.id; - } - - sort() { - const result = [this.predicate + ',' + (this.reverse ? 'asc' : 'desc')]; - if (this.predicate !== 'id') { - result.push('id'); - } - return result; - } - - loadPage(page: number) { - if (page !== this.previousPage) { - this.previousPage = page; - this.transition(); - } - } - - transition() { - this.router.navigate(['/admin/user-management'], { - queryParams: { - page: this.page, - sort: this.predicate + ',' + (this.reverse ? 'asc' : 'desc') - } - }); - this.loadAll(); - } - - deleteUser(user: User) { - const modalRef = this.modalService.open(UserMgmtDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); - modalRef.componentInstance.user = user; - modalRef.result.then( - result => { - // Left blank intentionally, nothing to do here - }, - reason => { - // Left blank intentionally, nothing to do here - } - ); - } - - private onSuccess(data, headers) { - this.links = this.parseLinks.parse(headers.get('link')); - this.totalItems = headers.get('X-Total-Count'); - this.users = data; - } - - private onError(error) { - this.alertService.error(error.error, error.message, null); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts deleted file mode 100644 index bf1115516f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/admin/user-management/user-management.route.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Routes, CanActivate } from '@angular/router'; -import { JhiPaginationUtil, JhiResolvePagingParams } from 'ng-jhipster'; - -import { AccountService, User, UserService } from 'app/core'; -import { UserMgmtComponent } from './user-management.component'; -import { UserMgmtDetailComponent } from './user-management-detail.component'; -import { UserMgmtUpdateComponent } from './user-management-update.component'; - -@Injectable({ providedIn: 'root' }) -export class UserResolve implements CanActivate { - constructor(private accountService: AccountService) {} - - canActivate() { - return this.accountService.identity().then(account => this.accountService.hasAnyAuthority(['ROLE_ADMIN'])); - } -} - -@Injectable({ providedIn: 'root' }) -export class UserMgmtResolve implements Resolve { - constructor(private service: UserService) {} - - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - const id = route.params['login'] ? route.params['login'] : null; - if (id) { - return this.service.find(id); - } - return new User(); - } -} - -export const userMgmtRoute: Routes = [ - { - path: 'user-management', - component: UserMgmtComponent, - resolve: { - pagingParams: JhiResolvePagingParams - }, - data: { - pageTitle: 'Users', - defaultSort: 'id,asc' - } - }, - { - path: 'user-management/:login/view', - component: UserMgmtDetailComponent, - resolve: { - user: UserMgmtResolve - }, - data: { - pageTitle: 'Users' - } - }, - { - path: 'user-management/new', - component: UserMgmtUpdateComponent, - resolve: { - user: UserMgmtResolve - } - }, - { - path: 'user-management/:login/edit', - component: UserMgmtUpdateComponent, - resolve: { - user: UserMgmtResolve - } - } -]; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app-routing.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/app-routing.module.ts deleted file mode 100644 index c40d4df774..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/app-routing.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { errorRoute, navbarRoute } from './layouts'; -import { DEBUG_INFO_ENABLED } from 'app/app.constants'; - -const LAYOUT_ROUTES = [navbarRoute, ...errorRoute]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - [ - { - path: 'admin', - loadChildren: './admin/admin.module#BookstoreAdminModule' - }, - ...LAYOUT_ROUTES - ], - { useHash: true, enableTracing: DEBUG_INFO_ENABLED } - ) - ], - exports: [RouterModule] -}) -export class BookstoreAppRoutingModule {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.constants.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/app.constants.ts deleted file mode 100644 index 9760a49a91..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -// These constants are injected via webpack environment variables. -// You can add more variables in webpack.common.js or in profile specific webpack..js files. -// If you change the values in the webpack config files, you need to re run webpack to update the application - -export const VERSION = process.env.VERSION; -export const DEBUG_INFO_ENABLED: boolean = !!process.env.DEBUG_INFO_ENABLED; -export const SERVER_API_URL = process.env.SERVER_API_URL; -export const BUILD_TIMESTAMP = process.env.BUILD_TIMESTAMP; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.main.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/app.main.ts deleted file mode 100644 index 7695bb8571..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.main.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { ProdConfig } from './blocks/config/prod.config'; -import { BookstoreAppModule } from './app.module'; - -ProdConfig(); - -if (module['hot']) { - module['hot'].accept(); -} - -platformBrowserDynamic() - .bootstrapModule(BookstoreAppModule, { preserveWhitespaces: true }) - .then(success => console.log(`Application started`)) - .catch(err => console.error(err)); diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/app.module.ts deleted file mode 100644 index 5fb96ed8c5..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/app.module.ts +++ /dev/null @@ -1,70 +0,0 @@ -import './vendor.ts'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap'; -import { Ng2Webstorage } from 'ngx-webstorage'; -import { NgJhipsterModule } from 'ng-jhipster'; - -import { AuthInterceptor } from './blocks/interceptor/auth.interceptor'; -import { AuthExpiredInterceptor } from './blocks/interceptor/auth-expired.interceptor'; -import { ErrorHandlerInterceptor } from './blocks/interceptor/errorhandler.interceptor'; -import { NotificationInterceptor } from './blocks/interceptor/notification.interceptor'; -import { BookstoreSharedModule } from 'app/shared'; -import { BookstoreCoreModule } from 'app/core'; -import { BookstoreAppRoutingModule } from './app-routing.module'; -import { BookstoreHomeModule } from './home/home.module'; -import { BookstoreAccountModule } from './account/account.module'; -import { BookstoreEntityModule } from './entities/entity.module'; -import * as moment from 'moment'; -// jhipster-needle-angular-add-module-import JHipster will add new module here -import { JhiMainComponent, NavbarComponent, FooterComponent, PageRibbonComponent, ErrorComponent } from './layouts'; - -@NgModule({ - imports: [ - BrowserModule, - Ng2Webstorage.forRoot({ prefix: 'jhi', separator: '-' }), - NgJhipsterModule.forRoot({ - // set below to true to make alerts look like toast - alertAsToast: false, - alertTimeout: 5000 - }), - BookstoreSharedModule.forRoot(), - BookstoreCoreModule, - BookstoreHomeModule, - BookstoreAccountModule, - // jhipster-needle-angular-add-module JHipster will add new module here - BookstoreEntityModule, - BookstoreAppRoutingModule - ], - declarations: [JhiMainComponent, NavbarComponent, ErrorComponent, PageRibbonComponent, FooterComponent], - providers: [ - { - provide: HTTP_INTERCEPTORS, - useClass: AuthInterceptor, - multi: true - }, - { - provide: HTTP_INTERCEPTORS, - useClass: AuthExpiredInterceptor, - multi: true - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ErrorHandlerInterceptor, - multi: true - }, - { - provide: HTTP_INTERCEPTORS, - useClass: NotificationInterceptor, - multi: true - } - ], - bootstrap: [JhiMainComponent] -}) -export class BookstoreAppModule { - constructor(private dpConfig: NgbDatepickerConfig) { - this.dpConfig.minDate = { year: moment().year() - 100, month: 1, day: 1 }; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts deleted file mode 100644 index c6221c1eaf..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/prod.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { enableProdMode } from '@angular/core'; -import { DEBUG_INFO_ENABLED } from 'app/app.constants'; - -export function ProdConfig() { - // disable debug data on prod profile to improve performance - if (!DEBUG_INFO_ENABLED) { - enableProdMode(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts deleted file mode 100644 index 0c2ea94808..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/config/uib-pagination.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { NgbPaginationConfig } from '@ng-bootstrap/ng-bootstrap'; -import { ITEMS_PER_PAGE } from 'app/shared'; - -@Injectable({ providedIn: 'root' }) -export class PaginationConfig { - // tslint:disable-next-line: no-unused-variable - constructor(private config: NgbPaginationConfig) { - config.boundaryLinks = true; - config.maxSize = 5; - config.pageSize = ITEMS_PER_PAGE; - config.size = 'sm'; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts deleted file mode 100644 index bc1b70cfef..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; -import { LoginService } from 'app/core/login/login.service'; - -@Injectable() -export class AuthExpiredInterceptor implements HttpInterceptor { - constructor(private loginService: LoginService) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request).pipe( - tap( - (event: HttpEvent) => {}, - (err: any) => { - if (err instanceof HttpErrorResponse) { - if (err.status === 401) { - this.loginService.logout(); - } - } - } - ) - ); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts deleted file mode 100644 index 23cdeaf66b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; -import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable() -export class AuthInterceptor implements HttpInterceptor { - constructor(private localStorage: LocalStorageService, private sessionStorage: SessionStorageService) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - if (!request || !request.url || (/^http/.test(request.url) && !(SERVER_API_URL && request.url.startsWith(SERVER_API_URL)))) { - return next.handle(request); - } - - const token = this.localStorage.retrieve('authenticationToken') || this.sessionStorage.retrieve('authenticationToken'); - if (!!token) { - request = request.clone({ - setHeaders: { - Authorization: 'Bearer ' + token - } - }); - } - return next.handle(request); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts deleted file mode 100644 index e464f66cd3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; -import { JhiEventManager } from 'ng-jhipster'; -import { HttpInterceptor, HttpRequest, HttpErrorResponse, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; - -@Injectable() -export class ErrorHandlerInterceptor implements HttpInterceptor { - constructor(private eventManager: JhiEventManager) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request).pipe( - tap( - (event: HttpEvent) => {}, - (err: any) => { - if (err instanceof HttpErrorResponse) { - if (!(err.status === 401 && (err.message === '' || (err.url && err.url.includes('/api/account'))))) { - this.eventManager.broadcast({ name: 'bookstoreApp.httpError', content: err }); - } - } - } - ) - ); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts deleted file mode 100644 index 34af81d482..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { JhiAlertService } from 'ng-jhipster'; -import { HttpInterceptor, HttpRequest, HttpResponse, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; - -@Injectable() -export class NotificationInterceptor implements HttpInterceptor { - constructor(private alertService: JhiAlertService) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request).pipe( - tap( - (event: HttpEvent) => { - if (event instanceof HttpResponse) { - const arr = event.headers.keys(); - let alert = null; - arr.forEach(entry => { - if (entry.toLowerCase().endsWith('app-alert')) { - alert = event.headers.get(entry); - } - }); - if (alert) { - if (typeof alert === 'string') { - this.alertService.success(alert, null, null); - } - } - } - }, - (err: any) => {} - ) - ); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts deleted file mode 100644 index a6548f6dd9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/account.service.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpResponse } from '@angular/common/http'; -import { Observable, Subject } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; -import { Account } from 'app/core/user/account.model'; - -@Injectable({ providedIn: 'root' }) -export class AccountService { - private userIdentity: any; - private authenticated = false; - private authenticationState = new Subject(); - - constructor(private http: HttpClient) {} - - fetch(): Observable> { - return this.http.get(SERVER_API_URL + 'api/account', { observe: 'response' }); - } - - save(account: any): Observable> { - return this.http.post(SERVER_API_URL + 'api/account', account, { observe: 'response' }); - } - - authenticate(identity) { - this.userIdentity = identity; - this.authenticated = identity !== null; - this.authenticationState.next(this.userIdentity); - } - - hasAnyAuthority(authorities: string[]): boolean { - if (!this.authenticated || !this.userIdentity || !this.userIdentity.authorities) { - return false; - } - - for (let i = 0; i < authorities.length; i++) { - if (this.userIdentity.authorities.includes(authorities[i])) { - return true; - } - } - - return false; - } - - hasAuthority(authority: string): Promise { - if (!this.authenticated) { - return Promise.resolve(false); - } - - return this.identity().then( - id => { - return Promise.resolve(id.authorities && id.authorities.includes(authority)); - }, - () => { - return Promise.resolve(false); - } - ); - } - - identity(force?: boolean): Promise { - if (force) { - this.userIdentity = undefined; - } - - // check and see if we have retrieved the userIdentity data from the server. - // if we have, reuse it by immediately resolving - if (this.userIdentity) { - return Promise.resolve(this.userIdentity); - } - - // retrieve the userIdentity data from the server, update the identity object, and then resolve. - return this.fetch() - .toPromise() - .then(response => { - const account = response.body; - if (account) { - this.userIdentity = account; - this.authenticated = true; - } else { - this.userIdentity = null; - this.authenticated = false; - } - this.authenticationState.next(this.userIdentity); - return this.userIdentity; - }) - .catch(err => { - this.userIdentity = null; - this.authenticated = false; - this.authenticationState.next(this.userIdentity); - return null; - }); - } - - isAuthenticated(): boolean { - return this.authenticated; - } - - isIdentityResolved(): boolean { - return this.userIdentity !== undefined; - } - - getAuthenticationState(): Observable { - return this.authenticationState.asObservable(); - } - - getImageUrl(): string { - return this.isIdentityResolved() ? this.userIdentity.imageUrl : null; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts deleted file mode 100644 index 5ad53e3dfe..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/auth-jwt.service.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; - -import { SERVER_API_URL } from 'app/app.constants'; - -@Injectable({ providedIn: 'root' }) -export class AuthServerProvider { - constructor(private http: HttpClient, private $localStorage: LocalStorageService, private $sessionStorage: SessionStorageService) {} - - getToken() { - return this.$localStorage.retrieve('authenticationToken') || this.$sessionStorage.retrieve('authenticationToken'); - } - - login(credentials): Observable { - const data = { - username: credentials.username, - password: credentials.password, - rememberMe: credentials.rememberMe - }; - return this.http.post(SERVER_API_URL + 'api/authenticate', data, { observe: 'response' }).pipe(map(authenticateSuccess.bind(this))); - - function authenticateSuccess(resp) { - const bearerToken = resp.headers.get('Authorization'); - if (bearerToken && bearerToken.slice(0, 7) === 'Bearer ') { - const jwt = bearerToken.slice(7, bearerToken.length); - this.storeAuthenticationToken(jwt, credentials.rememberMe); - return jwt; - } - } - } - - loginWithToken(jwt, rememberMe) { - if (jwt) { - this.storeAuthenticationToken(jwt, rememberMe); - return Promise.resolve(jwt); - } else { - return Promise.reject('auth-jwt-service Promise reject'); // Put appropriate error message here - } - } - - storeAuthenticationToken(jwt, rememberMe) { - if (rememberMe) { - this.$localStorage.store('authenticationToken', jwt); - } else { - this.$sessionStorage.store('authenticationToken', jwt); - } - } - - logout(): Observable { - return new Observable(observer => { - this.$localStorage.clear('authenticationToken'); - this.$sessionStorage.clear('authenticationToken'); - observer.complete(); - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts deleted file mode 100644 index 01fdccb02a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/csrf.service.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CookieService } from 'ngx-cookie'; - -@Injectable({ providedIn: 'root' }) -export class CSRFService { - constructor(private cookieService: CookieService) {} - - getCSRF(name = 'XSRF-TOKEN') { - return this.cookieService.get(name); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts deleted file mode 100644 index 0e5befbfc3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/state-storage.service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Injectable } from '@angular/core'; -import { SessionStorageService } from 'ngx-webstorage'; - -@Injectable({ providedIn: 'root' }) -export class StateStorageService { - constructor(private $sessionStorage: SessionStorageService) {} - - getPreviousState() { - return this.$sessionStorage.retrieve('previousState'); - } - - resetPreviousState() { - this.$sessionStorage.clear('previousState'); - } - - storePreviousState(previousStateName, previousStateParams) { - const previousState = { name: previousStateName, params: previousStateParams }; - this.$sessionStorage.store('previousState', previousState); - } - - getDestinationState() { - return this.$sessionStorage.retrieve('destinationState'); - } - - storeUrl(url: string) { - this.$sessionStorage.store('previousUrl', url); - } - - getUrl() { - return this.$sessionStorage.retrieve('previousUrl'); - } - - storeDestinationState(destinationState, destinationStateParams, fromState) { - const destinationInfo = { - destination: { - name: destinationState.name, - data: destinationState.data - }, - params: destinationStateParams, - from: { - name: fromState.name - } - }; - this.$sessionStorage.store('destinationState', destinationInfo); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts deleted file mode 100644 index a55b0bc035..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/auth/user-route-access-service.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Injectable, isDevMode } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; - -import { AccountService } from '../'; -import { LoginModalService } from '../login/login-modal.service'; -import { StateStorageService } from './state-storage.service'; - -@Injectable({ providedIn: 'root' }) -export class UserRouteAccessService implements CanActivate { - constructor( - private router: Router, - private loginModalService: LoginModalService, - private accountService: AccountService, - private stateStorageService: StateStorageService - ) {} - - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Promise { - const authorities = route.data['authorities']; - // We need to call the checkLogin / and so the accountService.identity() function, to ensure, - // that the client has a principal too, if they already logged in by the server. - // This could happen on a page refresh. - return this.checkLogin(authorities, state.url); - } - - checkLogin(authorities: string[], url: string): Promise { - return this.accountService.identity().then(account => { - if (!authorities || authorities.length === 0) { - return true; - } - - if (account) { - const hasAnyAuthority = this.accountService.hasAnyAuthority(authorities); - if (hasAnyAuthority) { - return true; - } - if (isDevMode()) { - console.error('User has not any of required authorities: ', authorities); - } - return false; - } - - this.stateStorageService.storeUrl(url); - this.router.navigate(['accessdenied']).then(() => { - // only show the login dialog, if the user hasn't logged in yet - if (!account) { - this.loginModalService.open(); - } - }); - return false; - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/core.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/core.module.ts deleted file mode 100644 index 7569b8f59e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/core.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule, LOCALE_ID } from '@angular/core'; -import { DatePipe, registerLocaleData } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { Title } from '@angular/platform-browser'; -import locale from '@angular/common/locales/en'; - -@NgModule({ - imports: [HttpClientModule], - exports: [], - declarations: [], - providers: [ - Title, - { - provide: LOCALE_ID, - useValue: 'en' - }, - DatePipe - ] -}) -export class BookstoreCoreModule { - constructor() { - registerLocaleData(locale); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/index.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/index.ts deleted file mode 100644 index 38827443a5..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './auth/csrf.service'; -export * from './auth/state-storage.service'; -export * from './auth/account.service'; -export * from './auth/auth-jwt.service'; -export * from './user/account.model'; -export * from './user/user.model'; -export * from './auth/user-route-access-service'; -export * from './login/login-modal.service'; -export * from './login/login.service'; -export * from './user/user.service'; -export * from './core.module'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts deleted file mode 100644 index a0002aa56b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login-modal.service.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; - -import { JhiLoginModalComponent } from 'app/shared/login/login.component'; - -@Injectable({ providedIn: 'root' }) -export class LoginModalService { - private isOpen = false; - constructor(private modalService: NgbModal) {} - - open(): NgbModalRef { - if (this.isOpen) { - return; - } - this.isOpen = true; - const modalRef = this.modalService.open(JhiLoginModalComponent); - modalRef.result.then( - result => { - this.isOpen = false; - }, - reason => { - this.isOpen = false; - } - ); - return modalRef; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts deleted file mode 100644 index e91508ff44..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/login/login.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Injectable } from '@angular/core'; - -import { AccountService } from 'app/core/auth/account.service'; -import { AuthServerProvider } from 'app/core/auth/auth-jwt.service'; - -@Injectable({ providedIn: 'root' }) -export class LoginService { - constructor(private accountService: AccountService, private authServerProvider: AuthServerProvider) {} - - login(credentials, callback?) { - const cb = callback || function() {}; - - return new Promise((resolve, reject) => { - this.authServerProvider.login(credentials).subscribe( - data => { - this.accountService.identity(true).then(account => { - resolve(data); - }); - return cb(); - }, - err => { - this.logout(); - reject(err); - return cb(err); - } - ); - }); - } - - loginWithToken(jwt, rememberMe) { - return this.authServerProvider.loginWithToken(jwt, rememberMe); - } - - logout() { - this.authServerProvider.logout().subscribe(); - this.accountService.authenticate(null); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts deleted file mode 100644 index 35679657e3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/account.model.ts +++ /dev/null @@ -1,12 +0,0 @@ -export class Account { - constructor( - public activated: boolean, - public authorities: string[], - public email: string, - public firstName: string, - public langKey: string, - public lastName: string, - public login: string, - public imageUrl: string - ) {} -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts deleted file mode 100644 index e82da11ac5..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.model.ts +++ /dev/null @@ -1,47 +0,0 @@ -export interface IUser { - id?: any; - login?: string; - firstName?: string; - lastName?: string; - email?: string; - activated?: boolean; - langKey?: string; - authorities?: any[]; - createdBy?: string; - createdDate?: Date; - lastModifiedBy?: string; - lastModifiedDate?: Date; - password?: string; -} - -export class User implements IUser { - constructor( - public id?: any, - public login?: string, - public firstName?: string, - public lastName?: string, - public email?: string, - public activated?: boolean, - public langKey?: string, - public authorities?: any[], - public createdBy?: string, - public createdDate?: Date, - public lastModifiedBy?: string, - public lastModifiedDate?: Date, - public password?: string - ) { - this.id = id ? id : null; - this.login = login ? login : null; - this.firstName = firstName ? firstName : null; - this.lastName = lastName ? lastName : null; - this.email = email ? email : null; - this.activated = activated ? activated : false; - this.langKey = langKey ? langKey : null; - this.authorities = authorities ? authorities : null; - this.createdBy = createdBy ? createdBy : null; - this.createdDate = createdDate ? createdDate : null; - this.lastModifiedBy = lastModifiedBy ? lastModifiedBy : null; - this.lastModifiedDate = lastModifiedDate ? lastModifiedDate : null; - this.password = password ? password : null; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts deleted file mode 100644 index 5c8065bedd..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/core/user/user.service.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { SERVER_API_URL } from 'app/app.constants'; -import { createRequestOption } from 'app/shared/util/request-util'; -import { IUser } from './user.model'; - -@Injectable({ providedIn: 'root' }) -export class UserService { - public resourceUrl = SERVER_API_URL + 'api/users'; - - constructor(private http: HttpClient) {} - - create(user: IUser): Observable> { - return this.http.post(this.resourceUrl, user, { observe: 'response' }); - } - - update(user: IUser): Observable> { - return this.http.put(this.resourceUrl, user, { observe: 'response' }); - } - - find(login: string): Observable> { - return this.http.get(`${this.resourceUrl}/${login}`, { observe: 'response' }); - } - - query(req?: any): Observable> { - const options = createRequestOption(req); - return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); - } - - delete(login: string): Observable> { - return this.http.delete(`${this.resourceUrl}/${login}`, { observe: 'response' }); - } - - authorities(): Observable { - return this.http.get(SERVER_API_URL + 'api/users/authorities'); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html deleted file mode 100644 index be3647e9df..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - - -
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts deleted file mode 100644 index 7992a5d26d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-delete-dialog.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; - -import { NgbActiveModal, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { JhiEventManager } from 'ng-jhipster'; - -import { IBook } from 'app/shared/model/book.model'; -import { BookService } from './book.service'; - -@Component({ - selector: 'jhi-book-delete-dialog', - templateUrl: './book-delete-dialog.component.html' -}) -export class BookDeleteDialogComponent { - book: IBook; - - constructor(protected bookService: BookService, public activeModal: NgbActiveModal, protected eventManager: JhiEventManager) {} - - clear() { - this.activeModal.dismiss('cancel'); - } - - confirmDelete(id: number) { - this.bookService.delete(id).subscribe(response => { - this.eventManager.broadcast({ - name: 'bookListModification', - content: 'Deleted an book' - }); - this.activeModal.dismiss(true); - }); - } -} - -@Component({ - selector: 'jhi-book-delete-popup', - template: '' -}) -export class BookDeletePopupComponent implements OnInit, OnDestroy { - protected ngbModalRef: NgbModalRef; - - constructor(protected activatedRoute: ActivatedRoute, protected router: Router, protected modalService: NgbModal) {} - - ngOnInit() { - this.activatedRoute.data.subscribe(({ book }) => { - setTimeout(() => { - this.ngbModalRef = this.modalService.open(BookDeleteDialogComponent as Component, { size: 'lg', backdrop: 'static' }); - this.ngbModalRef.componentInstance.book = book; - this.ngbModalRef.result.then( - result => { - this.router.navigate(['/book', { outlets: { popup: null } }]); - this.ngbModalRef = null; - }, - reason => { - this.router.navigate(['/book', { outlets: { popup: null } }]); - this.ngbModalRef = null; - } - ); - }, 0); - }); - } - - ngOnDestroy() { - this.ngbModalRef = null; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html deleted file mode 100644 index 4a3c20e841..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.html +++ /dev/null @@ -1,49 +0,0 @@ -
-
-
-

Book {{book.id}}

-
- -
-
Title
-
- {{book.title}} -
-
Author
-
- {{book.author}} -
-
Published
-
- {{book.published}} -
-
Quantity
-
- {{book.quantity}} -
-
Price
-
- {{book.price}} -
-
- - - - - - -
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts deleted file mode 100644 index 6b84c0ba73..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-detail.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; - -import { IBook } from 'app/shared/model/book.model'; -import { BookService } from 'app/entities/book/book.service'; -import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; - -@Component({ - selector: 'jhi-book-detail', - templateUrl: './book-detail.component.html' -}) -export class BookDetailComponent implements OnInit { - book: IBook; - - constructor(protected activatedRoute: ActivatedRoute, protected bookService: BookService) {} - - ngOnInit() { - this.activatedRoute.data.subscribe(({ book }) => { - this.book = book; - }); - } - - previousState() { - window.history.back(); - } - - purchase(id: number) { - console.log('Purchasing book ' + id); - this.bookService.purchase(id).subscribe( - (res: HttpResponse) => { - this.book = res.body; - }, - (res: HttpErrorResponse) => console.log(res.message) - ); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html deleted file mode 100644 index 3b41c6e1e0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.html +++ /dev/null @@ -1,100 +0,0 @@ -
-
-
-

Create or edit a Book

-
- -
- - -
-
- - -
- - This field is required. - -
-
-
- - -
- - This field is required. - -
-
-
- -
- - - - -
-
- - This field is required. - -
-
-
- - -
- - This field is required. - - - This field should be at least 0. - - - This field should be a number. - -
-
-
- - -
- - This field is required. - - - This field should be at least 0. - - - This field should be a number. - -
-
- -
-
- - -
-
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts deleted file mode 100644 index 67f46a67c2..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book-update.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; -import * as moment from 'moment'; -import { IBook } from 'app/shared/model/book.model'; -import { BookService } from './book.service'; - -@Component({ - selector: 'jhi-book-update', - templateUrl: './book-update.component.html' -}) -export class BookUpdateComponent implements OnInit { - book: IBook; - isSaving: boolean; - publishedDp: any; - - constructor(protected bookService: BookService, protected activatedRoute: ActivatedRoute) {} - - ngOnInit() { - this.isSaving = false; - this.activatedRoute.data.subscribe(({ book }) => { - this.book = book; - }); - } - - previousState() { - window.history.back(); - } - - save() { - this.isSaving = true; - if (this.book.id !== undefined) { - this.subscribeToSaveResponse(this.bookService.update(this.book)); - } else { - this.subscribeToSaveResponse(this.bookService.create(this.book)); - } - } - - protected subscribeToSaveResponse(result: Observable>) { - result.subscribe((res: HttpResponse) => this.onSaveSuccess(), (res: HttpErrorResponse) => this.onSaveError()); - } - - protected onSaveSuccess() { - this.isSaving = false; - this.previousState(); - } - - protected onSaveError() { - this.isSaving = false; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html deleted file mode 100644 index 74ad02a8e3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.html +++ /dev/null @@ -1,62 +0,0 @@ -
-

- Books - -

- -
-
- - - - - - - - - - - - - - - - - - - - - - - -
IDTitleAuthorPublishedQuantityPrice
{{book.id}}{{book.title}}{{book.author}}{{book.published | date:'mediumDate'}}{{book.quantity}}{{book.price}} -
- - - -
-
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts deleted file mode 100644 index 91a71c2f5c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; -import { Subscription } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; -import { JhiEventManager, JhiAlertService } from 'ng-jhipster'; - -import { IBook } from 'app/shared/model/book.model'; -import { AccountService } from 'app/core'; -import { BookService } from './book.service'; - -@Component({ - selector: 'jhi-book', - templateUrl: './book.component.html' -}) -export class BookComponent implements OnInit, OnDestroy { - books: IBook[]; - currentAccount: any; - eventSubscriber: Subscription; - - constructor( - protected bookService: BookService, - protected jhiAlertService: JhiAlertService, - protected eventManager: JhiEventManager, - protected accountService: AccountService - ) {} - - loadAll() { - this.bookService - .query() - .pipe( - filter((res: HttpResponse) => res.ok), - map((res: HttpResponse) => res.body) - ) - .subscribe( - (res: IBook[]) => { - this.books = res; - }, - (res: HttpErrorResponse) => this.onError(res.message) - ); - } - - ngOnInit() { - this.loadAll(); - this.accountService.identity().then(account => { - this.currentAccount = account; - }); - this.registerChangeInBooks(); - } - - ngOnDestroy() { - this.eventManager.destroy(this.eventSubscriber); - } - - trackId(index: number, item: IBook) { - return item.id; - } - - registerChangeInBooks() { - this.eventSubscriber = this.eventManager.subscribe('bookListModification', response => this.loadAll()); - } - - protected onError(errorMessage: string) { - this.jhiAlertService.error(errorMessage, null, null); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts deleted file mode 100644 index fe221a0eb9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { BookstoreSharedModule } from 'app/shared'; -import { - BookComponent, - BookDetailComponent, - BookUpdateComponent, - BookDeletePopupComponent, - BookDeleteDialogComponent, - bookRoute, - bookPopupRoute -} from './'; - -const ENTITY_STATES = [...bookRoute, ...bookPopupRoute]; - -@NgModule({ - imports: [BookstoreSharedModule, RouterModule.forChild(ENTITY_STATES)], - declarations: [BookComponent, BookDetailComponent, BookUpdateComponent, BookDeleteDialogComponent, BookDeletePopupComponent], - entryComponents: [BookComponent, BookUpdateComponent, BookDeleteDialogComponent, BookDeletePopupComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class BookstoreBookModule {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts deleted file mode 100644 index 154fa89a5c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.route.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpResponse } from '@angular/common/http'; -import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Routes } from '@angular/router'; -import { UserRouteAccessService } from 'app/core'; -import { Observable, of } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; -import { Book } from 'app/shared/model/book.model'; -import { BookService } from './book.service'; -import { BookComponent } from './book.component'; -import { BookDetailComponent } from './book-detail.component'; -import { BookUpdateComponent } from './book-update.component'; -import { BookDeletePopupComponent } from './book-delete-dialog.component'; -import { IBook } from 'app/shared/model/book.model'; - -@Injectable({ providedIn: 'root' }) -export class BookResolve implements Resolve { - constructor(private service: BookService) {} - - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - const id = route.params['id'] ? route.params['id'] : null; - if (id) { - return this.service.find(id).pipe( - filter((response: HttpResponse) => response.ok), - map((book: HttpResponse) => book.body) - ); - } - return of(new Book()); - } -} - -export const bookRoute: Routes = [ - { - path: '', - component: BookComponent, - data: { - authorities: ['ROLE_USER'], - pageTitle: 'Books' - }, - canActivate: [UserRouteAccessService] - }, - { - path: ':id/view', - component: BookDetailComponent, - resolve: { - book: BookResolve - }, - data: { - authorities: ['ROLE_USER'], - pageTitle: 'Books' - }, - canActivate: [UserRouteAccessService] - }, - { - path: 'new', - component: BookUpdateComponent, - resolve: { - book: BookResolve - }, - data: { - authorities: ['ROLE_USER'], - pageTitle: 'Books' - }, - canActivate: [UserRouteAccessService] - }, - { - path: ':id/edit', - component: BookUpdateComponent, - resolve: { - book: BookResolve - }, - data: { - authorities: ['ROLE_USER'], - pageTitle: 'Books' - }, - canActivate: [UserRouteAccessService] - } -]; - -export const bookPopupRoute: Routes = [ - { - path: ':id/delete', - component: BookDeletePopupComponent, - resolve: { - book: BookResolve - }, - data: { - authorities: ['ROLE_USER'], - pageTitle: 'Books' - }, - canActivate: [UserRouteAccessService], - outlet: 'popup' - } -]; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts deleted file mode 100644 index bff511f7e6..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/book.service.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import * as moment from 'moment'; -import { DATE_FORMAT } from 'app/shared/constants/input.constants'; -import { map } from 'rxjs/operators'; - -import { SERVER_API_URL } from 'app/app.constants'; -import { createRequestOption } from 'app/shared'; -import { IBook } from 'app/shared/model/book.model'; - -type EntityResponseType = HttpResponse; -type EntityArrayResponseType = HttpResponse; - -@Injectable({ providedIn: 'root' }) -export class BookService { - public resourceUrl = SERVER_API_URL + 'api/books'; - - constructor(protected http: HttpClient) {} - - create(book: IBook): Observable { - const copy = this.convertDateFromClient(book); - return this.http - .post(this.resourceUrl, copy, { observe: 'response' }) - .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); - } - - update(book: IBook): Observable { - const copy = this.convertDateFromClient(book); - return this.http - .put(this.resourceUrl, copy, { observe: 'response' }) - .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); - } - - find(id: number): Observable { - return this.http - .get(`${this.resourceUrl}/${id}`, { observe: 'response' }) - .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); - } - - purchase(id: number): Observable { - console.log('Calling /api/books/purchase/ ' + id); - return this.http - .get(`${this.resourceUrl}/purchase/${id}`, { observe: 'response' }) - .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); - } - - query(req?: any): Observable { - const options = createRequestOption(req); - return this.http - .get(this.resourceUrl, { params: options, observe: 'response' }) - .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res))); - } - - delete(id: number): Observable> { - return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); - } - - protected convertDateFromClient(book: IBook): IBook { - const copy: IBook = Object.assign({}, book, { - published: book.published != null && book.published.isValid() ? book.published.format(DATE_FORMAT) : null - }); - return copy; - } - - protected convertDateFromServer(res: EntityResponseType): EntityResponseType { - if (res.body) { - res.body.published = res.body.published != null ? moment(res.body.published) : null; - } - return res; - } - - protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType { - if (res.body) { - res.body.forEach((book: IBook) => { - book.published = book.published != null ? moment(book.published) : null; - }); - } - return res; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/index.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/index.ts deleted file mode 100644 index 603cf68f9f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/book/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './book.service'; -export * from './book-update.component'; -export * from './book-delete-dialog.component'; -export * from './book-detail.component'; -export * from './book.component'; -export * from './book.route'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts deleted file mode 100644 index fba1f55ef7..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/entities/entity.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -@NgModule({ - imports: [ - RouterModule.forChild([ - { - path: 'book', - loadChildren: './book/book.module#BookstoreBookModule' - } - /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */ - ]) - ], - declarations: [], - entryComponents: [], - providers: [], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class BookstoreEntityModule {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.html deleted file mode 100644 index 0c595b9d74..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
- -
-
-

Welcome, Java Hipster!

-

This is your homepage

- -
-
- You are logged in as user "{{account.login}}". -
- -
- If you want to - sign in, you can try the default accounts:
- Administrator (login="admin" and password="admin")
- User (login="user" and password="user").
-
-
- You don't have an account yet?  - Register a new account -
-
- -

- If you have any question on JHipster: -

- - - -

- If you like JHipster, don't forget to give us a star on GitHub! -

-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.ts deleted file mode 100644 index f1410c2cf5..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { JhiEventManager } from 'ng-jhipster'; - -import { LoginModalService, AccountService, Account } from 'app/core'; - -@Component({ - selector: 'jhi-home', - templateUrl: './home.component.html', - styleUrls: ['home.scss'] -}) -export class HomeComponent implements OnInit { - account: Account; - modalRef: NgbModalRef; - - constructor( - private accountService: AccountService, - private loginModalService: LoginModalService, - private eventManager: JhiEventManager - ) {} - - ngOnInit() { - this.accountService.identity().then((account: Account) => { - this.account = account; - }); - this.registerAuthenticationSuccess(); - } - - registerAuthenticationSuccess() { - this.eventManager.subscribe('authenticationSuccess', message => { - this.accountService.identity().then(account => { - this.account = account; - }); - }); - } - - isAuthenticated() { - return this.accountService.isAuthenticated(); - } - - login() { - this.modalRef = this.loginModalService.open(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.module.ts deleted file mode 100644 index c1004a6dd9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { BookstoreSharedModule } from 'app/shared'; -import { HOME_ROUTE, HomeComponent } from './'; - -@NgModule({ - imports: [BookstoreSharedModule, RouterModule.forChild([HOME_ROUTE])], - declarations: [HomeComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class BookstoreHomeModule {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.route.ts deleted file mode 100644 index a59993f8f0..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Route } from '@angular/router'; - -import { HomeComponent } from './'; - -export const HOME_ROUTE: Route = { - path: '', - component: HomeComponent, - data: { - authorities: [], - pageTitle: 'Welcome, Java Hipster!' - } -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.scss b/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.scss deleted file mode 100644 index 7fe48ff5fa..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/home.scss +++ /dev/null @@ -1,23 +0,0 @@ -/* ========================================================================== -Main page styles -========================================================================== */ - -.hipster { - display: inline-block; - width: 347px; - height: 497px; - background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top; - background-size: contain; -} - -/* wait autoprefixer update to allow simple generation of high pixel density media query */ -@media only screen and (-webkit-min-device-pixel-ratio: 2), - only screen and (-moz-min-device-pixel-ratio: 2), - only screen and (-o-min-device-pixel-ratio: 2/1), - only screen and (min-resolution: 192dpi), - only screen and (min-resolution: 2dppx) { - .hipster { - background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top; - background-size: contain; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/index.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/home/index.ts deleted file mode 100644 index d76285b277..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/home/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './home.component'; -export * from './home.route'; -export * from './home.module'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html deleted file mode 100644 index b79392173e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
-
-
- -
-
-

Error Page!

- -
-
{{errorMessage}} -
-
-
You are not authorized to access this page. -
-
The page asked was not found. -
-
-
-
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts deleted file mode 100644 index faa9658161..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; - -@Component({ - selector: 'jhi-error', - templateUrl: './error.component.html' -}) -export class ErrorComponent implements OnInit { - errorMessage: string; - error403: boolean; - error404: boolean; - - constructor(private route: ActivatedRoute) {} - - ngOnInit() { - this.route.data.subscribe(routeData => { - if (routeData.error403) { - this.error403 = routeData.error403; - } - if (routeData.error404) { - this.error404 = routeData.error404; - } - if (routeData.errorMessage) { - this.errorMessage = routeData.errorMessage; - } - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts deleted file mode 100644 index 85ab257ca9..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/error/error.route.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Routes } from '@angular/router'; - -import { ErrorComponent } from './error.component'; - -export const errorRoute: Routes = [ - { - path: 'error', - component: ErrorComponent, - data: { - authorities: [], - pageTitle: 'Bookstore' - } - }, - { - path: 'accessdenied', - component: ErrorComponent, - data: { - authorities: [], - pageTitle: 'Bookstore', - error403: true - } - }, - { - path: '404', - component: ErrorComponent, - data: { - authorities: [], - pageTitle: 'Bookstore', - error404: true - } - }, - { - path: '**', - redirectTo: '/404' - } -]; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html deleted file mode 100644 index b3ba632e02..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts deleted file mode 100644 index 37da8bca75..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/footer/footer.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'jhi-footer', - templateUrl: './footer.component.html' -}) -export class FooterComponent {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/index.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/index.ts deleted file mode 100644 index 8cbf6368d7..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './error/error.component'; -export * from './error/error.route'; -export * from './main/main.component'; -export * from './footer/footer.component'; -export * from './navbar/navbar.component'; -export * from './navbar/navbar.route'; -export * from './profiles/page-ribbon.component'; -export * from './profiles/profile.service'; -export * from './profiles/profile-info.model'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html deleted file mode 100644 index 5bcd12ab0b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.html +++ /dev/null @@ -1,11 +0,0 @@ - -
- -
-
-
- - -
- -
diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts deleted file mode 100644 index e1f2c8134e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/main/main.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRouteSnapshot, NavigationEnd, NavigationError } from '@angular/router'; - -import { Title } from '@angular/platform-browser'; - -@Component({ - selector: 'jhi-main', - templateUrl: './main.component.html' -}) -export class JhiMainComponent implements OnInit { - constructor(private titleService: Title, private router: Router) {} - - private getPageTitle(routeSnapshot: ActivatedRouteSnapshot) { - let title: string = routeSnapshot.data && routeSnapshot.data['pageTitle'] ? routeSnapshot.data['pageTitle'] : 'bookstoreApp'; - if (routeSnapshot.firstChild) { - title = this.getPageTitle(routeSnapshot.firstChild) || title; - } - return title; - } - - ngOnInit() { - this.router.events.subscribe(event => { - if (event instanceof NavigationEnd) { - this.titleService.setTitle(this.getPageTitle(this.router.routerState.snapshot.root)); - } - if (event instanceof NavigationError && event.error.status === 404) { - this.router.navigate(['/404']); - } - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html deleted file mode 100644 index 4fab5c76ac..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.html +++ /dev/null @@ -1,133 +0,0 @@ - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts deleted file mode 100644 index 6e00d7a1cb..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; - -import { VERSION } from 'app/app.constants'; -import { AccountService, LoginModalService, LoginService } from 'app/core'; -import { ProfileService } from 'app/layouts/profiles/profile.service'; - -@Component({ - selector: 'jhi-navbar', - templateUrl: './navbar.component.html', - styleUrls: ['navbar.scss'] -}) -export class NavbarComponent implements OnInit { - inProduction: boolean; - isNavbarCollapsed: boolean; - languages: any[]; - swaggerEnabled: boolean; - modalRef: NgbModalRef; - version: string; - - constructor( - private loginService: LoginService, - private accountService: AccountService, - private loginModalService: LoginModalService, - private profileService: ProfileService, - private router: Router - ) { - this.version = VERSION ? 'v' + VERSION : ''; - this.isNavbarCollapsed = true; - } - - ngOnInit() { - this.profileService.getProfileInfo().then(profileInfo => { - this.inProduction = profileInfo.inProduction; - this.swaggerEnabled = profileInfo.swaggerEnabled; - }); - } - - collapseNavbar() { - this.isNavbarCollapsed = true; - } - - isAuthenticated() { - return this.accountService.isAuthenticated(); - } - - login() { - this.modalRef = this.loginModalService.open(); - } - - logout() { - this.collapseNavbar(); - this.loginService.logout(); - this.router.navigate(['']); - } - - toggleNavbar() { - this.isNavbarCollapsed = !this.isNavbarCollapsed; - } - - getImageUrl() { - return this.isAuthenticated() ? this.accountService.getImageUrl() : null; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts deleted file mode 100644 index 317d99604b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.route.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Route } from '@angular/router'; - -import { NavbarComponent } from './navbar.component'; - -export const navbarRoute: Route = { - path: '', - component: NavbarComponent, - outlet: 'navbar' -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss deleted file mode 100644 index 9a5f929293..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/navbar/navbar.scss +++ /dev/null @@ -1,53 +0,0 @@ -@import '~bootstrap/scss/functions'; -@import '~bootstrap/scss/variables'; - -/* ========================================================================== -Navbar -========================================================================== */ - -.navbar-version { - font-size: 0.65em; - color: $navbar-dark-color; -} - -.profile-image { - height: 1.75em; - width: 1.75em; -} - -.navbar { - padding: 0.2rem 1rem; - .dropdown-item.active, - .dropdown-item.active:focus, - .dropdown-item.active:hover { - background-color: $dark; - } - - ul.navbar-nav { - .nav-item { - margin-left: 0.5em; - } - } - - a.nav-link { - font-weight: 400; - } - - .navbar-toggler { - &:hover { - color: $navbar-dark-hover-color; - } - } -} - -/* ========================================================================== -Logo styles -========================================================================== */ -.logo-img { - height: 45px; - width: 45px; - display: inline-block; - vertical-align: middle; - background: url('../../../content/images/logo-jhipster.png') no-repeat center center; - background-size: contain; -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts deleted file mode 100644 index 00fe76075d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ProfileService } from './profile.service'; -import { ProfileInfo } from './profile-info.model'; - -@Component({ - selector: 'jhi-page-ribbon', - template: ` - - `, - styleUrls: ['page-ribbon.scss'] -}) -export class PageRibbonComponent implements OnInit { - profileInfo: ProfileInfo; - ribbonEnv: string; - - constructor(private profileService: ProfileService) {} - - ngOnInit() { - this.profileService.getProfileInfo().then(profileInfo => { - this.profileInfo = profileInfo; - this.ribbonEnv = profileInfo.ribbonEnv; - }); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss deleted file mode 100644 index 90125b70cb..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/page-ribbon.scss +++ /dev/null @@ -1,31 +0,0 @@ -/* ========================================================================== -Developement Ribbon -========================================================================== */ -.ribbon { - background-color: rgba(170, 0, 0, 0.5); - left: -3.5em; - -moz-transform: rotate(-45deg); - -ms-transform: rotate(-45deg); - -o-transform: rotate(-45deg); - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - overflow: hidden; - position: absolute; - top: 40px; - white-space: nowrap; - width: 15em; - z-index: 9999; - pointer-events: none; - opacity: 0.75; - a { - color: #fff; - display: block; - font-weight: 400; - margin: 1px 0; - padding: 10px 50px; - text-align: center; - text-decoration: none; - text-shadow: 0 0 5px #444; - pointer-events: none; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts deleted file mode 100644 index f1adc52c7b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile-info.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class ProfileInfo { - activeProfiles: string[]; - ribbonEnv: string; - inProduction: boolean; - swaggerEnabled: boolean; -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts deleted file mode 100644 index d07fad7e7f..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/layouts/profiles/profile.service.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpResponse } from '@angular/common/http'; - -import { SERVER_API_URL } from 'app/app.constants'; -import { ProfileInfo } from './profile-info.model'; -import { map } from 'rxjs/operators'; - -@Injectable({ providedIn: 'root' }) -export class ProfileService { - private infoUrl = SERVER_API_URL + 'management/info'; - private profileInfo: Promise; - - constructor(private http: HttpClient) {} - - getProfileInfo(): Promise { - if (!this.profileInfo) { - this.profileInfo = this.http - .get(this.infoUrl, { observe: 'response' }) - .pipe( - map((res: HttpResponse) => { - const data = res.body; - const pi = new ProfileInfo(); - pi.activeProfiles = data['activeProfiles']; - const displayRibbonOnProfiles = data['display-ribbon-on-profiles'].split(','); - if (pi.activeProfiles) { - const ribbonProfiles = displayRibbonOnProfiles.filter(profile => pi.activeProfiles.includes(profile)); - if (ribbonProfiles.length !== 0) { - pi.ribbonEnv = ribbonProfiles[0]; - } - pi.inProduction = pi.activeProfiles.includes('prod'); - pi.swaggerEnabled = pi.activeProfiles.includes('swagger'); - } - return pi; - }) - ) - .toPromise(); - } - return this.profileInfo; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/polyfills.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/polyfills.ts deleted file mode 100644 index cf38f3221b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/polyfills.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -import 'core-js/es6/symbol'; -import 'core-js/es6/object'; -import 'core-js/es6/function'; -import 'core-js/es6/parse-int'; -import 'core-js/es6/parse-float'; -import 'core-js/es6/number'; -import 'core-js/es6/math'; -import 'core-js/es6/string'; -import 'core-js/es6/date'; -import 'core-js/es6/array'; -import 'core-js/es7/array'; -import 'core-js/es6/regexp'; -import 'core-js/es6/map'; -import 'core-js/es6/weak-map'; -import 'core-js/es6/set'; - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; - -require('../manifest.webapp'); diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts deleted file mode 100644 index 892e2d828c..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert-error.component.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { JhiEventManager, JhiAlert, JhiAlertService } from 'ng-jhipster'; -import { Subscription } from 'rxjs'; - -@Component({ - selector: 'jhi-alert-error', - template: ` - - ` -}) -export class JhiAlertErrorComponent implements OnDestroy { - alerts: any[]; - cleanHttpErrorListener: Subscription; - /* tslint:disable */ - constructor(private alertService: JhiAlertService, private eventManager: JhiEventManager) { - /* tslint:enable */ - this.alerts = []; - - this.cleanHttpErrorListener = eventManager.subscribe('bookstoreApp.httpError', response => { - let i; - const httpErrorResponse = response.content; - switch (httpErrorResponse.status) { - // connection refused, server not reachable - case 0: - this.addErrorAlert('Server not reachable', 'error.server.not.reachable'); - break; - - case 400: - const arr = httpErrorResponse.headers.keys(); - let errorHeader = null; - let entityKey = null; - arr.forEach(entry => { - if (entry.toLowerCase().endsWith('app-error')) { - errorHeader = httpErrorResponse.headers.get(entry); - } else if (entry.toLowerCase().endsWith('app-params')) { - entityKey = httpErrorResponse.headers.get(entry); - } - }); - if (errorHeader) { - const entityName = entityKey; - this.addErrorAlert(errorHeader, errorHeader, { entityName }); - } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.fieldErrors) { - const fieldErrors = httpErrorResponse.error.fieldErrors; - for (i = 0; i < fieldErrors.length; i++) { - const fieldError = fieldErrors[i]; - if (['Min', 'Max', 'DecimalMin', 'DecimalMax'].includes(fieldError.message)) { - fieldError.message = 'Size'; - } - // convert 'something[14].other[4].id' to 'something[].other[].id' so translations can be written to it - const convertedField = fieldError.field.replace(/\[\d*\]/g, '[]'); - const fieldName = convertedField.charAt(0).toUpperCase() + convertedField.slice(1); - this.addErrorAlert('Error on field "' + fieldName + '"', 'error.' + fieldError.message, { fieldName }); - } - } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { - this.addErrorAlert( - httpErrorResponse.error.message, - httpErrorResponse.error.message, - httpErrorResponse.error.params - ); - } else { - this.addErrorAlert(httpErrorResponse.error); - } - break; - - case 404: - this.addErrorAlert('Not found', 'error.url.not.found'); - break; - - default: - if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { - this.addErrorAlert(httpErrorResponse.error.message); - } else { - this.addErrorAlert(httpErrorResponse.error); - } - } - }); - } - - setClasses(alert) { - return { - toast: !!alert.toast, - [alert.position]: true - }; - } - - ngOnDestroy() { - if (this.cleanHttpErrorListener !== undefined && this.cleanHttpErrorListener !== null) { - this.eventManager.destroy(this.cleanHttpErrorListener); - this.alerts = []; - } - } - - addErrorAlert(message, key?, data?) { - const newAlert: JhiAlert = { - type: 'danger', - msg: message, - timeout: 5000, - toast: this.alertService.isToast(), - scoped: true - }; - - this.alerts.push(this.alertService.addAlert(newAlert, this.alerts)); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts deleted file mode 100644 index a77c3e72c5..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/alert/alert.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { JhiAlertService } from 'ng-jhipster'; - -@Component({ - selector: 'jhi-alert', - template: ` - - ` -}) -export class JhiAlertComponent implements OnInit, OnDestroy { - alerts: any[]; - - constructor(private alertService: JhiAlertService) {} - - ngOnInit() { - this.alerts = this.alertService.get(); - } - - setClasses(alert) { - return { - toast: !!alert.toast, - [alert.position]: true - }; - } - - ngOnDestroy() { - this.alerts = []; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts deleted file mode 100644 index 0f8cefb28e..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/auth/has-any-authority.directive.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'; -import { AccountService } from 'app/core/auth/account.service'; - -/** - * @whatItDoes Conditionally includes an HTML element if current user has any - * of the authorities passed as the `expression`. - * - * @howToUse - * ``` - * ... - * - * ... - * ``` - */ -@Directive({ - selector: '[jhiHasAnyAuthority]' -}) -export class HasAnyAuthorityDirective { - private authorities: string[]; - - constructor( - private accountService: AccountService, - private templateRef: TemplateRef, - private viewContainerRef: ViewContainerRef - ) {} - - @Input() - set jhiHasAnyAuthority(value: string | string[]) { - this.authorities = typeof value === 'string' ? [value] : value; - this.updateView(); - // Get notified each time authentication state changes. - this.accountService.getAuthenticationState().subscribe(identity => this.updateView()); - } - - private updateView(): void { - const hasAnyAuthority = this.accountService.hasAnyAuthority(this.authorities); - this.viewContainerRef.clear(); - if (hasAnyAuthority) { - this.viewContainerRef.createEmbeddedView(this.templateRef); - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts deleted file mode 100644 index 2ebea94220..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/error.constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem'; -export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used'; -export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used'; -export const EMAIL_NOT_FOUND_TYPE = PROBLEM_BASE_URL + '/email-not-found'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts deleted file mode 100644 index 1e3978a9b3..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/input.constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const DATE_FORMAT = 'YYYY-MM-DD'; -export const DATE_TIME_FORMAT = 'YYYY-MM-DDTHH:mm'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts deleted file mode 100644 index a148d4579b..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/constants/pagination.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const ITEMS_PER_PAGE = 20; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/index.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/index.ts deleted file mode 100644 index 92a8ccef73..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from './constants/error.constants'; -export * from './constants/pagination.constants'; -export * from './constants/input.constants'; -export * from './alert/alert.component'; -export * from './alert/alert-error.component'; -export * from './auth/has-any-authority.directive'; -export * from './login/login.component'; -export * from './util/request-util'; -export * from './shared-libs.module'; -export * from './shared-common.module'; -export * from './shared.module'; -export * from './util/datepicker-adapter'; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html deleted file mode 100644 index 7eb35364b4..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.html +++ /dev/null @@ -1,35 +0,0 @@ - - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts deleted file mode 100644 index 46711a0619..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/login/login.component.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Component, AfterViewInit, Renderer, ElementRef } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Router } from '@angular/router'; -import { JhiEventManager } from 'ng-jhipster'; - -import { LoginService } from 'app/core/login/login.service'; -import { StateStorageService } from 'app/core/auth/state-storage.service'; - -@Component({ - selector: 'jhi-login-modal', - templateUrl: './login.component.html' -}) -export class JhiLoginModalComponent implements AfterViewInit { - authenticationError: boolean; - password: string; - rememberMe: boolean; - username: string; - credentials: any; - - constructor( - private eventManager: JhiEventManager, - private loginService: LoginService, - private stateStorageService: StateStorageService, - private elementRef: ElementRef, - private renderer: Renderer, - private router: Router, - public activeModal: NgbActiveModal - ) { - this.credentials = {}; - } - - ngAfterViewInit() { - setTimeout(() => this.renderer.invokeElementMethod(this.elementRef.nativeElement.querySelector('#username'), 'focus', []), 0); - } - - cancel() { - this.credentials = { - username: null, - password: null, - rememberMe: true - }; - this.authenticationError = false; - this.activeModal.dismiss('cancel'); - } - - login() { - this.loginService - .login({ - username: this.username, - password: this.password, - rememberMe: this.rememberMe - }) - .then(() => { - this.authenticationError = false; - this.activeModal.dismiss('login success'); - if (this.router.url === '/register' || /^\/activate\//.test(this.router.url) || /^\/reset\//.test(this.router.url)) { - this.router.navigate(['']); - } - - this.eventManager.broadcast({ - name: 'authenticationSuccess', - content: 'Sending Authentication Success' - }); - - // previousState was set in the authExpiredInterceptor before being redirected to login modal. - // since login is successful, go to stored previousState and clear previousState - const redirect = this.stateStorageService.getUrl(); - if (redirect) { - this.stateStorageService.storeUrl(null); - this.router.navigate([redirect]); - } - }) - .catch(() => { - this.authenticationError = true; - }); - } - - register() { - this.activeModal.dismiss('to state register'); - this.router.navigate(['/register']); - } - - requestResetPassword() { - this.activeModal.dismiss('to state requestReset'); - this.router.navigate(['/reset', 'request']); - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts deleted file mode 100644 index ee943a4127..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/model/book.model.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Moment } from 'moment'; - -export interface IBook { - id?: number; - title?: string; - author?: string; - published?: Moment; - quantity?: number; - price?: number; -} - -export class Book implements IBook { - constructor( - public id?: number, - public title?: string, - public author?: string, - public published?: Moment, - public quantity?: number, - public price?: number - ) {} -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts deleted file mode 100644 index c6e52d67c5..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-common.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { BookstoreSharedLibsModule, JhiAlertComponent, JhiAlertErrorComponent } from './'; - -@NgModule({ - imports: [BookstoreSharedLibsModule], - declarations: [JhiAlertComponent, JhiAlertErrorComponent], - exports: [BookstoreSharedLibsModule, JhiAlertComponent, JhiAlertErrorComponent] -}) -export class BookstoreSharedCommonModule {} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts deleted file mode 100644 index 79ac658edb..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared-libs.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { NgJhipsterModule } from 'ng-jhipster'; -import { InfiniteScrollModule } from 'ngx-infinite-scroll'; -import { CookieModule } from 'ngx-cookie'; -import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; - -@NgModule({ - imports: [NgbModule.forRoot(), InfiniteScrollModule, CookieModule.forRoot(), FontAwesomeModule], - exports: [FormsModule, CommonModule, NgbModule, NgJhipsterModule, InfiniteScrollModule, FontAwesomeModule] -}) -export class BookstoreSharedLibsModule { - static forRoot() { - return { - ngModule: BookstoreSharedLibsModule - }; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts deleted file mode 100644 index 695b166793..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/shared.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; - -import { NgbDateMomentAdapter } from './util/datepicker-adapter'; -import { BookstoreSharedLibsModule, BookstoreSharedCommonModule, JhiLoginModalComponent, HasAnyAuthorityDirective } from './'; - -@NgModule({ - imports: [BookstoreSharedLibsModule, BookstoreSharedCommonModule], - declarations: [JhiLoginModalComponent, HasAnyAuthorityDirective], - providers: [{ provide: NgbDateAdapter, useClass: NgbDateMomentAdapter }], - entryComponents: [JhiLoginModalComponent], - exports: [BookstoreSharedCommonModule, JhiLoginModalComponent, HasAnyAuthorityDirective], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class BookstoreSharedModule { - static forRoot() { - return { - ngModule: BookstoreSharedModule - }; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts deleted file mode 100644 index 524a38c834..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/datepicker-adapter.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Angular bootstrap Date adapter - */ -import { Injectable } from '@angular/core'; -import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; -import { Moment } from 'moment'; -import * as moment from 'moment'; - -@Injectable() -export class NgbDateMomentAdapter extends NgbDateAdapter { - fromModel(date: Moment): NgbDateStruct { - if (date != null && moment.isMoment(date) && date.isValid()) { - return { year: date.year(), month: date.month() + 1, day: date.date() }; - } - return null; - } - - toModel(date: NgbDateStruct): Moment { - return date ? moment(date.year + '-' + date.month + '-' + date.day, 'YYYY-MM-DD') : null; - } -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts deleted file mode 100644 index 6579c3cb2a..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/shared/util/request-util.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { HttpParams } from '@angular/common/http'; - -export const createRequestOption = (req?: any): HttpParams => { - let options: HttpParams = new HttpParams(); - if (req) { - Object.keys(req).forEach(key => { - if (key !== 'sort') { - options = options.set(key, req[key]); - } - }); - if (req.sort) { - req.sort.forEach(val => { - options = options.append('sort', val); - }); - } - } - return options; -}; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/app/vendor.ts b/jhipster-5/bookstore-monolith/src/main/webapp/app/vendor.ts deleted file mode 100644 index e8923d5c66..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/app/vendor.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* after changing this file run 'npm run webpack:build' */ -/* tslint:disable */ -import '../content/scss/vendor.scss'; - -// Imports all fontawesome core and solid icons - -import { library } from '@fortawesome/fontawesome-svg-core'; -import { - faUser, - faSort, - faSortUp, - faSortDown, - faSync, - faEye, - faBan, - faTimes, - faArrowLeft, - faSave, - faPlus, - faPencilAlt, - faBars, - faThList, - faUserPlus, - faRoad, - faTachometerAlt, - faHeart, - faList, - faBell, - faBook, - faHdd, - faFlag, - faWrench, - faClock, - faCloud, - faSignOutAlt, - faSignInAlt, - faCalendarAlt, - faSearch, - faTrashAlt, - faAsterisk, - faTasks, - faHome -} from '@fortawesome/free-solid-svg-icons'; - -// Adds the SVG icon to the library so you can use it in your page -library.add(faUser); -library.add(faSort); -library.add(faSortUp); -library.add(faSortDown); -library.add(faSync); -library.add(faEye); -library.add(faBan); -library.add(faTimes); -library.add(faArrowLeft); -library.add(faSave); -library.add(faPlus); -library.add(faPencilAlt); -library.add(faBars); -library.add(faHome); -library.add(faThList); -library.add(faUserPlus); -library.add(faRoad); -library.add(faTachometerAlt); -library.add(faHeart); -library.add(faList); -library.add(faBell); -library.add(faTasks); -library.add(faBook); -library.add(faHdd); -library.add(faFlag); -library.add(faWrench); -library.add(faClock); -library.add(faCloud); -library.add(faSignOutAlt); -library.add(faSignInAlt); -library.add(faCalendarAlt); -library.add(faSearch); -library.add(faTrashAlt); -library.add(faAsterisk); - -// jhipster-needle-add-element-to-vendor - JHipster will add new menu items here diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/css/loading.css b/jhipster-5/bookstore-monolith/src/main/webapp/content/css/loading.css deleted file mode 100644 index a1e24615b4..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/content/css/loading.css +++ /dev/null @@ -1,152 +0,0 @@ -@keyframes lds-pacman-1 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 50% { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - } - 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@-webkit-keyframes lds-pacman-1 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 50% { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - } - 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@keyframes lds-pacman-2 { - 0% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 50% { - -webkit-transform: rotate(225deg); - transform: rotate(225deg); - } - 100% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } -} -@-webkit-keyframes lds-pacman-2 { - 0% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 50% { - -webkit-transform: rotate(225deg); - transform: rotate(225deg); - } - 100% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } -} -@keyframes lds-pacman-3 { - 0% { - -webkit-transform: translate(190px, 0); - transform: translate(190px, 0); - opacity: 0; - } - 20% { - opacity: 1; - } - 100% { - -webkit-transform: translate(70px, 0); - transform: translate(70px, 0); - opacity: 1; - } -} -@-webkit-keyframes lds-pacman-3 { - 0% { - -webkit-transform: translate(190px, 0); - transform: translate(190px, 0); - opacity: 0; - } - 20% { - opacity: 1; - } - 100% { - -webkit-transform: translate(70px, 0); - transform: translate(70px, 0); - opacity: 1; - } -} - -.app-loading { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - position: relative; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - top: 10em; -} -.app-loading p { - display: block; - font-size: 1.17em; - margin-inline-start: 0px; - margin-inline-end: 0px; - font-weight: normal; -} - -.app-loading .lds-pacman { - position: relative; - margin: auto; - width: 200px !important; - height: 200px !important; - -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px); - transform: translate(-100px, -100px) scale(1) translate(100px, 100px); -} -.app-loading .lds-pacman > div:nth-child(2) div { - position: absolute; - top: 40px; - left: 40px; - width: 120px; - height: 60px; - border-radius: 120px 120px 0 0; - background: #bbcedd; - -webkit-animation: lds-pacman-1 1s linear infinite; - animation: lds-pacman-1 1s linear infinite; - -webkit-transform-origin: 60px 60px; - transform-origin: 60px 60px; -} -.app-loading .lds-pacman > div:nth-child(2) div:nth-child(2) { - -webkit-animation: lds-pacman-2 1s linear infinite; - animation: lds-pacman-2 1s linear infinite; -} -.app-loading .lds-pacman > div:nth-child(1) div { - position: absolute; - top: 97px; - left: -8px; - width: 24px; - height: 10px; - background-image: url('../images/logo-jhipster.png'); - background-size: contain; - -webkit-animation: lds-pacman-3 1s linear infinite; - animation: lds-pacman-3 1.5s linear infinite; -} -.app-loading .lds-pacman > div:nth-child(1) div:nth-child(1) { - -webkit-animation-delay: -0.67s; - animation-delay: -1s; -} -.app-loading .lds-pacman > div:nth-child(1) div:nth-child(2) { - -webkit-animation-delay: -0.33s; - animation-delay: -0.5s; -} -.app-loading .lds-pacman > div:nth-child(1) div:nth-child(3) { - -webkit-animation-delay: 0s; - animation-delay: 0s; -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg deleted file mode 100755 index 1f9ab52790..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0.svg +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-192.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-192.png deleted file mode 100644 index 81330689211e5a082081222dcaf30c37ea6104cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13322 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 E2c#yGumAu6 diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-256.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_0_head-256.png deleted file mode 100644 index b4739ec3e47edbc81542888fd0fe7f9bb411c5b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17812 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 diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg deleted file mode 100755 index 7a118f3077..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1.svg +++ /dev/null @@ -1,9387 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-192.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-192.png deleted file mode 100644 index dd2643c15dd3055d1ca3fc057e0e4f7b0b93b785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19660 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 diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-384.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-384.png deleted file mode 100644 index f930681c128095fb436ebc8b486e94baf6cfc186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48895 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 UO0?Ay3<5r~Qi_t*;zl9=2eGOgGynhq diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-512.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_1_head-512.png deleted file mode 100644 index 9110dc8fe44bf6ed248a2723f15e900d87cec9a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68803 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

Wv|Q)i4zQT>0V0j?|=lCiv9> z?xCyEc!0NN{v{X#IegEc+2@6D*5_5bEChGezy#_~{wHX!J`~zc6o}kd%v9kIu@kgb ze|p3=f3N1yWI1!slF{?whYF_meP=Wd^$+3|l>qFzu<&hN7QQ>` z8dM->y#L*~aYGESBZg-<_nA^O)^y{pstw6WCpUIV6dJnc~%?KcKoavOb z=KR=psLe=KJ{70y4A~e{b(we?S~c?YcnCn@jkCH=b^SqMCVe58+jy~!8VNPI6+m?J zPLq*v;&m6qS2%Zkh(hO<%9T_P~ z6!Dvfo)QdFe2cM{ae9^7V_5$4#}0zSqdoBRuD|Kn5S-=Np>?(!o%_Vd*XHqwPo)jK zknTu$p;ar?7d1M%p~zwf1C_|Kt_EiGk5n|O$isx0lBwMi(!&jUG#m?6cZeLLgUyF2!)o%tFLk7A(w3$?3ObL_ zz$q{MI`cw!KPaF;>(zb#|dEHdaV2UkuCGXDAu?1%wZXO2Py^ml^ z82JdW|FT1OxEjwdIjDAb4Z&Tfd2YHh##(KdXf>$0LpnDOItdm}1(PSDt4FV} zpqYuMl7PNRI8b`i9Tl;3drZ%Kyj|#@SX5dKFRXZf#wRHljEw$LA_7r~A*N<)J*_hE z+@8$H=l~lF%VNTk^#^zr&IXJkxcojpmrEXQ&c3_$=OJf|QbBKORlFtU(2-;oWyc%W z8>!M4?;y2eF_pt6JToUF6~uANAT=FM*io4;pro1l1|PHU)=b3RY-wbuvjYnc@$q}} zz9TcabJnwB^e%rzB2YiBUlesl$QfQ1ivT;c%8g7UpT2^Y)Id7Rmc zds95aTTg^z8k?Ekk~SH5*8(yKA|?;N)j|3Y7{A z<4>R`@;R|&tZ6Jz^>`A{LL;W`KR=7wEvackOJ7>L6mUkNN#U*&3z#}`ninL#NFIW} zm3X}-wN;1IApW~T22dK`N*ID|qKI z*RZG)HMR(~#`NBXf70z^oq@I^)MCa&4yRbf9L38WGB2}Z7tZu>S!)eWY+{04*f;2p z>=?>gn$d{|EZvh)GNv*}t>MZI1aIoXJN3>b%S-1=El~3=BY87Ntg{=4;WfjAx{;z} zeoACsXEq~4dLksIxSNx2ul3>f$_7|Db3EI#!3(f_7cH=p}~H1C_@hPOu7$tNgb+FY*dd1S`M z`n;uiC}MC}1RO0D&u*K>T|Hd-k|x!P$8hCZg+eLE!j)6iR}d}o-OJmvZ^QZfRh6st zwrfU|;MhZ9TZ>w{g9si$^#0h|k!3+)EA0Hh&C1aIGxUxzv)%98FGHa)Lvn*>8hcWG z#B-_ppXNF52X+vOF&NHLr;+Nv9v$5Op6zkt4#4flN{X>?xKf^l*cdp2A!gX8r_|Sg{d0(!! z;*JaI0EuciwK+Y0Ju8x4B!Ffls(i zw!}_)ek2Bz0@4mMT0dfLN9Ej}VY;&V8%an==AYY-o%kt9bk3l8ndt4X2PV`w(nI}&Py_sK^8+u@VpFQ{5oYOuDID+McLqL2xIa^D zS{}z|>K=CbLr6c6JjOA!n1jKh78W04 zo>|xPAFt5MQX9I4hGZ`8e+I^&ZjNDzBCNmT2;5!G`95xCKXBHS9A=7;Rx%yEE7W&h zfI39sz#imusvE3YwUFcL9YLRq#l9{QTRE=`=|h*8?rkpC7_zdlW$y@laND(O?`+4n zuc=w=jI0r~q#G9Zv1fZx$o8klFHXKD!}AX8P0Tt4%SG!n*A*9IF{;13JizT57m1h6 z_@l0UF-AD`+`n=IxDmAWZdJtGSva+WlKlFgFg~;swGlpOScQd`9dgwVbeKEXcV9LY zloyRB&@p?d*=Ki!KG{oBn?l8tBl~|Z?+X8to3Nlletn0`*iaL)GQMVOB~*nF$+c2* ze5%-;2^;nI0@00vt-$t2XuQ8s!liew1+ItA>XK66>@F42&0Ts|qm5KoKdOnem~>LH zF@LtrfUY0@d#rku&fNLa>4*sUPEeo86YCZi>RYhTZ$7%9ou5;h@1w5pFx+3ZUfxpi z7R=D>S@3KK=VxHxRoNg9p#B9$rs%G7;*}bU8wF6($rlta$aJJSBy%{ACs=fu^v49r zuAarX);e!ieN$~!{r@xYAbFRO0X%$Cte1 zB+_kojn0}DL^(pX5}Tf>NA5N2pOPqLJv@G&$@%UjH+>cqJ$PG6eQ&(0z9`sV%p*k+ zW;mT6Q&EvHjYP5#3QNQl?dme2|1R>T9d+Us1_$4xg^NQOSIf=s5JZz=cF_IZ?K@bi zo|CB6)v8dtUViVx(CE1T#W2UMITIj7Sg#53y6>sNQNuW)v!+{^whjarQp(B7_g}#a ztSn36L$dfv9KvxCm^CcpH?jStrawMA7S*wbf6?qN)>O_vJU$C1mDMj@*5p>haq71AOEb^Q7S%N#LO?|wKQA?I z34u2IG*D8~(q;_mO8XpqW<$8yW{nE6fXfZW?0CCH6Bgi4+A&hZhJdO$3>H}VS16X2 z^o*R)NlVLISVhC(i=JkmD3$N$_|v5_Z1(Eh7e1Sv9G9%LN9i~72`VP!lz(k?#a!TK z<`BT8^=fIf&;B7)Z_n+_q-sbxzRD@YWsjmJj9;iWqTf2<`pb3)JouBzlNZT6buVhe z)Hf3ezJ`t0>+q7Q(YdST3oAQqgzoAZVI4-Oglr@r1)Tx`ML^`CAIt^YewIP%?QN6C zUiD2kcyid7OCo_sQN(wFoV_k!B(yU`f$me^8KK?xjwpTTgn21gK|CovV2AxA%+RwH zX(De1=^0tcHJPpa9Endz2*6}ST?v4u&sgTCB^lHpj;Xmr4?JAZ(ycX7h-$t~K`bh_li!}a_T3Go zyLz+FE6pYQI1jq|xYJd7bm%jsra$ADwfXNi;6c22ZX_r=xO#hyz)I|aL;U9`RA?MA z6-Mwn6+arz%=9Lv41YZ+k{*1t&`U2+v7WuwkK6r z{--Bh)8{{R1Wr4)Y1KVY&~;rj9;sxU+<_;szEJt$A1E%o#AOi7q{z_Aes8R0n?MW8 zD~h^1GeM632#{dEFSY-fzNn)ezB`K*6Ro?oBQsmeG%-Yx2em1W!JE`8?&ih=$IM9k z{O@!h9Nft}@Rt=>>AFePH`159u;S8U>i(Gp%Rzfg5`j@TIk_6pHIgezhA~t66$&0x zSG>WKN5SmA#MorBFUZ9iyf@>a6+ez>@9**5;Mlq}hP7Al#wc-;+;| z-Y^@JNLx*v-4Vr68waA&3_#wy*y&2zPXB9oLexhV-&9Ag&zgSI`zle>U6}4-U407j zIGDNNp0=~S^KH?5a3IuIctJa5sgl^&@r=C1YkUrGgAfiWYV+wW6-|>-%573z!@yA9 zcbHzKPxzjgv!;lG5}i7EE{k~GOVrhnDIp`6Y`P+?8uEE9kP&L??J4FHq z%<;->rajZ4dG!BIkXi(Y17^A9C6&rQj{(>9ZnNB+L|!$?2OQaKeGAG z){Bz95@m}TrFnr*&@SETW9*7LO{Z6#ghfl|D4yn>7nd~*XJUOSTq*Z27*tdetDS1N zT%OU4%C~Zu`y_<>NL+2YoOG1gOm(t|aDwvDKM1kpAeRk<@!x#Z5^Wc5@$`A~?cpX8 zscU0K6j;XJ$3bkv9NR`F|;ok@P1(fI8l6P@1x`E(i>brPl-hXOqOjOsowYE8g zo3jl;#K)hTzE4E$y@cP!+hGf}z+z%vL~SvwDW*}Ntd*Z%qb+I7-fiq$8egs1`vwPk z3@@OG^=0Y36xr#IhxK{b3cmI{Q`kokCC82;7KZ)0Q~Rp6Kz51IEmsU)cj6~%?b65z z2C54thUR)8iw0UKd5`<8@73n#ry127t%-^$sSu8SSm|M_^k2Tnn8~==!E&eIED~Ol zNYLz83tT}s*-n?g`~aa=Yg$FVLO^Rq@E(Qg9k?*B@RwG@2{XDYg>XVc^-^Z#?b%1a zZLApnWV>!WkcB9!28NWf{O~=kH(YD?{d-3L+1hOlGheErKLS~M{c^3{a}%-OuH)qc zQc9($)1~vG2CFh}Qp1!>Q?%W>!sysr{nh`o0E%UIAsfRptaapg1G4!W1?`1~j^5 z(C~BAzRi%Af%FMWO|sp}#g1!xATo!=mai+3@bS|ftFMQvYZ`lWuKR_i7owYQ8N<{s z(so)sTJx~+dv>t$qlu3$KFz**+HDL}g9%3v<8zXGhciYa5G17)Ss;g^OQgV3KzfKr zNIY}$FVQWNjc!J9T!qX=A?bYTEsXBKB_b4iTPrQ){rgyv1D6VR2=Jeaq9#F1gA^n| ztr&lSmO>d10}eV44jKg0=2S9vD_8B65j9ql?EDQe;gSN=Y$6IM%K<{5{0_tnLo!bO2B&w_M7P5G z`B~aM6k~xxYY^Iy8(DjGe-O!zP8Aw^* zwYuLLs-2#uz9yY_Yv)U1ac!aa)bf(#L=Js=6u9_9RJ1OOo<|8DAtBV4RGW;P92>sG zjm*TY{*L#%ST;g$X5Iy%W|!-4+JzJ|j~t#Jgj<`h!lUz6g_>TliirY(30PZ=%O6fO z%(stPS}yPO@%;ZK68Lxl?|X{fxzdfQT<(f->Z90xw81`+{^*ZXXB!kLNP2mN*i+MX zr^}7b)8i>j#Y4c;^Hk@7{3R!&+yvCfvj>O?JvJCOxEAxWTJ7N4rotb(Pb-<|q=Zn4 zDI2EFI{XM<{=juAE(_e!gzP%loIH&4Xbii=nO7DYvqzp1@0(1i`tcY4a&-<_@!tW0 za$KdZUhp^;%$JlIdh$$et4%zEqN0-RpeB}VRLwXtNk>oI*Ggq8%P)=`9)V!Rs2B%i zm4_XU8OZUY+x49)AHte{(O8OJ6V7y!mYHERJy_t`$KWalK#zJ6?OlHgM((AuDDQ-dG6RkB`PtOOpl=A|QHIIlYML3J+#e6I zt8`ML5Wm|{IW}en@!<98*tU>opPrs_UVR$pxBUp8^721do3kx^Iy_(a*TIp%aXX$`8ux$9b?c} z@u*vWGMpRd)yUYWu|oxgs$YiE`8rygp!hy~(Ae1y`s)er!XlYsU}+eMQ7BWwnuv<; zdBERSiF|i>N%r;Q>o|yZ9M63@9bJE45{SwtwCWdCLc6VEI9GG&<9;S|`kK|m>mJM~phnj68}{iFR8+V6DI_OnpAZ4_RZn7OtJU-O zfrBOp1Xhqn+Byp(_X2bYr(0yX={Nka{#z(n%T0~5b=)(nazIq{$BaOpJUfjg4dLFZ z>dm~`NDRHII~0b-y%j6ZA=d6HC&NHMe|R&ke8>9)o818`*dYwFm#5rP1yZZlN|5L)6awEkna2nSsfQAv+GRR+OgM z*?;F`K7XbtVzT7vUhMuLc(rP&alqjuD6H08S-h6_+t@iQHg+ej_|MF?^2{VJx!I#7 zNHD`$uq2L>f(p+SLEhMT^PN7HA z#fi>{IQz2mfm{MZ+>DDrVyy#(!%&=vY=)gzPJdb;i41wK+xz*BPvg%y>OFKZaF7@!Qk2QHe8~;q>3zsu5(WO3;}w3s z<<3Qch5Q-+cnBn9x%sYm0qw@zt(jZsuk*7Mo7=Ei*E@1JWP8f{iZ>pZn9M&dJ4A~1#DvVtN@8WptO^5)FYu)UC_7-7@t(|e2` z-4e2)Y)MJeShP4#EOSu4w#^8;(yW&^l40^m_SekUQx7vS#mx1 zIb-rXjZmEY`HAI)^AK?Qw;i=Rb1=VWBxD5atosnHG#|s@x7++&vn0cj|2(qT9AZv9 zV??iZ;wG$@SLdwKrV8)@wTKa$XJ=3&-z@hZP!4#aPP5@g>dN3wH%5Xe)enmQ`5F*K z)MTP~;z+~ke&!#|+>ZM{n6>JzfC-pBGOb_Qv+duu3BB@T;*&Wh6I$J60Hl7`u8f0_TLY(fU4o~(jzuG z1${t%#0+?=>MN~?ZVbM={mwA1>o_luOMAd;ZL})+Pu-9i`O{rfD3Onot}%K=JZ^hA zYIP~|1Zs6X-POp!#=%mC)(Pd3=9mY&X!^WqF@9R(?323IVP)!*mm#a&znF=l%$}=$!_f&+tUq7 z>Hl#s0dCgyLt*7K2$OUOCNjv!qhQ(@gRZ(d^9bt zkmeyfUa(!)Z{lYVsNI^qsKm6(aYJ}<5!1TysZ_GeO)c8c#~&@xsN{4omQ`3d=9Lx_ z1R`i4u#ZRGJU)fSP0*WKmVl_6D$=GUj`K|* z)GD)B_FQ$<-EOe{RpyO~j;h|-WZTY3a_EzkGyn{a@3J8#rIjf7OYXc*mt>5%m>99O zl~|ljuG?;1=F6s6vU1QNA)$F}jYZls77Yj=lMx06PJL}ZJa`Gau3e+!$xxvsEKHkm z#*OT;a&Z;QM}7OrRyMbjr5Phe4x2j>>JM?VhF-CE$?Jq9WwHu@!*K41+oEYUA`Z9L#XG zC1F$jETA2Kw+k;QB&2WLgaq_wCBz>8<|n!l_&}asnShQ9-=Gx@xEA5*+hrJ6%IJ1l zz&r+_n7~0yJq_Wgobz&N6auixS$808Zo3(nBeFUt^z!bG1j_F1c&6x z#LyejR1D*DJ~<4vnje7naxO(--RuVN-t5y2Sl0cBiW>3)v{=U?ueB0cqr zoEBUKfmPk><0vOW;kZV=(uf$-(_0}=H753e9i}G%1?sS`<*vK$ivjW*@5iR~=yCZH&r9NkwHrbiNE+Q2bu_5G3H^G5XeYY?)Yg-NJ z34UGZwH`Hhttgq>n{&MLGqK%Xpn`8qCTW^Y-6!v?4%*pF`XAQ8J6y{W1yFs2hy&f_ zot>mtS68g8SvuqFiQl^(Z~DBXzqflhABOtAJQskUoD~!pbd8Kot8QCfmGG0_v=nZH$L(gLAGu2w5r$A$~3kE(+Tl-wb2em7Q zxRU>)=Hxw;k&sX)1XQMHZU+IgDu1VN5$jR5sAvym(IE|v+@=aFVPNqQg*a_fUh8jE z$qLk0tmKrGM!?dR2wCmZT6n}BzHJoy6*_h^Bue^^mpPFda4rX)t0o^%QX}ed_bcZE z;`D&*=fKZ45lr&Yo9-EQb_9oKQgT*Et7~iI81keIoc}G)Y#X`PRX=X8$V>0v88C{# zsCH$RI4siom>BQCLgzP4sVB@dLc%SOxvK3)_`O!I26AZ*{tReOFz;9FkNGC8VZ z74q=(R8o0F@?lg@FRCVsDxXtLOeiB77|;?_Q0U2jT_qamnTB64%HJ@ME6yn5(morN zVCNEID(F=%4Me%v*48({n-YhJiuDW{vs{=Y)ZA{53&a%mkxP&OQuMRz%hoP4C3@IW z@q@6jaXocHlKugM`(JC-KVA~_g7D2CHkR=>M=twub&;TW-=8<$-)6Sff1i{@yw&X& zwqMBYh%?Q0&h$HY!k*rfoA`*Y5r=u9MKJwavpr4x>AG6`)y&N4bu!D66+*1F_0b^N z;=IEI9U$Xn%$xwOL?*XgL779u=dF{$B6}kM z&ns-r>`3vD3l9_65G|VlrD=y^3g^c9iG~PeIb9G&(Mi$nvSOGl*Ta1K&mVQGb-+8C zXJZKB1+3ACDdmUnZ%AHhCyV{|)WpNHTCZ5<`00L|{e+?&Hs?g1`y5h|1Cy5}+uhC`k+k{R{1!oFvrM z7a~QH?yn&q+65pK`fzo<*j@_XpXVOujsM$^7pMengd9EgId6#sYJ8Z`!SNk762YPR zBO%UCh!JNM!zC*VJi}&@Oc6G=fYHEAnZ$Mv*lf!o;dYF}+ow3H7qEtU8Zko8Lbn~` zNwtVfTg_ zk7kpS`ZvZfD}0pP1rt_l8zD>69`HSCSL>Ub_hWTdXX2^Qwe(-iFW6~ViBIr9uNVQO ztpCA!I}!57IetK_p}!Ag<75}hrQou_E^4yTOAZtQpI8C!xrzls8wzQN(!+LYvy#C5 zI`{@%9K*5wyX%~Xf#E+VeitzBggm0=qj9KYuG-3jx%Kj1C4wP|sF~)%c&t67>#j$p?XH+n0HR__bd@ytA4O-ufUv76lj~z zD3$pvyXQ4bFQWXj{Zl+e5F`ZCvI(K1t+2#suoh65B@A$tm4xgrj#0bFIeS%BktUCROoZsr$P> z``ss~4_iFJ3GS5+Nm+{HRM6(J3Xoa;5&-1{bp6pP@U z@f;GGptSGz)6|iCOtXv40Jk7=BSVvKlMhmWj1AQn$_BM&5XL2CMTzI+aJDuva-mEd z6PoY9AGhaCp@qC!)y{h0nl`(;L4f%A1>%ykxe{Zskx)@PmCmlmu|*L&pXRD|MP57K z|LOJ#kaU z$5DX9U#_5<#bDT|Os3?=N~1%T7JIFO&N6=tN=J+&w_1HP>6BP>|C>-Ne%(ocTvR8O zw`lbwWHxm05H!IXBC1?fG_7VjQGhCd()_8gL?4QW1$@QgfP3Qraxf7|M$*yZ%uHZk zp9C)-|Jb3UEYoKF!&}>xE+&v%eS1Ab)qSs=a)`FCOCAxq$74}GGST-bvAs0$-`j7r zhg$o2T3IFKl=9{I&j*lN+_cbtggDziihJ# zk9&9ho@X-K@BXs3xR_=(6+vD36+w!I18_ZtV88QwSvvE{N9axP^MMT=Y%KKk2NoZu zm}ZFqV5vxnGijf^wED1k2HD?*T*HY1hWe>4^yc=`531!8y)VW@{4fYQUp_ys_uzE` zz~TQnG{`ORrfSkqhFhD8JmeOdpYx<$8*3gb!507(S2kR?`j!g9DK-Bii(-mVr8b^=JW>t z+t0U)sGid`odA2<5X}z#{lO1&xM<3vdZkzO-`Z3TXJV3w1Ur@jfN3mjj;1BDtoJlcjMivPV7iI;wXVFUxj3`l_`^@0S5PhiE zv3Hz!_iO;wr33%m8ZuHLfi|==gA-2m6~*nm)aKbd>`E9O%AsVwVncBw@ypI$liT+N z>HPZO<+*X`(KA<}-XQY!{Qgpk`tG#QykzlrqBSb@&){EC#Caa*I*FU}lsR&4Zk(J` zyy5^Stdyj#Tqg(!8HfkCM5^v071p9KnN z3m?z^C6AtJ;+dbJ`o`7xxFax&E`IuX0SI*L*zyT;Xj{7g@1T7ztb1=cHyhgI0|2z1W0Wj11muD zMKjQuu~LVNf`Sr;O7|=E>K{h(gLLTD=WwS>EtnN*nAzyX1Yz!3&|o#hUgHY#>L2jg z{TLF$3L!F#{zF4fh#{kY6XntUk>@cZ_`?X`a>SgI;1K%&0~dj&kEv<6Qxi${ zZvY6^TpO|DnSSjz`KBBt3h=xIZC347jx=SJm2b$0Bv7W z`%7bs{852OIH!{cbSBTQT)POlJ+!Lp9ZH>L3QY47R4yM}HnTik?e6QJrkBPwo{l5{ z7w!prrGpk8?rzU|6u}u!-)7B_O*J*U7<8HW4j-=+wkB)};WvpKvKj;~=4*6+#1xr1 za_VjhU_kC;(ODFO@cQs_e(`p54?4h5p!F`#Jta8o(}Ew2iF#JYYi(S8ME(5vEr* zChdhBkx5f*m>AfDEU)EpUi+;^IIjCf#`P=dWu$$S*-xM=PRY~2# zIXMbsu%q*K7DZx0g8fipdM1u=j6`-Neov|sEDi!0E|dqe-=OB{`b)DNXHz5j<{w%# z0@g|s1`dv8>~Pi)H$Q6|B+bt>iRAQbC}85X%Z^KOx1x7zH7C4~Ph}9n>VkeQ*WB=V%7hj1rT|@?qrHjZ)F1OY(LhIxJhmG)*);$ z3T}o-^&vI^!GgW6cGL43Y4G%SLmj{?W(Ht=@(i^xpccX^qHHRI7RIdC1E@1jN~JLYz>`J`NqZdLo$(VHnDk;HH>A{kE55ygN# zu=W=#W^yzWoYw_=P!XGpyMmOdxOm`JF;c0lMuSYP_Kmc$Kj*9dPjlz9qbv+29C6%rcq= zw+l6rTtRh77@e&R_X+$LGYT*uN;e8uRsk49jBnt<`)3luKVgD^R$9wp=6{WnZl?~V z2PIe#;Q+3KLJ@62qFlO90u{ntcg<&9ZeM0;MpYyyMZ?)`Uce@?`|7zk%HC~TPAB&H z6aC%!8mzw>aGT1gdA#{s>jvvFm(Npx-$Gxk!DD4$aKF9UwD>>Di)$Fo z?TRuiItu@|Lq=l4f!AcgQ^RE8pL}w)g}2Kc57S~mxkLY9bJ>0SST_p?RZ|<*T9tdI zVB@QfUzC*?NZ}Qkqlo;Fn24fB)EwdgAmHTm#H0kfV#YEz#Tvuvms@z;<}JA5V15J! zu3==P^Z(23<1tOzj51epxmXlX5PPb{;NKbKt|FVgp<+hThNyl!w>b(3dHwHUgsY2nCSX6y%edfoxVNTcByg+IsAi#S3y-fWKyTJjJ9% zr7jD|_t~!$ik2E!7}n|cd@iA<;}GIqJGv24HfZHj40IVT;3GbM-15EVl&hr2JO>8G z&$x>AAtEUeXp!jJ!Yo>Ga&z^(w==ME*5$z~@Dm?$^N=UP5Adfjs65xHP?Z)NUUa-_ zw7U=kvc8nGbpBkFH~~gb1HoC$4yc8^sS=>F_J4^d6if)QZ&$?O8k znV!G=A|mMOZEf1Do%T0$5sL580an%Yue=l7@mEN@9_3vUt4dQ5EZ2{2x$Q%>f~_cr zeulVsi5ElFXjV?fX>mX(q+2+sZvh%EaYZub1(Hm}Y%~;`!U+B#Tmmg`jgbdANybe^ z@GkMAv-#&JGNh}$+-kfI-sU6@h%FrJ03H1l8Umn}wZXsp1~Qn7{^h|DaD#X9gnY`% z?wDnNW%GH+)#-Hcl0K5?@}&O?T;%?(RlFx>Hg@x*J4FLb^kwq`Q&s?nX+wySuylTc7WG`OR`Id(S;H=ggUz zJvG;~l%G%}BzD@0!>%nY&EUM-%@2-ff53Dv&-=c%1Dz{TExb6pI01X3 z8L6|xUcZ4ueBsxN{<*hDm$!avySezfYEHi!o4y)MEy~Ga2*EK57|+cvx0DRu%R|02 z0iR?XoBp*nh;a2!pnMT0^UA^Fm`Cz>-{LM7Dud{#qIfU7HYrU=;&Q$~IvXAw(F!@| z^vzvwORfty7?0hcETY~$XSQuN*+@)bCsgr1jqODL(Dv`%#Q_d_5JFQTuSCAN*;dk= zlBVY9%NJkSd|C`>r$l)|y*BbH9IbstNQ$s!c(T?}MAnL^VPbRT(H&9pz z)l(-6Kg4cp;4`}HX!j9ijWM%5ikNBg*P+#eEio)r%~d*jXmHvf*p)y|N^J5cIv#YH z&|T3xq0=jx0YCZ?&X-5-Th!InHnm3BY6(h8zh&5nrn$TE!L07Cy7z+^Y2h zt72ie%%{+mp3P6%biOq|#)SE zy6r&e)V~t9*@$BcE?Lyf9dM7B^U#>d@tV9_|#$aox(Ko-EGt zmSMYf5mhte1vB!EF+^s0#1|X~>S$mTYyih0?LUj%@&1$FjjJIf4jgH#lAFa+fIDyh zn9ayG2Nur^qbl}q2c!Keo<8?^V>ezw*aJZ$BJE3B@x#ZcQ`KR$Yodw4wYbmf6c*a2b^Ziwa4K7uDGnV}jkd}9;i zsyQ#X6L00%JLq0)wR01_Fy>q;djI-Yhsu6umY>?0$rm3htkURJEjc|aDu+F7eFD_1 zI}|6`LSXR1~Q2{RJ$-i|uq5lGvubC{(GvhrG0HxpSTFQi#1u_bqgk&4nK zMA__D{3glN-=o#~>IVrtnqOSgk`hah4Or%1lG|vNOGBN=2ZzKM&&`h5tyZA|pLOB_ zvL_wxT|IJ&Hh7okDt>lr8+Vryk%%;^B1V>dtF>r%a0Sqn=}}G>A#|3gBY>>WbdR=c zO*XH4!f$Sa^_^l6X>g4W6MGkmZ@U^{L+Zqu*TWP1EeoD)r}9+IVf{BxS!WApA7mON z5juv|RuNto_p_vz?wD~X=1F4?10R0qi=r~+4d)`QcwaxvVFVAYxQ#Bi}f(ZAZ> zec?u~2s0^QahPp$jOMgaku;yJaj+S#A|M_+vXILi61!wHH}>&x5SO^}|U_@4kxnJ2;gU$1Dr z{a(JkOZ!iSl7O!%9PsT5NL@@8rhELb@4iUA!2wcGqcPt;Z}t32G}~pJo{9Ks0bOt7 z9Dr05?xn9Ey!`BW50~Lzl#CDCvRD~%?7d&B{Snkh->~tQuATKhEHta3aInXj`f=H; zG}jHx%s34OnfwMuDW5MAGw+@+=QO-}jk2mPL}_C}sPrTNl2mWe~j z&rj%GFxol&>t2E7`-+GGVU|;lCdHBzW8NaT3sa0m;!2 zBl@|^iuElvSz4aqOcYQ$Q2p&V>A*KL8C)zH#GniKG*nPQM)Twqqi}mX%=hOd7ZIYM zF{5au%?r~Mm@_o*=98E#*dqob@uJB6;|HNIuy!D1DuALO4OA4C@APO>2f~P!OxSIu zpLzzwmu4&0d7vs-60@Ugso?)q41z%>^YiYOsCjhLCPx2iZTeR;W5A;Y4QwO)W~Eo< z{q_Nz2ht3wm7EMF>H)mGM~uu2xjKtxMIXMN5dJs|L_P4?i;2Uly+hvY@p#A1@t(Zi z+R(7`c{%xei|;{zJ+3tC6_LiS z&bG1K@6Mt-;hp)oWIO^pm~~JKX;X(ZvT4P{(i3}3q50$CS$;(7 z@6=U5VlPJU13O!A=9pYTOU|@l9;ZL{bSexDAMy94c`&w}B zj&M5)m$C8?@CGH4=(#|eF?78EV|Q#RlmA~4 z<-32lU&VtKgtx(;LZgB$j#zfaf$Y;D!>gZ8r7ETn4p*1J?-1`fUMQyO>K|}sDzhto zg+X_`w5uupj@vkiopW=Uw{jzqs8Uu^xcx%!8SV*~Mn?8ks7{Cno7Kg&Ua6KEOA9}P zNC0AUfm1gLK2Xf>#p8C|I}@vg`dHJJzpx|eS2PG-cFHa5?=G7`H%LbrqfqF~ga zRXhkA(czZqhr1lYLAvel2?RfSB4Jzy03v=IO;#|~K=B7y1Q!^?KvBpMe~DT}>eKF5 zoA;ywfbqvx*dqEO)2t6w^vuHpA633HI-e{Cmgn!e#-%}?iDx)Am{jJ#RE5x=^Sj4= z`FRVn$sgDW%@s4}2=MW>AVs{yy_!@R(v@jz$05CtE+RW#nNBKR57u1L-p1%IvU)D3 zv;3UWWyz9r-El4ZI_FH-p6iKEKU#7Ztzp1J|I&}VyfH!Q1gm*z30yKzbMuQ4u`J{g z|2ou9pds#KkF84$1ck3{TO!d>FTt8DMR#{)Z}>oI2}rIg7$LNRqYu(;zywf!qzu0G zlK!s8>Wl0UFki4&$0Vr7=jBdAWJ*VqTN68F&EkP!ZDUh47(Q&iJ)T!guYOvLalasPj7%*|*%|-pQ-oA>>$n}l3 zoRU=XK7jRjsT%#$TolvzZwTo;WunD4%=%lDdVrOcXPf{Xz3P6vOI#(i92aq2Ct~RB zg7tZ_W6cHsj2#;pZ{fK+xW`lE6XLPk_#2dBTVov`u?9eb@h))(V3j#?bcL-Kh!h4{ijLf6MQVx@(~g}u8T$ORUFch@$~mWIO0oioYPB+U za1!m4{?KEFXl&P6Yk~2i(hd^(@z-u2n<6#o&+AccJBP|{^-1Jn@mb$~go|_I1Fg(_ z+Vz7gn)@d>-~KIfun0?JU0S)rO71ghSr?3g@Q0zLSF_`d?xMz?GnZUc^Q@7Gng13u zvp{*kcD0p$t=>%MCSN`^e;7uW&UXzn4GC#V_jRta!|hC%f+=WZSRDm#zGp}x-_q-m z#8R}iu}+(~Y%b^Hl7jW2_kW#Zw3zq=jRcJ##`&#WWPvIV^2wmwpmQb~z1@X-hMbod z0US;-i8}1*>+qx2{JRm6Wy&Bz|6J?jgpROY>Pm|#4n@TGB;;E(po~lnQeX_btbzX+nPlmNW+!4U zoOciwe62@RNgsZbV`VSAl^06xM6JFO3?O&VYCB~hvfF8$>w?dmJ6 zbMO5`Sbp?Lh1hs=YkfmV6iP#Hs7ldfERat5Bgh47?sQ`K4rO3kY{H>TNMu#CT*)&Z z)S(l=HoMG}m$$931-wHcV;~Fg&3czTd?jE`vz=yj6B*A4 z;iRbM5$2&Gg#OSS=zXN~NnPm3Yi-YKRgY#ZyiC!a`gO9Ldr3pQyTxN2@%0@_kY@|r zH}h+OYYfyQLc0rjxa1IeQ|WI>$lY@q8h7i1E+#fM$n0UC!08*DnCg20vct^GlrK4B z&f%fei$>qdb@jv~w9v&|Li059&Iza3b`v$C>c3z1l?ius&CW83C^L<9pCgB#pLJ8c ziuWCoNceEZo1LS3Y&s%hrdJG)W$k|BWKIj`Vhjx8%UFLXfygzJHMFutP062_UHyqQ z&`-wuPVI(s*3i=ke^Rl2rhUwkp^{01;!fl3tI%3^aSVO9q{-6(ZDzIYK-$cVnk}%! ze`l7A^l%5YdG&VH;Krpe`iAF5|3D=grJJK4*4(1TW48`KMzCeWJRD-Aq@>#IZX>|k zB#Axj9|_5oGT8IdW6#e1lFqwOz`und4V>>qXRR~G3x~xE$GU&EdEyMvM@0i%f`oGv z3Sbh4U@X|CVCBUNruNDg4{mDUVJqtp03X zA~Ms^1emyg&6r*Z4DUpwHA$+?Rmkb&Mc-5M0(tEgIe3 zp#WHYM?-5%f<%ni&aDp}Pl_bV5JBCd*Ag_}e@_)&RF=agmeX`CTDBAxSX3evP8GeN>ZwU(L?GLG{J*z+}ay&|}hHw`kfri0izT zB$6+KQTXNN%(0YMTgOA^lai*bk=9@QW=Savto?@NoT?I>X zhJoE3+6ih$S|0?^J4ivGt!@7}jenoq17{*gjHkIGW~@w*)+3Zfj~Myw1r@Im5?UhT zMSbq&4kCudw+tM>NmHGssV}a58?F~Bj!0!(EyUGQvfS|i^ZatVaSoH8Un#&D8WFAD zlNJ^@_uCE-Iosk-(vPL&)PW^5cNymhZ?1TQql*b^ER7t_4qL1c>i5e+Ya|t_;^sDl zYxESd?tL1L&g&c`P%4s>{hSlGW#mK+`FuxC_4A-9h4@rzX=tv|RfvRyhQFx1nPIq` zF*%+sPIeh7D3QU#NmjfHnNgrmX_qg8?$a&&b36p=CX5 z&TsqTH|Rjbhg5!$^8bWF-#dR^-ScRx6NIuj3)LuLpfWd2RhcTA>7Ad%uMhkPD@fw` z!0YMNYJV-D@_kJ+NkaUI{o@bP{`M^;AgTGdq{xk`K$lzUF;W&B$e~ECH&~c*qs@7` z@(ih;kzsfFumSm=IT0=}JD}|iQpf0UrR8p! zvb$SG-Hm(o>D|aly0o0EUuwuR0g_OVm?HU2PULOcv-75z3b8xv&!}o~3IhXY%+Rv; zHOci0$|IkC1w;3lnR+?}m;H%*zZkICKx&MIEAM&nuQL>Vew$Afu*e+?X`&j_q`+G zE}NjEm?q@C{ad=?jnRaL!)oL_?kXA$imk1&;h%VFG#a`4+s7T29okSPS_N~(_APXz z=s}QGW4Wxe)(lEY`k^%&OZr*IAMfwk(e3UQ%uxYCLc;GmJ3Ax@2nZ^oL8}SBbl}g= zh~OwIoW;IWzIE=Spej*JBjn3GSn6{<7YA zZ^3%zqph8Ac7&q*I!XJAeAucz;|*d*yu-W$!Is6cjvfw zHjFlg$b-a;MNHO5zH6#x;Uw9Ub9%6{?#4J8{8f4ineFe|gM9g>HPy^H__Z_Ef2^vp zXz8ZY`rBz6QkZ&~WPcb*uBmDA&h7j7!1>Q~4I{P4?y9TLlpo7Sd7NyP6lyFyNu8a3{BooF#G5!nnzl1h59FN;`$N1q>VGRbezHilU)orb7DD(x%9NGKd$g9cL9MOek_07jc!7DyFU2vk zmFa-N`VF4rV^KYW1#Cg6UjZsxgo5C3wB96rP2+s~q(`k1+ZP1ph$Zh#h6g^!W>RJ$ zKa7jkz%b&QSi7XyCPAV{6;t{`&0p6FsB>Zc7_} z+}}m)GU$yB>-~$9zDSQ&;#}U_N$2IE>}y__{SZ+GJtV^;BH?9t+bRt}Mol?&OgOJ< zj}%r?va6cMTeh|BTNro3y>tkUUxi1N8kfn>|FEncIl7uCEjQrX1~;WMuj`D-n0mh%KCb6URJ&cn62Vln(u4to_O z;nTI7u(-VVhv)tc{q);6p47CaHgzZLY{m4SZ$>nsL|<(`N}2DG=sql=HMLM2JMoyg z|4$1*A@2P>Uj}0$I{M$&4WMHq>AdBLh+9@1-qwhHgSmfRDgUHK4a0NUM^{W+Rwnmp zj1WcPm;>c@=kr&aI;&DO37J>!Vuua{*Z>GGdDL@vca(tzwwl7?mRFK58r)G-piA{~ zzdH#zzftQYBnaHdUJAe-hzlD ze9Rs2*1=Tv4wYB&Bc1Yb0%yfgxhP!NN zlUnG_%kV&SQk#fWv-UVYU*Phxz}3flzk(aQw6vPnZHf*uZ^;C*{03qQ$_B-Pj)aySv12^`VVHD&=^J*ml6jzwPAKwV_h>I zn>RH$`F*K1C(YM|+l*0Xc6y7vp@*r&X*46CC0>!QU#w~$WmRzhk^6!o3@smy93069 z;}Yxl!_x@%j%1c{!;^_f9zP|%NNJk0ft+`P?RZ51NK(x@8H>({kwXd;(*QK}^+`O= z*Zn*)n8xbM%4`y4hcFhZZH! zF8Rb-)A-TU^V%wA2p3IGerpU?hY^A}@r520;E?6jQ*sRB^V~;^NDtcsI!$eZe&^-H zN=wW6*PKD10FJASQ;JMw(FbmCB9}HlhP7dQxX#@?d-OWGV1SuE20b;;FhpUjkHo)1 z-wdZku)d1#%=!4&YY&&8WGFzxtRlSqmH zyjSb}iQSYY-Em{5ruS?0S$CRNj zvcq|bN!ih&^mTb;ZdbIXpDlW-s|)7$h`2>Y*aAB5kA$Ek>>8w3qnNf%C>~#sJBJZq9{@Mj&ghaDVCHEp~BlM<%m5r3=P)XFzGITPiXH>BEQG zyWgKtfNL%x)_1=YF%Dt~bL-k-A0Dzq*Q>Xu(yhAIbmS_Fw@48)z92zN{5qFx$@}PL zfuKN&!sX#tj7?ZrSp4xgoyhS^^PLw;N)i~My!;h4&jRC}qq`QqTr zpO+{iD&L~Hy16*yh>A_OF~Jc6sMRi`=%}^coxhm+IgUvi3DG$@IeE2s`>llNfHp25 zpc@_7_ng&QYREkwe%j`KaudjSFF)ltlYU4u*%c6>C>sF-ZVYNrR#oEk=6YRJ?(Fil z0>GuI)ke0qXN@)Z9xSXSk^$lKnLIw!8x+9TI&C)@vl~a%V>74EpFcwb!^5Mkp7R%f zm<2ysI@&ugpaLT!BjH;PW$D+kYs8y&JhL3~gti*$9G7VV>CDu$K~TPuIa=?Fnrqw{ z4qIQxqq~D#O3l*go4UR`I$p#0KFI5Zbr2fgf&*zy?2O$H{?ygNfN#PI;1QB~tWI;& z37l-y7}T&{bhXw#Pp>b|6Et(Zqio{#-Z8crc?VJIp*fee4&Q|D#+?oC?>q5T6*n#p z2b#FStIh#)q!+_7Z=8N8thM z4oy#$0l<6u&q&^m;BtZZzn@g!V}yBAVuW~p9j6uD5{BG|JkJ@VZX#m7G<6FC!=Kv2 z4=Ne?$-3Mtz>t-o9x)8DKaxbSSjd8+qqn#BG;|QLxoGcz-RDJcXa4ai1b254bD&Cr++2abGh z-lDJDAj(iAi+1>PU(qVECFB|+XopUGHgHBrg!gUGqtjAb4yk%TkBd`Q+0lKeLaiK z&CfsI!bC-7s$8bi<84~|JPcM8El!i^^z!=hIiO(viVAr#6ZVC0yb)?0ToeH^<5Y=5 zbr5)eDB#6XW705CeL>t_tkdu<92ySph*Ci^4e*_*n>jt?pYi{7{cdn#;(`unJ@$Dh zEGZdcQB0uSy?TfMKC9?VWz7~2#W`@KuFs|X-V9MWJYVZa90 z+QKrsoW;_kM1V9jIGa5F0p>x4Rv~Sk56hDd1Hehd2?Bo)#)95L5^RKm0>&3+7C3l# z_LFFbmd3U&hFQ>n<0<7S3c2lq#&{nqu1(V)xBJmKMnGk4Er+I-8vS4CG1lfr){l$- z9^~SZ%%v&tMoZsyu6OPcOFw?f?CIM*ITdtKI$X^3+2)C?wD< zSNd`|cD3cmsekqFA63v|9sp^*%*;8MUV7W)cWrKR>^qlamvQWK|l_2o!)TJ6jtY`>CnP90Y$d zN51sxtgLk>P0ji1=x(WUC||MPn&4aL$STOH^YQb0yp3@0O8Ivge#XYZjvx~D)^$7H zuVM#}p_M~dO^sSwL3XyWsf8HYx4az8vD<}cEy}0Yur4ND&Q`n%rw)i*qB5(qDh>HK zI8=R(=c`z!w8i7q;??P8=(TZiale%9>5aU+ytE2v>GR0Mc%;Iu`YkLhye=+kXHZFP zer2q^0elCr-Ny9Kj=cP~c996rUbKOI*VzdULBaP?rk@m|s0Q*Z7BzL1mv>H2%bQ&{ zjKMREAAH!1F?Q0GTW;>?@WBIqMMOAra&huWQ(<`gvj+gQX)9eFotnYX!3Z*$7%Pen z5*8K~_ULk!;f-%j)T76r5q%5_XDo+XPbIFxgmUxqy9N^`%H(cba$a_=^;Mgw#Jln_k>QF5S<7D$bT)FR31IMX09hsS=#NZDEV0C0w z@#)j2klHwo_|()T832!j#Cvji@|bcYK4t2^2f4VpoA3|tt+l1pRCPJ*w*N*iRE}55 z0iPM-OQ`dx88tA=i&vJHZ&#tGp()Kcc0mvOBj{&IB(We4GH`Tsgc%yubzEKE$tx98`d(Aq8~#?j*~o&I$JHd^aEd#(o*7wd`|^H^jOLQ6|)P+wb1^n9NaIU}ZH^mp`1i$VlR2ru|!HnpPS z7)G?_HKAfv0gEVxl*RZPN~a*8bN0w>Vq&7Wh6ZkILQFyk05NaV z36y-rr^S^z+}Q~u03ehb30EW#%xzMZ;*z+|y^z^@e0&^z3})yc>!2kgGraG)z{CeC zo0^K~=-+F#x$hK%HkAqZg8knQs2fO5hK9aE?$?EnnuQ=^H%mJ>G+5MA5@HFy99k!p z>He|fVC;_Daj+|?Ed#e+O-)U=bPUxy*Z}a)`_QqHMe$*~g;IBfTrTZ68XITJ9@7g! z1K|BsZ1HF*yE1hn*JYlI1{1w2w}LMf}Hak0; zYu^20`dZc2%d5>q!5Jm7E$Cm$h8c_bC+#?mH9QO`x$=HwT8+f)$HO{tmq&}`*ohF>YSCuk8WBB*?%HZysTzIk(bL$ zMW(BwPE2HZ5yO!F4qYUg3kV260^lABri3+S7g<@^l<)TT3sS!G4OgBxkhSXpfznj& z^f+N}K8jU)oY4h;C#dotP&xL4fNQ{T&yYJIJ{kK{6m(?%S1&LZKvGmx1b1ghK>8{d z5xr+%$i~3L*Z~*q(LxwH7*`jy|6Y}#h~}xbNYBsD?^}4#dX0DtzEyuMTZMu{`IRZ; zq>TtL)X6F-YqNcSnA|a|O5}kAXlQ687Z;b_k@{o)>geeBAiyL*0Bj>Zs9IPQk-uK* zh{0;eMDzrPyB-}Ll7Ozb*&MvACs=GmJa)dJp`nOya@oPv%DSN)wFlH+W)FR4)@CnC z12SocuJ#<7Q1Ty*u0S(`Q-Ts8a?mscvsx&i&8tljbOa}6$_w5kk+fKiFP8{*gAaI( z>S9q;A-XcB=rL4fUsLiK7#K6`c!)yFY^*p^X8iy7&jbetbJpt%fI(P8N5{%TaElK- z$n-J3RPdj$&TE>aq@gg&k=EOs>Cpr}m&{mU_rkQEn@FKqvnAu59sQXqS2%Aka5&!!DxAS*`G8))| zdEC)3C?^s2_GDruVh#G-OLN@3aNSE! zPv0Rs|B-(%B|$AA$jr?AjI_t{5%_m_j7$vEy7G<9?BJn9W?S&IenQev*x2sv4qUc^&`Ap&Uc`g`HRfJC_~(OXJF#Je zs~(tM(=IKtHPB?Ddyic|j$waV{nbkX3xrfrNble5G9Wl*0cmU!EaM;*jW@=CdW;S_b+Wvx_iM`f5& z;%VXv>@=9MECyLcH}n{>F&ADsKVbDy$;kI8uQI{elOjqS##2Yhp$v+S`{e>% zeu_v(XQ}eXj~_fK`FpB544K)R6t8)o61SO*Mp%X$Rw~-gl48?MKqm4GhSdg$Rf$zs z4smSBSJItl#tA7fHa5uxvL?PxgGW;XZo9vFeR>{)>O5XPmL3TpX#1CMfY?bCjSK)) z9q+NQaK4WAXRMvy-I-6d>4nROM_`2XM1;F$atIbBr>A4@$vTMh5TPW30Ki++J2Ej5 zml%@}6M^-kwyJJ!=zmArAfH>Ns8eRDoE$v1=K+Yw%gYC-m#CTNn(JnNwT!wK*|qNQ zzG*IN%USW0znkQc*U-@5*1GtS@uzKdSrHz&AC_q1+g!yH=UpaPnfyNF4?et&yR8@$ z6gbo^)}0L@x#IEm>SZM9{xbucr_J>>`(bA&@z$-n6-pOHLwbtCt7X%fF{m4YP$FeE zh1Z)-#BrX3&BD2oH2i&8qXREQx&E4>TT6YjKN5mQ*UpCtB{O&$eGdCI(Ao?Bbu$5kLErwPrr7JfRe@uH@t z{^v0hq5R2y%}1cU8314hiqqZQjj(vYHywTLRiC}lbnykP1+Lv%1r775{r$plIR<`9 z9Jn|f;qUg&$sKkVV$1-ziJ=$?#E)ZXyfu!7Z+=$*D>pZ{nu7H2GJQ8(vbrN40lnPb68nznd4X8&UEiL_I3%A8hijjD}>VwskloVR` zfQ;`S=$|?}_q;sXdNbc)^&>L>v0=~fxI5!yz(Vv^a8}3-d5-&salp-tM@B|QdqBQ? zesOVVW=e{soxME*kVIgsXb|}_%9R{C82SZ}R{SJv6-p7`aA_-_4v(~ih%9^x3Dk5~ zoEQFvNMzCT4|>zNOmi+tqXMzUS0#eu|1shG`$i0a$Odq0*spqD;S}M9PCX zY1tXJL!R!oGwbu@l#@2O_*+0fhQedT(8 zUp%8m0-%~Aghxc==v3*%Bksq?E+BBs$-~oVKod{AqBP}dX=^L&^KiK%2juEk%;8|+ z{F0LV$P5bylL;z7cJhi+775gxzi`cgpPdZ2ZaY4@ySU{&2A8gz&mjWhl;X?a_PoIW z$bcm6(P6nYaK#9*oER+2zdfrypfqVc{U6xdaTo~|0e#zQ{E!9(P($(A9?bG23`Me% zrH=>?o7}1eXc-w9(L19ub(y)p=#3deOLOF%9vt8!q9O^mYTWtuULV)Sb7%~jOto>= zaUwee>PE$;W6D@?Qo%#s1Il&6Lh$qBe2vkT07$yz?l|y*))7Jm?{C72rwV$49P%#m zP?hKcW5CeK#;FuMvqUf(vv>I}49z<6y}t&#CNT`qkn)jP>V-wO0>W&*Qa3k^Sfr>E-hKTw9d+nWVv1sP&$o@KT=Jgtx_XjM^2ivQ#$Xwo zZKi}hwsCF#ht;0R#&Iv+Y{l5v`fEg^9`5I{I6OT?K|=Jjn!omtvin@= z*S{qJ*?D|yZ7XjR&U)oeV=LA3w0?6m_vAp`WxbSTGad#U2oi?(h zfg}0pSF~0^T_epjXyDhKLr0_U6IM4Ki10X$rYEPC zuKsZ{Iw_1d|6K2f8Hbc6qVo4vZut{m)opjyv_pb}HCM<(_e;vkc0kBW_&eN=6yV_G z=2VcEM{kN*mX2-ytO4>!n}^56Aig4%MeE5Rgc|24BZvP}d}^fEJvkXuSJXF@LnoVR z5Vb~Fd;d(=Y2(QMW@grxez;n7QMHF0j$9u@6cXF?O-*!y8LI-D6B|WeNg{Yx$oVO{&*f3JYU*m2^4^(n5Ls_#Z(HVL87D&n zqxQJ)&|>uo;!1H&?%K@@XY3#Zq+w#RHVLAz%gWFH85^J6TUA$w3?%7SUR>CNWWXN; z|H^!jZ1HYs6*YWMR!*ZU4-u>MNQP)N#Xe;cI~7|GLOdf7;+3A|(L;tVxz1F9AL2sv zo4KQtRoJ-AH(%Q$XkmRTC>-Dwjv|nPE zV_f`TPo$O;%tCeawg z0j_~}((vr;>@Cki|LmvMsrEtEfr?p-oHDh=;QL#MddZ4~bJ;M<-%Jz)1TB-)efhqH zzr({+#6(1p5c#;JZ%)FBV8En>|C0bRvS5c6B}$@r)$W#ioBrJ7BHMF&`Q6gLGo~Ji zC)ov4=u*)?3K(SR9|=8Ldr9$om?5EkM+V68u3`U-tk@)i&1Xh_UkcXthL4Abnw$B& z6%-<37tUg3h?jO{9lD)UPQ44i$>zT?$iT(o~rj~_uY zj8!|^vNOND{5-p2Thx)MG8_qgBo#^01ohu7^5$rKXdZz`3Xm~{0%Buh6+DH6?gmmc;tx<)odHQ{4wf_M!d#&S^e*E@S=|p`zl$Vgdq==!_I^{9j+CH9l*y z5}~7Ch_OtV!iX#W_a+*;GE z=LNc!m#!c%|8jjGl2_D;PKq;Dx2#{K?>?SHRPYIdRIQln{_5Hx9twgcQr}*KKA(0N z9M3FP&SUN*Apl6pZ$d&s@`IN6F`1i;6$#wyD6dyY0RYmv%tukx9!g1)!~!V1%&Gi* znz!R&Yq;N^_u-RtaEPjFYQ#Z$RTJC5&@gLrIGMea!mhQtdNL^^;hSlo&_8hfq|f$c z4&+nNf7v^OlY{F92ZuvpI%ke<9ziC=Z#?IB7)YrHwOa(7;amHdw3L;V`B6itG`p}J z%EcvE>#Q?K`XIdcLU+39j29>2alDL|o~{H(L~xaOB!VvQY;Jk)i@BN3$@P<|N`L9m zCwm$D)UdFy49*s=vN{3}W@js(&Mt9~E5FB(2f={*djw{Xb8FFvC<>Iw-Shroo0?dp zT;x5RdeJ5_bu9!CgK2%I|J}RTvL(i;0$)KP0Rbk~8=RlMe~i%JAu35l;C;`iYm?KG ztldFsj**sM>Z`f!9yIGgDX1{Tm5JCsFYn6p_6{v%S6T|~tX8(swp>goDLF#$twIM$ z3*#4|bkH@Qu9Yk-E^gMe`M?Hrfvm0ongfq1IS11Ag2g;im3Gh*@_dl{H2{44fE zPoVd=whGK%{%Y5=Z^^(-tYmlle1`` zDD}9IPKEMXp+m75EDg2mGVgtIpfX4BUsu91V`8R1MMiw5%|qh-%m9pImC^Eetm)kx z-jrwwWmbG@PQZdYPKhlEOTHZ~sK-|JMA zjz3#{u)6JOfJUYlfOkoloFoQ*7EJ^jQT%W~)YAm3aJJP4l1j80@;`e)CCLxAAHH^L zyfPnB88W6^!+S@0>*VC(22$z~JoEf%(7qrG_82mNpkYydjdpZrkpg_nSjqoPw>vmA zG$S(?!?mEKMA=Q5uDF!BDE&Q;q;$>vW$V!cd~fG}sf<4vG?oN@SZJ90%kwjiLWY1F zHn8pRa5z<85DO-%&sF`PHdR&DL3TO9@yyWmYop~}T2Eg)`e=sE>~k3zFK{t((0j9? zzl7PJ(>Jo+P$i_~-J+YBkRn+vn4PYdF3)1n<`_3%`dYf9rRJoD8PxqdHa14>^w2>G4M-&)Pri&yRddKIR~2KKJVm0KETASEL2&P5AbtL<9m912K(uyvqR``&nQ~ zP8Vbb8o)rQ59$nt_ubShpq?aV*X`SBEIWVER&fun*WkL?;;-8^K}g0{*Jeov$e;C;o)CMGBMtY zDH*P5d`^Q?pN^eSIBJJVhEhQ9dj!@SvP8(xAVjue`}kEGi-9bNp1S_* z&cOjMrWY3h}cGhlf$F6i$TTBn@*{=tF$2uP`eJ8z|Yl@P5s z2vDq?Z4`)uh}WQ5R_N=WA{h-BXb5 zF@$Q-S_c3NfOVWe03MWH7HT<@g|Ck~h@P)R(Fz8`Z#MMVwre4gkx z_9v?c?m@y@gNL7=rMIsqA7VIaJ$p0z0ko6y(6$~Wj{Vm=SNb(r6C)*~Gw-(-g8JTW zj#ZiOLbuNZ{0x?#425AOzg}N;^J|l?2Ij3sj671;QIL~&(cNOPLxn#*Ww!6TZ7{?R z{*xbIcG3kl)YlJRK_dTuwcy{jzC+@PtB)31MdTl7`bMt|S%G!4D@w->l8=_|G(VUg zu)Scy^&{h2-%fO}v(9QDylKCD`C{$;w6qp_*RE~j2ZQrm$|@*mGqPcK3vpglR(9j; z?7W*6%7ZN$a0`Jf2v0;N5^OQ!{U4f#O zGiS&8nLTrEe19_Fw4sDiYrj!lJ2Ue2pspd&1rNCHIJ5-|P~Sf^wKqbD=;`Tg{qzhN zO3|xX{SEr<6cGB)@4MC4mZ~PZKCl^V@3fHuuuG}q6H{T+*K+eMAKbHpdbz8L)G4)Y zQP=I7Sodpz0f@vF{#CHQC@Cf7apKzmD%iF$3-!C~{H+><<~W+?v4-EijsCRScE{&| z^$5*&1;aeCZ$DVJuh3=2m5}`CKF)ChDv-6j3c$^E1YfSNuJ{1}%;;+J>%Xvn_@HFM zSX&3{I}jq{X5d500v^dvD}wZ?#l>bxeEP11@8*Gkh*Dg8cC|mW;n~K9Q9W*QT3Rls zDygWb;3aaqImCW{i8hh#7bJzy8}s7P%IU+;qi)OF;YsMIWHDwz2v;`owWqTa@bvPc z=jZ3g0H!TD1;HXZs00Y;Hc~DI^MvW$T^bZ39>aD6up|{%7XDs<$mSWoY%w+80-QD1 z2?{fq?37BTlMHly!9pcZ{$E=!8)6E6Mk07#M6e@(-cg=;-LSLkZWXYF^@H`N5Ni1E z%TyM8{r0W?Xn+4aYUl5=#rQWY(Wb=s_yaz?whml-5B}qzxcs` z0C?Xo`eQL==Yu6C*xM6)oOK;mPOdQMw5Tj8fM4(tc!|Bf(<1FB1AzvDCTc7MXn_S5 z{A@teG-r8v*-fj}y8Y!ZfAPr9&KBF***ODn@95~*oS2vh%1Fxyyj5^ZrPXTfz^MHk z0XX3sM1MS^4x#f;-{V#Mjrf7l9{|Yt_84~h{?pliYb=v40@W#9hGH z*cgn)y^8?#TK!840a{>z1%DU#!yo=&i)}*O^$A|;`L&f%?FUeNf~L774H7g(5}=6> zWWWW3A5i<-37R1B!tE%i?@*2YRQTw6I__7M!_CPN=h7s5TK@w8jYd=V#h<@evk;&K z7Fb}xci{FXagH_wWw&MPu%D(lz7$1y(*!9dDY#H1+%~w*!CYEr#i1wxhc<9X+Q{Y7 zMgpKnE^Q(0dL4pE7(Eve#_-lkWe?|1iV#IMjHUxX4OL8R*aCWrE`OF&tfQ^j} zEH5wb$zA|pU~r&eY;0`OLVy-nV1WgD0h%WM@jw2>Lu9q(Vny=2_>@6pMW{R#8*3Z^ zL3;_U`9e~ocBVk^44WIS0vlU_+WpX)o-ztlDh*}SZ1L^v?Cb%6rYIZjmV!ROTOacE z@%1q3G+dencWQiOh0^vEWg9N1=Wzmii8_J0r;< zXnMCf>3(l7Dmpcr2LKw42IJ%7Z>d7R6BI?$2L0P_4FnUS6Esax20cYu2^T<;@5-%e l0H^_Ab#1lF#l^+?e*r!59D4!FVj} - - -image/svg+xml \ No newline at end of file diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-192.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-192.png deleted file mode 100644 index 2699ab447391d7a1dfb0fceb9f47e30183a731f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11463 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 diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-384.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-384.png deleted file mode 100644 index da964fcb2e387f81a934f2dc669462aa4a6c85ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23850 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 diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-512.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_2_head-512.png deleted file mode 100644 index 6337f5effb4ae653bf2daa4af71df885205dbd72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32300 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-192.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-192.png deleted file mode 100644 index 35b91257fcce7a1664efa2979af2fa4ee4afb97a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13573 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 LNkvXXu0mjfv2Czq diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-256.png b/jhipster-5/bookstore-monolith/src/main/webapp/content/images/jhipster_family_member_3_head-256.png deleted file mode 100644 index 098fd8fb05ae1f40a2ad8cef4547c2cae2adda83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19239 zcmV*pKt{ibP)`1aL%Tg?hqDfhW7Da*(MN$$QSOkJ3DhVvw z_UUuWIr(E2Wq10_otXuJ_j&M;d&@cB&VF;scfKMxPeqPyTR2bo)-@W|3iL`eD}hxS zA_4{g0rUe!Ag5s*$O#zNnu8L3P$S;dLLbnkcyZbNhsS#O>zs9nUJEc=IC970s5XuF zBlJ7bTnAhnY!CXNM!W#x1u6K!xRLzPhWmFp!S?a?;ha`XeIN43D~o?hDC6ff`fec6 zwax`ut$6|=9+SfV_TmSQyweK@jLP5e?xFtuVtCyRRs47p}u-vN#BNw zdEggThQn#KT4}FeYcU`N18AWX+L1zdS}O(eH-Kw;Eo(KD)<027|GncD{%Y;RW2s)t z(+kdO#nd-r4h<~10_0Cg^fe0B30MipsxJw4qG!!0Sre@_j^~XO3eGdW@*bC3KfK}b z%&uO`)eX)%#nks9hhAKAixl$Yx-i*f3$KH?s3XF45XW`N7YZm}9aLIBqzv(wmp+z$ zqt|kEinB&B5B$Q)u$}V%73g0>v#RBWENcSS?GI42uHrZj`9cw2DXrnVX!WO?cVr*! zwOm0n>lIVqhdlDqvR@GBKhUtK-S&hXMmvQdMC%<|Q*cTnsMZ<~k80olcblKczS3*a zf?`%H=CQk%ZS>H8BjAdl+7zaV_Pn5)>nTbp@`VCL#|7|&=1&Ug^zUwc9=F%Bwactj zObz15Jxf1>=Dz{qKpPhVv<|e%UgLNk*<2p26u@)7HDNJ8MMZeLceRn_RRJ!b=@{SSIonAFZ(Nj{#38!I1>%Hu8Zq> zxUL66V;Ba8G?0eGloBZor0n^}R~OIoNM&+>9z)10H*KHX*K3&?p{Jkhk-L|ESi_fl zDZ^g2*(Kj9X(b`nEF

+u_yv@`A>EvKGth_YSGo< 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 DEYbKo diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss b/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss deleted file mode 100644 index be0f226497..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/_bootstrap-variables.scss +++ /dev/null @@ -1,42 +0,0 @@ -/* -* Bootstrap overrides https://getbootstrap.com/docs/4.0/getting-started/theming/ -* All values defined in bootstrap source -* https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss can be overwritten here -* Make sure not to add !default to values here -*/ - -// Colors: -// Grayscale and brand colors for use across Bootstrap. - -$primary: #3e8acc; -$success: #28a745; -$info: #17a2b8; -$warning: #ffc107; -$danger: #dc3545; - -// Options: -// Quickly modify global styling by enabling or disabling optional features. -$enable-rounded: true; -$enable-shadows: false; -$enable-gradients: false; -$enable-transitions: true; -$enable-hover-media-query: false; -$enable-grid-classes: true; -$enable-print-styles: true; - -// Components: -// Define common padding and border radius sizes and more. - -$border-radius: 0.15rem; -$border-radius-lg: 0.125rem; -$border-radius-sm: 0.1rem; - -// Body: -// Settings for the `` element. - -$body-bg: #e4e5e6; - -// Typography: -// Font, line-height, and color for body text, headings, and more. - -$font-size-base: 1rem; diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/global.scss b/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/global.scss deleted file mode 100644 index cfbb9bf5b8..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/global.scss +++ /dev/null @@ -1,226 +0,0 @@ -@import 'bootstrap-variables'; - -/* ============================================================== -Bootstrap tweaks -===============================================================*/ - -body, -h1, -h2, -h3, -h4 { - font-weight: 300; -} - -a { - color: #533f03; - font-weight: bold; -} - -a:hover { - color: #533f03; - font-weight: bold; - /* make sure browsers use the pointer cursor for anchors, even with no href */ - cursor: pointer; -} - -/* ========================================================================== -Browser Upgrade Prompt -========================================================================== */ -.browserupgrade { - margin: 0.2em 0; - background: #ccc; - color: #000; - padding: 0.2em 0; -} - -/* ========================================================================== -Generic styles -========================================================================== */ - -/* Error highlight on input fields */ -.ng-valid[required], -.ng-valid.required { - border-left: 5px solid green; -} - -.ng-invalid:not(form) { - border-left: 5px solid red; -} - -/* other generic styles */ - -.jh-card { - padding: 1.5%; - margin-top: 20px; - border: none; -} - -.error { - color: white; - background-color: red; -} - -.pad { - padding: 10px; -} - -.w-40 { - width: 40% !important; -} - -.w-60 { - width: 60% !important; -} - -.break { - white-space: normal; - word-break: break-all; -} - -.readonly { - background-color: #eee; - opacity: 1; -} - -.footer { - border-top: 1px solid rgba(0, 0, 0, 0.125); -} - -.hand, -[jhisortby] { - cursor: pointer; -} - -/* ========================================================================== -Custom alerts for notification -========================================================================== */ -.alerts { - .alert { - text-overflow: ellipsis; - pre { - background: none; - border: none; - font: inherit; - color: inherit; - padding: 0; - margin: 0; - } - .popover pre { - font-size: 10px; - } - } - .toast { - position: fixed; - width: 100%; - &.left { - left: 5px; - } - &.right { - right: 5px; - } - &.top { - top: 55px; - } - &.bottom { - bottom: 55px; - } - } -} - -@media screen and (min-width: 480px) { - .alerts .toast { - width: 50%; - } -} - -/* ========================================================================== -entity tables helpers -========================================================================== */ - -/* Remove Bootstrap padding from the element -http://stackoverflow.com/questions/19562903/remove-padding-from-columns-in-bootstrap-3 */ -@mixin no-padding($side) { - @if $side == 'all' { - .no-padding { - padding: 0 !important; - } - } @else { - .no-padding-#{$side} { - padding-#{$side}: 0 !important; - } - } -} -@include no-padding('left'); -@include no-padding('right'); -@include no-padding('top'); -@include no-padding('bottom'); -@include no-padding('all'); - -/* bootstrap 3 input-group 100% width -http://stackoverflow.com/questions/23436430/bootstrap-3-input-group-100-width */ -.width-min { - width: 1% !important; -} - -/* Makes toolbar not wrap on smaller screens -http://www.sketchingwithcss.com/samplechapter/cheatsheet.html#right */ -.flex-btn-group-container { - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - flex-direction: row; - -webkit-justify-content: flex-end; - justify-content: flex-end; -} - -/* ========================================================================== -entity detail page css -========================================================================== */ -.row.jh-entity-details > { - dd { - margin-bottom: 15px; - } -} - -@media screen and (min-width: 768px) { - .row.jh-entity-details > { - dt { - margin-bottom: 15px; - } - dd { - border-bottom: 1px solid #eee; - padding-left: 180px; - margin-left: 0; - } - } -} - -/* ========================================================================== -ui bootstrap tweaks -========================================================================== */ -.nav, -.pagination, -.carousel, -.panel-title a { - cursor: pointer; -} - -.datetime-picker-dropdown > li.date-picker-menu div > table .btn-default, -.uib-datepicker-popup > li > div.uib-datepicker > table .btn-default { - border: 0; -} - -.datetime-picker-dropdown > li.date-picker-menu div > table:focus, -.uib-datepicker-popup > li > div.uib-datepicker > table:focus { - outline: none; -} - -.thread-dump-modal-lock { - max-width: 450px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* jhipster-needle-scss-add-main JHipster will add new css style */ diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/vendor.scss b/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/vendor.scss deleted file mode 100644 index 12a8f54b83..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/content/scss/vendor.scss +++ /dev/null @@ -1,12 +0,0 @@ -/* after changing this file run 'npm run webpack:build' */ - -/*************************** -put Sass variables here: -eg $input-color: red; -****************************/ -// Override Boostrap variables -@import 'bootstrap-variables'; -// Import Bootstrap source files from node_modules -@import '~bootstrap/scss/bootstrap'; - -/* jhipster-needle-scss-add-vendor JHipster will add new css style */ diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/favicon.ico b/jhipster-5/bookstore-monolith/src/main/webapp/favicon.ico deleted file mode 100755 index 4179874f53b3c3b0ba9e2a401412f814ab6296bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1574 zcmV+>2HE+EP)000H;Nkl9r4a2J+cS@yzSX6E!^*k!$-D-4;C?DsI4Z2te8^PT@c z=RfD)VMK(b3{GnU7K#)Bt&t+2HBtn$Mv8#eNDUS>&~)z8>N1c(q8rNd{sPjn1MM2QHDA^sG2W;HKsEVpi{%G+8~m}54A zpq~8zXet!#9Gbj-*V8>RHQ@_Oa=ck5fDynmyijTRbXS$xsGFssxLtW3`my8G-!>%7 zn;n<%&U37xG-qc+$&NL}Ic8(r8P8{L>@pz`5wF~FxA(hl3{Q#@0mJ|T!>orWW&$y= zwZ)lV?q9=mOj&=001@Fo=j2<5|CsUovve~87<4?ht)^g4)54xHIM_fH6g9vTH~{$6e3n@@!>>0A((rb8tLK5s#V0 zMm+wn&))p*T>q|hCGR#@SL9}ZK#Tw|V#*5$4}y`?UCz_p4!1wNkO1l#@e&9G#+VYs zEG&vW!|wTsW3iPFM8p#vgQq%eFRm{7prxk1*aAS&G~ti@^w-GQ9%mpd0W^=8Nrc@q z?FmG(O?n~{0D#CgKIQg@lG#5`2LTaLZtu09`*&npbwOKeU4B;jv8(n!ddI?|{BT~F zzml*h^*el9D=mnp(SK|%RkC6{JP5dS>;C22j@;ZLQI=y-twP>a1a%F2w^mvhW1N!C zItRzq%;^AP-WFw5y#6R|j(8Qh9Dt}K_u4&+p(d6Y7r5u2fMIuVYB~yqz^KPR<_)T> zVUZCQ2K>q>IWj4>kGx1p%HD(9OEwu=KUlGU-EF%U2| z6%r-`VTl%YwkK@x(j4)7%q9E||Yz*Vu z-KgXDY^wP1l~c9KAAp;kIku<%ZR4V3H)gcci^L zxuYQ7iwPXJy}sz+_S%}ltQn(|jw6aU+5iCCMBw-}`=x=2s3a#J7eur?P5(n%lfW3; zzojxs0t_(d_}%ME4>VV=%*&kl@mY?4RLIPDrr1%QWBTmX>U-{zUphzI`^LkPoTQkY z^?7=MW3nvEM4$hB{Zyw7M3hi@DgLIIc}3Z#J)0`_Hm$Unjj=qofc>keP`dJ1mj{ks?4R(3kPwGF$MQ4Nw$&8u zY$#b@Zsp>+MfD;l;gbiMsB74J{+6r5=JEI=N`S;Tl0o2i)aJImRADmkV6kfzMM5Yl zb`4GR+C9Ed)T9?ySkhM)WtCdZJg310p5oRacks5uH}YWG9~KQdzS3&iP?nXGu8&`< zB@h73l>ryEsGJ*5{SM`E0!tK2{&F`(Kx?E3XpIyBt&t+2HBtn$Mv8#eND - - - - - - Bookstore - - - - - - - - - - - -

- - - - - - - - diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/manifest.webapp b/jhipster-5/bookstore-monolith/src/main/webapp/manifest.webapp deleted file mode 100644 index 42b606ea1d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/manifest.webapp +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Bookstore", - "short_name": "Bookstore", - "icons": [ - { - "src": "./content/images/jhipster_family_member_0_head-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "./content/images/jhipster_family_member_0_head-256.png", - "sizes": "256x256", - "type": "image/png" - }, - { - "src": "./content/images/jhipster_family_member_0_head-384.png", - "sizes": "384x384", - "type": "image/png" - }, - { - "src": "./content/images/jhipster_family_member_0_head-512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#000000", - "background_color": "#e0e0e0", - "start_url": "/index.html", - "display": "standalone", - "orientation": "portrait" -} diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/robots.txt b/jhipster-5/bookstore-monolith/src/main/webapp/robots.txt deleted file mode 100644 index 7cda27477d..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/robots.txt +++ /dev/null @@ -1,11 +0,0 @@ -# robotstxt.org/ - -User-agent: * -Disallow: /api/account -Disallow: /api/account/change-password -Disallow: /api/account/sessions -Disallow: /api/audits/ -Disallow: /api/logs/ -Disallow: /api/users/ -Disallow: /management/ -Disallow: /v2/api-docs/ diff --git a/jhipster-5/bookstore-monolith/src/main/webapp/swagger-ui/index.html b/jhipster-5/bookstore-monolith/src/main/webapp/swagger-ui/index.html deleted file mode 100644 index 416eacef70..0000000000 --- a/jhipster-5/bookstore-monolith/src/main/webapp/swagger-ui/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - Swagger UI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
-
- - diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTest.java deleted file mode 100644 index 764d6b3587..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTest.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.baeldung.jhipster5.config; - -import io.github.jhipster.config.JHipsterConstants; -import io.github.jhipster.config.JHipsterProperties; -import io.github.jhipster.web.filter.CachingHttpHeadersFilter; -import io.undertow.Undertow; -import io.undertow.Undertow.Builder; -import io.undertow.UndertowOptions; -import org.apache.commons.io.FilenameUtils; - -import org.h2.server.web.WebServlet; -import org.junit.Before; -import org.junit.Test; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; -import org.springframework.http.HttpHeaders; -import org.springframework.mock.env.MockEnvironment; -import org.springframework.mock.web.MockServletContext; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.xnio.OptionMap; - -import javax.servlet.*; -import java.util.*; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * Unit tests for the WebConfigurer class. - * - * @see WebConfigurer - */ -public class WebConfigurerUnitTest { - - private WebConfigurer webConfigurer; - - private MockServletContext servletContext; - - private MockEnvironment env; - - private JHipsterProperties props; - - @Before - public void setup() { - servletContext = spy(new MockServletContext()); - doReturn(mock(FilterRegistration.Dynamic.class)) - .when(servletContext).addFilter(anyString(), any(Filter.class)); - doReturn(mock(ServletRegistration.Dynamic.class)) - .when(servletContext).addServlet(anyString(), any(Servlet.class)); - - env = new MockEnvironment(); - props = new JHipsterProperties(); - - webConfigurer = new WebConfigurer(env, props); - } - - @Test - public void testStartUpProdServletContext() throws ServletException { - env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); - webConfigurer.onStartup(servletContext); - - verify(servletContext).addFilter(eq("cachingHttpHeadersFilter"), any(CachingHttpHeadersFilter.class)); - verify(servletContext, never()).addServlet(eq("H2Console"), any(WebServlet.class)); - } - - @Test - public void testStartUpDevServletContext() throws ServletException { - env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT); - webConfigurer.onStartup(servletContext); - - verify(servletContext, never()).addFilter(eq("cachingHttpHeadersFilter"), any(CachingHttpHeadersFilter.class)); - verify(servletContext).addServlet(eq("H2Console"), any(WebServlet.class)); - } - - @Test - public void testCustomizeServletContainer() { - env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); - UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); - webConfigurer.customize(container); - assertThat(container.getMimeMappings().get("abs")).isEqualTo("audio/x-mpeg"); - assertThat(container.getMimeMappings().get("html")).isEqualTo("text/html;charset=utf-8"); - assertThat(container.getMimeMappings().get("json")).isEqualTo("text/html;charset=utf-8"); - if (container.getDocumentRoot() != null) { - assertThat(container.getDocumentRoot().getPath()).isEqualTo(FilenameUtils.separatorsToSystem("target/www")); - } - - Builder builder = Undertow.builder(); - container.getBuilderCustomizers().forEach(c -> c.customize(builder)); - OptionMap.Builder serverOptions = (OptionMap.Builder) ReflectionTestUtils.getField(builder, "serverOptions"); - assertThat(serverOptions.getMap().get(UndertowOptions.ENABLE_HTTP2)).isNull(); - } - - @Test - public void testUndertowHttp2Enabled() { - props.getHttp().setVersion(JHipsterProperties.Http.Version.V_2_0); - UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); - webConfigurer.customize(container); - Builder builder = Undertow.builder(); - container.getBuilderCustomizers().forEach(c -> c.customize(builder)); - OptionMap.Builder serverOptions = (OptionMap.Builder) ReflectionTestUtils.getField(builder, "serverOptions"); - assertThat(serverOptions.getMap().get(UndertowOptions.ENABLE_HTTP2)).isTrue(); - } - - @Test - public void testCorsFilterOnApiPath() throws Exception { - props.getCors().setAllowedOrigins(Collections.singletonList("*")); - props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); - props.getCors().setAllowedHeaders(Collections.singletonList("*")); - props.getCors().setMaxAge(1800L); - props.getCors().setAllowCredentials(true); - - MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerUnitTestController()) - .addFilters(webConfigurer.corsFilter()) - .build(); - - mockMvc.perform( - options("/api/test-cors") - .header(HttpHeaders.ORIGIN, "other.domain.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST")) - .andExpect(status().isOk()) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")) - .andExpect(header().string(HttpHeaders.VARY, "Origin")) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,POST,PUT,DELETE")) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800")); - - mockMvc.perform( - get("/api/test-cors") - .header(HttpHeaders.ORIGIN, "other.domain.com")) - .andExpect(status().isOk()) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")); - } - - @Test - public void testCorsFilterOnOtherPath() throws Exception { - props.getCors().setAllowedOrigins(Collections.singletonList("*")); - props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); - props.getCors().setAllowedHeaders(Collections.singletonList("*")); - props.getCors().setMaxAge(1800L); - props.getCors().setAllowCredentials(true); - - MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerUnitTestController()) - .addFilters(webConfigurer.corsFilter()) - .build(); - - mockMvc.perform( - get("/test/test-cors") - .header(HttpHeaders.ORIGIN, "other.domain.com")) - .andExpect(status().isOk()) - .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); - } - - @Test - public void testCorsFilterDeactivated() throws Exception { - props.getCors().setAllowedOrigins(null); - - MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerUnitTestController()) - .addFilters(webConfigurer.corsFilter()) - .build(); - - mockMvc.perform( - get("/api/test-cors") - .header(HttpHeaders.ORIGIN, "other.domain.com")) - .andExpect(status().isOk()) - .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); - } - - @Test - public void testCorsFilterDeactivated2() throws Exception { - props.getCors().setAllowedOrigins(new ArrayList<>()); - - MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerUnitTestController()) - .addFilters(webConfigurer.corsFilter()) - .build(); - - mockMvc.perform( - get("/api/test-cors") - .header(HttpHeaders.ORIGIN, "other.domain.com")) - .andExpect(status().isOk()) - .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTestController.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTestController.java deleted file mode 100644 index ee72e1c80e..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/WebConfigurerUnitTestController.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.jhipster5.config; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class WebConfigurerUnitTestController { - - @GetMapping("/api/test-cors") - public void testCorsOnApiPath() { - } - - @GetMapping("/test/test-cors") - public void testCorsOnOtherPath() { - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/timezone/HibernateTimeZoneIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/timezone/HibernateTimeZoneIntegrationTest.java deleted file mode 100644 index fba77e037e..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/config/timezone/HibernateTimeZoneIntegrationTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.baeldung.jhipster5.config.timezone; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.repository.timezone.DateTimeWrapper; -import com.baeldung.jhipster5.repository.timezone.DateTimeWrapperRepository; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.rowset.SqlRowSet; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -import java.time.*; -import java.time.format.DateTimeFormatter; - -import static java.lang.String.format; -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for the UTC Hibernate configuration. - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class HibernateTimeZoneIntegrationTest { - - @Autowired - private DateTimeWrapperRepository dateTimeWrapperRepository; - @Autowired - private JdbcTemplate jdbcTemplate; - - private DateTimeWrapper dateTimeWrapper; - private DateTimeFormatter dateTimeFormatter; - private DateTimeFormatter timeFormatter; - private DateTimeFormatter dateFormatter; - - @Before - public void setup() { - dateTimeWrapper = new DateTimeWrapper(); - dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z")); - dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0")); - dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z")); - dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z")); - dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00")); - dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00")); - dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10")); - - dateTimeFormatter = DateTimeFormatter - .ofPattern("yyyy-MM-dd HH:mm:ss.S") - .withZone(ZoneId.of("UTC")); - - timeFormatter = DateTimeFormatter - .ofPattern("HH:mm:ss") - .withZone(ZoneId.of("UTC")); - - dateFormatter = DateTimeFormatter - .ofPattern("yyyy-MM-dd"); - } - - @Test - @Transactional - public void storeInstantWithUtcConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("instant", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant()); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - public void storeLocalDateTimeWithUtcConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getLocalDateTime() - .atZone(ZoneId.systemDefault()) - .format(dateTimeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - public void storeOffsetDateTimeWithUtcConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getOffsetDateTime() - .format(dateTimeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - public void storeZoneDateTimeWithUtcConfigShouldBeStoredOnGMTTimeZone() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getZonedDateTime() - .format(dateTimeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - public void storeLocalTimeWithUtcConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("local_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getLocalTime() - .atDate(LocalDate.of(1970, Month.JANUARY, 1)) - .atZone(ZoneId.systemDefault()) - .format(timeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - public void storeOffsetTimeWithUtcConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("offset_time", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getOffsetTime() - .toLocalTime() - .atDate(LocalDate.of(1970, Month.JANUARY, 1)) - .atZone(ZoneId.systemDefault()) - .format(timeFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - @Test - @Transactional - public void storeLocalDateWithUtcConfigShouldBeStoredWithoutTransformation() { - dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); - - String request = generateSqlRequest("local_date", dateTimeWrapper.getId()); - SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); - String expectedValue = dateTimeWrapper - .getLocalDate() - .format(dateFormatter); - - assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); - } - - private String generateSqlRequest(String fieldName, long id) { - return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id); - } - - private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) { - while (sqlRowSet.next()) { - String dbValue = sqlRowSet.getString(1); - - assertThat(dbValue).isNotNull(); - assertThat(dbValue).isEqualTo(expectedValue); - } - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/CustomAuditEventRepositoryIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/CustomAuditEventRepositoryIntegrationTest.java deleted file mode 100644 index 948bf43f87..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/CustomAuditEventRepositoryIntegrationTest.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.baeldung.jhipster5.repository; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.audit.AuditEvent; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpSession; -import org.springframework.security.web.authentication.WebAuthenticationDetails; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -import javax.servlet.http.HttpSession; -import java.time.Instant; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static com.baeldung.jhipster5.repository.CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH; - -/** - * Test class for the CustomAuditEventRepository class. - * - * @see CustomAuditEventRepository - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -@Transactional -public class CustomAuditEventRepositoryIntegrationTest { - - @Autowired - private PersistenceAuditEventRepository persistenceAuditEventRepository; - - @Autowired - private AuditEventConverter auditEventConverter; - - private CustomAuditEventRepository customAuditEventRepository; - - private PersistentAuditEvent testUserEvent; - - private PersistentAuditEvent testOtherUserEvent; - - private PersistentAuditEvent testOldUserEvent; - - @Before - public void setup() { - customAuditEventRepository = new CustomAuditEventRepository(persistenceAuditEventRepository, auditEventConverter); - persistenceAuditEventRepository.deleteAll(); - Instant oneHourAgo = Instant.now().minusSeconds(3600); - - testUserEvent = new PersistentAuditEvent(); - testUserEvent.setPrincipal("test-user"); - testUserEvent.setAuditEventType("test-type"); - testUserEvent.setAuditEventDate(oneHourAgo); - Map data = new HashMap<>(); - data.put("test-key", "test-value"); - testUserEvent.setData(data); - - testOldUserEvent = new PersistentAuditEvent(); - testOldUserEvent.setPrincipal("test-user"); - testOldUserEvent.setAuditEventType("test-type"); - testOldUserEvent.setAuditEventDate(oneHourAgo.minusSeconds(10000)); - - testOtherUserEvent = new PersistentAuditEvent(); - testOtherUserEvent.setPrincipal("other-test-user"); - testOtherUserEvent.setAuditEventType("test-type"); - testOtherUserEvent.setAuditEventDate(oneHourAgo); - } - - @Test - public void addAuditEvent() { - Map data = new HashMap<>(); - data.put("test-key", "test-value"); - AuditEvent event = new AuditEvent("test-user", "test-type", data); - customAuditEventRepository.add(event); - List persistentAuditEvents = persistenceAuditEventRepository.findAll(); - assertThat(persistentAuditEvents).hasSize(1); - PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); - assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); - assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); - assertThat(persistentAuditEvent.getData()).containsKey("test-key"); - assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("test-value"); - assertThat(persistentAuditEvent.getAuditEventDate()).isEqualTo(event.getTimestamp()); - } - - @Test - public void addAuditEventTruncateLargeData() { - Map data = new HashMap<>(); - StringBuilder largeData = new StringBuilder(); - for (int i = 0; i < EVENT_DATA_COLUMN_MAX_LENGTH + 10; i++) { - largeData.append("a"); - } - data.put("test-key", largeData); - AuditEvent event = new AuditEvent("test-user", "test-type", data); - customAuditEventRepository.add(event); - List persistentAuditEvents = persistenceAuditEventRepository.findAll(); - assertThat(persistentAuditEvents).hasSize(1); - PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); - assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); - assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); - assertThat(persistentAuditEvent.getData()).containsKey("test-key"); - String actualData = persistentAuditEvent.getData().get("test-key"); - assertThat(actualData.length()).isEqualTo(EVENT_DATA_COLUMN_MAX_LENGTH); - assertThat(actualData).isSubstringOf(largeData); - assertThat(persistentAuditEvent.getAuditEventDate()).isEqualTo(event.getTimestamp()); - } - - @Test - public void testAddEventWithWebAuthenticationDetails() { - HttpSession session = new MockHttpSession(null, "test-session-id"); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setSession(session); - request.setRemoteAddr("1.2.3.4"); - WebAuthenticationDetails details = new WebAuthenticationDetails(request); - Map data = new HashMap<>(); - data.put("test-key", details); - AuditEvent event = new AuditEvent("test-user", "test-type", data); - customAuditEventRepository.add(event); - List persistentAuditEvents = persistenceAuditEventRepository.findAll(); - assertThat(persistentAuditEvents).hasSize(1); - PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); - assertThat(persistentAuditEvent.getData().get("remoteAddress")).isEqualTo("1.2.3.4"); - assertThat(persistentAuditEvent.getData().get("sessionId")).isEqualTo("test-session-id"); - } - - @Test - public void testAddEventWithNullData() { - Map data = new HashMap<>(); - data.put("test-key", null); - AuditEvent event = new AuditEvent("test-user", "test-type", data); - customAuditEventRepository.add(event); - List persistentAuditEvents = persistenceAuditEventRepository.findAll(); - assertThat(persistentAuditEvents).hasSize(1); - PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); - assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("null"); - } - - @Test - public void addAuditEventWithAnonymousUser() { - Map data = new HashMap<>(); - data.put("test-key", "test-value"); - AuditEvent event = new AuditEvent(Constants.ANONYMOUS_USER, "test-type", data); - customAuditEventRepository.add(event); - List persistentAuditEvents = persistenceAuditEventRepository.findAll(); - assertThat(persistentAuditEvents).hasSize(0); - } - - @Test - public void addAuditEventWithAuthorizationFailureType() { - Map data = new HashMap<>(); - data.put("test-key", "test-value"); - AuditEvent event = new AuditEvent("test-user", "AUTHORIZATION_FAILURE", data); - customAuditEventRepository.add(event); - List persistentAuditEvents = persistenceAuditEventRepository.findAll(); - assertThat(persistentAuditEvents).hasSize(0); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapper.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapper.java deleted file mode 100644 index 473a8e782e..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapper.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.baeldung.jhipster5.repository.timezone; - -import javax.persistence.*; -import java.io.Serializable; -import java.time.*; -import java.util.Objects; - -@Entity -@Table(name = "jhi_date_time_wrapper") -public class DateTimeWrapper implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "instant") - private Instant instant; - - @Column(name = "local_date_time") - private LocalDateTime localDateTime; - - @Column(name = "offset_date_time") - private OffsetDateTime offsetDateTime; - - @Column(name = "zoned_date_time") - private ZonedDateTime zonedDateTime; - - @Column(name = "local_time") - private LocalTime localTime; - - @Column(name = "offset_time") - private OffsetTime offsetTime; - - @Column(name = "local_date") - private LocalDate localDate; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Instant getInstant() { - return instant; - } - - public void setInstant(Instant instant) { - this.instant = instant; - } - - public LocalDateTime getLocalDateTime() { - return localDateTime; - } - - public void setLocalDateTime(LocalDateTime localDateTime) { - this.localDateTime = localDateTime; - } - - public OffsetDateTime getOffsetDateTime() { - return offsetDateTime; - } - - public void setOffsetDateTime(OffsetDateTime offsetDateTime) { - this.offsetDateTime = offsetDateTime; - } - - public ZonedDateTime getZonedDateTime() { - return zonedDateTime; - } - - public void setZonedDateTime(ZonedDateTime zonedDateTime) { - this.zonedDateTime = zonedDateTime; - } - - public LocalTime getLocalTime() { - return localTime; - } - - public void setLocalTime(LocalTime localTime) { - this.localTime = localTime; - } - - public OffsetTime getOffsetTime() { - return offsetTime; - } - - public void setOffsetTime(OffsetTime offsetTime) { - this.offsetTime = offsetTime; - } - - public LocalDate getLocalDate() { - return localDate; - } - - public void setLocalDate(LocalDate localDate) { - this.localDate = localDate; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - DateTimeWrapper dateTimeWrapper = (DateTimeWrapper) o; - return !(dateTimeWrapper.getId() == null || getId() == null) && Objects.equals(getId(), dateTimeWrapper.getId()); - } - - @Override - public int hashCode() { - return Objects.hashCode(getId()); - } - - @Override - public String toString() { - return "TimeZoneTest{" + - "id=" + id + - ", instant=" + instant + - ", localDateTime=" + localDateTime + - ", offsetDateTime=" + offsetDateTime + - ", zonedDateTime=" + zonedDateTime + - '}'; - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapperRepository.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapperRepository.java deleted file mode 100644 index 9c3831879f..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/repository/timezone/DateTimeWrapperRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.jhipster5.repository.timezone; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Spring Data JPA repository for the DateTimeWrapper entity. - */ -@Repository -public interface DateTimeWrapperRepository extends JpaRepository { - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/DomainUserDetailsServiceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/DomainUserDetailsServiceIntegrationTest.java deleted file mode 100644 index 11757f6516..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/DomainUserDetailsServiceIntegrationTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.baeldung.jhipster5.security; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; - -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Locale; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Test class for DomainUserDetailsService. - * - * @see DomainUserDetailsService - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -@Transactional -public class DomainUserDetailsServiceIntegrationTest { - - private static final String USER_ONE_LOGIN = "test-user-one"; - private static final String USER_ONE_EMAIL = "test-user-one@localhost"; - private static final String USER_TWO_LOGIN = "test-user-two"; - private static final String USER_TWO_EMAIL = "test-user-two@localhost"; - private static final String USER_THREE_LOGIN = "test-user-three"; - private static final String USER_THREE_EMAIL = "test-user-three@localhost"; - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserDetailsService domainUserDetailsService; - - private User userOne; - private User userTwo; - private User userThree; - - @Before - public void init() { - userOne = new User(); - userOne.setLogin(USER_ONE_LOGIN); - userOne.setPassword(RandomStringUtils.random(60)); - userOne.setActivated(true); - userOne.setEmail(USER_ONE_EMAIL); - userOne.setFirstName("userOne"); - userOne.setLastName("doe"); - userOne.setLangKey("en"); - userRepository.save(userOne); - - userTwo = new User(); - userTwo.setLogin(USER_TWO_LOGIN); - userTwo.setPassword(RandomStringUtils.random(60)); - userTwo.setActivated(true); - userTwo.setEmail(USER_TWO_EMAIL); - userTwo.setFirstName("userTwo"); - userTwo.setLastName("doe"); - userTwo.setLangKey("en"); - userRepository.save(userTwo); - - userThree = new User(); - userThree.setLogin(USER_THREE_LOGIN); - userThree.setPassword(RandomStringUtils.random(60)); - userThree.setActivated(false); - userThree.setEmail(USER_THREE_EMAIL); - userThree.setFirstName("userThree"); - userThree.setLastName("doe"); - userThree.setLangKey("en"); - userRepository.save(userThree); - } - - @Test - @Transactional - public void assertThatUserCanBeFoundByLogin() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); - } - - @Test - @Transactional - public void assertThatUserCanBeFoundByLoginIgnoreCase() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH)); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); - } - - @Test - @Transactional - public void assertThatUserCanBeFoundByEmail() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); - } - - @Test(expected = UsernameNotFoundException.class) - @Transactional - public void assertThatUserCanNotBeFoundByEmailIgnoreCase() { - domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH)); - } - - @Test - @Transactional - public void assertThatEmailIsPrioritizedOverLogin() { - UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL); - assertThat(userDetails).isNotNull(); - assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); - } - - @Test(expected = UserNotActivatedException.class) - @Transactional - public void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() { - domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java deleted file mode 100644 index bdcdba7644..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/MockAuthenticationManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.jhipster5.security; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Primary; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.Collections; - -/** - * AuthenticationManager used solely by unit tests. - */ -@Component -@Primary -public class MockAuthenticationManager implements AuthenticationManager -{ - private final static Collection ROLES = - Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")); - - @Autowired - private UserDetailsService userDetailsService; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Override - public Authentication authenticate(Authentication authentication) throws AuthenticationException - { - - UserDetails userDetails = userDetailsService.loadUserByUsername(authentication.getName()); - - if(userDetails == null || !passwordEncoder.matches(authentication.getCredentials().toString(), userDetails.getPassword())) - { - throw new BadCredentialsException("Invalid username/password"); - } - - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - authentication.getPrincipal().toString(), - authentication.getCredentials().toString(), - ROLES); - - return token; - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/SecurityUtilsUnitTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/SecurityUtilsUnitTest.java deleted file mode 100644 index b2736badd6..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/SecurityUtilsUnitTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.baeldung.jhipster5.security; - -import org.junit.Test; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Test class for the SecurityUtils utility class. - * - * @see SecurityUtils - */ -public class SecurityUtilsUnitTest { - - @Test - public void testgetCurrentUserLogin() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); - SecurityContextHolder.setContext(securityContext); - Optional login = SecurityUtils.getCurrentUserLogin(); - assertThat(login).contains("admin"); - } - - @Test - public void testgetCurrentUserJWT() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "token")); - SecurityContextHolder.setContext(securityContext); - Optional jwt = SecurityUtils.getCurrentUserJWT(); - assertThat(jwt).contains("token"); - } - - @Test - public void testIsAuthenticated() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); - SecurityContextHolder.setContext(securityContext); - boolean isAuthenticated = SecurityUtils.isAuthenticated(); - assertThat(isAuthenticated).isTrue(); - } - - @Test - public void testAnonymousIsNotAuthenticated() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - Collection authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities)); - SecurityContextHolder.setContext(securityContext); - boolean isAuthenticated = SecurityUtils.isAuthenticated(); - assertThat(isAuthenticated).isFalse(); - } - - @Test - public void testIsCurrentUserInRole() { - SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); - Collection authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER)); - securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities)); - SecurityContextHolder.setContext(securityContext); - - assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.USER)).isTrue(); - assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.ADMIN)).isFalse(); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/JWTFilterUnitTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/JWTFilterUnitTest.java deleted file mode 100644 index 2be8e6809a..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/JWTFilterUnitTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.baeldung.jhipster5.security.jwt; - -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import io.github.jhipster.config.JHipsterProperties; -import io.jsonwebtoken.io.Decoders; -import io.jsonwebtoken.security.Keys; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.http.HttpStatus; -import org.springframework.mock.web.MockFilterChain; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.util.ReflectionTestUtils; - -import java.util.Collections; - -import static org.assertj.core.api.Assertions.assertThat; - -public class JWTFilterUnitTest { - - private TokenProvider tokenProvider; - - private JWTFilter jwtFilter; - - @Before - public void setup() { - JHipsterProperties jHipsterProperties = new JHipsterProperties(); - tokenProvider = new TokenProvider(jHipsterProperties); - ReflectionTestUtils.setField(tokenProvider, "key", - Keys.hmacShaKeyFor(Decoders.BASE64 - .decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"))); - - ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000); - jwtFilter = new JWTFilter(tokenProvider); - SecurityContextHolder.getContext().setAuthentication(null); - } - - @Test - public void testJWTFilter() throws Exception { - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - "test-user", - "test-password", - Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) - ); - String jwt = tokenProvider.createToken(authentication, false); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("test-user"); - assertThat(SecurityContextHolder.getContext().getAuthentication().getCredentials().toString()).isEqualTo(jwt); - } - - @Test - public void testJWTFilterInvalidToken() throws Exception { - String jwt = "wrong_jwt"; - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } - - @Test - public void testJWTFilterMissingAuthorization() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } - - @Test - public void testJWTFilterMissingToken() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer "); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } - - @Test - public void testJWTFilterWrongScheme() throws Exception { - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - "test-user", - "test-password", - Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) - ); - String jwt = tokenProvider.createToken(authentication, false); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Basic " + jwt); - request.setRequestURI("/api/test"); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain filterChain = new MockFilterChain(); - jwtFilter.doFilter(request, response, filterChain); - assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/TokenProviderUnitTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/TokenProviderUnitTest.java deleted file mode 100644 index 18da2eb875..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/security/jwt/TokenProviderUnitTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.baeldung.jhipster5.security.jwt; - -import com.baeldung.jhipster5.security.AuthoritiesConstants; - -import java.security.Key; -import java.util.*; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.test.util.ReflectionTestUtils; - -import io.github.jhipster.config.JHipsterProperties; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.io.Decoders; -import io.jsonwebtoken.security.Keys; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TokenProviderUnitTest { - - private final long ONE_MINUTE = 60000; - private Key key; - private JHipsterProperties jHipsterProperties; - private TokenProvider tokenProvider; - - @Before - public void setup() { - jHipsterProperties = Mockito.mock(JHipsterProperties.class); - tokenProvider = new TokenProvider(jHipsterProperties); - key = Keys.hmacShaKeyFor(Decoders.BASE64 - .decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")); - - ReflectionTestUtils.setField(tokenProvider, "key", key); - ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", ONE_MINUTE); - } - - @Test - public void testReturnFalseWhenJWThasInvalidSignature() { - boolean isTokenValid = tokenProvider.validateToken(createTokenWithDifferentSignature()); - - assertThat(isTokenValid).isEqualTo(false); - } - - @Test - public void testReturnFalseWhenJWTisMalformed() { - Authentication authentication = createAuthentication(); - String token = tokenProvider.createToken(authentication, false); - String invalidToken = token.substring(1); - boolean isTokenValid = tokenProvider.validateToken(invalidToken); - - assertThat(isTokenValid).isEqualTo(false); - } - - @Test - public void testReturnFalseWhenJWTisExpired() { - ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", -ONE_MINUTE); - - Authentication authentication = createAuthentication(); - String token = tokenProvider.createToken(authentication, false); - - boolean isTokenValid = tokenProvider.validateToken(token); - - assertThat(isTokenValid).isEqualTo(false); - } - - @Test - public void testReturnFalseWhenJWTisUnsupported() { - String unsupportedToken = createUnsupportedToken(); - - boolean isTokenValid = tokenProvider.validateToken(unsupportedToken); - - assertThat(isTokenValid).isEqualTo(false); - } - - @Test - public void testReturnFalseWhenJWTisInvalid() { - boolean isTokenValid = tokenProvider.validateToken(""); - - assertThat(isTokenValid).isEqualTo(false); - } - - private Authentication createAuthentication() { - Collection authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); - return new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities); - } - - private String createUnsupportedToken() { - return Jwts.builder() - .setPayload("payload") - .signWith(key, SignatureAlgorithm.HS512) - .compact(); - } - - private String createTokenWithDifferentSignature() { - Key otherKey = Keys.hmacShaKeyFor(Decoders.BASE64 - .decode("Xfd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8")); - - return Jwts.builder() - .setSubject("anonymous") - .signWith(otherKey, SignatureAlgorithm.HS512) - .setExpiration(new Date(new Date().getTime() + ONE_MINUTE)) - .compact(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/MailServiceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/MailServiceIntegrationTest.java deleted file mode 100644 index 72592e1239..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/MailServiceIntegrationTest.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.baeldung.jhipster5.service; -import com.baeldung.jhipster5.config.Constants; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; -import io.github.jhipster.config.JHipsterProperties; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.MessageSource; -import org.springframework.mail.MailSendException; -import org.springframework.mail.javamail.JavaMailSenderImpl; -import org.springframework.test.context.junit4.SpringRunner; -import org.thymeleaf.spring5.SpringTemplateEngine; - -import javax.mail.Multipart; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import java.io.ByteArrayOutputStream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class MailServiceIntegrationTest { - - @Autowired - private JHipsterProperties jHipsterProperties; - - @Autowired - private MessageSource messageSource; - - @Autowired - private SpringTemplateEngine templateEngine; - - @Spy - private JavaMailSenderImpl javaMailSender; - - @Captor - private ArgumentCaptor messageCaptor; - - private MailService mailService; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - doNothing().when(javaMailSender).send(any(MimeMessage.class)); - mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine); - } - - @Test - public void testSendEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent()).isInstanceOf(String.class); - assertThat(message.getContent().toString()).isEqualTo("testContent"); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); - } - - @Test - public void testSendHtmlEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent()).isInstanceOf(String.class); - assertThat(message.getContent().toString()).isEqualTo("testContent"); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - public void testSendMultipartEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - MimeMultipart mp = (MimeMultipart) message.getContent(); - MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); - ByteArrayOutputStream aos = new ByteArrayOutputStream(); - part.writeTo(aos); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent()).isInstanceOf(Multipart.class); - assertThat(aos.toString()).isEqualTo("\r\ntestContent"); - assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); - } - - @Test - public void testSendMultipartHtmlEmail() throws Exception { - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - MimeMultipart mp = (MimeMultipart) message.getContent(); - MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); - ByteArrayOutputStream aos = new ByteArrayOutputStream(); - part.writeTo(aos); - assertThat(message.getSubject()).isEqualTo("testSubject"); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent()).isInstanceOf(Multipart.class); - assertThat(aos.toString()).isEqualTo("\r\ntestContent"); - assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - public void testSendEmailFromTemplate() throws Exception { - User user = new User(); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - user.setLangKey("en"); - mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getSubject()).isEqualTo("test title"); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("test title, http://127.0.0.1:8080, john\n"); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - public void testSendActivationEmail() throws Exception { - User user = new User(); - user.setLangKey(Constants.DEFAULT_LANGUAGE); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - mailService.sendActivationEmail(user); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent().toString()).isNotEmpty(); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - public void testCreationEmail() throws Exception { - User user = new User(); - user.setLangKey(Constants.DEFAULT_LANGUAGE); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - mailService.sendCreationEmail(user); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent().toString()).isNotEmpty(); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - public void testSendPasswordResetMail() throws Exception { - User user = new User(); - user.setLangKey(Constants.DEFAULT_LANGUAGE); - user.setLogin("john"); - user.setEmail("john.doe@example.com"); - mailService.sendPasswordResetMail(user); - verify(javaMailSender).send(messageCaptor.capture()); - MimeMessage message = messageCaptor.getValue(); - assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); - assertThat(message.getFrom()[0].toString()).isEqualTo("test@localhost"); - assertThat(message.getContent().toString()).isNotEmpty(); - assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); - } - - @Test - public void testSendEmailWithException() throws Exception { - doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class)); - mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/UserServiceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/UserServiceIntegrationTest.java deleted file mode 100644 index ca3608462d..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/UserServiceIntegrationTest.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.baeldung.jhipster5.service; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.service.util.RandomUtil; - -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.auditing.AuditingHandler; -import org.springframework.data.auditing.DateTimeProvider; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.time.LocalDateTime; -import java.util.Optional; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; - -/** - * Test class for the UserResource REST controller. - * - * @see UserService - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -@Transactional -public class UserServiceIntegrationTest { - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserService userService; - - @Autowired - private AuditingHandler auditingHandler; - - @Mock - DateTimeProvider dateTimeProvider; - - private User user; - - @Before - public void init() { - user = new User(); - user.setLogin("johndoe"); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - user.setEmail("johndoe@localhost"); - user.setFirstName("john"); - user.setLastName("doe"); - user.setImageUrl("http://placehold.it/50x50"); - user.setLangKey("en"); - - when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now())); - auditingHandler.setDateTimeProvider(dateTimeProvider); - } - - @Test - @Transactional - public void assertThatUserMustExistToResetPassword() { - userRepository.saveAndFlush(user); - Optional maybeUser = userService.requestPasswordReset("invalid.login@localhost"); - assertThat(maybeUser).isNotPresent(); - - maybeUser = userService.requestPasswordReset(user.getEmail()); - assertThat(maybeUser).isPresent(); - assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail()); - assertThat(maybeUser.orElse(null).getResetDate()).isNotNull(); - assertThat(maybeUser.orElse(null).getResetKey()).isNotNull(); - } - - @Test - @Transactional - public void assertThatOnlyActivatedUserCanRequestPasswordReset() { - user.setActivated(false); - userRepository.saveAndFlush(user); - - Optional maybeUser = userService.requestPasswordReset(user.getLogin()); - assertThat(maybeUser).isNotPresent(); - userRepository.delete(user); - } - - @Test - @Transactional - public void assertThatResetKeyMustNotBeOlderThan24Hours() { - Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); - String resetKey = RandomUtil.generateResetKey(); - user.setActivated(true); - user.setResetDate(daysAgo); - user.setResetKey(resetKey); - userRepository.saveAndFlush(user); - - Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); - assertThat(maybeUser).isNotPresent(); - userRepository.delete(user); - } - - @Test - @Transactional - public void assertThatResetKeyMustBeValid() { - Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); - user.setActivated(true); - user.setResetDate(daysAgo); - user.setResetKey("1234"); - userRepository.saveAndFlush(user); - - Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); - assertThat(maybeUser).isNotPresent(); - userRepository.delete(user); - } - - @Test - @Transactional - public void assertThatUserCanResetPassword() { - String oldPassword = user.getPassword(); - Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS); - String resetKey = RandomUtil.generateResetKey(); - user.setActivated(true); - user.setResetDate(daysAgo); - user.setResetKey(resetKey); - userRepository.saveAndFlush(user); - - Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); - assertThat(maybeUser).isPresent(); - assertThat(maybeUser.orElse(null).getResetDate()).isNull(); - assertThat(maybeUser.orElse(null).getResetKey()).isNull(); - assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword); - - userRepository.delete(user); - } - - @Test - @Transactional - public void testFindNotActivatedUsersByCreationDateBefore() { - Instant now = Instant.now(); - when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); - user.setActivated(false); - User dbUser = userRepository.saveAndFlush(user); - dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); - userRepository.saveAndFlush(user); - List users = userRepository.findAllByActivatedIsFalseAndCreatedDateBefore(now.minus(3, ChronoUnit.DAYS)); - assertThat(users).isNotEmpty(); - userService.removeNotActivatedUsers(); - users = userRepository.findAllByActivatedIsFalseAndCreatedDateBefore(now.minus(3, ChronoUnit.DAYS)); - assertThat(users).isEmpty(); - } - - @Test - @Transactional - public void assertThatAnonymousUserIsNotGet() { - user.setLogin(Constants.ANONYMOUS_USER); - if (!userRepository.findOneByLogin(Constants.ANONYMOUS_USER).isPresent()) { - userRepository.saveAndFlush(user); - } - final PageRequest pageable = PageRequest.of(0, (int) userRepository.count()); - final Page allManagedUsers = userService.getAllManagedUsers(pageable); - assertThat(allManagedUsers.getContent().stream() - .noneMatch(user -> Constants.ANONYMOUS_USER.equals(user.getLogin()))) - .isTrue(); - } - - - @Test - @Transactional - public void testRemoveNotActivatedUsers() { - // custom "now" for audit to use as creation date - when(dateTimeProvider.getNow()).thenReturn(Optional.of(Instant.now().minus(30, ChronoUnit.DAYS))); - - user.setActivated(false); - userRepository.saveAndFlush(user); - - assertThat(userRepository.findOneByLogin("johndoe")).isPresent(); - userService.removeNotActivatedUsers(); - assertThat(userRepository.findOneByLogin("johndoe")).isNotPresent(); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java deleted file mode 100644 index cd49135d63..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/service/mapper/UserMapperIntegrationTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.baeldung.jhipster5.service.mapper; - - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.service.dto.UserDTO; -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Test class for the UserMapper. - * - * @see UserMapper - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class UserMapperIntegrationTest { - - private static final String DEFAULT_LOGIN = "johndoe"; - - @Autowired - private UserMapper userMapper; - - private User user; - private UserDTO userDto; - - private static final Long DEFAULT_ID = 1L; - - @Before - public void init() { - user = new User(); - user.setLogin(DEFAULT_LOGIN); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - user.setEmail("johndoe@localhost"); - user.setFirstName("john"); - user.setLastName("doe"); - user.setImageUrl("image_url"); - user.setLangKey("en"); - - userDto = new UserDTO(user); - } - - @Test - public void usersToUserDTOsShouldMapOnlyNonNullUsers(){ - List users = new ArrayList<>(); - users.add(user); - users.add(null); - - List userDTOS = userMapper.usersToUserDTOs(users); - - assertThat(userDTOS).isNotEmpty(); - assertThat(userDTOS).size().isEqualTo(1); - } - - @Test - public void userDTOsToUsersShouldMapOnlyNonNullUsers(){ - List usersDto = new ArrayList<>(); - usersDto.add(userDto); - usersDto.add(null); - - List users = userMapper.userDTOsToUsers(usersDto); - - assertThat(users).isNotEmpty(); - assertThat(users).size().isEqualTo(1); - } - - @Test - public void userDTOsToUsersWithAuthoritiesStringShouldMapToUsersWithAuthoritiesDomain(){ - Set authoritiesAsString = new HashSet<>(); - authoritiesAsString.add("ADMIN"); - userDto.setAuthorities(authoritiesAsString); - - List usersDto = new ArrayList<>(); - usersDto.add(userDto); - - List users = userMapper.userDTOsToUsers(usersDto); - - assertThat(users).isNotEmpty(); - assertThat(users).size().isEqualTo(1); - assertThat(users.get(0).getAuthorities()).isNotNull(); - assertThat(users.get(0).getAuthorities()).isNotEmpty(); - assertThat(users.get(0).getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); - } - - @Test - public void userDTOsToUsersMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities(){ - userDto.setAuthorities(null); - - List usersDto = new ArrayList<>(); - usersDto.add(userDto); - - List users = userMapper.userDTOsToUsers(usersDto); - - assertThat(users).isNotEmpty(); - assertThat(users).size().isEqualTo(1); - assertThat(users.get(0).getAuthorities()).isNotNull(); - assertThat(users.get(0).getAuthorities()).isEmpty(); - } - - @Test - public void userDTOToUserMapWithAuthoritiesStringShouldReturnUserWithAuthorities(){ - Set authoritiesAsString = new HashSet<>(); - authoritiesAsString.add("ADMIN"); - userDto.setAuthorities(authoritiesAsString); - - userDto.setAuthorities(authoritiesAsString); - - User user = userMapper.userDTOToUser(userDto); - - assertThat(user).isNotNull(); - assertThat(user.getAuthorities()).isNotNull(); - assertThat(user.getAuthorities()).isNotEmpty(); - assertThat(user.getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); - } - - @Test - public void userDTOToUserMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities(){ - userDto.setAuthorities(null); - - User user = userMapper.userDTOToUser(userDto); - - assertThat(user).isNotNull(); - assertThat(user.getAuthorities()).isNotNull(); - assertThat(user.getAuthorities()).isEmpty(); - } - - @Test - public void userDTOToUserMapWithNullUserShouldReturnNull(){ - assertThat(userMapper.userDTOToUser(null)).isNull(); - } - - @Test - public void testUserFromId() { - assertThat(userMapper.userFromId(DEFAULT_ID).getId()).isEqualTo(DEFAULT_ID); - assertThat(userMapper.userFromId(null)).isNull(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AccountResourceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AccountResourceIntegrationTest.java deleted file mode 100644 index f591b7ecbf..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AccountResourceIntegrationTest.java +++ /dev/null @@ -1,818 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.Constants; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.AuthorityRepository; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.PasswordChangeDTO; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; -import com.baeldung.jhipster5.web.rest.vm.KeyAndPasswordVM; -import com.baeldung.jhipster5.web.rest.vm.ManagedUserVM; -import org.apache.commons.lang3.RandomStringUtils; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; - -import java.time.Instant; -import java.util.*; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -/** - * Test class for the AccountResource REST controller. - * - * @see AccountResource - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class AccountResourceIntegrationTest { - - @Autowired - private UserRepository userRepository; - - @Autowired - private AuthorityRepository authorityRepository; - - @Autowired - private UserService userService; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private HttpMessageConverter[] httpMessageConverters; - - @Autowired - private ExceptionTranslator exceptionTranslator; - - @Mock - private UserService mockUserService; - - @Mock - private MailService mockMailService; - - private MockMvc restMvc; - - private MockMvc restUserMockMvc; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - doNothing().when(mockMailService).sendActivationEmail(any()); - AccountResource accountResource = - new AccountResource(userRepository, userService, mockMailService); - - AccountResource accountUserMockResource = - new AccountResource(userRepository, mockUserService, mockMailService); - this.restMvc = MockMvcBuilders.standaloneSetup(accountResource) - .setMessageConverters(httpMessageConverters) - .setControllerAdvice(exceptionTranslator) - .build(); - this.restUserMockMvc = MockMvcBuilders.standaloneSetup(accountUserMockResource) - .setControllerAdvice(exceptionTranslator) - .build(); - } - - @Test - public void testNonAuthenticatedUser() throws Exception { - restUserMockMvc.perform(get("/api/authenticate") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("")); - } - - @Test - public void testAuthenticatedUser() throws Exception { - restUserMockMvc.perform(get("/api/authenticate") - .with(request -> { - request.setRemoteUser("test"); - return request; - }) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string("test")); - } - - @Test - public void testGetExistingAccount() throws Exception { - Set authorities = new HashSet<>(); - Authority authority = new Authority(); - authority.setName(AuthoritiesConstants.ADMIN); - authorities.add(authority); - - User user = new User(); - user.setLogin("test"); - user.setFirstName("john"); - user.setLastName("doe"); - user.setEmail("john.doe@jhipster.com"); - user.setImageUrl("http://placehold.it/50x50"); - user.setLangKey("en"); - user.setAuthorities(authorities); - when(mockUserService.getUserWithAuthorities()).thenReturn(Optional.of(user)); - - restUserMockMvc.perform(get("/api/account") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.login").value("test")) - .andExpect(jsonPath("$.firstName").value("john")) - .andExpect(jsonPath("$.lastName").value("doe")) - .andExpect(jsonPath("$.email").value("john.doe@jhipster.com")) - .andExpect(jsonPath("$.imageUrl").value("http://placehold.it/50x50")) - .andExpect(jsonPath("$.langKey").value("en")) - .andExpect(jsonPath("$.authorities").value(AuthoritiesConstants.ADMIN)); - } - - @Test - public void testGetUnknownAccount() throws Exception { - when(mockUserService.getUserWithAuthorities()).thenReturn(Optional.empty()); - - restUserMockMvc.perform(get("/api/account") - .accept(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(status().isInternalServerError()); - } - - @Test - @Transactional - public void testRegisterValid() throws Exception { - ManagedUserVM validUser = new ManagedUserVM(); - validUser.setLogin("test-register-valid"); - validUser.setPassword("password"); - validUser.setFirstName("Alice"); - validUser.setLastName("Test"); - validUser.setEmail("test-register-valid@example.com"); - validUser.setImageUrl("http://placehold.it/50x50"); - validUser.setLangKey(Constants.DEFAULT_LANGUAGE); - validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isFalse(); - - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(validUser))) - .andExpect(status().isCreated()); - - assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isTrue(); - } - - @Test - @Transactional - public void testRegisterInvalidLogin() throws Exception { - ManagedUserVM invalidUser = new ManagedUserVM(); - invalidUser.setLogin("funky-log!n");// <-- invalid - invalidUser.setPassword("password"); - invalidUser.setFirstName("Funky"); - invalidUser.setLastName("One"); - invalidUser.setEmail("funky@example.com"); - invalidUser.setActivated(true); - invalidUser.setImageUrl("http://placehold.it/50x50"); - invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); - invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(invalidUser))) - .andExpect(status().isBadRequest()); - - Optional user = userRepository.findOneByEmailIgnoreCase("funky@example.com"); - assertThat(user.isPresent()).isFalse(); - } - - @Test - @Transactional - public void testRegisterInvalidEmail() throws Exception { - ManagedUserVM invalidUser = new ManagedUserVM(); - invalidUser.setLogin("bob"); - invalidUser.setPassword("password"); - invalidUser.setFirstName("Bob"); - invalidUser.setLastName("Green"); - invalidUser.setEmail("invalid");// <-- invalid - invalidUser.setActivated(true); - invalidUser.setImageUrl("http://placehold.it/50x50"); - invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); - invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(invalidUser))) - .andExpect(status().isBadRequest()); - - Optional user = userRepository.findOneByLogin("bob"); - assertThat(user.isPresent()).isFalse(); - } - - @Test - @Transactional - public void testRegisterInvalidPassword() throws Exception { - ManagedUserVM invalidUser = new ManagedUserVM(); - invalidUser.setLogin("bob"); - invalidUser.setPassword("123");// password with only 3 digits - invalidUser.setFirstName("Bob"); - invalidUser.setLastName("Green"); - invalidUser.setEmail("bob@example.com"); - invalidUser.setActivated(true); - invalidUser.setImageUrl("http://placehold.it/50x50"); - invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); - invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(invalidUser))) - .andExpect(status().isBadRequest()); - - Optional user = userRepository.findOneByLogin("bob"); - assertThat(user.isPresent()).isFalse(); - } - - @Test - @Transactional - public void testRegisterNullPassword() throws Exception { - ManagedUserVM invalidUser = new ManagedUserVM(); - invalidUser.setLogin("bob"); - invalidUser.setPassword(null);// invalid null password - invalidUser.setFirstName("Bob"); - invalidUser.setLastName("Green"); - invalidUser.setEmail("bob@example.com"); - invalidUser.setActivated(true); - invalidUser.setImageUrl("http://placehold.it/50x50"); - invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); - invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(invalidUser))) - .andExpect(status().isBadRequest()); - - Optional user = userRepository.findOneByLogin("bob"); - assertThat(user.isPresent()).isFalse(); - } - - @Test - @Transactional - public void testRegisterDuplicateLogin() throws Exception { - // First registration - ManagedUserVM firstUser = new ManagedUserVM(); - firstUser.setLogin("alice"); - firstUser.setPassword("password"); - firstUser.setFirstName("Alice"); - firstUser.setLastName("Something"); - firstUser.setEmail("alice@example.com"); - firstUser.setImageUrl("http://placehold.it/50x50"); - firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); - firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - // Duplicate login, different email - ManagedUserVM secondUser = new ManagedUserVM(); - secondUser.setLogin(firstUser.getLogin()); - secondUser.setPassword(firstUser.getPassword()); - secondUser.setFirstName(firstUser.getFirstName()); - secondUser.setLastName(firstUser.getLastName()); - secondUser.setEmail("alice2@example.com"); - secondUser.setImageUrl(firstUser.getImageUrl()); - secondUser.setLangKey(firstUser.getLangKey()); - secondUser.setCreatedBy(firstUser.getCreatedBy()); - secondUser.setCreatedDate(firstUser.getCreatedDate()); - secondUser.setLastModifiedBy(firstUser.getLastModifiedBy()); - secondUser.setLastModifiedDate(firstUser.getLastModifiedDate()); - secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); - - // First user - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(firstUser))) - .andExpect(status().isCreated()); - - // Second (non activated) user - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(secondUser))) - .andExpect(status().isCreated()); - - Optional testUser = userRepository.findOneByEmailIgnoreCase("alice2@example.com"); - assertThat(testUser.isPresent()).isTrue(); - testUser.get().setActivated(true); - userRepository.save(testUser.get()); - - // Second (already activated) user - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(secondUser))) - .andExpect(status().is4xxClientError()); - } - - @Test - @Transactional - public void testRegisterDuplicateEmail() throws Exception { - // First user - ManagedUserVM firstUser = new ManagedUserVM(); - firstUser.setLogin("test-register-duplicate-email"); - firstUser.setPassword("password"); - firstUser.setFirstName("Alice"); - firstUser.setLastName("Test"); - firstUser.setEmail("test-register-duplicate-email@example.com"); - firstUser.setImageUrl("http://placehold.it/50x50"); - firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); - firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - // Register first user - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(firstUser))) - .andExpect(status().isCreated()); - - Optional testUser1 = userRepository.findOneByLogin("test-register-duplicate-email"); - assertThat(testUser1.isPresent()).isTrue(); - - // Duplicate email, different login - ManagedUserVM secondUser = new ManagedUserVM(); - secondUser.setLogin("test-register-duplicate-email-2"); - secondUser.setPassword(firstUser.getPassword()); - secondUser.setFirstName(firstUser.getFirstName()); - secondUser.setLastName(firstUser.getLastName()); - secondUser.setEmail(firstUser.getEmail()); - secondUser.setImageUrl(firstUser.getImageUrl()); - secondUser.setLangKey(firstUser.getLangKey()); - secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); - - // Register second (non activated) user - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(secondUser))) - .andExpect(status().isCreated()); - - Optional testUser2 = userRepository.findOneByLogin("test-register-duplicate-email"); - assertThat(testUser2.isPresent()).isFalse(); - - Optional testUser3 = userRepository.findOneByLogin("test-register-duplicate-email-2"); - assertThat(testUser3.isPresent()).isTrue(); - - // Duplicate email - with uppercase email address - ManagedUserVM userWithUpperCaseEmail = new ManagedUserVM(); - userWithUpperCaseEmail.setId(firstUser.getId()); - userWithUpperCaseEmail.setLogin("test-register-duplicate-email-3"); - userWithUpperCaseEmail.setPassword(firstUser.getPassword()); - userWithUpperCaseEmail.setFirstName(firstUser.getFirstName()); - userWithUpperCaseEmail.setLastName(firstUser.getLastName()); - userWithUpperCaseEmail.setEmail("TEST-register-duplicate-email@example.com"); - userWithUpperCaseEmail.setImageUrl(firstUser.getImageUrl()); - userWithUpperCaseEmail.setLangKey(firstUser.getLangKey()); - userWithUpperCaseEmail.setAuthorities(new HashSet<>(firstUser.getAuthorities())); - - // Register third (not activated) user - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(userWithUpperCaseEmail))) - .andExpect(status().isCreated()); - - Optional testUser4 = userRepository.findOneByLogin("test-register-duplicate-email-3"); - assertThat(testUser4.isPresent()).isTrue(); - assertThat(testUser4.get().getEmail()).isEqualTo("test-register-duplicate-email@example.com"); - - testUser4.get().setActivated(true); - userService.updateUser((new UserDTO(testUser4.get()))); - - // Register 4th (already activated) user - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(secondUser))) - .andExpect(status().is4xxClientError()); - } - - @Test - @Transactional - public void testRegisterAdminIsIgnored() throws Exception { - ManagedUserVM validUser = new ManagedUserVM(); - validUser.setLogin("badguy"); - validUser.setPassword("password"); - validUser.setFirstName("Bad"); - validUser.setLastName("Guy"); - validUser.setEmail("badguy@example.com"); - validUser.setActivated(true); - validUser.setImageUrl("http://placehold.it/50x50"); - validUser.setLangKey(Constants.DEFAULT_LANGUAGE); - validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); - - restMvc.perform( - post("/api/register") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(validUser))) - .andExpect(status().isCreated()); - - Optional userDup = userRepository.findOneByLogin("badguy"); - assertThat(userDup.isPresent()).isTrue(); - assertThat(userDup.get().getAuthorities()).hasSize(1) - .containsExactly(authorityRepository.findById(AuthoritiesConstants.USER).get()); - } - - @Test - @Transactional - public void testActivateAccount() throws Exception { - final String activationKey = "some activation key"; - User user = new User(); - user.setLogin("activate-account"); - user.setEmail("activate-account@example.com"); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(false); - user.setActivationKey(activationKey); - - userRepository.saveAndFlush(user); - - restMvc.perform(get("/api/activate?key={activationKey}", activationKey)) - .andExpect(status().isOk()); - - user = userRepository.findOneByLogin(user.getLogin()).orElse(null); - assertThat(user.getActivated()).isTrue(); - } - - @Test - @Transactional - public void testActivateAccountWithWrongKey() throws Exception { - restMvc.perform(get("/api/activate?key=wrongActivationKey")) - .andExpect(status().isInternalServerError()); - } - - @Test - @Transactional - @WithMockUser("save-account") - public void testSaveAccount() throws Exception { - User user = new User(); - user.setLogin("save-account"); - user.setEmail("save-account@example.com"); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - - userRepository.saveAndFlush(user); - - UserDTO userDTO = new UserDTO(); - userDTO.setLogin("not-used"); - userDTO.setFirstName("firstname"); - userDTO.setLastName("lastname"); - userDTO.setEmail("save-account@example.com"); - userDTO.setActivated(false); - userDTO.setImageUrl("http://placehold.it/50x50"); - userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); - userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); - - restMvc.perform( - post("/api/account") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(userDTO))) - .andExpect(status().isOk()); - - User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); - assertThat(updatedUser.getFirstName()).isEqualTo(userDTO.getFirstName()); - assertThat(updatedUser.getLastName()).isEqualTo(userDTO.getLastName()); - assertThat(updatedUser.getEmail()).isEqualTo(userDTO.getEmail()); - assertThat(updatedUser.getLangKey()).isEqualTo(userDTO.getLangKey()); - assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); - assertThat(updatedUser.getImageUrl()).isEqualTo(userDTO.getImageUrl()); - assertThat(updatedUser.getActivated()).isEqualTo(true); - assertThat(updatedUser.getAuthorities()).isEmpty(); - } - - @Test - @Transactional - @WithMockUser("save-invalid-email") - public void testSaveInvalidEmail() throws Exception { - User user = new User(); - user.setLogin("save-invalid-email"); - user.setEmail("save-invalid-email@example.com"); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - - userRepository.saveAndFlush(user); - - UserDTO userDTO = new UserDTO(); - userDTO.setLogin("not-used"); - userDTO.setFirstName("firstname"); - userDTO.setLastName("lastname"); - userDTO.setEmail("invalid email"); - userDTO.setActivated(false); - userDTO.setImageUrl("http://placehold.it/50x50"); - userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); - userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); - - restMvc.perform( - post("/api/account") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(userDTO))) - .andExpect(status().isBadRequest()); - - assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent(); - } - - @Test - @Transactional - @WithMockUser("save-existing-email") - public void testSaveExistingEmail() throws Exception { - User user = new User(); - user.setLogin("save-existing-email"); - user.setEmail("save-existing-email@example.com"); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - - userRepository.saveAndFlush(user); - - User anotherUser = new User(); - anotherUser.setLogin("save-existing-email2"); - anotherUser.setEmail("save-existing-email2@example.com"); - anotherUser.setPassword(RandomStringUtils.random(60)); - anotherUser.setActivated(true); - - userRepository.saveAndFlush(anotherUser); - - UserDTO userDTO = new UserDTO(); - userDTO.setLogin("not-used"); - userDTO.setFirstName("firstname"); - userDTO.setLastName("lastname"); - userDTO.setEmail("save-existing-email2@example.com"); - userDTO.setActivated(false); - userDTO.setImageUrl("http://placehold.it/50x50"); - userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); - userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); - - restMvc.perform( - post("/api/account") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(userDTO))) - .andExpect(status().isBadRequest()); - - User updatedUser = userRepository.findOneByLogin("save-existing-email").orElse(null); - assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email@example.com"); - } - - @Test - @Transactional - @WithMockUser("save-existing-email-and-login") - public void testSaveExistingEmailAndLogin() throws Exception { - User user = new User(); - user.setLogin("save-existing-email-and-login"); - user.setEmail("save-existing-email-and-login@example.com"); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - - userRepository.saveAndFlush(user); - - UserDTO userDTO = new UserDTO(); - userDTO.setLogin("not-used"); - userDTO.setFirstName("firstname"); - userDTO.setLastName("lastname"); - userDTO.setEmail("save-existing-email-and-login@example.com"); - userDTO.setActivated(false); - userDTO.setImageUrl("http://placehold.it/50x50"); - userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); - userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); - - restMvc.perform( - post("/api/account") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(userDTO))) - .andExpect(status().isOk()); - - User updatedUser = userRepository.findOneByLogin("save-existing-email-and-login").orElse(null); - assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email-and-login@example.com"); - } - - @Test - @Transactional - @WithMockUser("change-password-wrong-existing-password") - public void testChangePasswordWrongExistingPassword() throws Exception { - User user = new User(); - String currentPassword = RandomStringUtils.random(60); - user.setPassword(passwordEncoder.encode(currentPassword)); - user.setLogin("change-password-wrong-existing-password"); - user.setEmail("change-password-wrong-existing-password@example.com"); - userRepository.saveAndFlush(user); - - restMvc.perform(post("/api/account/change-password") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO("1"+currentPassword, "new password")))) - .andExpect(status().isBadRequest()); - - User updatedUser = userRepository.findOneByLogin("change-password-wrong-existing-password").orElse(null); - assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isFalse(); - assertThat(passwordEncoder.matches(currentPassword, updatedUser.getPassword())).isTrue(); - } - - @Test - @Transactional - @WithMockUser("change-password") - public void testChangePassword() throws Exception { - User user = new User(); - String currentPassword = RandomStringUtils.random(60); - user.setPassword(passwordEncoder.encode(currentPassword)); - user.setLogin("change-password"); - user.setEmail("change-password@example.com"); - userRepository.saveAndFlush(user); - - restMvc.perform(post("/api/account/change-password") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "new password")))) - .andExpect(status().isOk()); - - User updatedUser = userRepository.findOneByLogin("change-password").orElse(null); - assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isTrue(); - } - - @Test - @Transactional - @WithMockUser("change-password-too-small") - public void testChangePasswordTooSmall() throws Exception { - User user = new User(); - String currentPassword = RandomStringUtils.random(60); - user.setPassword(passwordEncoder.encode(currentPassword)); - user.setLogin("change-password-too-small"); - user.setEmail("change-password-too-small@example.com"); - userRepository.saveAndFlush(user); - - String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MIN_LENGTH - 1); - - restMvc.perform(post("/api/account/change-password") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword)))) - .andExpect(status().isBadRequest()); - - User updatedUser = userRepository.findOneByLogin("change-password-too-small").orElse(null); - assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); - } - - @Test - @Transactional - @WithMockUser("change-password-too-long") - public void testChangePasswordTooLong() throws Exception { - User user = new User(); - String currentPassword = RandomStringUtils.random(60); - user.setPassword(passwordEncoder.encode(currentPassword)); - user.setLogin("change-password-too-long"); - user.setEmail("change-password-too-long@example.com"); - userRepository.saveAndFlush(user); - - String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MAX_LENGTH + 1); - - restMvc.perform(post("/api/account/change-password") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword)))) - .andExpect(status().isBadRequest()); - - User updatedUser = userRepository.findOneByLogin("change-password-too-long").orElse(null); - assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); - } - - @Test - @Transactional - @WithMockUser("change-password-empty") - public void testChangePasswordEmpty() throws Exception { - User user = new User(); - String currentPassword = RandomStringUtils.random(60); - user.setPassword(passwordEncoder.encode(currentPassword)); - user.setLogin("change-password-empty"); - user.setEmail("change-password-empty@example.com"); - userRepository.saveAndFlush(user); - - restMvc.perform(post("/api/account/change-password") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "")))) - .andExpect(status().isBadRequest()); - - User updatedUser = userRepository.findOneByLogin("change-password-empty").orElse(null); - assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); - } - - @Test - @Transactional - public void testRequestPasswordReset() throws Exception { - User user = new User(); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - user.setLogin("password-reset"); - user.setEmail("password-reset@example.com"); - userRepository.saveAndFlush(user); - - restMvc.perform(post("/api/account/reset-password/init") - .content("password-reset@example.com")) - .andExpect(status().isOk()); - } - - @Test - @Transactional - public void testRequestPasswordResetUpperCaseEmail() throws Exception { - User user = new User(); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - user.setLogin("password-reset"); - user.setEmail("password-reset@example.com"); - userRepository.saveAndFlush(user); - - restMvc.perform(post("/api/account/reset-password/init") - .content("password-reset@EXAMPLE.COM")) - .andExpect(status().isOk()); - } - - @Test - public void testRequestPasswordResetWrongEmail() throws Exception { - restMvc.perform( - post("/api/account/reset-password/init") - .content("password-reset-wrong-email@example.com")) - .andExpect(status().isBadRequest()); - } - - @Test - @Transactional - public void testFinishPasswordReset() throws Exception { - User user = new User(); - user.setPassword(RandomStringUtils.random(60)); - user.setLogin("finish-password-reset"); - user.setEmail("finish-password-reset@example.com"); - user.setResetDate(Instant.now().plusSeconds(60)); - user.setResetKey("reset key"); - userRepository.saveAndFlush(user); - - KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); - keyAndPassword.setKey(user.getResetKey()); - keyAndPassword.setNewPassword("new password"); - - restMvc.perform( - post("/api/account/reset-password/finish") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))) - .andExpect(status().isOk()); - - User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); - assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isTrue(); - } - - @Test - @Transactional - public void testFinishPasswordResetTooSmall() throws Exception { - User user = new User(); - user.setPassword(RandomStringUtils.random(60)); - user.setLogin("finish-password-reset-too-small"); - user.setEmail("finish-password-reset-too-small@example.com"); - user.setResetDate(Instant.now().plusSeconds(60)); - user.setResetKey("reset key too small"); - userRepository.saveAndFlush(user); - - KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); - keyAndPassword.setKey(user.getResetKey()); - keyAndPassword.setNewPassword("foo"); - - restMvc.perform( - post("/api/account/reset-password/finish") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))) - .andExpect(status().isBadRequest()); - - User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); - assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isFalse(); - } - - - @Test - @Transactional - public void testFinishPasswordResetWrongKey() throws Exception { - KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); - keyAndPassword.setKey("wrong reset key"); - keyAndPassword.setNewPassword("new password"); - - restMvc.perform( - post("/api/account/reset-password/finish") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(keyAndPassword))) - .andExpect(status().isInternalServerError()); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AuditResourceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AuditResourceIntegrationTest.java deleted file mode 100644 index 05d8f9d503..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/AuditResourceIntegrationTest.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.config.audit.AuditEventConverter; -import com.baeldung.jhipster5.domain.PersistentAuditEvent; -import com.baeldung.jhipster5.repository.PersistenceAuditEventRepository; -import com.baeldung.jhipster5.service.AuditEventService; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.web.PageableHandlerMethodArgumentResolver; -import org.springframework.format.support.FormattingConversionService; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; - -import java.time.Instant; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.hamcrest.Matchers.hasItem; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -/** - * Test class for the AuditResource REST controller. - * - * @see AuditResource - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -@Transactional -public class AuditResourceIntegrationTest { - - private static final String SAMPLE_PRINCIPAL = "SAMPLE_PRINCIPAL"; - private static final String SAMPLE_TYPE = "SAMPLE_TYPE"; - private static final Instant SAMPLE_TIMESTAMP = Instant.parse("2015-08-04T10:11:30Z"); - private static final long SECONDS_PER_DAY = 60 * 60 * 24; - - @Autowired - private PersistenceAuditEventRepository auditEventRepository; - - @Autowired - private AuditEventConverter auditEventConverter; - - @Autowired - private MappingJackson2HttpMessageConverter jacksonMessageConverter; - - @Autowired - private FormattingConversionService formattingConversionService; - - @Autowired - private PageableHandlerMethodArgumentResolver pageableArgumentResolver; - - private PersistentAuditEvent auditEvent; - - private MockMvc restAuditMockMvc; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - AuditEventService auditEventService = - new AuditEventService(auditEventRepository, auditEventConverter); - AuditResource auditResource = new AuditResource(auditEventService); - this.restAuditMockMvc = MockMvcBuilders.standaloneSetup(auditResource) - .setCustomArgumentResolvers(pageableArgumentResolver) - .setConversionService(formattingConversionService) - .setMessageConverters(jacksonMessageConverter).build(); - } - - @Before - public void initTest() { - auditEventRepository.deleteAll(); - auditEvent = new PersistentAuditEvent(); - auditEvent.setAuditEventType(SAMPLE_TYPE); - auditEvent.setPrincipal(SAMPLE_PRINCIPAL); - auditEvent.setAuditEventDate(SAMPLE_TIMESTAMP); - } - - @Test - public void getAllAudits() throws Exception { - // Initialize the database - auditEventRepository.save(auditEvent); - - // Get all the audits - restAuditMockMvc.perform(get("/management/audits")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); - } - - @Test - public void getAudit() throws Exception { - // Initialize the database - auditEventRepository.save(auditEvent); - - // Get the audit - restAuditMockMvc.perform(get("/management/audits/{id}", auditEvent.getId())) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.principal").value(SAMPLE_PRINCIPAL)); - } - - @Test - public void getAuditsByDate() throws Exception { - // Initialize the database - auditEventRepository.save(auditEvent); - - // Generate dates for selecting audits by date, making sure the period will contain the audit - String fromDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); - String toDate = SAMPLE_TIMESTAMP.plusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); - - // Get the audit - restAuditMockMvc.perform(get("/management/audits?fromDate="+fromDate+"&toDate="+toDate)) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); - } - - @Test - public void getNonExistingAuditsByDate() throws Exception { - // Initialize the database - auditEventRepository.save(auditEvent); - - // Generate dates for selecting audits by date, making sure the period will not contain the sample audit - String fromDate = SAMPLE_TIMESTAMP.minusSeconds(2*SECONDS_PER_DAY).toString().substring(0, 10); - String toDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); - - // Query audits but expect no results - restAuditMockMvc.perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate)) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(header().string("X-Total-Count", "0")); - } - - @Test - public void getNonExistingAudit() throws Exception { - // Get the audit - restAuditMockMvc.perform(get("/management/audits/{id}", Long.MAX_VALUE)) - .andExpect(status().isNotFound()); - } - - @Test - @Transactional - public void testPersistentAuditEventEquals() throws Exception { - TestUtil.equalsVerifier(PersistentAuditEvent.class); - PersistentAuditEvent auditEvent1 = new PersistentAuditEvent(); - auditEvent1.setId(1L); - PersistentAuditEvent auditEvent2 = new PersistentAuditEvent(); - auditEvent2.setId(auditEvent1.getId()); - assertThat(auditEvent1).isEqualTo(auditEvent2); - auditEvent2.setId(2L); - assertThat(auditEvent1).isNotEqualTo(auditEvent2); - auditEvent1.setId(null); - assertThat(auditEvent1).isNotEqualTo(auditEvent2); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/BookResourceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/BookResourceIntegrationTest.java deleted file mode 100644 index 4f5cb25cdb..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/BookResourceIntegrationTest.java +++ /dev/null @@ -1,416 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.BookstoreApp; - -import com.baeldung.jhipster5.domain.Book; -import com.baeldung.jhipster5.repository.BookRepository; -import com.baeldung.jhipster5.service.BookService; -import com.baeldung.jhipster5.service.dto.BookDTO; -import com.baeldung.jhipster5.service.mapper.BookMapper; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.web.PageableHandlerMethodArgumentResolver; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.Validator; - -import javax.persistence.EntityManager; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.List; - - -import static com.baeldung.jhipster5.web.rest.TestUtil.createFormattingConversionService; -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.hasItem; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -/** - * Test class for the BookResource REST controller. - * - * @see BookResource - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class BookResourceIntegrationTest { - - private static final String DEFAULT_TITLE = "AAAAAAAAAA"; - private static final String UPDATED_TITLE = "BBBBBBBBBB"; - - private static final String DEFAULT_AUTHOR = "AAAAAAAAAA"; - private static final String UPDATED_AUTHOR = "BBBBBBBBBB"; - - private static final LocalDate DEFAULT_PUBLISHED = LocalDate.ofEpochDay(0L); - private static final LocalDate UPDATED_PUBLISHED = LocalDate.now(ZoneId.systemDefault()); - - private static final Integer DEFAULT_QUANTITY = 0; - private static final Integer UPDATED_QUANTITY = 1; - - private static final Double DEFAULT_PRICE = 0D; - private static final Double UPDATED_PRICE = 1D; - - @Autowired - private BookRepository bookRepository; - - @Autowired - private BookMapper bookMapper; - - @Autowired - private BookService bookService; - - @Autowired - private MappingJackson2HttpMessageConverter jacksonMessageConverter; - - @Autowired - private PageableHandlerMethodArgumentResolver pageableArgumentResolver; - - @Autowired - private ExceptionTranslator exceptionTranslator; - - @Autowired - private EntityManager em; - - @Autowired - private Validator validator; - - private MockMvc restBookMockMvc; - - private Book book; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - final BookResource bookResource = new BookResource(bookService); - this.restBookMockMvc = MockMvcBuilders.standaloneSetup(bookResource) - .setCustomArgumentResolvers(pageableArgumentResolver) - .setControllerAdvice(exceptionTranslator) - .setConversionService(createFormattingConversionService()) - .setMessageConverters(jacksonMessageConverter) - .setValidator(validator).build(); - } - - /** - * Create an entity for this test. - * - * This is a static method, as tests for other entities might also need it, - * if they test an entity which requires the current entity. - */ - public static Book createEntity(EntityManager em) { - Book book = new Book() - .title(DEFAULT_TITLE) - .author(DEFAULT_AUTHOR) - .published(DEFAULT_PUBLISHED) - .quantity(DEFAULT_QUANTITY) - .price(DEFAULT_PRICE); - return book; - } - - @Before - public void initTest() { - book = createEntity(em); - } - - @Test - @Transactional - public void createBook() throws Exception { - int databaseSizeBeforeCreate = bookRepository.findAll().size(); - - // Create the Book - BookDTO bookDTO = bookMapper.toDto(book); - restBookMockMvc.perform(post("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isCreated()); - - // Validate the Book in the database - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeCreate + 1); - Book testBook = bookList.get(bookList.size() - 1); - assertThat(testBook.getTitle()).isEqualTo(DEFAULT_TITLE); - assertThat(testBook.getAuthor()).isEqualTo(DEFAULT_AUTHOR); - assertThat(testBook.getPublished()).isEqualTo(DEFAULT_PUBLISHED); - assertThat(testBook.getQuantity()).isEqualTo(DEFAULT_QUANTITY); - assertThat(testBook.getPrice()).isEqualTo(DEFAULT_PRICE); - } - - @Test - @Transactional - public void createBookWithExistingId() throws Exception { - int databaseSizeBeforeCreate = bookRepository.findAll().size(); - - // Create the Book with an existing ID - book.setId(1L); - BookDTO bookDTO = bookMapper.toDto(book); - - // An entity with an existing ID cannot be created, so this API call must fail - restBookMockMvc.perform(post("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isBadRequest()); - - // Validate the Book in the database - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeCreate); - } - - @Test - @Transactional - public void checkTitleIsRequired() throws Exception { - int databaseSizeBeforeTest = bookRepository.findAll().size(); - // set the field null - book.setTitle(null); - - // Create the Book, which fails. - BookDTO bookDTO = bookMapper.toDto(book); - - restBookMockMvc.perform(post("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isBadRequest()); - - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeTest); - } - - @Test - @Transactional - public void checkAuthorIsRequired() throws Exception { - int databaseSizeBeforeTest = bookRepository.findAll().size(); - // set the field null - book.setAuthor(null); - - // Create the Book, which fails. - BookDTO bookDTO = bookMapper.toDto(book); - - restBookMockMvc.perform(post("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isBadRequest()); - - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeTest); - } - - @Test - @Transactional - public void checkPublishedIsRequired() throws Exception { - int databaseSizeBeforeTest = bookRepository.findAll().size(); - // set the field null - book.setPublished(null); - - // Create the Book, which fails. - BookDTO bookDTO = bookMapper.toDto(book); - - restBookMockMvc.perform(post("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isBadRequest()); - - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeTest); - } - - @Test - @Transactional - public void checkQuantityIsRequired() throws Exception { - int databaseSizeBeforeTest = bookRepository.findAll().size(); - // set the field null - book.setQuantity(null); - - // Create the Book, which fails. - BookDTO bookDTO = bookMapper.toDto(book); - - restBookMockMvc.perform(post("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isBadRequest()); - - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeTest); - } - - @Test - @Transactional - public void checkPriceIsRequired() throws Exception { - int databaseSizeBeforeTest = bookRepository.findAll().size(); - // set the field null - book.setPrice(null); - - // Create the Book, which fails. - BookDTO bookDTO = bookMapper.toDto(book); - - restBookMockMvc.perform(post("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isBadRequest()); - - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeTest); - } - - @Test - @Transactional - public void getAllBooks() throws Exception { - // Initialize the database - bookRepository.saveAndFlush(book); - - // Get all the bookList - restBookMockMvc.perform(get("/api/books?sort=id,desc")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.[*].id").value(hasItem(book.getId().intValue()))) - .andExpect(jsonPath("$.[*].title").value(hasItem(DEFAULT_TITLE.toString()))) - .andExpect(jsonPath("$.[*].author").value(hasItem(DEFAULT_AUTHOR.toString()))) - .andExpect(jsonPath("$.[*].published").value(hasItem(DEFAULT_PUBLISHED.toString()))) - .andExpect(jsonPath("$.[*].quantity").value(hasItem(DEFAULT_QUANTITY))) - .andExpect(jsonPath("$.[*].price").value(hasItem(DEFAULT_PRICE.doubleValue()))); - } - - @Test - @Transactional - public void getBook() throws Exception { - // Initialize the database - bookRepository.saveAndFlush(book); - - // Get the book - restBookMockMvc.perform(get("/api/books/{id}", book.getId())) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.id").value(book.getId().intValue())) - .andExpect(jsonPath("$.title").value(DEFAULT_TITLE.toString())) - .andExpect(jsonPath("$.author").value(DEFAULT_AUTHOR.toString())) - .andExpect(jsonPath("$.published").value(DEFAULT_PUBLISHED.toString())) - .andExpect(jsonPath("$.quantity").value(DEFAULT_QUANTITY)) - .andExpect(jsonPath("$.price").value(DEFAULT_PRICE.doubleValue())); - } - - @Test - @Transactional - public void getNonExistingBook() throws Exception { - // Get the book - restBookMockMvc.perform(get("/api/books/{id}", Long.MAX_VALUE)) - .andExpect(status().isNotFound()); - } - - @Test - @Transactional - public void updateBook() throws Exception { - // Initialize the database - bookRepository.saveAndFlush(book); - - int databaseSizeBeforeUpdate = bookRepository.findAll().size(); - - // Update the book - Book updatedBook = bookRepository.findById(book.getId()).get(); - // Disconnect from session so that the updates on updatedBook are not directly saved in db - em.detach(updatedBook); - updatedBook - .title(UPDATED_TITLE) - .author(UPDATED_AUTHOR) - .published(UPDATED_PUBLISHED) - .quantity(UPDATED_QUANTITY) - .price(UPDATED_PRICE); - BookDTO bookDTO = bookMapper.toDto(updatedBook); - - restBookMockMvc.perform(put("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isOk()); - - // Validate the Book in the database - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeUpdate); - Book testBook = bookList.get(bookList.size() - 1); - assertThat(testBook.getTitle()).isEqualTo(UPDATED_TITLE); - assertThat(testBook.getAuthor()).isEqualTo(UPDATED_AUTHOR); - assertThat(testBook.getPublished()).isEqualTo(UPDATED_PUBLISHED); - assertThat(testBook.getQuantity()).isEqualTo(UPDATED_QUANTITY); - assertThat(testBook.getPrice()).isEqualTo(UPDATED_PRICE); - } - - @Test - @Transactional - public void updateNonExistingBook() throws Exception { - int databaseSizeBeforeUpdate = bookRepository.findAll().size(); - - // Create the Book - BookDTO bookDTO = bookMapper.toDto(book); - - // If the entity doesn't have an ID, it will throw BadRequestAlertException - restBookMockMvc.perform(put("/api/books") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(bookDTO))) - .andExpect(status().isBadRequest()); - - // Validate the Book in the database - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeUpdate); - } - - @Test - @Transactional - public void deleteBook() throws Exception { - // Initialize the database - bookRepository.saveAndFlush(book); - - int databaseSizeBeforeDelete = bookRepository.findAll().size(); - - // Delete the book - restBookMockMvc.perform(delete("/api/books/{id}", book.getId()) - .accept(TestUtil.APPLICATION_JSON_UTF8)) - .andExpect(status().isOk()); - - // Validate the database is empty - List bookList = bookRepository.findAll(); - assertThat(bookList).hasSize(databaseSizeBeforeDelete - 1); - } - - @Test - @Transactional - public void equalsVerifier() throws Exception { - TestUtil.equalsVerifier(Book.class); - Book book1 = new Book(); - book1.setId(1L); - Book book2 = new Book(); - book2.setId(book1.getId()); - assertThat(book1).isEqualTo(book2); - book2.setId(2L); - assertThat(book1).isNotEqualTo(book2); - book1.setId(null); - assertThat(book1).isNotEqualTo(book2); - } - - @Test - @Transactional - public void dtoEqualsVerifier() throws Exception { - TestUtil.equalsVerifier(BookDTO.class); - BookDTO bookDTO1 = new BookDTO(); - bookDTO1.setId(1L); - BookDTO bookDTO2 = new BookDTO(); - assertThat(bookDTO1).isNotEqualTo(bookDTO2); - bookDTO2.setId(bookDTO1.getId()); - assertThat(bookDTO1).isEqualTo(bookDTO2); - bookDTO2.setId(2L); - assertThat(bookDTO1).isNotEqualTo(bookDTO2); - bookDTO1.setId(null); - assertThat(bookDTO1).isNotEqualTo(bookDTO2); - } - - @Test - @Transactional - public void testEntityFromId() { - assertThat(bookMapper.fromId(42L).getId()).isEqualTo(42); - assertThat(bookMapper.fromId(null)).isNull(); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/LogsResourceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/LogsResourceIntegrationTest.java deleted file mode 100644 index b045f52f87..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/LogsResourceIntegrationTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.web.rest.vm.LoggerVM; -import ch.qos.logback.classic.AsyncAppender; -import ch.qos.logback.classic.LoggerContext; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * Test class for the LogsResource REST controller. - * - * @see LogsResource - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class LogsResourceIntegrationTest { - - private MockMvc restLogsMockMvc; - - @Before - public void setup() { - LogsResource logsResource = new LogsResource(); - this.restLogsMockMvc = MockMvcBuilders - .standaloneSetup(logsResource) - .build(); - } - - @Test - public void getAllLogs() throws Exception { - restLogsMockMvc.perform(get("/management/logs")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)); - } - - @Test - public void changeLogs() throws Exception { - LoggerVM logger = new LoggerVM(); - logger.setLevel("INFO"); - logger.setName("ROOT"); - - restLogsMockMvc.perform(put("/management/logs") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(logger))) - .andExpect(status().isNoContent()); - } - - @Test - public void testLogstashAppender() { - LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - assertThat(context.getLogger("ROOT").getAppender("ASYNC_LOGSTASH")).isInstanceOf(AsyncAppender.class); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/TestUtil.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/TestUtil.java deleted file mode 100644 index 403bb9c9b0..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/TestUtil.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import org.hamcrest.Description; -import org.hamcrest.TypeSafeDiagnosingMatcher; -import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; -import org.springframework.format.support.DefaultFormattingConversionService; -import org.springframework.format.support.FormattingConversionService; -import org.springframework.http.MediaType; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.time.ZonedDateTime; -import java.time.format.DateTimeParseException; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Utility class for testing REST controllers. - */ -public final class TestUtil { - - private static final ObjectMapper mapper = createObjectMapper(); - - /** MediaType for JSON UTF8 */ - public static final MediaType APPLICATION_JSON_UTF8 = new MediaType( - MediaType.APPLICATION_JSON.getType(), - MediaType.APPLICATION_JSON.getSubtype(), StandardCharsets.UTF_8); - - - private static ObjectMapper createObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); - mapper.registerModule(new JavaTimeModule()); - return mapper; - } - - /** - * Convert an object to JSON byte array. - * - * @param object - * the object to convert - * @return the JSON byte array - * @throws IOException - */ - public static byte[] convertObjectToJsonBytes(Object object) - throws IOException { - return mapper.writeValueAsBytes(object); - } - - /** - * Create a byte array with a specific size filled with specified data. - * - * @param size the size of the byte array - * @param data the data to put in the byte array - * @return the JSON byte array - */ - public static byte[] createByteArray(int size, String data) { - byte[] byteArray = new byte[size]; - for (int i = 0; i < size; i++) { - byteArray[i] = Byte.parseByte(data, 2); - } - return byteArray; - } - - /** - * A matcher that tests that the examined string represents the same instant as the reference datetime. - */ - public static class ZonedDateTimeMatcher extends TypeSafeDiagnosingMatcher { - - private final ZonedDateTime date; - - public ZonedDateTimeMatcher(ZonedDateTime date) { - this.date = date; - } - - @Override - protected boolean matchesSafely(String item, Description mismatchDescription) { - try { - if (!date.isEqual(ZonedDateTime.parse(item))) { - mismatchDescription.appendText("was ").appendValue(item); - return false; - } - return true; - } catch (DateTimeParseException e) { - mismatchDescription.appendText("was ").appendValue(item) - .appendText(", which could not be parsed as a ZonedDateTime"); - return false; - } - - } - - @Override - public void describeTo(Description description) { - description.appendText("a String representing the same Instant as ").appendValue(date); - } - } - - /** - * Creates a matcher that matches when the examined string reprensents the same instant as the reference datetime - * @param date the reference datetime against which the examined string is checked - */ - public static ZonedDateTimeMatcher sameInstant(ZonedDateTime date) { - return new ZonedDateTimeMatcher(date); - } - - /** - * Verifies the equals/hashcode contract on the domain object. - */ - public static void equalsVerifier(Class clazz) throws Exception { - T domainObject1 = clazz.getConstructor().newInstance(); - assertThat(domainObject1.toString()).isNotNull(); - assertThat(domainObject1).isEqualTo(domainObject1); - assertThat(domainObject1.hashCode()).isEqualTo(domainObject1.hashCode()); - // Test with an instance of another class - Object testOtherObject = new Object(); - assertThat(domainObject1).isNotEqualTo(testOtherObject); - assertThat(domainObject1).isNotEqualTo(null); - // Test with an instance of the same class - T domainObject2 = clazz.getConstructor().newInstance(); - assertThat(domainObject1).isNotEqualTo(domainObject2); - // HashCodes are equals because the objects are not persisted yet - assertThat(domainObject1.hashCode()).isEqualTo(domainObject2.hashCode()); - } - - /** - * Create a FormattingConversionService which use ISO date format, instead of the localized one. - * @return the FormattingConversionService - */ - public static FormattingConversionService createFormattingConversionService() { - DefaultFormattingConversionService dfcs = new DefaultFormattingConversionService (); - DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); - registrar.setUseIsoFormat(true); - registrar.registerFormatters(dfcs); - return dfcs; - } - - private TestUtil() {} -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserJWTControllerIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserJWTControllerIntegrationTest.java deleted file mode 100644 index 7cfc0e19fc..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserJWTControllerIntegrationTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.jwt.TokenProvider; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; -import com.baeldung.jhipster5.web.rest.vm.LoginVM; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; - -/** - * Test class for the UserJWTController REST controller. - * - * @see UserJWTController - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class UserJWTControllerIntegrationTest { - - @Autowired - private TokenProvider tokenProvider; - - @Autowired - private AuthenticationManager authenticationManager; - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Autowired - private ExceptionTranslator exceptionTranslator; - - private MockMvc mockMvc; - - @Before - public void setup() { - UserJWTController userJWTController = new UserJWTController(tokenProvider, authenticationManager); - this.mockMvc = MockMvcBuilders.standaloneSetup(userJWTController) - .setControllerAdvice(exceptionTranslator) - .build(); - } - - @Test - @Transactional - public void testAuthorize() throws Exception { - User user = new User(); - user.setLogin("user-jwt-controller"); - user.setEmail("user-jwt-controller@example.com"); - user.setActivated(true); - user.setPassword(passwordEncoder.encode("test")); - - userRepository.saveAndFlush(user); - - LoginVM login = new LoginVM(); - login.setUsername("user-jwt-controller"); - login.setPassword("test"); - mockMvc.perform(post("/api/authenticate") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(login))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.id_token").isString()) - .andExpect(jsonPath("$.id_token").isNotEmpty()) - .andExpect(header().string("Authorization", not(nullValue()))) - .andExpect(header().string("Authorization", not(isEmptyString()))); - } - - @Test - @Transactional - public void testAuthorizeWithRememberMe() throws Exception { - User user = new User(); - user.setLogin("user-jwt-controller-remember-me"); - user.setEmail("user-jwt-controller-remember-me@example.com"); - user.setActivated(true); - user.setPassword(passwordEncoder.encode("test")); - - userRepository.saveAndFlush(user); - - LoginVM login = new LoginVM(); - login.setUsername("user-jwt-controller-remember-me"); - login.setPassword("test"); - login.setRememberMe(true); - mockMvc.perform(post("/api/authenticate") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(login))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.id_token").isString()) - .andExpect(jsonPath("$.id_token").isNotEmpty()) - .andExpect(header().string("Authorization", not(nullValue()))) - .andExpect(header().string("Authorization", not(isEmptyString()))); - } - - @Test - @Transactional - public void testAuthorizeFails() throws Exception { - LoginVM login = new LoginVM(); - login.setUsername("wrong-user"); - login.setPassword("wrong password"); - mockMvc.perform(post("/api/authenticate") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(login))) - .andExpect(status().isUnauthorized()) - .andExpect(jsonPath("$.id_token").doesNotExist()) - .andExpect(header().doesNotExist("Authorization")); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserResourceIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserResourceIntegrationTest.java deleted file mode 100644 index c0abc042fb..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/UserResourceIntegrationTest.java +++ /dev/null @@ -1,596 +0,0 @@ -package com.baeldung.jhipster5.web.rest; - -import com.baeldung.jhipster5.BookstoreApp; -import com.baeldung.jhipster5.domain.Authority; -import com.baeldung.jhipster5.domain.User; -import com.baeldung.jhipster5.repository.UserRepository; -import com.baeldung.jhipster5.security.AuthoritiesConstants; -import com.baeldung.jhipster5.service.MailService; -import com.baeldung.jhipster5.service.UserService; -import com.baeldung.jhipster5.service.dto.UserDTO; -import com.baeldung.jhipster5.service.mapper.UserMapper; -import com.baeldung.jhipster5.web.rest.errors.ExceptionTranslator; -import com.baeldung.jhipster5.web.rest.vm.ManagedUserVM; -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.web.PageableHandlerMethodArgumentResolver; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; - -import javax.persistence.EntityManager; -import java.time.Instant; -import java.util.*; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.hasItems; -import static org.hamcrest.Matchers.hasItem; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -/** - * Test class for the UserResource REST controller. - * - * @see UserResource - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class UserResourceIntegrationTest { - - private static final String DEFAULT_LOGIN = "johndoe"; - private static final String UPDATED_LOGIN = "jhipster"; - - private static final Long DEFAULT_ID = 1L; - - private static final String DEFAULT_PASSWORD = "passjohndoe"; - private static final String UPDATED_PASSWORD = "passjhipster"; - - private static final String DEFAULT_EMAIL = "johndoe@localhost"; - private static final String UPDATED_EMAIL = "jhipster@localhost"; - - private static final String DEFAULT_FIRSTNAME = "john"; - private static final String UPDATED_FIRSTNAME = "jhipsterFirstName"; - - private static final String DEFAULT_LASTNAME = "doe"; - private static final String UPDATED_LASTNAME = "jhipsterLastName"; - - private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; - private static final String UPDATED_IMAGEURL = "http://placehold.it/40x40"; - - private static final String DEFAULT_LANGKEY = "en"; - private static final String UPDATED_LANGKEY = "fr"; - - @Autowired - private UserRepository userRepository; - - @Autowired - private MailService mailService; - - @Autowired - private UserService userService; - - @Autowired - private UserMapper userMapper; - - @Autowired - private MappingJackson2HttpMessageConverter jacksonMessageConverter; - - @Autowired - private PageableHandlerMethodArgumentResolver pageableArgumentResolver; - - @Autowired - private ExceptionTranslator exceptionTranslator; - - @Autowired - private EntityManager em; - - private MockMvc restUserMockMvc; - - private User user; - - @Before - public void setup() { - UserResource userResource = new UserResource(userService, userRepository, mailService); - - this.restUserMockMvc = MockMvcBuilders.standaloneSetup(userResource) - .setCustomArgumentResolvers(pageableArgumentResolver) - .setControllerAdvice(exceptionTranslator) - .setMessageConverters(jacksonMessageConverter) - .build(); - } - - /** - * Create a User. - * - * This is a static method, as tests for other entities might also need it, - * if they test an entity which has a required relationship to the User entity. - */ - public static User createEntity(EntityManager em) { - User user = new User(); - user.setLogin(DEFAULT_LOGIN + RandomStringUtils.randomAlphabetic(5)); - user.setPassword(RandomStringUtils.random(60)); - user.setActivated(true); - user.setEmail(RandomStringUtils.randomAlphabetic(5) + DEFAULT_EMAIL); - user.setFirstName(DEFAULT_FIRSTNAME); - user.setLastName(DEFAULT_LASTNAME); - user.setImageUrl(DEFAULT_IMAGEURL); - user.setLangKey(DEFAULT_LANGKEY); - return user; - } - - @Before - public void initTest() { - user = createEntity(em); - user.setLogin(DEFAULT_LOGIN); - user.setEmail(DEFAULT_EMAIL); - } - - @Test - @Transactional - public void createUser() throws Exception { - int databaseSizeBeforeCreate = userRepository.findAll().size(); - - // Create the User - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setLogin(DEFAULT_LOGIN); - managedUserVM.setPassword(DEFAULT_PASSWORD); - managedUserVM.setFirstName(DEFAULT_FIRSTNAME); - managedUserVM.setLastName(DEFAULT_LASTNAME); - managedUserVM.setEmail(DEFAULT_EMAIL); - managedUserVM.setActivated(true); - managedUserVM.setImageUrl(DEFAULT_IMAGEURL); - managedUserVM.setLangKey(DEFAULT_LANGKEY); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform(post("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isCreated()); - - // Validate the User in the database - List userList = userRepository.findAll(); - assertThat(userList).hasSize(databaseSizeBeforeCreate + 1); - User testUser = userList.get(userList.size() - 1); - assertThat(testUser.getLogin()).isEqualTo(DEFAULT_LOGIN); - assertThat(testUser.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); - assertThat(testUser.getLastName()).isEqualTo(DEFAULT_LASTNAME); - assertThat(testUser.getEmail()).isEqualTo(DEFAULT_EMAIL); - assertThat(testUser.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); - assertThat(testUser.getLangKey()).isEqualTo(DEFAULT_LANGKEY); - } - - @Test - @Transactional - public void createUserWithExistingId() throws Exception { - int databaseSizeBeforeCreate = userRepository.findAll().size(); - - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setId(1L); - managedUserVM.setLogin(DEFAULT_LOGIN); - managedUserVM.setPassword(DEFAULT_PASSWORD); - managedUserVM.setFirstName(DEFAULT_FIRSTNAME); - managedUserVM.setLastName(DEFAULT_LASTNAME); - managedUserVM.setEmail(DEFAULT_EMAIL); - managedUserVM.setActivated(true); - managedUserVM.setImageUrl(DEFAULT_IMAGEURL); - managedUserVM.setLangKey(DEFAULT_LANGKEY); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - // An entity with an existing ID cannot be created, so this API call must fail - restUserMockMvc.perform(post("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isBadRequest()); - - // Validate the User in the database - List userList = userRepository.findAll(); - assertThat(userList).hasSize(databaseSizeBeforeCreate); - } - - @Test - @Transactional - public void createUserWithExistingLogin() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - int databaseSizeBeforeCreate = userRepository.findAll().size(); - - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setLogin(DEFAULT_LOGIN);// this login should already be used - managedUserVM.setPassword(DEFAULT_PASSWORD); - managedUserVM.setFirstName(DEFAULT_FIRSTNAME); - managedUserVM.setLastName(DEFAULT_LASTNAME); - managedUserVM.setEmail("anothermail@localhost"); - managedUserVM.setActivated(true); - managedUserVM.setImageUrl(DEFAULT_IMAGEURL); - managedUserVM.setLangKey(DEFAULT_LANGKEY); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - // Create the User - restUserMockMvc.perform(post("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isBadRequest()); - - // Validate the User in the database - List userList = userRepository.findAll(); - assertThat(userList).hasSize(databaseSizeBeforeCreate); - } - - @Test - @Transactional - public void createUserWithExistingEmail() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - int databaseSizeBeforeCreate = userRepository.findAll().size(); - - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setLogin("anotherlogin"); - managedUserVM.setPassword(DEFAULT_PASSWORD); - managedUserVM.setFirstName(DEFAULT_FIRSTNAME); - managedUserVM.setLastName(DEFAULT_LASTNAME); - managedUserVM.setEmail(DEFAULT_EMAIL);// this email should already be used - managedUserVM.setActivated(true); - managedUserVM.setImageUrl(DEFAULT_IMAGEURL); - managedUserVM.setLangKey(DEFAULT_LANGKEY); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - // Create the User - restUserMockMvc.perform(post("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isBadRequest()); - - // Validate the User in the database - List userList = userRepository.findAll(); - assertThat(userList).hasSize(databaseSizeBeforeCreate); - } - - @Test - @Transactional - public void getAllUsers() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - - // Get all the users - restUserMockMvc.perform(get("/api/users?sort=id,desc") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.[*].login").value(hasItem(DEFAULT_LOGIN))) - .andExpect(jsonPath("$.[*].firstName").value(hasItem(DEFAULT_FIRSTNAME))) - .andExpect(jsonPath("$.[*].lastName").value(hasItem(DEFAULT_LASTNAME))) - .andExpect(jsonPath("$.[*].email").value(hasItem(DEFAULT_EMAIL))) - .andExpect(jsonPath("$.[*].imageUrl").value(hasItem(DEFAULT_IMAGEURL))) - .andExpect(jsonPath("$.[*].langKey").value(hasItem(DEFAULT_LANGKEY))); - } - - @Test - @Transactional - public void getUser() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - - // Get the user - restUserMockMvc.perform(get("/api/users/{login}", user.getLogin())) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$.login").value(user.getLogin())) - .andExpect(jsonPath("$.firstName").value(DEFAULT_FIRSTNAME)) - .andExpect(jsonPath("$.lastName").value(DEFAULT_LASTNAME)) - .andExpect(jsonPath("$.email").value(DEFAULT_EMAIL)) - .andExpect(jsonPath("$.imageUrl").value(DEFAULT_IMAGEURL)) - .andExpect(jsonPath("$.langKey").value(DEFAULT_LANGKEY)); - } - - @Test - @Transactional - public void getNonExistingUser() throws Exception { - restUserMockMvc.perform(get("/api/users/unknown")) - .andExpect(status().isNotFound()); - } - - @Test - @Transactional - public void updateUser() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - int databaseSizeBeforeUpdate = userRepository.findAll().size(); - - // Update the user - User updatedUser = userRepository.findById(user.getId()).get(); - - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setId(updatedUser.getId()); - managedUserVM.setLogin(updatedUser.getLogin()); - managedUserVM.setPassword(UPDATED_PASSWORD); - managedUserVM.setFirstName(UPDATED_FIRSTNAME); - managedUserVM.setLastName(UPDATED_LASTNAME); - managedUserVM.setEmail(UPDATED_EMAIL); - managedUserVM.setActivated(updatedUser.getActivated()); - managedUserVM.setImageUrl(UPDATED_IMAGEURL); - managedUserVM.setLangKey(UPDATED_LANGKEY); - managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); - managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); - managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); - managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform(put("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isOk()); - - // Validate the User in the database - List userList = userRepository.findAll(); - assertThat(userList).hasSize(databaseSizeBeforeUpdate); - User testUser = userList.get(userList.size() - 1); - assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); - assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); - assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); - assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); - assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); - } - - @Test - @Transactional - public void updateUserLogin() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - int databaseSizeBeforeUpdate = userRepository.findAll().size(); - - // Update the user - User updatedUser = userRepository.findById(user.getId()).get(); - - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setId(updatedUser.getId()); - managedUserVM.setLogin(UPDATED_LOGIN); - managedUserVM.setPassword(UPDATED_PASSWORD); - managedUserVM.setFirstName(UPDATED_FIRSTNAME); - managedUserVM.setLastName(UPDATED_LASTNAME); - managedUserVM.setEmail(UPDATED_EMAIL); - managedUserVM.setActivated(updatedUser.getActivated()); - managedUserVM.setImageUrl(UPDATED_IMAGEURL); - managedUserVM.setLangKey(UPDATED_LANGKEY); - managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); - managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); - managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); - managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform(put("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isOk()); - - // Validate the User in the database - List userList = userRepository.findAll(); - assertThat(userList).hasSize(databaseSizeBeforeUpdate); - User testUser = userList.get(userList.size() - 1); - assertThat(testUser.getLogin()).isEqualTo(UPDATED_LOGIN); - assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); - assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); - assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); - assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); - assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); - } - - @Test - @Transactional - public void updateUserExistingEmail() throws Exception { - // Initialize the database with 2 users - userRepository.saveAndFlush(user); - - User anotherUser = new User(); - anotherUser.setLogin("jhipster"); - anotherUser.setPassword(RandomStringUtils.random(60)); - anotherUser.setActivated(true); - anotherUser.setEmail("jhipster@localhost"); - anotherUser.setFirstName("java"); - anotherUser.setLastName("hipster"); - anotherUser.setImageUrl(""); - anotherUser.setLangKey("en"); - userRepository.saveAndFlush(anotherUser); - - // Update the user - User updatedUser = userRepository.findById(user.getId()).get(); - - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setId(updatedUser.getId()); - managedUserVM.setLogin(updatedUser.getLogin()); - managedUserVM.setPassword(updatedUser.getPassword()); - managedUserVM.setFirstName(updatedUser.getFirstName()); - managedUserVM.setLastName(updatedUser.getLastName()); - managedUserVM.setEmail("jhipster@localhost");// this email should already be used by anotherUser - managedUserVM.setActivated(updatedUser.getActivated()); - managedUserVM.setImageUrl(updatedUser.getImageUrl()); - managedUserVM.setLangKey(updatedUser.getLangKey()); - managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); - managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); - managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); - managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform(put("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isBadRequest()); - } - - @Test - @Transactional - public void updateUserExistingLogin() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - - User anotherUser = new User(); - anotherUser.setLogin("jhipster"); - anotherUser.setPassword(RandomStringUtils.random(60)); - anotherUser.setActivated(true); - anotherUser.setEmail("jhipster@localhost"); - anotherUser.setFirstName("java"); - anotherUser.setLastName("hipster"); - anotherUser.setImageUrl(""); - anotherUser.setLangKey("en"); - userRepository.saveAndFlush(anotherUser); - - // Update the user - User updatedUser = userRepository.findById(user.getId()).get(); - - ManagedUserVM managedUserVM = new ManagedUserVM(); - managedUserVM.setId(updatedUser.getId()); - managedUserVM.setLogin("jhipster");// this login should already be used by anotherUser - managedUserVM.setPassword(updatedUser.getPassword()); - managedUserVM.setFirstName(updatedUser.getFirstName()); - managedUserVM.setLastName(updatedUser.getLastName()); - managedUserVM.setEmail(updatedUser.getEmail()); - managedUserVM.setActivated(updatedUser.getActivated()); - managedUserVM.setImageUrl(updatedUser.getImageUrl()); - managedUserVM.setLangKey(updatedUser.getLangKey()); - managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); - managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); - managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); - managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); - managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - restUserMockMvc.perform(put("/api/users") - .contentType(TestUtil.APPLICATION_JSON_UTF8) - .content(TestUtil.convertObjectToJsonBytes(managedUserVM))) - .andExpect(status().isBadRequest()); - } - - @Test - @Transactional - public void deleteUser() throws Exception { - // Initialize the database - userRepository.saveAndFlush(user); - int databaseSizeBeforeDelete = userRepository.findAll().size(); - - // Delete the user - restUserMockMvc.perform(delete("/api/users/{login}", user.getLogin()) - .accept(TestUtil.APPLICATION_JSON_UTF8)) - .andExpect(status().isOk()); - - // Validate the database is empty - List userList = userRepository.findAll(); - assertThat(userList).hasSize(databaseSizeBeforeDelete - 1); - } - - @Test - @Transactional - public void getAllAuthorities() throws Exception { - restUserMockMvc.perform(get("/api/users/authorities") - .accept(TestUtil.APPLICATION_JSON_UTF8) - .contentType(TestUtil.APPLICATION_JSON_UTF8)) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) - .andExpect(jsonPath("$").isArray()) - .andExpect(jsonPath("$").value(hasItems(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN))); - } - - @Test - @Transactional - public void testUserEquals() throws Exception { - TestUtil.equalsVerifier(User.class); - User user1 = new User(); - user1.setId(1L); - User user2 = new User(); - user2.setId(user1.getId()); - assertThat(user1).isEqualTo(user2); - user2.setId(2L); - assertThat(user1).isNotEqualTo(user2); - user1.setId(null); - assertThat(user1).isNotEqualTo(user2); - } - - @Test - public void testUserDTOtoUser() { - UserDTO userDTO = new UserDTO(); - userDTO.setId(DEFAULT_ID); - userDTO.setLogin(DEFAULT_LOGIN); - userDTO.setFirstName(DEFAULT_FIRSTNAME); - userDTO.setLastName(DEFAULT_LASTNAME); - userDTO.setEmail(DEFAULT_EMAIL); - userDTO.setActivated(true); - userDTO.setImageUrl(DEFAULT_IMAGEURL); - userDTO.setLangKey(DEFAULT_LANGKEY); - userDTO.setCreatedBy(DEFAULT_LOGIN); - userDTO.setLastModifiedBy(DEFAULT_LOGIN); - userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); - - User user = userMapper.userDTOToUser(userDTO); - assertThat(user.getId()).isEqualTo(DEFAULT_ID); - assertThat(user.getLogin()).isEqualTo(DEFAULT_LOGIN); - assertThat(user.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); - assertThat(user.getLastName()).isEqualTo(DEFAULT_LASTNAME); - assertThat(user.getEmail()).isEqualTo(DEFAULT_EMAIL); - assertThat(user.getActivated()).isEqualTo(true); - assertThat(user.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); - assertThat(user.getLangKey()).isEqualTo(DEFAULT_LANGKEY); - assertThat(user.getCreatedBy()).isNull(); - assertThat(user.getCreatedDate()).isNotNull(); - assertThat(user.getLastModifiedBy()).isNull(); - assertThat(user.getLastModifiedDate()).isNotNull(); - assertThat(user.getAuthorities()).extracting("name").containsExactly(AuthoritiesConstants.USER); - } - - @Test - public void testUserToUserDTO() { - user.setId(DEFAULT_ID); - user.setCreatedBy(DEFAULT_LOGIN); - user.setCreatedDate(Instant.now()); - user.setLastModifiedBy(DEFAULT_LOGIN); - user.setLastModifiedDate(Instant.now()); - Set authorities = new HashSet<>(); - Authority authority = new Authority(); - authority.setName(AuthoritiesConstants.USER); - authorities.add(authority); - user.setAuthorities(authorities); - - UserDTO userDTO = userMapper.userToUserDTO(user); - - assertThat(userDTO.getId()).isEqualTo(DEFAULT_ID); - assertThat(userDTO.getLogin()).isEqualTo(DEFAULT_LOGIN); - assertThat(userDTO.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); - assertThat(userDTO.getLastName()).isEqualTo(DEFAULT_LASTNAME); - assertThat(userDTO.getEmail()).isEqualTo(DEFAULT_EMAIL); - assertThat(userDTO.isActivated()).isEqualTo(true); - assertThat(userDTO.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); - assertThat(userDTO.getLangKey()).isEqualTo(DEFAULT_LANGKEY); - assertThat(userDTO.getCreatedBy()).isEqualTo(DEFAULT_LOGIN); - assertThat(userDTO.getCreatedDate()).isEqualTo(user.getCreatedDate()); - assertThat(userDTO.getLastModifiedBy()).isEqualTo(DEFAULT_LOGIN); - assertThat(userDTO.getLastModifiedDate()).isEqualTo(user.getLastModifiedDate()); - assertThat(userDTO.getAuthorities()).containsExactly(AuthoritiesConstants.USER); - assertThat(userDTO.toString()).isNotNull(); - } - - @Test - public void testAuthorityEquals() { - Authority authorityA = new Authority(); - assertThat(authorityA).isEqualTo(authorityA); - assertThat(authorityA).isNotEqualTo(null); - assertThat(authorityA).isNotEqualTo(new Object()); - assertThat(authorityA.hashCode()).isEqualTo(0); - assertThat(authorityA.toString()).isNotNull(); - - Authority authorityB = new Authority(); - assertThat(authorityA).isEqualTo(authorityB); - - authorityB.setName(AuthoritiesConstants.ADMIN); - assertThat(authorityA).isNotEqualTo(authorityB); - - authorityA.setName(AuthoritiesConstants.USER); - assertThat(authorityA).isNotEqualTo(authorityB); - - authorityB.setName(AuthoritiesConstants.USER); - assertThat(authorityA).isEqualTo(authorityB); - assertThat(authorityA.hashCode()).isEqualTo(authorityB.hashCode()); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorIntegrationTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorIntegrationTest.java deleted file mode 100644 index e5ef08ee9c..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorIntegrationTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import com.baeldung.jhipster5.BookstoreApp; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * Test class for the ExceptionTranslator controller advice. - * - * @see ExceptionTranslator - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = BookstoreApp.class) -public class ExceptionTranslatorIntegrationTest { - - @Autowired - private ExceptionTranslatorTestController controller; - - @Autowired - private ExceptionTranslator exceptionTranslator; - - @Autowired - private MappingJackson2HttpMessageConverter jacksonMessageConverter; - - private MockMvc mockMvc; - - @Before - public void setup() { - mockMvc = MockMvcBuilders.standaloneSetup(controller) - .setControllerAdvice(exceptionTranslator) - .setMessageConverters(jacksonMessageConverter) - .build(); - } - - @Test - public void testConcurrencyFailure() throws Exception { - mockMvc.perform(get("/test/concurrency-failure")) - .andExpect(status().isConflict()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_CONCURRENCY_FAILURE)); - } - - @Test - public void testMethodArgumentNotValid() throws Exception { - mockMvc.perform(post("/test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_VALIDATION)) - .andExpect(jsonPath("$.fieldErrors.[0].objectName").value("testDTO")) - .andExpect(jsonPath("$.fieldErrors.[0].field").value("test")) - .andExpect(jsonPath("$.fieldErrors.[0].message").value("NotNull")); - } - - @Test - public void testParameterizedError() throws Exception { - mockMvc.perform(get("/test/parameterized-error")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("test parameterized error")) - .andExpect(jsonPath("$.params.param0").value("param0_value")) - .andExpect(jsonPath("$.params.param1").value("param1_value")); - } - - @Test - public void testParameterizedError2() throws Exception { - mockMvc.perform(get("/test/parameterized-error2")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("test parameterized error")) - .andExpect(jsonPath("$.params.foo").value("foo_value")) - .andExpect(jsonPath("$.params.bar").value("bar_value")); - } - - @Test - public void testMissingServletRequestPartException() throws Exception { - mockMvc.perform(get("/test/missing-servlet-request-part")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.400")); - } - - @Test - public void testMissingServletRequestParameterException() throws Exception { - mockMvc.perform(get("/test/missing-servlet-request-parameter")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.400")); - } - - @Test - public void testAccessDenied() throws Exception { - mockMvc.perform(get("/test/access-denied")) - .andExpect(status().isForbidden()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.403")) - .andExpect(jsonPath("$.detail").value("test access denied!")); - } - - @Test - public void testUnauthorized() throws Exception { - mockMvc.perform(get("/test/unauthorized")) - .andExpect(status().isUnauthorized()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.401")) - .andExpect(jsonPath("$.path").value("/test/unauthorized")) - .andExpect(jsonPath("$.detail").value("test authentication failed!")); - } - - @Test - public void testMethodNotSupported() throws Exception { - mockMvc.perform(post("/test/access-denied")) - .andExpect(status().isMethodNotAllowed()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.405")) - .andExpect(jsonPath("$.detail").value("Request method 'POST' not supported")); - } - - @Test - public void testExceptionWithResponseStatus() throws Exception { - mockMvc.perform(get("/test/response-status")) - .andExpect(status().isBadRequest()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.400")) - .andExpect(jsonPath("$.title").value("test response status")); - } - - @Test - public void testInternalServerError() throws Exception { - mockMvc.perform(get("/test/internal-server-error")) - .andExpect(status().isInternalServerError()) - .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) - .andExpect(jsonPath("$.message").value("error.http.500")) - .andExpect(jsonPath("$.title").value("Internal Server Error")); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorTestController.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorTestController.java deleted file mode 100644 index f8d84151b9..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/errors/ExceptionTranslatorTestController.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.baeldung.jhipster5.web.rest.errors; - -import org.springframework.dao.ConcurrencyFailureException; -import org.springframework.http.HttpStatus; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.util.HashMap; -import java.util.Map; - -@RestController -public class ExceptionTranslatorTestController { - - @GetMapping("/test/concurrency-failure") - public void concurrencyFailure() { - throw new ConcurrencyFailureException("test concurrency failure"); - } - - @PostMapping("/test/method-argument") - public void methodArgument(@Valid @RequestBody TestDTO testDTO) { - } - - @GetMapping("/test/parameterized-error") - public void parameterizedError() { - throw new CustomParameterizedException("test parameterized error", "param0_value", "param1_value"); - } - - @GetMapping("/test/parameterized-error2") - public void parameterizedError2() { - Map params = new HashMap<>(); - params.put("foo", "foo_value"); - params.put("bar", "bar_value"); - throw new CustomParameterizedException("test parameterized error", params); - } - - @GetMapping("/test/missing-servlet-request-part") - public void missingServletRequestPartException(@RequestPart String part) { - } - - @GetMapping("/test/missing-servlet-request-parameter") - public void missingServletRequestParameterException(@RequestParam String param) { - } - - @GetMapping("/test/access-denied") - public void accessdenied() { - throw new AccessDeniedException("test access denied!"); - } - - @GetMapping("/test/unauthorized") - public void unauthorized() { - throw new BadCredentialsException("test authentication failed!"); - } - - @GetMapping("/test/response-status") - public void exceptionWithReponseStatus() { - throw new TestResponseStatusException(); - } - - @GetMapping("/test/internal-server-error") - public void internalServerError() { - throw new RuntimeException(); - } - - public static class TestDTO { - - @NotNull - private String test; - - public String getTest() { - return test; - } - - public void setTest(String test) { - this.test = test; - } - } - - @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "test response status") - @SuppressWarnings("serial") - public static class TestResponseStatusException extends RuntimeException { - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/util/PaginationUtilUnitTest.java b/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/util/PaginationUtilUnitTest.java deleted file mode 100644 index 78b17ee859..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/java/com/baeldung/jhipster5/web/rest/util/PaginationUtilUnitTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.jhipster5.web.rest.util; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.http.HttpHeaders; - -/** - * Tests based on parsing algorithm in app/components/util/pagination-util.service.js - * - * @see PaginationUtil - */ -public class PaginationUtilUnitTest { - - @Test - public void generatePaginationHttpHeadersTest() { - String baseUrl = "/api/_search/example"; - List content = new ArrayList<>(); - Page page = new PageImpl<>(content, PageRequest.of(6, 50), 400L); - HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, baseUrl); - List strHeaders = headers.get(HttpHeaders.LINK); - assertNotNull(strHeaders); - assertTrue(strHeaders.size() == 1); - String headerData = strHeaders.get(0); - assertTrue(headerData.split(",").length == 4); - String expectedData = "; rel=\"next\"," - + "; rel=\"prev\"," - + "; rel=\"last\"," - + "; rel=\"first\""; - assertEquals(expectedData, headerData); - List xTotalCountHeaders = headers.get("X-Total-Count"); - assertTrue(xTotalCountHeaders.size() == 1); - assertTrue(Long.valueOf(xTotalCountHeaders.get(0)).equals(400L)); - } - -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/jest-global-mocks.ts b/jhipster-5/bookstore-monolith/src/test/javascript/jest-global-mocks.ts deleted file mode 100644 index a998259857..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/jest-global-mocks.ts +++ /dev/null @@ -1,15 +0,0 @@ -const mock = () => { - let storage = {}; - return { - getItem: key => (key in storage ? storage[key] : null), - setItem: (key, value) => (storage[key] = value || ''), - removeItem: key => delete storage[key], - clear: () => (storage = {}) - }; -}; - -Object.defineProperty(window, 'localStorage', { value: mock() }); -Object.defineProperty(window, 'sessionStorage', { value: mock() }); -Object.defineProperty(window, 'getComputedStyle', { - value: () => ['-webkit-appearance'] -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/jest.conf.js b/jhipster-5/bookstore-monolith/src/test/javascript/jest.conf.js deleted file mode 100644 index 05054a94b8..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/jest.conf.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - preset: 'jest-preset-angular', - setupTestFrameworkScriptFile: '/src/test/javascript/jest.ts', - coverageDirectory: '/target/test-results/', - globals: { - 'ts-jest': { - tsConfigFile: 'tsconfig.json' - }, - __TRANSFORM_HTML__: true - }, - coveragePathIgnorePatterns: [ - '/src/test/javascript' - ], - moduleNameMapper: { - 'app/(.*)': '/src/main/webapp/app/$1' - }, - reporters: [ - 'default', - [ 'jest-junit', { output: './target/test-results/TESTS-results-jest.xml' } ] - ], - testResultsProcessor: 'jest-sonar-reporter', - transformIgnorePatterns: ['node_modules/(?!@angular/common/locales)'], - testMatch: ['/src/test/javascript/spec/**/+(*.)+(spec.ts)'], - rootDir: '../../../', - testURL: "http://localhost/" -}; diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/jest.ts b/jhipster-5/bookstore-monolith/src/test/javascript/jest.ts deleted file mode 100644 index 904329f538..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/jest.ts +++ /dev/null @@ -1,2 +0,0 @@ -import 'jest-preset-angular'; -import './jest-global-mocks'; diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts deleted file mode 100644 index 87a550e8ef..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/activate/activate.component.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { TestBed, async, tick, fakeAsync, inject } from '@angular/core/testing'; -import { ActivatedRoute } from '@angular/router'; -import { Observable, of, throwError } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { MockActivatedRoute } from '../../../helpers/mock-route.service'; -import { ActivateService } from 'app/account/activate/activate.service'; -import { ActivateComponent } from 'app/account/activate/activate.component'; - -describe('Component Tests', () => { - describe('ActivateComponent', () => { - let comp: ActivateComponent; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [ActivateComponent], - providers: [ - { - provide: ActivatedRoute, - useValue: new MockActivatedRoute({ key: 'ABC123' }) - } - ] - }) - .overrideTemplate(ActivateComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - const fixture = TestBed.createComponent(ActivateComponent); - comp = fixture.componentInstance; - }); - - it('calls activate.get with the key from params', inject( - [ActivateService], - fakeAsync((service: ActivateService) => { - spyOn(service, 'get').and.returnValue(of()); - - comp.ngOnInit(); - tick(); - - expect(service.get).toHaveBeenCalledWith('ABC123'); - }) - )); - - it('should set set success to OK upon successful activation', inject( - [ActivateService], - fakeAsync((service: ActivateService) => { - spyOn(service, 'get').and.returnValue(of({})); - - comp.ngOnInit(); - tick(); - - expect(comp.error).toBe(null); - expect(comp.success).toEqual('OK'); - }) - )); - - it('should set set error to ERROR upon activation failure', inject( - [ActivateService], - fakeAsync((service: ActivateService) => { - spyOn(service, 'get').and.returnValue(throwError('ERROR')); - - comp.ngOnInit(); - tick(); - - expect(comp.error).toBe('ERROR'); - expect(comp.success).toEqual(null); - }) - )); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts deleted file mode 100644 index 36a3b8db65..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { ComponentFixture, TestBed, inject, tick, fakeAsync } from '@angular/core/testing'; -import { Observable, of, throwError } from 'rxjs'; -import { Renderer, ElementRef } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; - -import { BookstoreTestModule } from '../../../../test.module'; -import { PasswordResetFinishComponent } from 'app/account/password-reset/finish/password-reset-finish.component'; -import { PasswordResetFinishService } from 'app/account/password-reset/finish/password-reset-finish.service'; -import { MockActivatedRoute } from '../../../../helpers/mock-route.service'; - -describe('Component Tests', () => { - describe('PasswordResetFinishComponent', () => { - let fixture: ComponentFixture; - let comp: PasswordResetFinishComponent; - - beforeEach(() => { - fixture = TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [PasswordResetFinishComponent], - providers: [ - { - provide: ActivatedRoute, - useValue: new MockActivatedRoute({ key: 'XYZPDQ' }) - }, - { - provide: Renderer, - useValue: { - invokeElementMethod(renderElement: any, methodName: string, args?: any[]) {} - } - }, - { - provide: ElementRef, - useValue: new ElementRef(null) - } - ] - }) - .overrideTemplate(PasswordResetFinishComponent, '') - .createComponent(PasswordResetFinishComponent); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PasswordResetFinishComponent); - comp = fixture.componentInstance; - comp.ngOnInit(); - }); - - it('should define its initial state', () => { - comp.ngOnInit(); - - expect(comp.keyMissing).toBeFalsy(); - expect(comp.key).toEqual('XYZPDQ'); - expect(comp.resetAccount).toEqual({}); - }); - - it('sets focus after the view has been initialized', inject([ElementRef], (elementRef: ElementRef) => { - const element = fixture.nativeElement; - const node = { - focus() {} - }; - - elementRef.nativeElement = element; - spyOn(element, 'querySelector').and.returnValue(node); - spyOn(node, 'focus'); - - comp.ngAfterViewInit(); - - expect(element.querySelector).toHaveBeenCalledWith('#password'); - expect(node.focus).toHaveBeenCalled(); - })); - - it('should ensure the two passwords entered match', () => { - comp.resetAccount.password = 'password'; - comp.confirmPassword = 'non-matching'; - - comp.finishReset(); - - expect(comp.doNotMatch).toEqual('ERROR'); - }); - - it('should update success to OK after resetting password', inject( - [PasswordResetFinishService], - fakeAsync((service: PasswordResetFinishService) => { - spyOn(service, 'save').and.returnValue(of({})); - - comp.resetAccount.password = 'password'; - comp.confirmPassword = 'password'; - - comp.finishReset(); - tick(); - - expect(service.save).toHaveBeenCalledWith({ - key: 'XYZPDQ', - newPassword: 'password' - }); - expect(comp.success).toEqual('OK'); - }) - )); - - it('should notify of generic error', inject( - [PasswordResetFinishService], - fakeAsync((service: PasswordResetFinishService) => { - spyOn(service, 'save').and.returnValue(throwError('ERROR')); - - comp.resetAccount.password = 'password'; - comp.confirmPassword = 'password'; - - comp.finishReset(); - tick(); - - expect(service.save).toHaveBeenCalledWith({ - key: 'XYZPDQ', - newPassword: 'password' - }); - expect(comp.success).toBeNull(); - expect(comp.error).toEqual('ERROR'); - }) - )); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts deleted file mode 100644 index f121a4dd27..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { ComponentFixture, TestBed, inject } from '@angular/core/testing'; -import { Renderer, ElementRef } from '@angular/core'; -import { Observable, of, throwError } from 'rxjs'; - -import { BookstoreTestModule } from '../../../../test.module'; -import { PasswordResetInitComponent } from 'app/account/password-reset/init/password-reset-init.component'; -import { PasswordResetInitService } from 'app/account/password-reset/init/password-reset-init.service'; -import { EMAIL_NOT_FOUND_TYPE } from 'app/shared'; - -describe('Component Tests', () => { - describe('PasswordResetInitComponent', () => { - let fixture: ComponentFixture; - let comp: PasswordResetInitComponent; - - beforeEach(() => { - fixture = TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [PasswordResetInitComponent], - providers: [ - { - provide: Renderer, - useValue: { - invokeElementMethod(renderElement: any, methodName: string, args?: any[]) {} - } - }, - { - provide: ElementRef, - useValue: new ElementRef(null) - } - ] - }) - .overrideTemplate(PasswordResetInitComponent, '') - .createComponent(PasswordResetInitComponent); - comp = fixture.componentInstance; - comp.ngOnInit(); - }); - - it('should define its initial state', () => { - expect(comp.success).toBeUndefined(); - expect(comp.error).toBeUndefined(); - expect(comp.errorEmailNotExists).toBeUndefined(); - expect(comp.resetAccount).toEqual({}); - }); - - it('sets focus after the view has been initialized', inject([ElementRef], (elementRef: ElementRef) => { - const element = fixture.nativeElement; - const node = { - focus() {} - }; - - elementRef.nativeElement = element; - spyOn(element, 'querySelector').and.returnValue(node); - spyOn(node, 'focus'); - - comp.ngAfterViewInit(); - - expect(element.querySelector).toHaveBeenCalledWith('#email'); - expect(node.focus).toHaveBeenCalled(); - })); - - it('notifies of success upon successful requestReset', inject([PasswordResetInitService], (service: PasswordResetInitService) => { - spyOn(service, 'save').and.returnValue(of({})); - comp.resetAccount.email = 'user@domain.com'; - - comp.requestReset(); - - expect(service.save).toHaveBeenCalledWith('user@domain.com'); - expect(comp.success).toEqual('OK'); - expect(comp.error).toBeNull(); - expect(comp.errorEmailNotExists).toBeNull(); - })); - - it('notifies of unknown email upon email address not registered/400', inject( - [PasswordResetInitService], - (service: PasswordResetInitService) => { - spyOn(service, 'save').and.returnValue( - throwError({ - status: 400, - error: { type: EMAIL_NOT_FOUND_TYPE } - }) - ); - comp.resetAccount.email = 'user@domain.com'; - - comp.requestReset(); - - expect(service.save).toHaveBeenCalledWith('user@domain.com'); - expect(comp.success).toBeNull(); - expect(comp.error).toBeNull(); - expect(comp.errorEmailNotExists).toEqual('ERROR'); - } - )); - - it('notifies of error upon error response', inject([PasswordResetInitService], (service: PasswordResetInitService) => { - spyOn(service, 'save').and.returnValue( - throwError({ - status: 503, - data: 'something else' - }) - ); - comp.resetAccount.email = 'user@domain.com'; - - comp.requestReset(); - - expect(service.save).toHaveBeenCalledWith('user@domain.com'); - expect(comp.success).toBeNull(); - expect(comp.errorEmailNotExists).toBeNull(); - expect(comp.error).toEqual('ERROR'); - })); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts deleted file mode 100644 index 35e923ac00..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; - -import { PasswordStrengthBarComponent } from 'app/account/password/password-strength-bar.component'; - -describe('Component Tests', () => { - describe('PasswordStrengthBarComponent', () => { - let comp: PasswordStrengthBarComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [PasswordStrengthBarComponent] - }) - .overrideTemplate(PasswordStrengthBarComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PasswordStrengthBarComponent); - comp = fixture.componentInstance; - }); - - describe('PasswordStrengthBarComponents', () => { - it('should initialize with default values', () => { - expect(comp.measureStrength('')).toBe(0); - expect(comp.colors).toEqual(['#F00', '#F90', '#FF0', '#9F0', '#0F0']); - expect(comp.getColor(0).idx).toBe(1); - expect(comp.getColor(0).col).toBe(comp.colors[0]); - }); - - it('should increase strength upon password value change', () => { - expect(comp.measureStrength('')).toBe(0); - expect(comp.measureStrength('aa')).toBeGreaterThanOrEqual(comp.measureStrength('')); - expect(comp.measureStrength('aa^6')).toBeGreaterThanOrEqual(comp.measureStrength('aa')); - expect(comp.measureStrength('Aa090(**)')).toBeGreaterThanOrEqual(comp.measureStrength('aa^6')); - expect(comp.measureStrength('Aa090(**)+-07365')).toBeGreaterThanOrEqual(comp.measureStrength('Aa090(**)')); - }); - - it('should change the color based on strength', () => { - expect(comp.getColor(0).col).toBe(comp.colors[0]); - expect(comp.getColor(11).col).toBe(comp.colors[1]); - expect(comp.getColor(22).col).toBe(comp.colors[2]); - expect(comp.getColor(33).col).toBe(comp.colors[3]); - expect(comp.getColor(44).col).toBe(comp.colors[4]); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts deleted file mode 100644 index 86edf940bd..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/password/password.component.spec.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { HttpResponse } from '@angular/common/http'; -import { Observable, of, throwError } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { PasswordComponent } from 'app/account/password/password.component'; -import { PasswordService } from 'app/account/password/password.service'; - -describe('Component Tests', () => { - describe('PasswordComponent', () => { - let comp: PasswordComponent; - let fixture: ComponentFixture; - let service: PasswordService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [PasswordComponent], - providers: [] - }) - .overrideTemplate(PasswordComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PasswordComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(PasswordService); - }); - - it('should show error if passwords do not match', () => { - // GIVEN - comp.newPassword = 'password1'; - comp.confirmPassword = 'password2'; - // WHEN - comp.changePassword(); - // THEN - expect(comp.doNotMatch).toBe('ERROR'); - expect(comp.error).toBeNull(); - expect(comp.success).toBeNull(); - }); - - it('should call Auth.changePassword when passwords match', () => { - // GIVEN - const passwordValues = { - currentPassword: 'oldPassword', - newPassword: 'myPassword' - }; - - spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true }))); - comp.currentPassword = passwordValues.currentPassword; - comp.newPassword = comp.confirmPassword = passwordValues.newPassword; - - // WHEN - comp.changePassword(); - - // THEN - expect(service.save).toHaveBeenCalledWith(passwordValues.newPassword, passwordValues.currentPassword); - }); - - it('should set success to OK upon success', function() { - // GIVEN - spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true }))); - comp.newPassword = comp.confirmPassword = 'myPassword'; - - // WHEN - comp.changePassword(); - - // THEN - expect(comp.doNotMatch).toBeNull(); - expect(comp.error).toBeNull(); - expect(comp.success).toBe('OK'); - }); - - it('should notify of error if change password fails', function() { - // GIVEN - spyOn(service, 'save').and.returnValue(throwError('ERROR')); - comp.newPassword = comp.confirmPassword = 'myPassword'; - - // WHEN - comp.changePassword(); - - // THEN - expect(comp.doNotMatch).toBeNull(); - expect(comp.success).toBeNull(); - expect(comp.error).toBe('ERROR'); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts deleted file mode 100644 index ae02abbb91..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/register/register.component.spec.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { ComponentFixture, TestBed, async, inject, tick, fakeAsync } from '@angular/core/testing'; -import { Observable, of, throwError } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared'; -import { Register } from 'app/account/register/register.service'; -import { RegisterComponent } from 'app/account/register/register.component'; - -describe('Component Tests', () => { - describe('RegisterComponent', () => { - let fixture: ComponentFixture; - let comp: RegisterComponent; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [RegisterComponent] - }) - .overrideTemplate(RegisterComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(RegisterComponent); - comp = fixture.componentInstance; - comp.ngOnInit(); - }); - - it('should ensure the two passwords entered match', () => { - comp.registerAccount.password = 'password'; - comp.confirmPassword = 'non-matching'; - - comp.register(); - - expect(comp.doNotMatch).toEqual('ERROR'); - }); - - it('should update success to OK after creating an account', inject( - [Register], - fakeAsync((service: Register) => { - spyOn(service, 'save').and.returnValue(of({})); - comp.registerAccount.password = comp.confirmPassword = 'password'; - - comp.register(); - tick(); - - expect(service.save).toHaveBeenCalledWith({ - password: 'password', - langKey: 'en' - }); - expect(comp.success).toEqual(true); - expect(comp.registerAccount.langKey).toEqual('en'); - expect(comp.errorUserExists).toBeNull(); - expect(comp.errorEmailExists).toBeNull(); - expect(comp.error).toBeNull(); - }) - )); - - it('should notify of user existence upon 400/login already in use', inject( - [Register], - fakeAsync((service: Register) => { - spyOn(service, 'save').and.returnValue( - throwError({ - status: 400, - error: { type: LOGIN_ALREADY_USED_TYPE } - }) - ); - comp.registerAccount.password = comp.confirmPassword = 'password'; - - comp.register(); - tick(); - - expect(comp.errorUserExists).toEqual('ERROR'); - expect(comp.errorEmailExists).toBeNull(); - expect(comp.error).toBeNull(); - }) - )); - - it('should notify of email existence upon 400/email address already in use', inject( - [Register], - fakeAsync((service: Register) => { - spyOn(service, 'save').and.returnValue( - throwError({ - status: 400, - error: { type: EMAIL_ALREADY_USED_TYPE } - }) - ); - comp.registerAccount.password = comp.confirmPassword = 'password'; - - comp.register(); - tick(); - - expect(comp.errorEmailExists).toEqual('ERROR'); - expect(comp.errorUserExists).toBeNull(); - expect(comp.error).toBeNull(); - }) - )); - - it('should notify of generic error', inject( - [Register], - fakeAsync((service: Register) => { - spyOn(service, 'save').and.returnValue( - throwError({ - status: 503 - }) - ); - comp.registerAccount.password = comp.confirmPassword = 'password'; - - comp.register(); - tick(); - - expect(comp.errorUserExists).toBeNull(); - expect(comp.errorEmailExists).toBeNull(); - expect(comp.error).toEqual('ERROR'); - }) - )); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts deleted file mode 100644 index b6a6d34c19..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/account/settings/settings.component.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { Observable, throwError } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { AccountService } from 'app/core'; -import { SettingsComponent } from 'app/account/settings/settings.component'; - -describe('Component Tests', () => { - describe('SettingsComponent', () => { - let comp: SettingsComponent; - let fixture: ComponentFixture; - let mockAuth: any; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [SettingsComponent], - providers: [] - }) - .overrideTemplate(SettingsComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SettingsComponent); - comp = fixture.componentInstance; - mockAuth = fixture.debugElement.injector.get(AccountService); - }); - - it('should send the current identity upon save', () => { - // GIVEN - const accountValues = { - firstName: 'John', - lastName: 'Doe', - - activated: true, - email: 'john.doe@mail.com', - langKey: 'en', - login: 'john' - }; - mockAuth.setIdentityResponse(accountValues); - - // WHEN - comp.settingsAccount = accountValues; - comp.save(); - - // THEN - expect(mockAuth.identitySpy).toHaveBeenCalled(); - expect(mockAuth.saveSpy).toHaveBeenCalledWith(accountValues); - expect(comp.settingsAccount).toEqual(accountValues); - }); - - it('should notify of success upon successful save', () => { - // GIVEN - const accountValues = { - firstName: 'John', - lastName: 'Doe' - }; - mockAuth.setIdentityResponse(accountValues); - - // WHEN - comp.save(); - - // THEN - expect(comp.error).toBeNull(); - expect(comp.success).toBe('OK'); - }); - - it('should notify of error upon failed save', () => { - // GIVEN - mockAuth.saveSpy.and.returnValue(throwError('ERROR')); - - // WHEN - comp.save(); - - // THEN - expect(comp.error).toEqual('ERROR'); - expect(comp.success).toBeNull(); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts deleted file mode 100644 index 254791f51a..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { Observable, of } from 'rxjs'; -import { HttpHeaders, HttpResponse } from '@angular/common/http'; - -import { BookstoreTestModule } from '../../../test.module'; -import { AuditsComponent } from 'app/admin/audits/audits.component'; -import { AuditsService } from 'app/admin/audits/audits.service'; -import { Audit } from 'app/admin/audits/audit.model'; -import { ITEMS_PER_PAGE } from 'app/shared'; - -function build2DigitsDatePart(datePart: number) { - return `0${datePart}`.slice(-2); -} - -function getDate(isToday = true) { - let date: Date = new Date(); - if (isToday) { - // Today + 1 day - needed if the current day must be included - date.setDate(date.getDate() + 1); - } else { - // get last month - if (date.getMonth() === 0) { - date = new Date(date.getFullYear() - 1, 11, date.getDate()); - } else { - date = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate()); - } - } - const monthString = build2DigitsDatePart(date.getMonth() + 1); - const dateString = build2DigitsDatePart(date.getDate()); - return `${date.getFullYear()}-${monthString}-${dateString}`; -} - -describe('Component Tests', () => { - describe('AuditsComponent', () => { - let comp: AuditsComponent; - let fixture: ComponentFixture; - let service: AuditsService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [AuditsComponent], - providers: [AuditsService] - }) - .overrideTemplate(AuditsComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AuditsComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(AuditsService); - }); - - describe('today function ', () => { - it('should set toDate to current date', () => { - comp.today(); - expect(comp.toDate).toBe(getDate()); - }); - }); - - describe('previousMonth function ', () => { - it('should set fromDate to current date', () => { - comp.previousMonth(); - expect(comp.fromDate).toBe(getDate(false)); - }); - }); - - describe('By default, on init', () => { - it('should set all default values correctly', () => { - fixture.detectChanges(); - expect(comp.toDate).toBe(getDate()); - expect(comp.fromDate).toBe(getDate(false)); - expect(comp.itemsPerPage).toBe(ITEMS_PER_PAGE); - expect(comp.page).toBe(10); - expect(comp.reverse).toBeFalsy(); - expect(comp.predicate).toBe('id'); - }); - }); - - describe('OnInit', () => { - it('Should call load all on init', () => { - // GIVEN - const headers = new HttpHeaders().append('link', 'link;link'); - const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS'); - spyOn(service, 'query').and.returnValue( - of( - new HttpResponse({ - body: [audit], - headers - }) - ) - ); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.query).toHaveBeenCalled(); - expect(comp.audits[0]).toEqual(jasmine.objectContaining(audit)); - }); - }); - - describe('Create sort object', () => { - it('Should sort only by id asc', () => { - // GIVEN - comp.predicate = 'id'; - comp.reverse = false; - - // WHEN - const sort = comp.sort(); - - // THEN - expect(sort.length).toEqual(1); - expect(sort[0]).toEqual('id,desc'); - }); - - it('Should sort by timestamp asc then by id', () => { - // GIVEN - comp.predicate = 'timestamp'; - comp.reverse = true; - - // WHEN - const sort = comp.sort(); - - // THEN - expect(sort.length).toEqual(2); - expect(sort[0]).toEqual('timestamp,asc'); - expect(sort[1]).toEqual('id'); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts deleted file mode 100644 index 84ff79f633..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { AuditsService } from 'app/admin/audits/audits.service'; -import { Audit } from 'app/admin/audits/audit.model'; -import { SERVER_API_URL } from 'app/app.constants'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; - -describe('Service Tests', () => { - describe('Audits Service', () => { - let service: AuditsService; - let httpMock; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); - - service = TestBed.get(AuditsService); - httpMock = TestBed.get(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); - }); - - describe('Service methods', () => { - it('should call correct URL', () => { - service.query({}).subscribe(() => {}); - - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'management/audits'; - expect(req.request.url).toEqual(resourceUrl); - }); - - it('should return Audits', () => { - const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS'); - - service.query({}).subscribe(received => { - expect(received.body[0]).toEqual(audit); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush([audit]); - }); - - it('should propagate not found response', () => { - service.query({}).subscribe(null, (_error: any) => { - expect(_error.status).toEqual(404); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush('Invalid request parameters', { - status: 404, - statusText: 'Bad Request' - }); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts deleted file mode 100644 index d21f87b57b..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { of } from 'rxjs'; -import { HttpHeaders, HttpResponse } from '@angular/common/http'; - -import { BookstoreTestModule } from '../../../test.module'; -import { JhiConfigurationComponent } from 'app/admin/configuration/configuration.component'; -import { JhiConfigurationService } from 'app/admin/configuration/configuration.service'; -import { ITEMS_PER_PAGE } from 'app/shared'; -import { Log } from 'app/admin'; - -describe('Component Tests', () => { - describe('JhiConfigurationComponent', () => { - let comp: JhiConfigurationComponent; - let fixture: ComponentFixture; - let service: JhiConfigurationService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [JhiConfigurationComponent], - providers: [JhiConfigurationService] - }) - .overrideTemplate(JhiConfigurationComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(JhiConfigurationComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(JhiConfigurationService); - }); - - describe('OnInit', () => { - it('should set all default values correctly', () => { - expect(comp.configKeys).toEqual([]); - expect(comp.filter).toBe(''); - expect(comp.orderProp).toBe('prefix'); - expect(comp.reverse).toBe(false); - }); - it('Should call load all on init', () => { - // GIVEN - const body = [{ config: 'test', properties: 'test' }, { config: 'test2' }]; - const envConfig = { envConfig: 'test' }; - spyOn(service, 'get').and.returnValue(of(body)); - spyOn(service, 'getEnv').and.returnValue(of(envConfig)); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.get).toHaveBeenCalled(); - expect(service.getEnv).toHaveBeenCalled(); - expect(comp.configKeys).toEqual([['0', '1', '2', '3']]); - expect(comp.allConfiguration).toEqual(envConfig); - }); - }); - describe('keys method', () => { - it('should return the keys of an Object', () => { - // GIVEN - const data = { - key1: 'test', - key2: 'test2' - }; - - // THEN - expect(comp.keys(data)).toEqual(['key1', 'key2']); - expect(comp.keys(undefined)).toEqual([]); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts deleted file mode 100644 index 6039044b7f..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { JhiConfigurationService } from 'app/admin/configuration/configuration.service'; -import { SERVER_API_URL } from 'app/app.constants'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { HttpResponse } from '@angular/common/http'; - -describe('Service Tests', () => { - describe('Logs Service', () => { - let service: JhiConfigurationService; - let httpMock; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); - - service = TestBed.get(JhiConfigurationService); - httpMock = TestBed.get(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); - }); - - describe('Service methods', () => { - it('should call correct URL', () => { - service.get().subscribe(() => {}); - - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'management/configprops'; - expect(req.request.url).toEqual(resourceUrl); - }); - - it('should get the config', () => { - const angularConfig = { - contexts: { - angular: { - beans: ['test2'] - } - } - }; - service.get().subscribe(received => { - expect(received.body[0]).toEqual(angularConfig); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush(angularConfig); - }); - - it('should get the env', () => { - const propertySources = new HttpResponse({ - body: [{ name: 'test1', properties: 'test1' }, { name: 'test2', properties: 'test2' }] - }); - service.get().subscribe(received => { - expect(received.body[0]).toEqual(propertySources); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush(propertySources); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts deleted file mode 100644 index 549b430f67..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/health/health.component.spec.ts +++ /dev/null @@ -1,321 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; -import { of, throwError } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { JhiHealthCheckComponent } from 'app/admin/health/health.component'; -import { JhiHealthService } from 'app/admin/health/health.service'; - -describe('Component Tests', () => { - describe('JhiHealthCheckComponent', () => { - let comp: JhiHealthCheckComponent; - let fixture: ComponentFixture; - let service: JhiHealthService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [JhiHealthCheckComponent] - }) - .overrideTemplate(JhiHealthCheckComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(JhiHealthCheckComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(JhiHealthService); - }); - - describe('baseName and subSystemName', () => { - it('should return the basename when it has no sub system', () => { - expect(comp.baseName('base')).toBe('base'); - }); - - it('should return the basename when it has sub systems', () => { - expect(comp.baseName('base.subsystem.system')).toBe('base'); - }); - - it('should return the sub system name', () => { - expect(comp.subSystemName('subsystem')).toBe(''); - }); - - it('should return the subsystem when it has multiple keys', () => { - expect(comp.subSystemName('subsystem.subsystem.system')).toBe(' - subsystem.system'); - }); - }); - - describe('transformHealthData', () => { - it('should flatten empty health data', () => { - const data = {}; - const expected = []; - expect(service.transformHealthData(data)).toEqual(expected); - }); - - it('should flatten health data with no subsystems', () => { - const data = { - details: { - status: 'UP', - db: { - status: 'UP', - database: 'H2', - hello: '1' - }, - mail: { - status: 'UP', - error: 'mail.a.b.c' - } - } - }; - const expected = [ - { - name: 'db', - status: 'UP', - details: { - database: 'H2', - hello: '1' - } - }, - { - name: 'mail', - error: 'mail.a.b.c', - status: 'UP' - } - ]; - expect(service.transformHealthData(data)).toEqual(expected); - }); - - it('should flatten health data with subsystems at level 1, main system has no additional information', () => { - const data = { - details: { - status: 'UP', - db: { - status: 'UP', - database: 'H2', - hello: '1' - }, - mail: { - status: 'UP', - error: 'mail.a.b.c' - }, - system: { - status: 'DOWN', - subsystem1: { - status: 'UP', - property1: 'system.subsystem1.property1' - }, - subsystem2: { - status: 'DOWN', - error: 'system.subsystem1.error', - property2: 'system.subsystem2.property2' - } - } - } - }; - const expected = [ - { - name: 'db', - status: 'UP', - details: { - database: 'H2', - hello: '1' - } - }, - { - name: 'mail', - error: 'mail.a.b.c', - status: 'UP' - }, - { - name: 'system.subsystem1', - status: 'UP', - details: { - property1: 'system.subsystem1.property1' - } - }, - { - name: 'system.subsystem2', - error: 'system.subsystem1.error', - status: 'DOWN', - details: { - property2: 'system.subsystem2.property2' - } - } - ]; - expect(service.transformHealthData(data)).toEqual(expected); - }); - - it('should flatten health data with subsystems at level 1, main system has additional information', () => { - const data = { - details: { - status: 'UP', - db: { - status: 'UP', - database: 'H2', - hello: '1' - }, - mail: { - status: 'UP', - error: 'mail.a.b.c' - }, - system: { - status: 'DOWN', - property1: 'system.property1', - subsystem1: { - status: 'UP', - property1: 'system.subsystem1.property1' - }, - subsystem2: { - status: 'DOWN', - error: 'system.subsystem1.error', - property2: 'system.subsystem2.property2' - } - } - } - }; - const expected = [ - { - name: 'db', - status: 'UP', - details: { - database: 'H2', - hello: '1' - } - }, - { - name: 'mail', - error: 'mail.a.b.c', - status: 'UP' - }, - { - name: 'system', - status: 'DOWN', - details: { - property1: 'system.property1' - } - }, - { - name: 'system.subsystem1', - status: 'UP', - details: { - property1: 'system.subsystem1.property1' - } - }, - { - name: 'system.subsystem2', - error: 'system.subsystem1.error', - status: 'DOWN', - details: { - property2: 'system.subsystem2.property2' - } - } - ]; - expect(service.transformHealthData(data)).toEqual(expected); - }); - - it('should flatten health data with subsystems at level 1, main system has additional error', () => { - const data = { - details: { - status: 'UP', - db: { - status: 'UP', - database: 'H2', - hello: '1' - }, - mail: { - status: 'UP', - error: 'mail.a.b.c' - }, - system: { - status: 'DOWN', - error: 'show me', - subsystem1: { - status: 'UP', - property1: 'system.subsystem1.property1' - }, - subsystem2: { - status: 'DOWN', - error: 'system.subsystem1.error', - property2: 'system.subsystem2.property2' - } - } - } - }; - const expected = [ - { - name: 'db', - status: 'UP', - details: { - database: 'H2', - hello: '1' - } - }, - { - name: 'mail', - error: 'mail.a.b.c', - status: 'UP' - }, - { - name: 'system', - error: 'show me', - status: 'DOWN' - }, - { - name: 'system.subsystem1', - status: 'UP', - details: { - property1: 'system.subsystem1.property1' - } - }, - { - name: 'system.subsystem2', - error: 'system.subsystem1.error', - status: 'DOWN', - details: { - property2: 'system.subsystem2.property2' - } - } - ]; - expect(service.transformHealthData(data)).toEqual(expected); - }); - }); - - describe('getBadgeClass', () => { - it('should get badge class', () => { - const upBadgeClass = comp.getBadgeClass('UP'); - const downBadgeClass = comp.getBadgeClass('DOWN'); - expect(upBadgeClass).toEqual('badge-success'); - expect(downBadgeClass).toEqual('badge-danger'); - }); - }); - - describe('refresh', () => { - it('should call refresh on init', () => { - // GIVEN - spyOn(service, 'checkHealth').and.returnValue(of(new HttpResponse())); - spyOn(service, 'transformHealthData').and.returnValue(of({ data: 'test' })); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.checkHealth).toHaveBeenCalled(); - expect(service.transformHealthData).toHaveBeenCalled(); - expect(comp.healthData.value).toEqual({ data: 'test' }); - }); - it('should handle a 503 on refreshing health data', () => { - // GIVEN - spyOn(service, 'checkHealth').and.returnValue(throwError(new HttpErrorResponse({ status: 503, error: 'Mail down' }))); - spyOn(service, 'transformHealthData').and.returnValue(of({ health: 'down' })); - - // WHEN - comp.refresh(); - - // THEN - expect(service.checkHealth).toHaveBeenCalled(); - expect(service.transformHealthData).toHaveBeenCalled(); - expect(comp.healthData.value).toEqual({ health: 'down' }); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts deleted file mode 100644 index def356c0f2..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { of } from 'rxjs'; -import { HttpHeaders, HttpResponse } from '@angular/common/http'; - -import { BookstoreTestModule } from '../../../test.module'; -import { LogsComponent } from 'app/admin/logs/logs.component'; -import { LogsService } from 'app/admin/logs/logs.service'; -import { ITEMS_PER_PAGE } from 'app/shared'; -import { Log } from 'app/admin'; - -describe('Component Tests', () => { - describe('LogsComponent', () => { - let comp: LogsComponent; - let fixture: ComponentFixture; - let service: LogsService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [LogsComponent], - providers: [LogsService] - }) - .overrideTemplate(LogsComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(LogsComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(LogsService); - }); - - describe('OnInit', () => { - it('should set all default values correctly', () => { - expect(comp.filter).toBe(''); - expect(comp.orderProp).toBe('name'); - expect(comp.reverse).toBe(false); - }); - it('Should call load all on init', () => { - // GIVEN - const headers = new HttpHeaders().append('link', 'link;link'); - const log = new Log('main', 'WARN'); - spyOn(service, 'findAll').and.returnValue( - of( - new HttpResponse({ - body: [log], - headers - }) - ) - ); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.findAll).toHaveBeenCalled(); - expect(comp.loggers[0]).toEqual(jasmine.objectContaining(log)); - }); - }); - describe('change log level', () => { - it('should change log level correctly', () => { - // GIVEN - const log = new Log('main', 'ERROR'); - spyOn(service, 'changeLevel').and.returnValue(of(new HttpResponse())); - spyOn(service, 'findAll').and.returnValue(of(new HttpResponse({ body: [log] }))); - - // WHEN - comp.changeLevel('main', 'ERROR'); - - // THEN - expect(service.changeLevel).toHaveBeenCalled(); - expect(service.findAll).toHaveBeenCalled(); - expect(comp.loggers[0]).toEqual(jasmine.objectContaining(log)); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts deleted file mode 100644 index c34833922e..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { LogsService } from 'app/admin/logs/logs.service'; -import { Log } from 'app/admin/logs/log.model'; -import { SERVER_API_URL } from 'app/app.constants'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; - -describe('Service Tests', () => { - describe('Logs Service', () => { - let service: LogsService; - let httpMock; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); - - service = TestBed.get(LogsService); - httpMock = TestBed.get(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); - }); - - describe('Service methods', () => { - it('should call correct URL', () => { - service.findAll().subscribe(() => {}); - - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'management/logs'; - expect(req.request.url).toEqual(resourceUrl); - }); - - it('should return Logs', () => { - const log = new Log('main', 'ERROR'); - - service.findAll().subscribe(received => { - expect(received.body[0]).toEqual(log); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush([log]); - }); - - it('should change log level', () => { - const log = new Log('main', 'ERROR'); - - service.changeLevel(log).subscribe(received => { - expect(received.body[0]).toEqual(log); - }); - - const req = httpMock.expectOne({ method: 'PUT' }); - req.flush([log]); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts deleted file mode 100644 index d4a992b963..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; -import { of, throwError } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { JhiMetricsMonitoringComponent } from 'app/admin/metrics/metrics.component'; -import { JhiMetricsService } from 'app/admin/metrics/metrics.service'; - -describe('Component Tests', () => { - describe('JhiMetricsMonitoringComponent', () => { - let comp: JhiMetricsMonitoringComponent; - let fixture: ComponentFixture; - let service: JhiMetricsService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [JhiMetricsMonitoringComponent] - }) - .overrideTemplate(JhiMetricsMonitoringComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(JhiMetricsMonitoringComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(JhiMetricsService); - }); - - describe('refresh', () => { - it('should call refresh on init', () => { - // GIVEN - const response = { - timers: { - service: 'test', - unrelatedKey: 'test' - }, - gauges: { - 'jcache.statistics': { - value: 2 - }, - unrelatedKey: 'test' - } - }; - spyOn(service, 'getMetrics').and.returnValue(of(response)); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.getMetrics).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts deleted file mode 100644 index 2c3665b062..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { JhiMetricsService } from 'app/admin/metrics/metrics.service'; -import { SERVER_API_URL } from 'app/app.constants'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; - -describe('Service Tests', () => { - describe('Logs Service', () => { - let service: JhiMetricsService; - let httpMock; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); - - service = TestBed.get(JhiMetricsService); - httpMock = TestBed.get(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); - }); - - describe('Service methods', () => { - it('should call correct URL', () => { - service.getMetrics().subscribe(() => {}); - - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'management/jhi-metrics'; - expect(req.request.url).toEqual(resourceUrl); - }); - - it('should return Metrics', () => { - const metrics = []; - - service.getMetrics().subscribe(received => { - expect(received.body[0]).toEqual(metrics); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush([metrics]); - }); - - it('should return Thread Dump', () => { - const dump = [{ name: 'test1', threadState: 'RUNNABLE' }]; - - service.threadDump().subscribe(received => { - expect(received.body[0]).toEqual(dump); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush([dump]); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts deleted file mode 100644 index 596e1b5609..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable, of } from 'rxjs'; -import { JhiEventManager } from 'ng-jhipster'; - -import { BookstoreTestModule } from '../../../test.module'; -import { UserMgmtDeleteDialogComponent } from 'app/admin/user-management/user-management-delete-dialog.component'; -import { UserService } from 'app/core'; - -describe('Component Tests', () => { - describe('User Management Delete Component', () => { - let comp: UserMgmtDeleteDialogComponent; - let fixture: ComponentFixture; - let service: UserService; - let mockEventManager: any; - let mockActiveModal: any; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [UserMgmtDeleteDialogComponent] - }) - .overrideTemplate(UserMgmtDeleteDialogComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(UserMgmtDeleteDialogComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(UserService); - mockEventManager = fixture.debugElement.injector.get(JhiEventManager); - mockActiveModal = fixture.debugElement.injector.get(NgbActiveModal); - }); - - describe('confirmDelete', () => { - it('Should call delete service on confirmDelete', inject( - [], - fakeAsync(() => { - // GIVEN - spyOn(service, 'delete').and.returnValue(of({})); - - // WHEN - comp.confirmDelete('user'); - tick(); - - // THEN - expect(service.delete).toHaveBeenCalledWith('user'); - expect(mockActiveModal.dismissSpy).toHaveBeenCalled(); - expect(mockEventManager.broadcastSpy).toHaveBeenCalled(); - }) - )); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts deleted file mode 100644 index f64b8bb88b..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { ActivatedRoute } from '@angular/router'; -import { of } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { UserMgmtDetailComponent } from 'app/admin/user-management/user-management-detail.component'; -import { User } from 'app/core'; - -describe('Component Tests', () => { - describe('User Management Detail Component', () => { - let comp: UserMgmtDetailComponent; - let fixture: ComponentFixture; - const route = ({ - data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', ['ROLE_USER'], 'admin', null, null, null) }) - } as any) as ActivatedRoute; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [UserMgmtDetailComponent], - providers: [ - { - provide: ActivatedRoute, - useValue: route - } - ] - }) - .overrideTemplate(UserMgmtDetailComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(UserMgmtDetailComponent); - comp = fixture.componentInstance; - }); - - describe('OnInit', () => { - it('Should call load all on init', () => { - // GIVEN - - // WHEN - comp.ngOnInit(); - - // THEN - expect(comp.user).toEqual( - jasmine.objectContaining({ - id: 1, - login: 'user', - firstName: 'first', - lastName: 'last', - email: 'first@last.com', - activated: true, - langKey: 'en', - authorities: ['ROLE_USER'], - createdBy: 'admin', - createdDate: null, - lastModifiedBy: null, - lastModifiedDate: null, - password: null - }) - ); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts deleted file mode 100644 index c98694ba82..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; -import { HttpResponse } from '@angular/common/http'; -import { ActivatedRoute } from '@angular/router'; -import { Observable, of } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { UserMgmtUpdateComponent } from 'app/admin/user-management/user-management-update.component'; -import { UserService, User } from 'app/core'; - -describe('Component Tests', () => { - describe('User Management Update Component', () => { - let comp: UserMgmtUpdateComponent; - let fixture: ComponentFixture; - let service: UserService; - const route = ({ - data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', ['ROLE_USER'], 'admin', null, null, null) }) - } as any) as ActivatedRoute; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [UserMgmtUpdateComponent], - providers: [ - { - provide: ActivatedRoute, - useValue: route - } - ] - }) - .overrideTemplate(UserMgmtUpdateComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(UserMgmtUpdateComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(UserService); - }); - - describe('OnInit', () => { - it('Should load authorities and language on init', inject( - [], - fakeAsync(() => { - // GIVEN - spyOn(service, 'authorities').and.returnValue(of(['USER'])); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.authorities).toHaveBeenCalled(); - expect(comp.authorities).toEqual(['USER']); - }) - )); - }); - - describe('save', () => { - it('Should call update service on save for existing user', inject( - [], - fakeAsync(() => { - // GIVEN - const entity = new User(123); - spyOn(service, 'update').and.returnValue( - of( - new HttpResponse({ - body: entity - }) - ) - ); - comp.user = entity; - // WHEN - comp.save(); - tick(); // simulate async - - // THEN - expect(service.update).toHaveBeenCalledWith(entity); - expect(comp.isSaving).toEqual(false); - }) - )); - - it('Should call create service on save for new user', inject( - [], - fakeAsync(() => { - // GIVEN - const entity = new User(); - spyOn(service, 'create').and.returnValue(of(new HttpResponse({ body: entity }))); - comp.user = entity; - // WHEN - comp.save(); - tick(); // simulate async - - // THEN - expect(service.create).toHaveBeenCalledWith(entity); - expect(comp.isSaving).toEqual(false); - }) - )); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts deleted file mode 100644 index 31fea387b8..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; -import { Observable, of } from 'rxjs'; -import { HttpHeaders, HttpResponse } from '@angular/common/http'; - -import { BookstoreTestModule } from '../../../test.module'; -import { UserMgmtComponent } from 'app/admin/user-management/user-management.component'; -import { UserService, User } from 'app/core'; - -describe('Component Tests', () => { - describe('User Management Component', () => { - let comp: UserMgmtComponent; - let fixture: ComponentFixture; - let service: UserService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [UserMgmtComponent] - }) - .overrideTemplate(UserMgmtComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(UserMgmtComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(UserService); - }); - - describe('OnInit', () => { - it('Should call load all on init', inject( - [], - fakeAsync(() => { - // GIVEN - const headers = new HttpHeaders().append('link', 'link;link'); - spyOn(service, 'query').and.returnValue( - of( - new HttpResponse({ - body: [new User(123)], - headers - }) - ) - ); - - // WHEN - comp.ngOnInit(); - tick(); // simulate async - - // THEN - expect(service.query).toHaveBeenCalled(); - expect(comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 })); - }) - )); - }); - - describe('setActive', () => { - it('Should update user and call load all', inject( - [], - fakeAsync(() => { - // GIVEN - const headers = new HttpHeaders().append('link', 'link;link'); - const user = new User(123); - spyOn(service, 'query').and.returnValue( - of( - new HttpResponse({ - body: [user], - headers - }) - ) - ); - spyOn(service, 'update').and.returnValue(of(new HttpResponse({ status: 200 }))); - - // WHEN - comp.setActive(user, true); - tick(); // simulate async - - // THEN - expect(service.update).toHaveBeenCalledWith(user); - expect(service.query).toHaveBeenCalled(); - expect(comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 })); - }) - )); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts deleted file mode 100644 index 01ed421f57..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/account.service.spec.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { TestBed } from '@angular/core/testing'; -import { SERVER_API_URL } from 'app/app.constants'; -import { AccountService } from 'app/core'; -import { JhiDateUtils } from 'ng-jhipster'; -import { SessionStorageService } from 'ngx-webstorage'; - -describe('Service Tests', () => { - describe('Account Service', () => { - let service: AccountService; - let httpMock; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - providers: [JhiDateUtils, SessionStorageService] - }); - - service = TestBed.get(AccountService); - httpMock = TestBed.get(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); - }); - - describe('Service methods', () => { - it('should call /account if user is undefined', () => { - service.identity().then(() => {}); - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'api/account'; - - expect(req.request.url).toEqual(`${resourceUrl}`); - }); - - it('should call /account only once', () => { - service.identity().then(() => service.identity().then(() => {})); - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'api/account'; - - expect(req.request.url).toEqual(`${resourceUrl}`); - req.flush({ - firstName: 'John' - }); - }); - - describe('hasAuthority', () => { - it('should return false if user is not logged', async () => { - const hasAuthority = await service.hasAuthority('ROLE_USER'); - expect(hasAuthority).toBeFalsy(); - }); - - it('should return false if user is logged and has not authority', async () => { - service.authenticate({ - authorities: ['ROLE_USER'] - }); - - const hasAuthority = await service.hasAuthority('ROLE_ADMIN'); - - expect(hasAuthority).toBeFalsy(); - }); - - it('should return true if user is logged and has authority', async () => { - service.authenticate({ - authorities: ['ROLE_USER'] - }); - - const hasAuthority = await service.hasAuthority('ROLE_USER'); - - expect(hasAuthority).toBeTruthy(); - }); - }); - - describe('hasAnyAuthority', () => { - it('should return false if user is not logged', async () => { - const hasAuthority = await service.hasAnyAuthority(['ROLE_USER']); - expect(hasAuthority).toBeFalsy(); - }); - - it('should return false if user is logged and has not authority', async () => { - service.authenticate({ - authorities: ['ROLE_USER'] - }); - - const hasAuthority = await service.hasAnyAuthority(['ROLE_ADMIN']); - - expect(hasAuthority).toBeFalsy(); - }); - - it('should return true if user is logged and has authority', async () => { - service.authenticate({ - authorities: ['ROLE_USER'] - }); - - const hasAuthority = await service.hasAnyAuthority(['ROLE_USER', 'ROLE_ADMIN']); - - expect(hasAuthority).toBeTruthy(); - }); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts deleted file mode 100644 index 9c05839a57..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/core/user/user.service.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { JhiDateUtils } from 'ng-jhipster'; - -import { UserService, User } from 'app/core'; -import { SERVER_API_URL } from 'app/app.constants'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; - -describe('Service Tests', () => { - describe('User Service', () => { - let service: UserService; - let httpMock; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - providers: [JhiDateUtils] - }); - - service = TestBed.get(UserService); - httpMock = TestBed.get(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); - }); - - describe('Service methods', () => { - it('should call correct URL', () => { - service.find('user').subscribe(() => {}); - - const req = httpMock.expectOne({ method: 'GET' }); - const resourceUrl = SERVER_API_URL + 'api/users'; - expect(req.request.url).toEqual(`${resourceUrl}/user`); - }); - it('should return User', () => { - service.find('user').subscribe(received => { - expect(received.body.login).toEqual('user'); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush(new User(1, 'user')); - }); - - it('should return Authorities', () => { - service.authorities().subscribe(_authorities => { - expect(_authorities).toEqual(['ROLE_USER', 'ROLE_ADMIN']); - }); - const req = httpMock.expectOne({ method: 'GET' }); - - req.flush(['ROLE_USER', 'ROLE_ADMIN']); - }); - - it('should propagate not found response', () => { - service.find('user').subscribe(null, (_error: any) => { - expect(_error.status).toEqual(404); - }); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush('Invalid request parameters', { - status: 404, - statusText: 'Bad Request' - }); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts deleted file mode 100644 index 6ffba6ee1e..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-delete-dialog.component.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* tslint:disable max-line-length */ -import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable, of } from 'rxjs'; -import { JhiEventManager } from 'ng-jhipster'; - -import { BookstoreTestModule } from '../../../test.module'; -import { BookDeleteDialogComponent } from 'app/entities/book/book-delete-dialog.component'; -import { BookService } from 'app/entities/book/book.service'; - -describe('Component Tests', () => { - describe('Book Management Delete Component', () => { - let comp: BookDeleteDialogComponent; - let fixture: ComponentFixture; - let service: BookService; - let mockEventManager: any; - let mockActiveModal: any; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [BookDeleteDialogComponent] - }) - .overrideTemplate(BookDeleteDialogComponent, '') - .compileComponents(); - fixture = TestBed.createComponent(BookDeleteDialogComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(BookService); - mockEventManager = fixture.debugElement.injector.get(JhiEventManager); - mockActiveModal = fixture.debugElement.injector.get(NgbActiveModal); - }); - - describe('confirmDelete', () => { - it('Should call delete service on confirmDelete', inject( - [], - fakeAsync(() => { - // GIVEN - spyOn(service, 'delete').and.returnValue(of({})); - - // WHEN - comp.confirmDelete(123); - tick(); - - // THEN - expect(service.delete).toHaveBeenCalledWith(123); - expect(mockActiveModal.dismissSpy).toHaveBeenCalled(); - expect(mockEventManager.broadcastSpy).toHaveBeenCalled(); - }) - )); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts deleted file mode 100644 index b0ff94b3ea..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-detail.component.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* tslint:disable max-line-length */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ActivatedRoute } from '@angular/router'; -import { of } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { BookDetailComponent } from 'app/entities/book/book-detail.component'; -import { Book } from 'app/shared/model/book.model'; - -describe('Component Tests', () => { - describe('Book Management Detail Component', () => { - let comp: BookDetailComponent; - let fixture: ComponentFixture; - const route = ({ data: of({ book: new Book(123) }) } as any) as ActivatedRoute; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [BookDetailComponent], - providers: [{ provide: ActivatedRoute, useValue: route }] - }) - .overrideTemplate(BookDetailComponent, '') - .compileComponents(); - fixture = TestBed.createComponent(BookDetailComponent); - comp = fixture.componentInstance; - }); - - describe('OnInit', () => { - it('Should call load all on init', () => { - // GIVEN - - // WHEN - comp.ngOnInit(); - - // THEN - expect(comp.book).toEqual(jasmine.objectContaining({ id: 123 })); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts deleted file mode 100644 index 336a2e2397..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book-update.component.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* tslint:disable max-line-length */ -import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { HttpResponse } from '@angular/common/http'; -import { Observable, of } from 'rxjs'; - -import { BookstoreTestModule } from '../../../test.module'; -import { BookUpdateComponent } from 'app/entities/book/book-update.component'; -import { BookService } from 'app/entities/book/book.service'; -import { Book } from 'app/shared/model/book.model'; - -describe('Component Tests', () => { - describe('Book Management Update Component', () => { - let comp: BookUpdateComponent; - let fixture: ComponentFixture; - let service: BookService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [BookUpdateComponent] - }) - .overrideTemplate(BookUpdateComponent, '') - .compileComponents(); - - fixture = TestBed.createComponent(BookUpdateComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(BookService); - }); - - describe('save', () => { - it('Should call update service on save for existing entity', fakeAsync(() => { - // GIVEN - const entity = new Book(123); - spyOn(service, 'update').and.returnValue(of(new HttpResponse({ body: entity }))); - comp.book = entity; - // WHEN - comp.save(); - tick(); // simulate async - - // THEN - expect(service.update).toHaveBeenCalledWith(entity); - expect(comp.isSaving).toEqual(false); - })); - - it('Should call create service on save for new entity', fakeAsync(() => { - // GIVEN - const entity = new Book(); - spyOn(service, 'create').and.returnValue(of(new HttpResponse({ body: entity }))); - comp.book = entity; - // WHEN - comp.save(); - tick(); // simulate async - - // THEN - expect(service.create).toHaveBeenCalledWith(entity); - expect(comp.isSaving).toEqual(false); - })); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts deleted file mode 100644 index 3b3d472650..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.component.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* tslint:disable max-line-length */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { Observable, of } from 'rxjs'; -import { HttpHeaders, HttpResponse } from '@angular/common/http'; - -import { BookstoreTestModule } from '../../../test.module'; -import { BookComponent } from 'app/entities/book/book.component'; -import { BookService } from 'app/entities/book/book.service'; -import { Book } from 'app/shared/model/book.model'; - -describe('Component Tests', () => { - describe('Book Management Component', () => { - let comp: BookComponent; - let fixture: ComponentFixture; - let service: BookService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [BookComponent], - providers: [] - }) - .overrideTemplate(BookComponent, '') - .compileComponents(); - - fixture = TestBed.createComponent(BookComponent); - comp = fixture.componentInstance; - service = fixture.debugElement.injector.get(BookService); - }); - - it('Should call load all on init', () => { - // GIVEN - const headers = new HttpHeaders().append('link', 'link;link'); - spyOn(service, 'query').and.returnValue( - of( - new HttpResponse({ - body: [new Book(123)], - headers - }) - ) - ); - - // WHEN - comp.ngOnInit(); - - // THEN - expect(service.query).toHaveBeenCalled(); - expect(comp.books[0]).toEqual(jasmine.objectContaining({ id: 123 })); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts deleted file mode 100644 index cd0c5b7318..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/entities/book/book.service.spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* tslint:disable max-line-length */ -import { TestBed, getTestBed } from '@angular/core/testing'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { HttpClient, HttpResponse } from '@angular/common/http'; -import { of } from 'rxjs'; -import { take, map } from 'rxjs/operators'; -import * as moment from 'moment'; -import { DATE_FORMAT } from 'app/shared/constants/input.constants'; -import { BookService } from 'app/entities/book/book.service'; -import { IBook, Book } from 'app/shared/model/book.model'; - -describe('Service Tests', () => { - describe('Book Service', () => { - let injector: TestBed; - let service: BookService; - let httpMock: HttpTestingController; - let elemDefault: IBook; - let currentDate: moment.Moment; - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule] - }); - injector = getTestBed(); - service = injector.get(BookService); - httpMock = injector.get(HttpTestingController); - currentDate = moment(); - - elemDefault = new Book(0, 'AAAAAAA', 'AAAAAAA', currentDate, 0, 0); - }); - - describe('Service methods', async () => { - it('should find an element', async () => { - const returnedFromService = Object.assign( - { - published: currentDate.format(DATE_FORMAT) - }, - elemDefault - ); - service - .find(123) - .pipe(take(1)) - .subscribe(resp => expect(resp).toMatchObject({ body: elemDefault })); - - const req = httpMock.expectOne({ method: 'GET' }); - req.flush(JSON.stringify(returnedFromService)); - }); - - it('should create a Book', async () => { - const returnedFromService = Object.assign( - { - id: 0, - published: currentDate.format(DATE_FORMAT) - }, - elemDefault - ); - const expected = Object.assign( - { - published: currentDate - }, - returnedFromService - ); - service - .create(new Book(null)) - .pipe(take(1)) - .subscribe(resp => expect(resp).toMatchObject({ body: expected })); - const req = httpMock.expectOne({ method: 'POST' }); - req.flush(JSON.stringify(returnedFromService)); - }); - - it('should update a Book', async () => { - const returnedFromService = Object.assign( - { - title: 'BBBBBB', - author: 'BBBBBB', - published: currentDate.format(DATE_FORMAT), - quantity: 1, - price: 1 - }, - elemDefault - ); - - const expected = Object.assign( - { - published: currentDate - }, - returnedFromService - ); - service - .update(expected) - .pipe(take(1)) - .subscribe(resp => expect(resp).toMatchObject({ body: expected })); - const req = httpMock.expectOne({ method: 'PUT' }); - req.flush(JSON.stringify(returnedFromService)); - }); - - it('should return a list of Book', async () => { - const returnedFromService = Object.assign( - { - title: 'BBBBBB', - author: 'BBBBBB', - published: currentDate.format(DATE_FORMAT), - quantity: 1, - price: 1 - }, - elemDefault - ); - const expected = Object.assign( - { - published: currentDate - }, - returnedFromService - ); - service - .query(expected) - .pipe( - take(1), - map(resp => resp.body) - ) - .subscribe(body => expect(body).toContainEqual(expected)); - const req = httpMock.expectOne({ method: 'GET' }); - req.flush(JSON.stringify([returnedFromService])); - httpMock.verify(); - }); - - it('should delete a Book', async () => { - const rxPromise = service.delete(123).subscribe(resp => expect(resp.ok)); - - const req = httpMock.expectOne({ method: 'DELETE' }); - req.flush({ status: 200 }); - }); - }); - - afterEach(() => { - httpMock.verify(); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts deleted file mode 100644 index 93f344e633..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; -import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; -import { JhiAlertService, JhiEventManager } from 'ng-jhipster'; - -import { BookstoreTestModule } from '../../../test.module'; -import { JhiAlertErrorComponent } from 'app/shared/alert/alert-error.component'; -import { MockAlertService } from '../../../helpers/mock-alert.service'; - -describe('Component Tests', () => { - describe('Alert Error Component', () => { - let comp: JhiAlertErrorComponent; - let fixture: ComponentFixture; - let eventManager: JhiEventManager; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [JhiAlertErrorComponent], - providers: [ - JhiEventManager, - { - provide: JhiAlertService, - useClass: MockAlertService - } - ] - }) - .overrideTemplate(JhiAlertErrorComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(JhiAlertErrorComponent); - comp = fixture.componentInstance; - eventManager = fixture.debugElement.injector.get(JhiEventManager); - }); - - describe('Error Handling', () => { - it('Should display an alert on status 0', () => { - // GIVEN - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: { status: 0 } }); - // THEN - expect(comp.alerts.length).toBe(1); - expect(comp.alerts[0].msg).toBe('Server not reachable'); - }); - it('Should display an alert on status 404', () => { - // GIVEN - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: { status: 404 } }); - // THEN - expect(comp.alerts.length).toBe(1); - expect(comp.alerts[0].msg).toBe('Not found'); - }); - it('Should display an alert on generic error', () => { - // GIVEN - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: { error: { message: 'Error Message' } } }); - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: { error: 'Second Error Message' } }); - // THEN - expect(comp.alerts.length).toBe(2); - expect(comp.alerts[0].msg).toBe('Error Message'); - expect(comp.alerts[1].msg).toBe('Second Error Message'); - }); - it('Should display an alert on status 400 for generic error', () => { - // GIVEN - const response = new HttpErrorResponse({ - url: 'http://localhost:8080/api/foos', - headers: new HttpHeaders(), - status: 400, - statusText: 'Bad Request', - error: { - type: 'https://www.jhipster.tech/problem/constraint-violation', - title: 'Bad Request', - status: 400, - path: '/api/foos', - message: 'error.validation' - } - }); - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: response }); - // THEN - expect(comp.alerts.length).toBe(1); - expect(comp.alerts[0].msg).toBe('error.validation'); - }); - it('Should display an alert on status 400 for generic error without message', () => { - // GIVEN - const response = new HttpErrorResponse({ - url: 'http://localhost:8080/api/foos', - headers: new HttpHeaders(), - status: 400, - error: 'Bad Request' - }); - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: response }); - // THEN - expect(comp.alerts.length).toBe(1); - expect(comp.alerts[0].msg).toBe('Bad Request'); - }); - it('Should display an alert on status 400 for invalid parameters', () => { - // GIVEN - const response = new HttpErrorResponse({ - url: 'http://localhost:8080/api/foos', - headers: new HttpHeaders(), - status: 400, - statusText: 'Bad Request', - error: { - type: 'https://www.jhipster.tech/problem/constraint-violation', - title: 'Method argument not valid', - status: 400, - path: '/api/foos', - message: 'error.validation', - fieldErrors: [{ objectName: 'foo', field: 'minField', message: 'Min' }] - } - }); - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: response }); - // THEN - expect(comp.alerts.length).toBe(1); - expect(comp.alerts[0].msg).toBe('Error on field "MinField"'); - }); - it('Should display an alert on status 400 for error headers', () => { - // GIVEN - const response = new HttpErrorResponse({ - url: 'http://localhost:8080/api/foos', - headers: new HttpHeaders().append('app-error', 'Error Message').append('app-params', 'foo'), - status: 400, - statusText: 'Bad Request', - error: { - status: 400, - message: 'error.validation' - } - }); - eventManager.broadcast({ name: 'bookstoreApp.httpError', content: response }); - // THEN - expect(comp.alerts.length).toBe(1); - expect(comp.alerts[0].msg).toBe('Error Message'); - }); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts deleted file mode 100644 index 814af64610..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/app/shared/login/login.component.spec.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; -import { Router } from '@angular/router'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { JhiEventManager } from 'ng-jhipster'; - -import { LoginService } from 'app/core/login/login.service'; -import { JhiLoginModalComponent } from 'app/shared/login/login.component'; -import { StateStorageService } from 'app/core/auth/state-storage.service'; -import { BookstoreTestModule } from '../../../test.module'; -import { MockLoginService } from '../../../helpers/mock-login.service'; -import { MockStateStorageService } from '../../../helpers/mock-state-storage.service'; - -describe('Component Tests', () => { - describe('LoginComponent', () => { - let comp: JhiLoginModalComponent; - let fixture: ComponentFixture; - let mockLoginService: any; - let mockStateStorageService: any; - let mockRouter: any; - let mockEventManager: any; - let mockActiveModal: any; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [BookstoreTestModule], - declarations: [JhiLoginModalComponent], - providers: [ - { - provide: LoginService, - useClass: MockLoginService - }, - { - provide: StateStorageService, - useClass: MockStateStorageService - } - ] - }) - .overrideTemplate(JhiLoginModalComponent, '') - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(JhiLoginModalComponent); - comp = fixture.componentInstance; - mockLoginService = fixture.debugElement.injector.get(LoginService); - mockStateStorageService = fixture.debugElement.injector.get(StateStorageService); - mockRouter = fixture.debugElement.injector.get(Router); - mockEventManager = fixture.debugElement.injector.get(JhiEventManager); - mockActiveModal = fixture.debugElement.injector.get(NgbActiveModal); - }); - - it('should authenticate the user upon login when previous state was set', inject( - [], - fakeAsync(() => { - // GIVEN - const credentials = { - username: 'admin', - password: 'admin', - rememberMe: true - }; - comp.username = 'admin'; - comp.password = 'admin'; - comp.rememberMe = true; - comp.credentials = credentials; - mockLoginService.setResponse({}); - mockStateStorageService.setResponse({ redirect: 'dummy' }); - - // WHEN/ - comp.login(); - tick(); // simulate async - - // THEN - expect(comp.authenticationError).toEqual(false); - expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('login success'); - expect(mockEventManager.broadcastSpy).toHaveBeenCalledTimes(1); - expect(mockLoginService.loginSpy).toHaveBeenCalledWith(credentials); - expect(mockStateStorageService.getUrlSpy).toHaveBeenCalledTimes(1); - expect(mockStateStorageService.storeUrlSpy).toHaveBeenCalledWith(null); - expect(mockRouter.navigateSpy).toHaveBeenCalledWith([{ redirect: 'dummy' }]); - }) - )); - - it('should authenticate the user upon login when previous state was not set', inject( - [], - fakeAsync(() => { - // GIVEN - const credentials = { - username: 'admin', - password: 'admin', - rememberMe: true - }; - comp.username = 'admin'; - comp.password = 'admin'; - comp.rememberMe = true; - comp.credentials = credentials; - mockLoginService.setResponse({}); - mockStateStorageService.setResponse(null); - - // WHEN - comp.login(); - tick(); // simulate async - - // THEN - expect(comp.authenticationError).toEqual(false); - expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('login success'); - expect(mockEventManager.broadcastSpy).toHaveBeenCalledTimes(1); - expect(mockLoginService.loginSpy).toHaveBeenCalledWith(credentials); - expect(mockStateStorageService.getUrlSpy).toHaveBeenCalledTimes(1); - expect(mockStateStorageService.storeUrlSpy).not.toHaveBeenCalled(); - expect(mockRouter.navigateSpy).not.toHaveBeenCalled(); - }) - )); - - it('should empty the credentials upon cancel', () => { - // GIVEN - const credentials = { - username: 'admin', - password: 'admin', - rememberMe: true - }; - - const expected = { - username: null, - password: null, - rememberMe: true - }; - - comp.credentials = credentials; - - // WHEN - comp.cancel(); - - // THEN - expect(comp.authenticationError).toEqual(false); - expect(comp.credentials).toEqual(expected); - expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('cancel'); - }); - - it('should redirect user when register', () => { - // WHEN - comp.register(); - - // THEN - expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state register'); - expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/register']); - }); - - it('should redirect user when request password', () => { - // WHEN - comp.requestResetPassword(); - - // THEN - expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state requestReset'); - expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/reset', 'request']); - }); - }); -}); diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts deleted file mode 100644 index 659bf4d379..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-account.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { SpyObject } from './spyobject'; -import { AccountService } from 'app/core/auth/account.service'; -import Spy = jasmine.Spy; - -export class MockAccountService extends SpyObject { - getSpy: Spy; - saveSpy: Spy; - fakeResponse: any; - identitySpy: Spy; - - constructor() { - super(AccountService); - - this.fakeResponse = null; - this.getSpy = this.spy('get').andReturn(this); - this.saveSpy = this.spy('save').andReturn(this); - this.setIdentitySpy({}); - } - - subscribe(callback: any) { - callback(this.fakeResponse); - } - - setResponse(json: any): void { - this.fakeResponse = json; - } - - setIdentitySpy(json: any): any { - this.identitySpy = this.spy('identity').andReturn(Promise.resolve(json)); - } - - setIdentityResponse(json: any): void { - this.setIdentitySpy(json); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts deleted file mode 100644 index 8bf0cc966f..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-active-modal.service.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SpyObject } from './spyobject'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import Spy = jasmine.Spy; - -export class MockActiveModal extends SpyObject { - dismissSpy: Spy; - - constructor() { - super(NgbActiveModal); - this.dismissSpy = this.spy('dismiss').andReturn(this); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts deleted file mode 100644 index 87f36c71e2..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-alert.service.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SpyObject } from './spyobject'; -import { JhiAlertService, JhiAlert } from 'ng-jhipster'; - -export class MockAlertService extends SpyObject { - constructor() { - super(JhiAlertService); - } - addAlert(alertOptions: JhiAlert) { - return alertOptions; - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts deleted file mode 100644 index a71b5d9314..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-event-manager.service.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SpyObject } from './spyobject'; -import { JhiEventManager } from 'ng-jhipster'; -import Spy = jasmine.Spy; - -export class MockEventManager extends SpyObject { - broadcastSpy: Spy; - - constructor() { - super(JhiEventManager); - this.broadcastSpy = this.spy('broadcast').andReturn(this); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts deleted file mode 100644 index 93a8ca575f..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-login.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { SpyObject } from './spyobject'; -import { LoginService } from 'app/core/login/login.service'; -import Spy = jasmine.Spy; - -export class MockLoginService extends SpyObject { - loginSpy: Spy; - logoutSpy: Spy; - registerSpy: Spy; - requestResetPasswordSpy: Spy; - cancelSpy: Spy; - - constructor() { - super(LoginService); - - this.setLoginSpy({}); - this.logoutSpy = this.spy('logout').andReturn(this); - this.registerSpy = this.spy('register').andReturn(this); - this.requestResetPasswordSpy = this.spy('requestResetPassword').andReturn(this); - this.cancelSpy = this.spy('cancel').andReturn(this); - } - - setLoginSpy(json: any) { - this.loginSpy = this.spy('login').andReturn(Promise.resolve(json)); - } - - setResponse(json: any): void { - this.setLoginSpy(json); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts deleted file mode 100644 index 3465e05524..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-route.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ActivatedRoute, Router } from '@angular/router'; -import { SpyObject } from './spyobject'; -import { Observable, of } from 'rxjs'; -import Spy = jasmine.Spy; - -export class MockActivatedRoute extends ActivatedRoute { - constructor(parameters?: any) { - super(); - this.queryParams = of(parameters); - this.params = of(parameters); - this.data = of({ - ...parameters, - pagingParams: { - page: 10, - ascending: false, - predicate: 'id' - } - }); - } -} - -export class MockRouter extends SpyObject { - navigateSpy: Spy; - - constructor() { - super(Router); - this.navigateSpy = this.spy('navigate'); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts deleted file mode 100644 index 1398c7b28b..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/mock-state-storage.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { SpyObject } from './spyobject'; -import { StateStorageService } from 'app/core/auth/state-storage.service'; -import Spy = jasmine.Spy; - -export class MockStateStorageService extends SpyObject { - getUrlSpy: Spy; - storeUrlSpy: Spy; - - constructor() { - super(StateStorageService); - this.setUrlSpy({}); - this.storeUrlSpy = this.spy('storeUrl').andReturn(this); - } - - setUrlSpy(json) { - this.getUrlSpy = this.spy('getUrl').andReturn(json); - } - - setResponse(json: any): void { - this.setUrlSpy(json); - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts deleted file mode 100644 index 949e067ef5..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/helpers/spyobject.ts +++ /dev/null @@ -1,69 +0,0 @@ -export interface GuinessCompatibleSpy extends jasmine.Spy { - /** By chaining the spy with and.returnValue, all calls to the function will return a specific - * value. */ - andReturn(val: any): void; - /** By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied - * function. */ - andCallFake(fn: Function): GuinessCompatibleSpy; - /** removes all recorded calls */ - reset(); -} - -export class SpyObject { - static stub(object = null, config = null, overrides = null) { - if (!(object instanceof SpyObject)) { - overrides = config; - config = object; - object = new SpyObject(); - } - - const m = {}; - Object.keys(config).forEach(key => (m[key] = config[key])); - Object.keys(overrides).forEach(key => (m[key] = overrides[key])); - Object.keys(m).forEach(key => { - object.spy(key).andReturn(m[key]); - }); - return object; - } - - constructor(type = null) { - if (type) { - Object.keys(type.prototype).forEach(prop => { - let m = null; - try { - m = type.prototype[prop]; - } catch (e) { - // As we are creating spys for abstract classes, - // these classes might have getters that throw when they are accessed. - // As we are only auto creating spys for methods, this - // should not matter. - } - if (typeof m === 'function') { - this.spy(prop); - } - }); - } - } - - spy(name) { - if (!this[name]) { - this[name] = this._createGuinnessCompatibleSpy(name); - } - return this[name]; - } - - prop(name, value) { - this[name] = value; - } - - /** @internal */ - _createGuinnessCompatibleSpy(name): GuinessCompatibleSpy { - const newSpy: GuinessCompatibleSpy = jasmine.createSpy(name); - newSpy.andCallFake = newSpy.and.callFake; - newSpy.andReturn = newSpy.and.returnValue; - newSpy.reset = newSpy.calls.reset; - // revisit return null here (previously needed for rtts_assert). - newSpy.and.returnValue(null); - return newSpy; - } -} diff --git a/jhipster-5/bookstore-monolith/src/test/javascript/spec/test.module.ts b/jhipster-5/bookstore-monolith/src/test/javascript/spec/test.module.ts deleted file mode 100644 index c66241f9bb..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/javascript/spec/test.module.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { DatePipe } from '@angular/common'; -import { ActivatedRoute, Router } from '@angular/router'; -import { NgModule, ElementRef, Renderer } from '@angular/core'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { JhiDataUtils, JhiDateUtils, JhiEventManager, JhiAlertService, JhiParseLinks } from 'ng-jhipster'; - -import { AccountService, LoginModalService } from 'app/core'; -import { MockAccountService } from './helpers/mock-account.service'; -import { MockActivatedRoute, MockRouter } from './helpers/mock-route.service'; -import { MockActiveModal } from './helpers/mock-active-modal.service'; -import { MockEventManager } from './helpers/mock-event-manager.service'; - -@NgModule({ - providers: [ - DatePipe, - JhiDataUtils, - JhiDateUtils, - JhiParseLinks, - { - provide: JhiEventManager, - useClass: MockEventManager - }, - { - provide: NgbActiveModal, - useClass: MockActiveModal - }, - { - provide: ActivatedRoute, - useValue: new MockActivatedRoute({ id: 123 }) - }, - { - provide: Router, - useClass: MockRouter - }, - { - provide: AccountService, - useClass: MockAccountService - }, - { - provide: LoginModalService, - useValue: null - }, - { - provide: ElementRef, - useValue: null - }, - { - provide: Renderer, - useValue: null - }, - { - provide: JhiAlertService, - useValue: null - }, - { - provide: NgbModal, - useValue: null - } - ], - imports: [HttpClientTestingModule] -}) -export class BookstoreTestModule {} diff --git a/jhipster-5/bookstore-monolith/src/test/resources/config/application.yml b/jhipster-5/bookstore-monolith/src/test/resources/config/application.yml deleted file mode 100644 index 34c6ca3e15..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/resources/config/application.yml +++ /dev/null @@ -1,105 +0,0 @@ -# =================================================================== -# Spring Boot configuration. -# -# This configuration is used for unit/integration tests. -# -# More information on profiles: https://www.jhipster.tech/profiles/ -# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# =================================================================== -# Standard Spring Boot properties. -# Full reference is available at: -# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html -# =================================================================== - - -spring: - application: - name: Bookstore - datasource: - type: com.zaxxer.hikari.HikariDataSource - url: jdbc:h2:mem:Bookstore;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE - name: - username: - password: - hikari: - auto-commit: false - jpa: - database-platform: io.github.jhipster.domain.util.FixedH2Dialect - database: H2 - open-in-view: false - show-sql: false - hibernate: - ddl-auto: none - naming: - physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy - implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy - properties: - hibernate.id.new_generator_mappings: true - hibernate.connection.provider_disables_autocommit: true - hibernate.cache.use_second_level_cache: false - hibernate.cache.use_query_cache: false - hibernate.generate_statistics: false - hibernate.hbm2ddl.auto: validate - hibernate.jdbc.time_zone: UTC - liquibase: - contexts: test - mail: - host: localhost - messages: - basename: i18n/messages - mvc: - favicon: - enabled: false - thymeleaf: - mode: HTML - - -server: - port: 10344 - address: localhost - -# =================================================================== -# JHipster specific properties -# -# Full reference is available at: https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -jhipster: - async: - core-pool-size: 1 - max-pool-size: 50 - queue-capacity: 10000 - # To test logstash appender - logging: - logstash: - enabled: true - host: localhost - port: 5000 - queue-size: 512 - mail: - from: test@localhost - base-url: http://127.0.0.1:8080 - security: - authentication: - jwt: - # This token must be encoded using Base64 (you can type `echo 'secret-key'|base64` on your command line) - base64-secret: NDJmOTVlZjI2NzhlZDRjNmVkNTM1NDE2NjkyNDljZDJiNzBlMjI5YmZjMjY3MzdjZmZlMjI3NjE4OTRkNzc5MWYzNDNlYWMzYmJjOWRmMjc5ZWQyZTZmOWZkOTMxZWZhNWE1MTVmM2U2NjFmYjhlNDc2Y2Q3NzliMGY0YzFkNmI= - # Token is valid 24 hours - token-validity-in-seconds: 86400 - metrics: - logs: # Reports metrics in the logs - enabled: true - report-frequency: 60 # in seconds - -# =================================================================== -# Application specific properties -# Add your own application properties here, see the ApplicationProperties class -# to have type-safe configuration, like in the JHipsterProperties above -# -# More documentation is available at: -# https://www.jhipster.tech/common-application-properties/ -# =================================================================== - -# application: diff --git a/jhipster-5/bookstore-monolith/src/test/resources/i18n/messages_en.properties b/jhipster-5/bookstore-monolith/src/test/resources/i18n/messages_en.properties deleted file mode 100644 index f19db8692f..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/resources/i18n/messages_en.properties +++ /dev/null @@ -1 +0,0 @@ -email.test.title=test title diff --git a/jhipster-5/bookstore-monolith/src/test/resources/logback.xml b/jhipster-5/bookstore-monolith/src/test/resources/logback.xml deleted file mode 100644 index 6244807dfa..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/resources/logback.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jhipster-5/bookstore-monolith/src/test/resources/templates/mail/testEmail.html b/jhipster-5/bookstore-monolith/src/test/resources/templates/mail/testEmail.html deleted file mode 100644 index a4ca16a79f..0000000000 --- a/jhipster-5/bookstore-monolith/src/test/resources/templates/mail/testEmail.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/jhipster-5/bookstore-monolith/tsconfig-aot.json b/jhipster-5/bookstore-monolith/tsconfig-aot.json deleted file mode 100644 index 110cde9fd6..0000000000 --- a/jhipster-5/bookstore-monolith/tsconfig-aot.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "module": "es2015", - "moduleResolution": "node", - "sourceMap": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "removeComments": false, - "noImplicitAny": false, - "suppressImplicitAnyIndexErrors": true, - "skipLibCheck": true, - "outDir": "target/www/app", - "lib": ["es7", "dom"], - "typeRoots": ["node_modules/@types"], - "baseUrl": "./", - "paths": { - "app/*": ["src/main/webapp/app/*"] - }, - "importHelpers": true - }, - "angularCompilerOptions": { - "genDir": "target/aot", - "skipMetadataEmit": true, - "fullTemplateTypeCheck": true, - "preserveWhitespaces": true - } -} diff --git a/jhipster-5/bookstore-monolith/tsconfig.json b/jhipster-5/bookstore-monolith/tsconfig.json deleted file mode 100644 index dd6343ab62..0000000000 --- a/jhipster-5/bookstore-monolith/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "removeComments": false, - "noImplicitAny": false, - "skipLibCheck": true, - "suppressImplicitAnyIndexErrors": true, - "outDir": "target/www/app", - "lib": ["es7", "dom"], - "typeRoots": ["node_modules/@types"], - "baseUrl": "./", - "paths": { - "app/*": ["src/main/webapp/app/*"] - }, - "importHelpers": true, - "allowJs": true - }, - "include": ["src/main/webapp/app", "src/test/javascript/"], - "exclude": ["node_modules"] -} diff --git a/jhipster-5/bookstore-monolith/tslint.json b/jhipster-5/bookstore-monolith/tslint.json deleted file mode 100644 index 3b8456d2fd..0000000000 --- a/jhipster-5/bookstore-monolith/tslint.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "rulesDirectory": ["node_modules/codelyzer"], - "extends": ["tslint-config-prettier"], - "rules": { - "class-name": true, - "comment-format": [true, "check-space"], - "curly": true, - "eofline": true, - "forin": true, - "indent": [true, "spaces"], - "label-position": true, - "member-access": false, - "member-ordering": [true, "static-before-instance", "variables-before-functions"], - "no-arg": true, - "no-bitwise": true, - "no-console": [true, "debug", "info", "time", "timeEnd", "trace"], - "no-construct": true, - "no-debugger": true, - "no-duplicate-variable": true, - "no-empty": false, - "no-eval": true, - "no-inferrable-types": [true], - "no-shadowed-variable": true, - "no-string-literal": false, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unused-expression": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [true, "check-open-brace", "check-catch", "check-else", "check-whitespace"], - "quotemark": [true, "single", "avoid-escape"], - "radix": true, - "semicolon": [true, "always", "ignore-bound-class-methods"], - "triple-equals": [true, "allow-null-check"], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "variable-name": false, - "whitespace": [true, "check-branch", "check-decl", "check-operator", "check-separator", "check-type"], - "prefer-const": true, - "arrow-parens": [true, "ban-single-arg-parens"], - "arrow-return-shorthand": [true], - "import-spacing": true, - "no-consecutive-blank-lines": [true], - "object-literal-shorthand": true, - "space-before-function-paren": [ - true, - { - "asyncArrow": "always", - "anonymous": "never", - "constructor": "never", - "method": "never", - "named": "never" - } - ], - - "directive-selector": [true, "attribute", "jhi", "camelCase"], - "component-selector": [true, "element", "jhi", "kebab-case"], - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": false, - "component-class-suffix": true, - "directive-class-suffix": true - } -} diff --git a/jhipster-5/bookstore-monolith/webpack/logo-jhipster.png b/jhipster-5/bookstore-monolith/webpack/logo-jhipster.png deleted file mode 100644 index d8eb48da05c157571eed9fd7303f8d9566f2ea12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4459 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 { - if (err) { - throw new Error('Failed to parse pom.xml: ' + err); - } - if (result.project.version && result.project.version[0]) { - version = result.project.version[0]; - } else if (result.project.parent && result.project.parent[0] && result.project.parent[0].version && result.project.parent[0].version[0]) { - version = result.project.parent[0].version[0]; - } - }); - if (version === null) { - throw new Error('pom.xml is malformed. No version is defined'); - } - return version; -} - -const _root = path.resolve(__dirname, '..'); - -function root(args) { - args = Array.prototype.slice.call(arguments, 0); - return path.join.apply(path, [_root].concat(args)); -} - -function isExternalLib(module, check = /node_modules/) { - const req = module.userRequest; - if (typeof req !== 'string') { - return false; - } - return req.search(check) >= 0; -} diff --git a/jhipster-5/bookstore-monolith/webpack/webpack.common.js b/jhipster-5/bookstore-monolith/webpack/webpack.common.js deleted file mode 100644 index d8fd26c157..0000000000 --- a/jhipster-5/bookstore-monolith/webpack/webpack.common.js +++ /dev/null @@ -1,86 +0,0 @@ -const webpack = require('webpack'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const rxPaths = require('rxjs/_esm5/path-mapping'); - -const utils = require('./utils.js'); - -module.exports = (options) => ({ - resolve: { - extensions: ['.ts', '.js'], - modules: ['node_modules'], - alias: { - app: utils.root('src/main/webapp/app/'), - ...rxPaths() - } - }, - stats: { - children: false - }, - module: { - rules: [ - { - test: /\.html$/, - loader: 'html-loader', - options: { - minimize: true, - caseSensitive: true, - removeAttributeQuotes:false, - minifyJS:false, - minifyCSS:false - }, - exclude: /(src\/main\/webapp\/index.html)/ - }, - { - test: /\.(jpe?g|png|gif|svg|woff2?|ttf|eot)$/i, - loader: 'file-loader', - options: { - digest: 'hex', - hash: 'sha512', - name: 'content/[hash].[ext]' - } - }, - { - test: /manifest.webapp$/, - loader: 'file-loader', - options: { - name: 'manifest.webapp' - } - }, - // Ignore warnings about System.import in Angular - { test: /[\/\\]@angular[\/\\].+\.js$/, parser: { system: true } }, - ] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env': { - NODE_ENV: `'${options.env}'`, - BUILD_TIMESTAMP: `'${new Date().getTime()}'`, - VERSION: `'${utils.parseVersion()}'`, - DEBUG_INFO_ENABLED: options.env === 'development', - // The root URL for API calls, ending with a '/' - for example: `"https://www.jhipster.tech:8081/myservice/"`. - // If this URL is left empty (""), then it will be relative to the current context. - // If you use an API server, in `prod` mode, you will need to enable CORS - // (see the `jhipster.cors` common JHipster property in the `application-*.yml` configurations) - SERVER_API_URL: `''` - } - }), - new CopyWebpackPlugin([ - { from: './node_modules/swagger-ui/dist/css', to: 'swagger-ui/dist/css' }, - { from: './node_modules/swagger-ui/dist/lib', to: 'swagger-ui/dist/lib' }, - { from: './node_modules/swagger-ui/dist/swagger-ui.min.js', to: 'swagger-ui/dist/swagger-ui.min.js' }, - { from: './src/main/webapp/swagger-ui/', to: 'swagger-ui' }, - { from: './src/main/webapp/content/', to: 'content' }, - { from: './src/main/webapp/favicon.ico', to: 'favicon.ico' }, - { from: './src/main/webapp/manifest.webapp', to: 'manifest.webapp' }, - // jhipster-needle-add-assets-to-webpack - JHipster will add/remove third-party resources in this array - { from: './src/main/webapp/robots.txt', to: 'robots.txt' } - ]), - new HtmlWebpackPlugin({ - template: './src/main/webapp/index.html', - chunks: ['vendors', 'polyfills', 'main', 'global'], - chunksSortMode: 'manual', - inject: 'body' - }) - ] -}); diff --git a/jhipster-5/bookstore-monolith/webpack/webpack.dev.js b/jhipster-5/bookstore-monolith/webpack/webpack.dev.js deleted file mode 100644 index d05a7ddea8..0000000000 --- a/jhipster-5/bookstore-monolith/webpack/webpack.dev.js +++ /dev/null @@ -1,148 +0,0 @@ -const webpack = require('webpack'); -const writeFilePlugin = require('write-file-webpack-plugin'); -const webpackMerge = require('webpack-merge'); -const BrowserSyncPlugin = require('browser-sync-webpack-plugin'); -const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); -const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); -const SimpleProgressWebpackPlugin = require('simple-progress-webpack-plugin'); -const WebpackNotifierPlugin = require('webpack-notifier'); -const path = require('path'); -const sass = require('sass'); - -const utils = require('./utils.js'); -const commonConfig = require('./webpack.common.js'); - -const ENV = 'development'; - -module.exports = (options) => webpackMerge(commonConfig({ env: ENV }), { - devtool: 'eval-source-map', - devServer: { - contentBase: './target/www', - proxy: [{ - context: [ - /* jhipster-needle-add-entity-to-webpack - JHipster will add entity api paths here */ - '/api', - '/management', - '/swagger-resources', - '/v2/api-docs', - '/h2-console', - '/auth' - ], - target: `http${options.tls ? 's' : ''}://127.0.0.1:8080`, - secure: false, - changeOrigin: options.tls, - headers: { host: 'localhost:9000' } - }], - stats: options.stats, - watchOptions: { - ignored: /node_modules/ - } - }, - entry: { - polyfills: './src/main/webapp/app/polyfills', - global: './src/main/webapp/content/scss/global.scss', - main: './src/main/webapp/app/app.main' - }, - output: { - path: utils.root('target/www'), - filename: 'app/[name].bundle.js', - chunkFilename: 'app/[id].chunk.js' - }, - module: { - rules: [{ - test: /\.ts$/, - enforce: 'pre', - loader: 'tslint-loader', - exclude: [/(node_modules)/, new RegExp('reflect-metadata\\' + path.sep + 'Reflect\\.ts')] - }, - { - test: /\.ts$/, - use: [ - 'angular2-template-loader', - { - loader: 'cache-loader', - options: { - cacheDirectory: path.resolve('target/cache-loader') - } - }, - { - loader: 'thread-loader', - options: { - // there should be 1 cpu for the fork-ts-checker-webpack-plugin - workers: require('os').cpus().length - 1 - } - }, - { - loader: 'ts-loader', - options: { - transpileOnly: true, - happyPackMode: true - } - }, - 'angular-router-loader' - ], - exclude: /(node_modules)/ - }, - { - test: /\.scss$/, - use: ['to-string-loader', 'css-loader', { - loader: 'sass-loader', - options: { implementation: sass } - }], - exclude: /(vendor\.scss|global\.scss)/ - }, - { - test: /(vendor\.scss|global\.scss)/, - use: ['style-loader', 'css-loader', 'postcss-loader', { - loader: 'sass-loader', - options: { implementation: sass } - }] - }, - { - test: /\.css$/, - use: ['to-string-loader', 'css-loader'], - exclude: /(vendor\.css|global\.css)/ - }, - { - test: /(vendor\.css|global\.css)/, - use: ['style-loader', 'css-loader'] - }] - }, - stats: process.env.JHI_DISABLE_WEBPACK_LOGS ? 'none' : options.stats, - plugins: [ - process.env.JHI_DISABLE_WEBPACK_LOGS - ? null - : new SimpleProgressWebpackPlugin({ - format: options.stats === 'minimal' ? 'compact' : 'expanded' - }), - new FriendlyErrorsWebpackPlugin(), - new ForkTsCheckerWebpackPlugin(), - new BrowserSyncPlugin({ - host: 'localhost', - port: 9000, - proxy: { - target: 'http://localhost:9060' - }, - socket: { - clients: { - heartbeatTimeout: 60000 - } - } - }, { - reload: false - }), - new webpack.ContextReplacementPlugin( - /angular(\\|\/)core(\\|\/)/, - path.resolve(__dirname, './src/main/webapp') - ), - new writeFilePlugin(), - new webpack.WatchIgnorePlugin([ - utils.root('src/test'), - ]), - new WebpackNotifierPlugin({ - title: 'JHipster', - contentImage: path.join(__dirname, 'logo-jhipster.png') - }) - ].filter(Boolean), - mode: 'development' -}); diff --git a/jhipster-5/bookstore-monolith/webpack/webpack.prod.js b/jhipster-5/bookstore-monolith/webpack/webpack.prod.js deleted file mode 100644 index ebafa2f631..0000000000 --- a/jhipster-5/bookstore-monolith/webpack/webpack.prod.js +++ /dev/null @@ -1,144 +0,0 @@ -const webpack = require('webpack'); -const webpackMerge = require('webpack-merge'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); -const Visualizer = require('webpack-visualizer-plugin'); -const MomentLocalesPlugin = require('moment-locales-webpack-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); -const WorkboxPlugin = require('workbox-webpack-plugin'); -const AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin; -const path = require('path'); - -const utils = require('./utils.js'); -const commonConfig = require('./webpack.common.js'); - -const ENV = 'production'; -const sass = require('sass'); - -module.exports = webpackMerge(commonConfig({ env: ENV }), { - // Enable source maps. Please note that this will slow down the build. - // You have to enable it in UglifyJSPlugin config below and in tsconfig-aot.json as well - // devtool: 'source-map', - entry: { - polyfills: './src/main/webapp/app/polyfills', - global: './src/main/webapp/content/scss/global.scss', - main: './src/main/webapp/app/app.main' - }, - output: { - path: utils.root('target/www'), - filename: 'app/[name].[hash].bundle.js', - chunkFilename: 'app/[id].[hash].chunk.js' - }, - module: { - rules: [{ - test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, - loader: '@ngtools/webpack' - }, - { - test: /\.scss$/, - use: ['to-string-loader', 'css-loader', { - loader: 'sass-loader', - options: { implementation: sass } - }], - exclude: /(vendor\.scss|global\.scss)/ - }, - { - test: /(vendor\.scss|global\.scss)/, - use: [ - MiniCssExtractPlugin.loader, - 'css-loader', - 'postcss-loader', - { - loader: 'sass-loader', - options: { implementation: sass } - } - ] - }, - { - test: /\.css$/, - use: ['to-string-loader', 'css-loader'], - exclude: /(vendor\.css|global\.css)/ - }, - { - test: /(vendor\.css|global\.css)/, - use: [ - MiniCssExtractPlugin.loader, - 'css-loader', - 'postcss-loader' - ] - }] - }, - optimization: { - runtimeChunk: false, - splitChunks: { - cacheGroups: { - commons: { - test: /[\\/]node_modules[\\/]/, - name: 'vendors', - chunks: 'all' - } - } - }, - minimizer: [ - new TerserPlugin({ - parallel: true, - cache: true, - terserOptions: { - ie8: false, - // sourceMap: true, // Enable source maps. Please note that this will slow down the build - compress: { - dead_code: true, - warnings: false, - properties: true, - drop_debugger: true, - conditionals: true, - booleans: true, - loops: true, - unused: true, - toplevel: true, - if_return: true, - inline: true, - join_vars: true - }, - output: { - comments: false, - beautify: false, - indent_level: 2 - } - } - }), - new OptimizeCSSAssetsPlugin({}) - ] - }, - plugins: [ - new MiniCssExtractPlugin({ - // Options similar to the same options in webpackOptions.output - // both options are optional - filename: '[name].[contenthash].css', - chunkFilename: '[id].css' - }), - new MomentLocalesPlugin({ - localesToKeep: [ - // jhipster-needle-i18n-language-moment-webpack - JHipster will add/remove languages in this array - ] - }), - new Visualizer({ - // Webpack statistics in target folder - filename: '../stats.html' - }), - new AngularCompilerPlugin({ - mainPath: utils.root('src/main/webapp/app/app.main.ts'), - tsConfigPath: utils.root('tsconfig-aot.json'), - sourceMap: true - }), - new webpack.LoaderOptionsPlugin({ - minimize: true, - debug: false - }), - new WorkboxPlugin.GenerateSW({ - clientsClaim: true, - skipWaiting: true, - }) - ], - mode: 'production' -}); diff --git a/jhipster-5/pom.xml b/jhipster-5/pom.xml deleted file mode 100644 index 2a5132e50e..0000000000 --- a/jhipster-5/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 4.0.0 - com.baeldung.jhipster - jhipster-5 - 1.0.0-SNAPSHOT - jhipster-5 - pom - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - bookstore-monolith - - - diff --git a/pom.xml b/pom.xml index 2548dbfbde..6fdc6b8a7c 100644 --- a/pom.xml +++ b/pom.xml @@ -357,7 +357,6 @@ java-jdi jetbrains - jhipster-5 language-interop libraries-3 @@ -488,7 +487,6 @@ jenkins-modules jhipster-modules - jhipster-5 jws libraries-6 @@ -553,7 +551,6 @@ java-jdi - jhipster-5 language-interop libraries-3 @@ -666,7 +663,6 @@ jenkins-modules jhipster-modules - jhipster-5 jws libraries-6 From 30674d218602df2e01fc6d7204cceaae1c82e297 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 12 Apr 2023 07:52:57 +0530 Subject: [PATCH 09/39] JAVA-19475: Changes made for uncommenting feign module in the root pom.xml (#13823) --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6fdc6b8a7c..718c2c9321 100644 --- a/pom.xml +++ b/pom.xml @@ -864,7 +864,7 @@ disruptor dozer dubbo - + feign google-cloud graphql-modules grpc @@ -1116,7 +1116,7 @@ dozer dubbo - + feign google-cloud graphql-modules grpc From 58755953cc6164771f6677a7db4b9d267ac59b02 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 12 Apr 2023 08:27:20 +0530 Subject: [PATCH 10/39] JAVA-20220 Added suffix -modules to aws-lambda, clojure, terraform, linux-bash --- aws-modules/{aws-lambda => aws-lambda-modules}/.gitignore | 0 aws-modules/{aws-lambda => aws-lambda-modules}/README.md | 0 .../{aws-lambda => aws-lambda-modules}/lambda/pom.xml | 2 +- .../lambda/sam-templates/template-implicit.yaml | 0 .../lambda/sam-templates/template-inline-swagger.yaml | 0 .../main/java/com/baeldung/lambda/LambdaMethodHandler.java | 0 .../java/com/baeldung/lambda/LambdaRequestHandler.java | 0 .../com/baeldung/lambda/LambdaRequestStreamHandler.java | 0 .../com/baeldung/lambda/apigateway/APIDemoHandler.java | 0 .../java/com/baeldung/lambda/apigateway/model/Person.java | 0 .../com/baeldung/lambda/dynamodb/SavePersonHandler.java | 0 .../com/baeldung/lambda/dynamodb/bean/PersonRequest.java | 0 .../com/baeldung/lambda/dynamodb/bean/PersonResponse.java | 0 .../lambda/src/main/resources/logback.xml | 0 aws-modules/{aws-lambda => aws-lambda-modules}/pom.xml | 4 ++-- .../shipping-tracker/.gitignore | 0 .../shipping-tracker/ShippingFunction/pom.xml | 2 +- .../src/main/java/com/baeldung/lambda/shipping/App.java | 0 .../main/java/com/baeldung/lambda/shipping/Checkin.java | 0 .../java/com/baeldung/lambda/shipping/Consignment.java | 0 .../src/main/java/com/baeldung/lambda/shipping/Item.java | 0 .../java/com/baeldung/lambda/shipping/ShippingDao.java | 0 .../java/com/baeldung/lambda/shipping/ShippingService.java | 0 .../shipping-tracker/template.yaml | 0 .../todo-reminder/ToDoFunction/pom.xml | 7 +++++++ .../src/main/java/com/baeldung/lambda/todo/App.java | 0 .../main/java/com/baeldung/lambda/todo/api/PostApi.java | 0 .../main/java/com/baeldung/lambda/todo/api/PostItem.java | 0 .../main/java/com/baeldung/lambda/todo/api/ToDoApi.java | 0 .../main/java/com/baeldung/lambda/todo/api/ToDoItem.java | 0 .../main/java/com/baeldung/lambda/todo/config/Config.java | 0 .../java/com/baeldung/lambda/todo/config/Credentials.java | 0 .../com/baeldung/lambda/todo/config/ExecutionContext.java | 0 .../java/com/baeldung/lambda/todo/config/Services.java | 0 .../java/com/baeldung/lambda/todo/service/PostService.java | 0 .../baeldung/lambda/todo/service/ToDoReaderService.java | 0 .../ToDoFunction/src/main/resources/configuration.yml | 0 .../ToDoFunction/src/main/resources/log4j2.xml | 0 .../src/test/java/com/baeldung/lambda/todo/AppTest.java | 0 .../lambda/todo/service/ToDoReaderServiceTest.java | 0 .../todo-reminder/template.yaml | 0 aws-modules/pom.xml | 2 +- {clojure => clojure-modules}/ring/.gitignore | 0 {clojure => clojure-modules}/ring/README.md | 0 {clojure => clojure-modules}/ring/project.clj | 0 {clojure => clojure-modules}/ring/src/ring/core.clj | 0 .../command-line-arguments/src/main/bash/README.md | 0 .../command-line-arguments/src/main/bash/userReg-flags.sh | 0 .../src/main/bash/userReg-positional-parameter.sh | 0 .../command-line-arguments/src/main/bash/users-loop.sh | 0 .../src/main/bash/users-shift-operator.sh | 0 .../functions/src/main/bash/README.md | 0 .../functions/src/main/bash/functions.sh | 0 .../functions/src/main/bash/infile | 0 {linux-bash => linux-bash-modules}/json/README.md | 0 .../json/src/main/bash/fruit.json | 0 .../json/src/main/bash/fruits.json | 0 .../json/src/main/bash/jq.sh | 0 .../json/src/main/bash/wikipedia.json | 0 {linux-bash => linux-bash-modules}/loops/README.md | 0 .../loops/src/main/bash/find_directories.sh | 0 .../loops/src/main/bash/loop_directories.sh | 0 {linux-bash => linux-bash-modules}/read/README.md | 0 .../read/src/main/bash/file.csv | 0 .../read/src/main/bash/read_inputs.sh | 0 {linux-bash => linux-bash-modules}/text/README.md | 0 .../text/src/main/bash/append_multiple_lines.sh | 0 .../text/src/main/bash/remove_characters.sh | 0 {terraform => terraform-modules}/README.md | 0 {terraform => terraform-modules}/best-practices/README.md | 0 .../best-practices/ec2-simple/.gitignore | 0 .../best-practices/ec2-simple/SETUP.md | 0 .../best-practices/ec2-simple/main.tf | 0 .../best-practices/ec2-simple/providers.tf | 0 .../best-practices/ec2-simple/variables.tf | 0 .../best-practices/k8s-basic/.gitignore | 0 .../best-practices/k8s-basic/SETUP.md | 0 .../best-practices/k8s-basic/main.tf | 0 .../best-practices/k8s-basic/providers.tf | 0 .../best-practices/k8s-basic/variables.tf | 0 .../best-practices/k8s-modules/.gitignore | 0 .../best-practices/k8s-modules/SETUP.md | 0 .../best-practices/k8s-modules/main.tf | 0 .../best-practices/k8s-modules/modules/SvcCustomer/main.tf | 0 .../k8s-modules/modules/SvcCustomer/outputs.tf | 0 .../k8s-modules/modules/SvcCustomer/variables.tf | 0 .../best-practices/k8s-modules/modules/SvcFeedback/main.tf | 0 .../k8s-modules/modules/SvcFeedback/outputs.tf | 0 .../k8s-modules/modules/SvcFeedback/variables.tf | 0 .../k8s-modules/modules/ingress/www.petshop.com.br/main.tf | 0 .../modules/ingress/www.petshop.com.br/outputs.tf | 0 .../modules/ingress/www.petshop.com.br/variables.tf | 0 .../best-practices/k8s-modules/provider.tf | 0 .../hello-terraform/.gitignore | 0 {terraform => terraform-modules}/hello-terraform/main.tf | 0 95 files changed, 12 insertions(+), 5 deletions(-) rename aws-modules/{aws-lambda => aws-lambda-modules}/.gitignore (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/README.md (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/pom.xml (98%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/sam-templates/template-implicit.yaml (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/sam-templates/template-inline-swagger.yaml (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/lambda/src/main/resources/logback.xml (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/pom.xml (88%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/.gitignore (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/ShippingFunction/pom.xml (98%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/shipping-tracker/template.yaml (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/pom.xml (95%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/resources/configuration.yml (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java (100%) rename aws-modules/{aws-lambda => aws-lambda-modules}/todo-reminder/template.yaml (100%) rename {clojure => clojure-modules}/ring/.gitignore (100%) rename {clojure => clojure-modules}/ring/README.md (100%) rename {clojure => clojure-modules}/ring/project.clj (100%) rename {clojure => clojure-modules}/ring/src/ring/core.clj (100%) rename {linux-bash => linux-bash-modules}/command-line-arguments/src/main/bash/README.md (100%) rename {linux-bash => linux-bash-modules}/command-line-arguments/src/main/bash/userReg-flags.sh (100%) rename {linux-bash => linux-bash-modules}/command-line-arguments/src/main/bash/userReg-positional-parameter.sh (100%) rename {linux-bash => linux-bash-modules}/command-line-arguments/src/main/bash/users-loop.sh (100%) rename {linux-bash => linux-bash-modules}/command-line-arguments/src/main/bash/users-shift-operator.sh (100%) rename {linux-bash => linux-bash-modules}/functions/src/main/bash/README.md (100%) rename {linux-bash => linux-bash-modules}/functions/src/main/bash/functions.sh (100%) rename {linux-bash => linux-bash-modules}/functions/src/main/bash/infile (100%) rename {linux-bash => linux-bash-modules}/json/README.md (100%) rename {linux-bash => linux-bash-modules}/json/src/main/bash/fruit.json (100%) rename {linux-bash => linux-bash-modules}/json/src/main/bash/fruits.json (100%) rename {linux-bash => linux-bash-modules}/json/src/main/bash/jq.sh (100%) rename {linux-bash => linux-bash-modules}/json/src/main/bash/wikipedia.json (100%) rename {linux-bash => linux-bash-modules}/loops/README.md (100%) rename {linux-bash => linux-bash-modules}/loops/src/main/bash/find_directories.sh (100%) rename {linux-bash => linux-bash-modules}/loops/src/main/bash/loop_directories.sh (100%) rename {linux-bash => linux-bash-modules}/read/README.md (100%) rename {linux-bash => linux-bash-modules}/read/src/main/bash/file.csv (100%) rename {linux-bash => linux-bash-modules}/read/src/main/bash/read_inputs.sh (100%) rename {linux-bash => linux-bash-modules}/text/README.md (100%) rename {linux-bash => linux-bash-modules}/text/src/main/bash/append_multiple_lines.sh (100%) rename {linux-bash => linux-bash-modules}/text/src/main/bash/remove_characters.sh (100%) rename {terraform => terraform-modules}/README.md (100%) rename {terraform => terraform-modules}/best-practices/README.md (100%) rename {terraform => terraform-modules}/best-practices/ec2-simple/.gitignore (100%) rename {terraform => terraform-modules}/best-practices/ec2-simple/SETUP.md (100%) rename {terraform => terraform-modules}/best-practices/ec2-simple/main.tf (100%) rename {terraform => terraform-modules}/best-practices/ec2-simple/providers.tf (100%) rename {terraform => terraform-modules}/best-practices/ec2-simple/variables.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-basic/.gitignore (100%) rename {terraform => terraform-modules}/best-practices/k8s-basic/SETUP.md (100%) rename {terraform => terraform-modules}/best-practices/k8s-basic/main.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-basic/providers.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-basic/variables.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/.gitignore (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/SETUP.md (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/main.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/SvcCustomer/main.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/SvcCustomer/variables.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/SvcFeedback/main.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/SvcFeedback/variables.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf (100%) rename {terraform => terraform-modules}/best-practices/k8s-modules/provider.tf (100%) rename {terraform => terraform-modules}/hello-terraform/.gitignore (100%) rename {terraform => terraform-modules}/hello-terraform/main.tf (100%) diff --git a/aws-modules/aws-lambda/.gitignore b/aws-modules/aws-lambda-modules/.gitignore similarity index 100% rename from aws-modules/aws-lambda/.gitignore rename to aws-modules/aws-lambda-modules/.gitignore diff --git a/aws-modules/aws-lambda/README.md b/aws-modules/aws-lambda-modules/README.md similarity index 100% rename from aws-modules/aws-lambda/README.md rename to aws-modules/aws-lambda-modules/README.md diff --git a/aws-modules/aws-lambda/lambda/pom.xml b/aws-modules/aws-lambda-modules/lambda/pom.xml similarity index 98% rename from aws-modules/aws-lambda/lambda/pom.xml rename to aws-modules/aws-lambda-modules/lambda/pom.xml index 8e47bab4be..a82209b23f 100644 --- a/aws-modules/aws-lambda/lambda/pom.xml +++ b/aws-modules/aws-lambda-modules/lambda/pom.xml @@ -10,7 +10,7 @@ com.baeldung - aws-lambda + aws-lambda-modules 1.0.0-SNAPSHOT diff --git a/aws-modules/aws-lambda/lambda/sam-templates/template-implicit.yaml b/aws-modules/aws-lambda-modules/lambda/sam-templates/template-implicit.yaml similarity index 100% rename from aws-modules/aws-lambda/lambda/sam-templates/template-implicit.yaml rename to aws-modules/aws-lambda-modules/lambda/sam-templates/template-implicit.yaml diff --git a/aws-modules/aws-lambda/lambda/sam-templates/template-inline-swagger.yaml b/aws-modules/aws-lambda-modules/lambda/sam-templates/template-inline-swagger.yaml similarity index 100% rename from aws-modules/aws-lambda/lambda/sam-templates/template-inline-swagger.yaml rename to aws-modules/aws-lambda-modules/lambda/sam-templates/template-inline-swagger.yaml diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java rename to aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java diff --git a/aws-modules/aws-lambda/lambda/src/main/resources/logback.xml b/aws-modules/aws-lambda-modules/lambda/src/main/resources/logback.xml similarity index 100% rename from aws-modules/aws-lambda/lambda/src/main/resources/logback.xml rename to aws-modules/aws-lambda-modules/lambda/src/main/resources/logback.xml diff --git a/aws-modules/aws-lambda/pom.xml b/aws-modules/aws-lambda-modules/pom.xml similarity index 88% rename from aws-modules/aws-lambda/pom.xml rename to aws-modules/aws-lambda-modules/pom.xml index bdd295c007..23fb348631 100644 --- a/aws-modules/aws-lambda/pom.xml +++ b/aws-modules/aws-lambda-modules/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - aws-lambda - aws-lambda + aws-lambda-modules + aws-lambda-modules pom diff --git a/aws-modules/aws-lambda/shipping-tracker/.gitignore b/aws-modules/aws-lambda-modules/shipping-tracker/.gitignore similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/.gitignore rename to aws-modules/aws-lambda-modules/shipping-tracker/.gitignore diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/pom.xml similarity index 98% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml rename to aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/pom.xml index a60f934bad..abd22ea50c 100644 --- a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml +++ b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/pom.xml @@ -9,7 +9,7 @@ com.baeldung - aws-lambda + aws-lambda-modules 1.0.0-SNAPSHOT ../../ diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java rename to aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java rename to aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java rename to aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java rename to aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java rename to aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java b/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java rename to aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java diff --git a/aws-modules/aws-lambda/shipping-tracker/template.yaml b/aws-modules/aws-lambda-modules/shipping-tracker/template.yaml similarity index 100% rename from aws-modules/aws-lambda/shipping-tracker/template.yaml rename to aws-modules/aws-lambda-modules/shipping-tracker/template.yaml diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/pom.xml similarity index 95% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/pom.xml index 5545154a5d..04295e1ab1 100644 --- a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml +++ b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/pom.xml @@ -8,6 +8,13 @@ ToDoFunction jar + + com.baeldung + aws-lambda-modules + 1.0.0-SNAPSHOT + ../../ + + com.amazonaws diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/configuration.yml similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/configuration.yml rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/configuration.yml diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java diff --git a/aws-modules/aws-lambda/todo-reminder/template.yaml b/aws-modules/aws-lambda-modules/todo-reminder/template.yaml similarity index 100% rename from aws-modules/aws-lambda/todo-reminder/template.yaml rename to aws-modules/aws-lambda-modules/todo-reminder/template.yaml diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 72c5017c32..02473815b5 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -15,7 +15,7 @@ aws-app-sync - aws-lambda + aws-lambda-modules aws-miscellaneous aws-reactive aws-s3 diff --git a/clojure/ring/.gitignore b/clojure-modules/ring/.gitignore similarity index 100% rename from clojure/ring/.gitignore rename to clojure-modules/ring/.gitignore diff --git a/clojure/ring/README.md b/clojure-modules/ring/README.md similarity index 100% rename from clojure/ring/README.md rename to clojure-modules/ring/README.md diff --git a/clojure/ring/project.clj b/clojure-modules/ring/project.clj similarity index 100% rename from clojure/ring/project.clj rename to clojure-modules/ring/project.clj diff --git a/clojure/ring/src/ring/core.clj b/clojure-modules/ring/src/ring/core.clj similarity index 100% rename from clojure/ring/src/ring/core.clj rename to clojure-modules/ring/src/ring/core.clj diff --git a/linux-bash/command-line-arguments/src/main/bash/README.md b/linux-bash-modules/command-line-arguments/src/main/bash/README.md similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/README.md rename to linux-bash-modules/command-line-arguments/src/main/bash/README.md diff --git a/linux-bash/command-line-arguments/src/main/bash/userReg-flags.sh b/linux-bash-modules/command-line-arguments/src/main/bash/userReg-flags.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/userReg-flags.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/userReg-flags.sh diff --git a/linux-bash/command-line-arguments/src/main/bash/userReg-positional-parameter.sh b/linux-bash-modules/command-line-arguments/src/main/bash/userReg-positional-parameter.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/userReg-positional-parameter.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/userReg-positional-parameter.sh diff --git a/linux-bash/command-line-arguments/src/main/bash/users-loop.sh b/linux-bash-modules/command-line-arguments/src/main/bash/users-loop.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/users-loop.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/users-loop.sh diff --git a/linux-bash/command-line-arguments/src/main/bash/users-shift-operator.sh b/linux-bash-modules/command-line-arguments/src/main/bash/users-shift-operator.sh similarity index 100% rename from linux-bash/command-line-arguments/src/main/bash/users-shift-operator.sh rename to linux-bash-modules/command-line-arguments/src/main/bash/users-shift-operator.sh diff --git a/linux-bash/functions/src/main/bash/README.md b/linux-bash-modules/functions/src/main/bash/README.md similarity index 100% rename from linux-bash/functions/src/main/bash/README.md rename to linux-bash-modules/functions/src/main/bash/README.md diff --git a/linux-bash/functions/src/main/bash/functions.sh b/linux-bash-modules/functions/src/main/bash/functions.sh similarity index 100% rename from linux-bash/functions/src/main/bash/functions.sh rename to linux-bash-modules/functions/src/main/bash/functions.sh diff --git a/linux-bash/functions/src/main/bash/infile b/linux-bash-modules/functions/src/main/bash/infile similarity index 100% rename from linux-bash/functions/src/main/bash/infile rename to linux-bash-modules/functions/src/main/bash/infile diff --git a/linux-bash/json/README.md b/linux-bash-modules/json/README.md similarity index 100% rename from linux-bash/json/README.md rename to linux-bash-modules/json/README.md diff --git a/linux-bash/json/src/main/bash/fruit.json b/linux-bash-modules/json/src/main/bash/fruit.json similarity index 100% rename from linux-bash/json/src/main/bash/fruit.json rename to linux-bash-modules/json/src/main/bash/fruit.json diff --git a/linux-bash/json/src/main/bash/fruits.json b/linux-bash-modules/json/src/main/bash/fruits.json similarity index 100% rename from linux-bash/json/src/main/bash/fruits.json rename to linux-bash-modules/json/src/main/bash/fruits.json diff --git a/linux-bash/json/src/main/bash/jq.sh b/linux-bash-modules/json/src/main/bash/jq.sh similarity index 100% rename from linux-bash/json/src/main/bash/jq.sh rename to linux-bash-modules/json/src/main/bash/jq.sh diff --git a/linux-bash/json/src/main/bash/wikipedia.json b/linux-bash-modules/json/src/main/bash/wikipedia.json similarity index 100% rename from linux-bash/json/src/main/bash/wikipedia.json rename to linux-bash-modules/json/src/main/bash/wikipedia.json diff --git a/linux-bash/loops/README.md b/linux-bash-modules/loops/README.md similarity index 100% rename from linux-bash/loops/README.md rename to linux-bash-modules/loops/README.md diff --git a/linux-bash/loops/src/main/bash/find_directories.sh b/linux-bash-modules/loops/src/main/bash/find_directories.sh similarity index 100% rename from linux-bash/loops/src/main/bash/find_directories.sh rename to linux-bash-modules/loops/src/main/bash/find_directories.sh diff --git a/linux-bash/loops/src/main/bash/loop_directories.sh b/linux-bash-modules/loops/src/main/bash/loop_directories.sh similarity index 100% rename from linux-bash/loops/src/main/bash/loop_directories.sh rename to linux-bash-modules/loops/src/main/bash/loop_directories.sh diff --git a/linux-bash/read/README.md b/linux-bash-modules/read/README.md similarity index 100% rename from linux-bash/read/README.md rename to linux-bash-modules/read/README.md diff --git a/linux-bash/read/src/main/bash/file.csv b/linux-bash-modules/read/src/main/bash/file.csv similarity index 100% rename from linux-bash/read/src/main/bash/file.csv rename to linux-bash-modules/read/src/main/bash/file.csv diff --git a/linux-bash/read/src/main/bash/read_inputs.sh b/linux-bash-modules/read/src/main/bash/read_inputs.sh similarity index 100% rename from linux-bash/read/src/main/bash/read_inputs.sh rename to linux-bash-modules/read/src/main/bash/read_inputs.sh diff --git a/linux-bash/text/README.md b/linux-bash-modules/text/README.md similarity index 100% rename from linux-bash/text/README.md rename to linux-bash-modules/text/README.md diff --git a/linux-bash/text/src/main/bash/append_multiple_lines.sh b/linux-bash-modules/text/src/main/bash/append_multiple_lines.sh similarity index 100% rename from linux-bash/text/src/main/bash/append_multiple_lines.sh rename to linux-bash-modules/text/src/main/bash/append_multiple_lines.sh diff --git a/linux-bash/text/src/main/bash/remove_characters.sh b/linux-bash-modules/text/src/main/bash/remove_characters.sh similarity index 100% rename from linux-bash/text/src/main/bash/remove_characters.sh rename to linux-bash-modules/text/src/main/bash/remove_characters.sh diff --git a/terraform/README.md b/terraform-modules/README.md similarity index 100% rename from terraform/README.md rename to terraform-modules/README.md diff --git a/terraform/best-practices/README.md b/terraform-modules/best-practices/README.md similarity index 100% rename from terraform/best-practices/README.md rename to terraform-modules/best-practices/README.md diff --git a/terraform/best-practices/ec2-simple/.gitignore b/terraform-modules/best-practices/ec2-simple/.gitignore similarity index 100% rename from terraform/best-practices/ec2-simple/.gitignore rename to terraform-modules/best-practices/ec2-simple/.gitignore diff --git a/terraform/best-practices/ec2-simple/SETUP.md b/terraform-modules/best-practices/ec2-simple/SETUP.md similarity index 100% rename from terraform/best-practices/ec2-simple/SETUP.md rename to terraform-modules/best-practices/ec2-simple/SETUP.md diff --git a/terraform/best-practices/ec2-simple/main.tf b/terraform-modules/best-practices/ec2-simple/main.tf similarity index 100% rename from terraform/best-practices/ec2-simple/main.tf rename to terraform-modules/best-practices/ec2-simple/main.tf diff --git a/terraform/best-practices/ec2-simple/providers.tf b/terraform-modules/best-practices/ec2-simple/providers.tf similarity index 100% rename from terraform/best-practices/ec2-simple/providers.tf rename to terraform-modules/best-practices/ec2-simple/providers.tf diff --git a/terraform/best-practices/ec2-simple/variables.tf b/terraform-modules/best-practices/ec2-simple/variables.tf similarity index 100% rename from terraform/best-practices/ec2-simple/variables.tf rename to terraform-modules/best-practices/ec2-simple/variables.tf diff --git a/terraform/best-practices/k8s-basic/.gitignore b/terraform-modules/best-practices/k8s-basic/.gitignore similarity index 100% rename from terraform/best-practices/k8s-basic/.gitignore rename to terraform-modules/best-practices/k8s-basic/.gitignore diff --git a/terraform/best-practices/k8s-basic/SETUP.md b/terraform-modules/best-practices/k8s-basic/SETUP.md similarity index 100% rename from terraform/best-practices/k8s-basic/SETUP.md rename to terraform-modules/best-practices/k8s-basic/SETUP.md diff --git a/terraform/best-practices/k8s-basic/main.tf b/terraform-modules/best-practices/k8s-basic/main.tf similarity index 100% rename from terraform/best-practices/k8s-basic/main.tf rename to terraform-modules/best-practices/k8s-basic/main.tf diff --git a/terraform/best-practices/k8s-basic/providers.tf b/terraform-modules/best-practices/k8s-basic/providers.tf similarity index 100% rename from terraform/best-practices/k8s-basic/providers.tf rename to terraform-modules/best-practices/k8s-basic/providers.tf diff --git a/terraform/best-practices/k8s-basic/variables.tf b/terraform-modules/best-practices/k8s-basic/variables.tf similarity index 100% rename from terraform/best-practices/k8s-basic/variables.tf rename to terraform-modules/best-practices/k8s-basic/variables.tf diff --git a/terraform/best-practices/k8s-modules/.gitignore b/terraform-modules/best-practices/k8s-modules/.gitignore similarity index 100% rename from terraform/best-practices/k8s-modules/.gitignore rename to terraform-modules/best-practices/k8s-modules/.gitignore diff --git a/terraform/best-practices/k8s-modules/SETUP.md b/terraform-modules/best-practices/k8s-modules/SETUP.md similarity index 100% rename from terraform/best-practices/k8s-modules/SETUP.md rename to terraform-modules/best-practices/k8s-modules/SETUP.md diff --git a/terraform/best-practices/k8s-modules/main.tf b/terraform-modules/best-practices/k8s-modules/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/main.tf rename to terraform-modules/best-practices/k8s-modules/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcCustomer/main.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/outputs.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/variables.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcCustomer/variables.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcCustomer/variables.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcFeedback/main.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/outputs.tf diff --git a/terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf b/terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/variables.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/SvcFeedback/variables.tf rename to terraform-modules/best-practices/k8s-modules/modules/SvcFeedback/variables.tf diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf b/terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf rename to terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/main.tf diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf b/terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf rename to terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/outputs.tf diff --git a/terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf b/terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf similarity index 100% rename from terraform/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf rename to terraform-modules/best-practices/k8s-modules/modules/ingress/www.petshop.com.br/variables.tf diff --git a/terraform/best-practices/k8s-modules/provider.tf b/terraform-modules/best-practices/k8s-modules/provider.tf similarity index 100% rename from terraform/best-practices/k8s-modules/provider.tf rename to terraform-modules/best-practices/k8s-modules/provider.tf diff --git a/terraform/hello-terraform/.gitignore b/terraform-modules/hello-terraform/.gitignore similarity index 100% rename from terraform/hello-terraform/.gitignore rename to terraform-modules/hello-terraform/.gitignore diff --git a/terraform/hello-terraform/main.tf b/terraform-modules/hello-terraform/main.tf similarity index 100% rename from terraform/hello-terraform/main.tf rename to terraform-modules/hello-terraform/main.tf From c20e6760b7ced6d041a4d182eebfbc8662f0a57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Musia=C5=82?= Date: Wed, 12 Apr 2023 06:03:46 +0200 Subject: [PATCH 11/39] BAEL-5549: chore: Make the test manual since it requires testcontainers (#13804) * BAEL-5549: chore: Make the test manual since it requires testcontainers * BAEL-5549: doc: add run instructions --- ...=> HibernateKeywordsApplicationManualTest.java} | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) rename persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/{HibernateKeywordsApplicationIntegrationTest.java => HibernateKeywordsApplicationManualTest.java} (78%) diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationManualTest.java similarity index 78% rename from persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java rename to persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationManualTest.java index 4282da3de4..780a0fd77e 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationManualTest.java @@ -3,8 +3,6 @@ package com.baeldung.hibernate.keywords; import static java.util.UUID.randomUUID; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import javax.persistence.PersistenceException; - import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; @@ -13,7 +11,17 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class HibernateKeywordsApplicationIntegrationTest { +import jakarta.persistence.PersistenceException; + +/** + * This test suite uses testcontainers library and therefore + * requires Docker installed on the local system to be able to run it. + * + * When docker is available on the local machine it can be run either by: + * - running it from your favorite IDE + * - or through `mvn test -Dtest=HibernateKeywordsApplicationManualTest` + */ +public class HibernateKeywordsApplicationManualTest { private static SessionFactory sessionFactory; private Session session; From 71b441b21e4882708cd1f669d6e0df426c9992c1 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 12 Apr 2023 09:47:23 +0530 Subject: [PATCH 12/39] JAVA-20220 Renamed test to proper convention --- .../com/baeldung/lambda/todo/{AppTest.java => AppUnitTest.java} | 2 +- ...oDoReaderServiceTest.java => ToDoReaderServiceUnitTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/{AppTest.java => AppUnitTest.java} (98%) rename aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/{ToDoReaderServiceTest.java => ToDoReaderServiceUnitTest.java} (94%) diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java similarity index 98% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java index cbdc8c22cb..952a773f69 100644 --- a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppTest.java +++ b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) -public class AppTest { +public class AppUnitTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mockContext; diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java similarity index 94% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java rename to aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java index 634c5257ff..dd5b52d073 100644 --- a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceTest.java +++ b/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java @@ -7,7 +7,7 @@ import uk.org.webcompere.systemstubs.rules.SystemOutRule; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -public class ToDoReaderServiceTest { +public class ToDoReaderServiceUnitTest { @Rule public SystemOutRule systemOutRule = new SystemOutRule(); From b49cb7f83a3e9ab25cd1d16833e8ba8b725f6fd9 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 12 Apr 2023 09:52:59 +0300 Subject: [PATCH 13/39] [JAVA-19668] Put libraries-6 module to jdk9-and-above-profile (#13809) --- libraries-6/pom.xml | 5 +++++ pom.xml | 9 ++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index 234fa1349e..139edab34f 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -63,6 +63,11 @@ commons-collections4 ${commons-collections4.version} + + com.google.guava + guava + ${guava.version} + commons-net commons-net diff --git a/pom.xml b/pom.xml index 718c2c9321..426921881d 100644 --- a/pom.xml +++ b/pom.xml @@ -488,8 +488,6 @@ jenkins-modules jhipster-modules jws - - libraries-6 @@ -664,8 +662,6 @@ jenkins-modules jhipster-modules jws - - libraries-6 @@ -891,6 +887,7 @@ libraries-2 libraries-4 libraries-5 + libraries-6 libraries-apache-commons libraries-apache-commons-collections @@ -1141,8 +1138,10 @@ ksqldb libraries + libraries-2 libraries-4 libraries-5 + libraries-6 libraries-apache-commons libraries-apache-commons-collections libraries-apache-commons-io @@ -1196,7 +1195,7 @@ xstream webrtc persistence-modules/java-mongodb - libraries-2 + messaging-modules persistence-modules/questdb From ae3429db295d65abe1df26332a058f980cf0c070 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 12 Apr 2023 16:31:55 +0530 Subject: [PATCH 14/39] JAVA-19116 Create new core-java-compiler sub module under core-java-modules (#13658) * JAVA-19116 Create new core-java-compiler sub module under core-java-modules --- .../core-java-compiler/README.md | 6 ++++ core-java-modules/core-java-compiler/pom.xml | 29 +++++++++++++++++++ .../main/java/com/baeldung/javac/Data.java | 0 .../src/main/java/javac-args/arguments | 0 .../src/main/java/javac-args/options | 0 .../src/main/java/javac-args/types | 0 .../src/main/java/javac-args/xlint-ops | 0 .../IllegalCharacterUnitTest.java | 0 .../src/test/resources/bom-file.txt | 0 core-java-modules/core-java/README.md | 3 +- core-java-modules/core-java/pom.xml | 6 ---- core-java-modules/pom.xml | 1 + 12 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 core-java-modules/core-java-compiler/README.md create mode 100644 core-java-modules/core-java-compiler/pom.xml rename core-java-modules/{core-java => core-java-compiler}/src/main/java/com/baeldung/javac/Data.java (100%) rename core-java-modules/{core-java => core-java-compiler}/src/main/java/javac-args/arguments (100%) rename core-java-modules/{core-java => core-java-compiler}/src/main/java/javac-args/options (100%) rename core-java-modules/{core-java => core-java-compiler}/src/main/java/javac-args/types (100%) rename core-java-modules/{core-java => core-java-compiler}/src/main/java/javac-args/xlint-ops (100%) rename core-java-modules/{core-java => core-java-compiler}/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java (100%) rename core-java-modules/{core-java => core-java-compiler}/src/test/resources/bom-file.txt (100%) diff --git a/core-java-modules/core-java-compiler/README.md b/core-java-modules/core-java-compiler/README.md new file mode 100644 index 0000000000..2a1e609194 --- /dev/null +++ b/core-java-modules/core-java-compiler/README.md @@ -0,0 +1,6 @@ +## Core Java Compiler + +### Relevant Articles: + +- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) +- [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) diff --git a/core-java-modules/core-java-compiler/pom.xml b/core-java-modules/core-java-compiler/pom.xml new file mode 100644 index 0000000000..8f2be3f142 --- /dev/null +++ b/core-java-modules/core-java-compiler/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + core-java-compiler + 0.1.0-SNAPSHOT + core-java-compiler + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + com.google.gdata + core + ${gdata.version} + + + + + 1.47.1 + + + \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/javac/Data.java b/core-java-modules/core-java-compiler/src/main/java/com/baeldung/javac/Data.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/javac/Data.java rename to core-java-modules/core-java-compiler/src/main/java/com/baeldung/javac/Data.java diff --git a/core-java-modules/core-java/src/main/java/javac-args/arguments b/core-java-modules/core-java-compiler/src/main/java/javac-args/arguments similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/arguments rename to core-java-modules/core-java-compiler/src/main/java/javac-args/arguments diff --git a/core-java-modules/core-java/src/main/java/javac-args/options b/core-java-modules/core-java-compiler/src/main/java/javac-args/options similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/options rename to core-java-modules/core-java-compiler/src/main/java/javac-args/options diff --git a/core-java-modules/core-java/src/main/java/javac-args/types b/core-java-modules/core-java-compiler/src/main/java/javac-args/types similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/types rename to core-java-modules/core-java-compiler/src/main/java/javac-args/types diff --git a/core-java-modules/core-java/src/main/java/javac-args/xlint-ops b/core-java-modules/core-java-compiler/src/main/java/javac-args/xlint-ops similarity index 100% rename from core-java-modules/core-java/src/main/java/javac-args/xlint-ops rename to core-java-modules/core-java-compiler/src/main/java/javac-args/xlint-ops diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java b/core-java-modules/core-java-compiler/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java rename to core-java-modules/core-java-compiler/src/test/java/com/baeldung/illegalcharacter/IllegalCharacterUnitTest.java diff --git a/core-java-modules/core-java/src/test/resources/bom-file.txt b/core-java-modules/core-java-compiler/src/test/resources/bom-file.txt similarity index 100% rename from core-java-modules/core-java/src/test/resources/bom-file.txt rename to core-java-modules/core-java-compiler/src/test/resources/bom-file.txt diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md index 8858c58b1c..60bd7346c6 100644 --- a/core-java-modules/core-java/README.md +++ b/core-java-modules/core-java/README.md @@ -4,6 +4,5 @@ - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) -- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) + diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml index 9ccfc7cbd8..423487d5da 100644 --- a/core-java-modules/core-java/pom.xml +++ b/core-java-modules/core-java/pom.xml @@ -63,11 +63,6 @@ commons-io ${commons-io.version} - - com.google.gdata - core - ${gdata.version} - @@ -180,7 +175,6 @@ 1.1 4.3.20.RELEASE - 1.47.1 \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 6cf4c7bee0..771da250d6 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -53,6 +53,7 @@ core-java-collections-maps core-java-collections-maps-2 core-java-collections-maps-3 + core-java-compiler core-java-concurrency-2 core-java-concurrency-advanced core-java-concurrency-advanced-2 From cf5d1586227a91d8221c80a1e4d03ab2ec168912 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 12 Apr 2023 17:02:52 +0530 Subject: [PATCH 15/39] JAVA-19115 Create new core-java-properties sub module under core-java-modules (#13669) * JAVA-19115 Create new core-java-properties sub module under core-java-modules --- .../core-java-properties/README.md | 6 +++++ .../core-java-properties/pom.xml | 23 +++++++++++++++++++ .../com/baeldung/util/PropertiesLoader.java | 0 .../java/properties/PropertiesUnitTest.java | 0 .../properties/MergePropertiesUnitTest.java | 0 .../util/PropertiesLoaderUnitTest.java | 0 .../src/test/resources/app.properties | 0 .../src/test/resources/catalog | 0 .../test/resources/configuration.properties | 0 .../src/test/resources/default.properties | 0 .../src/test/resources/icons.xml | 0 core-java-modules/core-java/README.md | 3 --- core-java-modules/pom.xml | 1 + 13 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 core-java-modules/core-java-properties/README.md create mode 100644 core-java-modules/core-java-properties/pom.xml rename core-java-modules/{core-java => core-java-properties}/src/main/java/com/baeldung/util/PropertiesLoader.java (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/resources/app.properties (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/resources/catalog (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/resources/configuration.properties (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/resources/default.properties (100%) rename core-java-modules/{core-java => core-java-properties}/src/test/resources/icons.xml (100%) diff --git a/core-java-modules/core-java-properties/README.md b/core-java-modules/core-java-properties/README.md new file mode 100644 index 0000000000..73991634df --- /dev/null +++ b/core-java-modules/core-java-properties/README.md @@ -0,0 +1,6 @@ +## Core Java Properties + +### Relevant Articles: + +- [Getting Started with Java Properties](http://www.baeldung.com/java-properties) +- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) diff --git a/core-java-modules/core-java-properties/pom.xml b/core-java-modules/core-java-properties/pom.xml new file mode 100644 index 0000000000..9beacabdd5 --- /dev/null +++ b/core-java-modules/core-java-properties/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + core-java-properties + 0.1.0-SNAPSHOT + core-java-properties + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/util/PropertiesLoader.java b/core-java-modules/core-java-properties/src/main/java/com/baeldung/util/PropertiesLoader.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/util/PropertiesLoader.java rename to core-java-modules/core-java-properties/src/main/java/com/baeldung/util/PropertiesLoader.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java b/core-java-modules/core-java-properties/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java rename to core-java-modules/core-java-properties/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java b/core-java-modules/core-java-properties/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java rename to core-java-modules/core-java-properties/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java b/core-java-modules/core-java-properties/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java rename to core-java-modules/core-java-properties/src/test/java/com/baeldung/util/PropertiesLoaderUnitTest.java diff --git a/core-java-modules/core-java/src/test/resources/app.properties b/core-java-modules/core-java-properties/src/test/resources/app.properties similarity index 100% rename from core-java-modules/core-java/src/test/resources/app.properties rename to core-java-modules/core-java-properties/src/test/resources/app.properties diff --git a/core-java-modules/core-java/src/test/resources/catalog b/core-java-modules/core-java-properties/src/test/resources/catalog similarity index 100% rename from core-java-modules/core-java/src/test/resources/catalog rename to core-java-modules/core-java-properties/src/test/resources/catalog diff --git a/core-java-modules/core-java/src/test/resources/configuration.properties b/core-java-modules/core-java-properties/src/test/resources/configuration.properties similarity index 100% rename from core-java-modules/core-java/src/test/resources/configuration.properties rename to core-java-modules/core-java-properties/src/test/resources/configuration.properties diff --git a/core-java-modules/core-java/src/test/resources/default.properties b/core-java-modules/core-java-properties/src/test/resources/default.properties similarity index 100% rename from core-java-modules/core-java/src/test/resources/default.properties rename to core-java-modules/core-java-properties/src/test/resources/default.properties diff --git a/core-java-modules/core-java/src/test/resources/icons.xml b/core-java-modules/core-java-properties/src/test/resources/icons.xml similarity index 100% rename from core-java-modules/core-java/src/test/resources/icons.xml rename to core-java-modules/core-java-properties/src/test/resources/icons.xml diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md index 60bd7346c6..287e510c1e 100644 --- a/core-java-modules/core-java/README.md +++ b/core-java-modules/core-java/README.md @@ -2,7 +2,4 @@ ### Relevant Articles: -- [Getting Started with Java Properties](http://www.baeldung.com/java-properties) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) -- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) - diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 771da250d6..fc7597e85a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -121,6 +121,7 @@ core-java-numbers-6 core-java-optional core-java-perf + core-java-properties core-java-reflection core-java-reflection-2 core-java-security-2 From 0057422fffb1d88cfb5aa3e7e882516df20b1c06 Mon Sep 17 00:00:00 2001 From: ukhan1980 <82222767+ukhan1980@users.noreply.github.com> Date: Wed, 12 Apr 2023 15:52:38 +0100 Subject: [PATCH 16/39] [BAEL-6259] add code for cancel ongoing flux (#13795) * [BAEL-6259] add code for cancel ongoing flux * [BAEL-6259] refactor class name * [BAEL-6259] fix failing test due to mocks --------- Co-authored-by: uzma --- .../cancelflux/CancelFluxUnitTest.java | 123 ++++++++++++++++++ .../DataBufferToInputStreamUnitTest.java | 5 +- 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/cancelflux/CancelFluxUnitTest.java diff --git a/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/cancelflux/CancelFluxUnitTest.java b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/cancelflux/CancelFluxUnitTest.java new file mode 100644 index 0000000000..609dbfcf73 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/cancelflux/CancelFluxUnitTest.java @@ -0,0 +1,123 @@ +package com.baeldung.cancelflux; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; + +import java.io.PrintStream; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; + +import reactor.core.Disposable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.SignalType; +import reactor.test.StepVerifier; + +public class CancelFluxUnitTest { + + @Test + void givenOngoingFlux_whentakeUntil_thenFluxCancels() { + Flux sensorData = Flux.range(1, 10); + List result = new ArrayList<>(); + + sensorData.takeUntil(reading -> reading == 8) + .subscribe(result::add); + assertThat(result).containsExactly(1, 2, 3, 4, 5, 6, 7, 8); + } + + @Test + void givenOngoingFlux_whentakeWhile_thenFluxCancels() { + List result = new ArrayList<>(); + Flux sensorData = Flux.range(1, 10) + .takeWhile(reading -> reading < 8) + .doOnNext(result::add); + + sensorData.subscribe(); + assertThat(result).containsExactly(1, 2, 3, 4, 5, 6, 7); + } + + @Test + void givenOngoingFlux_whentake_thenFluxCancels() { + Flux sensorData = Flux.range(1, Integer.MAX_VALUE); + List result = new ArrayList<>(); + + sensorData.take(2) + .subscribe(result::add); + assertThat(result).containsExactly(1, 2); + } + + @Test + void givenAnOnGoingFlux_whenTakeDurationElapsed_thenCancelsFlux() { + Flux sensorData = Flux.interval(Duration.ZERO, Duration.ofSeconds(2)) + .map(i -> i.intValue() + 10) + .take(5); + + Flux canceledByTimeout = sensorData.take(Duration.ofSeconds(3)); + + StepVerifier.create(canceledByTimeout) + .expectNext(10, 11) + .expectComplete() + .verify(); + } + + @Test + void givenAnOnGoingFlux_whenDispose_thenCancelsFluxExplicitly() throws InterruptedException { + Flux flux = Flux.range(1, 10) + .delayElements(Duration.ofSeconds(1)); + + AtomicInteger count = new AtomicInteger(0); + Disposable disposable = flux.subscribe(i -> { + System.out.println("Received: " + i); + count.incrementAndGet(); + }, e -> System.err.println("Error: " + e.getMessage())); + + Thread.sleep(5000); + System.out.println("Will Dispose The flux Next"); + disposable.dispose(); + if (disposable.isDisposed()) { + System.out.println("Flux Disposed"); + } + assertEquals(4, count.get()); + } + + @Test + void givenAFluxIsCanceled_whenDoOnCancelAndDoFinally_thenMessagePrinted() throws InterruptedException { + + List result = new ArrayList<>(); + PrintStream mockPrintStream = mock(PrintStream.class); + System.setOut(mockPrintStream); + + Flux sensorData = Flux.interval(Duration.ofMillis(100)) + .doOnCancel(() -> System.out.println("Flux Canceled")) + .doFinally(signalType -> { + if (signalType == SignalType.CANCEL) { + System.out.println("Flux Completed due to Cancellation"); + } else { + System.out.println("Flux Completed due to Completion or Error"); + } + }) + .map(i -> ThreadLocalRandom.current() + .nextInt(1, 1001)) + .doOnNext(result::add); + + Disposable subscription = sensorData.subscribe(); + + Thread.sleep(1000); + subscription.dispose(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); + Mockito.verify(mockPrintStream, times(2)) + .println(captor.capture()); + + assertThat(captor.getAllValues()).contains("Flux Canceled", "Flux Completed due to Cancellation"); + } + +} diff --git a/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java index f30b4a8a3b..975a2d8698 100644 --- a/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java +++ b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java @@ -17,9 +17,12 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URI; import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class DataBufferToInputStreamUnitTest { private String getResponseStub() throws IOException { @@ -67,7 +70,7 @@ class DataBufferToInputStreamUnitTest { @Test public void testResponseAsInputStream() throws IOException, InterruptedException { - String mockUrl = Mockito.anyString(); + String mockUrl = "http://mockurl.com"; WebClient mockWebClient = getMockWebClient(); InputStream inputStream = DataBufferToInputStream.getResponseAsInputStream(mockWebClient, mockUrl); byte[] expectedBytes = IOUtils.toByteArray(getResponseStubAsInputStream()); From 88a97dc6c2d3b03a9f7809e2a7496ed6ee54b7e8 Mon Sep 17 00:00:00 2001 From: kpentaris Date: Wed, 12 Apr 2023 20:30:33 +0300 Subject: [PATCH 17/39] Highcpu (#13821) * Add application file for BAEL-4496 * Move BAEL-4496 code from core-java-19 to core-java-perf-2 --- core-java-modules/core-java-perf-2/README.md | 1 + core-java-modules/core-java-perf-2/pom.xml | 16 +++++++++++++++ .../com/baeldung/highcpu/Application.java | 20 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 core-java-modules/core-java-perf-2/README.md create mode 100644 core-java-modules/core-java-perf-2/pom.xml create mode 100644 core-java-modules/core-java-perf-2/src/main/java/com/baeldung/highcpu/Application.java diff --git a/core-java-modules/core-java-perf-2/README.md b/core-java-modules/core-java-perf-2/README.md new file mode 100644 index 0000000000..5616cce48b --- /dev/null +++ b/core-java-modules/core-java-perf-2/README.md @@ -0,0 +1 @@ +## Relevant Articles diff --git a/core-java-modules/core-java-perf-2/pom.xml b/core-java-modules/core-java-perf-2/pom.xml new file mode 100644 index 0000000000..a9408ca385 --- /dev/null +++ b/core-java-modules/core-java-perf-2/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + core-java-perf-2 + core-java-perf-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + \ No newline at end of file diff --git a/core-java-modules/core-java-perf-2/src/main/java/com/baeldung/highcpu/Application.java b/core-java-modules/core-java-perf-2/src/main/java/com/baeldung/highcpu/Application.java new file mode 100644 index 0000000000..82162406b3 --- /dev/null +++ b/core-java-modules/core-java-perf-2/src/main/java/com/baeldung/highcpu/Application.java @@ -0,0 +1,20 @@ +package com.baeldung.highcpu; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.IntUnaryOperator; +import java.util.stream.IntStream; + +public class Application { + + static List generateList() { + return IntStream.range(0, 10000000).parallel().map(IntUnaryOperator.identity()).collect(LinkedList::new, List::add, List::addAll); + } + + public static void main(String[] args) { + List list = generateList(); + long start = System.nanoTime(); + int value = list.get(9500000); + System.out.printf("Found value %d in %d nanos\n", value, (System.nanoTime() - start)); + } +} From 3aaf85dccaab035b9ef5b925ea1541a9cd0b70bf Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 13 Apr 2023 02:35:29 +0200 Subject: [PATCH 18/39] [improve-jackson-annotation] BAEL-6308 JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES (#13807) --- .../com/baeldung/jackson/format/User.java | 81 ++++++++++++++++--- .../jackson/format/JsonFormatUnitTest.java | 41 +++++++--- 2 files changed, 102 insertions(+), 20 deletions(-) diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java index e655deb93b..119c1e3ce3 100644 --- a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/format/User.java @@ -1,26 +1,41 @@ package com.baeldung.jackson.format; +import com.fasterxml.jackson.annotation.JsonFormat; + import java.util.Date; -import com.baeldung.jackson.domain.Person; -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * @author Jay Sridhar - * @version 1.0 - */ -public class User extends Person { +public class User { private String firstName; private String lastName; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ") private Date createdDate; + public User() { + } + public User(String firstName, String lastName) { - super(firstName, lastName); + this.firstName = firstName; + this.lastName = lastName; this.createdDate = new Date(); } + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + public Date getCreatedDate() { return createdDate; } @@ -35,3 +50,51 @@ public class User extends Person { return new Date(); } } + +@JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES) +class UserIgnoreCase { + private String firstName; + private String lastName; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ") + private Date createdDate; + + public UserIgnoreCase() { + } + + public UserIgnoreCase(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + this.createdDate = new Date(); + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Date getCreatedDate() { + return createdDate; + } + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ", locale = "en_GB") + public Date getCurrentDate() { + return new Date(); + } + + @JsonFormat(shape = JsonFormat.Shape.NUMBER) + public Date getDateNum() { + return new Date(); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java index cf166fdc36..5cdc248d3b 100644 --- a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/format/JsonFormatUnitTest.java @@ -1,24 +1,25 @@ package com.baeldung.jackson.format; -import java.util.Date; - import com.fasterxml.jackson.core.JsonProcessingException; - import com.fasterxml.jackson.databind.ObjectMapper; - +import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; import org.junit.Test; -import static io.restassured.path.json.JsonPath.from; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import static io.restassured.path.json.JsonPath.from; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.from; import static org.assertj.core.data.Percentage.withPercentage; -/** - * @author Jay Sridhar - * @version 1.0 - */ public class JsonFormatUnitTest { + private static final String JSON_STRING = "{\"FIRSTNAME\":\"John\",\"lastname\":\"Smith\",\"cReAtEdDaTe\":\"2016-12-18@07:53:34.740+0000\"}"; + @Test public void whenSerializedDateFormat_thenCorrect() throws JsonProcessingException { @@ -32,6 +33,24 @@ public class JsonFormatUnitTest { // Expected to be close to current time long now = new Date().getTime(); assertThat(from(result).getLong("dateNum")).isCloseTo(now, withPercentage(10.0)); - } -} + + @Test + public void whenDeserializeJsonStrToUserObject_thenFail() { + assertThatThrownBy(() -> new ObjectMapper().readValue(JSON_STRING, User.class)).isInstanceOf(UnrecognizedPropertyException.class); + } + + @Test + public void whenDeserializeJsonStrToUserIgnoreCaseObject_thenSuccess() throws JsonProcessingException, ParseException { + UserIgnoreCase result = new ObjectMapper().readValue(JSON_STRING, UserIgnoreCase.class); + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSzz"); + Date expectedDate = fmt.parse("2016-12-18T07:53:34.740+0000"); + + assertThat(result) + .isNotNull() + .returns("John", from(UserIgnoreCase::getFirstName)) + .returns("Smith", from(UserIgnoreCase::getLastName)) + .returns(expectedDate, from(UserIgnoreCase::getCreatedDate)); + } + +} \ No newline at end of file From 725deaa8d58accfe711d5f9fe107b5b8aa18cd69 Mon Sep 17 00:00:00 2001 From: AndiCover <33127132+AndiCover@users.noreply.github.com> Date: Thu, 13 Apr 2023 02:39:41 +0200 Subject: [PATCH 19/39] BAEL-6117 Explicit Wait vs Implicit Wait in Selenium Webdriver (#13799) --- .../selenium/wait/ExplicitWaitLiveTest.java | 79 ++++++++++++++++++ .../selenium/wait/FluentWaitLiveTest.java | 83 +++++++++++++++++++ .../selenium/wait/ImplicitWaitLiveTest.java | 63 ++++++++++++++ 3 files changed, 225 insertions(+) create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ExplicitWaitLiveTest.java create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/FluentWaitLiveTest.java create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ImplicitWaitLiveTest.java diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ExplicitWaitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ExplicitWaitLiveTest.java new file mode 100644 index 0000000000..65943fbf5e --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ExplicitWaitLiveTest.java @@ -0,0 +1,79 @@ +package com.baeldung.selenium.wait; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.ElementNotInteractableException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +final class ExplicitWaitLiveTest { + + private static WebDriver driver; + private static WebDriverWait wait; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_ABOUT = By.xpath("//a[starts-with(., 'About')]"); + private static final By LOCATOR_ABOUT_BAELDUNG = By.xpath("//h3[normalize-space()='About Baeldung']"); + private static final By LOCATOR_ABOUT_HEADER = By.xpath("//h1"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + wait = new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT)); + } + + @Test + void givenPage_whenNavigatingWithoutExplicitWait_thenElementNotInteractable() { + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + + assertThrows(ElementNotInteractableException.class, () -> driver.findElement(LOCATOR_ABOUT_BAELDUNG).click()); + } + + @Test + void givenPage_whenNavigatingWithExplicitWait_thenOK() { + final String expected = "About Baeldung"; + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_BAELDUNG)); + + driver.findElement(LOCATOR_ABOUT_BAELDUNG).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_HEADER)); + + final String actual = driver.findElement(LOCATOR_ABOUT_HEADER).getText(); + assertEquals(expected, actual); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/FluentWaitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/FluentWaitLiveTest.java new file mode 100644 index 0000000000..c41e5619ac --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/FluentWaitLiveTest.java @@ -0,0 +1,83 @@ +package com.baeldung.selenium.wait; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.ElementNotInteractableException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.FluentWait; +import org.openqa.selenium.support.ui.Wait; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +final class FluentWaitLiveTest { + + private static WebDriver driver; + private static Wait wait; + private static final int TIMEOUT = 10; + private static final int POLL_FREQUENCY = 250; + + private static final By LOCATOR_ABOUT = By.xpath("//a[starts-with(., 'About')]"); + private static final By LOCATOR_ABOUT_BAELDUNG = By.xpath("//h3[normalize-space()='About Baeldung']"); + private static final By LOCATOR_ABOUT_HEADER = By.xpath("//h1"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + wait = new FluentWait<>(driver) + .withTimeout(Duration.ofSeconds(TIMEOUT)) + .pollingEvery(Duration.ofMillis(POLL_FREQUENCY)); + } + + @Test + void givenPage_whenNavigatingWithoutFluentWait_thenElementNotInteractable() { + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + + assertThrows(ElementNotInteractableException.class, () -> driver.findElement(LOCATOR_ABOUT_BAELDUNG).click()); + } + + @Test + void givenPage_whenNavigatingWithFluentWait_thenOK() { + final String expected = "About Baeldung"; + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_BAELDUNG)); + + driver.findElement(LOCATOR_ABOUT_BAELDUNG).click(); + wait.until(ExpectedConditions.visibilityOfElementLocated(LOCATOR_ABOUT_HEADER)); + + final String actual = driver.findElement(LOCATOR_ABOUT_HEADER).getText(); + assertEquals(expected, actual); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ImplicitWaitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ImplicitWaitLiveTest.java new file mode 100644 index 0000000000..86c401e13a --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/wait/ImplicitWaitLiveTest.java @@ -0,0 +1,63 @@ +package com.baeldung.selenium.wait; + + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +final class ImplicitWaitLiveTest { + + private static WebDriver driver; + private static final int TIMEOUT = 10; + + private static final By LOCATOR_ABOUT = By.xpath("//a[starts-with(., 'About')]"); + private static final By LOCATOR_ABOUT_BAELDUNG = By.xpath("//h3[normalize-space()='About Baeldung']"); + private static final By LOCATOR_ABOUT_HEADER = By.xpath("//h1"); + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + final ChromeOptions options = new ChromeOptions(); + options.addArguments("--remote-allow-origins=*"); + driver = new ChromeDriver(options); + options(); + } + + private static void options() { + driver.manage().window().maximize(); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(TIMEOUT)); + } + + @BeforeEach + public void init() { + setupChromeDriver(); + } + + @Test + void givenPage_whenNavigatingWithImplicitWait_ThenOK() { + final String expected = "About Baeldung"; + driver.navigate().to("https://www.baeldung.com/"); + + driver.findElement(LOCATOR_ABOUT).click(); + driver.findElement(LOCATOR_ABOUT_BAELDUNG).click(); + + final String actual = driver.findElement(LOCATOR_ABOUT_HEADER).getText(); + assertEquals(expected, actual); + } + + @AfterEach + void teardown() { + if (driver != null) { + driver.quit(); + driver = null; + } + } +} \ No newline at end of file From 1787041bd8f269da448bbbe015bee10d1da2011d Mon Sep 17 00:00:00 2001 From: Alejamdro Date: Thu, 13 Apr 2023 00:01:45 -0300 Subject: [PATCH 20/39] BAEL-6078 - Convert an Integer Value into 2-Digit Hex Value in Java (#13682) --- .../core-java-numbers-6/README.md | 2 + core-java-modules/core-java-numbers-6/pom.xml | 18 +++++ .../baeldung/integertohex/IntegerToHex.java | 16 ++++ .../integertohex/IntegerToHexUnitTest.java | 75 +++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 core-java-modules/core-java-numbers-6/src/main/java/com/baeldung/integertohex/IntegerToHex.java create mode 100644 core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/integertohex/IntegerToHexUnitTest.java diff --git a/core-java-modules/core-java-numbers-6/README.md b/core-java-modules/core-java-numbers-6/README.md index 2c0b0554c4..4856d86052 100644 --- a/core-java-modules/core-java-numbers-6/README.md +++ b/core-java-modules/core-java-numbers-6/README.md @@ -1,2 +1,4 @@ ### Relevant Articles: - [Java Program to Calculate Pi](https://www.baeldung.com/java-monte-carlo-compute-pi) + +- More articles: [[<-- prev]](../core-java-numbers-5) \ No newline at end of file diff --git a/core-java-modules/core-java-numbers-6/pom.xml b/core-java-modules/core-java-numbers-6/pom.xml index 0f78f41b9f..531f1293d1 100644 --- a/core-java-modules/core-java-numbers-6/pom.xml +++ b/core-java-modules/core-java-numbers-6/pom.xml @@ -12,6 +12,21 @@ 0.0.1-SNAPSHOT + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + commons-codec + commons-codec + ${commons-codec} + test + + + core-java-numbers-6 @@ -22,4 +37,7 @@ + + 1.15 + \ No newline at end of file diff --git a/core-java-modules/core-java-numbers-6/src/main/java/com/baeldung/integertohex/IntegerToHex.java b/core-java-modules/core-java-numbers-6/src/main/java/com/baeldung/integertohex/IntegerToHex.java new file mode 100644 index 0000000000..9f75b9a145 --- /dev/null +++ b/core-java-modules/core-java-numbers-6/src/main/java/com/baeldung/integertohex/IntegerToHex.java @@ -0,0 +1,16 @@ +package com.baeldung.integertohex; + +class IntegerToHex { + static final String digits = "0123456789ABCDEF"; + static String integerToHex(int input) { + if (input <= 0) + return "0"; + StringBuilder hex = new StringBuilder(); + while (input > 0) { + int digit = input % 16; + hex.insert(0, digits.charAt(digit)); + input = input / 16; + } + return hex.toString(); + } +} diff --git a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/integertohex/IntegerToHexUnitTest.java b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/integertohex/IntegerToHexUnitTest.java new file mode 100644 index 0000000000..6073c2d347 --- /dev/null +++ b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/integertohex/IntegerToHexUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.integertohex; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.apache.commons.codec.binary.Hex; +import org.junit.jupiter.api.Test; + +class IntegerToHexUnitTest { + + @Test + void givenIntegerValue_whenUseRawMethod_thenWillGetHexValue() { + String result = IntegerToHex.integerToHex(1055); + assertEquals("41F", result); + } + + @Test + void givenIntegerNegativeValue_whenUseRawMethod_thenZeroValue() { + String result = IntegerToHex.integerToHex(-1055); + assertEquals("0", result); + } + + @Test + void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValue() { + String result = String.format("%02x", 255); + assertEquals("ff", result); + } + + @Test + void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValueWithLeftZeros() { + String result = String.format("%04x", 255); + assertEquals("00ff", result); + } + + @Test + void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValueWithLeftZerosAndUpperLetter() { + String result = String.format("%04X", 255); + assertEquals("00FF", result); + } + + @Test + void givenIntegerValue_whenUseIntegerToHexString_thenWillGetHexValue() { + String result = Integer.toHexString(1000); + assertEquals("3e8", result); + } + + @Test + void givenIntegerValue_whenUseLongToHexString_thenWillGetHexValue() { + String result = Long.toHexString(255L); + assertEquals("ff", result); + } + + @Test + public void givenNegativeIntegerValue_whenUseIntegerToString_thenWillGetHexValue() { + String result = Integer.toString(-1458, 16); + assertEquals("-5b2", result); + } + + @Test + public void givenIntegerValue_whenUseIntegerToString_thenWillGetHexValue() { + String result = Integer.toString(1458, 16); + assertEquals("5b2", result); + } + + @Test + public void givenLongValue_whenUseLongToString_thenWillGetHexValue() { + String result = Long.toString(158, 16); + assertEquals("9e", result); + } + + @Test + public void givenIntegerValue_whenUseApacheCommons_thenWillGetHexSignedValue() { + String result = Hex.encodeHexString(new byte[] { (byte) 254 }); + assertEquals("fe", result); + } +} \ No newline at end of file From 95f844ffa477a359da527fc7b6880e721c496211 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 13 Apr 2023 08:32:26 +0530 Subject: [PATCH 21/39] Revert "JAVA-19475: Changes made for uncommenting feign module in the root pom.xml (#13823)" (#13831) This reverts commit 30674d218602df2e01fc6d7204cceaae1c82e297. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 426921881d..0800f22937 100644 --- a/pom.xml +++ b/pom.xml @@ -860,7 +860,7 @@ disruptor dozer dubbo - feign + google-cloud graphql-modules grpc @@ -1113,7 +1113,7 @@ dozer dubbo - feign + google-cloud graphql-modules grpc From d964c3d1eb9bcaac283b436c1b6e926d1f7499d1 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:11:17 +0200 Subject: [PATCH 22/39] A Guide to @JsonIncludeProperties Annotation in Jackson (#13808) --- .../jackson/annotation/BeanWithInclude.java | 18 ++++++++++++++++++ .../annotation/JacksonAnnotationUnitTest.java | 9 +++++++++ 2 files changed, 27 insertions(+) create mode 100644 jackson-simple/src/main/java/com/baeldung/jackson/annotation/BeanWithInclude.java diff --git a/jackson-simple/src/main/java/com/baeldung/jackson/annotation/BeanWithInclude.java b/jackson-simple/src/main/java/com/baeldung/jackson/annotation/BeanWithInclude.java new file mode 100644 index 0000000000..18130fc9f2 --- /dev/null +++ b/jackson-simple/src/main/java/com/baeldung/jackson/annotation/BeanWithInclude.java @@ -0,0 +1,18 @@ +package com.baeldung.jackson.annotation; + +import com.fasterxml.jackson.annotation.JsonIncludeProperties; + +@JsonIncludeProperties({ "name" }) +public class BeanWithInclude { + public int id; + public String name; + + public BeanWithInclude() { + + } + + public BeanWithInclude(final int id, final String name) { + this.id = id; + this.name = name; + } +} diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java index 57ef231825..1a6c7b1286 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/annotation/JacksonAnnotationUnitTest.java @@ -213,6 +213,15 @@ public class JacksonAnnotationUnitTest { assertThat(result, not(containsString("id"))); } + @Test + public void whenSerializingUsingJsonIncludeProperties_thenCorrect() throws JsonProcessingException { + final BeanWithInclude bean = new BeanWithInclude(1, "My bean"); + final String result = new ObjectMapper().writeValueAsString(bean); + assertThat(result, containsString("My bean")); + assertThat(result, not(containsString("id"))); + assertThat(result, containsString("name")); + } + @Test public void whenSerializingUsingJsonIgnore_thenCorrect() throws JsonProcessingException { final BeanWithIgnore bean = new BeanWithIgnore(1, "My bean"); From fae3e801863e69f94fe56cd37a7c8ba45f7b15cd Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 13 Apr 2023 16:18:11 +0300 Subject: [PATCH 23/39] =?UTF-8?q?JAVA-18600=20Update=20"Guide=20to=20@Conf?= =?UTF-8?q?igurationProperties=20in=20Spring=20Boot"=20=E2=80=A6=20(#13670?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JAVA-18600 Update "Guide to @ConfigurationProperties in Spring Boot" article --------- Co-authored-by: timis1 --- spring-boot-modules/pom.xml | 8 +-- .../spring-boot-properties-2/pom.xml | 16 ++++-- .../baeldung/properties/value/ValuesApp.java | 3 +- .../value/defaults/ValuesWithDefaultsApp.java | 9 ++-- .../spring-boot-properties-3/pom.xml | 12 +++-- .../log/EnvironmentPropertiesPrinter.java | 2 +- .../pom.xml | 12 ++--- .../spring-boot-properties/pom.xml | 9 ++-- .../ConfigProperties.java | 8 +-- .../ImmutableCredentials.java | 2 - .../BuildInfoServiceIntegrationTest.java | 3 -- .../BuildPropertiesUnitTest.java | 2 +- .../reloading/PropertiesReloadManualTest.java | 49 +++++++++---------- 13 files changed, 73 insertions(+), 62 deletions(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 83b935f845..1de19fc867 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -63,10 +63,6 @@ spring-boot-nashorn spring-boot-parent spring-boot-performance - spring-boot-properties - spring-boot-properties-2 - spring-boot-properties-3 - spring-boot-properties-migrator-demo spring-boot-property-exp spring-boot-request-params spring-boot-runtime @@ -94,6 +90,10 @@ spring-boot-3-observation spring-boot-3-test-pitfalls spring-boot-resilience4j + spring-boot-properties + spring-boot-properties-2 + spring-boot-properties-3 + spring-boot-properties-migrator-demo diff --git a/spring-boot-modules/spring-boot-properties-2/pom.xml b/spring-boot-modules/spring-boot-properties-2/pom.xml index 442cb24c7a..4b1daca34d 100644 --- a/spring-boot-modules/spring-boot-properties-2/pom.xml +++ b/spring-boot-modules/spring-boot-properties-2/pom.xml @@ -10,9 +10,10 @@ Spring Boot Properties Module - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -24,6 +25,15 @@ org.springframework.boot spring-boot-starter-web + + commons-lang + commons-lang + 2.6 + + + com.baeldung.properties.yaml.YamlApplication + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java index 67547199a6..282ce4658e 100644 --- a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java +++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/ValuesApp.java @@ -7,11 +7,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; -import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; import java.util.Map; +import jakarta.annotation.PostConstruct; + @Configuration @PropertySource(name = "myProperties", value = "values.properties") public class ValuesApp { diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java index 2a2b535be7..f1720d2fb3 100644 --- a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java +++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/defaults/ValuesWithDefaultsApp.java @@ -1,6 +1,6 @@ package com.baeldung.properties.value.defaults; -import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang.ArrayUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -8,10 +8,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.util.Assert; -import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; +import jakarta.annotation.PostConstruct; + /** * Demonstrates setting defaults for @Value annotation. Note that there are no properties * defined in the specified property source. We also assume that the user here @@ -60,10 +61,10 @@ public class ValuesWithDefaultsApp { // arrays List stringListValues = Arrays.asList("one", "two", "three"); - Assert.isTrue(Arrays.asList(stringArrayWithDefaults).containsAll(stringListValues), "unexpected value for stringArrayWithDefaults"); + Assert.isTrue(Arrays.asList(stringArrayWithDefaults).containsAll(stringListValues), "unexpected value for stringArrayWithDefaults"); List intListValues = Arrays.asList(1, 2, 3); - Assert.isTrue(Arrays.asList(ArrayUtils.toObject(intArrayWithDefaults)).containsAll(intListValues), "unexpected value for intArrayWithDefaults"); + Assert.isTrue(Arrays.asList(ArrayUtils.toObject(intArrayWithDefaults)).containsAll(intListValues), "unexpected value for intArrayWithDefaults"); // SpEL Assert.isTrue(spelWithDefaultValue.equals("my default system property value"), "unexpected value for spelWithDefaultValue"); diff --git a/spring-boot-modules/spring-boot-properties-3/pom.xml b/spring-boot-modules/spring-boot-properties-3/pom.xml index 3de85c7175..ed6e08add0 100644 --- a/spring-boot-modules/spring-boot-properties-3/pom.xml +++ b/spring-boot-modules/spring-boot-properties-3/pom.xml @@ -9,9 +9,10 @@ Spring Boot Properties Module - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -31,7 +32,6 @@ org.springframework.boot spring-boot-starter-web - RELEASE @@ -44,4 +44,8 @@ + + com.baeldung.boot.properties.DemoApplication + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java index 321593b31b..26f6867296 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java @@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; @Component public class EnvironmentPropertiesPrinter { diff --git a/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml index 95dc06b155..21ed0f59f4 100644 --- a/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml +++ b/spring-boot-modules/spring-boot-properties-migrator-demo/pom.xml @@ -7,10 +7,10 @@ 1.0-SNAPSHOT - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT - ../pom.xml + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -49,8 +49,8 @@ - 8 - 8 + 17 + 17 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties/pom.xml b/spring-boot-modules/spring-boot-properties/pom.xml index 0d076581b7..4ad5aeed1d 100644 --- a/spring-boot-modules/spring-boot-properties/pom.xml +++ b/spring-boot-modules/spring-boot-properties/pom.xml @@ -10,9 +10,10 @@ Spring Boot Properties Module - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -141,7 +142,7 @@ - 2021.0.3 + 2022.0.1 1.10 @ diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java index 47df784885..faf5678398 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java @@ -3,10 +3,10 @@ package com.baeldung.configurationproperties; import java.util.List; import java.util.Map; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java index a58e4143e5..72c45afbb2 100644 --- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ImmutableCredentials.java @@ -1,10 +1,8 @@ package com.baeldung.configurationproperties; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.ConstructorBinding; @ConfigurationProperties(prefix = "mail.credentials") -@ConstructorBinding public class ImmutableCredentials { private final String authMethod; diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java index 2cb27e1844..9ed27f412c 100644 --- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java @@ -4,12 +4,9 @@ import static org.junit.Assert.assertThat; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) class BuildInfoServiceIntegrationTest { diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildPropertiesUnitTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildPropertiesUnitTest.java index cf9b9336e6..bb8ec78cc1 100644 --- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildPropertiesUnitTest.java +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildPropertiesUnitTest.java @@ -17,7 +17,7 @@ public class BuildPropertiesUnitTest { @Test void givenBuildPropertiesBean_WhenFetchDefaultBuildProperties_ThenGetValidValues() { Assertions.assertEquals("spring-boot-properties", buildProperties.getArtifact()); - Assertions.assertEquals("com.baeldung.spring-boot-modules", buildProperties.getGroup()); + Assertions.assertEquals("com.baeldung", buildProperties.getGroup()); Assertions.assertEquals("0.0.1-SNAPSHOT", buildProperties.getVersion()); } diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java index 88e22af4ba..ecb547a0a0 100644 --- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/reloading/PropertiesReloadManualTest.java @@ -1,28 +1,27 @@ package com.baeldung.properties.reloading; +import static org.junit.jupiter.api.Assertions.assertEquals; + import com.baeldung.properties.reloading.beans.ConfigurationPropertiesRefreshConfigBean; import com.baeldung.properties.reloading.beans.EnvironmentConfigBean; import com.baeldung.properties.reloading.beans.PropertiesConfigBean; import com.baeldung.properties.reloading.beans.ValueRefreshConfigBean; import java.io.FileOutputStream; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = SpringBootPropertiesTestApplication.class) public class PropertiesReloadManualTest { @@ -50,7 +49,7 @@ public class PropertiesReloadManualTest { ValueRefreshConfigBean singletonValueRefreshConfigBean; - @Before + @BeforeEach public void setUp() throws Exception { mvc = MockMvcBuilders .webAppContextSetup(webApplicationContext) @@ -61,7 +60,7 @@ public class PropertiesReloadManualTest { callRefresh(); } - @After + @AfterEach public void tearDown() throws Exception { createConfig("extra.properties", "application.theme.color", "blue"); createConfig("extra2.properties", "application.theme.background", "red"); @@ -69,76 +68,76 @@ public class PropertiesReloadManualTest { @Test public void givenEnvironmentReader_whenColorChanged_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", environmentConfigBean.getColor()); + assertEquals("blue", environmentConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("red", environmentConfigBean.getColor()); + assertEquals("red", environmentConfigBean.getColor()); } @Test public void givenEnvironmentReader_whenBackgroundChanged_thenExpectChangeValue() throws Exception { - Assert.assertEquals("red", environmentConfigBean.getBackgroundColor()); + assertEquals("red", environmentConfigBean.getBackgroundColor()); createConfig("extra2.properties", "application.theme.background", "blue"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", environmentConfigBean.getBackgroundColor()); + assertEquals("blue", environmentConfigBean.getBackgroundColor()); } @Test public void givenPropertiesReader_whenColorChanged_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", propertiesConfigBean.getColor()); + assertEquals("blue", propertiesConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("red", propertiesConfigBean.getColor()); + assertEquals("red", propertiesConfigBean.getColor()); } @Test public void givenRefreshScopedValueReader_whenColorChangedAndRefreshCalled_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", valueRefreshConfigBean.getColor()); + assertEquals("blue", valueRefreshConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", valueRefreshConfigBean.getColor()); + assertEquals("blue", valueRefreshConfigBean.getColor()); callRefresh(); - Assert.assertEquals("red", valueRefreshConfigBean.getColor()); + assertEquals("red", valueRefreshConfigBean.getColor()); } @Test public void givenSingletonRefreshScopedValueReader_whenColorChangedAndRefreshCalled_thenExpectOldValue() throws Exception { - Assert.assertEquals("blue", singletonValueRefreshConfigBean.getColor()); + assertEquals("blue", singletonValueRefreshConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", singletonValueRefreshConfigBean.getColor()); + assertEquals("blue", singletonValueRefreshConfigBean.getColor()); callRefresh(); - Assert.assertEquals("blue", singletonValueRefreshConfigBean.getColor()); + assertEquals("blue", singletonValueRefreshConfigBean.getColor()); } @Test public void givenRefreshScopedConfigurationPropertiesReader_whenColorChangedAndRefreshCalled_thenExpectChangeValue() throws Exception { - Assert.assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); + assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); createConfig("extra.properties", "application.theme.color", "red"); Thread.sleep(refreshDelay); - Assert.assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); + assertEquals("blue", configurationPropertiesRefreshConfigBean.getColor()); callRefresh(); - Assert.assertEquals("red", configurationPropertiesRefreshConfigBean.getColor()); + assertEquals("red", configurationPropertiesRefreshConfigBean.getColor()); } public void callRefresh() throws Exception { @@ -148,7 +147,7 @@ public class PropertiesReloadManualTest { .accept(MediaType.APPLICATION_JSON_VALUE)) .andReturn(); MockHttpServletResponse response = mvcResult.getResponse(); - Assert.assertEquals(response.getStatus(), 200); + assertEquals(200, response.getStatus()); } public void createConfig(String file, String key, String value) throws Exception { From c255eb13c1fd3502bf70325506d17dd7b1117fd7 Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Thu, 13 Apr 2023 16:51:31 +0200 Subject: [PATCH 24/39] BAEL-4174: Java Modularity and Unit Testing (#13805) * feat: Added two main modules * feat: Renamed test module * feat: Added scripts for compiling library modules * feat: Added scripts for running core module * feat: Added scripts for running test module * fix: Fixed module name * fix: Removed unnecessary module imports * feat: Added script for running tests with patch * fix: Remove unnecessary module path imports * feat: Script for simple classpath tests * fix: Updated output directory * fix: Updated output directory for test compilation * fix: Replace maven repository with local lib folder * feat: Add lib folder * feat: Update the scripts * fix: Remove pom from test module * fix: Update core pom dependencies * fix: Remove test module from a parent pom * fix: Removed jars and added a script * fix: Fix a script * fix: Fix pom conflict --- .../compile-library-core-module.sh | 2 + .../compile-library-core-tests.sh | 10 ++++ .../compile-library-core-with-tests.sh | 13 +++++ .../compile-library-core.sh | 12 ++++ .../compile-library-test-module.sh | 2 + .../download-junit-dependencies.sh | 10 ++++ .../core-java-9-jigsaw/library-core/pom.xml | 55 +++++++++++++++++++ .../java/com/baeldung/library/core/Book.java | 52 ++++++++++++++++++ .../com/baeldung/library/core/Library.java | 25 +++++++++ .../java/com/baeldung/library/core/Main.java | 16 ++++++ .../src/main/java/module-info.java | 3 + .../library/core/LibraryUnitTest.java | 47 ++++++++++++++++ .../library/test/LibraryUnitTest.java | 53 ++++++++++++++++++ .../baeldung/library/test/TestLibrary.java | 10 ++++ .../src/test/java/module-info.java | 5 ++ core-java-modules/core-java-9-jigsaw/pom.xml | 4 ++ .../run-library-core-module-with-patch.sh | 7 +++ .../run-library-core-module.sh | 2 + .../run-library-test-class-path.sh | 5 ++ .../run-library-test-module-path.sh | 5 ++ 20 files changed, 338 insertions(+) create mode 100644 core-java-modules/core-java-9-jigsaw/compile-library-core-module.sh create mode 100644 core-java-modules/core-java-9-jigsaw/compile-library-core-tests.sh create mode 100644 core-java-modules/core-java-9-jigsaw/compile-library-core-with-tests.sh create mode 100644 core-java-modules/core-java-9-jigsaw/compile-library-core.sh create mode 100644 core-java-modules/core-java-9-jigsaw/compile-library-test-module.sh create mode 100644 core-java-modules/core-java-9-jigsaw/download-junit-dependencies.sh create mode 100644 core-java-modules/core-java-9-jigsaw/library-core/pom.xml create mode 100644 core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Book.java create mode 100644 core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Library.java create mode 100644 core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Main.java create mode 100644 core-java-modules/core-java-9-jigsaw/library-core/src/main/java/module-info.java create mode 100644 core-java-modules/core-java-9-jigsaw/library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java create mode 100644 core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/LibraryUnitTest.java create mode 100644 core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/TestLibrary.java create mode 100644 core-java-modules/core-java-9-jigsaw/library-test/src/test/java/module-info.java create mode 100644 core-java-modules/core-java-9-jigsaw/run-library-core-module-with-patch.sh create mode 100644 core-java-modules/core-java-9-jigsaw/run-library-core-module.sh create mode 100644 core-java-modules/core-java-9-jigsaw/run-library-test-class-path.sh create mode 100644 core-java-modules/core-java-9-jigsaw/run-library-test-module-path.sh diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core-module.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core-module.sh new file mode 100644 index 0000000000..fa0d4d5f14 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core-module.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +javac -d mods/com.baeldung.library.core $(find library-core/src/main -name "*.java") \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core-tests.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core-tests.sh new file mode 100644 index 0000000000..751906103b --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core-tests.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +javac --class-path outDir/library-core/:\ +libs/junit-jupiter-engine-5.9.2.jar:\ +libs/junit-platform-engine-1.9.2.jar:\ +libs/apiguardian-api-1.1.2.jar:\ +libs/junit-jupiter-params-5.9.2.jar:\ +libs/junit-jupiter-api-5.9.2.jar:\ +libs/opentest4j-1.2.0.jar:\ +libs/junit-platform-commons-1.9.2.jar \ +-d outDir/library-test library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core-with-tests.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core-with-tests.sh new file mode 100644 index 0000000000..c873a9003c --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core-with-tests.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\ +libs/junit-platform-engine-1.9.2.jar:\ +libs/apiguardian-api-1.1.2.jar:\ +libs/junit-jupiter-params-5.9.2.jar:\ +libs/junit-jupiter-api-5.9.2.jar:\ +libs/opentest4j-1.2.0.jar:\ +libs/junit-platform-commons-1.9.2.jar \ +-d outDir/library-core \ +library-core/src/main/java/com/baeldung/library/core/Book.java \ +library-core/src/main/java/com/baeldung/library/core/Library.java \ +library-core/src/main/java/com/baeldung/library/core/Main.java \ +library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-core.sh b/core-java-modules/core-java-9-jigsaw/compile-library-core.sh new file mode 100644 index 0000000000..7531148d0f --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-core.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +javac --class-path libs/junit-jupiter-engine-5.9.2.jar:\ +libs/junit-platform-engine-1.9.2.jar:\ +libs/apiguardian-api-1.1.2.jar:\ +libs/junit-jupiter-params-5.9.2.jar:\ +libs/junit-jupiter-api-5.9.2.jar:\ +libs/opentest4j-1.2.0.jar:\ +libs/junit-platform-commons-1.9.2.jar \ +-d outDir/library-core \ +library-core/src/main/java/com/baeldung/library/core/Book.java \ +library-core/src/main/java/com/baeldung/library/core/Library.java \ +library-core/src/main/java/com/baeldung/library/core/Main.java \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/compile-library-test-module.sh b/core-java-modules/core-java-9-jigsaw/compile-library-test-module.sh new file mode 100644 index 0000000000..c6fd614fd0 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/compile-library-test-module.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +javac --module-path mods:libs -d mods/com.baeldung.library.test $(find library-test/src/test -name "*.java") \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/download-junit-dependencies.sh b/core-java-modules/core-java-9-jigsaw/download-junit-dependencies.sh new file mode 100644 index 0000000000..64c72a5429 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/download-junit-dependencies.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +wget -P libs/ https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.9.2/junit-platform-reporting-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console/1.9.2/junit-platform-console-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.9.2/junit-platform-launcher-1.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2.jar / +wget -P libs/ https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2.jar \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-core/pom.xml b/core-java-modules/core-java-9-jigsaw/library-core/pom.xml new file mode 100644 index 0000000000..b860d89932 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + com.baeldung + core-java-9-jigsaw + 0.2-SNAPSHOT + + + library-core + + + 19 + 19 + UTF-8 + + + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 9 + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + false + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Book.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Book.java new file mode 100644 index 0000000000..782de8fa10 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Book.java @@ -0,0 +1,52 @@ +package com.baeldung.library.core; + +import java.util.Objects; + +public class Book { + + private String title; + private String author; + + public Book(String title, String author) { + this.title = title; + this.author = author; + } + + public String getTitle() { + return title; + } + + public String getAuthor() { + return author; + } + + + @Override + public String toString() { + return "Book [title=" + title + ", author=" + author + "]"; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + final Book book = (Book) o; + + if (!Objects.equals(title, book.title)) { + return false; + } + return Objects.equals(author, book.author); + } + + @Override + public int hashCode() { + int result = title != null ? title.hashCode() : 0; + result = 31 * result + (author != null ? author.hashCode() : 0); + return result; + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Library.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Library.java new file mode 100644 index 0000000000..ee2225810d --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Library.java @@ -0,0 +1,25 @@ +package com.baeldung.library.core; + +import java.util.ArrayList; +import java.util.List; + +public class Library { + + private List books = new ArrayList<>(); + + public void addBook(Book book) { + books.add(book); + } + + public List getBooks() { + return books; + } + + void removeBook(Book book) { + books.remove(book); + } + + protected void removeBookByAuthor(String author) { + books.removeIf(book -> book.getAuthor().equals(author)); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Main.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Main.java new file mode 100644 index 0000000000..18839602c2 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/com/baeldung/library/core/Main.java @@ -0,0 +1,16 @@ +package com.baeldung.library.core; + +public class Main { + + public static void main(String[] args) { + Library library = new Library(); + library.addBook(new Book("The Lord of the Rings", "J.R.R. Tolkien")); + library.addBook(new Book("The Hobbit", "J.R.R. Tolkien")); + library.addBook(new Book("The Silmarillion", "J.R.R. Tolkien")); + library.addBook(new Book("The Chronicles of Narnia", "C.S. Lewis")); + library.addBook(new Book("The Lion, the Witch and the Wardrobe", "C.S. Lewis")); + System.out.println("Welcome to our library!"); + System.out.println("We have the following books:"); + library.getBooks().forEach(System.out::println); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/module-info.java b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/module-info.java new file mode 100644 index 0000000000..bdf88d8bc9 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/main/java/module-info.java @@ -0,0 +1,3 @@ +module com.baeldung.library.core { + exports com.baeldung.library.core; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java b/core-java-modules/core-java-9-jigsaw/library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java new file mode 100644 index 0000000000..20a4889e8c --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-core/src/test/java/com/baeldung/library/core/LibraryUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.library.core; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class LibraryUnitTest { + + @Test + void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + + @Test + void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + library.removeBook(theLordOfTheRings); + int expected = 0; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + + @Test + void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien"); + Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien"); + Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins"); + library.addBook(theLordOfTheRings); + library.addBook(theHobbit); + library.addBook(theSilmarillion); + library.addBook(theHungerGames); + library.removeBookByAuthor("J.R.R. Tolkien"); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/LibraryUnitTest.java b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/LibraryUnitTest.java new file mode 100644 index 0000000000..31eae89bba --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/LibraryUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.library.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.baeldung.library.core.Book; +import com.baeldung.library.core.Library; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import org.junit.jupiter.api.Test; + +class LibraryUnitTest { + + @Test + void givenEmptyLibrary_whenAddABook_thenLibraryHasOneBook() { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } + + @Test + void givenTheLibraryWithABook_whenRemoveABook_thenLibraryIsEmpty() + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Library library = new Library(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + library.addBook(theLordOfTheRings); + Method removeBook = Library.class.getDeclaredMethod("removeBook", Book.class); + removeBook.setAccessible(true); + removeBook.invoke(library, theLordOfTheRings); + int expected = 0; + int actual = library.getBooks().size(); + assertEquals(expected, actual); + } +@Test +void givenTheLibraryWithSeveralBook_whenRemoveABookByAuthor_thenLibraryHasNoBooksByTheAuthor() { + TestLibrary library = new TestLibrary(); + Book theLordOfTheRings = new Book("The Lord of the Rings", "J.R.R. Tolkien"); + Book theHobbit = new Book("The Hobbit", "J.R.R. Tolkien"); + Book theSilmarillion = new Book("The Silmarillion", "J.R.R. Tolkien"); + Book theHungerGames = new Book("The Hunger Games", "Suzanne Collins"); + library.addBook(theLordOfTheRings); + library.addBook(theHobbit); + library.addBook(theSilmarillion); + library.addBook(theHungerGames); + library.removeBookByAuthor("J.R.R. Tolkien"); + int expected = 1; + int actual = library.getBooks().size(); + assertEquals(expected, actual); +} + +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/TestLibrary.java b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/TestLibrary.java new file mode 100644 index 0000000000..8ee3b0e3fe --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/com/baeldung/library/test/TestLibrary.java @@ -0,0 +1,10 @@ +package com.baeldung.library.test; + +import com.baeldung.library.core.Library; + +public class TestLibrary extends Library { + @Override + public void removeBookByAuthor(final String author) { + super.removeBookByAuthor(author); + } +} diff --git a/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/module-info.java b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/module-info.java new file mode 100644 index 0000000000..8d60b574f2 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/library-test/src/test/java/module-info.java @@ -0,0 +1,5 @@ +module com.baeldung.library.test { + requires com.baeldung.library.core; + requires org.junit.jupiter.api; + opens com.baeldung.library.test to org.junit.platform.commons; +} \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/pom.xml b/core-java-modules/core-java-9-jigsaw/pom.xml index 70a2882234..288254b9cf 100644 --- a/core-java-modules/core-java-9-jigsaw/pom.xml +++ b/core-java-modules/core-java-9-jigsaw/pom.xml @@ -5,6 +5,10 @@ 4.0.0 core-java-9-jigsaw core-java-9-jigsaw + pom + + library-core + com.baeldung diff --git a/core-java-modules/core-java-9-jigsaw/run-library-core-module-with-patch.sh b/core-java-modules/core-java-9-jigsaw/run-library-core-module-with-patch.sh new file mode 100644 index 0000000000..70772a3589 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-core-module-with-patch.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +java --module-path mods:libs \ +--add-modules com.baeldung.library.core \ +--add-opens com.baeldung.library.core/com.baeldung.library.core=org.junit.platform.commons \ +--add-reads com.baeldung.library.core=org.junit.jupiter.api \ +--patch-module com.baeldung.library.core=outDir/library-test \ +--module org.junit.platform.console --select-class com.baeldung.library.core.LibraryUnitTest \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/run-library-core-module.sh b/core-java-modules/core-java-9-jigsaw/run-library-core-module.sh new file mode 100644 index 0000000000..f2bb976512 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-core-module.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +java --module-path mods --module com.baeldung.library.core/com.baeldung.library.core.Main \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/run-library-test-class-path.sh b/core-java-modules/core-java-9-jigsaw/run-library-test-class-path.sh new file mode 100644 index 0000000000..73e3d504bf --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-test-class-path.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +java --module-path libs \ +org.junit.platform.console.ConsoleLauncher \ +--classpath ./outDir/library-core \ +--select-class com.baeldung.library.core.LibraryUnitTest \ No newline at end of file diff --git a/core-java-modules/core-java-9-jigsaw/run-library-test-module-path.sh b/core-java-modules/core-java-9-jigsaw/run-library-test-module-path.sh new file mode 100644 index 0000000000..08d149dbd7 --- /dev/null +++ b/core-java-modules/core-java-9-jigsaw/run-library-test-module-path.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +java --module-path mods:libs \ +--add-modules com.baeldung.library.test \ +--add-opens com.baeldung.library.core/com.baeldung.library.core=com.baeldung.library.test \ +org.junit.platform.console.ConsoleLauncher --select-class com.baeldung.library.test.LibraryUnitTest \ No newline at end of file From 771269e07a225d406be14cfc6ea4d3313f1c8dff Mon Sep 17 00:00:00 2001 From: Kumar Prabhash Anand Date: Thu, 13 Apr 2023 18:23:17 +0200 Subject: [PATCH 25/39] BAEL-5965 protobuf custom configuration (#13838) * BAEL-5965 added protobuf custom config code generation implementation * deleted .gitignore * BAEL-5965 added test proto src configuration * BAEL-5965 updated module name --- .../protobuf/build.gradle | 45 ++++ .../gradle/wrapper/gradle-wrapper.properties | 5 + .../gradle-customization/protobuf/gradlew | 240 ++++++++++++++++++ .../gradle-customization/protobuf/gradlew.bat | 91 +++++++ .../protobuf/settings.gradle | 1 + .../src/main/resources/application.properties | 1 + .../src/sample_protofiles/user_message.proto | 13 + .../ProtobufCodeGenerationUnitTest.java | 28 ++ 8 files changed, 424 insertions(+) create mode 100644 gradle-modules/gradle-customization/protobuf/build.gradle create mode 100644 gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties create mode 100755 gradle-modules/gradle-customization/protobuf/gradlew create mode 100644 gradle-modules/gradle-customization/protobuf/gradlew.bat create mode 100644 gradle-modules/gradle-customization/protobuf/settings.gradle create mode 100644 gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties create mode 100644 gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto create mode 100644 gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java diff --git a/gradle-modules/gradle-customization/protobuf/build.gradle b/gradle-modules/gradle-customization/protobuf/build.gradle new file mode 100644 index 0000000000..3cac57fb03 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/build.gradle @@ -0,0 +1,45 @@ +plugins { + id 'java' + id "com.google.protobuf" version "0.8.18" +} + +group = 'com.baeldung' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '17' + +repositories { + mavenCentral() +} + +dependencies { + implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.15.0' + implementation group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +tasks.named('test') { + useJUnitPlatform() +} + +protobuf { + protoc { + artifact = 'com.google.protobuf:protoc:3.15.0' + } +} + +sourceSets { + main { + proto { + srcDir 'src/sample_protofiles' + } + java { + srcDirs 'build/generated/source/proto/main/java' + } + } + test { + proto { + srcDir 'src/sample_protofiles' + } + } +} \ No newline at end of file diff --git a/gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..774fae8767 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-customization/protobuf/gradlew b/gradle-modules/gradle-customization/protobuf/gradlew new file mode 100755 index 0000000000..a69d9cb6c2 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/gradlew @@ -0,0 +1,240 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-customization/protobuf/gradlew.bat b/gradle-modules/gradle-customization/protobuf/gradlew.bat new file mode 100644 index 0000000000..f127cfd49d --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle-modules/gradle-customization/protobuf/settings.gradle b/gradle-modules/gradle-customization/protobuf/settings.gradle new file mode 100644 index 0000000000..63483bae11 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'protobuf' diff --git a/gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties b/gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto b/gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto new file mode 100644 index 0000000000..60e06c2016 --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package com.baeldung.protobuf; + +option java_multiple_files = true; +option java_package = "com.baeldung.protobuf.service"; + +message User { + string firstName = 1; + optional string middleName = 2; + string lastName = 3; + optional uint32 age = 4; +} \ No newline at end of file diff --git a/gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java b/gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java new file mode 100644 index 0000000000..12187e3efb --- /dev/null +++ b/gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.protobuf; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +import com.baeldung.protobuf.service.User; + +class ProtobufCodeGenerationUnitTest { + + @Test + void givenUserData_whenObjectCreated_thenDataShouldMatch() { + final String firstName = "John"; + final String lastName = "Doe"; + final int age = 28; + + User user = User.newBuilder() + .setFirstName(firstName) + .setLastName(lastName) + .setAge(age) + .build(); + + assertEquals(firstName, user.getFirstName()); + assertEquals(lastName, user.getLastName()); + assertEquals(age, user.getAge()); + } + +} From 7a426829cb2e8a10ab63ae2bc685d76a07a8028a Mon Sep 17 00:00:00 2001 From: Adrian Bob Date: Thu, 13 Apr 2023 19:25:49 +0300 Subject: [PATCH 26/39] Add logging for bulkhead test (#13834) --- .../ResilientAppControllerIntegrationTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java b/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java index ae1b89764d..3933a02753 100644 --- a/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-resilience4j/src/test/java/com/baeldung/resilience4j/eventendpoints/ResilientAppControllerIntegrationTest.java @@ -22,6 +22,8 @@ import java.util.stream.IntStream; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; @@ -32,6 +34,8 @@ import org.springframework.http.ResponseEntity; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class ResilientAppControllerIntegrationTest { + private final Logger LOGGER = LoggerFactory.getLogger(getClass()); + @Autowired private TestRestTemplate restTemplate; @LocalServerPort private Integer port; @@ -226,6 +230,7 @@ class ResilientAppControllerIntegrationTest { executorService.shutdown(); assertEquals(2, responseStatusCount.keySet().size()); + LOGGER.info("Response statuses: " + responseStatusCount.keySet()); assertTrue(responseStatusCount.containsKey(BANDWIDTH_LIMIT_EXCEEDED.value())); assertTrue(responseStatusCount.containsKey(OK.value())); EXTERNAL_SERVICE.verify(3, getRequestedFor(urlEqualTo("/api/external"))); From ae52ba39681a811d15aaf86cbd18c4a68740d6cd Mon Sep 17 00:00:00 2001 From: sam-gardner <53271849+sam-gardner@users.noreply.github.com> Date: Thu, 13 Apr 2023 18:02:41 +0100 Subject: [PATCH 27/39] BAEL-5771 Add code for url query manipulation in Java (#13820) --- .../core-java-networking-4/pom.xml | 24 +++++++++ .../UrlQueryManipulationUnitTest.java | 53 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 core-java-modules/core-java-networking-4/src/test/java/com/baeldung/urlquerymanipulation/UrlQueryManipulationUnitTest.java diff --git a/core-java-modules/core-java-networking-4/pom.xml b/core-java-modules/core-java-networking-4/pom.xml index 5fca4a1cab..cbe6356d0f 100644 --- a/core-java-modules/core-java-networking-4/pom.xml +++ b/core-java-modules/core-java-networking-4/pom.xml @@ -24,6 +24,30 @@ jsoup ${jsoup.version} + + + org.apache.httpcomponents + httpclient + 4.5.2 + + + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + + + org.glassfish.jersey.core + jersey-common + 2.22.2 + test + + + + org.springframework + spring-web + 6.0.6 + diff --git a/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/urlquerymanipulation/UrlQueryManipulationUnitTest.java b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/urlquerymanipulation/UrlQueryManipulationUnitTest.java new file mode 100644 index 0000000000..cc53a3e3a8 --- /dev/null +++ b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/urlquerymanipulation/UrlQueryManipulationUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.urlquerymanipulation; + +import static junit.framework.TestCase.assertEquals; + +import java.net.URI; +import java.net.URISyntaxException; + +import javax.ws.rs.core.UriBuilder; + +import org.apache.http.client.utils.URIBuilder; + +import org.junit.Test; +import org.springframework.web.util.UriComponentsBuilder; + +public class UrlQueryManipulationUnitTest { + + @Test + public void whenUsingApacheUriBuilder_thenParametersAreCorrectlyAdded() throws URISyntaxException { + String url = "baeldung.com"; + String key = "article"; + String value = "alpha"; + URI uri = new URIBuilder(url).addParameter(key, value) + .build(); + + assertEquals("baeldung.com?article=alpha", uri.toString()); + } + + @Test + public void whenUsingJavaUriBuilder_thenParametersAreCorrectlyAdded() { + String url = "baeldung.com"; + String key = "article"; + String value = "beta"; + URI uri = UriBuilder.fromUri(url) + .queryParam(key, value) + .build(); + + assertEquals("baeldung.com?article=beta", uri.toString()); + } + + @Test + public void whenUsingSpringUriComponentsBuilder_thenParametersAreCorrectlyAdded() { + String url = "baeldung.com"; + String key = "article"; + String value = "charlie"; + URI uri = UriComponentsBuilder.fromUriString(url) + .queryParam(key, value) + .build() + .toUri(); + + assertEquals("baeldung.com?article=charlie", uri.toString()); + } + +} From b86f875dbef7b7f9a5593825f2ac76a680dc1aa3 Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Fri, 14 Apr 2023 06:41:25 +0530 Subject: [PATCH 28/39] BAEL-6307: Use LinkedHashMap to fix order of keys during serialization (#13832) Co-authored-by: Tapan Avasthi --- .../baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java index 87c425fe96..0b4639ca3b 100644 --- a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java +++ b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/map/MapWithJsonKeyValueUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.jackson.map; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.junit.Test; @@ -25,7 +25,7 @@ public class MapWithJsonKeyValueUnitTest { @Test public void givenMapWithObjectKeys_WhenSerialize_ThenUseJsonKeyForSerialization() throws JsonProcessingException { // Given - Map selectionByFruit = new HashMap<>(); + Map selectionByFruit = new LinkedHashMap(); selectionByFruit.put(FRUIT1, "Hagrid"); selectionByFruit.put(FRUIT2, "Hercules"); // When @@ -37,7 +37,7 @@ public class MapWithJsonKeyValueUnitTest { @Test public void givenMapWithObjectValues_WhenSerialize_ThenUseJsonValueForSerialization() throws JsonProcessingException { // Given - Map selectionByPerson = new HashMap<>(); + Map selectionByPerson = new LinkedHashMap(); selectionByPerson.put("Hagrid", FRUIT1); selectionByPerson.put("Hercules", FRUIT2); // When From 5c2126b6268d47dc47acf844801d447db22eb5e0 Mon Sep 17 00:00:00 2001 From: tgvLt Date: Fri, 14 Apr 2023 08:22:30 +0300 Subject: [PATCH 29/39] Parse dates with multiple formats (#13348) Code examples for "Parsing Date Strings with Varying Formats" --- .../parsingDates/SimpleDateTimeFormat.java | 20 +++++++++ .../parsingDates/SimpleDateTimeFormater.java | 17 ++++++++ .../parsingDates/SimpleDateUtils.java | 18 ++++++++ .../parsingDates/SimpleParseDate.java | 19 ++++++++ .../parsingDates/SimpleParseDateUnitTest.java | 43 +++++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormat.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormater.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateUtils.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormat.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormat.java new file mode 100644 index 0000000000..a82f3bce2b --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormat.java @@ -0,0 +1,20 @@ +package com.baeldung.parsingDates; + +import java.util.Arrays; +import java.util.List; +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormat; + +public class SimpleDateTimeFormat { + + public static LocalDate parseDate(String date) { + List patternList = Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd"); + for (String pattern : patternList) { + try { + return DateTimeFormat.forPattern(pattern).parseLocalDate(date); + } catch (IllegalArgumentException e) { + } + } + return null; + } +} diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormater.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormater.java new file mode 100644 index 0000000000..aa12038032 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateTimeFormater.java @@ -0,0 +1,17 @@ +package com.baeldung.parsingDates; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; + +public class SimpleDateTimeFormater { + + public static LocalDate parseDate(String date) { + DateTimeFormatterBuilder dateTimeFormatterBuilder = new DateTimeFormatterBuilder() + .append(DateTimeFormatter.ofPattern("[MM/dd/yyyy]" + "[dd-MM-yyyy]" + "[yyyy-MM-dd]")); + + DateTimeFormatter dateTimeFormatter = dateTimeFormatterBuilder.toFormatter(); + + return LocalDate.parse(date, dateTimeFormatter); + } +} diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateUtils.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateUtils.java new file mode 100644 index 0000000000..8a154d3cd8 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleDateUtils.java @@ -0,0 +1,18 @@ +package com.baeldung.parsingDates; + +import java.text.ParseException; +import java.util.Date; +import org.apache.commons.lang3.time.DateUtils; + +public class SimpleDateUtils { + + public static Date parseDate(String date) { + try { + return DateUtils.parseDateStrictly(date, + new String[]{"yyyy/MM/dd", "dd/MM/yyyy", "yyyy-MM-dd"}); + } catch (ParseException ex) { + return null; + } + } + +} diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java new file mode 100644 index 0000000000..cb024eea53 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java @@ -0,0 +1,19 @@ +package com.baeldung.parsingDates; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class SimpleParseDate { + + public Date parseDate(String dateString, List formatStrings) { + for (String formatString : formatStrings) { + try { + return new SimpleDateFormat(formatString).parse(dateString); + } catch (ParseException e) { + } + } + return null; + } +} diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java new file mode 100644 index 0000000000..d7cbb6a834 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.parsingDates; + +import com.baeldung.parsingDates.SimpleDateTimeFormat; +import com.baeldung.parsingDates.SimpleDateTimeFormater; +import com.baeldung.parsingDates.SimpleDateUtils; +import com.baeldung.parsingDates.SimpleParseDate; +import java.time.format.DateTimeParseException; +import java.util.Arrays; +import org.junit.*; +import static org.junit.Assert.*; +import org.joda.time.LocalDate; + +public class SimpleParseDateUnitTest { + + @Test + public void whenInvalidInput_thenGettingUnexpectedResult() { + SimpleParseDate simpleParseDate = new SimpleParseDate(); + String date = "2022-40-40"; + assertEquals("Sat May 10 00:00:00 UTC 2025", simpleParseDate.parseDate(date, Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd")).toString()); + } + + @Test + public void whenInvalidDate_thenAssertThrows() { + SimpleDateTimeFormater simpleDateTimeFormater = new SimpleDateTimeFormater(); + assertEquals(java.time.LocalDate.parse("2022-12-04"), simpleDateTimeFormater.parseDate("2022-12-04")); + assertThrows(DateTimeParseException.class, () -> simpleDateTimeFormater.parseDate("2022-13-04")); + } + + @Test + public void whenDateIsCorrect_thenParseCorrect() { + SimpleDateUtils simpleDateUtils = new SimpleDateUtils(); + assertNull(simpleDateUtils.parseDate("53/10/2014")); + assertEquals("Wed Sep 10 00:00:00 UTC 2014", simpleDateUtils.parseDate("10/09/2014").toString()); + } + + @Test + public void whenDateIsCorrect_thenResultCorrect() { + SimpleDateTimeFormat simpleDateTimeFormat = new SimpleDateTimeFormat(); + assertNull(simpleDateTimeFormat.parseDate("53/10/2014")); + assertEquals(LocalDate.parse("2014-10-10"), simpleDateTimeFormat.parseDate("2014-10-10")); + } + +} From 5471db832c074781f231fdcd83e1e3668072b671 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 14 Apr 2023 16:08:12 +0300 Subject: [PATCH 30/39] [JAVA-15018] Removed redundant apache httpclient dependency + added commons-codec (#13828) --- core-java-modules/core-java-networking-2/pom.xml | 8 ++++---- .../java/com/baeldung/url/auth/HttpClient.java | 4 ++-- .../com/baeldung/url/auth/HttpClientLiveTest.java | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 982f4fa346..34f16a9938 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -15,9 +15,9 @@ - org.apache.httpcomponents - httpclient - ${httpclient.version} + commons-codec + commons-codec + ${commons-codec.version} org.apache.commons @@ -52,11 +52,11 @@ - 4.5.9 2.0.1 2.4.5 2.3.3 2.0.0-alpha-3 + 1.15 \ No newline at end of file diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java index 779f8aa898..f9d747a133 100644 --- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java @@ -21,7 +21,7 @@ public class HttpClient { this.password = password; } - public int sendRquestWithAuthHeader(String url) throws IOException { + public int sendRequestWithAuthHeader(String url) throws IOException { HttpURLConnection connection = null; try { connection = createConnection(url); @@ -34,7 +34,7 @@ public class HttpClient { } } - public int sendRquestWithAuthenticator(String url) throws IOException { + public int sendRequestWithAuthenticator(String url) throws IOException { setAuthenticator(); HttpURLConnection connection = null; diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java index 01d580bc65..387b228953 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientLiveTest.java @@ -7,28 +7,28 @@ import org.junit.Test; public class HttpClientLiveTest { @Test - public void sendRquestWithAuthHeader() throws Exception { + public void sendRequestWithAuthHeader() throws Exception { HttpClient httpClient = new HttpClient("user1", "pass1"); - int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); + int status = httpClient.sendRequestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); assertTrue(isSuccess(status)); } @Test - public void sendRquestWithAuthHeader_whenIncorrectCredentials_thenNotSuccessful() throws Exception { + public void sendRequestWithAuthHeader_whenIncorrectCredentials_thenNotSuccessful() throws Exception { HttpClient httpClient = new HttpClient("John", "Smith"); - int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); + int status = httpClient.sendRequestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); assertTrue(isUnauthorized(status)); } @Test - public void sendRquestWithAuthenticator() throws Exception { + public void sendRequestWithAuthenticator() throws Exception { HttpClient httpClient = new HttpClient("user2", "pass2"); - int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); + int status = httpClient.sendRequestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); assertTrue(isSuccess(status)); } @@ -37,7 +37,7 @@ public class HttpClientLiveTest { public void sendRquestWithAuthenticator_whenIncorrectCredentials_thenNotSuccessful() throws Exception { HttpClient httpClient = new HttpClient("John", "Smith"); - int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); + int status = httpClient.sendRequestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); assertTrue(isUnauthorized(status)); } From befc8fc255c8e554bb8e52de4790eb4c07457b17 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 14 Apr 2023 16:15:10 +0300 Subject: [PATCH 31/39] [JAVA-18183] Added jaxb dependency (#13833) --- spring-boot-rest/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml index 81c9ebbec8..46563b725f 100644 --- a/spring-boot-rest/pom.xml +++ b/spring-boot-rest/pom.xml @@ -143,6 +143,11 @@ + + org.glassfish.jaxb + jaxb-runtime + ${jaxb-runtime.version} + @@ -159,5 +164,6 @@ 1.4.11.1 3.1.0 3.3.2 + 2.3.7 From 7a71f2bc0cf742169039fe6797b61f180fb8ace6 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 14 Apr 2023 16:18:26 +0300 Subject: [PATCH 32/39] [JAVA-15031] Upgraded code for apache httpclient + moved old version to apache-httpclient4 module. (#13830) --- .../HttpClientCancelRequestLiveTest.java | 40 +++++++++++++ .../httpclient/base/HttpClientLiveTest.java | 29 +--------- apache-httpclient4/README.md | 1 + .../HttpClientCancelRequestV4LiveTest.java | 57 +++++++++++++++++++ 4 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestLiveTest.java create mode 100644 apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestV4LiveTest.java diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestLiveTest.java new file mode 100644 index 0000000000..d19e0e1d86 --- /dev/null +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestLiveTest.java @@ -0,0 +1,40 @@ +package com.baeldung.httpclient; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; + +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpStatus; +import org.junit.jupiter.api.Test; + +class HttpClientCancelRequestLiveTest { + + private static final String SAMPLE_URL = "http://www.github.com"; + + @Test + void whenRequestIsCanceled_thenCorrect() throws IOException { + HttpGet request = new HttpGet(SAMPLE_URL); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + httpClient.execute(request, response -> { + HttpEntity entity = response.getEntity(); + + System.out.println("----------------------------------------"); + System.out.println(response.getCode()); + if (entity != null) { + System.out.println("Response content length: " + entity.getContentLength()); + } + System.out.println("----------------------------------------"); + // Do not feel like reading the response body + // Call abort on the request object + request.abort(); + + assertThat(response.getCode()).isEqualTo(HttpStatus.SC_OK); + return response; + }); + } + } +} diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java index ef12c37412..4173909f7d 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/base/HttpClientLiveTest.java @@ -1,8 +1,8 @@ package com.baeldung.httpclient.base; import com.baeldung.httpclient.ResponseUtil; + import org.apache.http.Header; -import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -10,7 +10,6 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.BasicHttpClientConnectionManager; import org.junit.After; import org.junit.Before; @@ -73,30 +72,4 @@ public class HttpClientLiveTest { assertThat(headers, not(emptyArray())); } - // tests - cancel request - - @Test - public final void whenRequestIsCanceled_thenCorrect() throws IOException { - instance = HttpClients.custom().build(); - final HttpGet request = new HttpGet(SAMPLE_URL); - response = instance.execute(request); - - try { - final HttpEntity entity = response.getEntity(); - - System.out.println("----------------------------------------"); - System.out.println(response.getStatusLine()); - if (entity != null) { - System.out.println("Response content length: " + entity.getContentLength()); - } - System.out.println("----------------------------------------"); - - // Do not feel like reading the response body - // Call abort on the request object - request.abort(); - } finally { - response.close(); - } - } - } diff --git a/apache-httpclient4/README.md b/apache-httpclient4/README.md index 9c18e06243..22b0391e6b 100644 --- a/apache-httpclient4/README.md +++ b/apache-httpclient4/README.md @@ -4,6 +4,7 @@ This module contains articles about Apache HttpClient 4.5 ### Relevant Articles +- [Apache HttpClient – Cancel Request](https://www.baeldung.com/httpclient-cancel-request) - [Apache HttpClient with SSL](https://www.baeldung.com/httpclient-ssl) - [Apache HttpClient Timeout](https://www.baeldung.com/httpclient-timeout) - [Custom HTTP Header with the Apache HttpClient](https://www.baeldung.com/httpclient-custom-http-header) diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestV4LiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestV4LiveTest.java new file mode 100644 index 0000000000..226a7b8cf7 --- /dev/null +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCancelRequestV4LiveTest.java @@ -0,0 +1,57 @@ +package com.baeldung.httpclient; + +import java.io.IOException; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class HttpClientCancelRequestV4LiveTest { + + private static final String SAMPLE_URL = "http://www.github.com"; + + private CloseableHttpClient instance; + + private CloseableHttpResponse response; + + @Before + public final void before() { + instance = HttpClientBuilder.create().build(); + } + + @After + public final void after() throws IllegalStateException, IOException { + ResponseUtil.closeResponse(response); + } + + @Test + public final void whenRequestIsCanceled_thenCorrect() throws IOException { + instance = HttpClients.custom().build(); + final HttpGet request = new HttpGet(SAMPLE_URL); + response = instance.execute(request); + + try { + final HttpEntity entity = response.getEntity(); + + System.out.println("----------------------------------------"); + System.out.println(response.getStatusLine()); + if (entity != null) { + System.out.println("Response content length: " + entity.getContentLength()); + } + System.out.println("----------------------------------------"); + + // Do not feel like reading the response body + // Call abort on the request object + request.abort(); + } finally { + response.close(); + } + } +} From 3d278ff7a9309fcc08ae285cede49b0059449b46 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 14 Apr 2023 19:12:08 +0530 Subject: [PATCH 33/39] Java 19533 fix failing integration test (#13835) * JAVA-19533 Fix references to parents - Week 14 - 2023 (moved-1) * JAVA-19533 Fix references to parents - Week 14 - 2023 (moved-1) * JAVA-19533 Fix failing integration test --- spring-boot-modules/spring-boot-redis/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spring-boot-modules/spring-boot-redis/pom.xml b/spring-boot-modules/spring-boot-redis/pom.xml index 42dba1de2f..5b85ad00ca 100644 --- a/spring-boot-modules/spring-boot-redis/pom.xml +++ b/spring-boot-modules/spring-boot-redis/pom.xml @@ -37,6 +37,12 @@ it.ozimov embedded-redis + + + org.slf4j + slf4j-simple + + 0.7.3 test From c4ff64e4a534d7c89c769afc85bbfb202135ea3f Mon Sep 17 00:00:00 2001 From: Mihail Polivaha <68962645+Mihail2048@users.noreply.github.com> Date: Fri, 14 Apr 2023 18:50:02 +0300 Subject: [PATCH 34/39] BAEL-6278 rename IntegrationTest class to LiveTest (#13841) * misha2048 Retrying Requests using Apache HttpClient * BAEL-6278 rename IntegrationTest class to LiveTest --- ...yIntegrationTest.java => ApacheHttpClientRetryLiveTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/{ApacheHttpClientRetryIntegrationTest.java => ApacheHttpClientRetryLiveTest.java} (99%) diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryIntegrationTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryLiveTest.java similarity index 99% rename from apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryIntegrationTest.java rename to apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryLiveTest.java index cfb51f058a..3a8ff252c2 100644 --- a/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryIntegrationTest.java +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/retry/ApacheHttpClientRetryLiveTest.java @@ -24,7 +24,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class ApacheHttpClientRetryIntegrationTest { +public class ApacheHttpClientRetryLiveTest { private Integer requestCounter; private CloseableHttpClient httpClient; From 68de2833f3ac79a742815f0a27ef995c11c8774f Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Sat, 15 Apr 2023 09:43:07 +0530 Subject: [PATCH 35/39] Java 18150 (#13818) * JAVA-18158 : Changes made in pom.xml upgrade maven-modules to JDK 11 * JAVA-18158 : Changes made in pom.xml upgrade maven-modules to JDK 11 * JAVA-18158 : Handle MutabilityAnalysisException by adding @Test(expected = Exception.class) while upgrading the module to java-11 * JAVA-18150: Changes made for commenting whenModifying_shouldCreateNewInstance test case as assertImmutable is not work * JAVA-18150: Changes made for moving libraries-3 to default-jdk9-and-above and integration-jdk9-and-above * JAVA-18150: Changes made for moving ignoring whenModifying_shouldCreateNewInstance test case --------- Co-authored-by: Dhawal Kapil --- libraries-3/pom.xml | 41 ++++--------------- .../immutable/ImmutablePersonUnitTest.java | 7 ++++ pom.xml | 6 ++- 3 files changed, 18 insertions(+), 36 deletions(-) diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index daa01108f6..5e06a5550e 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -122,6 +122,11 @@ ${mutabilitydetector.version} test + + javax.annotation + javax.annotation-api + 1.3.2 + @@ -161,42 +166,10 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5 - javac-with-errorprone - true - 1.8 - 1.8 - true - - - com.uber.nullaway - nullaway - 0.3.0 - - - - - - - -XepExcludedPaths:(.*)/test/.*|(.*)/jcabi/.* - -XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway - + 11 + 11 - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - 2.8 - - - - - com.google.errorprone - error_prone_core - 2.3.4 - - diff --git a/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java b/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java index 222cbfd8ef..b9164ed92b 100644 --- a/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java +++ b/libraries-3/src/test/java/com/baeldung/immutable/ImmutablePersonUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.immutable; +import org.junit.Ignore; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -7,6 +8,12 @@ import static org.mutabilitydetector.unittesting.MutabilityAssert.assertImmutabl public class ImmutablePersonUnitTest { + /** + * commenting the test case, As after upgrading to java 11 + * assertImmutable is giving exception. Raised the issue to Mutability support team + * https://github.com/MutabilityDetector/MutabilityDetector/issues/196 + */ + @Ignore @Test public void whenModifying_shouldCreateNewInstance() throws Exception { final ImmutablePerson john = ImmutablePerson.builder() diff --git a/pom.xml b/pom.xml index 0800f22937..6f79e56ba1 100644 --- a/pom.xml +++ b/pom.xml @@ -359,7 +359,7 @@ jetbrains language-interop - libraries-3 + libraries-jdk8 lombok-modules/lombok-custom @@ -551,7 +551,7 @@ language-interop - libraries-3 + libraries-jdk8 lombok-modules/lombok-custom @@ -947,6 +947,7 @@ persistence-modules/questdb vaadin + libraries-3 @@ -1200,6 +1201,7 @@ persistence-modules/questdb vaadin + libraries-3 From e243694f3957cd70cf2866256c853c13aeb0d09b Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 15 Apr 2023 10:01:14 +0530 Subject: [PATCH 36/39] JAVA-20211 Renamed modules (#13827) * JAVA-20211 Renamed modules * JAVA-20211 Renamed modules --- .../{lambda => lambda-function}/pom.xml | 0 .../sam-templates/template-implicit.yaml | 0 .../sam-templates/template-inline-swagger.yaml | 0 .../com/baeldung/lambda/LambdaMethodHandler.java | 0 .../com/baeldung/lambda/LambdaRequestHandler.java | 0 .../baeldung/lambda/LambdaRequestStreamHandler.java | 0 .../baeldung/lambda/apigateway/APIDemoHandler.java | 0 .../com/baeldung/lambda/apigateway/model/Person.java | 0 .../baeldung/lambda/dynamodb/SavePersonHandler.java | 0 .../baeldung/lambda/dynamodb/bean/PersonRequest.java | 0 .../lambda/dynamodb/bean/PersonResponse.java | 0 .../src/main/resources/logback.xml | 0 aws-modules/aws-lambda-modules/pom.xml | 6 +++--- .../.gitignore | 0 .../ShippingFunction/pom.xml | 0 .../main/java/com/baeldung/lambda/shipping/App.java | 0 .../java/com/baeldung/lambda/shipping/Checkin.java | 0 .../com/baeldung/lambda/shipping/Consignment.java | 0 .../main/java/com/baeldung/lambda/shipping/Item.java | 0 .../com/baeldung/lambda/shipping/ShippingDao.java | 0 .../baeldung/lambda/shipping/ShippingService.java | 0 .../template.yaml | 0 .../ToDoFunction/pom.xml | 0 .../src/main/java/com/baeldung/lambda/todo/App.java | 0 .../java/com/baeldung/lambda/todo/api/PostApi.java | 0 .../java/com/baeldung/lambda/todo/api/PostItem.java | 0 .../java/com/baeldung/lambda/todo/api/ToDoApi.java | 0 .../java/com/baeldung/lambda/todo/api/ToDoItem.java | 0 .../java/com/baeldung/lambda/todo/config/Config.java | 0 .../com/baeldung/lambda/todo/config/Credentials.java | 0 .../lambda/todo/config/ExecutionContext.java | 0 .../com/baeldung/lambda/todo/config/Services.java | 0 .../baeldung/lambda/todo/service/PostService.java | 0 .../lambda/todo/service/ToDoReaderService.java | 0 .../src/main/resources/configuration.yml | 0 .../ToDoFunction/src/main/resources/log4j2.xml | 0 .../java/com/baeldung/lambda/todo/AppUnitTest.java | 0 .../todo/service/ToDoReaderServiceUnitTest.java | 0 .../template.yaml | 0 {checker-plugin => checker-framework}/README.md | 0 {checker-plugin => checker-framework}/pom.xml | 4 ++-- .../com/baeldung/typechecker/FakeNumExample.java | 0 .../java/com/baeldung/typechecker/FormatExample.java | 0 .../java/com/baeldung/typechecker/KeyForExample.java | 0 .../typechecker/MonotonicNotNullExample.java | 0 .../com/baeldung/typechecker/NonNullExample.java | 0 .../java/com/baeldung/typechecker/RegexExample.java | 0 .../src/main/resources/logback.xml | 0 clojure-modules/{ring => clojure-ring}/.gitignore | 0 clojure-modules/{ring => clojure-ring}/README.md | 0 clojure-modules/{ring => clojure-ring}/project.clj | 0 .../{ring => clojure-ring}/src/ring/core.clj | 0 core-java-modules/core-java-jpms/pom.xml | 5 ++--- .../consumermodule2/pom.xml | 4 ++-- .../com/baeldung/consumermodule/Application.java | 0 .../consumermodule2/src/main/java/module-info.java | 0 .../pom.xml | 4 ++-- .../providermodule/pom.xml | 4 ++-- .../providermodule/LowercaseTextService.java | 0 .../providermodule/src/main/java/module-info.java | 0 .../servicemodule2/pom.xml | 4 ++-- .../java/com/baeldung/servicemodule/TextService.java | 0 .../servicemodule2/src/main/java/module-info.java | 0 .../consumermodule1/pom.xml | 4 ++-- .../com/baeldung/consumermodule/Application.java | 0 .../consumermodule1/src/main/java/module-info.java | 0 .../pom.xml | 4 ++-- .../servicemodule1/pom.xml | 4 ++-- .../baeldung/servicemodule/external/TextService.java | 0 .../servicemodule/external/TextServiceFactory.java | 0 .../servicemodule/internal/LowercaseTextService.java | 0 .../servicemodule/internal/UppercaseTextService.java | 0 .../servicemodule1/src/main/java/module-info.java | 0 .../{core => core-module}/pom.xml | 2 +- .../java/com/baeldung/maven_caching/CoreClass.java | 0 .../docker-caching/multi-module-caching/pom.xml | 4 ++-- .../{runner => runner-module}/pom.xml | 4 ++-- .../maven_caching/MavenCachingApplication.java | 0 {code-generation => google-auto-project}/README.md | 0 {code-generation => google-auto-project}/pom.xml | 4 ++-- .../src/main/java/com/baeldung/autofactory/App.java | 0 .../java/com/baeldung/autofactory/CustomStorage.java | 0 .../baeldung/autofactory/custom/AbstractFactory.java | 0 .../com/baeldung/autofactory/custom/CustomPhone.java | 0 .../com/baeldung/autofactory/custom/SmartPhone.java | 0 .../java/com/baeldung/autofactory/model/Camera.java | 0 .../com/baeldung/autofactory/model/ClassicPhone.java | 0 .../java/com/baeldung/autofactory/model/Phone.java | 0 .../autofactory/modules/SonyCameraModule.java | 0 .../autofactory/provided/IntermediateAssembler.java | 0 .../autofactory/provider/SonyCameraProvider.java | 0 .../autoservice/BingTranslationServiceProvider.java | 0 .../GoogleTranslationServiceProvider.java | 0 .../com/baeldung/autoservice/TranslationService.java | 0 .../java/com/baeldung/autovalue/AutoValueMoney.java | 0 .../autovalue/AutoValueMoneyWithBuilder.java | 0 .../src/main/java/com/baeldung/autovalue/Foo.java | 0 .../java/com/baeldung/autovalue/ImmutableMoney.java | 0 .../java/com/baeldung/autovalue/MutableMoney.java | 0 .../src/main/java/com/baeldung/autovalue/Person.java | 0 .../src/main/resources/logback.xml | 0 .../autoservice/TranslationServiceUnitTest.java | 0 .../java/com/baeldung/autovalue/MoneyUnitTest.java | 0 .../java/com/baeldung/autovalue/PersonUnitTest.java | 0 pom.xml | 12 ++++++------ 105 files changed, 34 insertions(+), 35 deletions(-) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/pom.xml (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/sam-templates/template-implicit.yaml (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/sam-templates/template-inline-swagger.yaml (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/apigateway/model/Person.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java (100%) rename aws-modules/aws-lambda-modules/{lambda => lambda-function}/src/main/resources/logback.xml (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/.gitignore (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/ShippingFunction/pom.xml (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java (100%) rename aws-modules/aws-lambda-modules/{shipping-tracker => shipping-tracker-lambda}/template.yaml (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/pom.xml (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/resources/configuration.yml (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/main/resources/log4j2.xml (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java (100%) rename aws-modules/aws-lambda-modules/{todo-reminder => todo-reminder-lambda}/template.yaml (100%) rename {checker-plugin => checker-framework}/README.md (100%) rename {checker-plugin => checker-framework}/pom.xml (98%) rename {checker-plugin => checker-framework}/src/main/java/com/baeldung/typechecker/FakeNumExample.java (100%) rename {checker-plugin => checker-framework}/src/main/java/com/baeldung/typechecker/FormatExample.java (100%) rename {checker-plugin => checker-framework}/src/main/java/com/baeldung/typechecker/KeyForExample.java (100%) rename {checker-plugin => checker-framework}/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java (100%) rename {checker-plugin => checker-framework}/src/main/java/com/baeldung/typechecker/NonNullExample.java (100%) rename {checker-plugin => checker-framework}/src/main/java/com/baeldung/typechecker/RegexExample.java (100%) rename {checker-plugin => checker-framework}/src/main/resources/logback.xml (100%) rename clojure-modules/{ring => clojure-ring}/.gitignore (100%) rename clojure-modules/{ring => clojure-ring}/README.md (100%) rename clojure-modules/{ring => clojure-ring}/project.clj (100%) rename clojure-modules/{ring => clojure-ring}/src/ring/core.clj (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/consumermodule2/pom.xml (92%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/consumermodule2/src/main/java/module-info.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/pom.xml (92%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/providermodule/pom.xml (91%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/providermodule/src/main/java/module-info.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/servicemodule2/pom.xml (88%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern2 => service-loader-api-pattern}/servicemodule2/src/main/java/module-info.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/consumermodule1/pom.xml (89%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/consumermodule1/src/main/java/module-info.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/pom.xml (91%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/servicemodule1/pom.xml (86%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java (100%) rename core-java-modules/core-java-jpms/{decoupling-pattern1 => service-provider-factory-pattern}/servicemodule1/src/main/java/module-info.java (100%) rename docker-modules/docker-caching/multi-module-caching/{core => core-module}/pom.xml (95%) rename docker-modules/docker-caching/multi-module-caching/{core => core-module}/src/main/java/com/baeldung/maven_caching/CoreClass.java (100%) rename docker-modules/docker-caching/multi-module-caching/{runner => runner-module}/pom.xml (95%) rename docker-modules/docker-caching/multi-module-caching/{runner => runner-module}/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java (100%) rename {code-generation => google-auto-project}/README.md (100%) rename {code-generation => google-auto-project}/pom.xml (96%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/App.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/CustomStorage.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/model/Camera.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/model/Phone.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autoservice/TranslationService.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autovalue/AutoValueMoney.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autovalue/Foo.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autovalue/ImmutableMoney.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autovalue/MutableMoney.java (100%) rename {code-generation => google-auto-project}/src/main/java/com/baeldung/autovalue/Person.java (100%) rename {code-generation => google-auto-project}/src/main/resources/logback.xml (100%) rename {code-generation => google-auto-project}/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java (100%) rename {code-generation => google-auto-project}/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java (100%) rename {code-generation => google-auto-project}/src/test/java/com/baeldung/autovalue/PersonUnitTest.java (100%) diff --git a/aws-modules/aws-lambda-modules/lambda/pom.xml b/aws-modules/aws-lambda-modules/lambda-function/pom.xml similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/pom.xml rename to aws-modules/aws-lambda-modules/lambda-function/pom.xml diff --git a/aws-modules/aws-lambda-modules/lambda/sam-templates/template-implicit.yaml b/aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-implicit.yaml similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/sam-templates/template-implicit.yaml rename to aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-implicit.yaml diff --git a/aws-modules/aws-lambda-modules/lambda/sam-templates/template-inline-swagger.yaml b/aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-inline-swagger.yaml similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/sam-templates/template-inline-swagger.yaml rename to aws-modules/aws-lambda-modules/lambda-function/sam-templates/template-inline-swagger.yaml diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/model/Person.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/apigateway/model/Person.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java rename to aws-modules/aws-lambda-modules/lambda-function/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java diff --git a/aws-modules/aws-lambda-modules/lambda/src/main/resources/logback.xml b/aws-modules/aws-lambda-modules/lambda-function/src/main/resources/logback.xml similarity index 100% rename from aws-modules/aws-lambda-modules/lambda/src/main/resources/logback.xml rename to aws-modules/aws-lambda-modules/lambda-function/src/main/resources/logback.xml diff --git a/aws-modules/aws-lambda-modules/pom.xml b/aws-modules/aws-lambda-modules/pom.xml index 23fb348631..9886ff58d2 100644 --- a/aws-modules/aws-lambda-modules/pom.xml +++ b/aws-modules/aws-lambda-modules/pom.xml @@ -14,9 +14,9 @@ - lambda - shipping-tracker/ShippingFunction - todo-reminder/ToDoFunction + lambda-function + shipping-tracker-lambda/ShippingFunction + todo-reminder-lambda/ToDoFunction \ No newline at end of file diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/.gitignore b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/.gitignore similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/.gitignore rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/.gitignore diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/pom.xml b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/pom.xml rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingDao.java diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/ShippingService.java diff --git a/aws-modules/aws-lambda-modules/shipping-tracker/template.yaml b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/template.yaml similarity index 100% rename from aws-modules/aws-lambda-modules/shipping-tracker/template.yaml rename to aws-modules/aws-lambda-modules/shipping-tracker-lambda/template.yaml diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/pom.xml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/pom.xml similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/pom.xml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/pom.xml diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/App.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostApi.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/PostItem.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoApi.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/api/ToDoItem.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Config.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Credentials.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/ExecutionContext.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/config/Services.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/PostService.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/java/com/baeldung/lambda/todo/service/ToDoReaderService.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/configuration.yml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/configuration.yml similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/configuration.yml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/configuration.yml diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/log4j2.xml similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/main/resources/log4j2.xml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/main/resources/log4j2.xml diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/AppUnitTest.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java b/aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/ToDoFunction/src/test/java/com/baeldung/lambda/todo/service/ToDoReaderServiceUnitTest.java diff --git a/aws-modules/aws-lambda-modules/todo-reminder/template.yaml b/aws-modules/aws-lambda-modules/todo-reminder-lambda/template.yaml similarity index 100% rename from aws-modules/aws-lambda-modules/todo-reminder/template.yaml rename to aws-modules/aws-lambda-modules/todo-reminder-lambda/template.yaml diff --git a/checker-plugin/README.md b/checker-framework/README.md similarity index 100% rename from checker-plugin/README.md rename to checker-framework/README.md diff --git a/checker-plugin/pom.xml b/checker-framework/pom.xml similarity index 98% rename from checker-plugin/pom.xml rename to checker-framework/pom.xml index e90dcf271e..a348745343 100644 --- a/checker-plugin/pom.xml +++ b/checker-framework/pom.xml @@ -3,9 +3,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - checker-plugin + checker-framework 1.0-SNAPSHOT - checker-plugin + checker-framework jar diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/FakeNumExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/FakeNumExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/FakeNumExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/FakeNumExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/FormatExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/FormatExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/FormatExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/FormatExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/KeyForExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/KeyForExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/KeyForExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/KeyForExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/NonNullExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/NonNullExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/NonNullExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/NonNullExample.java diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/RegexExample.java b/checker-framework/src/main/java/com/baeldung/typechecker/RegexExample.java similarity index 100% rename from checker-plugin/src/main/java/com/baeldung/typechecker/RegexExample.java rename to checker-framework/src/main/java/com/baeldung/typechecker/RegexExample.java diff --git a/checker-plugin/src/main/resources/logback.xml b/checker-framework/src/main/resources/logback.xml similarity index 100% rename from checker-plugin/src/main/resources/logback.xml rename to checker-framework/src/main/resources/logback.xml diff --git a/clojure-modules/ring/.gitignore b/clojure-modules/clojure-ring/.gitignore similarity index 100% rename from clojure-modules/ring/.gitignore rename to clojure-modules/clojure-ring/.gitignore diff --git a/clojure-modules/ring/README.md b/clojure-modules/clojure-ring/README.md similarity index 100% rename from clojure-modules/ring/README.md rename to clojure-modules/clojure-ring/README.md diff --git a/clojure-modules/ring/project.clj b/clojure-modules/clojure-ring/project.clj similarity index 100% rename from clojure-modules/ring/project.clj rename to clojure-modules/clojure-ring/project.clj diff --git a/clojure-modules/ring/src/ring/core.clj b/clojure-modules/clojure-ring/src/ring/core.clj similarity index 100% rename from clojure-modules/ring/src/ring/core.clj rename to clojure-modules/clojure-ring/src/ring/core.clj diff --git a/core-java-modules/core-java-jpms/pom.xml b/core-java-modules/core-java-jpms/pom.xml index 62aa49f299..3cfa0e3f45 100644 --- a/core-java-modules/core-java-jpms/pom.xml +++ b/core-java-modules/core-java-jpms/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-jpms - 0.0.1-SNAPSHOT core-java-jpms pom @@ -15,8 +14,8 @@ - decoupling-pattern1 - decoupling-pattern2 + service-provider-factory-pattern + service-loader-api-pattern diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/pom.xml similarity index 92% rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/pom.xml index 13d0b2d201..f928912ffd 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/pom.xml @@ -8,8 +8,8 @@ 1.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/consumermodule2/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/pom.xml similarity index 92% rename from core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/pom.xml index 5b2e4cfc82..13a443eab5 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT pom diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/pom.xml similarity index 91% rename from core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/pom.xml index ddb8aeccd1..bcee01f631 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/pom.xml @@ -8,8 +8,8 @@ 1.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/com/baeldung/providermodule/LowercaseTextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/providermodule/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/pom.xml similarity index 88% rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml rename to core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/pom.xml index 06ef900092..f40745541b 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml +++ b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/pom.xml @@ -8,8 +8,8 @@ 1.0 - com.baeldung.decoupling-pattern2 - decoupling-pattern2 + com.baeldung.service-loader-api-pattern + service-loader-api-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-loader-api-pattern/servicemodule2/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/pom.xml similarity index 89% rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/pom.xml index f82e72b85d..ba92733f34 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml +++ b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/pom.xml @@ -8,8 +8,8 @@ jar - com.baeldung.decoupling-pattern1 - decoupling-pattern1 + com.baeldung.service-provider-factory-pattern + service-provider-factory-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/consumermodule1/src/main/java/module-info.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml b/core-java-modules/core-java-jpms/service-provider-factory-pattern/pom.xml similarity index 91% rename from core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/pom.xml index 2121b46b82..35a9912312 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml +++ b/core-java-modules/core-java-jpms/service-provider-factory-pattern/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.decoupling-pattern1 - decoupling-pattern1 + com.baeldung.service-provider-factory-pattern + service-provider-factory-pattern 1.0-SNAPSHOT pom diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/pom.xml similarity index 86% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/pom.xml index fc4b5854f9..d6e50ee9ff 100644 --- a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml +++ b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/pom.xml @@ -9,8 +9,8 @@ jar - com.baeldung.decoupling-pattern1 - decoupling-pattern1 + com.baeldung.service-provider-factory-pattern + service-provider-factory-pattern 1.0-SNAPSHOT diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/module-info.java b/core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/module-info.java similarity index 100% rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/module-info.java rename to core-java-modules/core-java-jpms/service-provider-factory-pattern/servicemodule1/src/main/java/module-info.java diff --git a/docker-modules/docker-caching/multi-module-caching/core/pom.xml b/docker-modules/docker-caching/multi-module-caching/core-module/pom.xml similarity index 95% rename from docker-modules/docker-caching/multi-module-caching/core/pom.xml rename to docker-modules/docker-caching/multi-module-caching/core-module/pom.xml index bcfc4b5783..159d76830b 100644 --- a/docker-modules/docker-caching/multi-module-caching/core/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/core-module/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - core + core-module multi-module-caching diff --git a/docker-modules/docker-caching/multi-module-caching/core/src/main/java/com/baeldung/maven_caching/CoreClass.java b/docker-modules/docker-caching/multi-module-caching/core-module/src/main/java/com/baeldung/maven_caching/CoreClass.java similarity index 100% rename from docker-modules/docker-caching/multi-module-caching/core/src/main/java/com/baeldung/maven_caching/CoreClass.java rename to docker-modules/docker-caching/multi-module-caching/core-module/src/main/java/com/baeldung/maven_caching/CoreClass.java diff --git a/docker-modules/docker-caching/multi-module-caching/pom.xml b/docker-modules/docker-caching/multi-module-caching/pom.xml index 1fdd6173bc..b64cf1a8b8 100644 --- a/docker-modules/docker-caching/multi-module-caching/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/pom.xml @@ -10,8 +10,8 @@ pom - runner - core + runner-module + core-module diff --git a/docker-modules/docker-caching/multi-module-caching/runner/pom.xml b/docker-modules/docker-caching/multi-module-caching/runner-module/pom.xml similarity index 95% rename from docker-modules/docker-caching/multi-module-caching/runner/pom.xml rename to docker-modules/docker-caching/multi-module-caching/runner-module/pom.xml index e3f234bac0..e608706864 100644 --- a/docker-modules/docker-caching/multi-module-caching/runner/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/runner-module/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - runner + runner-module multi-module-caching @@ -14,7 +14,7 @@ com.baeldung - core + core-module 0.0.1-SNAPSHOT diff --git a/docker-modules/docker-caching/multi-module-caching/runner/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java b/docker-modules/docker-caching/multi-module-caching/runner-module/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java similarity index 100% rename from docker-modules/docker-caching/multi-module-caching/runner/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java rename to docker-modules/docker-caching/multi-module-caching/runner-module/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java diff --git a/code-generation/README.md b/google-auto-project/README.md similarity index 100% rename from code-generation/README.md rename to google-auto-project/README.md diff --git a/code-generation/pom.xml b/google-auto-project/pom.xml similarity index 96% rename from code-generation/pom.xml rename to google-auto-project/pom.xml index ed8890e1dd..839ccabc5f 100644 --- a/code-generation/pom.xml +++ b/google-auto-project/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - code-generation + google-auto-project 1.0 - code-generation + google-auto-project com.baeldung diff --git a/code-generation/src/main/java/com/baeldung/autofactory/App.java b/google-auto-project/src/main/java/com/baeldung/autofactory/App.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/App.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/App.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java b/google-auto-project/src/main/java/com/baeldung/autofactory/CustomStorage.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/CustomStorage.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java b/google-auto-project/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java b/google-auto-project/src/main/java/com/baeldung/autofactory/model/Camera.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/model/Camera.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java b/google-auto-project/src/main/java/com/baeldung/autofactory/model/Phone.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/model/Phone.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java b/google-auto-project/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java b/google-auto-project/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java diff --git a/code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java b/google-auto-project/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java rename to google-auto-project/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java diff --git a/code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java b/google-auto-project/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java rename to google-auto-project/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java diff --git a/code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java b/google-auto-project/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java rename to google-auto-project/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java diff --git a/code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java b/google-auto-project/src/main/java/com/baeldung/autoservice/TranslationService.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java rename to google-auto-project/src/main/java/com/baeldung/autoservice/TranslationService.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java b/google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoney.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoney.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java b/google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/Foo.java b/google-auto-project/src/main/java/com/baeldung/autovalue/Foo.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/Foo.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/Foo.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java b/google-auto-project/src/main/java/com/baeldung/autovalue/ImmutableMoney.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/ImmutableMoney.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java b/google-auto-project/src/main/java/com/baeldung/autovalue/MutableMoney.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/MutableMoney.java diff --git a/code-generation/src/main/java/com/baeldung/autovalue/Person.java b/google-auto-project/src/main/java/com/baeldung/autovalue/Person.java similarity index 100% rename from code-generation/src/main/java/com/baeldung/autovalue/Person.java rename to google-auto-project/src/main/java/com/baeldung/autovalue/Person.java diff --git a/code-generation/src/main/resources/logback.xml b/google-auto-project/src/main/resources/logback.xml similarity index 100% rename from code-generation/src/main/resources/logback.xml rename to google-auto-project/src/main/resources/logback.xml diff --git a/code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java b/google-auto-project/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java similarity index 100% rename from code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java rename to google-auto-project/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java diff --git a/code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java b/google-auto-project/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java similarity index 100% rename from code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java rename to google-auto-project/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java diff --git a/code-generation/src/test/java/com/baeldung/autovalue/PersonUnitTest.java b/google-auto-project/src/test/java/com/baeldung/autovalue/PersonUnitTest.java similarity index 100% rename from code-generation/src/test/java/com/baeldung/autovalue/PersonUnitTest.java rename to google-auto-project/src/test/java/com/baeldung/autovalue/PersonUnitTest.java diff --git a/pom.xml b/pom.xml index 6f79e56ba1..428aa1d268 100644 --- a/pom.xml +++ b/pom.xml @@ -330,8 +330,8 @@ parent-spring-5 parent-java - checker-plugin - + checker-framework + core-java-modules/core-java core-java-modules/core-java-8 @@ -523,8 +523,8 @@ parent-spring-5 parent-java - checker-plugin - + checker-framework + core-java-modules/core-java core-java-modules/core-java-8 @@ -854,7 +854,7 @@ axon bazel - code-generation + google-auto-project ddd discord4j disruptor @@ -1107,7 +1107,7 @@ axon bazel - code-generation + google-auto-project ddd discord4j disruptor From 63c4293b6c5de8f2ab1637ed8ae9997be2d603c2 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 15 Apr 2023 20:02:36 +0300 Subject: [PATCH 37/39] [JAVA-18446] Clean up (#13845) --- libraries-files/pom.xml | 20 +++++++++++--------- libraries-http/pom.xml | 5 ----- libraries-primitive/pom.xml | 1 - logging-modules/log4j2/pom.xml | 1 - 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/libraries-files/pom.xml b/libraries-files/pom.xml index b36dc150a8..e4b3ffcdb2 100644 --- a/libraries-files/pom.xml +++ b/libraries-files/pom.xml @@ -38,22 +38,24 @@ ${jackson.version} - com.itextpdf - itext7-core - 7.2.4 - pom + com.itextpdf + itext7-core + ${itext7-core.version} + pom - - org.assertj - assertj-core - 3.23.1 - test + + org.assertj + assertj-core + ${assertj-core.version} + test 0.5.4 2.8.0 + 7.2.4 + 3.23.1 \ No newline at end of file diff --git a/libraries-http/pom.xml b/libraries-http/pom.xml index 0077a5047e..18ba571f60 100644 --- a/libraries-http/pom.xml +++ b/libraries-http/pom.xml @@ -52,11 +52,6 @@ async-http-client ${async.http.client.version} - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - com.google.code.gson gson diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml index badcfc443d..114ec64848 100644 --- a/libraries-primitive/pom.xml +++ b/libraries-primitive/pom.xml @@ -3,7 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung libraries-primitive 1.0-SNAPSHOT libraries-primitive diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index 9fa58769b2..da2984442c 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -63,7 +63,6 @@ org.apache.maven.plugins maven-compiler-plugin - ${maven-compiler-plugin.version} none From 8b674cd074c75d0c7217267468a919f7717ff7cb Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Sun, 16 Apr 2023 04:01:41 +0530 Subject: [PATCH 38/39] BAEL-5834: Add scenario for maven dependency convergence (#13822) * BAEL-5834: Add scenario for maven dependency convergence * BAEL-5834: Remove Makefile to reduce complexity * BAEL-5834: Remove reference of Makefile --------- Co-authored-by: Tapan Avasthi --- .../dependencyconvergence.xml | 22 ++++++++++++++++ ...dependencyconvergence_exclude_scenario.xml | 26 +++++++++++++++++++ ...dependencyconvergence_include_scenario.xml | 26 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 maven-modules/version-collision/dependencyconvergence.xml create mode 100644 maven-modules/version-collision/dependencyconvergence_exclude_scenario.xml create mode 100644 maven-modules/version-collision/dependencyconvergence_include_scenario.xml diff --git a/maven-modules/version-collision/dependencyconvergence.xml b/maven-modules/version-collision/dependencyconvergence.xml new file mode 100644 index 0000000000..8f57cbf1d5 --- /dev/null +++ b/maven-modules/version-collision/dependencyconvergence.xml @@ -0,0 +1,22 @@ + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.3.0 + + + enforce + + + + + + + enforce + + + + + + \ No newline at end of file diff --git a/maven-modules/version-collision/dependencyconvergence_exclude_scenario.xml b/maven-modules/version-collision/dependencyconvergence_exclude_scenario.xml new file mode 100644 index 0000000000..32b0462a11 --- /dev/null +++ b/maven-modules/version-collision/dependencyconvergence_exclude_scenario.xml @@ -0,0 +1,26 @@ + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.3.0 + + + enforce + + + + + com.google.guava:guava + + + + + + enforce + + + + + + \ No newline at end of file diff --git a/maven-modules/version-collision/dependencyconvergence_include_scenario.xml b/maven-modules/version-collision/dependencyconvergence_include_scenario.xml new file mode 100644 index 0000000000..9e4680fc91 --- /dev/null +++ b/maven-modules/version-collision/dependencyconvergence_include_scenario.xml @@ -0,0 +1,26 @@ + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.3.0 + + + enforce + + + + + com.google.guava:guava + + + + + + enforce + + + + + + \ No newline at end of file From 737430655c632e4baadf6787d0e084995fb9a55b Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Sun, 16 Apr 2023 18:32:18 +0200 Subject: [PATCH 39/39] BAEL-6110: Fix Spring Data JPA Exception: No Property Found for Type (#13753) --- .../spring-boot-data-3/pom.xml | 4 ++ .../NoPropertyFoundApplication.java | 13 ++++++ .../nopropertyfound/config/DbConfig.java | 20 +++++++++ .../nopropertyfound/model/Person.java | 41 +++++++++++++++++++ .../repository/PersonRepository.java | 15 +++++++ .../src/main/resources/application.properties | 7 +++- .../src/main/resources/data.sql | 3 ++ .../src/main/resources/schema.sql | 6 +++ .../PersonRepositoryIntegrationTest.java | 28 +++++++++++++ 9 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/NoPropertyFoundApplication.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/config/DbConfig.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/model/Person.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/repository/PersonRepository.java create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/resources/data.sql create mode 100644 spring-boot-modules/spring-boot-data-3/src/main/resources/schema.sql create mode 100644 spring-boot-modules/spring-boot-data-3/src/test/java/com/baeldung/nopropertyfound/PersonRepositoryIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index fcf7451c61..4903d2ea26 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/pom.xml @@ -34,6 +34,10 @@ mysql-connector-java runtime + + com.h2database + h2 + org.springframework.boot spring-boot-starter-test diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/NoPropertyFoundApplication.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/NoPropertyFoundApplication.java new file mode 100644 index 0000000000..276df9535b --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/NoPropertyFoundApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.nopropertyfound; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class NoPropertyFoundApplication { + + public static void main(String[] args) { + SpringApplication.run(NoPropertyFoundApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/config/DbConfig.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/config/DbConfig.java new file mode 100644 index 0000000000..9a589e55a3 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/config/DbConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.nopropertyfound.config; + +import javax.sql.DataSource; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DbConfig { + + @Bean + @ConfigurationProperties(prefix = "h2.datasource") + public DataSource dataSource() { + return DataSourceBuilder.create() + .build(); + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/model/Person.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/model/Person.java new file mode 100644 index 0000000000..3392d3ec67 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/model/Person.java @@ -0,0 +1,41 @@ +package com.baeldung.nopropertyfound.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Person { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + private String firstName; + private String lastName; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/repository/PersonRepository.java b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/repository/PersonRepository.java new file mode 100644 index 0000000000..900c391c93 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/java/com/baeldung/nopropertyfound/repository/PersonRepository.java @@ -0,0 +1,15 @@ +package com.baeldung.nopropertyfound.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.nopropertyfound.model.Person; + +@Repository +public interface PersonRepository extends JpaRepository { + + // findByFirsttName will cause Spring Data to throw PropertyReferenceException + // Person findByFirsttName(String firstName); + Person findByFirstName(String firstName); + +} diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties b/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties index cbe044134f..71f39e0ee3 100644 --- a/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/application.properties @@ -4,4 +4,9 @@ spring.datasource.username=root spring.datasource.password=root spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.ddl-auto=none -spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false \ No newline at end of file +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false + +h2.datasource.url=jdbc:h2:mem:testdb +h2.datasource.driver-class-name=org.h2.Driver +h2.datasource.username=sa +h2.datasource.password= diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/data.sql b/spring-boot-modules/spring-boot-data-3/src/main/resources/data.sql new file mode 100644 index 0000000000..5623bbfadf --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/data.sql @@ -0,0 +1,3 @@ +INSERT INTO person (first_name, last_name) VALUES('Azhrioun', 'Abderrahim'); +INSERT INTO person (first_name, last_name) VALUES('Brian', 'Wheeler'); +INSERT INTO person (first_name, last_name) VALUES('Dave', 'Anderson'); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-3/src/main/resources/schema.sql b/spring-boot-modules/spring-boot-data-3/src/main/resources/schema.sql new file mode 100644 index 0000000000..738ef25298 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/main/resources/schema.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS person; +CREATE TABLE person( + id INT AUTO_INCREMENT PRIMARY KEY, + first_name VARCHAR(200), + last_name VARCHAR(200) +) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-data-3/src/test/java/com/baeldung/nopropertyfound/PersonRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot-data-3/src/test/java/com/baeldung/nopropertyfound/PersonRepositoryIntegrationTest.java new file mode 100644 index 0000000000..2a9d1a46f2 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-3/src/test/java/com/baeldung/nopropertyfound/PersonRepositoryIntegrationTest.java @@ -0,0 +1,28 @@ +package com.baeldung.nopropertyfound; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import com.baeldung.nopropertyfound.model.Person; +import com.baeldung.nopropertyfound.repository.PersonRepository; + +@DataJpaTest +class PersonRepositoryIntegrationTest { + + @Autowired + private PersonRepository personRepository; + + @Test + void givenQueryMethod_whenUsingValidProperty_thenCorrect() { + + Person person = personRepository.findByFirstName("Azhrioun"); + + assertNotNull(person); + assertEquals("Abderrahim", person.getLastName()); + } + +}