From 33fef603b39731821905450722855c150cecdb7b Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 18 Apr 2017 14:18:31 +0100 Subject: [PATCH 01/26] BAEL-434 Moved project from roo to spring-roo folder. (#1673) * Code for Dependency Injection Article. * Added Java based configuration. Downloaded formatter.xml and reformatted all changed files. Manually changed tab into 4 spaces in XML configuration files. * BAEL-434 - Spring Roo project files generated by Spring Roo. No formatting applied. Added POM, java and resources folders. * Moved project from roo to spring-roo folder. --- {roo => spring-roo}/pom.xml | 0 .../src/main/java/com/baeldung/RooApplication.java | 0 ...ingDataJpaDetachableRepositoryConfiguration.java | 0 ...onfiguration_Roo_Jpa_Repository_Configuration.aj | 0 .../com/baeldung/config/WebMvcConfiguration.java | 0 ...MvcConfiguration_Roo_ThymeleafUIConfiguration.aj | 0 .../WebMvcConfiguration_Roo_WebMvcConfiguration.aj | 0 .../baeldung/config/jackson/DomainModelModule.java | 0 .../DomainModelModule_Roo_DomainModelModule.aj | 0 .../src/main/java/com/baeldung/domain/Book.java | 0 .../java/com/baeldung/domain/Book_Roo_Equals.aj | 0 .../java/com/baeldung/domain/Book_Roo_JavaBean.aj | 0 .../java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj | 0 .../java/com/baeldung/domain/Book_Roo_ToString.aj | 0 .../com/baeldung/repository/BookRepository.java | 0 .../baeldung/repository/BookRepositoryCustom.java | 0 ...ookRepositoryCustom_Roo_Jpa_Repository_Custom.aj | 0 .../com/baeldung/repository/BookRepositoryImpl.java | 0 .../BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj | 0 .../repository/BookRepository_Roo_Jpa_Repository.aj | 0 .../java/com/baeldung/service/api/BookService.java | 0 .../baeldung/service/api/BookService_Roo_Service.aj | 0 .../com/baeldung/service/impl/BookServiceImpl.java | 0 .../impl/BookServiceImpl_Roo_Service_Impl.aj | 0 .../java/com/baeldung/web/BookDeserializer.java | 0 .../web/BookDeserializer_Roo_EntityDeserializer.aj | 0 .../main/java/com/baeldung/web/BookJsonMixin.java | 0 .../web/BooksCollectionThymeleafController.java | 0 ...sCollectionThymeleafController_Roo_Controller.aj | 0 ...ksCollectionThymeleafController_Roo_Thymeleaf.aj | 0 .../web/BooksCollectionThymeleafLinkFactory.java | 0 ...ollectionThymeleafLinkFactory_Roo_LinkFactory.aj | 0 .../baeldung/web/BooksItemThymeleafController.java | 0 .../BooksItemThymeleafController_Roo_Controller.aj | 0 .../BooksItemThymeleafController_Roo_Thymeleaf.aj | 0 .../baeldung/web/BooksItemThymeleafLinkFactory.java | 0 ...BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj | 0 .../main/java/com/baeldung/web/MainController.java | 0 .../MainController_Roo_Thymeleaf_MainController.aj | 0 .../web/reports/ExportingErrorException.java | 0 .../web/reports/JasperReportsCsvExporter.java | 0 .../baeldung/web/reports/JasperReportsExporter.java | 0 .../web/reports/JasperReportsPdfExporter.java | 0 .../web/reports/JasperReportsXlsExporter.java | 0 .../src/main/resources/application-dev.properties | 0 .../src/main/resources/application.properties | 0 {roo => spring-roo}/src/main/resources/banner.txt | 0 .../src/main/resources/messages.properties | 0 .../main/resources/static/public/css/springroo.css | 0 .../src/main/resources/static/public/css/theme.css | 0 .../static/public/fonts/fontawesome-webfont.eot | Bin .../static/public/fonts/fontawesome-webfont.svg | 0 .../static/public/fonts/fontawesome-webfont.ttf | Bin .../static/public/fonts/fontawesome-webfont.woff | Bin .../static/public/fonts/fontawesome-webfont.woff2 | Bin .../public/fonts/glyphicons-halflings-regular.eot | Bin .../public/fonts/glyphicons-halflings-regular.svg | 0 .../public/fonts/glyphicons-halflings-regular.ttf | Bin .../public/fonts/glyphicons-halflings-regular.woff | Bin .../public/fonts/glyphicons-halflings-regular.woff2 | Bin .../static/public/img/apple-touch-icon.png | Bin .../src/main/resources/static/public/img/en.png | Bin .../src/main/resources/static/public/img/es.png | Bin .../main/resources/static/public/img/favicon.ico | Bin .../src/main/resources/static/public/img/geo.png | Bin .../src/main/resources/static/public/img/logo.png | Bin .../main/resources/static/public/img/owasp_logo.png | Bin .../resources/static/public/img/springroo-logo.png | Bin .../static/public/js/dataTables.advanced.js | 0 .../static/public/js/datatables-defaults.js | 0 .../static/public/js/datetimepicker-defaults.js | 0 .../static/public/js/inputmask-defaults.js | 0 .../src/main/resources/static/public/js/main.js | 0 .../resources/static/public/js/moment-defaults.js | 0 .../resources/static/public/js/moment-locale-es.js | 0 .../resources/static/public/js/select2-defaults.js | 0 .../static/public/js/validation-defaults.js | 0 .../src/main/resources/templates/accessibility.html | 0 .../src/main/resources/templates/books/create.html | 0 .../src/main/resources/templates/books/edit.html | 0 .../src/main/resources/templates/books/list.html | 0 .../src/main/resources/templates/books/show.html | 0 .../main/resources/templates/books/showInline.html | 0 .../src/main/resources/templates/error.html | 0 .../main/resources/templates/fragments/footer.html | 0 .../main/resources/templates/fragments/header.html | 0 .../templates/fragments/js/datatables-locale.js | 0 .../templates/fragments/js/datatables.html | 0 .../resources/templates/fragments/js/select2.html | 0 .../resources/templates/fragments/languages.html | 0 .../main/resources/templates/fragments/menu.html | 0 .../fragments/modal-confirm-delete-batch.html | 0 .../templates/fragments/modal-confirm-delete.html | 0 .../templates/fragments/modal-confirm.html | 0 .../fragments/modal-export-empty-error.html | 0 .../main/resources/templates/fragments/modal.html | 0 .../templates/fragments/session-links.html | 0 .../src/main/resources/templates/index.html | 0 .../templates/layouts/default-layout-no-menu.html | 0 .../resources/templates/layouts/default-layout.html | 0 .../templates/layouts/default-list-layout.html | 0 .../resources/templates/layouts/home-layout.html | 0 .../src/main/resources/templates/login.html | 0 .../templates/reports/export_default.jrxml | 0 104 files changed, 0 insertions(+), 0 deletions(-) rename {roo => spring-roo}/pom.xml (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/RooApplication.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/WebMvcConfiguration.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/jackson/DomainModelModule.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepository.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryCustom.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryImpl.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/api/BookService.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/impl/BookServiceImpl.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BookDeserializer.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BookJsonMixin.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafController.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/MainController.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/ExportingErrorException.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java (100%) rename {roo => spring-roo}/src/main/resources/application-dev.properties (100%) rename {roo => spring-roo}/src/main/resources/application.properties (100%) rename {roo => spring-roo}/src/main/resources/banner.txt (100%) rename {roo => spring-roo}/src/main/resources/messages.properties (100%) rename {roo => spring-roo}/src/main/resources/static/public/css/springroo.css (100%) rename {roo => spring-roo}/src/main/resources/static/public/css/theme.css (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.eot (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.svg (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.ttf (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.woff (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/apple-touch-icon.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/en.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/es.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/favicon.ico (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/geo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/logo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/owasp_logo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/springroo-logo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/dataTables.advanced.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/datatables-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/datetimepicker-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/inputmask-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/main.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/moment-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/moment-locale-es.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/select2-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/validation-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/templates/accessibility.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/create.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/edit.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/list.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/show.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/showInline.html (100%) rename {roo => spring-roo}/src/main/resources/templates/error.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/footer.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/header.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/js/datatables-locale.js (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/js/datatables.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/js/select2.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/languages.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/menu.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-confirm-delete-batch.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-confirm-delete.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-confirm.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-export-empty-error.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/session-links.html (100%) rename {roo => spring-roo}/src/main/resources/templates/index.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/default-layout-no-menu.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/default-layout.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/default-list-layout.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/home-layout.html (100%) rename {roo => spring-roo}/src/main/resources/templates/login.html (100%) rename {roo => spring-roo}/src/main/resources/templates/reports/export_default.jrxml (100%) diff --git a/roo/pom.xml b/spring-roo/pom.xml similarity index 100% rename from roo/pom.xml rename to spring-roo/pom.xml diff --git a/roo/src/main/java/com/baeldung/RooApplication.java b/spring-roo/src/main/java/com/baeldung/RooApplication.java similarity index 100% rename from roo/src/main/java/com/baeldung/RooApplication.java rename to spring-roo/src/main/java/com/baeldung/RooApplication.java diff --git a/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java b/spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java similarity index 100% rename from roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java rename to spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java diff --git a/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj b/spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj rename to spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java b/spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java similarity index 100% rename from roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java rename to spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj b/spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj rename to spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj b/spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj rename to spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj diff --git a/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java b/spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java similarity index 100% rename from roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java rename to spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java diff --git a/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj b/spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj rename to spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book.java b/spring-roo/src/main/java/com/baeldung/domain/Book.java similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book.java rename to spring-roo/src/main/java/com/baeldung/domain/Book.java diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj diff --git a/roo/src/main/java/com/baeldung/repository/BookRepository.java b/spring-roo/src/main/java/com/baeldung/repository/BookRepository.java similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepository.java rename to spring-roo/src/main/java/com/baeldung/repository/BookRepository.java diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj diff --git a/roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj b/spring-roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj rename to spring-roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj diff --git a/roo/src/main/java/com/baeldung/service/api/BookService.java b/spring-roo/src/main/java/com/baeldung/service/api/BookService.java similarity index 100% rename from roo/src/main/java/com/baeldung/service/api/BookService.java rename to spring-roo/src/main/java/com/baeldung/service/api/BookService.java diff --git a/roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj b/spring-roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj similarity index 100% rename from roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj rename to spring-roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj diff --git a/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java b/spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java similarity index 100% rename from roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java rename to spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java diff --git a/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj b/spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj similarity index 100% rename from roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj rename to spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj diff --git a/roo/src/main/java/com/baeldung/web/BookDeserializer.java b/spring-roo/src/main/java/com/baeldung/web/BookDeserializer.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BookDeserializer.java rename to spring-roo/src/main/java/com/baeldung/web/BookDeserializer.java diff --git a/roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj b/spring-roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj rename to spring-roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj diff --git a/roo/src/main/java/com/baeldung/web/BookJsonMixin.java b/spring-roo/src/main/java/com/baeldung/web/BookJsonMixin.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BookJsonMixin.java rename to spring-roo/src/main/java/com/baeldung/web/BookJsonMixin.java diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj diff --git a/roo/src/main/java/com/baeldung/web/MainController.java b/spring-roo/src/main/java/com/baeldung/web/MainController.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/MainController.java rename to spring-roo/src/main/java/com/baeldung/web/MainController.java diff --git a/roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj b/spring-roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj rename to spring-roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj diff --git a/roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java b/spring-roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java rename to spring-roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java diff --git a/roo/src/main/resources/application-dev.properties b/spring-roo/src/main/resources/application-dev.properties similarity index 100% rename from roo/src/main/resources/application-dev.properties rename to spring-roo/src/main/resources/application-dev.properties diff --git a/roo/src/main/resources/application.properties b/spring-roo/src/main/resources/application.properties similarity index 100% rename from roo/src/main/resources/application.properties rename to spring-roo/src/main/resources/application.properties diff --git a/roo/src/main/resources/banner.txt b/spring-roo/src/main/resources/banner.txt similarity index 100% rename from roo/src/main/resources/banner.txt rename to spring-roo/src/main/resources/banner.txt diff --git a/roo/src/main/resources/messages.properties b/spring-roo/src/main/resources/messages.properties similarity index 100% rename from roo/src/main/resources/messages.properties rename to spring-roo/src/main/resources/messages.properties diff --git a/roo/src/main/resources/static/public/css/springroo.css b/spring-roo/src/main/resources/static/public/css/springroo.css similarity index 100% rename from roo/src/main/resources/static/public/css/springroo.css rename to spring-roo/src/main/resources/static/public/css/springroo.css diff --git a/roo/src/main/resources/static/public/css/theme.css b/spring-roo/src/main/resources/static/public/css/theme.css similarity index 100% rename from roo/src/main/resources/static/public/css/theme.css rename to spring-roo/src/main/resources/static/public/css/theme.css diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 diff --git a/roo/src/main/resources/static/public/img/apple-touch-icon.png b/spring-roo/src/main/resources/static/public/img/apple-touch-icon.png similarity index 100% rename from roo/src/main/resources/static/public/img/apple-touch-icon.png rename to spring-roo/src/main/resources/static/public/img/apple-touch-icon.png diff --git a/roo/src/main/resources/static/public/img/en.png b/spring-roo/src/main/resources/static/public/img/en.png similarity index 100% rename from roo/src/main/resources/static/public/img/en.png rename to spring-roo/src/main/resources/static/public/img/en.png diff --git a/roo/src/main/resources/static/public/img/es.png b/spring-roo/src/main/resources/static/public/img/es.png similarity index 100% rename from roo/src/main/resources/static/public/img/es.png rename to spring-roo/src/main/resources/static/public/img/es.png diff --git a/roo/src/main/resources/static/public/img/favicon.ico b/spring-roo/src/main/resources/static/public/img/favicon.ico similarity index 100% rename from roo/src/main/resources/static/public/img/favicon.ico rename to spring-roo/src/main/resources/static/public/img/favicon.ico diff --git a/roo/src/main/resources/static/public/img/geo.png b/spring-roo/src/main/resources/static/public/img/geo.png similarity index 100% rename from roo/src/main/resources/static/public/img/geo.png rename to spring-roo/src/main/resources/static/public/img/geo.png diff --git a/roo/src/main/resources/static/public/img/logo.png b/spring-roo/src/main/resources/static/public/img/logo.png similarity index 100% rename from roo/src/main/resources/static/public/img/logo.png rename to spring-roo/src/main/resources/static/public/img/logo.png diff --git a/roo/src/main/resources/static/public/img/owasp_logo.png b/spring-roo/src/main/resources/static/public/img/owasp_logo.png similarity index 100% rename from roo/src/main/resources/static/public/img/owasp_logo.png rename to spring-roo/src/main/resources/static/public/img/owasp_logo.png diff --git a/roo/src/main/resources/static/public/img/springroo-logo.png b/spring-roo/src/main/resources/static/public/img/springroo-logo.png similarity index 100% rename from roo/src/main/resources/static/public/img/springroo-logo.png rename to spring-roo/src/main/resources/static/public/img/springroo-logo.png diff --git a/roo/src/main/resources/static/public/js/dataTables.advanced.js b/spring-roo/src/main/resources/static/public/js/dataTables.advanced.js similarity index 100% rename from roo/src/main/resources/static/public/js/dataTables.advanced.js rename to spring-roo/src/main/resources/static/public/js/dataTables.advanced.js diff --git a/roo/src/main/resources/static/public/js/datatables-defaults.js b/spring-roo/src/main/resources/static/public/js/datatables-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/datatables-defaults.js rename to spring-roo/src/main/resources/static/public/js/datatables-defaults.js diff --git a/roo/src/main/resources/static/public/js/datetimepicker-defaults.js b/spring-roo/src/main/resources/static/public/js/datetimepicker-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/datetimepicker-defaults.js rename to spring-roo/src/main/resources/static/public/js/datetimepicker-defaults.js diff --git a/roo/src/main/resources/static/public/js/inputmask-defaults.js b/spring-roo/src/main/resources/static/public/js/inputmask-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/inputmask-defaults.js rename to spring-roo/src/main/resources/static/public/js/inputmask-defaults.js diff --git a/roo/src/main/resources/static/public/js/main.js b/spring-roo/src/main/resources/static/public/js/main.js similarity index 100% rename from roo/src/main/resources/static/public/js/main.js rename to spring-roo/src/main/resources/static/public/js/main.js diff --git a/roo/src/main/resources/static/public/js/moment-defaults.js b/spring-roo/src/main/resources/static/public/js/moment-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/moment-defaults.js rename to spring-roo/src/main/resources/static/public/js/moment-defaults.js diff --git a/roo/src/main/resources/static/public/js/moment-locale-es.js b/spring-roo/src/main/resources/static/public/js/moment-locale-es.js similarity index 100% rename from roo/src/main/resources/static/public/js/moment-locale-es.js rename to spring-roo/src/main/resources/static/public/js/moment-locale-es.js diff --git a/roo/src/main/resources/static/public/js/select2-defaults.js b/spring-roo/src/main/resources/static/public/js/select2-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/select2-defaults.js rename to spring-roo/src/main/resources/static/public/js/select2-defaults.js diff --git a/roo/src/main/resources/static/public/js/validation-defaults.js b/spring-roo/src/main/resources/static/public/js/validation-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/validation-defaults.js rename to spring-roo/src/main/resources/static/public/js/validation-defaults.js diff --git a/roo/src/main/resources/templates/accessibility.html b/spring-roo/src/main/resources/templates/accessibility.html similarity index 100% rename from roo/src/main/resources/templates/accessibility.html rename to spring-roo/src/main/resources/templates/accessibility.html diff --git a/roo/src/main/resources/templates/books/create.html b/spring-roo/src/main/resources/templates/books/create.html similarity index 100% rename from roo/src/main/resources/templates/books/create.html rename to spring-roo/src/main/resources/templates/books/create.html diff --git a/roo/src/main/resources/templates/books/edit.html b/spring-roo/src/main/resources/templates/books/edit.html similarity index 100% rename from roo/src/main/resources/templates/books/edit.html rename to spring-roo/src/main/resources/templates/books/edit.html diff --git a/roo/src/main/resources/templates/books/list.html b/spring-roo/src/main/resources/templates/books/list.html similarity index 100% rename from roo/src/main/resources/templates/books/list.html rename to spring-roo/src/main/resources/templates/books/list.html diff --git a/roo/src/main/resources/templates/books/show.html b/spring-roo/src/main/resources/templates/books/show.html similarity index 100% rename from roo/src/main/resources/templates/books/show.html rename to spring-roo/src/main/resources/templates/books/show.html diff --git a/roo/src/main/resources/templates/books/showInline.html b/spring-roo/src/main/resources/templates/books/showInline.html similarity index 100% rename from roo/src/main/resources/templates/books/showInline.html rename to spring-roo/src/main/resources/templates/books/showInline.html diff --git a/roo/src/main/resources/templates/error.html b/spring-roo/src/main/resources/templates/error.html similarity index 100% rename from roo/src/main/resources/templates/error.html rename to spring-roo/src/main/resources/templates/error.html diff --git a/roo/src/main/resources/templates/fragments/footer.html b/spring-roo/src/main/resources/templates/fragments/footer.html similarity index 100% rename from roo/src/main/resources/templates/fragments/footer.html rename to spring-roo/src/main/resources/templates/fragments/footer.html diff --git a/roo/src/main/resources/templates/fragments/header.html b/spring-roo/src/main/resources/templates/fragments/header.html similarity index 100% rename from roo/src/main/resources/templates/fragments/header.html rename to spring-roo/src/main/resources/templates/fragments/header.html diff --git a/roo/src/main/resources/templates/fragments/js/datatables-locale.js b/spring-roo/src/main/resources/templates/fragments/js/datatables-locale.js similarity index 100% rename from roo/src/main/resources/templates/fragments/js/datatables-locale.js rename to spring-roo/src/main/resources/templates/fragments/js/datatables-locale.js diff --git a/roo/src/main/resources/templates/fragments/js/datatables.html b/spring-roo/src/main/resources/templates/fragments/js/datatables.html similarity index 100% rename from roo/src/main/resources/templates/fragments/js/datatables.html rename to spring-roo/src/main/resources/templates/fragments/js/datatables.html diff --git a/roo/src/main/resources/templates/fragments/js/select2.html b/spring-roo/src/main/resources/templates/fragments/js/select2.html similarity index 100% rename from roo/src/main/resources/templates/fragments/js/select2.html rename to spring-roo/src/main/resources/templates/fragments/js/select2.html diff --git a/roo/src/main/resources/templates/fragments/languages.html b/spring-roo/src/main/resources/templates/fragments/languages.html similarity index 100% rename from roo/src/main/resources/templates/fragments/languages.html rename to spring-roo/src/main/resources/templates/fragments/languages.html diff --git a/roo/src/main/resources/templates/fragments/menu.html b/spring-roo/src/main/resources/templates/fragments/menu.html similarity index 100% rename from roo/src/main/resources/templates/fragments/menu.html rename to spring-roo/src/main/resources/templates/fragments/menu.html diff --git a/roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html b/spring-roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html rename to spring-roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html diff --git a/roo/src/main/resources/templates/fragments/modal-confirm-delete.html b/spring-roo/src/main/resources/templates/fragments/modal-confirm-delete.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-confirm-delete.html rename to spring-roo/src/main/resources/templates/fragments/modal-confirm-delete.html diff --git a/roo/src/main/resources/templates/fragments/modal-confirm.html b/spring-roo/src/main/resources/templates/fragments/modal-confirm.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-confirm.html rename to spring-roo/src/main/resources/templates/fragments/modal-confirm.html diff --git a/roo/src/main/resources/templates/fragments/modal-export-empty-error.html b/spring-roo/src/main/resources/templates/fragments/modal-export-empty-error.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-export-empty-error.html rename to spring-roo/src/main/resources/templates/fragments/modal-export-empty-error.html diff --git a/roo/src/main/resources/templates/fragments/modal.html b/spring-roo/src/main/resources/templates/fragments/modal.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal.html rename to spring-roo/src/main/resources/templates/fragments/modal.html diff --git a/roo/src/main/resources/templates/fragments/session-links.html b/spring-roo/src/main/resources/templates/fragments/session-links.html similarity index 100% rename from roo/src/main/resources/templates/fragments/session-links.html rename to spring-roo/src/main/resources/templates/fragments/session-links.html diff --git a/roo/src/main/resources/templates/index.html b/spring-roo/src/main/resources/templates/index.html similarity index 100% rename from roo/src/main/resources/templates/index.html rename to spring-roo/src/main/resources/templates/index.html diff --git a/roo/src/main/resources/templates/layouts/default-layout-no-menu.html b/spring-roo/src/main/resources/templates/layouts/default-layout-no-menu.html similarity index 100% rename from roo/src/main/resources/templates/layouts/default-layout-no-menu.html rename to spring-roo/src/main/resources/templates/layouts/default-layout-no-menu.html diff --git a/roo/src/main/resources/templates/layouts/default-layout.html b/spring-roo/src/main/resources/templates/layouts/default-layout.html similarity index 100% rename from roo/src/main/resources/templates/layouts/default-layout.html rename to spring-roo/src/main/resources/templates/layouts/default-layout.html diff --git a/roo/src/main/resources/templates/layouts/default-list-layout.html b/spring-roo/src/main/resources/templates/layouts/default-list-layout.html similarity index 100% rename from roo/src/main/resources/templates/layouts/default-list-layout.html rename to spring-roo/src/main/resources/templates/layouts/default-list-layout.html diff --git a/roo/src/main/resources/templates/layouts/home-layout.html b/spring-roo/src/main/resources/templates/layouts/home-layout.html similarity index 100% rename from roo/src/main/resources/templates/layouts/home-layout.html rename to spring-roo/src/main/resources/templates/layouts/home-layout.html diff --git a/roo/src/main/resources/templates/login.html b/spring-roo/src/main/resources/templates/login.html similarity index 100% rename from roo/src/main/resources/templates/login.html rename to spring-roo/src/main/resources/templates/login.html diff --git a/roo/src/main/resources/templates/reports/export_default.jrxml b/spring-roo/src/main/resources/templates/reports/export_default.jrxml similarity index 100% rename from roo/src/main/resources/templates/reports/export_default.jrxml rename to spring-roo/src/main/resources/templates/reports/export_default.jrxml From dc561548b3de226278109d576de593c6a004c69c Mon Sep 17 00:00:00 2001 From: baljeet20 Date: Tue, 18 Apr 2017 23:11:25 +0530 Subject: [PATCH 02/26] BAEL-788 Added the review comment changes (#1672) * BAEL-788 Added java config * BAEL-788 Removed XML config * added .gitignore * amoved unused imports * renamed test --- mybatis/.gitignore | 16 ++ .../baeldung/mybatis/utils/MyBatisUtil.java | 3 - .../mybatis/mapper/PersonMapperTest.java | 145 ------------------ 3 files changed, 16 insertions(+), 148 deletions(-) create mode 100644 mybatis/.gitignore delete mode 100644 mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java diff --git a/mybatis/.gitignore b/mybatis/.gitignore new file mode 100644 index 0000000000..a5ecefc44c --- /dev/null +++ b/mybatis/.gitignore @@ -0,0 +1,16 @@ +*.class + +.settings +.project +*.log + +#folders# +/target +/src/main/webapp/WEB-INF/classes +*/META-INF/* +/testdb1 + +# Packaged files # +*.jar +*.war +*.ear diff --git a/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java b/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java index fb8e15245a..da323a5c24 100644 --- a/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java +++ b/mybatis/src/main/java/com/baeldung/mybatis/utils/MyBatisUtil.java @@ -3,7 +3,6 @@ package com.baeldung.mybatis.utils; import com.baeldung.mybatis.mapper.AddressMapper; import com.baeldung.mybatis.mapper.PersonMapper; import org.apache.ibatis.datasource.pooled.PooledDataSource; -import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.SQL; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; @@ -12,8 +11,6 @@ import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import javax.sql.DataSource; -import java.io.IOException; -import java.io.InputStream; public class MyBatisUtil { public static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver"; diff --git a/mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java b/mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java deleted file mode 100644 index 8dbf7d2589..0000000000 --- a/mybatis/src/test/java/com/baeldung/mybatis/mapper/PersonMapperTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.baeldung.mybatis.mapper; - -import com.baeldung.mybatis.model.Address; -import com.baeldung.mybatis.model.Person; -import com.baeldung.mybatis.utils.MyBatisUtil; -import org.apache.ibatis.session.SqlSession; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Map; - -import static junit.framework.TestCase.assertEquals; - -public class PersonMapperTest { - - SqlSession session; - - @Before - public void setup() throws SQLException { - - session = MyBatisUtil.buildqlSessionFactory().openSession(); - createTables(session); - - } - - private void createTables(SqlSession session) throws SQLException { - - String createPersonTable = "create table person (" + "personId integer not null generated always as" - + " identity (start with 1, increment by 1), " + "name varchar(30) not null, " - + "constraint primary_key_person primary key (personId))"; - - String createAddressTable = "create table address (" + "addressId integer not null generated always as" - + " identity (start with 1, increment by 1), " + "streetAddress varchar(300), personId integer, " - + "constraint primary_key_address primary key (addressId))"; - - String alterTable = "ALTER TABLE " - + " address ADD CONSTRAINT fk_person FOREIGN KEY (personId) REFERENCES person (personId)"; - - session.getConnection().createStatement().execute(createPersonTable); - session.getConnection().createStatement().execute(createAddressTable); - session.getConnection().createStatement().execute(alterTable); - - } - - @Test - public void whenPersonAdressSaved_ThenPersonAddressCanBeQueried() { - Person person = new Person("Baljeet S"); - Address address = new Address("Pune"); - PersonMapper personMapper = session.getMapper(PersonMapper.class); - Integer id = personMapper.save(person); - address.setPersonId(id); - AddressMapper addressMapper = session.getMapper(AddressMapper.class); - addressMapper.saveAddress(address); - - Person returnedPerson = personMapper.getPersonById(id); - assertEquals("Baljeet S", returnedPerson.getName()); - assertEquals("Pune", returnedPerson.getAddresses().get(0).getStreetAddress()); - } - - @Test - public void whenPersonSaved_ThenPersonCanBeQueried() { - Person person = new Person("Baljeet S"); - Address address = new Address("Pune"); - PersonMapper personMapper = session.getMapper(PersonMapper.class); - Integer id = personMapper.save(person); - address.setPersonId(id); - AddressMapper addressMapper = session.getMapper(AddressMapper.class); - addressMapper.saveAddress(address); - - Person returnedPerson = personMapper.getPerson(id); - assertEquals("Baljeet S", returnedPerson.getName()); - } - - @Test - public void whenPersonUpdated_ThenPersonIsChanged() { - Person person = new Person("Baljeet S"); - Address address = new Address("Pune"); - PersonMapper personMapper = session.getMapper(PersonMapper.class); - Integer id = personMapper.save(person); - address.setPersonId(id); - AddressMapper addressMapper = session.getMapper(AddressMapper.class); - addressMapper.saveAddress(address); - - personMapper.updatePerson(new Person(id, "Baljeet1")); - Person returnedPerson = personMapper.getPerson(id); - assertEquals("Baljeet1", returnedPerson.getName()); - } - - @Test - public void whenPersoSaved_ThenMapIsReturned() { - Person person = new Person("Baljeet S"); - Address address = new Address("Pune"); - PersonMapper personMapper = session.getMapper(PersonMapper.class); - Integer id = personMapper.save(person); - address.setPersonId(id); - AddressMapper addressMapper = session.getMapper(AddressMapper.class); - addressMapper.saveAddress(address); - - Map returnedPerson = personMapper.getAllPerson(); - assertEquals(1, returnedPerson.size()); - } - - @Test - public void whenPersonSearched_ThenResultIsReturned() { - Person person = new Person("Baljeet S"); - Address address = new Address("Pune"); - PersonMapper personMapper = session.getMapper(PersonMapper.class); - Integer id = personMapper.save(person); - address.setPersonId(id); - AddressMapper addressMapper = session.getMapper(AddressMapper.class); - addressMapper.saveAddress(address); - - Person returnedPerson = personMapper.getPersonByName("Baljeet S"); - assertEquals("Baljeet S", returnedPerson.getName()); - } - - @Test - public void whenAddressSearched_ThenResultIsReturned() { - Person person = new Person("Baljeet S"); - Address address = new Address("Pune"); - PersonMapper personMapper = session.getMapper(PersonMapper.class); - Integer id = personMapper.save(person); - address.setPersonId(id); - AddressMapper addressMapper = session.getMapper(AddressMapper.class); - Integer addressId = addressMapper.saveAddress(address); - Address returnedAddress = addressMapper.getAddresses(addressId); - - assertEquals("Pune", returnedAddress.getStreetAddress()); - } - - @After - public void cleanup() throws SQLException { - session.getConnection().createStatement().execute("drop table address"); - session.getConnection().createStatement().execute("drop table person"); - - session.close(); - - } - -} From 553c368b5bec2784ca997a67d1895344e2afa188 Mon Sep 17 00:00:00 2001 From: Yasin Date: Tue, 18 Apr 2017 23:12:29 +0530 Subject: [PATCH 03/26] BAEL-88 Testing in Spring Boot (#1679) Review comments --- .../baeldung/boot/boottest/EmployeeRestController.java | 9 +++++---- .../org/baeldung/boot/boottest/EmployeeServiceImpl.java | 2 +- .../baeldung/boot/boottest/EmployeeRepositoryTest.java | 4 ++-- .../boot/boottest/EmployeeRestControllerIntTest.java | 4 ++-- .../boot/boottest/EmployeeRestControllerTest.java | 4 ++-- .../baeldung/boot/boottest/EmployeeServiceImplTest.java | 4 ++-- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java index 8442fc03a3..1bfde0f0bd 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java +++ b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java @@ -5,9 +5,10 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @@ -15,16 +16,16 @@ import org.springframework.web.bind.annotation.RestController; public class EmployeeRestController { @Autowired - EmployeeService employeeService; + private EmployeeService employeeService; - @RequestMapping(value = "/employees", method = RequestMethod.POST) + @PostMapping("/employees") public ResponseEntity createEmployee(@RequestBody Employee employee) { HttpStatus status = HttpStatus.CREATED; Employee saved = employeeService.save(employee); return new ResponseEntity<>(saved, status); } - @RequestMapping(value = "/employees", method = RequestMethod.GET) + @GetMapping("/employees") public List getAllEmployees() { return employeeService.getAllEmployees(); } diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java index 21936255e0..6d5bf426ec 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java +++ b/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; public class EmployeeServiceImpl implements EmployeeService { @Autowired - EmployeeRepository employeeRepository; + private EmployeeRepository employeeRepository; @Override public Optional getEmployeeById(Long id) { diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java index f47e28a7e1..a29928bcca 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java @@ -20,10 +20,10 @@ import org.springframework.test.context.junit4.SpringRunner; public class EmployeeRepositoryTest { @Autowired - TestEntityManager entityManager; + private TestEntityManager entityManager; @Autowired - EmployeeRepository employeeRepository; + private EmployeeRepository employeeRepository; @Test public void whenFindByName_thenReturnEmployee() { diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java index 6360970345..6ca8d267f9 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java @@ -34,10 +34,10 @@ import org.springframework.test.web.servlet.MockMvc; public class EmployeeRestControllerIntTest { @Autowired - MockMvc mvc; + private MockMvc mvc; @Autowired - EmployeeRepository repository; + private EmployeeRepository repository; @After public void resetDb() { diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java index 0187ba9969..71e69cf419 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java @@ -33,10 +33,10 @@ import org.springframework.test.web.servlet.MockMvc; public class EmployeeRestControllerTest { @Autowired - MockMvc mvc; + private MockMvc mvc; @MockBean - EmployeeService service; + private EmployeeService service; @Before public void setUp() throws Exception { diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java index 345cc29e02..acb884e851 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java @@ -34,10 +34,10 @@ public class EmployeeServiceImplTest { } @Autowired - EmployeeService employeeService; + private EmployeeService employeeService; @MockBean - EmployeeRepository employeeRepository; + private EmployeeRepository employeeRepository; @Before public void setUp() { From a5f4ae927dca92e21b11f886dceb884af0d3d88c Mon Sep 17 00:00:00 2001 From: mariiakulik Date: Tue, 18 Apr 2017 22:20:20 +0200 Subject: [PATCH 04/26] Readme files update (#1680) * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Create README.md * Update README.md * Create README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Create README.md * Create README.md * Update README.md * Update README.MD * Update README * Rename README to README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.MD * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md --- algorithms/README.md | 1 + core-java-9/README.md | 1 + core-java/README.md | 6 ++++++ cucumber/README.md | 3 +++ groovy-spock/README.md | 3 +++ guava21/README.md | 3 ++- jackson/README.md | 1 + javaslang/README.md | 1 + jee7/README.md | 1 + jhipster/README.md | 5 +++++ jws/README.md | 3 +++ lagom/{README => README.md} | 7 +++++++ libraries/README.md | 2 ++ ratpack/README.md | 1 + rest-testing/README.md | 1 + resteasy/README.md | 1 + solr/README.md | 3 +++ spring-5/README.md | 1 + spring-all/README.md | 3 +++ spring-aop/README.md | 3 +++ spring-boot/README.MD | 2 ++ spring-data-gemfire/README.md | 3 +++ spring-kafka/README.md | 18 ++++++++++++------ spring-mvc-java/README.md | 1 + spring-rest/README.md | 2 ++ .../java/com/baeldung/produceimage/README.md | 3 +++ spring-security-core/README.md | 1 + spring-security-rest-full/README.md | 4 ++++ spring-state-machine/README.md | 3 +++ testng/README.md | 3 +++ vertx/README.md | 3 +++ xml/README.md | 1 + 32 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 cucumber/README.md create mode 100644 groovy-spock/README.md create mode 100644 jws/README.md rename lagom/{README => README.md} (92%) create mode 100644 solr/README.md create mode 100644 spring-aop/README.md create mode 100644 spring-data-gemfire/README.md create mode 100644 spring-rest/src/main/java/com/baeldung/produceimage/README.md create mode 100644 spring-state-machine/README.md create mode 100644 testng/README.md create mode 100644 vertx/README.md diff --git a/algorithms/README.md b/algorithms/README.md index 00e0646f47..f1e12ee243 100644 --- a/algorithms/README.md +++ b/algorithms/README.md @@ -5,3 +5,4 @@ - [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization) - [Validating Input With Finite Automata in Java](http://www.baeldung.com/finite-automata-java) - [Introduction to Jenetics Library](http://www.baeldung.com/jenetics) +- [Check If a Number Is Prime in Java](http://www.baeldung.com/java-prime-numbers) diff --git a/core-java-9/README.md b/core-java-9/README.md index a6cda8e883..3e82ffe14b 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -12,3 +12,4 @@ - [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login) - [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api) - [Introduction to Java 9 StackWalking API](http://www.baeldung.com/java-9-stackwalking-api) +- [Introduction to Project Jigsaw](http://www.baeldung.com/project-jigsaw-java-modularity) diff --git a/core-java/README.md b/core-java/README.md index 45695f13f6..910e0fbbec 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -92,3 +92,9 @@ - [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list) - [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list) - [An Introduction to ThreadLocal in Java](http://www.baeldung.com/java-threadlocal) +- [Using Math.pow in Java](http://www.baeldung.com/java-math-pow) +- [Converting Strings to Enums in Java](http://www.baeldung.com/java-string-to-enum) +- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) +- [Quick Guide to the Java StringTokenizer](http://www.baeldung.com/java-stringtokenizer) +- [JVM Log Forging](http://www.baeldung.com/jvm-log-forging) +- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) diff --git a/cucumber/README.md b/cucumber/README.md new file mode 100644 index 0000000000..5466d5c561 --- /dev/null +++ b/cucumber/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Cucumber and Scenario Outline](http://www.baeldung.com/cucumber-scenario-outline) diff --git a/groovy-spock/README.md b/groovy-spock/README.md new file mode 100644 index 0000000000..18d26e8fc0 --- /dev/null +++ b/groovy-spock/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Testing with Spock and Groovy](http://www.baeldung.com/groovy-spock) diff --git a/guava21/README.md b/guava21/README.md index ff12555376..8725352d69 100644 --- a/guava21/README.md +++ b/guava21/README.md @@ -1 +1,2 @@ -## Relevant articles: +### Relevant articles: +- [New Stream, Comparator and Collector Functionality in Guava 21](http://www.baeldung.com/guava-21-new) diff --git a/jackson/README.md b/jackson/README.md index 5bc16e66b7..51919f6769 100644 --- a/jackson/README.md +++ b/jackson/README.md @@ -27,3 +27,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat) - [A Guide to Optional with Jackson](http://www.baeldung.com/jackson-optional) - [Map Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-map) +- [Jackson Streaming API](http://www.baeldung.com/jackson-streaming-api) diff --git a/javaslang/README.md b/javaslang/README.md index e451883516..fe413fc275 100644 --- a/javaslang/README.md +++ b/javaslang/README.md @@ -2,3 +2,4 @@ - [Introduction to Javaslang](http://www.baeldung.com/javaslang) - [Guide to Try in Javaslang](http://www.baeldung.com/javaslang-try) - [Guide to Pattern Matching in Javaslang](http://www.baeldung.com/javaslang-pattern-matching) +- [Property Testing Example With Javaslang](http://www.baeldung.com/javaslang-property-testing) diff --git a/jee7/README.md b/jee7/README.md index bc242c3340..8381bcbf34 100644 --- a/jee7/README.md +++ b/jee7/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Scheduling in Java EE](http://www.baeldung.com/scheduling-in-java-enterprise-edition) - [JSON Processing in Java EE 7](http://www.baeldung.com/jee7-json) +- [Converters, Listeners and Validators in Java EE 7](http://www.baeldung.com/java-ee7-converter-listener-validator) diff --git a/jhipster/README.md b/jhipster/README.md index d45796d867..d321e9e81e 100644 --- a/jhipster/README.md +++ b/jhipster/README.md @@ -1,3 +1,8 @@ +### Relevant articles + +- [Intro to JHipster](http://www.baeldung.com/jhipster) + + # baeldung This application was generated using JHipster 4.0.8, you can find documentation and help at [https://jhipster.github.io/documentation-archive/v4.0.8](https://jhipster.github.io/documentation-archive/v4.0.8). diff --git a/jws/README.md b/jws/README.md new file mode 100644 index 0000000000..428d8b650d --- /dev/null +++ b/jws/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [A Guide to the Java Web Start](http://www.baeldung.com/java-web-start) diff --git a/lagom/README b/lagom/README.md similarity index 92% rename from lagom/README rename to lagom/README.md index 0d81a4b3c1..909fe0dff4 100644 --- a/lagom/README +++ b/lagom/README.md @@ -1,3 +1,10 @@ +### Relevant articles + +- [Guide to Reactive Microservices Using Lagom Framework](http://www.baeldung.com/lagom-reactive-microservices) + + + + Steps to setup from scratch 1) Create sbt build file "build.sbt" diff --git a/libraries/README.md b/libraries/README.md index 8a32a8b0e7..1cfa7be86c 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -7,6 +7,8 @@ - [Introduction to Javassist](http://www.baeldung.com/javassist) - [Embedded Jetty Server in Java](http://www.baeldung.com/jetty-embedded) - [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink) +- [Introduction to JSONassert](http://www.baeldung.com/jsonassert) +- [Intro to JaVer](http://www.baeldung.com/javers) The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. diff --git a/ratpack/README.md b/ratpack/README.md index af473ef0e8..91c8e025f0 100644 --- a/ratpack/README.md +++ b/ratpack/README.md @@ -1,3 +1,4 @@ ### Relevant articles - [Introduction to Ratpack](http://www.baeldung.com/ratpack) +- [Ratpack Google Guice Integration](http://www.baeldung.com/ratpack-google-guice) diff --git a/rest-testing/README.md b/rest-testing/README.md index 5dd4e49162..37a53dd815 100644 --- a/rest-testing/README.md +++ b/rest-testing/README.md @@ -9,3 +9,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Test a REST API with Java](http://www.baeldung.com/2011/10/13/integration-testing-a-rest-api/) - [Introduction to WireMock](http://www.baeldung.com/introduction-to-wiremock) - [REST API Testing with Cucumber](http://www.baeldung.com/cucumber-rest-api-testing) +- [Testing a REST API with JBehave](http://www.baeldung.com/jbehave-rest-testing) diff --git a/resteasy/README.md b/resteasy/README.md index 722f1dfe93..83051037d2 100644 --- a/resteasy/README.md +++ b/resteasy/README.md @@ -6,3 +6,4 @@ ### Relevant Articles: - [A Guide to RESTEasy](http://www.baeldung.com/resteasy-tutorial) - [RESTEasy Client API](http://www.baeldung.com/resteasy-client-tutorial) +- [CORS in JAX-RS](http://www.baeldung.com/cors-in-jax-rs) diff --git a/solr/README.md b/solr/README.md new file mode 100644 index 0000000000..631a4f44d1 --- /dev/null +++ b/solr/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Full-text Search with Solr](http://www.baeldung.com/full-text-search-with-solr) diff --git a/spring-5/README.md b/spring-5/README.md index 47a5314009..31f665f4a2 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -6,3 +6,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles - [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) +- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) diff --git a/spring-all/README.md b/spring-all/README.md index 3493871c78..29be01c79e 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -20,3 +20,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Guide to the Spring Task Scheduler](http://www.baeldung.com/spring-task-scheduler) - [Guide to Spring Retry](http://www.baeldung.com/spring-retry) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) +- [New in Guava 21 common.util.concurrent](http://www.baeldung.com/guava-21-util-concurrent) +- [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) +- [JasperReports with Spring](http://www.baeldung.com/spring-jasper) diff --git a/spring-aop/README.md b/spring-aop/README.md new file mode 100644 index 0000000000..28295faf23 --- /dev/null +++ b/spring-aop/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Implementing a Custom Spring AOP Annotation](http://www.baeldung.com/spring-aop-annotation) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index bb15ffc8cc..dfd1327781 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -18,3 +18,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Create a Custom FailureAnalyzer with Spring Boot](http://www.baeldung.com/spring-boot-failure-analyzer) - [Configuring Separate Spring DataSource for Tests](http://www.baeldung.com/spring-testing-separate-data-source) - [Dynamic DTO Validation Config Retrieved from DB](http://www.baeldung.com/spring-dynamic-dto-validation) +- [Custom Information in Spring Boot Info Endpoint](http://www.baeldung.com/spring-boot-info-actuator-custom) +- [Using @JsonComponent in Spring Boot](http://www.baeldung.com/spring-boot-jsoncomponent) diff --git a/spring-data-gemfire/README.md b/spring-data-gemfire/README.md new file mode 100644 index 0000000000..78199e90d0 --- /dev/null +++ b/spring-data-gemfire/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [A Guide to GemFire with Spring Data](http://www.baeldung.com/spring-data-gemfire) diff --git a/spring-kafka/README.md b/spring-kafka/README.md index c8f01cc28b..291bbca6f6 100644 --- a/spring-kafka/README.md +++ b/spring-kafka/README.md @@ -1,4 +1,10 @@ -# Spring Kakfa +### Relevant articles + +- [Intro to Apache Kafka with Spring](http://www.baeldung.com/spring-kafka) + + + +# Spring Kafka This is a simple Spring Boot app to demonstrate sending and receiving of messages in Kafka using spring-kafka. @@ -12,18 +18,18 @@ As Kafka topics are not created automatically by default, this application requi When the application runs successfully, following output is logged on to console (along with spring logs): #### Message received from the 'baeldung' topic by the basic listeners with groups foo and bar ->Received Messasge in group 'foo': Hello, World!
-Received Messasge in group 'bar': Hello, World! +>Received Message in group 'foo': Hello, World!
+Received Message in group 'bar': Hello, World! #### Message received from the 'baeldung' topic, with the partition info ->Received Messasge: Hello, World! from partition: 0 +>Received Message: Hello, World! from partition: 0 #### Message received from the 'partitioned' topic, only from specific partitions >Received Message: Hello To Partioned Topic! from partition: 0
Received Message: Hello To Partioned Topic! from partition: 3 #### Message received from the 'filtered' topic after filtering ->Recieved Message in filtered listener: Hello Baeldung! +>Received Message in filtered listener: Hello Baeldung! #### Message (Serialized Java Object) received from the 'greeting' topic ->Recieved greeting message: Greetings, World!! \ No newline at end of file +>Received greeting message: Greetings, World!! diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index 4d3e58558b..533d37fe00 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -21,3 +21,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring @RequestMapping New Shortcut Annotations](http://www.baeldung.com/spring-new-requestmapping-shortcuts) - [Guide to Spring Handler Mappings](http://www.baeldung.com/spring-handler-mappings) - [Uploading and Displaying Excel Files with Spring MVC](http://www.baeldung.com/spring-mvc-excel-files) +- [Spring MVC Custom Validation](http://www.baeldung.com/spring-mvc-custom-validator) diff --git a/spring-rest/README.md b/spring-rest/README.md index 85f0e13732..66c893e45f 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -13,3 +13,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder) - [Introduction to FindBugs](http://www.baeldung.com/intro-to-findbugs) - [A Custom Media Type for a Spring REST API](http://www.baeldung.com/spring-rest-custom-media-type) +- [HTTP PUT vs HTTP PATCH in a REST API](http://www.baeldung.com/http-put-patch-difference-spring) +- [Exploring the Spring Boot TestRestTemplate](http://www.baeldung.com/spring-boot-testresttemplate) diff --git a/spring-rest/src/main/java/com/baeldung/produceimage/README.md b/spring-rest/src/main/java/com/baeldung/produceimage/README.md new file mode 100644 index 0000000000..acd546598d --- /dev/null +++ b/spring-rest/src/main/java/com/baeldung/produceimage/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Returning an Image or a File with Spring](http://www.baeldung.com/spring-controller-return-image-file) diff --git a/spring-security-core/README.md b/spring-security-core/README.md index 0eb506e865..3675e7e160 100644 --- a/spring-security-core/README.md +++ b/spring-security-core/README.md @@ -8,3 +8,4 @@ mvn clean install ### Relevant Articles: - [Intro to @PreFilter and @PostFilter in Spring Security](http://www.baeldung.com/spring-security-prefilter-postfilter) +- [Spring Boot Authentication Auditing Support](http://www.baeldung.com/spring-boot-authentication-audit) diff --git a/spring-security-rest-full/README.md b/spring-security-rest-full/README.md index e7f543a407..d5bd8be52b 100644 --- a/spring-security-rest-full/README.md +++ b/spring-security-rest-full/README.md @@ -30,6 +30,10 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Introduction to Spring MVC HandlerInterceptor](http://www.baeldung.com/spring-mvc-handlerinterceptor) - [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](http://www.baeldung.com/spring-mvc-custom-handler-interceptor) - [Bootstrap a Web Application with Spring 4](http://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) +- [REST Query Language – Implementing OR Operation](http://www.baeldung.com/rest-api-query-search-or-operation) + + + ### Build the Project ``` diff --git a/spring-state-machine/README.md b/spring-state-machine/README.md new file mode 100644 index 0000000000..a2668fb650 --- /dev/null +++ b/spring-state-machine/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [A Guide to the Spring State Machine Project](http://www.baeldung.com/spring-state-machine) diff --git a/testng/README.md b/testng/README.md new file mode 100644 index 0000000000..0e3586c9f3 --- /dev/null +++ b/testng/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to TestNG](http://www.baeldung.com/testng) diff --git a/vertx/README.md b/vertx/README.md new file mode 100644 index 0000000000..e710df362d --- /dev/null +++ b/vertx/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Vert.x](http://www.baeldung.com/vertx) diff --git a/xml/README.md b/xml/README.md index 8531f8b063..320089b088 100644 --- a/xml/README.md +++ b/xml/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Intro to XPath with Java](http://www.baeldung.com/java-xpath) +- [Introduction to JiBX](http://www.baeldung.com/jibx) From 74688cf30e42ff4b763715082fddc3785f4f4b5c Mon Sep 17 00:00:00 2001 From: Doha2012 Date: Tue, 18 Apr 2017 22:39:14 +0200 Subject: [PATCH 05/26] remove log4j dependencies (#1675) * upgrade to spring boot 1.5.2 * add full update to REST API * modify ratings controller * upgrade herold * fix integration test * fix integration test * minor fix * fix integration test * fix integration test * minor cleanup * minor cleanup * remove log4j properties * use standard logbook.xml * remove log4j dependencies --- apache-fop/pom.xml | 5 --- core-java/pom.xml | 5 --- .../FileNotFoundExceptionUnitTest.java | 6 ++- couchbase-sdk/pom.xml | 5 --- deltaspike/pom.xml | 6 --- disruptor/pom.xml | 5 --- feign/pom.xml | 11 ----- feign/src/main/resources/log4j2.xml | 14 ------- guava/pom.xml | 5 --- handling-spring-static-resources/pom.xml | 5 --- httpclient/pom.xml | 5 --- jackson/pom.xml | 5 --- java-cassandra/pom.xml | 5 --- jsf/pom.xml | 5 --- rest-testing/pom.xml | 5 --- solr/pom.xml | 5 --- spring-all/pom.xml | 4 -- .../org/baeldung/scopes/ScopesController.java | 6 ++- .../startup/AllStrategiesExampleBean.java | 6 ++- .../startup/EventListenerExampleBean.java | 6 ++- .../startup/InitMethodExampleBean.java | 11 ++--- .../startup/InitializingBeanExampleBean.java | 11 ++--- .../LogicInConstructorExampleBean.java | 15 +++---- .../startup/PostConstructExampleBean.java | 14 ++++--- .../StartupApplicationListenerExample.java | 6 ++- .../springamqpsimple/MessageConsumer.java | 7 ++-- spring-apache-camel/pom.xml | 5 --- .../src/main/resources/log4j.xml | 18 -------- spring-data-cassandra/pom.xml | 5 --- spring-data-couchbase-2/pom.xml | 5 --- spring-data-elasticsearch/pom.xml | 5 --- spring-data-mongodb/pom.xml | 6 --- spring-data-redis/pom.xml | 7 ---- spring-data-solr/pom.xml | 6 --- spring-dispatcher-servlet/pom.xml | 12 +----- .../src/main/resources/log4j2.xml | 14 ------- .../src/main/resources/log4j.xml | 41 ------------------- .../src/test/resources/log4j.xml | 41 ------------------- spring-integration/pom.xml | 6 --- .../src/main/resources/log4j.xml | 28 ------------- spring-mvc-java/pom.xml | 5 --- spring-mvc-web-vs-initializer/pom.xml | 4 -- spring-mvc-xml/pom.xml | 5 --- spring-rest/pom.xml | 4 -- spring-security-mvc-custom/pom.xml | 5 --- spring-security-mvc-digest-auth/pom.xml | 5 --- spring-security-mvc-login/pom.xml | 5 --- .../security/CustomAccessDeniedHandler.java | 6 ++- .../pom.xml | 5 --- spring-security-mvc-session/pom.xml | 5 --- spring-security-rest-basic-auth/pom.xml | 5 --- spring-security-rest-custom/pom.xml | 4 -- spring-security-rest-digest-auth/pom.xml | 5 --- spring-security-rest-full/pom.xml | 4 -- spring-security-rest/pom.xml | 5 --- .../web/controller/AsyncController.java | 6 ++- .../web/service/AsyncServiceImpl.java | 6 ++- spring-thymeleaf/pom.xml | 5 --- video-tutorials/jackson-annotations/pom.xml | 6 --- 59 files changed, 63 insertions(+), 414 deletions(-) delete mode 100644 feign/src/main/resources/log4j2.xml delete mode 100644 spring-apache-camel/src/main/resources/log4j.xml delete mode 100644 spring-dispatcher-servlet/src/main/resources/log4j2.xml delete mode 100644 spring-freemarker/src/main/resources/log4j.xml delete mode 100644 spring-freemarker/src/test/resources/log4j.xml delete mode 100644 spring-integration/src/main/resources/log4j.xml diff --git a/apache-fop/pom.xml b/apache-fop/pom.xml index 6075c23d21..635e5c6a0b 100644 --- a/apache-fop/pom.xml +++ b/apache-fop/pom.xml @@ -28,11 +28,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/core-java/pom.xml b/core-java/pom.xml index d2fa1cdd2e..44e7df722c 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -92,11 +92,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - org.projectlombok lombok diff --git a/core-java/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java b/core-java/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java index e615e6a7d1..e8007ad4c4 100644 --- a/core-java/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java +++ b/core-java/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java @@ -6,12 +6,14 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.junit.Test; public class FileNotFoundExceptionUnitTest { - private static final Logger LOG = Logger.getLogger(FileNotFoundExceptionUnitTest.class); + private static final Logger LOG = LoggerFactory.getLogger(FileNotFoundExceptionUnitTest.class); private String fileName = Double.toString(Math.random()); diff --git a/couchbase-sdk/pom.xml b/couchbase-sdk/pom.xml index 1200fab454..c8ac9c8743 100644 --- a/couchbase-sdk/pom.xml +++ b/couchbase-sdk/pom.xml @@ -46,11 +46,6 @@ jcl-over-slf4j ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/deltaspike/pom.xml b/deltaspike/pom.xml index 141b5b0da6..8135ced13a 100644 --- a/deltaspike/pom.xml +++ b/deltaspike/pom.xml @@ -201,12 +201,6 @@ querydsl-jpa ${querydsl.version} - - - org.slf4j - slf4j-log4j12 - ${slf4j.version} - diff --git a/disruptor/pom.xml b/disruptor/pom.xml index 2523cc2125..865a87596a 100644 --- a/disruptor/pom.xml +++ b/disruptor/pom.xml @@ -40,11 +40,6 @@ jcl-over-slf4j ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/feign/pom.xml b/feign/pom.xml index 160f37ec2c..de086a3e43 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -18,7 +18,6 @@ UTF-8 9.4.0 1.7.21 - 2.7 1.16.12 4.12 3.6.0 @@ -52,16 +51,6 @@ slf4j-api ${slf4j.version} - - org.apache.logging.log4j - log4j-core - ${log4j.version} - - - org.apache.logging.log4j - log4j-slf4j-impl - ${log4j.version} - org.projectlombok lombok diff --git a/feign/src/main/resources/log4j2.xml b/feign/src/main/resources/log4j2.xml deleted file mode 100644 index 659c5fda0e..0000000000 --- a/feign/src/main/resources/log4j2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/guava/pom.xml b/guava/pom.xml index 0edbb90efd..447ee47cfc 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -76,11 +76,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/handling-spring-static-resources/pom.xml b/handling-spring-static-resources/pom.xml index 9a14ce9372..1e892ed237 100644 --- a/handling-spring-static-resources/pom.xml +++ b/handling-spring-static-resources/pom.xml @@ -155,11 +155,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/httpclient/pom.xml b/httpclient/pom.xml index eec705b224..8f499d4a74 100644 --- a/httpclient/pom.xml +++ b/httpclient/pom.xml @@ -80,11 +80,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/jackson/pom.xml b/jackson/pom.xml index 8e627c146b..df2f65d359 100644 --- a/jackson/pom.xml +++ b/jackson/pom.xml @@ -154,11 +154,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/java-cassandra/pom.xml b/java-cassandra/pom.xml index 5796043b95..dfc5452617 100644 --- a/java-cassandra/pom.xml +++ b/java-cassandra/pom.xml @@ -49,11 +49,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - junit diff --git a/jsf/pom.xml b/jsf/pom.xml index 271a869576..41c90824b6 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -92,11 +92,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/rest-testing/pom.xml b/rest-testing/pom.xml index 746752133c..e3231c4fb4 100644 --- a/rest-testing/pom.xml +++ b/rest-testing/pom.xml @@ -69,11 +69,6 @@ ${org.slf4j.version} runtime - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/solr/pom.xml b/solr/pom.xml index e784d87157..cc3a6165fe 100644 --- a/solr/pom.xml +++ b/solr/pom.xml @@ -20,11 +20,6 @@ solr-solrj 6.4.1 - - log4j - log4j - 1.2.16 - junit junit diff --git a/spring-all/pom.xml b/spring-all/pom.xml index 1b12d7e42c..076465f2f6 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -129,10 +129,6 @@ jcl-over-slf4j - - org.slf4j - log4j-over-slf4j - diff --git a/spring-all/src/main/java/org/baeldung/scopes/ScopesController.java b/spring-all/src/main/java/org/baeldung/scopes/ScopesController.java index 1e3d5f3b14..73df386aff 100644 --- a/spring-all/src/main/java/org/baeldung/scopes/ScopesController.java +++ b/spring-all/src/main/java/org/baeldung/scopes/ScopesController.java @@ -2,14 +2,16 @@ package org.baeldung.scopes; import javax.annotation.Resource; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ScopesController { - public static final Logger LOG = Logger.getLogger(ScopesController.class); + public static final Logger LOG = LoggerFactory.getLogger(ScopesController.class); @Resource(name = "requestMessage") HelloMessageGenerator requestMessage; diff --git a/spring-all/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java b/spring-all/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java index d4334437f7..f36b8703ea 100644 --- a/spring-all/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java +++ b/spring-all/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java @@ -1,6 +1,8 @@ package org.baeldung.startup; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -11,7 +13,7 @@ import javax.annotation.PostConstruct; @Scope(value = "prototype") public class AllStrategiesExampleBean implements InitializingBean { - private static final Logger LOG = Logger.getLogger(AllStrategiesExampleBean.class); + private static final Logger LOG = LoggerFactory.getLogger(AllStrategiesExampleBean.class); public AllStrategiesExampleBean() { LOG.info("Constructor"); diff --git a/spring-all/src/main/java/org/baeldung/startup/EventListenerExampleBean.java b/spring-all/src/main/java/org/baeldung/startup/EventListenerExampleBean.java index e9cd1a159d..58e42337cc 100644 --- a/spring-all/src/main/java/org/baeldung/startup/EventListenerExampleBean.java +++ b/spring-all/src/main/java/org/baeldung/startup/EventListenerExampleBean.java @@ -1,13 +1,15 @@ package org.baeldung.startup; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class EventListenerExampleBean { - private static final Logger LOG = Logger.getLogger(EventListenerExampleBean.class); + private static final Logger LOG = LoggerFactory.getLogger(EventListenerExampleBean.class); public static int counter; diff --git a/spring-all/src/main/java/org/baeldung/startup/InitMethodExampleBean.java b/spring-all/src/main/java/org/baeldung/startup/InitMethodExampleBean.java index cea6b026d6..f3d30011f8 100644 --- a/spring-all/src/main/java/org/baeldung/startup/InitMethodExampleBean.java +++ b/spring-all/src/main/java/org/baeldung/startup/InitMethodExampleBean.java @@ -1,23 +1,24 @@ package org.baeldung.startup; -import org.apache.log4j.Logger; +import java.util.Arrays; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import java.util.Arrays; - @Component @Scope(value = "prototype") public class InitMethodExampleBean { - private static final Logger LOG = Logger.getLogger(InitMethodExampleBean.class); + private static final Logger LOG = LoggerFactory.getLogger(InitMethodExampleBean.class); @Autowired private Environment environment; public void init() { - LOG.info(Arrays.asList(environment.getDefaultProfiles())); + LOG.info("Env Default Profiles", Arrays.asList(environment.getDefaultProfiles())); } } diff --git a/spring-all/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java b/spring-all/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java index 33b14864f3..5d6f8c9d88 100644 --- a/spring-all/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java +++ b/spring-all/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java @@ -1,25 +1,26 @@ package org.baeldung.startup; -import org.apache.log4j.Logger; +import java.util.Arrays; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import java.util.Arrays; - @Component @Scope(value = "prototype") public class InitializingBeanExampleBean implements InitializingBean { - private static final Logger LOG = Logger.getLogger(InitializingBeanExampleBean.class); + private static final Logger LOG = LoggerFactory.getLogger(InitializingBeanExampleBean.class); @Autowired private Environment environment; @Override public void afterPropertiesSet() throws Exception { - LOG.info(Arrays.asList(environment.getDefaultProfiles())); + LOG.info("Env Default Profiles", Arrays.asList(environment.getDefaultProfiles())); } } diff --git a/spring-all/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java b/spring-all/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java index 2a7b3e26c7..d25a83942a 100644 --- a/spring-all/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java +++ b/spring-all/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java @@ -1,25 +1,22 @@ package org.baeldung.startup; -import org.apache.log4j.Logger; +import java.util.Arrays; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import java.util.Arrays; - @Component @Scope(value = "prototype") public class LogicInConstructorExampleBean { - private static final Logger LOG = Logger.getLogger(LogicInConstructorExampleBean.class); - - private final Environment environment; + private static final Logger LOG = LoggerFactory.getLogger(LogicInConstructorExampleBean.class); @Autowired public LogicInConstructorExampleBean(Environment environment) { - this.environment = environment; - - LOG.info(Arrays.asList(environment.getDefaultProfiles())); + LOG.info("Env Default Profiles", Arrays.asList(environment.getDefaultProfiles())); } } diff --git a/spring-all/src/main/java/org/baeldung/startup/PostConstructExampleBean.java b/spring-all/src/main/java/org/baeldung/startup/PostConstructExampleBean.java index 4cabaad4df..2397c3a0a2 100644 --- a/spring-all/src/main/java/org/baeldung/startup/PostConstructExampleBean.java +++ b/spring-all/src/main/java/org/baeldung/startup/PostConstructExampleBean.java @@ -1,25 +1,27 @@ package org.baeldung.startup; -import org.apache.log4j.Logger; +import java.util.Arrays; + +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; -import java.util.Arrays; - @Component @Scope(value = "prototype") public class PostConstructExampleBean { - private static final Logger LOG = Logger.getLogger(PostConstructExampleBean.class); + private static final Logger LOG = LoggerFactory.getLogger(PostConstructExampleBean.class); @Autowired private Environment environment; @PostConstruct public void init() { - LOG.info(Arrays.asList(environment.getDefaultProfiles())); + LOG.info("Env Default Profiles", Arrays.asList(environment.getDefaultProfiles())); } } diff --git a/spring-all/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java b/spring-all/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java index 32a63f0c1a..e02388dea3 100644 --- a/spring-all/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java +++ b/spring-all/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java @@ -1,6 +1,8 @@ package org.baeldung.startup; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; @@ -8,7 +10,7 @@ import org.springframework.stereotype.Component; @Component public class StartupApplicationListenerExample implements ApplicationListener { - private static final Logger LOG = Logger.getLogger(StartupApplicationListenerExample.class); + private static final Logger LOG = LoggerFactory.getLogger(StartupApplicationListenerExample.class); public static int counter; diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java index b757dfebe8..58a59bf245 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java @@ -1,13 +1,14 @@ package com.baeldung.springamqpsimple; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.stereotype.Component; @Component public class MessageConsumer { - private static final Logger logger = LogManager.getLogger(MessageConsumer.class); + private static final Logger logger = LoggerFactory.getLogger(MessageConsumer.class); public void receiveMessage(String message) { logger.info("Received Message: " + message); diff --git a/spring-apache-camel/pom.xml b/spring-apache-camel/pom.xml index da7dad1a1f..04d07426d3 100644 --- a/spring-apache-camel/pom.xml +++ b/spring-apache-camel/pom.xml @@ -48,11 +48,6 @@ spring-context ${env.spring.version} - - org.slf4j - slf4j-log4j12 - 1.7.21 - org.apache.camel camel-spring-javaconfig diff --git a/spring-apache-camel/src/main/resources/log4j.xml b/spring-apache-camel/src/main/resources/log4j.xml deleted file mode 100644 index 4a86fb2357..0000000000 --- a/spring-apache-camel/src/main/resources/log4j.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-data-cassandra/pom.xml b/spring-data-cassandra/pom.xml index ef664fef79..316eb2f58b 100644 --- a/spring-data-cassandra/pom.xml +++ b/spring-data-cassandra/pom.xml @@ -94,11 +94,6 @@ jcl-over-slf4j ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-data-couchbase-2/pom.xml b/spring-data-couchbase-2/pom.xml index 9284234638..b3933d9fcd 100644 --- a/spring-data-couchbase-2/pom.xml +++ b/spring-data-couchbase-2/pom.xml @@ -56,11 +56,6 @@ jcl-over-slf4j ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-data-elasticsearch/pom.xml b/spring-data-elasticsearch/pom.xml index b38a6a10bc..f4a43fac09 100644 --- a/spring-data-elasticsearch/pom.xml +++ b/spring-data-elasticsearch/pom.xml @@ -71,11 +71,6 @@ jcl-over-slf4j ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - org.elasticsearch diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index e5389c1d34..3352baa6aa 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -68,12 +68,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - com.querydsl querydsl-mongodb diff --git a/spring-data-redis/pom.xml b/spring-data-redis/pom.xml index 9700dd7091..720526932e 100644 --- a/spring-data-redis/pom.xml +++ b/spring-data-redis/pom.xml @@ -13,7 +13,6 @@ 1.7.5.RELEASE 3.2.4 2.9.0 - 1.2.17 4.12 0.10.0 2.19.1 @@ -32,12 +31,6 @@ ${cglib.version} - - log4j - log4j - ${log4j.version} - - redis.clients jedis diff --git a/spring-data-solr/pom.xml b/spring-data-solr/pom.xml index fd6c442abf..0019c7ff9c 100644 --- a/spring-data-solr/pom.xml +++ b/spring-data-solr/pom.xml @@ -14,7 +14,6 @@ 4.3.4.RELEASE 2.19.1 2.0.5.RELEASE - 1.2.17 4.12 @@ -34,11 +33,6 @@ spring-context ${spring.version} - - log4j - log4j - ${log4j.version} - junit junit diff --git a/spring-dispatcher-servlet/pom.xml b/spring-dispatcher-servlet/pom.xml index 13ad062195..e4812485c1 100644 --- a/spring-dispatcher-servlet/pom.xml +++ b/spring-dispatcher-servlet/pom.xml @@ -36,16 +36,7 @@ slf4j-api ${org.slf4j.version} - - org.apache.logging.log4j - log4j-core - ${log4j.version} - - - org.apache.logging.log4j - log4j-slf4j-impl - ${log4j.version} - + @@ -87,7 +78,6 @@ 1.7.21 - 2.7 3.1.0 diff --git a/spring-dispatcher-servlet/src/main/resources/log4j2.xml b/spring-dispatcher-servlet/src/main/resources/log4j2.xml deleted file mode 100644 index fb18e8279a..0000000000 --- a/spring-dispatcher-servlet/src/main/resources/log4j2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/spring-freemarker/src/main/resources/log4j.xml b/spring-freemarker/src/main/resources/log4j.xml deleted file mode 100644 index ae7d4b5ca4..0000000000 --- a/spring-freemarker/src/main/resources/log4j.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-freemarker/src/test/resources/log4j.xml b/spring-freemarker/src/test/resources/log4j.xml deleted file mode 100644 index 9b1538d31a..0000000000 --- a/spring-freemarker/src/test/resources/log4j.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index 0aa8fed598..a243f55507 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -16,7 +16,6 @@ 1.1.4.RELEASE 1.4.7 1.1.1 - 1.2.17 4.12 2.10 @@ -109,11 +108,6 @@ mail ${javax-mail.version} - - log4j - log4j - ${log4j.version} - org.springframework.integration spring-integration-twitter diff --git a/spring-integration/src/main/resources/log4j.xml b/spring-integration/src/main/resources/log4j.xml deleted file mode 100644 index cfa93a8037..0000000000 --- a/spring-integration/src/main/resources/log4j.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index dcf740b22b..5c8f6be6fa 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -116,11 +116,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-mvc-web-vs-initializer/pom.xml b/spring-mvc-web-vs-initializer/pom.xml index 8fe8893903..45ead333f4 100644 --- a/spring-mvc-web-vs-initializer/pom.xml +++ b/spring-mvc-web-vs-initializer/pom.xml @@ -72,10 +72,6 @@ jcl-over-slf4j - - org.slf4j - log4j-over-slf4j - diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml index 86eb17da64..60da3404c9 100644 --- a/spring-mvc-xml/pom.xml +++ b/spring-mvc-xml/pom.xml @@ -64,11 +64,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 6afe4004c3..9b1b9a2847 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -122,10 +122,6 @@ jcl-over-slf4j - - org.slf4j - log4j-over-slf4j - diff --git a/spring-security-mvc-custom/pom.xml b/spring-security-mvc-custom/pom.xml index 59339ead5e..46e0dc2b17 100644 --- a/spring-security-mvc-custom/pom.xml +++ b/spring-security-mvc-custom/pom.xml @@ -125,11 +125,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-mvc-digest-auth/pom.xml b/spring-security-mvc-digest-auth/pom.xml index dd772e3343..c0f08c1a2a 100644 --- a/spring-security-mvc-digest-auth/pom.xml +++ b/spring-security-mvc-digest-auth/pom.xml @@ -120,11 +120,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-mvc-login/pom.xml b/spring-security-mvc-login/pom.xml index b3431da7dc..fd67873ff1 100644 --- a/spring-security-mvc-login/pom.xml +++ b/spring-security-mvc-login/pom.xml @@ -117,11 +117,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java b/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java index ea4407c5c4..843f5f4dcd 100644 --- a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java +++ b/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java @@ -6,7 +6,9 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -14,7 +16,7 @@ import org.springframework.security.web.access.AccessDeniedHandler; public class CustomAccessDeniedHandler implements AccessDeniedHandler { - public static final Logger LOG = Logger.getLogger(CustomAccessDeniedHandler.class); + public static final Logger LOG = LoggerFactory.getLogger(CustomAccessDeniedHandler.class); @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException, ServletException { diff --git a/spring-security-mvc-persisted-remember-me/pom.xml b/spring-security-mvc-persisted-remember-me/pom.xml index f215c39c6d..7fc15284f0 100644 --- a/spring-security-mvc-persisted-remember-me/pom.xml +++ b/spring-security-mvc-persisted-remember-me/pom.xml @@ -155,11 +155,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-mvc-session/pom.xml b/spring-security-mvc-session/pom.xml index 3f129c83ba..5255bd3737 100644 --- a/spring-security-mvc-session/pom.xml +++ b/spring-security-mvc-session/pom.xml @@ -125,11 +125,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-rest-basic-auth/pom.xml b/spring-security-rest-basic-auth/pom.xml index 953cfd6b6b..0be9b664e2 100644 --- a/spring-security-rest-basic-auth/pom.xml +++ b/spring-security-rest-basic-auth/pom.xml @@ -172,11 +172,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-rest-custom/pom.xml b/spring-security-rest-custom/pom.xml index d421f8d7b4..0fe642c2b6 100644 --- a/spring-security-rest-custom/pom.xml +++ b/spring-security-rest-custom/pom.xml @@ -177,10 +177,6 @@ jcl-over-slf4j - - org.slf4j - log4j-over-slf4j - diff --git a/spring-security-rest-digest-auth/pom.xml b/spring-security-rest-digest-auth/pom.xml index dc8e12b72b..e2fcd330f5 100644 --- a/spring-security-rest-digest-auth/pom.xml +++ b/spring-security-rest-digest-auth/pom.xml @@ -166,11 +166,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-rest-full/pom.xml b/spring-security-rest-full/pom.xml index 43d14af5ea..290aa48dea 100644 --- a/spring-security-rest-full/pom.xml +++ b/spring-security-rest-full/pom.xml @@ -226,10 +226,6 @@ jcl-over-slf4j - - org.slf4j - log4j-over-slf4j - diff --git a/spring-security-rest/pom.xml b/spring-security-rest/pom.xml index 996161c721..6052f7d42e 100644 --- a/spring-security-rest/pom.xml +++ b/spring-security-rest/pom.xml @@ -145,11 +145,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - diff --git a/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java b/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java index 9a69528efe..456eeaaeac 100644 --- a/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java +++ b/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java @@ -2,7 +2,9 @@ package org.baeldung.web.controller; import java.util.concurrent.Callable; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.baeldung.web.service.AsyncService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; @@ -14,7 +16,7 @@ import org.springframework.web.bind.annotation.ResponseBody; @Controller public class AsyncController { - private static final Logger log = Logger.getLogger(AsyncService.class); + private static final Logger log = LoggerFactory.getLogger(AsyncService.class); @Autowired private AsyncService asyncService; diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java index fb954a49a7..caaaa8e0dc 100644 --- a/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java +++ b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java @@ -2,7 +2,9 @@ package org.baeldung.web.service; import java.util.concurrent.Callable; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.scheduling.annotation.Async; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -10,7 +12,7 @@ import org.springframework.stereotype.Service; @Service public class AsyncServiceImpl implements AsyncService { - private static final Logger log = Logger.getLogger(AsyncService.class); + private static final Logger log = LoggerFactory.getLogger(AsyncService.class); @Async @Override diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index be443e15df..7082441ceb 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -102,11 +102,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - javax.servlet diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml index e321544d4e..07c5d9e863 100644 --- a/video-tutorials/jackson-annotations/pom.xml +++ b/video-tutorials/jackson-annotations/pom.xml @@ -151,12 +151,6 @@ ${org.slf4j.version} - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - From f674f12eac8419cc64ee791830d4f1cf2f8e7455 Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 19 Apr 2017 06:36:43 +0300 Subject: [PATCH 06/26] BAEL-748 updated Quick Guide to @Value (#1663) * BAEL-748 quick guide to @Value * BAEL-748 changes from review * BAEL-748 inject comma-separated values into array --- spring-core/src/main/java/com/baeldung/value/ValuesApp.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spring-core/src/main/java/com/baeldung/value/ValuesApp.java b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java index 25f4b9fb9c..f525dfde89 100644 --- a/spring-core/src/main/java/com/baeldung/value/ValuesApp.java +++ b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java @@ -1,5 +1,6 @@ package com.baeldung.value; +import java.util.Arrays; import java.util.List; import javax.annotation.PostConstruct; @@ -30,6 +31,9 @@ public class ValuesApp { @Value("${priority}") private String prioritySystemProperty; + @Value("${listOfValues}") + private String[] valuesArray; + @Value("#{systemProperties['priority']}") private String spelValue; @@ -60,6 +64,7 @@ public class ValuesApp { System.out.println(systemValue); System.out.println(someDefault); System.out.println(prioritySystemProperty); + System.out.println(Arrays.toString(valuesArray)); System.out.println(spelValue); System.out.println(spelSomeDefault); System.out.println(someBeanValue); From 709857b9aab7e6b63f0a051aa816a1a9c028722b Mon Sep 17 00:00:00 2001 From: Mateusz Mrozewski Date: Wed, 19 Apr 2017 12:02:42 +0400 Subject: [PATCH 07/26] BAEL-427 Examples for topic and fanout exchanges. (#1648) * BAEL-427 Examples for topic and fanout exchanges. * BAEL-427 Separating code for the new article from the old one --- .../springamqpsimple/MessageConsumer.java | 3 +- .../springamqpsimple/SpringAmqpConfig.java | 9 ++- .../broadcast/BroadcastConfig.java | 70 +++++++++++++++++++ .../broadcast/BroadcastMessageConsumers.java | 32 +++++++++ .../broadcast/BroadcastMessageController.java | 26 +++++++ .../broadcast/BroadcastMessageProducer.java | 22 ++++++ .../src/main/resources/application.yaml | 5 +- ...dcastMessageControllerIntegrationTest.java | 48 +++++++++++++ 8 files changed, 209 insertions(+), 6 deletions(-) create mode 100644 spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java create mode 100644 spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageConsumers.java create mode 100644 spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageController.java create mode 100644 spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageProducer.java create mode 100644 spring-amqp-simple/src/test/java/broadcast/BroadcastMessageControllerIntegrationTest.java diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java index 58a59bf245..086492e15b 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java @@ -2,7 +2,7 @@ package com.baeldung.springamqpsimple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component @@ -10,6 +10,7 @@ public class MessageConsumer { private static final Logger logger = LoggerFactory.getLogger(MessageConsumer.class); + @RabbitListener(queues = {SpringAmqpConfig.queueName}) public void receiveMessage(String message) { logger.info("Received Message: " + message); } diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java index 78d79dd47a..f6c82b635e 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java @@ -1,6 +1,10 @@ package com.baeldung.springamqpsimple; -import org.springframework.amqp.core.*; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Exchange; +import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter; @@ -32,7 +36,7 @@ public class SpringAmqpConfig { @Bean SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, - MessageListenerAdapter listenerAdapter) { + MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setQueueNames(queueName); @@ -44,5 +48,4 @@ public class SpringAmqpConfig { MessageListenerAdapter listenerAdapter(MessageConsumer messageReceiver) { return new MessageListenerAdapter(messageReceiver, "receiveMessage"); } - } diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java new file mode 100644 index 0000000000..1d02b4dad9 --- /dev/null +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java @@ -0,0 +1,70 @@ +package com.baeldung.springamqpsimple.broadcast; + +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.Declarable; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.FanoutExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import java.util.Arrays; +import java.util.List; + +@Configuration +@Profile("!test") +public class BroadcastConfig { + + public final static String fanoutQueue1Name = "com.baeldung.spring-amqp-simple.fanout.queue1"; + public final static String fanoutQueue2Name = "com.baeldung.spring-amqp-simple.fanout.queue2"; + public final static String fanoutExchangeName = "com.baeldung.spring-amqp-simple.fanout.exchange"; + + public final static String topicQueue1Name = "com.baeldung.spring-amqp-simple.topic.queue1"; + public final static String topicQueue2Name = "com.baeldung.spring-amqp-simple.topic.queue2"; + public final static String topicExchangeName = "com.baeldung.spring-amql-simple.topic.exchange"; + + @Bean + public List topicBindings() { + Queue topicQueue1 = new Queue(topicQueue1Name, false); + Queue topicQueue2 = new Queue(topicQueue2Name, false); + + TopicExchange topicExchange = new TopicExchange(topicExchangeName); + + return Arrays.asList( + topicQueue1, + topicQueue2, + topicExchange, + BindingBuilder.bind(topicQueue1).to(topicExchange).with("*.important.*"), + BindingBuilder.bind(topicQueue2).to(topicExchange).with("user.#") + ); + } + + @Bean + public List fanoutBindings() { + Queue fanoutQueue1 = new Queue(fanoutQueue1Name, false); + Queue fanoutQueue2 = new Queue(fanoutQueue2Name, false); + + FanoutExchange fanoutExchange = new FanoutExchange(fanoutExchangeName); + + return Arrays.asList( + fanoutQueue1, + fanoutQueue2, + fanoutExchange, + BindingBuilder.bind(fanoutQueue1).to(fanoutExchange), + BindingBuilder.bind(fanoutQueue2).to(fanoutExchange) + ); + } + + @Bean + public SimpleRabbitListenerContainerFactory container(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { + SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); + configurer.configure(factory, connectionFactory); + return factory; + } + +} diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageConsumers.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageConsumers.java new file mode 100644 index 0000000000..0ae04ea092 --- /dev/null +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageConsumers.java @@ -0,0 +1,32 @@ +package com.baeldung.springamqpsimple.broadcast; + +import com.baeldung.springamqpsimple.MessageConsumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +@Component +public class BroadcastMessageConsumers { + private static final Logger logger = LoggerFactory.getLogger(MessageConsumer.class); + + @RabbitListener(queues = {BroadcastConfig.fanoutQueue1Name}) + public void receiveMessageFromFanout1(String message) { + logger.info("Received fanout 1 message: " + message); + } + + @RabbitListener(queues = {BroadcastConfig.fanoutQueue2Name}) + public void receiveMessageFromFanout2(String message) { + logger.info("Received fanout 2 message: " + message); + } + + @RabbitListener(queues = {BroadcastConfig.topicQueue1Name}) + public void receiveMessageFromTopic1(String message) { + logger.info("Received topic 1 message: " + message); + } + + @RabbitListener(queues = {BroadcastConfig.topicQueue2Name}) + public void receiveMessageFromTopic2(String message) { + logger.info("Received topic 2 message: " + message); + } +} diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageController.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageController.java new file mode 100644 index 0000000000..75d4d20e55 --- /dev/null +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageController.java @@ -0,0 +1,26 @@ +package com.baeldung.springamqpsimple.broadcast; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Controller +public class BroadcastMessageController { + + private final BroadcastMessageProducer messageProducer; + + @Autowired + public BroadcastMessageController(BroadcastMessageProducer messageProducer) { + this.messageProducer = messageProducer; + } + + @RequestMapping(value="/broadcast", method= RequestMethod.POST) + @ResponseStatus(value= HttpStatus.CREATED) + public void sendMessage(@RequestBody String message) { + messageProducer.sendMessages(message); + } +} diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageProducer.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageProducer.java new file mode 100644 index 0000000000..590da24962 --- /dev/null +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastMessageProducer.java @@ -0,0 +1,22 @@ +package com.baeldung.springamqpsimple.broadcast; + +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class BroadcastMessageProducer { + + private final RabbitTemplate rabbitTemplate; + + @Autowired + public BroadcastMessageProducer(RabbitTemplate rabbitTemplate) { + this.rabbitTemplate = rabbitTemplate; + } + + public void sendMessages(String message) { + rabbitTemplate.convertAndSend(BroadcastConfig.fanoutExchangeName, "", message); + rabbitTemplate.convertAndSend(BroadcastConfig.topicExchangeName, "user.not-important.info", message); + rabbitTemplate.convertAndSend(BroadcastConfig.topicExchangeName, "user.important.error", message); + } +} diff --git a/spring-amqp-simple/src/main/resources/application.yaml b/spring-amqp-simple/src/main/resources/application.yaml index 4aca1bb783..47e7a3b9e0 100644 --- a/spring-amqp-simple/src/main/resources/application.yaml +++ b/spring-amqp-simple/src/main/resources/application.yaml @@ -1,4 +1,5 @@ spring: rabbitmq: - username: baeldung - password: baeldung \ No newline at end of file + username: guest + password: guest + host: 10.10.10.105 \ No newline at end of file diff --git a/spring-amqp-simple/src/test/java/broadcast/BroadcastMessageControllerIntegrationTest.java b/spring-amqp-simple/src/test/java/broadcast/BroadcastMessageControllerIntegrationTest.java new file mode 100644 index 0000000000..c3be7f1ede --- /dev/null +++ b/spring-amqp-simple/src/test/java/broadcast/BroadcastMessageControllerIntegrationTest.java @@ -0,0 +1,48 @@ +package broadcast; + +import com.baeldung.springamqpsimple.broadcast.BroadcastConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@RunWith(SpringRunner.class) +@ActiveProfiles("test") +@SpringBootTest(webEnvironment = RANDOM_PORT) +public class BroadcastMessageControllerIntegrationTest { + + @Autowired + private TestRestTemplate restTemplate; + + @MockBean + private RabbitTemplate rabbitTemplate; + + @Test + public void whenPostingMessage_thenMessageIsCreated() { + final String message = "Hello World!"; + ResponseEntity responseEntity = restTemplate.postForEntity("/broadcast", message, Void.class); + + assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); + } + + @Test + public void whenPostingMessage_thenMessageIsSentToBroker() { + final String message = "Hello World!"; + restTemplate.postForEntity("/broadcast", message, Void.class); + + verify(rabbitTemplate).convertAndSend(BroadcastConfig.fanoutExchangeName, "", message); + verify(rabbitTemplate).convertAndSend(BroadcastConfig.topicExchangeName, "user.not-important.info", message); + verify(rabbitTemplate).convertAndSend(BroadcastConfig.topicExchangeName, "user.important.error", message); + } +} \ No newline at end of file From 54d24521afecff1be46e8456315748f2f54e78aa Mon Sep 17 00:00:00 2001 From: Vivek Kumar Date: Wed, 19 Apr 2017 14:34:12 +0530 Subject: [PATCH 08/26] add modules for spring boot custom starter BAEL-762 (#1661) --- .../greeter-spring-boot-autoconfigure/pom.xml | 59 +++++++++++++++++++ .../GreeterAutoConfiguration.java | 48 +++++++++++++++ .../autoconfigure/GreeterProperties.java | 54 +++++++++++++++++ .../main/resources/META-INF/spring.factories | 2 + .../greeter-spring-boot-sample-app/pom.xml | 39 ++++++++++++ .../sample/GreeterSampleApplication.java | 25 ++++++++ .../src/main/resources/application.properties | 2 + .../sample/GreeterSampleApplicationTest.java | 50 ++++++++++++++++ .../greeter-spring-boot-starter/pom.xml | 51 ++++++++++++++++ spring-boot-custom-starter/greeter/README.md | 19 ++++++ spring-boot-custom-starter/greeter/pom.xml | 38 ++++++++++++ .../java/com/baeldung/greeter/Greeter.java | 35 +++++++++++ .../baeldung/greeter/GreeterConfigParams.java | 11 ++++ .../com/baeldung/greeter/GreetingConfig.java | 9 +++ .../com/baeldung/greeter/GreeterTest.java | 56 ++++++++++++++++++ spring-boot-custom-starter/pom.xml | 34 +++++++++++ 16 files changed, 532 insertions(+) create mode 100644 spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml create mode 100644 spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterAutoConfiguration.java create mode 100644 spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterProperties.java create mode 100644 spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories create mode 100644 spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml create mode 100644 spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/java/com/baeldung/greeter/sample/GreeterSampleApplication.java create mode 100644 spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/resources/application.properties create mode 100644 spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/greeter/sample/GreeterSampleApplicationTest.java create mode 100644 spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml create mode 100644 spring-boot-custom-starter/greeter/README.md create mode 100644 spring-boot-custom-starter/greeter/pom.xml create mode 100644 spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/Greeter.java create mode 100644 spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreeterConfigParams.java create mode 100644 spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreetingConfig.java create mode 100644 spring-boot-custom-starter/greeter/src/test/java/com/baeldung/greeter/GreeterTest.java create mode 100644 spring-boot-custom-starter/pom.xml diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml new file mode 100644 index 0000000000..62c3676ae4 --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml @@ -0,0 +1,59 @@ + + 4.0.0 + + com.baeldung + greeter-spring-boot-autoconfigure + 0.0.1-SNAPSHOT + + + UTF-8 + 1.5.2.RELEASE + 0.0.1-SNAPSHOT + + + + + + org.springframework.boot + spring-boot + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring-boot.version} + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring-boot.version} + true + + + + com.baeldung + greeter + ${greeter.version} + true + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + \ No newline at end of file diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterAutoConfiguration.java b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterAutoConfiguration.java new file mode 100644 index 0000000000..4cf078aa00 --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterAutoConfiguration.java @@ -0,0 +1,48 @@ +package com.baeldung.greeter.autoconfigure; + +import static com.baeldung.greeter.GreeterConfigParams.*; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.greeter.Greeter; +import com.baeldung.greeter.GreetingConfig; + +@Configuration +@ConditionalOnClass(Greeter.class) +@EnableConfigurationProperties(GreeterProperties.class) +public class GreeterAutoConfiguration { + + @Autowired + private GreeterProperties greeterProperties; + + @Bean + @ConditionalOnMissingBean + public GreetingConfig greeterConfig() { + + String userName = greeterProperties.getUserName() == null ? System.getProperty("user.name") : greeterProperties.getUserName(); + String morningMessage = greeterProperties.getMorningMessage() == null ? "Good Morning" : greeterProperties.getMorningMessage(); + String afternoonMessage = greeterProperties.getAfternoonMessage() == null ? "Good Afternoon" : greeterProperties.getAfternoonMessage(); + String eveningMessage = greeterProperties.getEveningMessage() == null ? "Good Evening" : greeterProperties.getEveningMessage(); + String nightMessage = greeterProperties.getNightMessage() == null ? "Good Night" : greeterProperties.getNightMessage(); + + GreetingConfig greetingConfig = new GreetingConfig(); + greetingConfig.put(USER_NAME, userName); + greetingConfig.put(MORNING_MESSAGE, morningMessage); + greetingConfig.put(AFTERNOON_MESSAGE, afternoonMessage); + greetingConfig.put(EVENING_MESSAGE, eveningMessage); + greetingConfig.put(NIGHT_MESSAGE, nightMessage); + return greetingConfig; + } + + @Bean + @ConditionalOnMissingBean + public Greeter greeter(GreetingConfig greetingConfig) { + return new Greeter(greetingConfig); + } + +} diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterProperties.java b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterProperties.java new file mode 100644 index 0000000000..c60c45c8c6 --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterProperties.java @@ -0,0 +1,54 @@ +package com.baeldung.greeter.autoconfigure; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "baeldung.greeter") +public class GreeterProperties { + + private String userName; + private String morningMessage; + private String afternoonMessage; + private String eveningMessage; + private String nightMessage; + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getMorningMessage() { + return morningMessage; + } + + public void setMorningMessage(String morningMessage) { + this.morningMessage = morningMessage; + } + + public String getAfternoonMessage() { + return afternoonMessage; + } + + public void setAfternoonMessage(String afternoonMessage) { + this.afternoonMessage = afternoonMessage; + } + + public String getEveningMessage() { + return eveningMessage; + } + + public void setEveningMessage(String eveningMessage) { + this.eveningMessage = eveningMessage; + } + + public String getNightMessage() { + return nightMessage; + } + + public void setNightMessage(String nightMessage) { + this.nightMessage = nightMessage; + } + +} diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..418201227b --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.baeldung.greeter.autoconfigure.GreeterAutoConfiguration \ No newline at end of file diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml new file mode 100644 index 0000000000..bb1d35cfaa --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + + com.baeldung + greeter-spring-boot-sample-app + 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.2.RELEASE + + + + + UTF-8 + 1.8 + 0.0.1-SNAPSHOT + + + + + + com.baeldung + greeter-spring-boot-starter + ${greeter-starter.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + \ No newline at end of file diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/java/com/baeldung/greeter/sample/GreeterSampleApplication.java b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/java/com/baeldung/greeter/sample/GreeterSampleApplication.java new file mode 100644 index 0000000000..3c87524648 --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/java/com/baeldung/greeter/sample/GreeterSampleApplication.java @@ -0,0 +1,25 @@ +package com.baeldung.greeter.sample; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import com.baeldung.greeter.Greeter; + +@SpringBootApplication +public class GreeterSampleApplication implements CommandLineRunner { + + @Autowired + private Greeter greeter; + + public static void main(String[] args) { + SpringApplication.run(GreeterSampleApplication.class, args); + } + + @Override + public void run(String... args) throws Exception { + String message = greeter.greet(); + System.out.println(message); + } +} diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/resources/application.properties b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/resources/application.properties new file mode 100644 index 0000000000..6136e602f7 --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/resources/application.properties @@ -0,0 +1,2 @@ +baeldung.greeter.userName=Baeldung +baeldung.greeter.afternoonMessage=Woha\ Afternoon diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/greeter/sample/GreeterSampleApplicationTest.java b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/greeter/sample/GreeterSampleApplicationTest.java new file mode 100644 index 0000000000..bdb8fd0112 --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/greeter/sample/GreeterSampleApplicationTest.java @@ -0,0 +1,50 @@ +package com.baeldung.greeter.sample; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; + +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.SpringJUnit4ClassRunner; + +import com.baeldung.greeter.Greeter; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = GreeterSampleApplication.class) +public class GreeterSampleApplicationTest { + + @Autowired + private Greeter greeter; + + @Test + public void givenMorningTime_ifMorningMessage_thenSuccess() { + String expected = "Hello Baeldung, Good Morning"; + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 6, 0)); + assertEquals(expected, actual); + } + + @Test + public void givenAfternoonTime_ifAfternoonMessage_thenSuccess() { + String expected = "Hello Baeldung, Woha Afternoon"; + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 13, 0)); + assertEquals(expected, actual); + } + + @Test + public void givenEveningTime_ifEveningMessage_thenSuccess() { + String expected = "Hello Baeldung, Good Evening"; + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 19, 0)); + assertEquals(expected, actual); + } + + @Test + public void givenNightTime_ifNightMessage_thenSuccess() { + String expected = "Hello Baeldung, Good Night"; + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 21, 0)); + assertEquals(expected, actual); + } + +} diff --git a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml new file mode 100644 index 0000000000..7b38c53c09 --- /dev/null +++ b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + + com.baeldung + greeter-spring-boot-starter + 0.0.1-SNAPSHOT + + + UTF-8 + 0.0.1-SNAPSHOT + 1.5.2.RELEASE + + + + + + org.springframework.boot + spring-boot-starter + ${spring-boot.version} + + + + com.baeldung + greeter-spring-boot-autoconfigure + ${project.version} + + + + com.baeldung + greeter + ${greeter.version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + \ No newline at end of file diff --git a/spring-boot-custom-starter/greeter/README.md b/spring-boot-custom-starter/greeter/README.md new file mode 100644 index 0000000000..3b26cbddcb --- /dev/null +++ b/spring-boot-custom-starter/greeter/README.md @@ -0,0 +1,19 @@ +# Greeter App + +This app takes in the user's name and messages for different times of day as configuration parameters and outptus the greeting messge. For example it will take the name **John** and the message for morning time as **Good Morning** and output the message **Hello John, Good Morning**. + +## Usage + +Create and populate the class `GreetingConfig`, instantiate a `Greeter` using the `GreetingConfig` and use it get greeting messages: + +```java +GreetingConfig greetingConfig = new GreetingConfig(); +greetingConfig.put(USER_NAME, "World"); +greetingConfig.put(MORNING_MESSAGE, "Good Morning"); +greetingConfig.put(AFTERNOON_MESSAGE, "Good Afternoon"); +greetingConfig.put(EVENING_MESSAGE, "Good Evening"); +greetingConfig.put(NIGHT_MESSAGE, "Good Night"); + +Greeter greeter = new Greeter(greetingConfig); +greeter.greet(); +``` \ No newline at end of file diff --git a/spring-boot-custom-starter/greeter/pom.xml b/spring-boot-custom-starter/greeter/pom.xml new file mode 100644 index 0000000000..b0e37a9ed9 --- /dev/null +++ b/spring-boot-custom-starter/greeter/pom.xml @@ -0,0 +1,38 @@ + + 4.0.0 + + com.baeldung + greeter + 0.0.1-SNAPSHOT + + + UTF-8 + + + + + + junit + junit + 4.12 + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + \ No newline at end of file diff --git a/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/Greeter.java b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/Greeter.java new file mode 100644 index 0000000000..970561d1fd --- /dev/null +++ b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/Greeter.java @@ -0,0 +1,35 @@ +package com.baeldung.greeter; + +import static com.baeldung.greeter.GreeterConfigParams.*; + +import java.time.LocalDateTime; + +public class Greeter { + + private GreetingConfig greetingConfig; + + public Greeter(GreetingConfig greetingConfig) { + this.greetingConfig = greetingConfig; + } + + public String greet(LocalDateTime localDateTime) { + + String name = greetingConfig.getProperty(USER_NAME); + int hourOfDay = localDateTime.getHour(); + + if (hourOfDay >= 5 && hourOfDay < 12) { + return String.format("Hello %s, %s", name, greetingConfig.get(MORNING_MESSAGE)); + } else if (hourOfDay >= 12 && hourOfDay < 17) { + return String.format("Hello %s, %s", name, greetingConfig.get(AFTERNOON_MESSAGE)); + } else if (hourOfDay >= 17 && hourOfDay < 20) { + return String.format("Hello %s, %s", name, greetingConfig.get(EVENING_MESSAGE)); + } else { + return String.format("Hello %s, %s", name, greetingConfig.get(NIGHT_MESSAGE)); + } + } + + public String greet() { + return greet(LocalDateTime.now()); + } + +} diff --git a/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreeterConfigParams.java b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreeterConfigParams.java new file mode 100644 index 0000000000..fa30b0f312 --- /dev/null +++ b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreeterConfigParams.java @@ -0,0 +1,11 @@ +package com.baeldung.greeter; + +public class GreeterConfigParams { + + public static final String USER_NAME = "user.name"; + public static final String MORNING_MESSAGE = "morning.message"; + public static final String AFTERNOON_MESSAGE = "afternoon.message"; + public static final String EVENING_MESSAGE = "evening.message"; + public static final String NIGHT_MESSAGE = "night.message"; + +} diff --git a/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreetingConfig.java b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreetingConfig.java new file mode 100644 index 0000000000..fbbe11cf4f --- /dev/null +++ b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreetingConfig.java @@ -0,0 +1,9 @@ +package com.baeldung.greeter; + +import java.util.Properties; + +public class GreetingConfig extends Properties{ + + private static final long serialVersionUID = 5662570853707247891L; + +} diff --git a/spring-boot-custom-starter/greeter/src/test/java/com/baeldung/greeter/GreeterTest.java b/spring-boot-custom-starter/greeter/src/test/java/com/baeldung/greeter/GreeterTest.java new file mode 100644 index 0000000000..834f1447bd --- /dev/null +++ b/spring-boot-custom-starter/greeter/src/test/java/com/baeldung/greeter/GreeterTest.java @@ -0,0 +1,56 @@ +package com.baeldung.greeter; + +import static com.baeldung.greeter.GreeterConfigParams.*; +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class GreeterTest { + + private static GreetingConfig greetingConfig; + + @BeforeClass + public static void initalizeGreetingConfig() { + greetingConfig = new GreetingConfig(); + greetingConfig.put(USER_NAME, "World"); + greetingConfig.put(MORNING_MESSAGE, "Good Morning"); + greetingConfig.put(AFTERNOON_MESSAGE, "Good Afternoon"); + greetingConfig.put(EVENING_MESSAGE, "Good Evening"); + greetingConfig.put(NIGHT_MESSAGE, "Good Night"); + } + + @Test + public void givenMorningTime_ifMorningMessage_thenSuccess() { + String expected = "Hello World, Good Morning"; + Greeter greeter = new Greeter(greetingConfig); + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 6, 0)); + assertEquals(expected, actual); + } + + @Test + public void givenAfternoonTime_ifAfternoonMessage_thenSuccess() { + String expected = "Hello World, Good Afternoon"; + Greeter greeter = new Greeter(greetingConfig); + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 13, 0)); + assertEquals(expected, actual); + } + + @Test + public void givenEveningTime_ifEveningMessage_thenSuccess() { + String expected = "Hello World, Good Evening"; + Greeter greeter = new Greeter(greetingConfig); + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 19, 0)); + assertEquals(expected, actual); + } + + @Test + public void givenNightTime_ifNightMessage_thenSuccess() { + String expected = "Hello World, Good Night"; + Greeter greeter = new Greeter(greetingConfig); + String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 21, 0)); + assertEquals(expected, actual); + } +} diff --git a/spring-boot-custom-starter/pom.xml b/spring-boot-custom-starter/pom.xml new file mode 100644 index 0000000000..e24ff071d4 --- /dev/null +++ b/spring-boot-custom-starter/pom.xml @@ -0,0 +1,34 @@ + + 4.0.0 + com.baeldung + spring-boot-custom-starter + 0.0.1-SNAPSHOT + pom + + + UTF-8 + + + + greeter + greeter-spring-boot-autoconfigure + greeter-spring-boot-starter + greeter-spring-boot-sample-app + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + \ No newline at end of file From 699cf9d77bd769615b609d8dcff84b104f51078d Mon Sep 17 00:00:00 2001 From: lor6 Date: Wed, 19 Apr 2017 15:27:02 +0300 Subject: [PATCH 09/26] Bael 736 (#1685) * dynamic validation * small fixes * remove set property * fix conflicts * fix conflicts * add optional * small fix * update get --- .../ContactInfoValidator.java | 24 ++++++++++++------- .../config/CustomerController.java | 3 --- .../config/PersistenceConfig.java | 6 ----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java index 81345eac83..c12c28d00a 100644 --- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java +++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java @@ -2,6 +2,7 @@ package com.baeldung.dynamicvalidation; import com.baeldung.dynamicvalidation.dao.ContactInfoExpressionRepository; import com.baeldung.dynamicvalidation.model.ContactInfoExpression; +import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.thymeleaf.util.StringUtils; @@ -12,27 +13,34 @@ import java.util.regex.Pattern; public class ContactInfoValidator implements ConstraintValidator { + private static final Logger LOG = Logger.getLogger(ContactInfoValidator.class); + @Autowired private ContactInfoExpressionRepository expressionRepository; @Value("${contactInfoType}") String expressionType; + private String pattern; + @Override public void initialize(final ContactInfo contactInfo) { + if (StringUtils.isEmptyOrWhitespace(expressionType)) { + LOG.error("Contact info type missing!"); + } else { + pattern = expressionRepository.findOne(expressionType) + .map(ContactInfoExpression::getPattern) + .orElse(""); + } } @Override public boolean isValid(final String value, final ConstraintValidatorContext context) { - if (StringUtils.isEmptyOrWhitespace(expressionType)) { - return false; + if (!StringUtils.isEmptyOrWhitespace(pattern)) { + return Pattern.matches(pattern, value); } - - return expressionRepository - .findOne(expressionType) - .map(ContactInfoExpression::getPattern) - .map(p -> Pattern.matches(p, value)) - .orElse(false); + LOG.error("Contact info pattern missing!"); + return false; } } diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java index d1e6b845d7..f08271f307 100644 --- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java +++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/CustomerController.java @@ -1,10 +1,7 @@ package com.baeldung.dynamicvalidation.config; -import java.util.List; - import javax.validation.Valid; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java index 0eeac2a8dc..d89dfc5fcd 100644 --- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java +++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/config/PersistenceConfig.java @@ -6,7 +6,6 @@ import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; @@ -16,11 +15,6 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; @Configuration public class PersistenceConfig { - @Bean - public JdbcTemplate getJdbcTemplate() { - return new JdbcTemplate(dataSource()); - } - @Bean public DataSource dataSource() { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); From 5e1e320cee3643668bc1ae154412f128ca4b0c28 Mon Sep 17 00:00:00 2001 From: Doha2012 Date: Wed, 19 Apr 2017 16:14:10 +0200 Subject: [PATCH 10/26] exclude commons-logging dependency (#1686) * upgrade to spring boot 1.5.2 * add full update to REST API * modify ratings controller * upgrade herold * fix integration test * fix integration test * minor fix * fix integration test * fix integration test * minor cleanup * minor cleanup * remove log4j properties * use standard logbook.xml * remove log4j dependencies * remove commons-logging * merge * fix conflict * exclude commons-logging dependency * cleanup * minor fix * minor fix --- apache-cxf/cxf-jaxrs-implementation/pom.xml | 6 +++++ apache-cxf/cxf-spring/pom.xml | 6 +++++ apache-fop/pom.xml | 10 ++++++++ apache-poi/pom.xml | 6 +++++ apache-thrift/pom.xml | 6 +++++ apache-velocity/pom.xml | 8 ++++++- aspectj/pom.xml | 2 +- aws/pom.xml | 12 ++++++++++ cdi/pom.xml | 6 +++++ core-java/pom.xml | 6 +++++ couchbase-sdk/pom.xml | 12 ++++++++++ hbase/pom.xml | 6 +++++ httpclient/pom.xml | 12 ++++++++++ hystrix/pom.xml | 6 +++++ image-processing/pom.xml | 12 ++++++++++ javax-servlets/pom.xml | 6 +++++ jsf/pom.xml | 6 +++++ json/pom.xml | 6 +++++ libraries/pom.xml | 24 +++++++++++++++++++ log-mdc/pom.xml | 2 +- log4j2/pom.xml | 6 +++++ mapstruct/pom.xml | 6 +++++ pdf/pom.xml | 12 ++++++++++ querydsl/pom.xml | 6 +++++ rest-assured/pom.xml | 19 +++++++++------ rest-testing/pom.xml | 6 +++++ resteasy/pom.xml | 6 +++++ selenium-junit-testng/pom.xml | 6 +++++ spring-akka/pom.xml | 6 +++++ spring-all/pom.xml | 12 ++++++++++ .../springamqpsimple/MessageConsumer.java | 2 +- spring-amqp/pom.xml | 6 +++++ spring-apache-camel/pom.xml | 6 +++++ spring-batch/pom.xml | 6 +++++ .../spring-cloud-zookeeper/Greeting/pom.xml | 6 +++++ .../spring-cloud-zookeeper/HelloWorld/pom.xml | 6 +++++ spring-core/pom.xml | 6 +++++ spring-data-cassandra/pom.xml | 12 ++++++++++ spring-data-couchbase-2/pom.xml | 6 +++++ spring-data-dynamodb/pom.xml | 6 +++++ spring-data-elasticsearch/pom.xml | 6 +++++ spring-data-gemfire/pom.xml | 6 +++++ spring-data-mongodb/pom.xml | 6 +++++ spring-data-neo4j/pom.xml | 18 ++++++++++++++ spring-data-redis/pom.xml | 6 +++++ spring-data-solr/pom.xml | 6 +++++ spring-dispatcher-servlet/pom.xml | 6 +++++ spring-exceptions/pom.xml | 12 ++++++++++ spring-hibernate3/pom.xml | 6 +++++ spring-hibernate4/pom.xml | 6 +++++ spring-hibernate5/pom.xml | 6 +++++ spring-integration/pom.xml | 6 +++++ spring-jersey/pom.xml | 6 +++++ spring-jms/pom.xml | 6 +++++ spring-jooq/pom.xml | 6 +++++ spring-jpa/pom.xml | 6 +++++ spring-ldap/pom.xml | 6 +++++ spring-mvc-forms/pom.xml | 6 +++++ spring-mvc-java/pom.xml | 6 +++++ spring-mvc-simple/pom.xml | 11 +++++---- spring-mvc-tiles/pom.xml | 6 +++++ spring-mvc-velocity/pom.xml | 12 ++++++++++ spring-mvc-web-vs-initializer/pom.xml | 6 +++++ spring-mvc-xml/pom.xml | 12 +++++++++- spring-spel/pom.xml | 6 +++++ spring-state-machine/pom.xml | 6 +++++ spring-userservice/pom.xml | 6 +++++ struts2/pom.xml | 6 +++++ video-tutorials/jackson-annotations/pom.xml | 6 +++++ 69 files changed, 499 insertions(+), 17 deletions(-) diff --git a/apache-cxf/cxf-jaxrs-implementation/pom.xml b/apache-cxf/cxf-jaxrs-implementation/pom.xml index c3095be5a5..61a5132f19 100644 --- a/apache-cxf/cxf-jaxrs-implementation/pom.xml +++ b/apache-cxf/cxf-jaxrs-implementation/pom.xml @@ -54,6 +54,12 @@ org.apache.httpcomponents httpclient ${httpclient.version} + + + commons-logging + commons-logging + + diff --git a/apache-cxf/cxf-spring/pom.xml b/apache-cxf/cxf-spring/pom.xml index 79a7650ced..dffcc3ee1b 100644 --- a/apache-cxf/cxf-spring/pom.xml +++ b/apache-cxf/cxf-spring/pom.xml @@ -24,6 +24,12 @@ org.springframework spring-context ${spring.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/apache-fop/pom.xml b/apache-fop/pom.xml index 635e5c6a0b..2de9611ad1 100644 --- a/apache-fop/pom.xml +++ b/apache-fop/pom.xml @@ -73,6 +73,10 @@ org.apache.avalon.framework avalon-framework-impl + + commons-logging + commons-logging + @@ -85,6 +89,12 @@ avalon-framework avalon-framework-impl ${avalon-framework.version} + + + commons-logging + commons-logging + + diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml index d8a2cc72e0..b619d3adcb 100644 --- a/apache-poi/pom.xml +++ b/apache-poi/pom.xml @@ -42,6 +42,12 @@ org.jxls jxls-jexcel ${jexcel.version} + + + commons-logging + commons-logging + + diff --git a/apache-thrift/pom.xml b/apache-thrift/pom.xml index 66cfb2bb41..e275dc0636 100644 --- a/apache-thrift/pom.xml +++ b/apache-thrift/pom.xml @@ -19,6 +19,12 @@ org.apache.thrift libthrift ${thrift.version} + + + commons-logging + commons-logging + + diff --git a/apache-velocity/pom.xml b/apache-velocity/pom.xml index 08f0e96a58..06cfeabfa8 100644 --- a/apache-velocity/pom.xml +++ b/apache-velocity/pom.xml @@ -38,7 +38,7 @@ org.apache.velocity velocity-tools - ${velocity-tools-version} + ${velocity-tools-version} org.slf4j @@ -55,6 +55,12 @@ httpclient ${org.apache.httpcomponents.version} test + + + commons-logging + commons-logging + + diff --git a/aspectj/pom.xml b/aspectj/pom.xml index cbc98dac81..2ef2ae9df7 100644 --- a/aspectj/pom.xml +++ b/aspectj/pom.xml @@ -58,7 +58,7 @@ org.springframework spring-core - 4.3.4.RELEASE + 4.3.4.RELEASE cglib diff --git a/aws/pom.xml b/aws/pom.xml index 681b76cfd4..b493dc58e8 100644 --- a/aws/pom.xml +++ b/aws/pom.xml @@ -19,12 +19,24 @@ com.amazonaws aws-lambda-java-core ${aws-lambda-java-core.version} + + + commons-logging + commons-logging + + com.amazonaws aws-lambda-java-events ${aws-lambda-java-events.version} + + + commons-logging + commons-logging + + diff --git a/cdi/pom.xml b/cdi/pom.xml index e5aaeb2c7b..d2fcec59d7 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -12,6 +12,12 @@ org.springframework spring-core ${spring.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/core-java/pom.xml b/core-java/pom.xml index 44e7df722c..b4741d5b80 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -171,6 +171,12 @@ org.owasp.esapi esapi 2.1.0.1 + + + commons-logging + commons-logging + + diff --git a/couchbase-sdk/pom.xml b/couchbase-sdk/pom.xml index c8ac9c8743..d592a15745 100644 --- a/couchbase-sdk/pom.xml +++ b/couchbase-sdk/pom.xml @@ -22,11 +22,23 @@ org.springframework spring-context ${spring-framework.version} + + + commons-logging + commons-logging + + org.springframework spring-context-support ${spring-framework.version} + + + commons-logging + commons-logging + + diff --git a/hbase/pom.xml b/hbase/pom.xml index 9d523abf1a..c692054f0f 100644 --- a/hbase/pom.xml +++ b/hbase/pom.xml @@ -28,6 +28,12 @@ org.apache.hbase hbase-client ${hbase.version} + + + commons-logging + commons-logging + + org.apache.hbase diff --git a/httpclient/pom.xml b/httpclient/pom.xml index 8f499d4a74..976f04c9c2 100644 --- a/httpclient/pom.xml +++ b/httpclient/pom.xml @@ -41,6 +41,12 @@ org.apache.httpcomponents fluent-hc ${httpclient.version} + + + commons-logging + commons-logging + + @@ -59,6 +65,12 @@ org.apache.httpcomponents httpasyncclient ${httpasyncclient.version} + + + commons-logging + commons-logging + + diff --git a/hystrix/pom.xml b/hystrix/pom.xml index ba1a596631..5ccc66709f 100644 --- a/hystrix/pom.xml +++ b/hystrix/pom.xml @@ -56,6 +56,12 @@ com.netflix.hystrix hystrix-core ${hystrix-core.version} + + + commons-logging + commons-logging + + com.netflix.hystrix diff --git a/image-processing/pom.xml b/image-processing/pom.xml index 8766da571e..1e19686be2 100644 --- a/image-processing/pom.xml +++ b/image-processing/pom.xml @@ -17,11 +17,23 @@ net.imagej ij ${ij.version} + + + commons-logging + commons-logging + + org.openimaj core-image ${core-image.version} + + + commons-logging + commons-logging + + diff --git a/javax-servlets/pom.xml b/javax-servlets/pom.xml index 68a1b9c441..c5eeafbab3 100644 --- a/javax-servlets/pom.xml +++ b/javax-servlets/pom.xml @@ -49,6 +49,12 @@ httpclient ${org.apache.httpcomponents.version} test + + + commons-logging + commons-logging + + diff --git a/jsf/pom.xml b/jsf/pom.xml index 41c90824b6..a206870f89 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -65,6 +65,12 @@ org.springframework spring-web ${org.springframework.version} + + + commons-logging + commons-logging + + javax.servlet diff --git a/json/pom.xml b/json/pom.xml index 2b2f80e987..f22626ce70 100644 --- a/json/pom.xml +++ b/json/pom.xml @@ -11,6 +11,12 @@ org.everit.json org.everit.json.schema ${everit.json.schema.version} + + + commons-logging + commons-logging + + diff --git a/libraries/pom.xml b/libraries/pom.xml index 939d674d97..ba16995d8f 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -111,6 +111,12 @@ org.apache.httpcomponents httpclient ${httpclient.version} + + + commons-logging + commons-logging + + commons-io @@ -131,6 +137,12 @@ org.apache.httpcomponents httpclient ${httpclient.version} + + + commons-logging + commons-logging + + commons-io @@ -141,11 +153,23 @@ org.apache.flink flink-core ${flink.version} + + + commons-logging + commons-logging + + org.apache.flink flink-java ${flink.version} + + + commons-logging + commons-logging + + org.apache.flink diff --git a/log-mdc/pom.xml b/log-mdc/pom.xml index 931e68a178..10dcb3eaf0 100644 --- a/log-mdc/pom.xml +++ b/log-mdc/pom.xml @@ -13,7 +13,7 @@ org.springframework spring-core - ${springframework.version} + ${springframework.version} org.springframework diff --git a/log4j2/pom.xml b/log4j2/pom.xml index a4c8f19f69..1267caeb08 100644 --- a/log4j2/pom.xml +++ b/log4j2/pom.xml @@ -44,6 +44,12 @@ org.apache.commons commons-dbcp2 ${commons-dbcp2.version} + + + commons-logging + commons-logging + + diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml index 72a67d19db..81bcdb4cb9 100644 --- a/mapstruct/pom.xml +++ b/mapstruct/pom.xml @@ -32,6 +32,12 @@ org.springframework spring-context ${springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/pdf/pom.xml b/pdf/pom.xml index 332e1f5244..53232377b5 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -37,11 +37,23 @@ org.apache.pdfbox pdfbox-tools ${pdfbox-tools.version} + + + commons-logging + commons-logging + + net.sf.cssbox pdf2dom ${pdf2dom.version} + + + commons-logging + commons-logging + + com.itextpdf diff --git a/querydsl/pom.xml b/querydsl/pom.xml index 1335d0f1fd..d6fe7f4191 100644 --- a/querydsl/pom.xml +++ b/querydsl/pom.xml @@ -91,6 +91,12 @@ org.springframework spring-context ${spring.version} + + + commons-logging + commons-logging + + diff --git a/rest-assured/pom.xml b/rest-assured/pom.xml index 2c8039401e..0c3bf38dc5 100644 --- a/rest-assured/pom.xml +++ b/rest-assured/pom.xml @@ -71,12 +71,6 @@ ${logback.version} - - commons-logging - commons-logging - ${commons-logging.version} - - org.apache.httpcomponents httpcore @@ -151,6 +145,12 @@ org.apache.httpcomponents httpclient ${httpclient.version} + + + commons-logging + commons-logging + + @@ -184,6 +184,12 @@ com.github.fge json-schema-core ${json-schema-core.version} + + + commons-logging + commons-logging + + junit @@ -282,7 +288,6 @@ 3.5 - 1.2 3.2.2 4.4.5 diff --git a/rest-testing/pom.xml b/rest-testing/pom.xml index e3231c4fb4..a6a9bb39b3 100644 --- a/rest-testing/pom.xml +++ b/rest-testing/pom.xml @@ -35,6 +35,12 @@ org.apache.httpcomponents httpclient ${httpclient.version} + + + commons-logging + commons-logging + + org.apache.httpcomponents diff --git a/resteasy/pom.xml b/resteasy/pom.xml index f0bd8298f5..eacde92353 100644 --- a/resteasy/pom.xml +++ b/resteasy/pom.xml @@ -67,6 +67,12 @@ org.jboss.resteasy resteasy-servlet-initializer ${resteasy.version} + + + commons-logging + commons-logging + + diff --git a/selenium-junit-testng/pom.xml b/selenium-junit-testng/pom.xml index b4490f779b..fceeb6eec6 100644 --- a/selenium-junit-testng/pom.xml +++ b/selenium-junit-testng/pom.xml @@ -56,6 +56,12 @@ org.seleniumhq.selenium selenium-java ${selenium-java.version} + + + commons-logging + commons-logging + + junit diff --git a/spring-akka/pom.xml b/spring-akka/pom.xml index 5965213e65..497022064c 100644 --- a/spring-akka/pom.xml +++ b/spring-akka/pom.xml @@ -12,6 +12,12 @@ org.springframework spring-context + + + commons-logging + commons-logging + + diff --git a/spring-all/pom.xml b/spring-all/pom.xml index 076465f2f6..7fbb6acced 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -25,6 +25,12 @@ org.springframework spring-web + + + commons-logging + commons-logging + + org.springframework @@ -111,6 +117,12 @@ net.sf.jasperreports jasperreports ${jasperreports.version} + + + commons-logging + commons-logging + + diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java index 086492e15b..6eb13c18f6 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/MessageConsumer.java @@ -14,4 +14,4 @@ public class MessageConsumer { public void receiveMessage(String message) { logger.info("Received Message: " + message); } -} +} \ No newline at end of file diff --git a/spring-amqp/pom.xml b/spring-amqp/pom.xml index bb26b2d15d..4eef6070c7 100755 --- a/spring-amqp/pom.xml +++ b/spring-amqp/pom.xml @@ -20,6 +20,12 @@ org.springframework.amqp spring-rabbit 1.6.6.RELEASE + + + commons-logging + commons-logging + + diff --git a/spring-apache-camel/pom.xml b/spring-apache-camel/pom.xml index 04d07426d3..0b1b10a730 100644 --- a/spring-apache-camel/pom.xml +++ b/spring-apache-camel/pom.xml @@ -35,6 +35,12 @@ org.apache.camel camel-spring ${env.camel.version} + + + commons-logging + commons-logging + + diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml index a92a0e8323..8885bd452c 100644 --- a/spring-batch/pom.xml +++ b/spring-batch/pom.xml @@ -27,6 +27,12 @@ org.springframework spring-oxm ${spring.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml index de76c86a24..78a0e05b77 100644 --- a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml +++ b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml @@ -24,6 +24,12 @@ org.springframework.cloud spring-cloud-starter-zookeeper-discovery 1.0.3.RELEASE + + + commons-logging + commons-logging + + org.springframework.boot diff --git a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml index 1c829a50df..00af49eaa8 100644 --- a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml +++ b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml @@ -24,6 +24,12 @@ org.springframework.cloud spring-cloud-starter-zookeeper-discovery 1.0.3.RELEASE + + + commons-logging + commons-logging + + diff --git a/spring-core/pom.xml b/spring-core/pom.xml index 3b423104d7..b04f434481 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -25,6 +25,12 @@ org.springframework spring-core ${spring.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-data-cassandra/pom.xml b/spring-data-cassandra/pom.xml index 316eb2f58b..49a222e93d 100644 --- a/spring-data-cassandra/pom.xml +++ b/spring-data-cassandra/pom.xml @@ -37,6 +37,12 @@ org.springframework spring-core ${org.springframework.version} + + + commons-logging + commons-logging + + junit @@ -72,6 +78,12 @@ org.hectorclient hector-core ${hector-core.version} + + + commons-logging + commons-logging + + com.datastax.cassandra diff --git a/spring-data-couchbase-2/pom.xml b/spring-data-couchbase-2/pom.xml index b3933d9fcd..26a9ffcf2d 100644 --- a/spring-data-couchbase-2/pom.xml +++ b/spring-data-couchbase-2/pom.xml @@ -14,6 +14,12 @@ org.springframework spring-context ${spring-framework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-data-dynamodb/pom.xml b/spring-data-dynamodb/pom.xml index 8b06c0b36f..3216318665 100644 --- a/spring-data-dynamodb/pom.xml +++ b/spring-data-dynamodb/pom.xml @@ -94,6 +94,12 @@ com.amazonaws aws-java-sdk-dynamodb ${aws-java-sdk-dynamodb.version} + + + commons-logging + commons-logging + + com.github.derjust diff --git a/spring-data-elasticsearch/pom.xml b/spring-data-elasticsearch/pom.xml index f4a43fac09..513a0a591b 100644 --- a/spring-data-elasticsearch/pom.xml +++ b/spring-data-elasticsearch/pom.xml @@ -30,6 +30,12 @@ org.springframework spring-core ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework.data diff --git a/spring-data-gemfire/pom.xml b/spring-data-gemfire/pom.xml index eb450ebc81..ab510bc2bc 100644 --- a/spring-data-gemfire/pom.xml +++ b/spring-data-gemfire/pom.xml @@ -60,6 +60,12 @@ org.springframework spring-context ${spring-context-version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 3352baa6aa..f5d7cf9eff 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -20,6 +20,12 @@ org.springframework spring-core ${org.springframework.version} + + + commons-logging + commons-logging + + diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml index 7df48498e5..6f08fe293b 100644 --- a/spring-data-neo4j/pom.xml +++ b/spring-data-neo4j/pom.xml @@ -35,6 +35,12 @@ org.springframework.data spring-data-neo4j ${spring-data-neo4j.version} + + + commons-logging + commons-logging + + @@ -70,6 +76,12 @@ neo4j-server ${neo4j.version} test-jar + + + commons-logging + commons-logging + + @@ -95,6 +107,12 @@ org.springframework spring-test ${spring-test.version} + + + commons-logging + commons-logging + + diff --git a/spring-data-redis/pom.xml b/spring-data-redis/pom.xml index 720526932e..f006026c81 100644 --- a/spring-data-redis/pom.xml +++ b/spring-data-redis/pom.xml @@ -42,6 +42,12 @@ org.springframework spring-core ${spring.version} + + + commons-logging + commons-logging + + diff --git a/spring-data-solr/pom.xml b/spring-data-solr/pom.xml index 0019c7ff9c..54fc0d3294 100644 --- a/spring-data-solr/pom.xml +++ b/spring-data-solr/pom.xml @@ -22,6 +22,12 @@ org.springframework spring-core ${spring.version} + + + commons-logging + commons-logging + + org.springframework.data diff --git a/spring-dispatcher-servlet/pom.xml b/spring-dispatcher-servlet/pom.xml index e4812485c1..b6210971ae 100644 --- a/spring-dispatcher-servlet/pom.xml +++ b/spring-dispatcher-servlet/pom.xml @@ -25,6 +25,12 @@ org.springframework spring-webmvc ${org.springframework.version} + + + commons-logging + commons-logging + + org.thymeleaf diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml index a8254151aa..8733f8f2f4 100644 --- a/spring-exceptions/pom.xml +++ b/spring-exceptions/pom.xml @@ -15,11 +15,23 @@ org.springframework spring-web ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework spring-webmvc ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-hibernate3/pom.xml b/spring-hibernate3/pom.xml index f7b198a2b1..c45c9bb15e 100644 --- a/spring-hibernate3/pom.xml +++ b/spring-hibernate3/pom.xml @@ -14,6 +14,12 @@ org.springframework spring-context ${org.springframework.version} + + + commons-logging + commons-logging + + diff --git a/spring-hibernate4/pom.xml b/spring-hibernate4/pom.xml index dbacb3a60a..8ba0a3700c 100644 --- a/spring-hibernate4/pom.xml +++ b/spring-hibernate4/pom.xml @@ -14,6 +14,12 @@ org.springframework spring-context ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-hibernate5/pom.xml b/spring-hibernate5/pom.xml index 752cbdba1d..ed127c34c1 100644 --- a/spring-hibernate5/pom.xml +++ b/spring-hibernate5/pom.xml @@ -14,6 +14,12 @@ org.springframework spring-context ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index a243f55507..34c40cb00f 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -96,6 +96,12 @@ org.springframework.integration spring-integration-core ${spring.integration.version} + + + commons-logging + commons-logging + + javax.activation diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml index e6c8ea6ef5..8d39da9733 100644 --- a/spring-jersey/pom.xml +++ b/spring-jersey/pom.xml @@ -134,6 +134,12 @@ httpclient ${httpclient.version} test + + + commons-logging + commons-logging + + diff --git a/spring-jms/pom.xml b/spring-jms/pom.xml index de7c734316..da71725d8f 100644 --- a/spring-jms/pom.xml +++ b/spring-jms/pom.xml @@ -23,6 +23,12 @@ org.springframework spring-jms ${springframework.version} + + + commons-logging + commons-logging + + diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index e067e9b47f..4dce21116f 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -35,6 +35,12 @@ org.springframework spring-context + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-jpa/pom.xml b/spring-jpa/pom.xml index 3ca373acea..9ecbddb34d 100644 --- a/spring-jpa/pom.xml +++ b/spring-jpa/pom.xml @@ -16,6 +16,12 @@ org.springframework spring-orm ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-ldap/pom.xml b/spring-ldap/pom.xml index 55014897c4..123e72672a 100644 --- a/spring-ldap/pom.xml +++ b/spring-ldap/pom.xml @@ -107,6 +107,12 @@ spring-ldap-test ${spring-ldap.version} test + + + commons-logging + commons-logging + + diff --git a/spring-mvc-forms/pom.xml b/spring-mvc-forms/pom.xml index e5ffb52801..12b0ba7e7c 100644 --- a/spring-mvc-forms/pom.xml +++ b/spring-mvc-forms/pom.xml @@ -15,6 +15,12 @@ org.springframework spring-webmvc ${springframework.version} + + + commons-logging + commons-logging + + diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index 5c8f6be6fa..f47b723beb 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -84,6 +84,12 @@ net.sourceforge.htmlunit htmlunit ${net.sourceforge.htmlunit} + + + commons-logging + commons-logging + + diff --git a/spring-mvc-simple/pom.xml b/spring-mvc-simple/pom.xml index a004eae4d9..6e96775f26 100644 --- a/spring-mvc-simple/pom.xml +++ b/spring-mvc-simple/pom.xml @@ -27,11 +27,6 @@ javax.servlet-api 3.1.0 - - commons-logging - commons-logging - 1.2 - org.springframework spring-webmvc @@ -46,6 +41,12 @@ org.springframework spring-core ${springframework.version} + + + commons-logging + commons-logging + + javax.servlet.jsp diff --git a/spring-mvc-tiles/pom.xml b/spring-mvc-tiles/pom.xml index 400f79fbe1..684c3abec7 100644 --- a/spring-mvc-tiles/pom.xml +++ b/spring-mvc-tiles/pom.xml @@ -25,6 +25,12 @@ org.springframework spring-core ${springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-mvc-velocity/pom.xml b/spring-mvc-velocity/pom.xml index 0a9b3a016e..51348acd4a 100644 --- a/spring-mvc-velocity/pom.xml +++ b/spring-mvc-velocity/pom.xml @@ -26,6 +26,12 @@ org.springframework spring-core ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework @@ -52,6 +58,12 @@ org.apache.velocity velocity-tools ${velocity-tools.version} + + + commons-logging + commons-logging + + diff --git a/spring-mvc-web-vs-initializer/pom.xml b/spring-mvc-web-vs-initializer/pom.xml index 45ead333f4..1d02039ead 100644 --- a/spring-mvc-web-vs-initializer/pom.xml +++ b/spring-mvc-web-vs-initializer/pom.xml @@ -24,6 +24,12 @@ org.springframework spring-web + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml index 60da3404c9..142b400e5f 100644 --- a/spring-mvc-xml/pom.xml +++ b/spring-mvc-xml/pom.xml @@ -16,6 +16,12 @@ org.springframework spring-web ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework @@ -116,7 +122,11 @@ com.fasterxml.jackson.core jackson-databind - + + commons-logging + commons-logging + + diff --git a/spring-spel/pom.xml b/spring-spel/pom.xml index c3817ce2bd..5bb8480715 100644 --- a/spring-spel/pom.xml +++ b/spring-spel/pom.xml @@ -31,6 +31,12 @@ org.springframework spring-context ${springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml index f04d706d47..d7e7027023 100644 --- a/spring-state-machine/pom.xml +++ b/spring-state-machine/pom.xml @@ -25,6 +25,12 @@ org.springframework spring-test 4.3.7.RELEASE + + + commons-logging + commons-logging + + junit diff --git a/spring-userservice/pom.xml b/spring-userservice/pom.xml index 0f3ed96c4e..58a7cf748f 100644 --- a/spring-userservice/pom.xml +++ b/spring-userservice/pom.xml @@ -127,6 +127,12 @@ org.springframework spring-core ${org.springframework.version} + + + commons-logging + commons-logging + + org.springframework diff --git a/struts2/pom.xml b/struts2/pom.xml index ca5a682f9d..e9c321f908 100644 --- a/struts2/pom.xml +++ b/struts2/pom.xml @@ -63,6 +63,12 @@ org.springframework spring-core 4.3.6.RELEASE + + + commons-logging + commons-logging + + \ No newline at end of file diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml index 07c5d9e863..c4c66ddb44 100644 --- a/video-tutorials/jackson-annotations/pom.xml +++ b/video-tutorials/jackson-annotations/pom.xml @@ -93,6 +93,12 @@ rest-assured 3.0.1 test + + + commons-logging + commons-logging + + From bc6bcc3caf1ec4937b8d6e2bf5c5ae631b5ef343 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Wed, 19 Apr 2017 19:27:30 +0200 Subject: [PATCH 11/26] Mark integration tests (#1690) --- ...=> EmployeeControllerIntegrationTest.java} | 31 +++++++++---------- ...=> EmployeeRepositoryIntegrationTest.java} | 2 +- ...mployeeRestControllerIntegrationTest.java} | 2 +- ...> EmployeeServiceImplIntegrationTest.java} | 2 +- 4 files changed, 17 insertions(+), 20 deletions(-) rename spring-boot/src/test/java/org/baeldung/boot/boottest/{EmployeeRestControllerTest.java => EmployeeControllerIntegrationTest.java} (93%) rename spring-boot/src/test/java/org/baeldung/boot/boottest/{EmployeeRepositoryTest.java => EmployeeRepositoryIntegrationTest.java} (98%) rename spring-boot/src/test/java/org/baeldung/boot/boottest/{EmployeeRestControllerIntTest.java => EmployeeRestControllerIntegrationTest.java} (98%) rename spring-boot/src/test/java/org/baeldung/boot/boottest/{EmployeeServiceImplTest.java => EmployeeServiceImplIntegrationTest.java} (98%) diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeControllerIntegrationTest.java similarity index 93% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java rename to spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeControllerIntegrationTest.java index 71e69cf419..2146fc09bc 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeControllerIntegrationTest.java @@ -1,21 +1,5 @@ package org.baeldung.boot.boottest; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.hasSize; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.verify; -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.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.util.Arrays; -import java.util.List; - -import org.baeldung.boot.boottest.Employee; -import org.baeldung.boot.boottest.EmployeeRestController; -import org.baeldung.boot.boottest.EmployeeService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -28,9 +12,22 @@ import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +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.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + @RunWith(SpringRunner.class) @WebMvcTest(EmployeeRestController.class) -public class EmployeeRestControllerTest { +public class EmployeeControllerIntegrationTest { @Autowired private MockMvc mvc; diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryIntegrationTest.java similarity index 98% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java rename to spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryIntegrationTest.java index a29928bcca..cf94f4be49 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryIntegrationTest.java @@ -17,7 +17,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @DataJpaTest -public class EmployeeRepositoryTest { +public class EmployeeRepositoryIntegrationTest { @Autowired private TestEntityManager entityManager; diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntegrationTest.java similarity index 98% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java rename to spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntegrationTest.java index 6ca8d267f9..110092d293 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntegrationTest.java @@ -31,7 +31,7 @@ import org.springframework.test.web.servlet.MockMvc; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = DemoApplication.class) @AutoConfigureMockMvc @TestPropertySource(locations = "classpath:application-integrationtest.properties") -public class EmployeeRestControllerIntTest { +public class EmployeeRestControllerIntegrationTest { @Autowired private MockMvc mvc; diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplIntegrationTest.java similarity index 98% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java rename to spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplIntegrationTest.java index acb884e851..e8a585a23e 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplIntegrationTest.java @@ -23,7 +23,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) -public class EmployeeServiceImplTest { +public class EmployeeServiceImplIntegrationTest { @TestConfiguration static class EmployeeServiceImplTestContextConfiguration { From 2d1379a46af670069427f1f18c6486e4a37df187 Mon Sep 17 00:00:00 2001 From: Doha2012 Date: Wed, 19 Apr 2017 20:37:34 +0200 Subject: [PATCH 12/26] fix dependency issues (#1691) * upgrade to spring boot 1.5.2 * add full update to REST API * modify ratings controller * upgrade herold * fix integration test * fix integration test * minor fix * fix integration test * fix integration test * minor cleanup * minor cleanup * remove log4j properties * use standard logbook.xml * remove log4j dependencies * remove commons-logging * merge * fix conflict * exclude commons-logging dependency * cleanup * minor fix * minor fix * fix dependency issues * Revert "fix dependency issues" This reverts commit 83bf1f9fd2e1a9a55f9cacb085669568b06b49ec. * fix dependency issues --- libraries/pom.xml | 8 +------- log4j2/pom.xml | 8 +------- spring-state-machine/pom.xml | 8 +------- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index ba16995d8f..c0c2321388 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -136,13 +136,7 @@ org.apache.httpcomponents httpclient - ${httpclient.version} - - - commons-logging - commons-logging - - + ${httpclient.version} commons-io diff --git a/log4j2/pom.xml b/log4j2/pom.xml index 1267caeb08..c348982bcf 100644 --- a/log4j2/pom.xml +++ b/log4j2/pom.xml @@ -43,13 +43,7 @@ org.apache.commons commons-dbcp2 - ${commons-dbcp2.version} - - - commons-logging - commons-logging - - + ${commons-dbcp2.version} diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml index d7e7027023..9dcb51fe4e 100644 --- a/spring-state-machine/pom.xml +++ b/spring-state-machine/pom.xml @@ -24,13 +24,7 @@ org.springframework spring-test - 4.3.7.RELEASE - - - commons-logging - commons-logging - - + 4.3.7.RELEASE junit From 4c6b529571a9ee23d6d3e5a72dff9980eca2468a Mon Sep 17 00:00:00 2001 From: lor6 Date: Wed, 19 Apr 2017 22:03:01 +0300 Subject: [PATCH 13/26] Bael 736 ver2 (#1693) * add notnull * fix formatting --- .../java/com/baeldung/dynamicvalidation/model/Customer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java index f043458fce..78d3580793 100644 --- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java +++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/model/Customer.java @@ -4,6 +4,7 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.validation.constraints.NotNull; import com.baeldung.dynamicvalidation.ContactInfo; @@ -15,6 +16,7 @@ public class Customer { private long id; @ContactInfo + @NotNull private String contactInfo; public Customer() { From 87bc04ae988cbef5611daec552dc398f5ad65bb2 Mon Sep 17 00:00:00 2001 From: Doha2012 Date: Wed, 19 Apr 2017 22:57:17 +0200 Subject: [PATCH 14/26] minor fix (#1694) * upgrade to spring boot 1.5.2 * add full update to REST API * modify ratings controller * upgrade herold * fix integration test * fix integration test * minor fix * fix integration test * fix integration test * minor cleanup * minor cleanup * remove log4j properties * use standard logbook.xml * remove log4j dependencies * remove commons-logging * merge * fix conflict * exclude commons-logging dependency * cleanup * minor fix * minor fix * fix dependency issues * Revert "fix dependency issues" This reverts commit 83bf1f9fd2e1a9a55f9cacb085669568b06b49ec. * fix dependency issues * minor fix --- spring-core/pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spring-core/pom.xml b/spring-core/pom.xml index b04f434481..175a9b64d1 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -24,13 +24,7 @@ org.springframework spring-core - ${spring.version} - - - commons-logging - commons-logging - - + ${spring.version} org.springframework From aa08d1262b83611279e26e9296ecf91e7be67c63 Mon Sep 17 00:00:00 2001 From: lor6 Date: Thu, 20 Apr 2017 01:49:09 +0300 Subject: [PATCH 15/26] spring boot mysql autoconfiguration (#1639) * spring boot mysql autoconfiguration * exclude autoconfig from other main classes * update property condition --- spring-boot/pom.xml | 41 ++++++ .../SpringBootAnnotatedApp.java | 4 +- .../SpringBootPlainApp.java | 4 +- .../MySQLAutoconfiguration.java | 121 ++++++++++++++++++ .../example/AutoconfigurationApplication.java | 15 +++ .../autoconfiguration/example/MyUser.java | 27 ++++ .../example/MyUserRepository.java | 7 + .../FailureAnalyzerApplication.java | 4 +- .../com/baeldung/git/CommitIdApplication.java | 4 +- .../InternationalizationApp.java | 4 +- .../src/main/java/com/baeldung/intro/App.java | 4 +- .../baeldung/servlets/ApplicationMain.java | 4 +- .../java/com/baeldung/utils/Application.java | 4 +- .../webjar/WebjarsdemoApplication.java | 4 +- .../main/java/org/baeldung/Application.java | 4 +- .../org/baeldung/boot/DemoApplication.java | 4 +- .../baeldung/main/SpringBootApplication.java | 4 +- .../session/exception/Application.java | 4 +- .../main/resources/META-INF/spring.factories | 4 +- .../src/main/resources/mysql.properties | 5 + .../AutoconfigurationTest.java | 28 ++++ 21 files changed, 286 insertions(+), 14 deletions(-) create mode 100644 spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java create mode 100644 spring-boot/src/main/java/com/baeldung/autoconfiguration/example/AutoconfigurationApplication.java create mode 100644 spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUser.java create mode 100644 spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUserRepository.java create mode 100644 spring-boot/src/main/resources/mysql.properties create mode 100644 spring-boot/src/test/java/com/baeldung/autoconfiguration/AutoconfigurationTest.java diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 5f77be43e3..b00af7fc94 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -119,6 +119,12 @@ ${tomee-servlet-api.version} provided + + + mysql + mysql-connector-java + 6.0.6 + @@ -165,6 +171,7 @@ **/*IntegrationTest.java **/*LiveTest.java + **/AutoconfigurationTest.java @@ -190,6 +197,7 @@ **/*LiveTest.java + **/AutoconfigurationTest.java **/*IntegrationTest.java @@ -206,6 +214,39 @@ + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java index b4d416dd96..d54fa5a7c1 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootAnnotatedApp.java @@ -4,6 +4,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + /** * using the following annotations are equivalent: *
  • @@ -14,7 +16,7 @@ import org.springframework.boot.web.servlet.ServletComponentScan; * @ServletComponentScan(basePackageClasses = {AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class}) *
*/ -@SpringBootApplication +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) @ServletComponentScan("com.baeldung.annotation.servletcomponentscan.components") public class SpringBootAnnotatedApp { diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java index 8a39078aac..44030f440b 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/SpringBootPlainApp.java @@ -3,7 +3,9 @@ package com.baeldung.annotation.servletcomponentscan; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) @ComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.components") public class SpringBootPlainApp { diff --git a/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java b/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java new file mode 100644 index 0000000000..bbe2a86e39 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java @@ -0,0 +1,121 @@ +package com.baeldung.autoconfiguration; + +import java.util.Arrays; +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.condition.ConditionMessage; +import org.springframework.boot.autoconfigure.condition.ConditionMessage.Style; +import org.springframework.boot.autoconfigure.condition.ConditionOutcome; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.condition.ConditionalOnResource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.condition.SpringBootCondition; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.Ordered; +import org.springframework.core.env.Environment; +import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.util.ClassUtils; + +@Configuration +@ConditionalOnClass(DataSource.class) +@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) +@PropertySource("classpath:mysql.properties") +public class MySQLAutoconfiguration { + @Autowired + private Environment env; + + @Bean + @ConditionalOnProperty(name = "usemysql", havingValue = "local") + @ConditionalOnMissingBean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true"); + dataSource.setUsername("mysqluser"); + dataSource.setPassword("mysqlpass"); + + return dataSource; + } + + @Bean(name = "dataSource") + @ConditionalOnProperty(name = "usemysql", havingValue = "custom") + @ConditionalOnMissingBean + public DataSource dataSource2() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl(env.getProperty("mysql.url")); + dataSource.setUsername(env.getProperty("mysql.user") != null ? env.getProperty("mysql.user") : ""); + dataSource.setPassword(env.getProperty("mysql.pass") != null ? env.getProperty("mysql.pass") : ""); + + return dataSource; + } + + @Bean + @ConditionalOnBean(name = "dataSource") + @ConditionalOnMissingBean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "com.baeldung.autoconfiguration.example" }); + em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + if (additionalProperties() != null) { + em.setJpaProperties(additionalProperties()); + } + return em; + } + + @Bean + @ConditionalOnMissingBean(type = "JpaTransactionManager") + JpaTransactionManager transactionManager(final EntityManagerFactory entityManagerFactory) { + final JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory); + return transactionManager; + } + + @ConditionalOnResource(resources = "classpath:mysql.properties") + @Conditional(HibernateCondition.class) + final Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("mysql-hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("mysql-hibernate.dialect")); + hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("mysql-hibernate.show_sql") != null ? env.getProperty("mysql-hibernate.show_sql") : "false"); + + return hibernateProperties; + } + + static class HibernateCondition extends SpringBootCondition { + + private static String[] CLASS_NAMES = { "org.hibernate.ejb.HibernateEntityManager", "org.hibernate.jpa.HibernateEntityManager" }; + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { + ConditionMessage.Builder message = ConditionMessage.forCondition("Hibernate"); + for (String className : CLASS_NAMES) { + if (ClassUtils.isPresent(className, context.getClassLoader())) { + return ConditionOutcome.match(message.found("class").items(Style.NORMAL, className)); + } + } + return ConditionOutcome.noMatch(message.didNotFind("class", "classes").items(Style.NORMAL, Arrays.asList(CLASS_NAMES))); + } + + } +} diff --git a/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/AutoconfigurationApplication.java b/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/AutoconfigurationApplication.java new file mode 100644 index 0000000000..f419dbf4fd --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/AutoconfigurationApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.autoconfiguration.example; + +import javax.annotation.security.RolesAllowed; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AutoconfigurationApplication { + @RolesAllowed("*") + public static void main(String[] args) { + System.setProperty("security.basic.enabled", "false"); + SpringApplication.run(AutoconfigurationApplication.class, args); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUser.java b/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUser.java new file mode 100644 index 0000000000..31ce0fd969 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUser.java @@ -0,0 +1,27 @@ +package com.baeldung.autoconfiguration.example; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class MyUser { + @Id + private String email; + + public MyUser() { + } + + public MyUser(String email) { + super(); + this.email = email; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUserRepository.java b/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUserRepository.java new file mode 100644 index 0000000000..fa411bc0b8 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/autoconfiguration/example/MyUserRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.autoconfiguration.example; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MyUserRepository extends JpaRepository{ + +} diff --git a/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java b/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java index 3489732b6f..9d379cbc09 100644 --- a/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java +++ b/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java @@ -5,7 +5,9 @@ import javax.annotation.security.RolesAllowed; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class FailureAnalyzerApplication { @RolesAllowed("*") public static void main(String[] args) { diff --git a/spring-boot/src/main/java/com/baeldung/git/CommitIdApplication.java b/spring-boot/src/main/java/com/baeldung/git/CommitIdApplication.java index cd696eae70..c077692edb 100644 --- a/spring-boot/src/main/java/com/baeldung/git/CommitIdApplication.java +++ b/spring-boot/src/main/java/com/baeldung/git/CommitIdApplication.java @@ -6,7 +6,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; -@SpringBootApplication(scanBasePackages = { "com.baeldung.git" }) +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(scanBasePackages = { "com.baeldung.git" }, exclude=MySQLAutoconfiguration.class) public class CommitIdApplication { public static void main(String[] args) { SpringApplication.run(CommitIdApplication.class, args); diff --git a/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java index c92d1c32e6..b743eb4b61 100644 --- a/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java +++ b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java @@ -5,7 +5,9 @@ import javax.annotation.security.RolesAllowed; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class InternationalizationApp { @RolesAllowed("*") public static void main(String[] args) { diff --git a/spring-boot/src/main/java/com/baeldung/intro/App.java b/spring-boot/src/main/java/com/baeldung/intro/App.java index 30e1c2b5ba..9553d814ac 100644 --- a/spring-boot/src/main/java/com/baeldung/intro/App.java +++ b/spring-boot/src/main/java/com/baeldung/intro/App.java @@ -3,7 +3,9 @@ package com.baeldung.intro; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class App { public static void main( String[] args ) diff --git a/spring-boot/src/main/java/com/baeldung/servlets/ApplicationMain.java b/spring-boot/src/main/java/com/baeldung/servlets/ApplicationMain.java index a6ea3757fe..8965e2f013 100644 --- a/spring-boot/src/main/java/com/baeldung/servlets/ApplicationMain.java +++ b/spring-boot/src/main/java/com/baeldung/servlets/ApplicationMain.java @@ -5,7 +5,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class ApplicationMain extends SpringBootServletInitializer { public static void main(String[] args) { diff --git a/spring-boot/src/main/java/com/baeldung/utils/Application.java b/spring-boot/src/main/java/com/baeldung/utils/Application.java index a3d9f9130c..9d5d75bce2 100644 --- a/spring-boot/src/main/java/com/baeldung/utils/Application.java +++ b/spring-boot/src/main/java/com/baeldung/utils/Application.java @@ -6,7 +6,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) @ComponentScan(basePackages="com.baeldung.utils") public class Application { diff --git a/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java b/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java index d2135754c9..44d48f5f8f 100644 --- a/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java +++ b/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java @@ -4,7 +4,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class WebjarsdemoApplication { public static void main(String[] args) { diff --git a/spring-boot/src/main/java/org/baeldung/Application.java b/spring-boot/src/main/java/org/baeldung/Application.java index aae0c427a9..c47bb90830 100644 --- a/spring-boot/src/main/java/org/baeldung/Application.java +++ b/spring-boot/src/main/java/org/baeldung/Application.java @@ -3,7 +3,9 @@ package org.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.context.ApplicationContext; -@org.springframework.boot.autoconfigure.SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@org.springframework.boot.autoconfigure.SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class Application { private static ApplicationContext applicationContext; diff --git a/spring-boot/src/main/java/org/baeldung/boot/DemoApplication.java b/spring-boot/src/main/java/org/baeldung/boot/DemoApplication.java index e61d140396..2d83b650ec 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/DemoApplication.java +++ b/spring-boot/src/main/java/org/baeldung/boot/DemoApplication.java @@ -3,7 +3,9 @@ package org.baeldung.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class DemoApplication { public static void main(String[] args) { diff --git a/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java b/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java index 582d2d9e9c..872426d850 100644 --- a/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java +++ b/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java @@ -14,11 +14,13 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @RestController -@EnableAutoConfiguration +@EnableAutoConfiguration(exclude=MySQLAutoconfiguration.class) @ComponentScan({ "org.baeldung.common.error", "org.baeldung.common.error.controller", "org.baeldung.common.properties", "org.baeldung.common.resources", "org.baeldung.endpoints", "org.baeldung.service", "org.baeldung.monitor.jmx", "org.baeldung.service" }) public class SpringBootApplication { diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java index 23d741b98c..9f8dadbe55 100644 --- a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java +++ b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java @@ -7,8 +7,10 @@ import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean; +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; + @EntityScan(basePackageClasses = Foo.class) -@SpringBootApplication +@SpringBootApplication(exclude=MySQLAutoconfiguration.class) public class Application { public static void main(String[] args) { System.setProperty("spring.config.name", "exception"); diff --git a/spring-boot/src/main/resources/META-INF/spring.factories b/spring-boot/src/main/resources/META-INF/spring.factories index e3d3aa4c8e..5f55544eff 100644 --- a/spring-boot/src/main/resources/META-INF/spring.factories +++ b/spring-boot/src/main/resources/META-INF/spring.factories @@ -1 +1,3 @@ -org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer \ No newline at end of file +org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer + +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfiguration.MySQLAutoconfiguration \ No newline at end of file diff --git a/spring-boot/src/main/resources/mysql.properties b/spring-boot/src/main/resources/mysql.properties new file mode 100644 index 0000000000..27092f852f --- /dev/null +++ b/spring-boot/src/main/resources/mysql.properties @@ -0,0 +1,5 @@ +usemysql=local + +mysql-hibernate.dialect=org.hibernate.dialect.MySQLDialect +mysql-hibernate.show_sql=true +mysql-hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/spring-boot/src/test/java/com/baeldung/autoconfiguration/AutoconfigurationTest.java b/spring-boot/src/test/java/com/baeldung/autoconfiguration/AutoconfigurationTest.java new file mode 100644 index 0000000000..608d0d10bc --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/autoconfiguration/AutoconfigurationTest.java @@ -0,0 +1,28 @@ +package com.baeldung.autoconfiguration; + +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.jpa.repository.config.EnableJpaRepositories; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.autoconfiguration.example.AutoconfigurationApplication; +import com.baeldung.autoconfiguration.example.MyUser; +import com.baeldung.autoconfiguration.example.MyUserRepository; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = AutoconfigurationApplication.class) +@EnableJpaRepositories(basePackages = { "com.baeldung.autoconfiguration.example" }) +public class AutoconfigurationTest { + + @Autowired + private MyUserRepository userRepository; + + @Test + public void whenSaveUser_thenOk() { + MyUser user = new MyUser("user@email.com"); + userRepository.save(user); + } + +} From e37ab29a42d2496feccd99d1c0c0592e2716b67a Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 20 Apr 2017 02:25:42 +0200 Subject: [PATCH 16/26] BAEL-845 transfer queue (#1676) * BAEL-845 tranferqueue article * BAEL-845 m to m example * BAEL-845 move code to test * BAEL-845 use tryTransfer * BAEL-845 proper if logic --- .../com/baeldung/transferqueue/Consumer.java | 33 ++++++++++ .../com/baeldung/transferqueue/Producer.java | 33 ++++++++++ .../transferqueue/TransferQueueTest.java | 62 +++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/transferqueue/Consumer.java create mode 100644 core-java/src/main/java/com/baeldung/transferqueue/Producer.java create mode 100644 core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java diff --git a/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java b/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java new file mode 100644 index 0000000000..81a24ea5a8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java @@ -0,0 +1,33 @@ +package com.baeldung.transferqueue; + +import java.util.concurrent.TransferQueue; + +public class Consumer implements Runnable { + private final TransferQueue transferQueue; + private final String name; + private final int numberOfMessagesToConsume; + + public Consumer(TransferQueue transferQueue, String name, int numberOfMessagesToConsume) { + this.transferQueue = transferQueue; + this.name = name; + this.numberOfMessagesToConsume = numberOfMessagesToConsume; + } + + @Override + public void run() { + for (int i = 0; i < numberOfMessagesToConsume; i++) { + try { + System.out.println("Consumer: " + name + " is waiting to take element..."); + String element = transferQueue.take(); + longProcessing(element); + System.out.println("Consumer: " + name + " received element: " + element); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + private void longProcessing(String element) throws InterruptedException { + Thread.sleep(1_000); + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/transferqueue/Producer.java b/core-java/src/main/java/com/baeldung/transferqueue/Producer.java new file mode 100644 index 0000000000..0aa2e32866 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/transferqueue/Producer.java @@ -0,0 +1,33 @@ +package com.baeldung.transferqueue; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TransferQueue; + +public class Producer implements Runnable { + private final TransferQueue transferQueue; + private final String name; + private final Integer numberOfMessagesToProduce; + + public Producer(TransferQueue transferQueue, String name, Integer numberOfMessagesToProduce) { + this.transferQueue = transferQueue; + this.name = name; + this.numberOfMessagesToProduce = numberOfMessagesToProduce; + } + + @Override + public void run() { + for (int i = 0; i < numberOfMessagesToProduce; i++) { + try { + System.out.println("Producer: " + name + " is waiting to transfer..."); + boolean added = transferQueue.tryTransfer("A" + i, 4000, TimeUnit.MILLISECONDS); + if (!added) { + System.out.println("can not add an element due to the timeout"); + } else { + System.out.println("Producer: " + name + " transferred element: A" + i); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java b/core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java new file mode 100644 index 0000000000..056a9f9c33 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java @@ -0,0 +1,62 @@ +package com.baeldung.transferqueue; + +import org.junit.Test; + +import java.util.concurrent.*; + +public class TransferQueueTest { + + @Test + public void givenTransferQueue_whenUseMultipleConsumersAndMultipleProducers_thenShouldProcessAllMessages() throws InterruptedException { + //given + TransferQueue transferQueue = new LinkedTransferQueue<>(); + ExecutorService exService = Executors.newFixedThreadPool(3); + Producer producer1 = new Producer(transferQueue, "1", 3); + Producer producer2 = new Producer(transferQueue, "2", 3); + Consumer consumer1 = new Consumer(transferQueue, "1", 3); + Consumer consumer2 = new Consumer(transferQueue, "2", 3); + + //when + exService.execute(producer1); + exService.execute(producer2); + exService.execute(consumer1); + exService.execute(consumer2); + + //then + exService.awaitTermination(10_000, TimeUnit.MILLISECONDS); + exService.shutdown(); + } + + @Test + public void givenTransferQueue_whenUseOneConsumerAndOneProducer_thenShouldProcessAllMessages() throws InterruptedException { + //given + TransferQueue transferQueue = new LinkedTransferQueue<>(); + ExecutorService exService = Executors.newFixedThreadPool(2); + Producer producer = new Producer(transferQueue, "1", 3); + Consumer consumer = new Consumer(transferQueue, "1", 3); + + //when + exService.execute(producer); + exService.execute(consumer); + + //then + exService.awaitTermination(5000, TimeUnit.MILLISECONDS); + exService.shutdown(); + } + + @Test + public void givenTransferQueue_whenUseOneProducerAndNoConsumers_thenShouldFailWithTimeout() throws InterruptedException { + //given + TransferQueue transferQueue = new LinkedTransferQueue<>(); + ExecutorService exService = Executors.newFixedThreadPool(2); + Producer producer = new Producer(transferQueue, "1", 3); + + //when + exService.execute(producer); + + //then + exService.awaitTermination(5000, TimeUnit.MILLISECONDS); + exService.shutdown(); + } + +} \ No newline at end of file From 4b19cb6bcc7417b4ef0943ae4c5067af19bf003f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Soares?= Date: Thu, 20 Apr 2017 13:52:42 +0100 Subject: [PATCH 17/26] Charge a credit card with Stripe (#1556) * Charge a credit card with Stripe Spring Boot project that includes Stripe Java library and does a charge to a credit card. BAEL-742 * Use ExceptionHandler for Stripe exceptions BAEL-742 * Show more detail at result page BAEL-742 * Show more detail at result page BAEL-742 --- stripe/.gitignore | 27 ++++++++ stripe/pom.xml | 66 +++++++++++++++++++ .../com/baeldung/stripe/ChargeController.java | 38 +++++++++++ .../com/baeldung/stripe/ChargeRequest.java | 20 ++++++ .../baeldung/stripe/CheckoutController.java | 21 ++++++ .../baeldung/stripe/StripeApplication.java | 12 ++++ .../com/baeldung/stripe/StripeService.java | 36 ++++++++++ stripe/src/main/resources/static/index.html | 7 ++ .../main/resources/templates/checkout.html | 35 ++++++++++ .../src/main/resources/templates/result.html | 17 +++++ 10 files changed, 279 insertions(+) create mode 100644 stripe/.gitignore create mode 100644 stripe/pom.xml create mode 100644 stripe/src/main/java/com/baeldung/stripe/ChargeController.java create mode 100644 stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java create mode 100644 stripe/src/main/java/com/baeldung/stripe/CheckoutController.java create mode 100644 stripe/src/main/java/com/baeldung/stripe/StripeApplication.java create mode 100644 stripe/src/main/java/com/baeldung/stripe/StripeService.java create mode 100644 stripe/src/main/resources/static/index.html create mode 100644 stripe/src/main/resources/templates/checkout.html create mode 100644 stripe/src/main/resources/templates/result.html diff --git a/stripe/.gitignore b/stripe/.gitignore new file mode 100644 index 0000000000..be941a016b --- /dev/null +++ b/stripe/.gitignore @@ -0,0 +1,27 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### +desktop.ini \ No newline at end of file diff --git a/stripe/pom.xml b/stripe/pom.xml new file mode 100644 index 0000000000..5bb3d4207a --- /dev/null +++ b/stripe/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + com.baeldung.stripe + stripe + 0.0.1-SNAPSHOT + jar + + Stripe + Demo project for Stripe API + + + org.springframework.boot + spring-boot-starter-parent + 1.5.2.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.projectlombok + lombok + 1.16.16 + + + + com.stripe + stripe-java + 4.2.0 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/stripe/src/main/java/com/baeldung/stripe/ChargeController.java b/stripe/src/main/java/com/baeldung/stripe/ChargeController.java new file mode 100644 index 0000000000..cd3f057cd8 --- /dev/null +++ b/stripe/src/main/java/com/baeldung/stripe/ChargeController.java @@ -0,0 +1,38 @@ +package com.baeldung.stripe; + +import com.baeldung.stripe.ChargeRequest.Currency; +import com.stripe.exception.StripeException; +import com.stripe.model.Charge; +import lombok.extern.java.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import static org.springframework.web.bind.annotation.RequestMethod.POST; + +@Log +@Controller +public class ChargeController { + + @Autowired + StripeService paymentsService; + + @RequestMapping(value = "/charge", method = POST) + public String charge(ChargeRequest chargeRequest, Model model) throws StripeException { + chargeRequest.setDescription("Example charge"); + chargeRequest.setCurrency(Currency.EUR); + Charge charge = paymentsService.charge(chargeRequest); + model.addAttribute("id", charge.getId()); + model.addAttribute("status", charge.getStatus()); + model.addAttribute("chargeId", charge.getId()); + model.addAttribute("balance_transaction", charge.getBalanceTransaction()); + return "result"; + } + + @ExceptionHandler(StripeException.class) + public String handleError(Model model, StripeException ex) { + model.addAttribute("error", ex.getMessage()); + return "result"; + } +} diff --git a/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java b/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java new file mode 100644 index 0000000000..76cdea7bb4 --- /dev/null +++ b/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java @@ -0,0 +1,20 @@ +package com.baeldung.stripe; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(includeFieldNames = false) +public class ChargeRequest { + + public enum Currency { + EUR, USD; + } + private String description; + private int amount; // cents + private Currency currency; + private String stripeEmail; + private String stripeToken; +} diff --git a/stripe/src/main/java/com/baeldung/stripe/CheckoutController.java b/stripe/src/main/java/com/baeldung/stripe/CheckoutController.java new file mode 100644 index 0000000000..2d525843b0 --- /dev/null +++ b/stripe/src/main/java/com/baeldung/stripe/CheckoutController.java @@ -0,0 +1,21 @@ +package com.baeldung.stripe; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class CheckoutController { + + @Value("${STRIPE_PUBLIC_KEY}") + private String stripePublicKey; + + @RequestMapping("/checkout") + public String checkout(Model model) { + model.addAttribute("amount", 50 * 100); // in cents + model.addAttribute("stripePublicKey", stripePublicKey); + model.addAttribute("currency", ChargeRequest.Currency.EUR); + return "checkout"; + } +} diff --git a/stripe/src/main/java/com/baeldung/stripe/StripeApplication.java b/stripe/src/main/java/com/baeldung/stripe/StripeApplication.java new file mode 100644 index 0000000000..735c67dda5 --- /dev/null +++ b/stripe/src/main/java/com/baeldung/stripe/StripeApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.stripe; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class StripeApplication { + + public static void main(String[] args) { + SpringApplication.run(StripeApplication.class, args); + } +} diff --git a/stripe/src/main/java/com/baeldung/stripe/StripeService.java b/stripe/src/main/java/com/baeldung/stripe/StripeService.java new file mode 100644 index 0000000000..8784b604c2 --- /dev/null +++ b/stripe/src/main/java/com/baeldung/stripe/StripeService.java @@ -0,0 +1,36 @@ +package com.baeldung.stripe; + +import com.stripe.Stripe; +import com.stripe.exception.APIConnectionException; +import com.stripe.exception.APIException; +import com.stripe.exception.AuthenticationException; +import com.stripe.exception.CardException; +import com.stripe.exception.InvalidRequestException; +import com.stripe.model.Charge; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class StripeService { + + @Value("${STRIPE_SECRET_KEY}") + String secretKey; + + @PostConstruct + public void init() { + Stripe.apiKey = secretKey; + } + + public Charge charge(ChargeRequest chargeRequest) + throws AuthenticationException, InvalidRequestException, APIConnectionException, CardException, APIException { + Map chargeParams = new HashMap<>(); + chargeParams.put("amount", chargeRequest.getAmount()); + chargeParams.put("currency", chargeRequest.getCurrency()); + chargeParams.put("description", chargeRequest.getDescription()); + chargeParams.put("source", chargeRequest.getStripeToken()); + return Charge.create(chargeParams); + } +} diff --git a/stripe/src/main/resources/static/index.html b/stripe/src/main/resources/static/index.html new file mode 100644 index 0000000000..090a01e91d --- /dev/null +++ b/stripe/src/main/resources/static/index.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/stripe/src/main/resources/templates/checkout.html b/stripe/src/main/resources/templates/checkout.html new file mode 100644 index 0000000000..4af336ce99 --- /dev/null +++ b/stripe/src/main/resources/templates/checkout.html @@ -0,0 +1,35 @@ + + + + Checkout + + + +
+ + + + +
+ + diff --git a/stripe/src/main/resources/templates/result.html b/stripe/src/main/resources/templates/result.html new file mode 100644 index 0000000000..57f02b74a4 --- /dev/null +++ b/stripe/src/main/resources/templates/result.html @@ -0,0 +1,17 @@ + + + + Result + + +

+
+

Success!

+
Id.:
+
Status:
+
Charge id.:
+
Balance transaction id.:
+
+ Checkout again + + From 76673a33f1f0856240db3c2b5fd638bd27cdd4a5 Mon Sep 17 00:00:00 2001 From: Parth Joshi Date: Thu, 20 Apr 2017 18:25:34 +0530 Subject: [PATCH 18/26] Hibernate 5 Multitenancy tutorial (#1150) * First commit for Hibernate 5 Multitenancy tutorial * Changes to fix the code. * Added hibernate begin transaction code. * Changes to solve the multitenancy issue. * Changes to integrate h2 * Changing configs to solve the error * Changes to solve h2 error... * Changes to fix H2 error. * Cleaned POM.xml and changed entity name * Changes table name to supplier * Removed MySql Dep from pom.xml. * Changes as per comment in the PR... --- hibernate5/pom.xml | 62 ++++++++++++ .../main/java/com/baeldung/hibernate/App.java | 30 ++++++ ...igurableMultiTenantConnectionProvider.java | 41 ++++++++ .../hibernate/HibernateMultiTenantUtil.java | 95 +++++++++++++++++++ .../com/baeldung/hibernate/HibernateUtil.java | 24 +++++ .../UnsupportedTenancyException.java | 8 ++ .../com/baeldung/hibernate/pojo/Supplier.java | 67 +++++++++++++ hibernate5/src/main/java/hibernate.cfg.xml | 14 +++ .../hibernate/MultiTenantHibernateTest.java | 73 ++++++++++++++ pom.xml | 4 +- 10 files changed, 416 insertions(+), 2 deletions(-) create mode 100644 hibernate5/pom.xml create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/App.java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java create mode 100644 hibernate5/src/main/java/hibernate.cfg.xml create mode 100644 hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantHibernateTest.java diff --git a/hibernate5/pom.xml b/hibernate5/pom.xml new file mode 100644 index 0000000000..b7473ec5b7 --- /dev/null +++ b/hibernate5/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + com.baeldung + hibernate5 + 0.0.1-SNAPSHOT + hibernate5 + http://maven.apache.org + + UTF-8 + + 3.6.0 + + + + org.hibernate + hibernate-core + 5.2.9.Final + + + junit + junit + 4.12 + + + com.h2database + h2 + 1.4.194 + + + + hibernate5 + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + + + diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/App.java b/hibernate5/src/main/java/com/baeldung/hibernate/App.java new file mode 100644 index 0000000000..26a40bb782 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/App.java @@ -0,0 +1,30 @@ +package com.baeldung.hibernate; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.pojo.Supplier; + +/** + * Hello world! + * + */ +public class App { + public static void main(String[] args) { + try { + // NOTE: this is just for boostrap testing for multitenancy. + System.out.println("Checking the system."); + SessionFactory sessionFactory = HibernateMultiTenantUtil.getSessionFactory(); + Session currentSession = sessionFactory.withOptions().tenantIdentifier("h2db1").openSession(); + Transaction transaction = currentSession.getTransaction(); + transaction.begin(); + currentSession.createCriteria(Supplier.class).list().stream().forEach(System.out::println); + transaction.commit(); + + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java b/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java new file mode 100644 index 0000000000..b9ed2bd139 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java @@ -0,0 +1,41 @@ +package com.baeldung.hibernate; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; + +public class ConfigurableMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { + + private final Map connectionProviderMap = + new HashMap<>(); + + + public ConfigurableMultiTenantConnectionProvider( + Map connectionProviderMap) { + this.connectionProviderMap.putAll( connectionProviderMap ); + } + @Override + protected ConnectionProvider getAnyConnectionProvider() { + System.out.println("Any"); + return connectionProviderMap.values().iterator().next(); + } + + @Override + protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { + System.out.println("Specific"); + return connectionProviderMap.get( tenantIdentifier ); + } + + @Override + public Connection getConnection(String tenantIdentifier) throws SQLException { + Connection connection = super.getConnection(tenantIdentifier); + // uncomment to see option 2 for SCHEMA strategy. + //connection.createStatement().execute("SET SCHEMA '" + tenantIdentifier + "'"); + return connection; + } + +} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java new file mode 100644 index 0000000000..c3e7b621d0 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java @@ -0,0 +1,95 @@ +package com.baeldung.hibernate; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; +import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.pojo.Supplier; + +public class HibernateMultiTenantUtil { + private static SessionFactory sessionFactory; + private static Map connectionProviderMap = new HashMap<>(); + private static final String[] tenantDBNames = { "mydb1","mydb2"}; + + public static SessionFactory getSessionFactory() throws UnsupportedTenancyException { + if (sessionFactory == null) { + Configuration configuration = new Configuration().configure(); + ServiceRegistry serviceRegistry = configureServiceRegistry(configuration); + sessionFactory = makeSessionFactory (serviceRegistry); +// sessionFactory = configuration.buildSessionFactory(serviceRegistry); + + + } + return sessionFactory; + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources( serviceRegistry ); + for(Class annotatedClasses : getAnnotatedClasses()) { + metadataSources.addAnnotatedClass( annotatedClasses ); + } + + Metadata metadata = metadataSources.buildMetadata(); + return metadata.getSessionFactoryBuilder().build(); + + } + + private static Class[] getAnnotatedClasses() { + return new Class[] { + Supplier.class + }; + } + + private static ServiceRegistry configureServiceRegistry(Configuration configuration) throws UnsupportedTenancyException { + Properties properties = configuration.getProperties(); + + connectionProviderMap = setUpConnectionProviders(properties, tenantDBNames); + properties.put(AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, new ConfigurableMultiTenantConnectionProvider(connectionProviderMap)); + + return new StandardServiceRegistryBuilder().applySettings(properties).build(); + } + + private static Map setUpConnectionProviders(Properties properties, String[] tenantNames) throws UnsupportedTenancyException { + Map providerMap = new HashMap<>(); + for (String tenant : tenantNames) { + DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); + + String tenantStrategy = properties.getProperty("hibernate.multiTenancy"); + System.out.println("Strategy:"+tenantStrategy); + properties.put(Environment.URL, tenantUrl(properties.getProperty(Environment.URL), tenant, tenantStrategy)); + System.out.println("URL:"+properties.getProperty(Environment.URL)); + connectionProvider.configure(properties); + System.out.println("Tenant:"+tenant); + providerMap.put(tenant, connectionProvider); + + } + System.out.println("Added connections for:"); + providerMap.keySet().stream().forEach(System.out::println); + return providerMap; + } + + private static Object tenantUrl(String originalUrl, String tenant, String tenantStrategy) throws UnsupportedTenancyException { + if (tenantStrategy.toUpperCase().equals("DATABASE")) { + return originalUrl.replace(DEFAULT_DB_NAME, tenant); + } else if (tenantStrategy.toUpperCase().equals("SCHEMA")) { + return originalUrl + String.format(SCHEMA_TOKEN, tenant); + } else { + throw new UnsupportedTenancyException("Not yet supported"); + } + } + + public static final String SCHEMA_TOKEN = ";INIT=CREATE SCHEMA IF NOT EXISTS %1$s\\;SET SCHEMA %1$s"; + public static final String DEFAULT_DB_NAME = "mydb1"; + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java new file mode 100644 index 0000000000..c1f7301d46 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -0,0 +1,24 @@ +package com.baeldung.hibernate; + +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +public class HibernateUtil { + + private static final SessionFactory sessionFactory; + + static { + try { + Configuration configuration = new Configuration().configure(); + sessionFactory = configuration.buildSessionFactory(); + + } catch (Throwable ex) { + System.err.println("Initial SessionFactory creation failed." + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static SessionFactory getSessionFactory() { + return sessionFactory; + } +} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java b/hibernate5/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java new file mode 100644 index 0000000000..99d9505ea3 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/UnsupportedTenancyException.java @@ -0,0 +1,8 @@ +package com.baeldung.hibernate; + +public class UnsupportedTenancyException extends Exception { + public UnsupportedTenancyException (String message) { + super(message); + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java new file mode 100644 index 0000000000..d0187bba47 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java @@ -0,0 +1,67 @@ +package com.baeldung.hibernate.pojo; +// Generated Feb 9, 2017 11:31:36 AM by Hibernate Tools 5.1.0.Final + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.junit.runners.Suite.SuiteClasses; + + +/** + * Suppliers generated by hbm2java + */ +@Entity(name = "Supplier") +@Table(name ="Supplier") +public class Supplier implements java.io.Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + private String name; + private String country; + + public Supplier() { + } + + public Supplier(String name, String country) { + this.name = name; + this.country = country; + } + + public Integer getId() { + return this.id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCountry() { + return this.country; + } + + public void setCountry(String country) { + this.country = country; + } + + @Override + public String toString() { + return new StringBuffer().append("[").append(id).append(",").append(name).append(",").append(country).append("]").toString(); + } + + @Override + public boolean equals(Object obj) { + return name.equals(((Supplier) obj).getName()); + } +} diff --git a/hibernate5/src/main/java/hibernate.cfg.xml b/hibernate5/src/main/java/hibernate.cfg.xml new file mode 100644 index 0000000000..26be05f931 --- /dev/null +++ b/hibernate5/src/main/java/hibernate.cfg.xml @@ -0,0 +1,14 @@ + + + + + org.h2.Driver + jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 + sa + + org.hibernate.dialect.H2Dialect + DATABASE + + diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantHibernateTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantHibernateTest.java new file mode 100644 index 0000000000..4a701de48d --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantHibernateTest.java @@ -0,0 +1,73 @@ +package com.baeldung.hibernate; +import static org.junit.Assert.assertNotEquals; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.pojo.Supplier; + + +public class MultiTenantHibernateTest { + @Test + public void givenDBMode_whenFetchingSuppliers_thenComparingFromDbs () { + SessionFactory sessionFactory; + try { + sessionFactory = HibernateMultiTenantUtil.getSessionFactory(); + + Session db1Session = sessionFactory + .withOptions().tenantIdentifier("mydb1").openSession(); + + initDb1(db1Session); + + Transaction transaction = db1Session.getTransaction(); + transaction.begin(); + Supplier supplierFromDB1 = (Supplier)db1Session.createCriteria(Supplier.class).list().get(0); + transaction.commit(); + + Session db2Session = sessionFactory + .withOptions().tenantIdentifier("mydb2").openSession(); + + initDb2(db2Session); + db2Session.getTransaction().begin(); + Supplier supplierFromDB2 = (Supplier) db2Session.createCriteria(Supplier.class).list().get(0); + db2Session.getTransaction().commit(); + + System.out.println(supplierFromDB1); + System.out.println(supplierFromDB2); + + assertNotEquals(supplierFromDB1, supplierFromDB2); + } catch (UnsupportedTenancyException e) { + e.printStackTrace(); + } + } + + + + private void initDb1(Session db1Session) { + System.out.println("Init DB1"); + Transaction transaction = db1Session.getTransaction(); + transaction.begin(); + db1Session.createSQLQuery("DROP ALL OBJECTS").executeUpdate(); + db1Session.createSQLQuery("create table Supplier (id integer generated by default as identity, country varchar(255), name varchar(255), primary key (id))").executeUpdate(); + db1Session.createSQLQuery("insert into Supplier (id, country, name) values (null, 'John', 'USA')").executeUpdate(); + transaction.commit(); + } + + private void initDb2(Session db2Session) { + System.out.println("Init DB2"); + Transaction transaction = db2Session.getTransaction(); + transaction.begin(); + db2Session.createSQLQuery("DROP ALL OBJECTS").executeUpdate(); + db2Session.createSQLQuery("create table Supplier (id integer generated by default as identity, country varchar(255), name varchar(255), primary key (id))").executeUpdate(); + db2Session.createSQLQuery("insert into Supplier (id, country, name) values (null, 'Miller', 'UK')").executeUpdate(); + transaction.commit(); + } +} diff --git a/pom.xml b/pom.xml index a705ac7cb1..7671d05d75 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ 1.6.0 maven - + hibernate5 @@ -253,4 +253,4 @@ -->
- + \ No newline at end of file From 2648a4ec25aacd6a9d88648ec47e5e99a75a67ff Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 20 Apr 2017 23:05:44 +0200 Subject: [PATCH 19/26] Bael 845 transfer queue (#1697) * BAEL-845 tranferqueue article * BAEL-845 m to m example * BAEL-845 move code to test * BAEL-845 use tryTransfer * BAEL-845 proper if logic * BAEL-845 proper test * BAEL-845 robust test --- .../com/baeldung/transferqueue/Consumer.java | 5 ++++- .../com/baeldung/transferqueue/Producer.java | 3 +++ .../transferqueue/TransferQueueTest.java | 16 ++++++++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java b/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java index 81a24ea5a8..a498d08041 100644 --- a/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java +++ b/core-java/src/main/java/com/baeldung/transferqueue/Consumer.java @@ -1,11 +1,13 @@ package com.baeldung.transferqueue; import java.util.concurrent.TransferQueue; +import java.util.concurrent.atomic.AtomicInteger; public class Consumer implements Runnable { private final TransferQueue transferQueue; private final String name; private final int numberOfMessagesToConsume; + public final AtomicInteger numberOfConsumedMessages = new AtomicInteger(); public Consumer(TransferQueue transferQueue, String name, int numberOfMessagesToConsume) { this.transferQueue = transferQueue; @@ -28,6 +30,7 @@ public class Consumer implements Runnable { } private void longProcessing(String element) throws InterruptedException { - Thread.sleep(1_000); + numberOfConsumedMessages.incrementAndGet(); + Thread.sleep(500); } } \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/transferqueue/Producer.java b/core-java/src/main/java/com/baeldung/transferqueue/Producer.java index 0aa2e32866..c9edc69e33 100644 --- a/core-java/src/main/java/com/baeldung/transferqueue/Producer.java +++ b/core-java/src/main/java/com/baeldung/transferqueue/Producer.java @@ -2,11 +2,13 @@ package com.baeldung.transferqueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.TransferQueue; +import java.util.concurrent.atomic.AtomicInteger; public class Producer implements Runnable { private final TransferQueue transferQueue; private final String name; private final Integer numberOfMessagesToProduce; + public final AtomicInteger numberOfProducedMessages = new AtomicInteger(); public Producer(TransferQueue transferQueue, String name, Integer numberOfMessagesToProduce) { this.transferQueue = transferQueue; @@ -23,6 +25,7 @@ public class Producer implements Runnable { if (!added) { System.out.println("can not add an element due to the timeout"); } else { + numberOfProducedMessages.incrementAndGet(); System.out.println("Producer: " + name + " transferred element: A" + i); } } catch (InterruptedException e) { diff --git a/core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java b/core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java index 056a9f9c33..4a1a663ce4 100644 --- a/core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java +++ b/core-java/src/test/java/com/baeldung/transferqueue/TransferQueueTest.java @@ -1,9 +1,14 @@ package com.baeldung.transferqueue; +import org.junit.FixMethodOrder; import org.junit.Test; +import org.junit.runners.MethodSorters; import java.util.concurrent.*; +import static junit.framework.TestCase.assertEquals; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TransferQueueTest { @Test @@ -25,6 +30,9 @@ public class TransferQueueTest { //then exService.awaitTermination(10_000, TimeUnit.MILLISECONDS); exService.shutdown(); + + assertEquals(producer1.numberOfProducedMessages.intValue(), 3); + assertEquals(producer2.numberOfProducedMessages.intValue(), 3); } @Test @@ -42,6 +50,9 @@ public class TransferQueueTest { //then exService.awaitTermination(5000, TimeUnit.MILLISECONDS); exService.shutdown(); + + assertEquals(producer.numberOfProducedMessages.intValue(), 3); + assertEquals(consumer.numberOfConsumedMessages.intValue(), 3); } @Test @@ -57,6 +68,7 @@ public class TransferQueueTest { //then exService.awaitTermination(5000, TimeUnit.MILLISECONDS); exService.shutdown(); - } -} \ No newline at end of file + assertEquals(producer.numberOfProducedMessages.intValue(), 0); + } +} From c70ee03a2485d6d32125477530f5179caf351405 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Fri, 21 Apr 2017 00:31:35 +0200 Subject: [PATCH 20/26] BAEL-846 code for a syncrhonous queue article (#1699) * code for the unsafe article * more descriptive example * proper eng * better test name * free memory call * java 8 style * BAEL-814 Added call to freeMemory() in off-heap test * BAEL-846 code for a syncrhonous queue article * BAEL-814 Switched from Random to ThreadLocalRandom --- .../SynchronousQueueTest.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueTest.java diff --git a/core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueTest.java b/core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueTest.java new file mode 100644 index 0000000000..5d73e02e4f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueTest.java @@ -0,0 +1,83 @@ +package com.baeldung.synchronousqueue; + +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +import static junit.framework.TestCase.assertEquals; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class SynchronousQueueTest { + + @Test + public void givenTwoThreads_whenWantToExchangeUsingLockGuardedVariable_thenItSucceed() throws InterruptedException { + //given + ExecutorService executor = Executors.newFixedThreadPool(2); + AtomicInteger sharedState = new AtomicInteger(); + CountDownLatch countDownLatch = new CountDownLatch(1); + + Runnable producer = () -> { + Integer producedElement = ThreadLocalRandom.current().nextInt(); + System.out.println("Saving an element: " + producedElement + " to the exchange point"); + sharedState.set(producedElement); + countDownLatch.countDown(); + }; + + Runnable consumer = () -> { + try { + countDownLatch.await(); + Integer consumedElement = sharedState.get(); + System.out.println("consumed an element: " + consumedElement + " from the exchange point"); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + }; + + //when + executor.execute(producer); + executor.execute(consumer); + + //then + executor.awaitTermination(500, TimeUnit.MILLISECONDS); + executor.shutdown(); + assertEquals(countDownLatch.getCount(), 0); + } + + @Test + public void givenTwoThreads_whenWantToExchangeUsingSynchronousQueue_thenItSucceed() throws InterruptedException { + //given + ExecutorService executor = Executors.newFixedThreadPool(2); + final SynchronousQueue queue = new SynchronousQueue<>(); + + Runnable producer = () -> { + Integer producedElement = ThreadLocalRandom.current().nextInt(); + try { + System.out.println("Saving an element: " + producedElement + " to the exchange point"); + queue.put(producedElement); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + }; + + Runnable consumer = () -> { + try { + Integer consumedElement = queue.take(); + System.out.println("consumed an element: " + consumedElement + " from the exchange point"); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + }; + + //when + executor.execute(producer); + executor.execute(consumer); + + //then + executor.awaitTermination(500, TimeUnit.MILLISECONDS); + executor.shutdown(); + assertEquals(queue.size(), 0); + } +} \ No newline at end of file From bac494c0bef33c2ebf5e3b4db291626f16415534 Mon Sep 17 00:00:00 2001 From: yetanotherallisonf Date: Thu, 20 Apr 2017 21:09:31 -0500 Subject: [PATCH 21/26] Update README.md for BAEL-748 --- spring-core/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-core/README.md b/spring-core/README.md index a32d30939f..3f2abe42a1 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -4,3 +4,4 @@ - [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) - [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) - [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok) +- [A Quick Guide to Spring @Value](http://www.baeldung.com/spring-value-annotation) From 2a3030dd98ea1c5f33b178e146f12f633ff9ca86 Mon Sep 17 00:00:00 2001 From: Alexandre Lombard Date: Fri, 21 Apr 2017 10:38:01 +0200 Subject: [PATCH 22/26] BAEL 767 - Moving module apache-commons-math to module libraries (#1701) * BAEL 767 - Introduction to apache commons math * BAEL 767 - Moving examples to test classes * BAEL 767 - Renaming tests with BDD convention * BAEL 767 - Introduction to apache commons math * BAEL 767 - Moving examples to test classes * BAEL 767 - Renaming tests with BDD convention * BAEL 767 - Moving module apache-commons-math to module libraries * BAEL 767 - Delete directory apache-commons-math --- apache-commons-math/pom.xml | 44 ------------------- libraries/pom.xml | 5 +++ .../baeldung/commons/math/ComplexTests.java | 0 .../baeldung/commons/math/FractionTests.java | 1 - .../baeldung/commons/math/GeometryTests.java | 0 .../commons/math/IntegrationTests.java | 0 .../commons/math/LinearAlgebraTests.java | 0 .../commons/math/ProbabilitiesTests.java | 0 .../commons/math/RootFindingTests.java | 0 .../commons/math/StatisticsTests.java | 0 10 files changed, 5 insertions(+), 45 deletions(-) delete mode 100644 apache-commons-math/pom.xml rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/ComplexTests.java (100%) rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/FractionTests.java (89%) rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/GeometryTests.java (100%) rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/IntegrationTests.java (100%) rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java (100%) rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java (100%) rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/RootFindingTests.java (100%) rename {apache-commons-math => libraries}/src/test/java/com/baeldung/commons/math/StatisticsTests.java (100%) diff --git a/apache-commons-math/pom.xml b/apache-commons-math/pom.xml deleted file mode 100644 index 98c6953120..0000000000 --- a/apache-commons-math/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - 4.0.0 - - com.baeldung - apache-commons-math - 1.0-SNAPSHOT - - - 3.6.0 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - - - - - - - org.apache.commons - commons-math3 - 3.6.1 - - - - junit - junit - 4.12 - test - - - - \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index c0c2321388..0643e8257b 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -171,6 +171,11 @@ ${flink.version} test + + org.apache.commons + commons-math3 + 3.6.1 + diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/ComplexTests.java b/libraries/src/test/java/com/baeldung/commons/math/ComplexTests.java similarity index 100% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/ComplexTests.java rename to libraries/src/test/java/com/baeldung/commons/math/ComplexTests.java diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/FractionTests.java b/libraries/src/test/java/com/baeldung/commons/math/FractionTests.java similarity index 89% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/FractionTests.java rename to libraries/src/test/java/com/baeldung/commons/math/FractionTests.java index 6efef79b23..6828c8490c 100644 --- a/apache-commons-math/src/test/java/com/baeldung/commons/math/FractionTests.java +++ b/libraries/src/test/java/com/baeldung/commons/math/FractionTests.java @@ -1,7 +1,6 @@ package com.baeldung.commons.math; import org.apache.commons.math3.fraction.Fraction; -import org.apache.commons.math3.fraction.FractionFormat; import org.junit.Assert; import org.junit.Test; diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/GeometryTests.java b/libraries/src/test/java/com/baeldung/commons/math/GeometryTests.java similarity index 100% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/GeometryTests.java rename to libraries/src/test/java/com/baeldung/commons/math/GeometryTests.java diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/IntegrationTests.java b/libraries/src/test/java/com/baeldung/commons/math/IntegrationTests.java similarity index 100% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/IntegrationTests.java rename to libraries/src/test/java/com/baeldung/commons/math/IntegrationTests.java diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java b/libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java similarity index 100% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java rename to libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraTests.java diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java b/libraries/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java similarity index 100% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java rename to libraries/src/test/java/com/baeldung/commons/math/ProbabilitiesTests.java diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/RootFindingTests.java b/libraries/src/test/java/com/baeldung/commons/math/RootFindingTests.java similarity index 100% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/RootFindingTests.java rename to libraries/src/test/java/com/baeldung/commons/math/RootFindingTests.java diff --git a/apache-commons-math/src/test/java/com/baeldung/commons/math/StatisticsTests.java b/libraries/src/test/java/com/baeldung/commons/math/StatisticsTests.java similarity index 100% rename from apache-commons-math/src/test/java/com/baeldung/commons/math/StatisticsTests.java rename to libraries/src/test/java/com/baeldung/commons/math/StatisticsTests.java From caab7829e7468f38c401e76165a731355bdf0b9c Mon Sep 17 00:00:00 2001 From: Daniele Demichelis Date: Sat, 22 Apr 2017 04:31:56 +0200 Subject: [PATCH 23/26] Bael 555 spring remoting with amqp (#1654) * Burlap & Hessian server added * Burlap & Hessian client work * Fixed main * Fixed formatting * Spring Remote example based on Burlap & Hessian runs in a JUnit test * Fixed main * Fixed formatting * Spring Remote example based on Burlap & Hessian runs in a JUnit test * Spring Remote example based on Burlap & Hessian runs in a JUnit test * Burlap & Hessian client work * Fixed main * Fixed main * Fixed formatting * Fixed formatting * Spring Remote example based on Burlap & Hessian runs in a JUnit test * Spring Remote example based on Burlap & Hessian runs in a JUnit test * Fixed POM * First experiments with amqp * First experiments with amqp * Firts example of remoting working with AMQP * Server code fixed * Client code fixed * Removed wrongly pushed work folder * Removed derby.log file. * Fixed client and server package. * Fixed indentation. --- spring-remoting/pom.xml | 1 + spring-remoting/remoting-amqp/pom.xml | 21 ++++++++ .../remoting-amqp-client/pom.xml | 36 +++++++++++++ .../java/com/baeldung/client/AmqpClient.java | 46 ++++++++++++++++ .../src/main/resources/application.properties | 19 +++++++ .../remoting-amqp-server/pom.xml | 46 ++++++++++++++++ .../java/com/baeldung/server/AmqpServer.java | 53 +++++++++++++++++++ .../src/main/resources/application.properties | 19 +++++++ 8 files changed, 241 insertions(+) create mode 100644 spring-remoting/remoting-amqp/pom.xml create mode 100644 spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml create mode 100644 spring-remoting/remoting-amqp/remoting-amqp-client/src/main/java/com/baeldung/client/AmqpClient.java create mode 100644 spring-remoting/remoting-amqp/remoting-amqp-client/src/main/resources/application.properties create mode 100644 spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml create mode 100644 spring-remoting/remoting-amqp/remoting-amqp-server/src/main/java/com/baeldung/server/AmqpServer.java create mode 100644 spring-remoting/remoting-amqp/remoting-amqp-server/src/main/resources/application.properties diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index 52d670a726..96e808477f 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -36,6 +36,7 @@ remoting-http remoting-hessian-burlap + remoting-amqp \ No newline at end of file diff --git a/spring-remoting/remoting-amqp/pom.xml b/spring-remoting/remoting-amqp/pom.xml new file mode 100644 index 0000000000..6a7d0804dc --- /dev/null +++ b/spring-remoting/remoting-amqp/pom.xml @@ -0,0 +1,21 @@ + + + spring-remoting + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + remoting-amqp + pom + + + + remoting-amqp + + remoting-amqp-server + remoting-amqp-client + + + diff --git a/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml b/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml new file mode 100644 index 0000000000..9a2d0bf9cc --- /dev/null +++ b/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml @@ -0,0 +1,36 @@ + + + remoting-amqp + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + remoting-amqp-client + jar + + remoting-amqp-client + http://maven.apache.org + + + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + com.baeldung + api + + + diff --git a/spring-remoting/remoting-amqp/remoting-amqp-client/src/main/java/com/baeldung/client/AmqpClient.java b/spring-remoting/remoting-amqp/remoting-amqp-client/src/main/java/com/baeldung/client/AmqpClient.java new file mode 100644 index 0000000000..def80f6b5e --- /dev/null +++ b/spring-remoting/remoting-amqp/remoting-amqp-client/src/main/java/com/baeldung/client/AmqpClient.java @@ -0,0 +1,46 @@ +package com.baeldung.client; + +import com.baeldung.api.BookingException; +import com.baeldung.api.CabBookingService; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.remoting.client.AmqpProxyFactoryBean; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import static java.lang.System.out; + +@SpringBootApplication public class AmqpClient { + + @Bean Queue queue() { + return new Queue("remotingQueue"); + } + + @Bean AmqpProxyFactoryBean amqpFactoryBean(AmqpTemplate amqpTemplate) { + AmqpProxyFactoryBean factoryBean = new AmqpProxyFactoryBean(); + factoryBean.setServiceInterface(CabBookingService.class); + factoryBean.setAmqpTemplate(amqpTemplate); + return factoryBean; + } + + @Bean Exchange directExchange(Queue someQueue) { + DirectExchange exchange = new DirectExchange("remoting.exchange"); + BindingBuilder.bind(someQueue).to(exchange).with("remoting.binding"); + return exchange; + } + + @Bean RabbitTemplate amqpTemplate(ConnectionFactory factory) { + RabbitTemplate template = new RabbitTemplate(factory); + template.setRoutingKey("remoting.binding"); + template.setExchange("remoting.exchange"); + return template; + } + + public static void main(String[] args) throws BookingException { + CabBookingService service = SpringApplication.run(AmqpClient.class, args).getBean(CabBookingService.class); + out.println(service.bookRide("13 Seagate Blvd, Key Largo, FL 33037")); + } + +} diff --git a/spring-remoting/remoting-amqp/remoting-amqp-client/src/main/resources/application.properties b/spring-remoting/remoting-amqp/remoting-amqp-client/src/main/resources/application.properties new file mode 100644 index 0000000000..8df44a7c8d --- /dev/null +++ b/spring-remoting/remoting-amqp/remoting-amqp-client/src/main/resources/application.properties @@ -0,0 +1,19 @@ +# This is true to make SpringBoot to automatically register a bean of type 'org.springframework.amqp.core.AmqpAdmin'. +# Check the org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration javadoc for details. +spring.rabbitmq.dynamic=true + +# The port to which the client should connect defaults to 5672. +spring.rabbitmq.port=32769 + +# Username and password +spring.rabbitmq.username=guest +spring.rabbitmq.password=guest + +# The host, defaults to localhost. +spring.rabbitmq.host=192.168.99.100 + +# Logging +logging.pattern.console=%d{mm:ss.SSS} %-5p [%-31t] [%-54logger{0}] %marker%m%ex{full} - %logger - %F:%L%n +logging.level.root=WARN +logging.level.org.springframework.amqp=TRACE + diff --git a/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml b/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml new file mode 100644 index 0000000000..4d3f4da765 --- /dev/null +++ b/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml @@ -0,0 +1,46 @@ + + + remoting-amqp + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + remoting-amqp-server + jar + + remoting-amqp-server + http://maven.apache.org + + + UTF-8 + + + + + com.baeldung + api + ${project.version} + + + org.springframework.boot + spring-boot-starter-amqp + + + com.baeldung + api + 1.0-SNAPSHOT + + + junit + junit + test + + + com.baeldung + spring-remoting-http-server + 1.0-SNAPSHOT + + + diff --git a/spring-remoting/remoting-amqp/remoting-amqp-server/src/main/java/com/baeldung/server/AmqpServer.java b/spring-remoting/remoting-amqp/remoting-amqp-server/src/main/java/com/baeldung/server/AmqpServer.java new file mode 100644 index 0000000000..f0155b2141 --- /dev/null +++ b/spring-remoting/remoting-amqp/remoting-amqp-server/src/main/java/com/baeldung/server/AmqpServer.java @@ -0,0 +1,53 @@ +package com.baeldung.server; + +import com.baeldung.api.CabBookingService; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; +import org.springframework.amqp.remoting.service.AmqpInvokerServiceExporter; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration @ComponentScan @EnableAutoConfiguration +public class AmqpServer { + + /* + Please note that + - CachingConnectionFactory + - RabbitAdmin + - AmqpTemplate + are automatically declared by SpringBoot. + */ + + @Bean CabBookingService bookingService() { + return new CabBookingServiceImpl(); + } + + @Bean Queue queue() { + return new Queue("remotingQueue"); + } + + @Bean AmqpInvokerServiceExporter exporter(CabBookingService implementation, AmqpTemplate template) { + AmqpInvokerServiceExporter exporter = new AmqpInvokerServiceExporter(); + exporter.setServiceInterface(CabBookingService.class); + exporter.setService(implementation); + exporter.setAmqpTemplate(template); + return exporter; + } + + @Bean SimpleMessageListenerContainer listener(ConnectionFactory factory, AmqpInvokerServiceExporter exporter, Queue queue) { + SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(factory); + container.setMessageListener(exporter); + container.setQueueNames(queue.getName()); + return container; + } + + public static void main(String[] args) { + SpringApplication.run(AmqpServer.class, args); + } + +} \ No newline at end of file diff --git a/spring-remoting/remoting-amqp/remoting-amqp-server/src/main/resources/application.properties b/spring-remoting/remoting-amqp/remoting-amqp-server/src/main/resources/application.properties new file mode 100644 index 0000000000..8df44a7c8d --- /dev/null +++ b/spring-remoting/remoting-amqp/remoting-amqp-server/src/main/resources/application.properties @@ -0,0 +1,19 @@ +# This is true to make SpringBoot to automatically register a bean of type 'org.springframework.amqp.core.AmqpAdmin'. +# Check the org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration javadoc for details. +spring.rabbitmq.dynamic=true + +# The port to which the client should connect defaults to 5672. +spring.rabbitmq.port=32769 + +# Username and password +spring.rabbitmq.username=guest +spring.rabbitmq.password=guest + +# The host, defaults to localhost. +spring.rabbitmq.host=192.168.99.100 + +# Logging +logging.pattern.console=%d{mm:ss.SSS} %-5p [%-31t] [%-54logger{0}] %marker%m%ex{full} - %logger - %F:%L%n +logging.level.root=WARN +logging.level.org.springframework.amqp=TRACE + From 7a96484ba361545b5c6ce7add058f3a9d2e242b8 Mon Sep 17 00:00:00 2001 From: Adam InTae Gerard Date: Fri, 21 Apr 2017 22:00:42 -0500 Subject: [PATCH 24/26] BAEL-86 (#1535) * BAEL-86 * Added Themes and Beans * Improvements and fully tested locally --- spring-dispatcher-servlet/README.md | 3 + spring-dispatcher-servlet/pom.xml | 158 ++++---- .../servlet/DispatcherServletApplication.java | 30 -- .../dispatcher/servlet/RootConfiguration.java | 19 - .../dispatcher/servlet/WebConfiguration.java | 129 ------ .../dispatcher/servlet/models/Attachment.java | 58 --- .../dispatcher/servlet/models/Task.java | 52 --- .../servlet/web/AttachmentController.java | 17 - .../servlet/web/AttachmentControllerImpl.java | 45 --- .../web/GlobalDefaultExceptionHandler.java | 19 - .../servlet/web/HomeController.java | 13 - .../servlet/web/HomeControllerImpl.java | 25 -- .../servlet/web/TaskController.java | 49 --- .../servlet/web/TaskControllerImpl.java | 111 ------ .../configuration/AppConfig.java | 83 ++++ .../configuration/WebAppInitializer.java | 23 ++ .../controller/MultipartController.java | 41 ++ .../controller/UserController.java | 30 ++ .../controller/UserRestController.java | 27 ++ .../springdispatcherservlet/domain/User.java | 41 ++ .../services/UserService.java | 17 + .../src/main/resources/README.md | 3 - .../src/main/resources/diagram.graphml | 372 ------------------ .../src/main/resources/diagram.png | Bin 60385 -> 0 bytes .../src/main/resources/messages.properties | 22 -- .../src/main/resources/messages_de.properties | 22 -- .../main/resources/theme-post_it.properties | 1 - .../main/resources/theme-robotask.properties | 1 - .../main/resources/themes/default.properties | 1 + .../main/resources/themes/example.properties | 1 + .../src/main/webapp/WEB-INF/jsp/index.jsp | 30 ++ .../src/main/webapp/WEB-INF/views/error.html | 13 - .../src/main/webapp/WEB-INF/views/home.html | 16 - .../main/webapp/WEB-INF/views/task-add.html | 16 - .../webapp/WEB-INF/views/task-attach.html | 17 - .../main/webapp/WEB-INF/views/task-get.html | 28 -- .../main/webapp/WEB-INF/views/task-list.html | 22 -- .../src/main/webapp/public/css/base.css | 8 - .../main/webapp/public/css/themes/post_it.css | 8 - .../webapp/public/css/themes/robotask.css | 8 - .../src/main/webapp/resources/css/default.css | 4 + .../src/main/webapp/resources/css/example.css | 4 + 42 files changed, 384 insertions(+), 1203 deletions(-) create mode 100644 spring-dispatcher-servlet/README.md delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/DispatcherServletApplication.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/RootConfiguration.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/WebConfiguration.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Attachment.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Task.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentController.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentControllerImpl.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/GlobalDefaultExceptionHandler.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeController.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeControllerImpl.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskController.java delete mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskControllerImpl.java create mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java create mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/WebAppInitializer.java create mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java create mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserController.java create mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserRestController.java create mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/domain/User.java create mode 100644 spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/services/UserService.java delete mode 100644 spring-dispatcher-servlet/src/main/resources/README.md delete mode 100644 spring-dispatcher-servlet/src/main/resources/diagram.graphml delete mode 100644 spring-dispatcher-servlet/src/main/resources/diagram.png delete mode 100644 spring-dispatcher-servlet/src/main/resources/messages.properties delete mode 100644 spring-dispatcher-servlet/src/main/resources/messages_de.properties delete mode 100644 spring-dispatcher-servlet/src/main/resources/theme-post_it.properties delete mode 100644 spring-dispatcher-servlet/src/main/resources/theme-robotask.properties create mode 100644 spring-dispatcher-servlet/src/main/resources/themes/default.properties create mode 100644 spring-dispatcher-servlet/src/main/resources/themes/example.properties create mode 100644 spring-dispatcher-servlet/src/main/webapp/WEB-INF/jsp/index.jsp delete mode 100644 spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/error.html delete mode 100644 spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/home.html delete mode 100644 spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-add.html delete mode 100644 spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-attach.html delete mode 100644 spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-get.html delete mode 100644 spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-list.html delete mode 100644 spring-dispatcher-servlet/src/main/webapp/public/css/base.css delete mode 100644 spring-dispatcher-servlet/src/main/webapp/public/css/themes/post_it.css delete mode 100644 spring-dispatcher-servlet/src/main/webapp/public/css/themes/robotask.css create mode 100644 spring-dispatcher-servlet/src/main/webapp/resources/css/default.css create mode 100644 spring-dispatcher-servlet/src/main/webapp/resources/css/example.css diff --git a/spring-dispatcher-servlet/README.md b/spring-dispatcher-servlet/README.md new file mode 100644 index 0000000000..56bb353487 --- /dev/null +++ b/spring-dispatcher-servlet/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Spring DispatcherServlet](http://www.baeldung.com/spring-dispatcher-servlet) diff --git a/spring-dispatcher-servlet/pom.xml b/spring-dispatcher-servlet/pom.xml index b6210971ae..84a7a5b59d 100644 --- a/spring-dispatcher-servlet/pom.xml +++ b/spring-dispatcher-servlet/pom.xml @@ -1,96 +1,96 @@ - - + + 4.0.0 - + com.baeldung spring-dispatcher-servlet war - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - .. - - + 1.0.0 + spring-dispatcher-servlet + + 4.3.7.RELEASE + + + org.springframework + spring-core + ${springframework.version} + - javax.servlet - javax.servlet-api - ${javax.servlet.version} - provided + org.springframework + spring-web + ${springframework.version} org.springframework spring-webmvc - ${org.springframework.version} - - - commons-logging - commons-logging - - + ${springframework.version} - org.thymeleaf - thymeleaf-spring4 - ${thymeleaf.version} + javax.servlet + javax.servlet-api + 3.1.0 - org.slf4j - slf4j-api - ${org.slf4j.version} + javax.servlet.jsp.jstl + jstl-api + 1.2 + + + javax.servlet.jsp + javax.servlet.jsp-api + 2.3.1 + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.13 + + + javax.servlet + jstl + 1.2 + + + com.fasterxml.jackson.core + jackson-databind + 2.5.0 + + + commons-fileupload + commons-fileupload + 1.3 - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - false - - - - org.eclipse.jetty - jetty-maven-plugin - ${jetty-maven-plugin.version} - - - / - - - - + + + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + org.apache.tomcat.maven + tomcat8-maven-plugin + 3.0-r1655215 + + /springdispatcherservlet + + + + org.apache.maven.plugins + maven-war-plugin + 3.0.0 + + src/main/webapp + false + + + + + springdispatcherservlet - - - - 4.3.4.RELEASE - 3.0.2.RELEASE - - - 1.7.21 - - - 3.1.0 - - - 3.6.0 - 3.0.0 - 9.3.14.v20161028 - - + \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/DispatcherServletApplication.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/DispatcherServletApplication.java deleted file mode 100644 index 181fb3f405..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/DispatcherServletApplication.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet; - -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -import javax.servlet.MultipartConfigElement; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -public class DispatcherServletApplication implements org.springframework.web.WebApplicationInitializer { - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - AnnotationConfigWebApplicationContext rootContext = - new AnnotationConfigWebApplicationContext(); - rootContext.register(RootConfiguration.class); - servletContext.addListener(new ContextLoaderListener(rootContext)); - AnnotationConfigWebApplicationContext webContext = - new AnnotationConfigWebApplicationContext(); - webContext.register(WebConfiguration.class); - DispatcherServlet dispatcherServlet = new DispatcherServlet(webContext); - ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", - dispatcherServlet); - servlet.addMapping("/*"); - MultipartConfigElement multipartConfigElement = - new MultipartConfigElement("/tmp"); - servlet.setMultipartConfig(multipartConfigElement); - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/RootConfiguration.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/RootConfiguration.java deleted file mode 100644 index 48281c5e5d..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/RootConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet; - -import com.baeldung.spring.dispatcher.servlet.models.Task; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.*; - -@Configuration -public class RootConfiguration { - @Bean - public Map> taskList() { - Map> taskMap = new HashMap<>(); - List taskList = new ArrayList<>(); - taskList.add(new Task("Clean the dishes!", new Date())); - taskMap.put("Cid", taskList); - return taskMap; - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/WebConfiguration.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/WebConfiguration.java deleted file mode 100644 index 419c1a2908..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/WebConfiguration.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet; - -import org.springframework.context.MessageSource; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.ui.context.support.ResourceBundleThemeSource; -import org.springframework.web.multipart.MultipartResolver; -import org.springframework.web.multipart.support.StandardServletMultipartResolver; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.LocaleResolver; -import org.springframework.web.servlet.ThemeResolver; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import org.springframework.web.servlet.i18n.CookieLocaleResolver; -import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; -import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; -import org.springframework.web.servlet.theme.CookieThemeResolver; -import org.springframework.web.servlet.theme.ThemeChangeInterceptor; -import org.thymeleaf.spring4.SpringTemplateEngine; -import org.thymeleaf.spring4.view.ThymeleafViewResolver; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.ServletContextTemplateResolver; - -import javax.servlet.ServletContext; -import java.util.Locale; - -@Configuration -@ComponentScan("com.baeldung.spring.dispatcher.servlet.web") -@EnableWebMvc -public class WebConfiguration extends WebMvcConfigurerAdapter { - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry - .addResourceHandler("/public/**") - .addResourceLocations("/public/"); - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(localeChangeInterceptor()); - registry.addInterceptor(themeChangeInterceptor()); - } - - @Bean - public ServletContextTemplateResolver templateResolver(ServletContext servletContext) { - ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext); - templateResolver.setPrefix("/WEB-INF/views/"); - templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode(TemplateMode.HTML); - return templateResolver; - } - - @Bean - public SpringTemplateEngine templateEngine(ServletContextTemplateResolver templateResolver) { - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - templateEngine.setTemplateResolver(templateResolver); - return templateEngine; - } - - @Bean - public ThymeleafViewResolver viewResolver(SpringTemplateEngine templateEngine) { - ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); - viewResolver.setTemplateEngine(templateEngine); - return viewResolver; - } - - @Bean - public MessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("messages"); - messageSource.setFallbackToSystemLocale(false); - return messageSource; - } - - @Bean - public LocaleResolver localeResolver() { - CookieLocaleResolver localeResolver = new CookieLocaleResolver(); - localeResolver.setDefaultLocale(Locale.ENGLISH); - localeResolver.setCookieName("locale"); - localeResolver.setCookieMaxAge(-1); - return localeResolver; - } - - @Bean - public LocaleChangeInterceptor localeChangeInterceptor() { - LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); - localeChangeInterceptor.setParamName("lang"); - localeChangeInterceptor.setIgnoreInvalidLocale(true); - return localeChangeInterceptor; - } - - @Bean - public ResourceBundleThemeSource themeSource() { - ResourceBundleThemeSource themeSource = new ResourceBundleThemeSource(); - themeSource.setBasenamePrefix("theme-"); - themeSource.setFallbackToSystemLocale(false); - return themeSource; - } - - @Bean - public ThemeResolver themeResolver() { - CookieThemeResolver themeResolver = new CookieThemeResolver(); - themeResolver.setDefaultThemeName("robotask"); - themeResolver.setCookieName("theme"); - themeResolver.setCookieMaxAge(-1); - return themeResolver; - } - - @Bean - public ThemeChangeInterceptor themeChangeInterceptor() { - ThemeChangeInterceptor themeChangeInterceptor = new ThemeChangeInterceptor(); - themeChangeInterceptor.setParamName("theme"); - return themeChangeInterceptor; - } - - @Bean - public MultipartResolver multipartResolver() { - return new StandardServletMultipartResolver(); - } - - @Bean - public HandlerExceptionResolver handlerExceptionResolver() { - return new ExceptionHandlerExceptionResolver(); - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Attachment.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Attachment.java deleted file mode 100644 index 1d6248650f..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Attachment.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.models; - -import java.util.UUID; - -public class Attachment { - private String id; - - private String name; - - private String description; - - public Attachment() { - this.id = UUID.randomUUID().toString(); - } - - public Attachment(String name, String description) { - this(); - this.name = name; - this.description = description; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Attachment that = (Attachment) o; - return id.equals(that.id); - } - - @Override - public int hashCode() { - return id.hashCode(); - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Task.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Task.java deleted file mode 100644 index 1e6a533e3a..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/models/Task.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.models; - -import org.springframework.format.annotation.DateTimeFormat; - -import java.util.Date; -import java.util.HashSet; -import java.util.Set; - -public class Task { - private String description; - - @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm") - private Date due; - - private Set attachments = new HashSet<>(); - - public Task() { - } - - public Task(Date due) { - this.due = due; - } - - public Task(String description, Date due) { - this.description = description; - this.due = due; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getDue() { - return due; - } - - public void setDue(Date due) { - this.due = due; - } - - public Set getAttachments() { - return attachments; - } - - public void setAttachments(Set attachments) { - this.attachments = attachments; - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentController.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentController.java deleted file mode 100644 index 2521004ff1..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.web; - -import org.springframework.core.io.FileSystemResource; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; - -@RequestMapping("/attachments") -public interface AttachmentController { - @GetMapping("/{attachmentId}") - ResponseEntity getAttachment( - @PathVariable("attachmentId") String attachmentId, - @RequestParam(name = "download", required = false, defaultValue = "false") boolean forcedDownload - ); -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentControllerImpl.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentControllerImpl.java deleted file mode 100644 index 75a15cf657..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/AttachmentControllerImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.web; - -import com.baeldung.spring.dispatcher.servlet.models.Task; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.FileSystemResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; - -import java.net.URLConnection; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -@Controller -public class AttachmentControllerImpl implements AttachmentController { - @Autowired - private Map> taskMap; - - @Override - public ResponseEntity getAttachment( - @PathVariable("attachmentId") String attachmentId, - @RequestParam(name = "download", required = false, defaultValue = "false") boolean forcedDownload - ) { - FileSystemResource resource = new FileSystemResource("/tmp/" + attachmentId); - HttpHeaders headers = new HttpHeaders(); - taskMap.values().stream() - .flatMap(Collection::stream) - .flatMap(t -> t.getAttachments().stream()) - .filter(a -> a.getId().equals(attachmentId)) - .findFirst() - .ifPresent(a -> { - headers.add("Content-Disposition", - "attachment; filename=" + a.getName()); - headers.add("Content-Type", forcedDownload ? - MediaType.APPLICATION_OCTET_STREAM_VALUE : - URLConnection.guessContentTypeFromName(a.getName())); - }); - return new ResponseEntity<>(resource, headers, HttpStatus.OK); - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/GlobalDefaultExceptionHandler.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/GlobalDefaultExceptionHandler.java deleted file mode 100644 index f25eb601a7..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/GlobalDefaultExceptionHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.web; - -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.servlet.ModelAndView; - -import javax.servlet.http.HttpServletRequest; - -@ControllerAdvice -public class GlobalDefaultExceptionHandler { - @ExceptionHandler(Exception.class) - public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception { - ModelAndView modelAndView = new ModelAndView(); - modelAndView.addObject("exception", e); - modelAndView.addObject("url", request.getRequestURL()); - modelAndView.setViewName("error"); - return modelAndView; - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeController.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeController.java deleted file mode 100644 index 5ac39fadb4..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeController.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.web; - -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -@RequestMapping("/") -public interface HomeController { - @GetMapping("/*") - String home( - Model model - ); -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeControllerImpl.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeControllerImpl.java deleted file mode 100644 index 66d869ca67..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/HomeControllerImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.web; - -import com.baeldung.spring.dispatcher.servlet.models.Task; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Controller -public class HomeControllerImpl implements HomeController { - @Autowired - private Map> taskMap; - - @Override - public String home(Model model) { - List users = taskMap.keySet().stream() - .sorted() - .collect(Collectors.toList()); - model.addAttribute("users", users); - return "home"; - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskController.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskController.java deleted file mode 100644 index eff93ffb2f..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.web; - -import com.baeldung.spring.dispatcher.servlet.models.Task; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -@RequestMapping("/tasks") -public interface TaskController { - @GetMapping("/{username}/list") - String listTasks( - @PathVariable("username") String username, - Model model - ); - - @GetMapping("/{username}/add") - String addTask( - @PathVariable("username") String username, - Model model - ); - - @PostMapping("/{username}/add") - String addTask( - @PathVariable("username") String username, - @ModelAttribute Task task - ); - - @GetMapping("/{username}/get/{id}") - String getTask( - @PathVariable("username") String username, - @PathVariable("id") int id, - Model model - ); - - @GetMapping("/{username}/get/{id}/attach") - String attachToTask( - @PathVariable("username") String username, - @PathVariable("id") int id, - Model model - ); - - @PostMapping("/{username}/get/{id}/attach") - String attachToTask( - @PathVariable("username") String username, - @PathVariable("id") int id, - @RequestParam("attachment") MultipartFile attachment, - @RequestParam("description") String description - ); -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskControllerImpl.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskControllerImpl.java deleted file mode 100644 index 464e58aa54..0000000000 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/web/TaskControllerImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.baeldung.spring.dispatcher.servlet.web; - -import com.baeldung.spring.dispatcher.servlet.models.Attachment; -import com.baeldung.spring.dispatcher.servlet.models.Task; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.*; -import java.util.stream.Collectors; - -@Controller -public class TaskControllerImpl implements TaskController { - @Autowired - private Map> taskMap; - - @Override - public String listTasks( - @PathVariable("username") String username, - Model model - ) { - List tasks = taskMap.get(username).stream() - .sorted(Comparator.comparing(Task::getDue)) - .collect(Collectors.toList()); - model.addAttribute("username", username); - model.addAttribute("tasks", tasks); - return "task-list"; - } - - @Override - public String addTask( - @PathVariable("username") String username, - Model model - ) { - model.addAttribute("username", username); - model.addAttribute("task", new Task(new Date())); - return "task-add"; - } - - @Override - public String addTask( - @PathVariable("username") String username, - @ModelAttribute Task task - ) { - List taskList = taskMap.get(username); - if (taskList == null) { - taskList = new ArrayList<>(); - } - taskList.add(task); - taskMap.put(username, taskList); - return "redirect:list"; - } - - @Override - public String getTask( - @PathVariable("username") String username, - @PathVariable("id") int id, - Model model - ) { - Task task = taskMap.get(username).get(id); - model.addAttribute("username", username); - model.addAttribute("id", id); - model.addAttribute("task", task); - return "task-get"; - } - - @Override - public String attachToTask( - @PathVariable("username") String username, - @PathVariable("id") int id, - Model model - ) { - model.addAttribute("username", username); - model.addAttribute("id", id); - return "task-attach"; - } - - @Override - public String attachToTask( - @PathVariable("username") String username, - @PathVariable("id") int id, - @RequestParam("attachment") MultipartFile multipartFile, - @RequestParam("description") String description - ) { - Task task = taskMap.get(username).get(id); - Attachment attachment = new Attachment(multipartFile.getOriginalFilename(), - description); - task.getAttachments().add(attachment); - try (InputStream inputStream = - new BufferedInputStream(multipartFile.getInputStream()); - OutputStream outputStream = - new BufferedOutputStream(Files.newOutputStream( - Paths.get("/tmp", attachment.getId())))) { - byte[] buf = new byte[1024 * 16]; - int len; - while ((len = inputStream.read(buf)) != -1) { - outputStream.write(buf, 0, len); - } - } catch (IOException e) { - throw new RuntimeException("Failed to upload file!", e); - } - return "redirect:./"; - } -} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java new file mode 100644 index 0000000000..f5ad032e84 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/AppConfig.java @@ -0,0 +1,83 @@ +package com.baeldung.springdispatcherservlet.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.ui.context.support.ResourceBundleThemeSource; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.resource.PathResourceResolver; +import org.springframework.web.servlet.theme.CookieThemeResolver; +import org.springframework.web.servlet.theme.ThemeChangeInterceptor; +import org.springframework.web.servlet.view.JstlView; +import org.springframework.web.servlet.view.UrlBasedViewResolver; + +import java.io.IOException; + +@Configuration +@EnableWebMvc +@ComponentScan("com.baeldung.springdispatcherservlet") +public class AppConfig extends WebMvcConfigurerAdapter { + + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + } + + /** Multipart file uploading configuratioin */ + @Bean + public CommonsMultipartResolver multipartResolver() throws IOException { + CommonsMultipartResolver resolver = new CommonsMultipartResolver(); + resolver.setMaxUploadSize(10000000); + return resolver; + } + + /** View resolver for JSP */ + @Bean + public UrlBasedViewResolver viewResolver() { + UrlBasedViewResolver resolver = new UrlBasedViewResolver(); + resolver.setPrefix("/WEB-INF/jsp/"); + resolver.setSuffix(".jsp"); + resolver.setViewClass(JstlView.class); + return resolver; + } + + /** Static resource locations including themes*/ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**/*") + .addResourceLocations("/", "/resources/") + .setCachePeriod(3600) + .resourceChain(true) + .addResolver(new PathResourceResolver()); + } + + /** BEGIN theme configuration */ + @Bean + public ResourceBundleThemeSource themeSource(){ + ResourceBundleThemeSource themeSource = new ResourceBundleThemeSource(); + themeSource.setDefaultEncoding("UTF-8"); + themeSource.setBasenamePrefix("themes."); + return themeSource; + } + + @Bean + public CookieThemeResolver themeResolver(){ + CookieThemeResolver resolver = new CookieThemeResolver(); + resolver.setDefaultThemeName("default"); + resolver.setCookieName("example-theme-cookie"); + return resolver; + } + + @Bean + public ThemeChangeInterceptor themeChangeInterceptor(){ + ThemeChangeInterceptor interceptor = new ThemeChangeInterceptor(); + interceptor.setParamName("theme"); + return interceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(themeChangeInterceptor()); + } + /** END theme configuration */ +} \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/WebAppInitializer.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/WebAppInitializer.java new file mode 100644 index 0000000000..0c6c7141a7 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/configuration/WebAppInitializer.java @@ -0,0 +1,23 @@ +package com.baeldung.springdispatcherservlet.configuration; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; + +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +public class WebAppInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext container) throws ServletException { + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + context.register(AppConfig.class); + context.setServletContext(container); + + ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(context)); + servlet.setLoadOnStartup(1); + servlet.addMapping("/"); + } +} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java new file mode 100644 index 0000000000..1cc8261f7c --- /dev/null +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java @@ -0,0 +1,41 @@ +package com.baeldung.springdispatcherservlet.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.ServletContext; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; + +@Controller +public class MultipartController { + + @Autowired + ServletContext context; + + @RequestMapping(value = "/upload", method = RequestMethod.POST) + public ModelAndView FileuploadController(@RequestParam("file") MultipartFile file) { + ModelAndView modelAndView = new ModelAndView("index"); + try { + InputStream in = file.getInputStream(); + String path = new File(".").getAbsolutePath(); + FileOutputStream f = new FileOutputStream(path.substring(0, path.length()-1)+ "/uploads/" + file.getOriginalFilename()); + int ch; + while ((ch = in.read()) != -1) { + f.write(ch); + } + f.flush(); + f.close(); + modelAndView.getModel().put("message", "File uploaded successfully!"); + } catch (Exception e) { + System.out.println("Exception uploading multipart: " + e); + } + return modelAndView; + } +} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserController.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserController.java new file mode 100644 index 0000000000..16e6f293ec --- /dev/null +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserController.java @@ -0,0 +1,30 @@ +package com.baeldung.springdispatcherservlet.controller; + +import com.baeldung.springdispatcherservlet.domain.User; +import com.baeldung.springdispatcherservlet.services.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + @RequestMapping(value = "/example", method = RequestMethod.GET) + @ResponseBody + public User fetchUserExample() { + return userService.exampleUser(); + } + + @RequestMapping(value = "/name", method = RequestMethod.GET) + @ResponseBody + public User fetchUserByFirstName(@RequestParam(value = "firstName") String firstName) { + return userService.fetchUserByFirstName(firstName); + } +} \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserRestController.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserRestController.java new file mode 100644 index 0000000000..9052662f17 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/UserRestController.java @@ -0,0 +1,27 @@ +package com.baeldung.springdispatcherservlet.controller; + +import com.baeldung.springdispatcherservlet.domain.User; +import com.baeldung.springdispatcherservlet.services.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rest/user") +public class UserRestController { + + @Autowired + private UserService userService; + + @RequestMapping(value = "/example", method = RequestMethod.GET) + public User fetchUserExample() { + return userService.exampleUser(); + } + + @RequestMapping(value = "/name", method = RequestMethod.GET) + public User fetchUserByFirstName(@RequestParam(value = "firstName") String firstName) { + return userService.fetchUserByFirstName(firstName); + } +} \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/domain/User.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/domain/User.java new file mode 100644 index 0000000000..6e8cde50db --- /dev/null +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/domain/User.java @@ -0,0 +1,41 @@ +package com.baeldung.springdispatcherservlet.domain; + + +public class User { + private long id; + private String firstName; + private String lastName; + + public User(long id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + public User() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/services/UserService.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/services/UserService.java new file mode 100644 index 0000000000..1b9bdd4a71 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/services/UserService.java @@ -0,0 +1,17 @@ +package com.baeldung.springdispatcherservlet.services; + +import org.springframework.stereotype.Service; + +import com.baeldung.springdispatcherservlet.domain.User; + +@Service +public class UserService { + + public User fetchUserByFirstName(String firstName) { + return new User(1, firstName, "Everyperson"); + } + + public User exampleUser() { + return new User(1, "Example", "Everyperson"); + } +} \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/resources/README.md b/spring-dispatcher-servlet/src/main/resources/README.md deleted file mode 100644 index 7c97e75a2c..0000000000 --- a/spring-dispatcher-servlet/src/main/resources/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## Info ## - -- The diagram is created with [yed](http://www.yworks.com/products/yed) diff --git a/spring-dispatcher-servlet/src/main/resources/diagram.graphml b/spring-dispatcher-servlet/src/main/resources/diagram.graphml deleted file mode 100644 index 1806ab7719..0000000000 --- a/spring-dispatcher-servlet/src/main/resources/diagram.graphml +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Servlet Engine (e.g. Tomcat) - - - - - - - - - - Folder 1 - - - - - - - - - - - - - - - - Controller - - - - - - - - - - - - - - - - - - - Model - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Model - - - - - - - - - - - - - - - - - - - - DispatcherServlet - - - - - - - - - - - - - - - - - - - View Template - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Return Control - - - - - - - - - - - - Render Response - - - - - - - - - - - - Delegate Request - - - - - - - - - - - - Delegate Rendering of Response - - - - - - - - - - - - - - - - - - - - - - - - - Incoming Request - - - - - - - - - - - - Return Response - - - - - - - - - - - - - - Handle Request - - - - - - - - - - - - - - Create Model - - - - - - - - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> -<g> - - <radialGradient id="neck_x5F_white_1_" cx="28.0298" cy="-751.9429" r="11.4464" fx="25.7969" fy="-753.1596" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#B38E5D"/> - <stop offset="1" style="stop-color:#805126"/> - </radialGradient> - <path id="neck_x5F_white_2_" fill="url(#neck_x5F_white_1_)" stroke="#5B453B" stroke-miterlimit="10" d="M19.278,37.799h18.188 - v13.23c-1.313,0.371-17.173,0.436-18.188,0.172V37.799z"/> - - <radialGradient id="SVGID_1_" cx="27.481" cy="-760.3003" r="31.0533" fx="21.4231" fy="-763.6011" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#B38E5D"/> - <stop offset="1" style="stop-color:#805126"/> - </radialGradient> - <path fill="url(#SVGID_1_)" stroke="#5B453B" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 - V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 - c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> - - <radialGradient id="face_x5F_white_1_" cx="27.7827" cy="-732.2632" r="23.424" fx="23.2131" fy="-734.753" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#B38E5D"/> - <stop offset="1" style="stop-color:#805126"/> - </radialGradient> - <path id="face_x5F_white_2_" fill="url(#face_x5F_white_1_)" stroke="#5B453B" stroke-miterlimit="10" d="M43.676,23.357 - c0.086,10.199-6.738,18.52-15.246,18.586c-8.503,0.068-15.467-8.146-15.553-18.344C12.794,13.4,19.618,5.079,28.123,5.012 - C36.627,4.945,43.59,13.158,43.676,23.357z"/> - - <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="2941.4297" y1="5674.7988" x2="2965.0596" y2="5768.2505" gradientTransform="matrix(0.275 0 0 0.2733 -783.3976 -1542.678)"> - <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.42"/> - <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.12"/> - </linearGradient> - <path id="face_highlight_2_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 - c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 - c2.274-0.592,3.988-2.459,4.375-4.766c0.183-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> - <path id="path9833_2_" fill="#4B4B4B" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 - C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 - c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 - s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.654,22.781 - c15.665-0.703,12.289-10.48,9.658-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> - - <radialGradient id="collar_x5F_body_2_" cx="15.1587" cy="-763.7056" r="32.4004" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#B0E8FF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <path id="collar_x5F_body_1_" fill="url(#collar_x5F_body_2_)" stroke="#5491CF" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494 - h48.51c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 - c-1.771,1.655-5.61,2.802-10.063,2.802c-4.453,0-8.292-1.146-10.063-2.802c0,0-5.755,0.586-11.189,6.021 - C1.378,56.689,0.5,62.768,0.5,62.768z"/> - - <radialGradient id="collar_x5F_r_2_" cx="31.5" cy="-753.832" r="9.2834" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#80CCFF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <path id="collar_x5F_r_1_" fill="url(#collar_x5F_r_2_)" stroke="#5491CF" d="M38.159,41.381c0,0-0.574,2.369-3.013,4.441 - c-2.108,1.795-5.783,2.072-5.783,2.072l3.974,6.217c0,0,2.957-1.637,5.009-3.848c1.922-2.072,1.37-5.479,1.37-5.479L38.159,41.381z - "/> - - <radialGradient id="collar_x5F_l_2_" cx="19.1377" cy="-753.873" r="9.2837" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#80CCFF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <path id="collar_x5F_l_1_" fill="url(#collar_x5F_l_2_)" stroke="#5491CF" d="M18.63,41.422c0,0,0.576,2.369,3.012,4.441 - c2.109,1.793,5.785,2.072,5.785,2.072l-3.974,6.217c0,0-2.957-1.637-5.007-3.85c-1.922-2.072-1.37-5.48-1.37-5.48L18.63,41.422z"/> - - <radialGradient id="Knob2_2_" cx="27.8872" cy="9.9414" r="0.9669" gradientTransform="matrix(1 0 0 -1 0.04 66.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#80CCFF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <circle id="Knob2_1_" fill="url(#Knob2_2_)" stroke="#5491CF" cx="28.258" cy="56.254" r="0.584"/> - - <radialGradient id="Knob1_2_" cx="27.9253" cy="3.6973" r="0.9669" gradientTransform="matrix(1 0 0 -1 0.04 66.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#80CCFF"/> - <stop offset="1" style="stop-color:#74AEEE"/> - </radialGradient> - <circle id="Knob1_1_" fill="url(#Knob1_2_)" stroke="#5491CF" cx="28.296" cy="62.499" r="0.584"/> -</g> -</svg> - - - - diff --git a/spring-dispatcher-servlet/src/main/resources/diagram.png b/spring-dispatcher-servlet/src/main/resources/diagram.png deleted file mode 100644 index c0c545d680d344da47592a4180b9061fd1615a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60385 zcmc$`cRbZ^{65|=j+G-TBb;PruSm$T_XtU{$|fs&6-U|Gglrj+5rvG%sAPo*nb}*} z>-#*7_viD+@A3FO9^Zey{nO&S?$>=k$Mw9f>lUJ^u0TRaOL*eM2@)kmS?v=ia7s^{ zIAw`A1^U2;=u_eS!o@Qp`|)^eVuQ~t5W_4E1#cLyMGaL>HPd`zE>h5pS{>^ z*nUBz!v0FD9vx*%aB)@!`#CKg3OPAG<^aL~vrhKVtR%|e2ZUJ{XfksY10JZ4Z^sL- zSl-g5(AC7HtWSUZIB&4>TftYO)xACg?>hhWG$a~vLS~If~l?QBBeDD*bYRO8<4;BiT^&{PN6Y^N3S~q+j zzR*bslPKh(5N~O4%=22NxFy)CUWO4D?o(eUpuLmF?l4kdB!1X7KXv3h)4Z-OV|X6_ zlYi-&yI^Yp7rlrdd&2SCu-H!!%VJ^deCb2%bcboiu zN(2jL@7^;cdeG=1W(|)G6V*DQ=2X@&e36+j^Vb1!eP?BF;3i4yy@ng{|^Gdo&eORLObtUgob@#_N9$>tFE zl@aR$8BT8Q@7vK*$Gcr5WKC}z#_;g)(yn@zGaP$wEq&t^?#YzFpL({R#DAye{(P1W zXG*DJt@rl5zI-iqJY8K~3xmS0bg5(W<#0xa(8k+|)p4HNf}qh8vIpN!+j=pf6h)27aLUC47_~y>ebKpk4bf3TRS*NIZZYz zJYi6KDlolR((t;htWkb+;6D0j?LDc4*DuYRQha>KxAngJuZ__8hkSmAn>Qlf@D=akUH9#x?$`)y|VIhN?s=NumIo@tk!psBVecf>X8A5olG?(>wURYQCq z8Cm<<976665A)izN&WC<%x`~VT15$A8d5dnc(wN4SiP^NW_N{k@0!8AsVI4_MukB1 znV`kKg6m;a+$-PTvW@yeh>SK7@EBGhy&Fv{?1#5f9O}uu3lwfr=DoW2{mSn&c!b=b zL8F5=5h(ozKZ&8_XX5ViZ$&sblzgXu{P4CiwY3$8 zv{;|*e{rMiR5;oIHuWUFamumP)v+tvS^KyJ@RVDPSZNYckfqpJ@TZJlN0R|g|_n0Nqi?)H@D{y5eRJN5OZO&>LhLY*ejgmEQ3Co zXc-$Db2T_mhZ;t8S1ANCblj{)Zb9(9mZ+(&HpR8})zHv5xH;S$LW`@^_MR^oS;#yV zq$wQl^!oN&x5M=|#ui&fM#jyaQqeIlL}o(WoS*c<-J^ru!M??T65;ycwe$1d(&20v zQMJso4 zJ5nx}`RVAyS>fC<=jAOK()-G;c!lASG{zC?GPRVPA0Mr5u|~S2)WKSyhlJ~bPEkgT zd=nFzeJpH+I!E2m&~VMTl7#NwPUNpTrdIMMqdG6wg+3+oOk}ON`^p?UM$odeIem9` z*Wkd9u1o$Tm6D2zRu|#gz~nkP zKOdq-NkL)d^JYT)%XYvy4TS&ReBKadZEJb>(b=Y=BCdRs6cKy9VguKMopq?xvI+{9 zH4$&`&kK00nP69f_!7f-9ovIWphck+K0J-D`~*$V9QWw0+wxg|NEl7u2dP(F2~9mb zsysC9f6etY5pSM__�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 diff --git a/spring-dispatcher-servlet/src/main/resources/messages.properties b/spring-dispatcher-servlet/src/main/resources/messages.properties deleted file mode 100644 index c36eb5aa42..0000000000 --- a/spring-dispatcher-servlet/src/main/resources/messages.properties +++ /dev/null @@ -1,22 +0,0 @@ -home.title=Welcome to TaskTools! -task.add.description=description -task.add.due=due -task.add.header=Adding a task to {0}''s list: -task.add.submit=Submit -task.add.title={0}: task add -task.attach.attachment=attached file -task.attach.description=description -task.attach.header=task #{0}: attach file -task.attach.submit=Submit -task.attach.title=#{0}: Attach file -task.get.attach=Attach file -task.get.attachments=attachments: -task.get.download=Download -task.get.header=task #{0}: -task.get.list=Back -task.get.title={0}: task details -task.list.add-new=Add new -task.list.details=Details -task.list.header={0}''s tasks: -task.list.home=Home -task.list.title={0}: task list diff --git a/spring-dispatcher-servlet/src/main/resources/messages_de.properties b/spring-dispatcher-servlet/src/main/resources/messages_de.properties deleted file mode 100644 index 184b72101c..0000000000 --- a/spring-dispatcher-servlet/src/main/resources/messages_de.properties +++ /dev/null @@ -1,22 +0,0 @@ -home.title=Willkommen bei TaskTools! -task.add.description=Beschreibung -task.add.due=f\u00e4llig -task.add.header=F\u00fcge eine Aufgabe zu {0}''s Liste hinzu: -task.add.submit=Senden -task.add.title={0}: Task hinzuf\u00fcgen -task.attach.attachment=Angeh\u00e4ngte Datei -task.attach.description=Beschreibung -task.attach.header=Task #{0}: Datei anh\u00e4ngen -task.attach.submit=Senden -task.attach.title=#{0}: Datei anh\u00e4ngen -task.get.attach=Datei anh\u00e4ngen -task.get.attachments=Anh\u00e4nge: -task.get.download=Download -task.get.header=Task #{0}: -task.get.list=Zur\u00fcck -task.get.title={0}: Task Details -task.list.add-new=Neuer Task -task.list.details=Details -task.list.header={0}''s Tasks: -task.list.home=Startseite -task.list.title={0}: Task Liste diff --git a/spring-dispatcher-servlet/src/main/resources/theme-post_it.properties b/spring-dispatcher-servlet/src/main/resources/theme-post_it.properties deleted file mode 100644 index d2998e2bdf..0000000000 --- a/spring-dispatcher-servlet/src/main/resources/theme-post_it.properties +++ /dev/null @@ -1 +0,0 @@ -stylesheet=/public/css/themes/post_it.css diff --git a/spring-dispatcher-servlet/src/main/resources/theme-robotask.properties b/spring-dispatcher-servlet/src/main/resources/theme-robotask.properties deleted file mode 100644 index 68fe270b64..0000000000 --- a/spring-dispatcher-servlet/src/main/resources/theme-robotask.properties +++ /dev/null @@ -1 +0,0 @@ -stylesheet=/public/css/themes/robotask.css diff --git a/spring-dispatcher-servlet/src/main/resources/themes/default.properties b/spring-dispatcher-servlet/src/main/resources/themes/default.properties new file mode 100644 index 0000000000..a28d9bc939 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/resources/themes/default.properties @@ -0,0 +1 @@ +styleSheet=/resources/css/default.css \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/resources/themes/example.properties b/spring-dispatcher-servlet/src/main/resources/themes/example.properties new file mode 100644 index 0000000000..11e254eb58 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/resources/themes/example.properties @@ -0,0 +1 @@ +styleSheet=/resources/css/example.css \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/jsp/index.jsp b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/jsp/index.jsp new file mode 100644 index 0000000000..c482eac361 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/jsp/index.jsp @@ -0,0 +1,30 @@ +<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> + + + + + + + Spring Dispatcher + + + +

Hello World!

+
+
Switch Theme! + Switch Theme! +
+
+
+
+ + +
+
+
+ ${message} + + diff --git a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/error.html b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/error.html deleted file mode 100644 index 8f0f6afca7..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/error.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - Error - - - - -

Error:

-

-

- - diff --git a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/home.html b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/home.html deleted file mode 100644 index 6adec7bb12..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/home.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - -

TaskTools

-
    -
  • - -
  • -
- - diff --git a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-add.html b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-add.html deleted file mode 100644 index 520486f52e..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-add.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - -

-
- - - -
- - diff --git a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-attach.html b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-attach.html deleted file mode 100644 index 23246f330b..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-attach.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - -

-
- - - -
- - diff --git a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-get.html b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-get.html deleted file mode 100644 index e7b35b6780..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-get.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - -

-

-

-
-

-
-
-
- - -
-
-
-

- - -

- - diff --git a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-list.html b/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-list.html deleted file mode 100644 index 0671f24ba3..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/WEB-INF/views/task-list.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - -

-
    -
  • -

    -

    - -
  • -
-

- - -

- - diff --git a/spring-dispatcher-servlet/src/main/webapp/public/css/base.css b/spring-dispatcher-servlet/src/main/webapp/public/css/base.css deleted file mode 100644 index 4d3c2597cf..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/public/css/base.css +++ /dev/null @@ -1,8 +0,0 @@ -a.button { - -webkit-appearance: button; - -moz-appearance: button; - appearance: button; - text-decoration: none; - color: #2196f3; - background-color: #e0e0e0; -} diff --git a/spring-dispatcher-servlet/src/main/webapp/public/css/themes/post_it.css b/spring-dispatcher-servlet/src/main/webapp/public/css/themes/post_it.css deleted file mode 100644 index 578781ec83..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/public/css/themes/post_it.css +++ /dev/null @@ -1,8 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Indie+Flower'); - -* { - font-family: 'Indie Flower', sans-serif; - font-size: 18px; - color: #ffeb3b; - background-color: #212121; -} diff --git a/spring-dispatcher-servlet/src/main/webapp/public/css/themes/robotask.css b/spring-dispatcher-servlet/src/main/webapp/public/css/themes/robotask.css deleted file mode 100644 index 8c0121b536..0000000000 --- a/spring-dispatcher-servlet/src/main/webapp/public/css/themes/robotask.css +++ /dev/null @@ -1,8 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Roboto'); - -* { - font-family: Roboto, sans-serif; - font-size: 1em; - color: #212121; - background-color: #fafafa; -} diff --git a/spring-dispatcher-servlet/src/main/webapp/resources/css/default.css b/spring-dispatcher-servlet/src/main/webapp/resources/css/default.css new file mode 100644 index 0000000000..7f20f36d96 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/webapp/resources/css/default.css @@ -0,0 +1,4 @@ +h2 { + color: green; + font-weight: 400; +} \ No newline at end of file diff --git a/spring-dispatcher-servlet/src/main/webapp/resources/css/example.css b/spring-dispatcher-servlet/src/main/webapp/resources/css/example.css new file mode 100644 index 0000000000..fe31b0396a --- /dev/null +++ b/spring-dispatcher-servlet/src/main/webapp/resources/css/example.css @@ -0,0 +1,4 @@ +h2 { + color: red; + font-weight: 700; +} \ No newline at end of file From f88d40442c6ae1e0d89ece887d239d3231e1f335 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 22 Apr 2017 14:19:39 +0200 Subject: [PATCH 25/26] Refactor MySQLAutoconfiguration (#1703) --- .../MySQLAutoconfiguration.java | 48 ++++++++----------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java b/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java index bbe2a86e39..09f387902d 100644 --- a/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java +++ b/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java @@ -1,28 +1,10 @@ package com.baeldung.autoconfiguration; -import java.util.Arrays; -import java.util.Properties; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureOrder; -import org.springframework.boot.autoconfigure.condition.ConditionMessage; +import org.springframework.boot.autoconfigure.condition.*; import org.springframework.boot.autoconfigure.condition.ConditionMessage.Style; -import org.springframework.boot.autoconfigure.condition.ConditionOutcome; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.condition.ConditionalOnResource; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.boot.autoconfigure.condition.SpringBootCondition; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.*; import org.springframework.core.Ordered; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotatedTypeMetadata; @@ -32,11 +14,17 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.util.ClassUtils; +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Arrays; +import java.util.Properties; + @Configuration @ConditionalOnClass(DataSource.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @PropertySource("classpath:mysql.properties") public class MySQLAutoconfiguration { + @Autowired private Environment env; @@ -74,7 +62,7 @@ public class MySQLAutoconfiguration { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "com.baeldung.autoconfiguration.example" }); + em.setPackagesToScan("com.baeldung.autoconfiguration.example"); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); if (additionalProperties() != null) { em.setJpaProperties(additionalProperties()); @@ -104,17 +92,21 @@ public class MySQLAutoconfiguration { static class HibernateCondition extends SpringBootCondition { - private static String[] CLASS_NAMES = { "org.hibernate.ejb.HibernateEntityManager", "org.hibernate.jpa.HibernateEntityManager" }; + private static final String[] CLASS_NAMES = { + "org.hibernate.ejb.HibernateEntityManager", + "org.hibernate.jpa.HibernateEntityManager" }; @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { ConditionMessage.Builder message = ConditionMessage.forCondition("Hibernate"); - for (String className : CLASS_NAMES) { - if (ClassUtils.isPresent(className, context.getClassLoader())) { - return ConditionOutcome.match(message.found("class").items(Style.NORMAL, className)); - } - } - return ConditionOutcome.noMatch(message.didNotFind("class", "classes").items(Style.NORMAL, Arrays.asList(CLASS_NAMES))); + + return Arrays.stream(CLASS_NAMES) + .filter(className -> ClassUtils.isPresent(className, context.getClassLoader())) + .map(className -> ConditionOutcome + .match(message.found("class").items(Style.NORMAL, className))) + .findAny() + .orElseGet(() -> ConditionOutcome + .noMatch(message.didNotFind("class", "classes").items(Style.NORMAL, Arrays.asList(CLASS_NAMES)))); } } From 9f9dc8770a239dd41d9618df2f7bc950f62e93b6 Mon Sep 17 00:00:00 2001 From: Doha2012 Date: Sat, 22 Apr 2017 19:58:20 +0200 Subject: [PATCH 26/26] cleanup generated files (#1705) * upgrade to spring boot 1.5.2 * add full update to REST API * modify ratings controller * upgrade herold * fix integration test * fix integration test * minor fix * fix integration test * fix integration test * minor cleanup * minor cleanup * remove log4j properties * use standard logbook.xml * remove log4j dependencies * remove commons-logging * merge * fix conflict * exclude commons-logging dependency * cleanup * minor fix * minor fix * fix dependency issues * Revert "fix dependency issues" This reverts commit 83bf1f9fd2e1a9a55f9cacb085669568b06b49ec. * fix dependency issues * minor fix * minor fix * minor fix * cleanup generated files --- .gitignore | 2 + .../com/baeldung/cxf/aegis/BaeldungTest.java | 10 ++ .../java/com/baeldung/jexcel/JExcelTest.java | 8 + .../com/baeldung/poi/excel/ExcelTest.java | 8 + apache-poi/temp.xls | Bin 13824 -> 0 bytes apache-poi/temp.xlsx | Bin 3492 -> 0 bytes jaxb/pom.xml | 3 + .../com/baeldung/jaxb/gen/ObjectFactory.java | 48 ++++++ .../com/baeldung/jaxb/gen/UserRequest.java | 87 ++++++++++ .../com/baeldung/jaxb/gen/UserResponse.java | 149 ++++++++++++++++++ .../com/baeldung/jaxb/gen/package-info.java | 2 + .../java/org/w3/_2001/xmlschema/Adapter1.java | 23 +++ .../shell/simple/SimpleCLIUnitTest.java | 40 +++-- 13 files changed, 358 insertions(+), 22 deletions(-) delete mode 100644 apache-poi/temp.xls delete mode 100644 apache-poi/temp.xlsx create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java create mode 100644 jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java diff --git a/.gitignore b/.gitignore index f3fa30f3e3..60c38ed8f5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ spring-openid/src/main/resources/application.properties .recommenders/ /spring-hibernate4/nbproject/ spring-security-openid/src/main/resources/application.properties + +spring-all/*.log diff --git a/apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java b/apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java index 559de037a9..935b283cb4 100644 --- a/apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java +++ b/apache-cxf/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungTest.java @@ -3,8 +3,10 @@ package com.baeldung.cxf.aegis; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import org.junit.After; import org.junit.Test; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.lang.reflect.Type; @@ -90,4 +92,12 @@ public class BaeldungTest { xmlReader.close(); return courseRepo; } + + @After + public void cleanup(){ + File testFile = new File(fileName); + if (testFile.exists()) { + testFile.delete(); + } + } } \ No newline at end of file diff --git a/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java b/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java index 8ee465be34..72272913d5 100644 --- a/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java +++ b/apache-poi/src/test/java/com/baeldung/jexcel/JExcelTest.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; import org.junit.Before; +import org.junit.After; public class JExcelTest { @@ -53,4 +54,11 @@ public class JExcelTest { .get(1)); } + @After + public void cleanup(){ + File testFile = new File(fileLocation); + if (testFile.exists()) { + testFile.delete(); + } + } } \ No newline at end of file diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java index 34fa64dd94..ad36f46f02 100644 --- a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java +++ b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelTest.java @@ -16,6 +16,7 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; import org.junit.Before; +import org.junit.After; public class ExcelTest { @@ -50,4 +51,11 @@ public class ExcelTest { .get(1)); } + @After + public void cleanup(){ + File testFile = new File(fileLocation); + if (testFile.exists()) { + testFile.delete(); + } + } } \ No newline at end of file diff --git a/apache-poi/temp.xls b/apache-poi/temp.xls deleted file mode 100644 index 1fad76d88d4842cfa56a936fc6b33786ade3291f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13824 zcmeHOOG{Nz6#n*o==F8IULTbdT#CR{M6*Jod_)cu3Q3{{Lis91%@DJK!rN)X+;>{y#nO@hC8;m1@{TC-}B@)&|BFiWMvaEP!Qun=0)+f@=d<1rL6Z7LUMc^D>W6b8@6 zc{U2+x-rS27dWh!eWQH92s|Dphgv?mn1lCIZ=r6bPEi-K`mdeDn%7QI$lvVjR)@`G z;3aE`9@b*YA(U#nOpj~=F)Tm&^8VOBPum&AYZb3kc~g-zZAy7LUb{&S4;pT;XCWfK zDp_x-^=*}N*ogvSehH)A)jPkv*cNDqleCTDy3UPgO{xEp48_$%=z=~i7UHW_+xnH1 zRfAx1;6jW;3$Ybt#E&MpbBs+~OP|uh?EPxebz!)$Fi~(c77%&Em0b{@zFb0ePW55_N28;n?z!)$Fi~(c7 z7%&Em0b{@zFb0ePW55_N28;n?z!)$Fi~(c77%&Emfz8Q)B$-NrsicTXdaPs}OAe|0 z3?Tn?NIIHPD NgSqGGUtRz7{{s%gg0TPq diff --git a/apache-poi/temp.xlsx b/apache-poi/temp.xlsx deleted file mode 100644 index 431a8a662c2cacd3363a1593bc24df699ae34c98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3492 zcmaJ@dpwhW8+M*Um`n~iM=Hg}LRd~C%vqC?P6B5s`PR_x;(=`>X5uJlpffbAO-jecjjhzArljCl`o~mzS6A4h(O}#sUGx zvuiLKgHu;y{+1CbzHQ)b33Ji>HzUVu;vr@<|7-fjXeveY;r6tVN>DUlp8!uHCqM%zA@qH4Hi?H+Mbwk4 z-gh}&Fhp_Qx2fjH|-t=EnAZrN6n+GD8uQ1Ff>IqPu? z^u4ytx&Y2qEWoGn$g1@|?Ued2ElU~>>8fw4`T7JjhSeoImPq&Sx?kS#H_5OIeD~^} zlHGRO2>a>DOT-Cy49=-JS=OSjU`*vqKvB#Z<=j_xI|P8YDr-mkBqMoS4mLKs-_j$> zc*EHQ8xVpH2ys0c5s1bi)x!NTwT{-d91vjBqN-L?u0JInl7NqwJEANS)AG8fN^srM z8Tg~=CAT%)3Vgv)F9J)C)b#0inR0MY%Hsw7Am(x6U1OD|7Xkg1^(&6iT_q&SUNGIQ z?W*_7rzrhV9xJi04+kpMrUF&qL>VXZ5kSa=n!`?=N89nd^4XP!K`?1L?=;dZ`@<=y zL=p@opqf$oUB<3vCy#=}0R>03d!aLiwRF{mi{z;yo5T=PuH&!(bF{W_K~j?Aejz;s zQp)wTw!P}w37ye8r^1C`bTQt8aO}@|J%f(Z^dpSLe;j6KV^iV!6a7F2{hnA4yI^b} zPTegqkjcGuDuurl41~{}Gwp1m%^1O7km7jrKN=ax7Y%FmVT`LR4MwjHjCX_6Za;ip z@it{|gJIbSH3ej@bvbqN_+dHfjFMiHqY1x=s9txW^q%@)w^Z*~jQE$`R5ZEDN+F_6 znJn1~J(Qe{a+OVb(+54$l0q<(F8#)BS+**1!dp-rKs(}??tXt1w6@HDPH2^rna-Q2 zu-62}X6qUE@6{y2nvMrH7|qPbKb>az7z{L<`wmiG_9xOl?JM}C_$=X7(I+2zVt`@0z4l08(NiI<+4WA4^kNVUH?Mf< zdH{BIYP{OT_K|?${6t0`A3#6W>gIX8@J`K@eEo9uid-O znqQ38IkEOZaR^c9MH}ram)fVI$1%k63|l6V5&p)e{0v>xGVb3K31Sc#j#0;*b_+&( zI)()M1bE|^T%uErnA$L1&R6urI*P%SEJP@H0qq%fV?C|&UJja$^WV(4koTkJC{rIM zB?0rXRtg1#2aT*a7Q%jO5OmioGFYU>y>u|oAb`42?6I(?2U58q zc1&$ZoS7Su@ts`8&U^nT62brG77~F$|4ix@$=Y@t3{03?8R5 zsR+=wD68$r`c%dDNH#_ZDh;fROzOZ+M(gKTIrsz0IyH6F1z&|k*A{YB9yE4$ed+q0 zHX%dP63-OA8Fzb^p?rUAGr0r!5$4ehi<|uM>|{&$ZB3g+V12naU3aWiCF3}z+KHy| zT=@mLHG@7qX5nWe;rp=gZn18>H`*k*@8}P_K2A&(aqCIVt3Bfv;q06jbLq;04-$x9 zTQc=^aw1M44(^D^xNvHkbX!>}8-CnoFI96YG2;~aWz?Ggp&xd2lxrxr-sCii;(=k! zkv>Ie=7d6Q8*(IlFFkFC?d#KK4O z_c1NucQHq)N9V_hZtPwr+GkX>6RySZK38QHn6%*iip&r${Etmd_*a3$ zu)%)rSgapYw<+lm+cq!|A9fCZMz8jzBA5MDwL1>=LU>xOddlGI)LE;p-VO^fl&3C? z7B&Y%Rj1ZzLW$Tgh% zaS6N}5PE>*aM`73taeBatW=%%gr?-#UJ-+xDHwDp0N9#HEYRa~4y2CXSRy@0qZm34 z-q`c{{c4}&w~g{^FTMGxg|l}FA>3_F&YXSN4XH{@0kZc4a*vaFVKd>7PzUct%;P%E&{ zvO8SPZ7w9nef=VN`S=u=)k6z5lR5V`LFE3m!e3KxYba|^VRqC_-~c~ESv$zqVAd1IY&)As=KUG`n ${basedir}/src/main/java false + true + true + false diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java new file mode 100644 index 0000000000..0a3da677ce --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/ObjectFactory.java @@ -0,0 +1,48 @@ + +package com.baeldung.jaxb.gen; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the com.baeldung.jaxb.gen package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.jaxb.gen + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link UserRequest } + * + */ + public UserRequest createUserRequest() { + return new UserRequest(); + } + + /** + * Create an instance of {@link UserResponse } + * + */ + public UserResponse createUserResponse() { + return new UserResponse(); + } + +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java new file mode 100644 index 0000000000..1c1abc61a6 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserRequest.java @@ -0,0 +1,87 @@ + +package com.baeldung.jaxb.gen; + +import java.io.Serializable; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for UserRequest complex type. + * + *

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

+ * <complexType name="UserRequest">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "UserRequest", propOrder = { + "id", + "name" +}) +@XmlRootElement(name = "userRequest") +public class UserRequest + implements Serializable +{ + + private final static long serialVersionUID = -1L; + protected int id; + @XmlElement(required = true) + protected String name; + + /** + * Gets the value of the id property. + * + */ + public int getId() { + return id; + } + + /** + * Sets the value of the id property. + * + */ + public void setId(int value) { + this.id = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java new file mode 100644 index 0000000000..b80405e4a9 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/UserResponse.java @@ -0,0 +1,149 @@ + +package com.baeldung.jaxb.gen; + +import java.io.Serializable; +import java.util.Calendar; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3._2001.xmlschema.Adapter1; + + +/** + *

Java class for UserResponse complex type. + * + *

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

+ * <complexType name="UserResponse">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="id" type="{http://www.w3.org/2001/XMLSchema}int"/>
+ *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="gender" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="created" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "UserResponse", propOrder = { + "id", + "name", + "gender", + "created" +}) +@XmlRootElement(name = "userResponse") +public class UserResponse + implements Serializable +{ + + private final static long serialVersionUID = -1L; + protected int id; + @XmlElement(required = true) + protected String name; + @XmlElement(required = true) + protected String gender; + @XmlElement(required = true, type = String.class) + @XmlJavaTypeAdapter(Adapter1 .class) + @XmlSchemaType(name = "dateTime") + protected Calendar created; + + /** + * Gets the value of the id property. + * + */ + public int getId() { + return id; + } + + /** + * Sets the value of the id property. + * + */ + public void setId(int value) { + this.id = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the gender property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGender() { + return gender; + } + + /** + * Sets the value of the gender property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setGender(String value) { + this.gender = value; + } + + /** + * Gets the value of the created property. + * + * @return + * possible object is + * {@link String } + * + */ + public Calendar getCreated() { + return created; + } + + /** + * Sets the value of the created property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCreated(Calendar value) { + this.created = value; + } + +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java b/jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java new file mode 100644 index 0000000000..639d00179c --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/gen/package-info.java @@ -0,0 +1,2 @@ +@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.baeldung.com/jaxb/gen", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +package com.baeldung.jaxb.gen; diff --git a/jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java b/jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java new file mode 100644 index 0000000000..54b3c360dc --- /dev/null +++ b/jaxb/src/main/java/org/w3/_2001/xmlschema/Adapter1.java @@ -0,0 +1,23 @@ + +package org.w3._2001.xmlschema; + +import java.util.Calendar; +import javax.xml.bind.annotation.adapters.XmlAdapter; + +public class Adapter1 + extends XmlAdapter +{ + + + public Calendar unmarshal(String value) { + return (javax.xml.bind.DatatypeConverter.parseDateTime(value)); + } + + public String marshal(Calendar value) { + if (value == null) { + return null; + } + return (javax.xml.bind.DatatypeConverter.printDateTime(value)); + } + +} diff --git a/spring-all/src/test/java/org/baeldung/shell/simple/SimpleCLIUnitTest.java b/spring-all/src/test/java/org/baeldung/shell/simple/SimpleCLIUnitTest.java index 0353083943..cc5ac863b5 100644 --- a/spring-all/src/test/java/org/baeldung/shell/simple/SimpleCLIUnitTest.java +++ b/spring-all/src/test/java/org/baeldung/shell/simple/SimpleCLIUnitTest.java @@ -1,6 +1,7 @@ package org.baeldung.shell.simple; import java.io.File; + import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; @@ -15,13 +16,18 @@ public class SimpleCLIUnitTest { @BeforeClass public static void startUp() throws InterruptedException { - Bootstrap bootstrap = new Bootstrap(); + final Bootstrap bootstrap = new Bootstrap(); shell = bootstrap.getJLineShellComponent(); } @AfterClass public static void shutdown() { shell.stop(); + // delete contents.txt + final File testFile = new File("contents.txt"); + if (testFile.exists()) { + testFile.delete(); + } } public static JLineShellComponent getShell() { @@ -31,7 +37,7 @@ public class SimpleCLIUnitTest { @Test public void givenCommandConfig_whenExecutingWebGetCommand_thenCorrectResult() { - CommandResult resultWebSave = shell.executeCommand("web-get --url https://www.google.com"); + final CommandResult resultWebSave = shell.executeCommand("web-get --url https://www.google.com"); Assert.assertTrue(resultWebSave.isSuccess()); } @@ -40,37 +46,27 @@ public class SimpleCLIUnitTest { public void givenCommandConfig_whenExecutingWebSaveCommand_thenCorrectResult() { shell.executeCommand("admin-enable"); - CommandResult result = shell.executeCommand("web-save --url https://www.google.com --out contents.txt"); + final CommandResult result = shell.executeCommand("web-save --url https://www.google.com --out contents.txt"); - Assert.assertArrayEquals( - new boolean[]{ - result.isSuccess(), - new File("contents.txt").exists()}, - new boolean[]{true, true}); + Assert.assertArrayEquals(new boolean[] { result.isSuccess(), new File("contents.txt").exists() }, new boolean[] { true, true }); } @Test public void givenCommandConfig_whenAdminEnableCommandExecuted_thenCorrectAvailability() { - - CommandResult resultAdminDisable = shell.executeCommand("admin-disable"); - CommandResult resultWebSaveUnavailable = shell.executeCommand("web-save --url https://www.google.com --out contents.txt"); - CommandResult resultAdminEnable = shell.executeCommand("admin-enable"); - CommandResult resultWebSaveAvailable = shell.executeCommand("web-save --url https://www.google.com --out contents.txt"); - Assert.assertArrayEquals( - new boolean[]{ - resultAdminDisable.isSuccess(), - resultWebSaveUnavailable.isSuccess(), - resultAdminEnable.isSuccess(), - resultWebSaveAvailable.isSuccess()}, - new boolean[]{true, false, true, true}); + final CommandResult resultAdminDisable = shell.executeCommand("admin-disable"); + final CommandResult resultWebSaveUnavailable = shell.executeCommand("web-save --url https://www.google.com --out contents.txt"); + final CommandResult resultAdminEnable = shell.executeCommand("admin-enable"); + final CommandResult resultWebSaveAvailable = shell.executeCommand("web-save --url https://www.google.com --out contents.txt"); + + Assert.assertArrayEquals(new boolean[] { resultAdminDisable.isSuccess(), resultWebSaveUnavailable.isSuccess(), resultAdminEnable.isSuccess(), resultWebSaveAvailable.isSuccess() }, new boolean[] { true, false, true, true }); } @Test public void givenCommandConfig_whenWebSaveCommandExecutedNoOutArgument_thenError() { shell.executeCommand("admin-enable"); - CommandResult resultWebSave = shell.executeCommand("web-save --url https://www.google.com"); + final CommandResult resultWebSave = shell.executeCommand("web-save --url https://www.google.com"); Assert.assertEquals(resultWebSave.isSuccess(), false); } @@ -78,7 +74,7 @@ public class SimpleCLIUnitTest { @Test public void givenCommandConfig_whenExecutingWebGetCommandWithDefaultArgument_thenCorrectResult() { - CommandResult result = shell.executeCommand("web-get https://www.google.com"); + final CommandResult result = shell.executeCommand("web-get https://www.google.com"); Assert.assertEquals(result.isSuccess(), true); }