From f8edea40ae345bad31589c67686c86cd180ef4bc Mon Sep 17 00:00:00 2001 From: Yasser Afifi Date: Tue, 27 Dec 2016 21:55:41 +0000 Subject: [PATCH 001/120] added HandlerMapping exampels --- .../Controller/ExampleTwoController.java | 19 ++++++++ .../Controller/WelcomeController.java | 19 ++++++++ ...ion_ControllerClassNameHandlerMapping.java | 38 ++++++++++++++++ ...Configuration_SimpleUrlHandlerMapping.java | 45 +++++++++++++++++++ .../config/JavaConfig/WebAppInitializer.java | 25 +++++++++++ .../config/XML/BeanNameUrlHandlerMapping.xml | 34 ++++++++++++++ ...ontrollerClassNameHandlerMappingConfig.xml | 36 +++++++++++++++ .../XML/SimpleUrlHandlerMappingConfig.xml | 38 ++++++++++++++++ 8 files changed, 254 insertions(+) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/ExampleTwoController.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppInitializer.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMapping.xml create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/ExampleTwoController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/ExampleTwoController.java new file mode 100644 index 0000000000..dceeca779f --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/ExampleTwoController.java @@ -0,0 +1,19 @@ +package com.baeldung; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.AbstractController; + +public class ExampleTwoController extends AbstractController +{ + @Override + protected ModelAndView handleRequestInternal(HttpServletRequest request, + HttpServletResponse response) throws Exception { + System.out.println("Inside ExampleTwo Controller"); + + ModelAndView model = new ModelAndView("exampleTwo"); + + return model; + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java new file mode 100644 index 0000000000..fb1f8676f3 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java @@ -0,0 +1,19 @@ +package com.baeldung; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.AbstractController; + +public class WelcomeController extends AbstractController +{ + @Override + protected ModelAndView handleRequestInternal(HttpServletRequest request, + HttpServletResponse response) throws Exception { + System.out.println("Inside BeanNameMappingExampleOne Controller"); + + ModelAndView model = new ModelAndView("test"); + + return model; + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java new file mode 100644 index 0000000000..c6ad821616 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java @@ -0,0 +1,38 @@ +package com.baeldung; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +@Configuration +public class WebAppConfiguration_ControllerClassNameHandlerMapping { + + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + return viewResolver; + } + + @Bean + public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { + ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); + return controllerClassNameHandlerMapping; + } + + @Bean + public WelcomeController welcome() { + WelcomeController welcome = new WelcomeController(); + return welcome; + } + + @Bean + public ExampleTwoController exampleTwo() { + ExampleTwoController exampleTwo = new ExampleTwoController(); + return exampleTwo; + } + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java new file mode 100644 index 0000000000..33cc81a4b8 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java @@ -0,0 +1,45 @@ +package com.baeldung; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +@Configuration +public class WebAppConfiguration_SimpleUrlHandlerMapping { + + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + return viewResolver; + } + + @Bean + public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { + SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + Map urlMap = new HashMap<>(); + urlMap.put("/welcome", welcome()); + urlMap.put("/exampleTwo", exampleTwo()); + simpleUrlHandlerMapping.setUrlMap(urlMap); + return simpleUrlHandlerMapping; + } + + @Bean + public WelcomeController welcome() { + WelcomeController welcome = new WelcomeController(); + return welcome; + } + + @Bean + public ExampleTwoController exampleTwo() { + ExampleTwoController exampleTwo = new ExampleTwoController(); + return exampleTwo; + } + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppInitializer.java new file mode 100644 index 0000000000..19fc09d6a8 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppInitializer.java @@ -0,0 +1,25 @@ +package com.baeldung; + +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 { + + public void onStartup(ServletContext container) throws ServletException { + + AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); + ctx.register(WebAppConfiguration_ControllerClassNameHandlerMapping.class); + ctx.setServletContext(container); + + ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); + + servlet.setLoadOnStartup(1); + servlet.addMapping("/"); + + } +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMapping.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMapping.xml new file mode 100644 index 0000000000..867311f53c --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMapping.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml new file mode 100644 index 0000000000..aacffb6b96 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml new file mode 100644 index 0000000000..68fe422268 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + /test=firstController + /*/test=firstController + /exampleTwo=exampleTwoController + + + + + + + + + + \ No newline at end of file From 31b74a996c7e02a6209fcfde65cc2b968a4b170e Mon Sep 17 00:00:00 2001 From: Yasser Afifi Date: Sun, 1 Jan 2017 18:43:25 +0000 Subject: [PATCH 002/120] added modified HandlerMapping code --- .../WebAppInitializer.java | 20 ++++--- .../Controller/WelcomeBaeldungController.java | 19 ++++++ .../Controller/WelcomeController.java | 15 +++-- ...troller.java => WelcomeTwoController.java} | 18 +++--- ...nfiguration_BeanNameUrlHandlerMapping.java | 34 +++++++++++ ...ppConfiguration_ConfiguringPriorities.java | 60 +++++++++++++++++++ ...ion_ControllerClassNameHandlerMapping.java | 44 +++++++------- ...Configuration_SimpleUrlHandlerMapping.java | 52 ++++++++-------- ...ml => BeanNameUrlHandlerMappingConfig.xml} | 4 +- ...ontrollerClassNameHandlerMappingConfig.xml | 5 +- .../HandlerMappingConfiguringPriorities.xml | 45 ++++++++++++++ .../XML/SimpleUrlHandlerMappingConfig.xml | 28 ++++----- 12 files changed, 246 insertions(+), 98 deletions(-) rename spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/{config/JavaConfig => Controller}/WebAppInitializer.java (77%) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeBaeldungController.java rename spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/{ExampleTwoController.java => WelcomeTwoController.java} (52%) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java rename spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/{BeanNameUrlHandlerMapping.xml => BeanNameUrlHandlerMappingConfig.xml} (93%) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WebAppInitializer.java similarity index 77% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppInitializer.java rename to spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WebAppInitializer.java index 19fc09d6a8..9813077aab 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppInitializer.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WebAppInitializer.java @@ -1,25 +1,27 @@ -package com.baeldung; +package com.baeldung.controller; 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; +import com.baeldung.config.WebAppConfiguration_BeanNameUrlHandlerMapping; + public class WebAppInitializer implements WebApplicationInitializer { - + public void onStartup(ServletContext container) throws ServletException { - + AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); - ctx.register(WebAppConfiguration_ControllerClassNameHandlerMapping.class); + ctx.register(WebAppConfiguration_BeanNameUrlHandlerMapping.class); ctx.setServletContext(container); - + ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); - + servlet.setLoadOnStartup(1); - servlet.addMapping("/"); - + servlet.addMapping("/"); + } } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeBaeldungController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeBaeldungController.java new file mode 100644 index 0000000000..c8769c5607 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeBaeldungController.java @@ -0,0 +1,19 @@ +package com.baeldung.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.AbstractController; + +public class WelcomeBaeldungController extends AbstractController { + @Override + protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + System.out.println("Inside Welcome Baeldung Controller"); + + ModelAndView model = new ModelAndView("welcome"); + + return model; + } + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java index fb1f8676f3..baf9dd9ece 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java @@ -1,19 +1,18 @@ -package com.baeldung; +package com.baeldung.controller; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; -public class WelcomeController extends AbstractController -{ +public class WelcomeController extends AbstractController { @Override - protected ModelAndView handleRequestInternal(HttpServletRequest request, - HttpServletResponse response) throws Exception { - System.out.println("Inside BeanNameMappingExampleOne Controller"); + protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + System.out.println("Inside Welcome Controller"); + + ModelAndView model = new ModelAndView("welcome"); - ModelAndView model = new ModelAndView("test"); - return model; } } \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/ExampleTwoController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeTwoController.java similarity index 52% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/ExampleTwoController.java rename to spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeTwoController.java index dceeca779f..2a63e57fe4 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/ExampleTwoController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeTwoController.java @@ -1,19 +1,19 @@ -package com.baeldung; +package com.baeldung.controller; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; -public class ExampleTwoController extends AbstractController -{ +public class WelcomeTwoController extends AbstractController { @Override - protected ModelAndView handleRequestInternal(HttpServletRequest request, - HttpServletResponse response) throws Exception { - System.out.println("Inside ExampleTwo Controller"); + protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + System.out.println("Inside Welcome two Controller"); + + ModelAndView model = new ModelAndView("welcome"); - ModelAndView model = new ModelAndView("exampleTwo"); - return model; } -} \ No newline at end of file + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java new file mode 100644 index 0000000000..9078444c51 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java @@ -0,0 +1,34 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +import com.baeldung.controller.WelcomeController; + +@Configuration +public class WebAppConfiguration_BeanNameUrlHandlerMapping { + + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + return viewResolver; + } + + @Bean + BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { + BeanNameUrlHandlerMapping bean = new BeanNameUrlHandlerMapping(); + return bean; + } + + @Bean("/welcome") + public WelcomeController welcome() { + WelcomeController welcome = new WelcomeController(); + return welcome; + } + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java new file mode 100644 index 0000000000..ba9968caca --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java @@ -0,0 +1,60 @@ +package com.baeldung.config; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; +import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; + +import com.baeldung.controller.WelcomeBaeldungController; +import com.baeldung.controller.WelcomeController; +import com.baeldung.controller.WelcomeTwoController; + +@Configuration +public class WebAppConfiguration_ConfiguringPriorities { + + @Bean + BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { + BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); + beanNameUrlHandlerMapping.setOrder(2); + return beanNameUrlHandlerMapping; + } + + @Bean("/welcome") + public WelcomeBaeldungController welcomeBaeldungController() { + WelcomeBaeldungController welcomeBaeldungController = new WelcomeBaeldungController(); + return welcomeBaeldungController; + } + + @Bean + public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { + SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + Map urlMap = new HashMap<>(); + urlMap.put("/welcome", welcome()); + simpleUrlHandlerMapping.setUrlMap(urlMap); + simpleUrlHandlerMapping.setOrder(0); + return simpleUrlHandlerMapping; + } + + @Bean + public WelcomeTwoController welcome() { + WelcomeTwoController bean = new WelcomeTwoController(); + return bean; + } + + @Bean + public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { + ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); + controllerClassNameHandlerMapping.setOrder(1); + return controllerClassNameHandlerMapping; + } + + @Bean + public WelcomeController welcomeController() { + WelcomeController bean = new WelcomeController(); + return bean; + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java index c6ad821616..ac822dbe5a 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -6,33 +6,29 @@ import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; +import com.baeldung.controller.WelcomeController; + @Configuration public class WebAppConfiguration_ControllerClassNameHandlerMapping { - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + return viewResolver; + } - @Bean - public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { - ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); - return controllerClassNameHandlerMapping; - } + @Bean + public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { + ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); + return controllerClassNameHandlerMapping; + } - @Bean - public WelcomeController welcome() { - WelcomeController welcome = new WelcomeController(); - return welcome; - } - - @Bean - public ExampleTwoController exampleTwo() { - ExampleTwoController exampleTwo = new ExampleTwoController(); - return exampleTwo; - } + @Bean + public WelcomeController welcome() { + WelcomeController welcome = new WelcomeController(); + return welcome; + } } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java index 33cc81a4b8..48504ed76d 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.config; import java.util.HashMap; import java.util.Map; @@ -9,37 +9,33 @@ import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; +import com.baeldung.controller.WelcomeController; + + @Configuration public class WebAppConfiguration_SimpleUrlHandlerMapping { - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + return viewResolver; + } - @Bean - public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); - Map urlMap = new HashMap<>(); - urlMap.put("/welcome", welcome()); - urlMap.put("/exampleTwo", exampleTwo()); - simpleUrlHandlerMapping.setUrlMap(urlMap); - return simpleUrlHandlerMapping; - } + @Bean + public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { + SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + Map urlMap = new HashMap<>(); + urlMap.put("/welcome", welcome()); + simpleUrlHandlerMapping.setUrlMap(urlMap); + return simpleUrlHandlerMapping; + } - @Bean - public WelcomeController welcome() { - WelcomeController welcome = new WelcomeController(); - return welcome; - } - - @Bean - public ExampleTwoController exampleTwo() { - ExampleTwoController exampleTwo = new ExampleTwoController(); - return exampleTwo; - } + @Bean + public WelcomeController welcome() { + WelcomeController welcome = new WelcomeController(); + return welcome; + } } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMapping.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml similarity index 93% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMapping.xml rename to spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml index 867311f53c..c8b68b99aa 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMapping.xml +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml @@ -22,10 +22,8 @@ - + - - diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml index aacffb6b96..26eaa97595 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml @@ -24,11 +24,10 @@ - - + + - diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml new file mode 100644 index 0000000000..5666d25748 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + /welcome=welcome + /*/welcome=welcome + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml index 68fe422268..e69ab2afab 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml @@ -3,14 +3,16 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation=" - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context.xsd - http://www.springframework.org/schema/mvc - http://www.springframework.org/schema/mvc/spring-mvc.xsd - http://www.springframework.org/schema/cache - http://www.springframework.org/schema/cache/spring-cache.xsd"> + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/mvc + http://www.springframework.org/schema/mvc/spring-mvc.xsd + http://www.springframework.org/schema/cache + http://www.springframework.org/schema/cache/spring-cache.xsd"> + - /test=firstController - /*/test=firstController - /exampleTwo=exampleTwoController + /test=welcome + /*/test=welcome - + - - + \ No newline at end of file From 3351d96147c11b24ea0d2d2abec8ff3a677c413d Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 2 Jan 2017 11:51:12 +0100 Subject: [PATCH 003/120] BAEL-382 add kotlin module --- kotlin/pom.xml | 47 +++++++++++++++++++ .../src/main/kotlin/com/baeldung/Example1.kt | 5 ++ pom.xml | 2 + 3 files changed, 54 insertions(+) create mode 100644 kotlin/pom.xml create mode 100644 kotlin/src/main/kotlin/com/baeldung/Example1.kt diff --git a/kotlin/pom.xml b/kotlin/pom.xml new file mode 100644 index 0000000000..b93d867f0a --- /dev/null +++ b/kotlin/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + com.baeldung + kotlin + 1.0-SNAPSHOT + + + + org.jetbrains.kotlin + kotlin-stdlib + 1.0.4 + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + kotlin-maven-plugin + org.jetbrains.kotlin + 1.0.4 + + + + compile + + compile + + + + + test-compile + + test-compile + + + + + + + + \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/Example1.kt b/kotlin/src/main/kotlin/com/baeldung/Example1.kt new file mode 100644 index 0000000000..9637ec9145 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/Example1.kt @@ -0,0 +1,5 @@ +package com.baeldung + +fun main(args: Array){ + println("hello word") +} diff --git a/pom.xml b/pom.xml index 19bec5bf81..b86a98c3c2 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,8 @@ jsoup junit5 + kotlin + log-mdc log4j log4j2 From 4d415f7f744ab4f906798be6fb30ea28a00a7a21 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 2 Jan 2017 14:48:05 +0100 Subject: [PATCH 004/120] BAEL-382 null-safety example --- kotlin/pom.xml | 13 +++++++++++- kotlin/src/main/kotlin/com/baeldung/Item.kt | 4 ++++ .../main/kotlin/com/baeldung/ItemService.kt | 10 ++++++++++ .../kotlin/com/baeldung/ItemServiceTest.kt | 20 +++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 kotlin/src/main/kotlin/com/baeldung/Item.kt create mode 100644 kotlin/src/main/kotlin/com/baeldung/ItemService.kt create mode 100644 kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt diff --git a/kotlin/pom.xml b/kotlin/pom.xml index b93d867f0a..59f71f91a6 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -14,6 +14,18 @@ kotlin-stdlib 1.0.4 + + org.jetbrains.kotlin + kotlin-test-junit + 1.0.4 + test + + + junit + junit + 4.12 + test + @@ -24,7 +36,6 @@ kotlin-maven-plugin org.jetbrains.kotlin 1.0.4 - compile diff --git a/kotlin/src/main/kotlin/com/baeldung/Item.kt b/kotlin/src/main/kotlin/com/baeldung/Item.kt new file mode 100644 index 0000000000..c0b6dd7631 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/Item.kt @@ -0,0 +1,4 @@ +package com.baeldung + + +data class Item(val id: String, val name: String) \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt new file mode 100644 index 0000000000..7597e2aca6 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt @@ -0,0 +1,10 @@ +package com.baeldung + +import java.util.* + +class ItemService { + fun findItemNameForId(id: String): Item? { + val itemId = UUID.randomUUID().toString() + return Item(itemId, "name-$itemId"); + } +} \ No newline at end of file diff --git a/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt b/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt new file mode 100644 index 0000000000..2442cb18b2 --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt @@ -0,0 +1,20 @@ +package com.baeldung + +import org.junit.Test +import kotlin.test.assertNotNull + +class ItemServiceTest { + @Test + fun givenItemId_whenGetForOptionalName_shouldMakeActionOnNonNullValue() { + //given + val id = "item_id" + val itemService = ItemService() + + //when + val result = itemService.findItemNameForId(id) + + //then + assertNotNull(result?.let { it -> it.id }) + assertNotNull(result!!.id) + } +} \ No newline at end of file From 17148ca5e91a79f9cce9177f098c887751091da0 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 2 Jan 2017 16:22:27 +0100 Subject: [PATCH 005/120] BAEL-382 Add extension function that works on list --- kotlin/src/main/kotlin/com/baeldung/Item.kt | 2 +- .../main/kotlin/com/baeldung/ListExtension.kt | 15 +++++++++++++++ .../kotlin/com/baeldung/ListExtensionTest.kt | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 kotlin/src/main/kotlin/com/baeldung/ListExtension.kt create mode 100644 kotlin/src/test/kotlin/com/baeldung/ListExtensionTest.kt diff --git a/kotlin/src/main/kotlin/com/baeldung/Item.kt b/kotlin/src/main/kotlin/com/baeldung/Item.kt index c0b6dd7631..642b7d6274 100644 --- a/kotlin/src/main/kotlin/com/baeldung/Item.kt +++ b/kotlin/src/main/kotlin/com/baeldung/Item.kt @@ -1,4 +1,4 @@ package com.baeldung -data class Item(val id: String, val name: String) \ No newline at end of file +data class Item(val id: String, val name: String = "unknown_name") \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt b/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt new file mode 100644 index 0000000000..79d2daa1dc --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt @@ -0,0 +1,15 @@ +package com.baeldung + +import java.util.concurrent.ThreadLocalRandom + + +class ListExtension { + fun List.random(): T? { + if (this.isEmpty()) return null + return get(ThreadLocalRandom.current().nextInt(count())) + } + + fun getRandomElementOfList(list: List): T? { + return list.random() + } +} \ No newline at end of file diff --git a/kotlin/src/test/kotlin/com/baeldung/ListExtensionTest.kt b/kotlin/src/test/kotlin/com/baeldung/ListExtensionTest.kt new file mode 100644 index 0000000000..42453f2057 --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/ListExtensionTest.kt @@ -0,0 +1,18 @@ +package com.baeldung + +import org.junit.Test +import kotlin.test.assertTrue + +class ListExtensionTest { + @Test + fun givenList_whenExecuteExtensionFunctionOnList_shouldReturnRandomElementOfList(){ + //given + val elements = listOf("a", "b", "c") + + //when + val result = ListExtension().getRandomElementOfList(elements) + + //then + assertTrue(elements.contains(result)) + } +} \ No newline at end of file From 77fba546b30d1e0095004c80845faf460f59ff65 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 2 Jan 2017 16:32:04 +0100 Subject: [PATCH 006/120] BAEL-382 name of test --- kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt b/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt index 2442cb18b2..d681627f81 100644 --- a/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt +++ b/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt @@ -5,7 +5,7 @@ import kotlin.test.assertNotNull class ItemServiceTest { @Test - fun givenItemId_whenGetForOptionalName_shouldMakeActionOnNonNullValue() { + fun givenItemId_whenGetForOptionalItem_shouldMakeActionOnNonNullValue() { //given val id = "item_id" val itemService = ItemService() From b167fc5315ef527139ff9743140b71c1cf1beda5 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Mon, 2 Jan 2017 16:37:59 +0100 Subject: [PATCH 007/120] BAEL-382 formatting --- kotlin/src/main/kotlin/com/baeldung/Item.kt | 1 - kotlin/src/main/kotlin/com/baeldung/ListExtension.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/Item.kt b/kotlin/src/main/kotlin/com/baeldung/Item.kt index 642b7d6274..d145e894b3 100644 --- a/kotlin/src/main/kotlin/com/baeldung/Item.kt +++ b/kotlin/src/main/kotlin/com/baeldung/Item.kt @@ -1,4 +1,3 @@ package com.baeldung - data class Item(val id: String, val name: String = "unknown_name") \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt b/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt index 79d2daa1dc..9245bf991d 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt +++ b/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt @@ -2,7 +2,6 @@ package com.baeldung import java.util.concurrent.ThreadLocalRandom - class ListExtension { fun List.random(): T? { if (this.isEmpty()) return null From 99e86c5f19d2231b357a0b2af7ffb03df9cdc8ee Mon Sep 17 00:00:00 2001 From: Abhinab Kanrar Date: Tue, 3 Jan 2017 22:23:24 +0530 Subject: [PATCH 008/120] updating with test case (#947) * Update pom.xml * Add files via upload * Update Application.java * Create DataLoader.java * Create DataLoader.java * Delete DataLoader.java --- spring-reactor/pom.xml | 4 ++++ .../main/java/com/baeldung/Application.java | 14 ++---------- .../src/main/java/com/baeldung/Config.java | 22 +++++++++++++++++++ .../test/java/com/baeldung/DataLoader.java | 20 +++++++++++++++++ 4 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 spring-reactor/src/main/java/com/baeldung/Config.java create mode 100644 spring-reactor/src/test/java/com/baeldung/DataLoader.java diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index cdabb2f538..7b6b1318cf 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -27,6 +27,10 @@ io.projectreactor reactor-bus + + org.springframework.boot + spring-boot-starter-test + diff --git a/spring-reactor/src/main/java/com/baeldung/Application.java b/spring-reactor/src/main/java/com/baeldung/Application.java index b635a39e97..9030d41d26 100644 --- a/spring-reactor/src/main/java/com/baeldung/Application.java +++ b/spring-reactor/src/main/java/com/baeldung/Application.java @@ -4,13 +4,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; 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; +import org.springframework.context.annotation.Import; import com.baeldung.consumer.NotificationConsumer; -import reactor.Environment; import reactor.bus.EventBus; import static reactor.bus.selector.Selectors.$; @@ -18,6 +17,7 @@ import static reactor.bus.selector.Selectors.$; @Configuration @EnableAutoConfiguration @ComponentScan +@Import(Config.class) public class Application implements CommandLineRunner { @Autowired @@ -26,16 +26,6 @@ public class Application implements CommandLineRunner { @Autowired private NotificationConsumer notificationConsumer; - @Bean - Environment env() { - return Environment.initializeIfEmpty().assignErrorJournal(); - } - - @Bean - EventBus createEventBus(Environment env) { - return EventBus.create(env, Environment.THREAD_POOL); - } - @Override public void run(String... args) throws Exception { eventBus.on($("notificationConsumer"), notificationConsumer); diff --git a/spring-reactor/src/main/java/com/baeldung/Config.java b/spring-reactor/src/main/java/com/baeldung/Config.java new file mode 100644 index 0000000000..28f40dda02 --- /dev/null +++ b/spring-reactor/src/main/java/com/baeldung/Config.java @@ -0,0 +1,22 @@ +package com.baeldung; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import reactor.Environment; +import reactor.bus.EventBus; + +@Configuration +public class Config { + + @Bean + Environment env() { + return Environment.initializeIfEmpty().assignErrorJournal(); + } + + @Bean + EventBus createEventBus(Environment env) { + return EventBus.create(env, Environment.THREAD_POOL); + } + +} diff --git a/spring-reactor/src/test/java/com/baeldung/DataLoader.java b/spring-reactor/src/test/java/com/baeldung/DataLoader.java new file mode 100644 index 0000000000..2ec3d9e526 --- /dev/null +++ b/spring-reactor/src/test/java/com/baeldung/DataLoader.java @@ -0,0 +1,20 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.client.RestTemplate; + + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {Application.class}) +public class DataLoader { + + @Test + public void exampleTest() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getForObject("http://localhost:8080/startNotification/10", String.class); + } + +} From 49c7cc84eded174c4b36e02023b1502c5eeb9457 Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Tue, 3 Jan 2017 17:47:21 +0000 Subject: [PATCH 009/120] Add Algorithms Module (#936) * Update pom.xml Add FindBugs reporting plugin * Add algorithms module Dijkstra implementation * Update pom.xml * Update pom.xml --- algorithms/pom.xml | 44 +++++++++++ .../algorithms/dijkstra/Dijkstra.java | 59 ++++++++++++++ .../baeldung/algorithms/dijkstra/Graph.java | 21 +++++ .../baeldung/algorithms/dijkstra/Main.java | 9 +++ .../baeldung/algorithms/dijkstra/Node.java | 58 ++++++++++++++ .../algorithms/DijkstraAlgorithmTest.java | 76 +++++++++++++++++++ spring-rest/pom.xml | 14 ---- 7 files changed, 267 insertions(+), 14 deletions(-) create mode 100644 algorithms/pom.xml create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java create mode 100644 algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java diff --git a/algorithms/pom.xml b/algorithms/pom.xml new file mode 100644 index 0000000000..0c85a19534 --- /dev/null +++ b/algorithms/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + com.baeldung + algorithms + 0.0.1-SNAPSHOT + + + 4.12 + 3.6.0 + 1.5.0 + + + + + junit + junit + ${junit.version} + test + + + + + install + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + + + \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java new file mode 100644 index 0000000000..cab550e4b7 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java @@ -0,0 +1,59 @@ +package com.baeldung.algorithms.dijkstra; + + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Map.Entry; +import java.util.Set; + +public class Dijkstra { + + public static Graph calculateShortestPathFromSource(Graph graph, Node source) { + + source.setDistance(0); + + Set settledNodes = new HashSet(); + Set unsettledNodes = new HashSet(); + unsettledNodes.add(source); + + while (unsettledNodes.size() != 0) { + Node currentNode = getLowestDistanceNode(unsettledNodes); + unsettledNodes.remove(currentNode); + for (Entry adjacencyPair : currentNode.getAdjacentNodes().entrySet()) + { + Node adjacentNode = adjacencyPair.getKey(); + Integer edgeWeigh = adjacencyPair.getValue(); + + if (!settledNodes.contains(adjacentNode)) { + CalculateMinimumDistance(adjacentNode, edgeWeigh, currentNode); + unsettledNodes.add(adjacentNode); + } + } + settledNodes.add(currentNode); + } + return graph; + } + + private static void CalculateMinimumDistance(Node evaluationNode, Integer edgeWeigh, Node sourceNode) { + Integer sourceDistance = sourceNode.getDistance(); + if (sourceDistance + edgeWeigh < evaluationNode.getDistance()) { + evaluationNode.setDistance(sourceDistance + edgeWeigh); + LinkedList shortestPath = new LinkedList(sourceNode.getShortestPath()); + shortestPath.add(sourceNode); + evaluationNode.setShortestPath(shortestPath); + } + } + + private static Node getLowestDistanceNode(Set unsettledNodes) { + Node lowestDistanceNode = null; + int lowestDistance = Integer.MAX_VALUE; + for (Node node : unsettledNodes) { + int nodeDistance = node.getDistance(); + if (nodeDistance < lowestDistance) { + lowestDistance = nodeDistance; + lowestDistanceNode = node; + } + } + return lowestDistanceNode; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java new file mode 100644 index 0000000000..e72e28a43c --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java @@ -0,0 +1,21 @@ +package com.baeldung.algorithms.dijkstra; + +import java.util.HashSet; +import java.util.Set; + +public class Graph { + + private Set nodes = new HashSet(); + + public void addNode(Node nodeA) { + nodes.add(nodeA); + } + + public Set getNodes() { + return nodes; + } + + public void setNodes(Set nodes) { + this.nodes = nodes; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java new file mode 100644 index 0000000000..97f9765d3d --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java @@ -0,0 +1,9 @@ +package com.baeldung.algorithms.dijkstra; + +public class Main { + + public static void main(String[] args) { + + + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java new file mode 100644 index 0000000000..7e95bf5d27 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java @@ -0,0 +1,58 @@ +package com.baeldung.algorithms.dijkstra; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class Node { + + private String name; + + private LinkedList shortestPath = new LinkedList(); + + private Integer distance = Integer.MAX_VALUE; + + Map adjacentNodes = new HashMap(); + + public Node(String name) { + this.name = name; + } + + public void addDestination(Node destination, int distance) { + adjacentNodes.put(destination, distance); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Map getAdjacentNodes() { + return adjacentNodes; + } + + public void setAdjacentNodes(Map adjacentNodes) { + this.adjacentNodes = adjacentNodes; + } + + public Integer getDistance() { + return distance; + } + + public void setDistance(Integer distance) { + this.distance = distance; + } + + public List getShortestPath() { + return shortestPath; + } + + public void setShortestPath(LinkedList shortestPath) { + this.shortestPath = shortestPath; + } + +} diff --git a/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java b/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java new file mode 100644 index 0000000000..408da01e02 --- /dev/null +++ b/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java @@ -0,0 +1,76 @@ +package algorithms; + +import static org.junit.Assert.*; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +import com.baeldung.algorithms.dijkstra.Dijkstra; +import com.baeldung.algorithms.dijkstra.Graph; +import com.baeldung.algorithms.dijkstra.Node; + +public class DijkstraAlgorithmTest { + + @Test + public void whenSPPSolved_thenCorrect() { + + Node nodeA = new Node("A"); + Node nodeB = new Node("B"); + Node nodeC = new Node("C"); + Node nodeD = new Node("D"); + Node nodeE = new Node("E"); + Node nodeF = new Node("F"); + + nodeA.addDestination(nodeB, 10); + nodeA.addDestination(nodeC, 15); + + nodeB.addDestination(nodeD, 12); + nodeB.addDestination(nodeF, 15); + + nodeC.addDestination(nodeE, 10); + + nodeD.addDestination(nodeE, 2); + nodeD.addDestination(nodeF, 1); + + nodeF.addDestination(nodeE, 5); + + Graph graph = new Graph(); + + graph.addNode(nodeA); + graph.addNode(nodeB); + graph.addNode(nodeC); + graph.addNode(nodeD); + graph.addNode(nodeE); + graph.addNode(nodeF); + + graph = Dijkstra.calculateShortestPathFromSource(graph, nodeA); + + List shortestPathForNodeB = Arrays.asList(nodeA); + List shortestPathForNodeC = Arrays.asList(nodeA); + List shortestPathForNodeD = Arrays.asList(nodeA, nodeB); + List shortestPathForNodeE = Arrays.asList(nodeA, nodeB, nodeD); + List shortestPathForNodeF = Arrays.asList(nodeA, nodeB, nodeD); + + for(Node node : graph.getNodes()) { + switch (node.getName()) { + case "B": + assertTrue(node.getShortestPath().equals(shortestPathForNodeB)); + break; + case "C": + assertTrue(node.getShortestPath().equals(shortestPathForNodeC)); + break; + case "D": + assertTrue(node.getShortestPath().equals(shortestPathForNodeD)); + break; + case "E": + assertTrue(node.getShortestPath().equals(shortestPathForNodeE)); + break; + case "F": + assertTrue(node.getShortestPath().equals(shortestPathForNodeF)); + break; + } + } + } +} diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 9bb3c12945..da26d8abe9 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -357,18 +357,4 @@ - - - - org.codehaus.mojo - findbugs-maven-plugin - ${findbugs-maven-plugin.version} - - Max - FindDeadLocalStores,FindNullDeref - - - - - From b6d9e5a7c04c284e6fcdfce319d5482aaca60cca Mon Sep 17 00:00:00 2001 From: pivovarit Date: Tue, 3 Jan 2017 18:50:56 +0100 Subject: [PATCH 010/120] Refactor Algorithms module --- .../algorithms/dijkstra/Dijkstra.java | 14 ++--- .../baeldung/algorithms/dijkstra/Graph.java | 4 +- .../baeldung/algorithms/dijkstra/Main.java | 9 --- .../baeldung/algorithms/dijkstra/Node.java | 24 ++++---- .../algorithms/DijkstraAlgorithmTest.java | 59 +++++++++++-------- pom.xml | 1 + 6 files changed, 56 insertions(+), 55 deletions(-) delete mode 100644 algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java index cab550e4b7..b82eedbc3f 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Dijkstra.java @@ -1,6 +1,5 @@ package com.baeldung.algorithms.dijkstra; - import java.util.HashSet; import java.util.LinkedList; import java.util.Map.Entry; @@ -12,18 +11,19 @@ public class Dijkstra { source.setDistance(0); - Set settledNodes = new HashSet(); - Set unsettledNodes = new HashSet(); + Set settledNodes = new HashSet<>(); + Set unsettledNodes = new HashSet<>(); unsettledNodes.add(source); while (unsettledNodes.size() != 0) { Node currentNode = getLowestDistanceNode(unsettledNodes); unsettledNodes.remove(currentNode); - for (Entry adjacencyPair : currentNode.getAdjacentNodes().entrySet()) - { + for (Entry adjacencyPair : currentNode + .getAdjacentNodes() + .entrySet()) { Node adjacentNode = adjacencyPair.getKey(); Integer edgeWeigh = adjacencyPair.getValue(); - + if (!settledNodes.contains(adjacentNode)) { CalculateMinimumDistance(adjacentNode, edgeWeigh, currentNode); unsettledNodes.add(adjacentNode); @@ -38,7 +38,7 @@ public class Dijkstra { Integer sourceDistance = sourceNode.getDistance(); if (sourceDistance + edgeWeigh < evaluationNode.getDistance()) { evaluationNode.setDistance(sourceDistance + edgeWeigh); - LinkedList shortestPath = new LinkedList(sourceNode.getShortestPath()); + LinkedList shortestPath = new LinkedList<>(sourceNode.getShortestPath()); shortestPath.add(sourceNode); evaluationNode.setShortestPath(shortestPath); } diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java index e72e28a43c..f24d6ae60e 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Graph.java @@ -5,8 +5,8 @@ import java.util.Set; public class Graph { - private Set nodes = new HashSet(); - + private Set nodes = new HashSet<>(); + public void addNode(Node nodeA) { nodes.add(nodeA); } diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java deleted file mode 100644 index 97f9765d3d..0000000000 --- a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Main.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.algorithms.dijkstra; - -public class Main { - - public static void main(String[] args) { - - - } -} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java index 7e95bf5d27..b00127a259 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/dijkstra/Node.java @@ -6,35 +6,35 @@ import java.util.List; import java.util.Map; public class Node { - + private String name; - - private LinkedList shortestPath = new LinkedList(); - + + private LinkedList shortestPath = new LinkedList<>(); + private Integer distance = Integer.MAX_VALUE; - - Map adjacentNodes = new HashMap(); - + + private Map adjacentNodes = new HashMap<>(); + public Node(String name) { this.name = name; } - + public void addDestination(Node destination, int distance) { adjacentNodes.put(destination, distance); } - + public String getName() { return name; } - + public void setName(String name) { this.name = name; } - + public Map getAdjacentNodes() { return adjacentNodes; } - + public void setAdjacentNodes(Map adjacentNodes) { this.adjacentNodes = adjacentNodes; } diff --git a/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java b/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java index 408da01e02..86ee62c827 100644 --- a/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java +++ b/algorithms/src/test/java/algorithms/DijkstraAlgorithmTest.java @@ -1,74 +1,83 @@ package algorithms; -import static org.junit.Assert.*; - -import java.util.Arrays; -import java.util.List; - -import org.junit.Test; - import com.baeldung.algorithms.dijkstra.Dijkstra; import com.baeldung.algorithms.dijkstra.Graph; import com.baeldung.algorithms.dijkstra.Node; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertTrue; public class DijkstraAlgorithmTest { @Test public void whenSPPSolved_thenCorrect() { - + Node nodeA = new Node("A"); Node nodeB = new Node("B"); Node nodeC = new Node("C"); - Node nodeD = new Node("D"); + Node nodeD = new Node("D"); Node nodeE = new Node("E"); Node nodeF = new Node("F"); - + nodeA.addDestination(nodeB, 10); nodeA.addDestination(nodeC, 15); - + nodeB.addDestination(nodeD, 12); nodeB.addDestination(nodeF, 15); - + nodeC.addDestination(nodeE, 10); - + nodeD.addDestination(nodeE, 2); nodeD.addDestination(nodeF, 1); - + nodeF.addDestination(nodeE, 5); - - Graph graph = new Graph(); - + + Graph graph = new Graph(); + graph.addNode(nodeA); graph.addNode(nodeB); graph.addNode(nodeC); graph.addNode(nodeD); graph.addNode(nodeE); graph.addNode(nodeF); - + graph = Dijkstra.calculateShortestPathFromSource(graph, nodeA); - + List shortestPathForNodeB = Arrays.asList(nodeA); List shortestPathForNodeC = Arrays.asList(nodeA); List shortestPathForNodeD = Arrays.asList(nodeA, nodeB); List shortestPathForNodeE = Arrays.asList(nodeA, nodeB, nodeD); List shortestPathForNodeF = Arrays.asList(nodeA, nodeB, nodeD); - for(Node node : graph.getNodes()) { + for (Node node : graph.getNodes()) { switch (node.getName()) { case "B": - assertTrue(node.getShortestPath().equals(shortestPathForNodeB)); + assertTrue(node + .getShortestPath() + .equals(shortestPathForNodeB)); break; case "C": - assertTrue(node.getShortestPath().equals(shortestPathForNodeC)); + assertTrue(node + .getShortestPath() + .equals(shortestPathForNodeC)); break; case "D": - assertTrue(node.getShortestPath().equals(shortestPathForNodeD)); + assertTrue(node + .getShortestPath() + .equals(shortestPathForNodeD)); break; case "E": - assertTrue(node.getShortestPath().equals(shortestPathForNodeE)); + assertTrue(node + .getShortestPath() + .equals(shortestPathForNodeE)); break; case "F": - assertTrue(node.getShortestPath().equals(shortestPathForNodeF)); + assertTrue(node + .getShortestPath() + .equals(shortestPathForNodeF)); break; } } diff --git a/pom.xml b/pom.xml index 19bec5bf81..4b10a76951 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ + algorithms annotations apache-cxf apache-fop From 68ec5d70c46f07b5a7ae66924203ffe27f64a191 Mon Sep 17 00:00:00 2001 From: michal_aibin Date: Tue, 3 Jan 2017 21:24:12 +0100 Subject: [PATCH 011/120] AWS lambda package name change --- aws-lambda/.gitignore | 1 + aws-lambda/pom.xml | 4 ++-- .../java/com/baeldung/LambdaRequestStreamHandler.java | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 aws-lambda/.gitignore diff --git a/aws-lambda/.gitignore b/aws-lambda/.gitignore new file mode 100644 index 0000000000..b83d22266a --- /dev/null +++ b/aws-lambda/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml index c02d9d59dd..f3ae672a2f 100644 --- a/aws-lambda/pom.xml +++ b/aws-lambda/pom.xml @@ -2,10 +2,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - aws-lambda + aws 0.1.0-SNAPSHOT jar - aws-lambda + aws diff --git a/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java b/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java index aba65628ad..96d11d2257 100644 --- a/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java +++ b/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java @@ -1,14 +1,14 @@ package com.baeldung; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; -import org.apache.commons.io.IOUtils; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import org.apache.commons.io.IOUtils; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + public class LambdaRequestStreamHandler implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { From 494e539700bb3cda5fe1bb3b4cceec84c38a9ce0 Mon Sep 17 00:00:00 2001 From: Diane Duan Date: Wed, 4 Jan 2017 17:50:53 +0800 Subject: [PATCH 012/120] init --- metrics/pom.xml | 27 +++++++++++++++++++ .../baeldung/metrics/core/MetricsDemo.java | 4 +++ .../metrics/core/MetricsRegistryDemo.java | 6 +++++ pom.xml | 1 + 4 files changed, 38 insertions(+) create mode 100644 metrics/pom.xml create mode 100644 metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java diff --git a/metrics/pom.xml b/metrics/pom.xml new file mode 100644 index 0000000000..c4b433482b --- /dev/null +++ b/metrics/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + metrics + + + + 3.1.0 + + + + + io.dropwizard.metrics + metrics-core + ${dep.ver.metrics} + + + \ No newline at end of file diff --git a/metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java b/metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java new file mode 100644 index 0000000000..3f3127fd5a --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java @@ -0,0 +1,4 @@ +package com.baeldung.metrics.core; + +public class MetricsDemo { +} diff --git a/metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java b/metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java new file mode 100644 index 0000000000..fe390d5534 --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java @@ -0,0 +1,6 @@ +package com.baeldung.metrics.core; + +public class MetricsRegistryDemo { + public static void main(String[] args) { + } +} diff --git a/pom.xml b/pom.xml index 4b10a76951..1d683b36b9 100644 --- a/pom.xml +++ b/pom.xml @@ -173,6 +173,7 @@ xml xmlunit2 xstream + metrics From 8e89c9394b03c6680e9f1cd72b1e78b1cd897e99 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 4 Jan 2017 10:53:39 +0100 Subject: [PATCH 013/120] BAEL-19 introduce basic concstruct --- kotlin/src/main/kotlin/com/baeldung/Item.kt | 5 ++- .../main/kotlin/com/baeldung/ItemService.kt | 39 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/Item.kt b/kotlin/src/main/kotlin/com/baeldung/Item.kt index d145e894b3..6e552b3a42 100644 --- a/kotlin/src/main/kotlin/com/baeldung/Item.kt +++ b/kotlin/src/main/kotlin/com/baeldung/Item.kt @@ -1,3 +1,6 @@ package com.baeldung -data class Item(val id: String, val name: String = "unknown_name") \ No newline at end of file +open class Item(val id: String, val name: String = "unknown_name") + +class ItemWithCategory(id: String, name: String, val categoryId: String) : Item(id, name) + diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt index 7597e2aca6..0b1c419ab4 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt +++ b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt @@ -5,6 +5,43 @@ import java.util.* class ItemService { fun findItemNameForId(id: String): Item? { val itemId = UUID.randomUUID().toString() - return Item(itemId, "name-$itemId"); + return Item(itemId, "name-$itemId") } +} + +class ItemManager(val categoryId: String, val dbConnection: String) { + var email = "" + + constructor(categoryId: String, dbConnection: String, email: String) : this(categoryId, dbConnection) { + this.email = email + } + + fun isFromSpecificCategory(catId: String): Boolean { + return categoryId == catId + } + + fun makeAnalyisOfCategory(catId: String): Unit { + val result = if (catId == "100") "Yes" else "No" + println(result) + + } +} + +fun main(args: Array) { + val numbers = arrayOf("first", "second", "third", "fourth") + + for (n in numbers) { + println(n) + } + + for (i in 0..9) { + println(i) + } + + val firstName = "Tom" + val secondName = "Mary" + println("Names: $firstName, $secondName") + + val itemManager = ItemManager("cat_id", "db://connection") + print("function result: ${itemManager.isFromSpecificCategory("1")}") } \ No newline at end of file From f72311412835ae41510520bb43d3c4928fc946c5 Mon Sep 17 00:00:00 2001 From: Yasser Afifi Date: Wed, 4 Jan 2017 13:10:02 +0000 Subject: [PATCH 014/120] fixed handlerMapping code and added tests --- ...ontroller.java => BaeldungController.java} | 4 +- ...TwoController.java => TestController.java} | 4 +- ...nfiguration_BeanNameUrlHandlerMapping.java | 2 +- ...ppConfiguration_ConfiguringPriorities.java | 24 +++++------ ...Configuration_SimpleUrlHandlerMapping.java | 2 +- .../XML/BeanNameUrlHandlerMappingConfig.xml | 2 +- .../HandlerMappingConfiguringPriorities.xml | 8 ++-- .../XML/SimpleUrlHandlerMappingConfig.xml | 4 +- .../BeanNameMappingConfigTest.java | 42 +++++++++++++++++++ ...ControllerClassNameHandlerMappingTest.java | 41 ++++++++++++++++++ .../HandlerMappingPriorityConfigTest.java | 41 ++++++++++++++++++ .../SimpleUrlMappingConfigTest.java | 41 ++++++++++++++++++ 12 files changed, 190 insertions(+), 25 deletions(-) rename spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/{WelcomeBaeldungController.java => BaeldungController.java} (79%) rename spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/{WelcomeTwoController.java => TestController.java} (79%) create mode 100644 spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java create mode 100644 spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java create mode 100644 spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java create mode 100644 spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeBaeldungController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/BaeldungController.java similarity index 79% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeBaeldungController.java rename to spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/BaeldungController.java index c8769c5607..9cc55d3554 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeBaeldungController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/BaeldungController.java @@ -6,12 +6,12 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; -public class WelcomeBaeldungController extends AbstractController { +public class BaeldungController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Inside Welcome Baeldung Controller"); - ModelAndView model = new ModelAndView("welcome"); + ModelAndView model = new ModelAndView("baeldung"); return model; } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeTwoController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/TestController.java similarity index 79% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeTwoController.java rename to spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/TestController.java index 2a63e57fe4..f0d69de8b0 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeTwoController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/TestController.java @@ -6,12 +6,12 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; -public class WelcomeTwoController extends AbstractController { +public class TestController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Inside Welcome two Controller"); - ModelAndView model = new ModelAndView("welcome"); + ModelAndView model = new ModelAndView("test"); return model; } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java index 9078444c51..5ed738a8c4 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java @@ -25,7 +25,7 @@ public class WebAppConfiguration_BeanNameUrlHandlerMapping { return bean; } - @Bean("/welcome") + @Bean("/beanNameUrl") public WelcomeController welcome() { WelcomeController welcome = new WelcomeController(); return welcome; diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java index ba9968caca..ba3607faf3 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java @@ -9,9 +9,9 @@ import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; -import com.baeldung.controller.WelcomeBaeldungController; +import com.baeldung.controller.BaeldungController; import com.baeldung.controller.WelcomeController; -import com.baeldung.controller.WelcomeTwoController; +import com.baeldung.controller.TestController; @Configuration public class WebAppConfiguration_ConfiguringPriorities { @@ -24,32 +24,32 @@ public class WebAppConfiguration_ConfiguringPriorities { } @Bean("/welcome") - public WelcomeBaeldungController welcomeBaeldungController() { - WelcomeBaeldungController welcomeBaeldungController = new WelcomeBaeldungController(); - return welcomeBaeldungController; + public BaeldungController welcomeBaeldungController() { + BaeldungController baeldungController = new BaeldungController(); + return baeldungController; } @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); Map urlMap = new HashMap<>(); - urlMap.put("/welcome", welcome()); + urlMap.put("/welcome", test()); simpleUrlHandlerMapping.setUrlMap(urlMap); simpleUrlHandlerMapping.setOrder(0); return simpleUrlHandlerMapping; } @Bean - public WelcomeTwoController welcome() { - WelcomeTwoController bean = new WelcomeTwoController(); - return bean; + public TestController test() { + TestController test = new TestController(); + return test; } @Bean public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { - ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); - controllerClassNameHandlerMapping.setOrder(1); - return controllerClassNameHandlerMapping; + ControllerClassNameHandlerMapping bean = new ControllerClassNameHandlerMapping(); + bean.setOrder(1); + return bean; } @Bean diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java index 48504ed76d..3b8534500d 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java @@ -27,7 +27,7 @@ public class WebAppConfiguration_SimpleUrlHandlerMapping { public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); Map urlMap = new HashMap<>(); - urlMap.put("/welcome", welcome()); + urlMap.put("/simpleUrlWelcome", welcome()); simpleUrlHandlerMapping.setUrlMap(urlMap); return simpleUrlHandlerMapping; } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml index c8b68b99aa..2da079540c 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml @@ -23,7 +23,7 @@ class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> - + diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml index 5666d25748..9d20db25ea 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml +++ b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml @@ -17,19 +17,19 @@ class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> - + - /welcome=welcome - /*/welcome=welcome + /welcome=test + /*/welcome=test - + - /test=welcome - /*/test=welcome + /simpleUrlWelcome=welcome + /*/simpleUrlWelcome=welcome diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java new file mode 100644 index 0000000000..9cc992bb3c --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java @@ -0,0 +1,42 @@ +package come.baeldung.test; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.config.WebAppConfiguration_BeanNameUrlHandlerMapping; + + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = WebAppConfiguration_BeanNameUrlHandlerMapping.class) +public class BeanNameMappingConfigTest { + + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); + } + + @Test + public void whenBeanNameMapping_thenMappedOK() throws Exception { + mockMvc.perform(get("/beanNameUrl")).andExpect(status().isOk()).andExpect(view().name("welcome")).andDo(print()); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java new file mode 100644 index 0000000000..24fd865c11 --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java @@ -0,0 +1,41 @@ +package come.baeldung.test; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.config.WebAppConfiguration_ControllerClassNameHandlerMapping; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = WebAppConfiguration_ControllerClassNameHandlerMapping.class) +public class ControllerClassNameHandlerMappingTest { + + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); + } + + @Test + public void whenControllerClassNameMapping_thenMappedOK() throws Exception { + mockMvc.perform(get("/welcometest")).andExpect(status().isOk()).andExpect(view().name("welcome")).andDo(print()); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java new file mode 100644 index 0000000000..33f2793089 --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java @@ -0,0 +1,41 @@ +package come.baeldung.test; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.config.WebAppConfiguration_ConfiguringPriorities; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = WebAppConfiguration_ConfiguringPriorities.class) +public class HandlerMappingPriorityConfigTest { + + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); + } + + @Test + public void whenBeanNameMapping_thenMappedOK() throws Exception { + mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("test")).andDo(print()); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java new file mode 100644 index 0000000000..8c9405abfc --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java @@ -0,0 +1,41 @@ +package come.baeldung.test; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.config.WebAppConfiguration_SimpleUrlHandlerMapping; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = WebAppConfiguration_SimpleUrlHandlerMapping.class) +public class SimpleUrlMappingConfigTest { + + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); + } + + @Test + public void whenSimpleUrlMapping_thenMappedOK() throws Exception { + mockMvc.perform(get("/simpleUrlWelcome")).andExpect(status().isOk()).andExpect(view().name("welcome")).andDo(print()); + } +} \ No newline at end of file From 6d5feb75dcd2ec4de75b5191dd51d4206c4848e6 Mon Sep 17 00:00:00 2001 From: Yasser Afifi Date: Wed, 4 Jan 2017 13:40:02 +0000 Subject: [PATCH 015/120] fixed names --- .../HandlerMapping/HandlerMappingPriorityConfigTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java index 33f2793089..cfb51fd5cc 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java @@ -35,7 +35,7 @@ public class HandlerMappingPriorityConfigTest { } @Test - public void whenBeanNameMapping_thenMappedOK() throws Exception { + public void whenConfiguringPriorities_thenMappedOK() throws Exception { mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("test")).andDo(print()); } } \ No newline at end of file From 4d248d5c8f58aaa0dfc0a768e0ca6c3ecd6052a3 Mon Sep 17 00:00:00 2001 From: michal_aibin Date: Wed, 4 Jan 2017 19:36:43 +0100 Subject: [PATCH 016/120] AWS Lambda package name change to AWS --- {aws-lambda => aws/aws-lambda}/.gitignore | 0 {aws-lambda => aws/aws-lambda}/pom.xml | 0 .../src/main/java/com/baeldung/LambdaMethodHandler.java | 0 .../src/main/java/com/baeldung/LambdaRequestHandler.java | 0 .../src/main/java/com/baeldung/LambdaRequestStreamHandler.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {aws-lambda => aws/aws-lambda}/.gitignore (100%) rename {aws-lambda => aws/aws-lambda}/pom.xml (100%) rename {aws-lambda => aws/aws-lambda}/src/main/java/com/baeldung/LambdaMethodHandler.java (100%) rename {aws-lambda => aws/aws-lambda}/src/main/java/com/baeldung/LambdaRequestHandler.java (100%) rename {aws-lambda => aws/aws-lambda}/src/main/java/com/baeldung/LambdaRequestStreamHandler.java (100%) diff --git a/aws-lambda/.gitignore b/aws/aws-lambda/.gitignore similarity index 100% rename from aws-lambda/.gitignore rename to aws/aws-lambda/.gitignore diff --git a/aws-lambda/pom.xml b/aws/aws-lambda/pom.xml similarity index 100% rename from aws-lambda/pom.xml rename to aws/aws-lambda/pom.xml diff --git a/aws-lambda/src/main/java/com/baeldung/LambdaMethodHandler.java b/aws/aws-lambda/src/main/java/com/baeldung/LambdaMethodHandler.java similarity index 100% rename from aws-lambda/src/main/java/com/baeldung/LambdaMethodHandler.java rename to aws/aws-lambda/src/main/java/com/baeldung/LambdaMethodHandler.java diff --git a/aws-lambda/src/main/java/com/baeldung/LambdaRequestHandler.java b/aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestHandler.java similarity index 100% rename from aws-lambda/src/main/java/com/baeldung/LambdaRequestHandler.java rename to aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestHandler.java diff --git a/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java b/aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java similarity index 100% rename from aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java rename to aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java From 5e18a4f185ce8db2fcffdfbd47c5632aaf4c9a43 Mon Sep 17 00:00:00 2001 From: michal_aibin Date: Wed, 4 Jan 2017 19:39:16 +0100 Subject: [PATCH 017/120] AWS Lambda package name change to AWS --- aws/{aws-lambda => }/.gitignore | 0 aws/{aws-lambda => }/pom.xml | 0 .../src/main/java/com/baeldung/LambdaMethodHandler.java | 0 .../src/main/java/com/baeldung/LambdaRequestHandler.java | 0 .../src/main/java/com/baeldung/LambdaRequestStreamHandler.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename aws/{aws-lambda => }/.gitignore (100%) rename aws/{aws-lambda => }/pom.xml (100%) rename aws/{aws-lambda => }/src/main/java/com/baeldung/LambdaMethodHandler.java (100%) rename aws/{aws-lambda => }/src/main/java/com/baeldung/LambdaRequestHandler.java (100%) rename aws/{aws-lambda => }/src/main/java/com/baeldung/LambdaRequestStreamHandler.java (100%) diff --git a/aws/aws-lambda/.gitignore b/aws/.gitignore similarity index 100% rename from aws/aws-lambda/.gitignore rename to aws/.gitignore diff --git a/aws/aws-lambda/pom.xml b/aws/pom.xml similarity index 100% rename from aws/aws-lambda/pom.xml rename to aws/pom.xml diff --git a/aws/aws-lambda/src/main/java/com/baeldung/LambdaMethodHandler.java b/aws/src/main/java/com/baeldung/LambdaMethodHandler.java similarity index 100% rename from aws/aws-lambda/src/main/java/com/baeldung/LambdaMethodHandler.java rename to aws/src/main/java/com/baeldung/LambdaMethodHandler.java diff --git a/aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestHandler.java b/aws/src/main/java/com/baeldung/LambdaRequestHandler.java similarity index 100% rename from aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestHandler.java rename to aws/src/main/java/com/baeldung/LambdaRequestHandler.java diff --git a/aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java b/aws/src/main/java/com/baeldung/LambdaRequestStreamHandler.java similarity index 100% rename from aws/aws-lambda/src/main/java/com/baeldung/LambdaRequestStreamHandler.java rename to aws/src/main/java/com/baeldung/LambdaRequestStreamHandler.java From e32e9d6f7d787e017a3fb92cd788763b1d927d0d Mon Sep 17 00:00:00 2001 From: pivovarit Date: Wed, 4 Jan 2017 19:47:20 +0100 Subject: [PATCH 018/120] Add "aws" module --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 4b10a76951..89afb5f698 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ + aws algorithms annotations apache-cxf From c5b7b8f464ea2a3733840f5dba9531ed6c1b164a Mon Sep 17 00:00:00 2001 From: pivovarit Date: Wed, 4 Jan 2017 19:48:40 +0100 Subject: [PATCH 019/120] Refactor "aws" module --- .../baeldung/{ => lambda}/LambdaMethodHandler.java | 2 +- .../baeldung/{ => lambda}/LambdaRequestHandler.java | 2 +- .../{ => lambda}/LambdaRequestStreamHandler.java | 11 +++++------ 3 files changed, 7 insertions(+), 8 deletions(-) rename aws/src/main/java/com/baeldung/{ => lambda}/LambdaMethodHandler.java (89%) rename aws/src/main/java/com/baeldung/{ => lambda}/LambdaRequestHandler.java (92%) rename aws/src/main/java/com/baeldung/{ => lambda}/LambdaRequestStreamHandler.java (95%) diff --git a/aws/src/main/java/com/baeldung/LambdaMethodHandler.java b/aws/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java similarity index 89% rename from aws/src/main/java/com/baeldung/LambdaMethodHandler.java rename to aws/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java index 6cce694912..dc21476290 100644 --- a/aws/src/main/java/com/baeldung/LambdaMethodHandler.java +++ b/aws/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.lambda; import com.amazonaws.services.lambda.runtime.Context; diff --git a/aws/src/main/java/com/baeldung/LambdaRequestHandler.java b/aws/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java similarity index 92% rename from aws/src/main/java/com/baeldung/LambdaRequestHandler.java rename to aws/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java index 37f114db25..85385555d2 100644 --- a/aws/src/main/java/com/baeldung/LambdaRequestHandler.java +++ b/aws/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.lambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; diff --git a/aws/src/main/java/com/baeldung/LambdaRequestStreamHandler.java b/aws/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java similarity index 95% rename from aws/src/main/java/com/baeldung/LambdaRequestStreamHandler.java rename to aws/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java index 96d11d2257..6e8a33c42d 100644 --- a/aws/src/main/java/com/baeldung/LambdaRequestStreamHandler.java +++ b/aws/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java @@ -1,14 +1,13 @@ -package com.baeldung; +package com.baeldung.lambda; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import org.apache.commons.io.IOUtils; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - public class LambdaRequestStreamHandler implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { From d1c2e042ce69bc2bec35de818c19e070ec8d14ea Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Wed, 4 Jan 2017 22:42:19 +0100 Subject: [PATCH 020/120] Add deploy profiles for standalone wildfly using cargo plugin and for runtime installed instance --- ejb/ejb-client/pom.xml | 6 + .../baeldung/ejb/setup/test/EJBSetupTest.java | 8 +- ejb/ejb-remote/pom.xml | 127 +++++++++++----- ejb/pom.xml | 136 +++++++++--------- 4 files changed, 170 insertions(+), 107 deletions(-) diff --git a/ejb/ejb-client/pom.xml b/ejb/ejb-client/pom.xml index 6ece63572d..ba5763a3e7 100755 --- a/ejb/ejb-client/pom.xml +++ b/ejb/ejb-client/pom.xml @@ -10,6 +10,12 @@ ejb-client EJB3 Client Maven EJB3 Client Maven + + + 4.12 + 2.19 + + org.wildfly diff --git a/ejb/ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupTest.java b/ejb/ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupTest.java index 1a8165cee6..fa92873a73 100755 --- a/ejb/ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupTest.java +++ b/ejb/ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupTest.java @@ -1,16 +1,18 @@ package com.baeldung.ejb.setup.test; -import static org.junit.Assert.*; -import org.junit.Test; import com.baeldung.ejb.client.EJBClient; import com.baeldung.ejb.tutorial.HelloWorldBean; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; public class EJBSetupTest { @Test - public void testEJBClient() { + public void EJBClientTest() { EJBClient ejbClient = new EJBClient(); HelloWorldBean bean = new HelloWorldBean(); assertEquals(bean.getHelloWorld(), ejbClient.getEJBRemoteMessage()); } + } diff --git a/ejb/ejb-remote/pom.xml b/ejb/ejb-remote/pom.xml index d102edd8e3..beb182ff8b 100755 --- a/ejb/ejb-remote/pom.xml +++ b/ejb/ejb-remote/pom.xml @@ -1,40 +1,95 @@ - 4.0.0 - - com.baeldung.ejb - ejb - 1.0-SNAPSHOT - - ejb-remote - ejb + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + + com.baeldung.ejb + ejb + 1.0-SNAPSHOT + + + ejb-remote + ejb + + + + javax + javaee-api + ${javaee-api.version} + provided + + + + + + + + wildfly-standalone + + true + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + + + + wildfly10x + + http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.zip + + + + + + 127.0.0.1 + 9990 + testUser:admin1234! + + + + + + + + + + + + wildfly-runtime + + false + + + + + org.wildfly.plugins + wildfly-maven-plugin + 1.1.0.Alpha5 + + 127.0.0.1 + 9990 + testUser + admin1234! + ${build.finalName}.jar + + + + + + + + + + 7.0 + 1.6.1 + + + - - - - javax - javaee-api - 7.0 - provided - - - - - - org.wildfly.plugins - wildfly-maven-plugin - 1.1.0.Alpha5 - - 127.0.0.1 - 9990 - testUser - admin1234! - ${build.finalName}.jar - - - - - - \ No newline at end of file diff --git a/ejb/pom.xml b/ejb/pom.xml index 8176de7936..b00f80a817 100755 --- a/ejb/pom.xml +++ b/ejb/pom.xml @@ -1,79 +1,79 @@ - 4.0.0 - com.baeldung.ejb - ejb - 1.0-SNAPSHOT - pom - ejb - EJB Tutorial + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung.ejb + ejb + 1.0-SNAPSHOT + pom + ejb + EJB Tutorial - - - jboss-public-repository-group - JBoss Public Maven Repository Group - http://repository.jboss.org/nexus/content/groups/public/ - default - - true - never - - - true - never - - - + + + jboss-public-repository-group + JBoss Public Maven Repository Group + http://repository.jboss.org/nexus/content/groups/public/ + default + + true + never + + + true + never + + + - - - - com.baeldung.ejb - ejb-remote - 1.0-SNAPSHOT - ejb - + + + + com.baeldung.ejb + ejb-remote + 1.0-SNAPSHOT + ejb + - - javax - javaee-api - 7.0 - provided - + + javax + javaee-api + 7.0 + provided + - - org.wildfly - wildfly-ejb-client-bom - 10.1.0.Final - pom - import - - - + + org.wildfly + wildfly-ejb-client-bom + 10.1.0.Final + pom + import + + + - - - - - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - + + + + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + - - maven-ejb-plugin - 2.4 - - 3.2 - - - - - + + maven-ejb-plugin + 2.4 + + 3.2 + + + + + ejb-remote From d5f3eaa77aa1b1e7efaa6a5c9638a3645ad416a3 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Thu, 5 Jan 2017 08:29:54 +0100 Subject: [PATCH 021/120] BAEL-97 - simplifying code --- .../Controller/WebAppInitializer.java | 27 ---------- .../Controller/WelcomeController.java | 18 ------- ...ion_ControllerClassNameHandlerMapping.java | 34 ------------ ...Configuration_SimpleUrlHandlerMapping.java | 41 -------------- .../config/BeanNameHandlerMappingConfig.java | 41 -------------- .../BeanNameUrlHandlerMappingConfig.java} | 13 ++--- ...ntrollerClassNameHandlerMappingConfig.java | 41 ++++++-------- .../HandlerMappingPrioritiesConfig.java} | 10 ++-- .../config/SimpleUrlHandlerMappingConfig.java | 54 +++++++++---------- .../handlermapping}/BaeldungController.java | 11 ++-- .../handlermapping/ExampleTwoController.java | 22 -------- .../handlermapping}/TestController.java | 13 ++--- .../handlermapping/WelcomeController.java | 13 ++--- .../BeanNameMappingConfigTest.java | 15 +++--- ...ControllerClassNameHandlerMappingTest.java | 8 +-- .../HandlerMappingPriorityConfigTest.java | 6 +-- .../SimpleUrlMappingConfigTest.java | 15 +++--- .../controller/BeanNameMappingConfigTest.java | 41 -------------- ...ControllerClassNameHandlerMappingTest.java | 39 -------------- .../SimpleUrlMappingConfigTest.java | 40 -------------- .../BeanNameUrlHandlerMappingConfig.xml | 0 ...ontrollerClassNameHandlerMappingConfig.xml | 0 .../HandlerMappingConfiguringPriorities.xml | 0 .../SimpleUrlHandlerMappingConfig.xml | 0 24 files changed, 86 insertions(+), 416 deletions(-) delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WebAppInitializer.java delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameHandlerMappingConfig.java rename spring-mvc-java/src/main/java/com/baeldung/{HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java => spring/web/config/BeanNameUrlHandlerMappingConfig.java} (69%) rename spring-mvc-java/src/main/java/com/baeldung/{HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java => spring/web/config/HandlerMappingPrioritiesConfig.java} (85%) rename spring-mvc-java/src/main/java/com/baeldung/{HandlerMapping/Controller => web/controller/handlermapping}/BaeldungController.java (83%) delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/ExampleTwoController.java rename spring-mvc-java/src/main/java/com/baeldung/{HandlerMapping/Controller => web/controller/handlermapping}/TestController.java (74%) delete mode 100644 spring-mvc-java/src/test/java/com/baeldung/web/controller/BeanNameMappingConfigTest.java delete mode 100644 spring-mvc-java/src/test/java/com/baeldung/web/controller/ControllerClassNameHandlerMappingTest.java delete mode 100644 spring-mvc-java/src/test/java/com/baeldung/web/controller/SimpleUrlMappingConfigTest.java rename spring-mvc-java/src/{main/java/com/baeldung/HandlerMapping/config/XML => test/resources}/BeanNameUrlHandlerMappingConfig.xml (100%) rename spring-mvc-java/src/{main/java/com/baeldung/HandlerMapping/config/XML => test/resources}/ControllerClassNameHandlerMappingConfig.xml (100%) rename spring-mvc-java/src/{main/java/com/baeldung/HandlerMapping/config/XML => test/resources}/HandlerMappingConfiguringPriorities.xml (100%) rename spring-mvc-java/src/{main/java/com/baeldung/HandlerMapping/config/XML => test/resources}/SimpleUrlHandlerMappingConfig.xml (100%) diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WebAppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WebAppInitializer.java deleted file mode 100644 index 9813077aab..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WebAppInitializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.controller; - -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; - -import com.baeldung.config.WebAppConfiguration_BeanNameUrlHandlerMapping; - -public class WebAppInitializer implements WebApplicationInitializer { - - public void onStartup(ServletContext container) throws ServletException { - - AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); - ctx.register(WebAppConfiguration_BeanNameUrlHandlerMapping.class); - ctx.setServletContext(container); - - ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); - - servlet.setLoadOnStartup(1); - servlet.addMapping("/"); - - } -} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java deleted file mode 100644 index baf9dd9ece..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/WelcomeController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.controller; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.AbstractController; - -public class WelcomeController extends AbstractController { - @Override - protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { - System.out.println("Inside Welcome Controller"); - - ModelAndView model = new ModelAndView("welcome"); - - return model; - } -} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java deleted file mode 100644 index ac822dbe5a..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ControllerClassNameHandlerMapping.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; -import org.springframework.web.servlet.view.InternalResourceViewResolver; - -import com.baeldung.controller.WelcomeController; - -@Configuration -public class WebAppConfiguration_ControllerClassNameHandlerMapping { - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } - - @Bean - public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { - ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); - return controllerClassNameHandlerMapping; - } - - @Bean - public WelcomeController welcome() { - WelcomeController welcome = new WelcomeController(); - return welcome; - } - -} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java deleted file mode 100644 index 3b8534500d..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_SimpleUrlHandlerMapping.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.config; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; -import org.springframework.web.servlet.view.InternalResourceViewResolver; - -import com.baeldung.controller.WelcomeController; - - -@Configuration -public class WebAppConfiguration_SimpleUrlHandlerMapping { - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } - - @Bean - public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); - Map urlMap = new HashMap<>(); - urlMap.put("/simpleUrlWelcome", welcome()); - simpleUrlHandlerMapping.setUrlMap(urlMap); - return simpleUrlHandlerMapping; - } - - @Bean - public WelcomeController welcome() { - WelcomeController welcome = new WelcomeController(); - return welcome; - } - -} diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameHandlerMappingConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameHandlerMappingConfig.java deleted file mode 100644 index fce1d50a00..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameHandlerMappingConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.spring.web.config; - -import com.baeldung.web.controller.handlermapping.ExampleTwoController; -import com.baeldung.web.controller.handlermapping.WelcomeController; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; -import org.springframework.web.servlet.view.InternalResourceViewResolver; - -@Configuration -public class BeanNameHandlerMappingConfig { - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } - - @Bean - public BeanNameUrlHandlerMapping controllerClassNameHandlerMapping() { - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - return beanNameUrlHandlerMapping; - } - - @Bean(name="/welcomeBean") - public WelcomeController welcomeBean() { - WelcomeController welcome = new WelcomeController(); - return welcome; - } - - @Bean(name="/ex") - public ExampleTwoController exampleTwo() { - ExampleTwoController exampleTwo = new ExampleTwoController(); - return exampleTwo; - } - -} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java similarity index 69% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java rename to spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java index 5ed738a8c4..fe220fee44 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_BeanNameUrlHandlerMapping.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java @@ -1,15 +1,14 @@ -package com.baeldung.config; +package com.baeldung.spring.web.config; +import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; -import com.baeldung.controller.WelcomeController; - @Configuration -public class WebAppConfiguration_BeanNameUrlHandlerMapping { +public class BeanNameUrlHandlerMappingConfig { @Bean public ViewResolver viewResolver() { @@ -21,14 +20,12 @@ public class WebAppConfiguration_BeanNameUrlHandlerMapping { @Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { - BeanNameUrlHandlerMapping bean = new BeanNameUrlHandlerMapping(); - return bean; + return new BeanNameUrlHandlerMapping(); } @Bean("/beanNameUrl") public WelcomeController welcome() { - WelcomeController welcome = new WelcomeController(); - return welcome; + return new WelcomeController(); } } diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java index b03b781e5a..0f67624658 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java @@ -1,42 +1,35 @@ package com.baeldung.spring.web.config; -import com.baeldung.web.controller.handlermapping.ExampleTwoController; import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; +@EnableWebMvc @Configuration public class ControllerClassNameHandlerMappingConfig { - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + return viewResolver; + } - @Bean - public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { - ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); - return controllerClassNameHandlerMapping; - } + @Bean + public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { + ControllerClassNameHandlerMapping controllerClassNameHandlerMapping = new ControllerClassNameHandlerMapping(); + return controllerClassNameHandlerMapping; + } - @Bean - public WelcomeController welcome() { - WelcomeController welcome = new WelcomeController(); - return welcome; - } + @Bean + public WelcomeController welcome() { + return new WelcomeController(); + } - @Bean - public ExampleTwoController exampleTwo() { - ExampleTwoController exampleTwo = new ExampleTwoController(); - return exampleTwo; - } } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java similarity index 85% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java rename to spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java index ba3607faf3..249c816823 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/JavaConfig/WebAppConfiguration_ConfiguringPriorities.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java @@ -1,20 +1,20 @@ -package com.baeldung.config; +package com.baeldung.spring.web.config; import java.util.HashMap; import java.util.Map; +import com.baeldung.web.controller.handlermapping.BaeldungController; +import com.baeldung.web.controller.handlermapping.TestController; +import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; -import com.baeldung.controller.BaeldungController; -import com.baeldung.controller.WelcomeController; -import com.baeldung.controller.TestController; @Configuration -public class WebAppConfiguration_ConfiguringPriorities { +public class HandlerMappingPrioritiesConfig { @Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java index aef7750dc0..a81b2fa14e 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java @@ -1,6 +1,8 @@ package com.baeldung.spring.web.config; -import com.baeldung.web.controller.handlermapping.ExampleTwoController; +import java.util.HashMap; +import java.util.Map; + import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -8,40 +10,34 @@ import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; -import java.util.HashMap; -import java.util.Map; + + + @Configuration public class SimpleUrlHandlerMappingConfig { - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); + viewResolver.setPrefix("/"); + viewResolver.setSuffix(".jsp"); + return viewResolver; + } - @Bean - public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); - Map urlMap = new HashMap<>(); - urlMap.put("/simpleUrlWelcome", welcome()); - urlMap.put("/exampleTwo", exampleTwo()); - simpleUrlHandlerMapping.setUrlMap(urlMap); - return simpleUrlHandlerMapping; - } + @Bean + public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { + SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + Map urlMap = new HashMap<>(); + urlMap.put("/simpleUrlWelcome", welcome()); + simpleUrlHandlerMapping.setUrlMap(urlMap); + return simpleUrlHandlerMapping; + } - @Bean - public WelcomeController welcome() { - WelcomeController welcome = new WelcomeController(); - return welcome; - } + @Bean + public WelcomeController welcome() { + return new WelcomeController(); + } - @Bean - public ExampleTwoController exampleTwo() { - ExampleTwoController exampleTwo = new ExampleTwoController(); - return exampleTwo; - } } diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/BaeldungController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BaeldungController.java similarity index 83% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/BaeldungController.java rename to spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BaeldungController.java index 9cc55d3554..363fa74b66 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/BaeldungController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BaeldungController.java @@ -1,18 +1,15 @@ -package com.baeldung.controller; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +package com.baeldung.web.controller.handlermapping; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + public class BaeldungController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { - System.out.println("Inside Welcome Baeldung Controller"); - ModelAndView model = new ModelAndView("baeldung"); - return model; } diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/ExampleTwoController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/ExampleTwoController.java deleted file mode 100644 index efdec6408c..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/ExampleTwoController.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.web.controller.handlermapping; - -import org.springframework.stereotype.Controller; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.AbstractController; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@Controller -public class ExampleTwoController extends AbstractController -{ - @Override - protected ModelAndView handleRequestInternal(HttpServletRequest request, - HttpServletResponse response) throws Exception { - System.out.println("Inside ExampleTwo Controller"); - - ModelAndView model = new ModelAndView("exampleTwo"); - - return model; - } -} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/TestController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/TestController.java similarity index 74% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/TestController.java rename to spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/TestController.java index f0d69de8b0..0f94321168 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/Controller/TestController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/TestController.java @@ -1,18 +1,15 @@ -package com.baeldung.controller; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +package com.baeldung.web.controller.handlermapping; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + public class TestController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { - System.out.println("Inside Welcome two Controller"); - - ModelAndView model = new ModelAndView("test"); - + ModelAndView model = new ModelAndView("test"); return model; } diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/WelcomeController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/WelcomeController.java index 396244f01c..1598583127 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/WelcomeController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/WelcomeController.java @@ -8,15 +8,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller -public class WelcomeController extends AbstractController -{ - @Override - protected ModelAndView handleRequestInternal(HttpServletRequest request, - HttpServletResponse response) throws Exception { - System.out.println("Inside BeanNameMappingExampleOne Controller"); +public class WelcomeController extends AbstractController { - ModelAndView model = new ModelAndView("test"); - - return model; + @Override + protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + return new ModelAndView("welcome"); } } \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java index 9cc992bb3c..f2e78c3309 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java @@ -1,10 +1,6 @@ -package come.baeldung.test; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; +package com.baeldung.handlermapping; +import com.baeldung.spring.web.config.BeanNameUrlHandlerMappingConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -17,12 +13,15 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.config.WebAppConfiguration_BeanNameUrlHandlerMapping; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration -@ContextConfiguration(classes = WebAppConfiguration_BeanNameUrlHandlerMapping.class) +@ContextConfiguration(classes = BeanNameUrlHandlerMappingConfig.class) public class BeanNameMappingConfigTest { @Autowired diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java index 24fd865c11..79dd8513a1 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java @@ -1,4 +1,4 @@ -package come.baeldung.test; +package com.baeldung.handlermapping; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -17,11 +17,11 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.config.WebAppConfiguration_ControllerClassNameHandlerMapping; +import com.baeldung.spring.web.config.ControllerClassNameHandlerMappingConfig; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration -@ContextConfiguration(classes = WebAppConfiguration_ControllerClassNameHandlerMapping.class) +@ContextConfiguration(classes = ControllerClassNameHandlerMappingConfig.class) public class ControllerClassNameHandlerMappingTest { @Autowired @@ -36,6 +36,6 @@ public class ControllerClassNameHandlerMappingTest { @Test public void whenControllerClassNameMapping_thenMappedOK() throws Exception { - mockMvc.perform(get("/welcometest")).andExpect(status().isOk()).andExpect(view().name("welcome")).andDo(print()); + mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("welcome")).andDo(print()); } } \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java index cfb51fd5cc..aa48f02c09 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java @@ -1,4 +1,4 @@ -package come.baeldung.test; +package com.baeldung.handlermapping; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -17,11 +17,11 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.config.WebAppConfiguration_ConfiguringPriorities; +import com.baeldung.spring.web.config.HandlerMappingPrioritiesConfig; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration -@ContextConfiguration(classes = WebAppConfiguration_ConfiguringPriorities.class) +@ContextConfiguration(classes = HandlerMappingPrioritiesConfig.class) public class HandlerMappingPriorityConfigTest { @Autowired diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java index 8c9405abfc..847b00323b 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java @@ -1,10 +1,6 @@ -package come.baeldung.test; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; +package com.baeldung.handlermapping; +import com.baeldung.spring.web.config.SimpleUrlHandlerMappingConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -17,11 +13,14 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.config.WebAppConfiguration_SimpleUrlHandlerMapping; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration -@ContextConfiguration(classes = WebAppConfiguration_SimpleUrlHandlerMapping.class) +@ContextConfiguration(classes = SimpleUrlHandlerMappingConfig.class) public class SimpleUrlMappingConfigTest { @Autowired diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/BeanNameMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/BeanNameMappingConfigTest.java deleted file mode 100644 index dc6d861db2..0000000000 --- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/BeanNameMappingConfigTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.web.controller; - -import com.baeldung.spring.web.config.BeanNameHandlerMappingConfig; -import com.baeldung.spring.web.config.SimpleUrlHandlerMappingConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = BeanNameHandlerMappingConfig.class) -public class BeanNameMappingConfigTest { - - @Autowired - private WebApplicationContext webAppContext; - private MockMvc mockMvc; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); - } - - @Test - public void whenBeanNameMapping_thenMappedOK() throws Exception { - mockMvc.perform(get("/welcomeBean")).andExpect(status().isOk()).andExpect(view().name("test")).andDo(print()); - } -} diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/ControllerClassNameHandlerMappingTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/ControllerClassNameHandlerMappingTest.java deleted file mode 100644 index ea6243a1eb..0000000000 --- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/ControllerClassNameHandlerMappingTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.web.controller; - -import com.baeldung.spring.web.config.ControllerClassNameHandlerMappingConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = ControllerClassNameHandlerMappingConfig.class) -public class ControllerClassNameHandlerMappingTest { - - @Autowired - private WebApplicationContext webAppContext; - private MockMvc mockMvc; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); - } - - @Test - public void whenControllerClassNameMapping_thenMappedOK() throws Exception { - mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("test")).andDo(print()); - } -} diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/SimpleUrlMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/SimpleUrlMappingConfigTest.java deleted file mode 100644 index 0f83244738..0000000000 --- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/SimpleUrlMappingConfigTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.web.controller; - -import com.baeldung.spring.web.config.SimpleUrlHandlerMappingConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = SimpleUrlHandlerMappingConfig.class) -public class SimpleUrlMappingConfigTest { - - @Autowired - private WebApplicationContext webAppContext; - private MockMvc mockMvc; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); - } - - @Test - public void whenSimpleUrlMapping_thenMappedOK() throws Exception { - mockMvc.perform(get("/simpleUrlWelcome")).andExpect(status().isOk()).andExpect(view().name("test")).andDo(print()); - } -} diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml b/spring-mvc-java/src/test/resources/BeanNameUrlHandlerMappingConfig.xml similarity index 100% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/BeanNameUrlHandlerMappingConfig.xml rename to spring-mvc-java/src/test/resources/BeanNameUrlHandlerMappingConfig.xml diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml b/spring-mvc-java/src/test/resources/ControllerClassNameHandlerMappingConfig.xml similarity index 100% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/ControllerClassNameHandlerMappingConfig.xml rename to spring-mvc-java/src/test/resources/ControllerClassNameHandlerMappingConfig.xml diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml b/spring-mvc-java/src/test/resources/HandlerMappingConfiguringPriorities.xml similarity index 100% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/HandlerMappingConfiguringPriorities.xml rename to spring-mvc-java/src/test/resources/HandlerMappingConfiguringPriorities.xml diff --git a/spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml b/spring-mvc-java/src/test/resources/SimpleUrlHandlerMappingConfig.xml similarity index 100% rename from spring-mvc-java/src/main/java/com/baeldung/HandlerMapping/config/XML/SimpleUrlHandlerMappingConfig.xml rename to spring-mvc-java/src/test/resources/SimpleUrlHandlerMappingConfig.xml From a9700891ef73683b5e069d318509f9f9b6526938 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Thu, 5 Jan 2017 13:05:51 +0100 Subject: [PATCH 022/120] BAEL-97 - minor fixes --- .../BeanNameUrlHandlerMappingConfig.java | 8 ------ .../HandlerMappingPrioritiesConfig.java | 25 ++++++++----------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java index fe220fee44..081db6c6c3 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java @@ -10,14 +10,6 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration public class BeanNameUrlHandlerMappingConfig { - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/"); - viewResolver.setSuffix(".jsp"); - return viewResolver; - } - @Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { return new BeanNameUrlHandlerMapping(); diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java index 249c816823..07d32d35df 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java @@ -23,12 +23,6 @@ public class HandlerMappingPrioritiesConfig { return beanNameUrlHandlerMapping; } - @Bean("/welcome") - public BaeldungController welcomeBaeldungController() { - BaeldungController baeldungController = new BaeldungController(); - return baeldungController; - } - @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); @@ -39,12 +33,6 @@ public class HandlerMappingPrioritiesConfig { return simpleUrlHandlerMapping; } - @Bean - public TestController test() { - TestController test = new TestController(); - return test; - } - @Bean public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { ControllerClassNameHandlerMapping bean = new ControllerClassNameHandlerMapping(); @@ -52,9 +40,18 @@ public class HandlerMappingPrioritiesConfig { return bean; } + @Bean("/welcome") + public BaeldungController welcomeBaeldungController() { + return new BaeldungController(); + } + + @Bean + public TestController test() { + return new TestController(); + } + @Bean public WelcomeController welcomeController() { - WelcomeController bean = new WelcomeController(); - return bean; + return new WelcomeController(); } } \ No newline at end of file From ba75c373660ac7496fbce1d189fd23f29f3c9ca1 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 5 Jan 2017 15:15:53 +0100 Subject: [PATCH 023/120] Refactor DataLoader --- .../{DataLoader.java => DataLoaderTest.java} | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) rename spring-reactor/src/test/java/com/baeldung/{DataLoader.java => DataLoaderTest.java} (77%) diff --git a/spring-reactor/src/test/java/com/baeldung/DataLoader.java b/spring-reactor/src/test/java/com/baeldung/DataLoaderTest.java similarity index 77% rename from spring-reactor/src/test/java/com/baeldung/DataLoader.java rename to spring-reactor/src/test/java/com/baeldung/DataLoaderTest.java index 2ec3d9e526..56bc18b07f 100644 --- a/spring-reactor/src/test/java/com/baeldung/DataLoader.java +++ b/spring-reactor/src/test/java/com/baeldung/DataLoaderTest.java @@ -6,15 +6,14 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; - @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {Application.class}) -public class DataLoader { +@ContextConfiguration(classes = { Application.class }) +public class DataLoaderTest { - @Test - public void exampleTest() { + @Test + public void exampleTest() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getForObject("http://localhost:8080/startNotification/10", String.class); - } - + } + } From 8f4ef41eb3d53c40c69a77502b5f96df88b59b77 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 5 Jan 2017 18:14:55 +0100 Subject: [PATCH 024/120] Refactor DataLoader --- .../{DataLoaderTest.java => DataLoaderLiveTest.java} | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) rename spring-reactor/src/test/java/com/baeldung/{DataLoaderTest.java => DataLoaderLiveTest.java} (50%) diff --git a/spring-reactor/src/test/java/com/baeldung/DataLoaderTest.java b/spring-reactor/src/test/java/com/baeldung/DataLoaderLiveTest.java similarity index 50% rename from spring-reactor/src/test/java/com/baeldung/DataLoaderTest.java rename to spring-reactor/src/test/java/com/baeldung/DataLoaderLiveTest.java index 56bc18b07f..5833bc277c 100644 --- a/spring-reactor/src/test/java/com/baeldung/DataLoaderTest.java +++ b/spring-reactor/src/test/java/com/baeldung/DataLoaderLiveTest.java @@ -1,14 +1,9 @@ package com.baeldung; import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { Application.class }) -public class DataLoaderTest { +public class DataLoaderLiveTest { @Test public void exampleTest() { From fbb406502478467bedbcb221c52932712795292f Mon Sep 17 00:00:00 2001 From: Danil Kornishev Date: Fri, 6 Jan 2017 09:20:47 -0500 Subject: [PATCH 025/120] Nashorn second Attempt (#923) * Nashorn * Nashorn x2 * Nashorn added trailing newlines * Cleanup * Formatted script lines * Change system outs to asserts * Change Nashorn to be Junit tests * Remove empty test --- .../java/com/baeldung/scripting/Nashorn.java | 48 ------- core-java/src/main/resources/js/bind.js | 15 ++ core-java/src/main/resources/js/locations.js | 1 + .../src/main/resources/js/math_module.js | 19 +++ core-java/src/main/resources/js/no_such.js | 11 ++ core-java/src/main/resources/js/script.js | 1 + core-java/src/main/resources/js/trim.js | 2 + .../src/main/resources/js/typed_arrays.js | 9 ++ .../com/baeldung/scripting/NashornTest.java | 134 ++++++++++++++++++ 9 files changed, 192 insertions(+), 48 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/scripting/Nashorn.java create mode 100644 core-java/src/main/resources/js/bind.js create mode 100644 core-java/src/main/resources/js/locations.js create mode 100644 core-java/src/main/resources/js/math_module.js create mode 100644 core-java/src/main/resources/js/no_such.js create mode 100644 core-java/src/main/resources/js/script.js create mode 100644 core-java/src/main/resources/js/trim.js create mode 100644 core-java/src/main/resources/js/typed_arrays.js create mode 100644 core-java/src/test/java/com/baeldung/scripting/NashornTest.java diff --git a/core-java/src/main/java/com/baeldung/scripting/Nashorn.java b/core-java/src/main/java/com/baeldung/scripting/Nashorn.java deleted file mode 100644 index ba9b778de5..0000000000 --- a/core-java/src/main/java/com/baeldung/scripting/Nashorn.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.scripting; - -import javax.script.Bindings; -import javax.script.Invocable; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; - -public class Nashorn { - public static void main(String[] args) throws ScriptException, NoSuchMethodException { - ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); - - Object result = engine.eval( - "var greeting='hello world';" + - "print(greeting);" + - "greeting"); - - System.out.println(result); - - Bindings bindings = engine.createBindings(); - bindings.put("count", 3); - bindings.put("name", "baeldung"); - - String script = "var greeting='Hello ';" + - "for(var i=count;i>0;i--) { " + - "greeting+=name + ' '" + - "}" + - "greeting"; - - Object bindingsResult = engine.eval(script, bindings); - System.out.println(bindingsResult); - - engine.eval("function composeGreeting(name) {" + - "return 'Hello ' + name" + - "}"); - Invocable invocable = (Invocable) engine; - - Object funcResult = invocable.invokeFunction("composeGreeting", "baeldung"); - System.out.println(funcResult); - - Object map = engine.eval("var HashMap = Java.type('java.util.HashMap');" + - "var map = new HashMap();" + - "map.put('hello', 'world');" + - "map"); - - System.out.println(map); - } -} diff --git a/core-java/src/main/resources/js/bind.js b/core-java/src/main/resources/js/bind.js new file mode 100644 index 0000000000..652e646d0d --- /dev/null +++ b/core-java/src/main/resources/js/bind.js @@ -0,0 +1,15 @@ +var first = { + name: "Whiskey", + age: 5 +}; + +var second = { + volume: 100 +}; + +Object.bindProperties(first, second); + +print(first.volume); + +second.volume = 1000; +print(first.volume); diff --git a/core-java/src/main/resources/js/locations.js b/core-java/src/main/resources/js/locations.js new file mode 100644 index 0000000000..abfc944639 --- /dev/null +++ b/core-java/src/main/resources/js/locations.js @@ -0,0 +1 @@ +print(__FILE__, __LINE__, __DIR__); diff --git a/core-java/src/main/resources/js/math_module.js b/core-java/src/main/resources/js/math_module.js new file mode 100644 index 0000000000..267a100f36 --- /dev/null +++ b/core-java/src/main/resources/js/math_module.js @@ -0,0 +1,19 @@ +var math = { + increment: function (num) { + return ++num; + }, + + failFunc: function () { + try { + throw "BOOM"; + } catch (e if typeof e === 'string') { + print("String thrown: " + e); + } + catch (e) { + print("this shouldn't happen!"); + } + } +}; + + +math; diff --git a/core-java/src/main/resources/js/no_such.js b/core-java/src/main/resources/js/no_such.js new file mode 100644 index 0000000000..43b50c5cad --- /dev/null +++ b/core-java/src/main/resources/js/no_such.js @@ -0,0 +1,11 @@ +var demo = { + __noSuchProperty__: function (propName) { + print("Accessed non-existing property: " + propName); + }, + + __noSuchMethod__: function (methodName) { + print("Invoked non-existing method: " + methodName); + } +}; + +demo; diff --git a/core-java/src/main/resources/js/script.js b/core-java/src/main/resources/js/script.js new file mode 100644 index 0000000000..6f701ed59d --- /dev/null +++ b/core-java/src/main/resources/js/script.js @@ -0,0 +1 @@ +function increment(num) ++num; diff --git a/core-java/src/main/resources/js/trim.js b/core-java/src/main/resources/js/trim.js new file mode 100644 index 0000000000..81be009978 --- /dev/null +++ b/core-java/src/main/resources/js/trim.js @@ -0,0 +1,2 @@ +print(" hello world".trimLeft()); +print("hello world ".trimRight()); diff --git a/core-java/src/main/resources/js/typed_arrays.js b/core-java/src/main/resources/js/typed_arrays.js new file mode 100644 index 0000000000..6899b29373 --- /dev/null +++ b/core-java/src/main/resources/js/typed_arrays.js @@ -0,0 +1,9 @@ +function arrays(arr) { + + var javaIntArray = Java.to(arr, "int[]"); + print(javaIntArray[0]); + print(javaIntArray[1]); + print(javaIntArray[2]); +} + +arrays([100, "1654", true]); diff --git a/core-java/src/test/java/com/baeldung/scripting/NashornTest.java b/core-java/src/test/java/com/baeldung/scripting/NashornTest.java new file mode 100644 index 0000000000..08ecb24100 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/scripting/NashornTest.java @@ -0,0 +1,134 @@ +package com.baeldung.scripting; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.InputStreamReader; +import java.util.List; +import java.util.Map; + +import javax.script.Bindings; +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +public class NashornTest { + + private ScriptEngine engine; + + @Before + public void setUp() { + engine = new ScriptEngineManager().getEngineByName("nashorn"); + } + + @Test + public void trim() throws ScriptException { + engine.eval(new InputStreamReader(NashornTest.class.getResourceAsStream("/js/trim.js"))); + } + + @Test + public void locations() throws ScriptException { + engine.eval(new InputStreamReader(NashornTest.class.getResourceAsStream("/js/locations.js"))); + } + + @Test + public void bindProperties() throws ScriptException { + engine.eval(new InputStreamReader(NashornTest.class.getResourceAsStream("/js/bind.js"))); + } + + @Test + public void magicMethods() throws ScriptException { + engine.eval("var demo = load('classpath:js/no_such.js');" + + "var tmp = demo.doesNotExist;" + + "var none = demo.callNonExistingMethod()"); + } + + @Test + public void typedArrays() throws ScriptException { + engine.eval(new InputStreamReader(NashornTest.class.getResourceAsStream("/js/typed_arrays.js"))); + } + + @Test + public void basicUsage() throws ScriptException { + Object result = engine.eval("var greeting='hello world';" + + "print(greeting);" + + "greeting"); + + Assert.assertEquals("hello world", result); + } + + @Test + public void jsonObjectExample() throws ScriptException { + Object obj = engine.eval("Java.asJSONCompatible({ number: 42, greet: 'hello', primes: [2,3,5,7,11,13] })"); + Map map = (Map) obj; + + Assert.assertEquals("hello", map.get("greet")); + Assert.assertTrue(List.class.isAssignableFrom(map.get("primes").getClass())); + } + + @Test + public void tryCatchGuard() throws ScriptException { + engine.eval("var math = loadWithNewGlobal('classpath:js/math_module.js');" + + "math.failFunc();"); + } + + @Test + public void extensionsExamples() throws ScriptException { + String script = "var list = [1, 2, 3, 4, 5];" + "var result = '';" + + "for each (var i in list) {" + + "result+=i+'-';" + + "};" + + "print(result);"; + engine.eval(script); + } + + @Test + public void bindingsExamples() throws ScriptException { + Bindings bindings = engine.createBindings(); + bindings.put("count", 3); + bindings.put("name", "baeldung"); + + String script = "var greeting='Hello ';" + + "for(var i=count;i>0;i--) { " + + "greeting+=name + ' '" + + "}" + + "greeting"; + + Object bindingsResult = engine.eval(script, bindings); + Assert.assertEquals("Hello baeldung baeldung baeldung ", bindingsResult); + } + + @Test + public void jvmBoundaryExamples() throws ScriptException, NoSuchMethodException { + engine.eval("function composeGreeting(name) {" + + "return 'Hello ' + name" + + "}"); + + Invocable invocable = (Invocable) engine; + + Object funcResult = invocable.invokeFunction("composeGreeting", "baeldung"); + Assert.assertEquals("Hello baeldung", funcResult); + + Object map = engine.eval("var HashMap = Java.type('java.util.HashMap');" + + "var map = new HashMap();" + + "map.put('hello', 'world');" + + "map"); + + Assert.assertTrue(Map.class.isAssignableFrom(map.getClass())); + } + + @Test + public void loadExamples() throws ScriptException { + Object loadResult = engine.eval("load('classpath:js/script.js');" + + "increment(5)"); + + Assert.assertEquals(6.0, loadResult); + + Object math = engine.eval("var math = loadWithNewGlobal('classpath:js/math_module.js');" + + "math.increment(5);"); + + Assert.assertEquals(6.0, math); + } +} From 638b6090f0da5bdc81c705bbfb69fb7fd71e9891 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Fri, 6 Jan 2017 16:43:46 +0100 Subject: [PATCH 026/120] Refactor NashornTest --- .../com/baeldung/scripting/NashornTest.java | 49 +++++-------------- 1 file changed, 13 insertions(+), 36 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/scripting/NashornTest.java b/core-java/src/test/java/com/baeldung/scripting/NashornTest.java index 08ecb24100..f50db3ad7c 100644 --- a/core-java/src/test/java/com/baeldung/scripting/NashornTest.java +++ b/core-java/src/test/java/com/baeldung/scripting/NashornTest.java @@ -4,16 +4,11 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import javax.script.*; import java.io.InputStreamReader; import java.util.List; import java.util.Map; -import javax.script.Bindings; -import javax.script.Invocable; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; - public class NashornTest { private ScriptEngine engine; @@ -40,9 +35,7 @@ public class NashornTest { @Test public void magicMethods() throws ScriptException { - engine.eval("var demo = load('classpath:js/no_such.js');" + - "var tmp = demo.doesNotExist;" + - "var none = demo.callNonExistingMethod()"); + engine.eval("var demo = load('classpath:js/no_such.js');" + "var tmp = demo.doesNotExist;" + "var none = demo.callNonExistingMethod()"); } @Test @@ -52,9 +45,7 @@ public class NashornTest { @Test public void basicUsage() throws ScriptException { - Object result = engine.eval("var greeting='hello world';" + - "print(greeting);" + - "greeting"); + Object result = engine.eval("var greeting='hello world';" + "print(greeting);" + "greeting"); Assert.assertEquals("hello world", result); } @@ -65,22 +56,19 @@ public class NashornTest { Map map = (Map) obj; Assert.assertEquals("hello", map.get("greet")); - Assert.assertTrue(List.class.isAssignableFrom(map.get("primes").getClass())); + Assert.assertTrue(List.class.isAssignableFrom(map + .get("primes") + .getClass())); } @Test public void tryCatchGuard() throws ScriptException { - engine.eval("var math = loadWithNewGlobal('classpath:js/math_module.js');" + - "math.failFunc();"); + engine.eval("var math = loadWithNewGlobal('classpath:js/math_module.js');" + "math.failFunc();"); } @Test public void extensionsExamples() throws ScriptException { - String script = "var list = [1, 2, 3, 4, 5];" + "var result = '';" + - "for each (var i in list) {" + - "result+=i+'-';" + - "};" + - "print(result);"; + String script = "var list = [1, 2, 3, 4, 5];" + "var result = '';" + "for each (var i in list) {" + "result+=i+'-';" + "};" + "print(result);"; engine.eval(script); } @@ -90,11 +78,7 @@ public class NashornTest { bindings.put("count", 3); bindings.put("name", "baeldung"); - String script = "var greeting='Hello ';" + - "for(var i=count;i>0;i--) { " + - "greeting+=name + ' '" + - "}" + - "greeting"; + String script = "var greeting='Hello ';" + "for(var i=count;i>0;i--) { " + "greeting+=name + ' '" + "}" + "greeting"; Object bindingsResult = engine.eval(script, bindings); Assert.assertEquals("Hello baeldung baeldung baeldung ", bindingsResult); @@ -102,32 +86,25 @@ public class NashornTest { @Test public void jvmBoundaryExamples() throws ScriptException, NoSuchMethodException { - engine.eval("function composeGreeting(name) {" + - "return 'Hello ' + name" + - "}"); + engine.eval("function composeGreeting(name) {" + "return 'Hello ' + name" + "}"); Invocable invocable = (Invocable) engine; Object funcResult = invocable.invokeFunction("composeGreeting", "baeldung"); Assert.assertEquals("Hello baeldung", funcResult); - Object map = engine.eval("var HashMap = Java.type('java.util.HashMap');" + - "var map = new HashMap();" + - "map.put('hello', 'world');" + - "map"); + Object map = engine.eval("var HashMap = Java.type('java.util.HashMap');" + "var map = new HashMap();" + "map.put('hello', 'world');" + "map"); Assert.assertTrue(Map.class.isAssignableFrom(map.getClass())); } @Test public void loadExamples() throws ScriptException { - Object loadResult = engine.eval("load('classpath:js/script.js');" + - "increment(5)"); + Object loadResult = engine.eval("load('classpath:js/script.js');" + "increment(5)"); Assert.assertEquals(6.0, loadResult); - Object math = engine.eval("var math = loadWithNewGlobal('classpath:js/math_module.js');" + - "math.increment(5);"); + Object math = engine.eval("var math = loadWithNewGlobal('classpath:js/math_module.js');" + "math.increment(5);"); Assert.assertEquals(6.0, math); } From 89f9f8c6bfe73b4e03edddb33a01bdb97f9ca903 Mon Sep 17 00:00:00 2001 From: Victor Mosin Date: Fri, 6 Jan 2017 18:01:48 +0100 Subject: [PATCH 027/120] BAEL-529 --- .../java/org/baeldung/config/WebConfig.java | 17 ++++++++++ .../controller/GenericEntityController.java | 16 ++++++++++ .../StringToEnumConverterFactory.java | 27 ++++++++++++++++ .../StringToLocalDateTimeConverter.java | 21 +++++++++++++ .../HeaderVersionArgumentResolver.java | 26 ++++++++++++++++ .../org/baeldung/web/resolver/Version.java | 11 +++++++ .../SpringBootApplicationIntegrationTest.java | 31 ++++++++++++++----- 7 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 spring-boot/src/main/java/org/baeldung/config/WebConfig.java create mode 100644 spring-boot/src/main/java/org/baeldung/converter/StringToEnumConverterFactory.java create mode 100644 spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java create mode 100644 spring-boot/src/main/java/org/baeldung/web/resolver/HeaderVersionArgumentResolver.java create mode 100644 spring-boot/src/main/java/org/baeldung/web/resolver/Version.java diff --git a/spring-boot/src/main/java/org/baeldung/config/WebConfig.java b/spring-boot/src/main/java/org/baeldung/config/WebConfig.java new file mode 100644 index 0000000000..4ef407823e --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/config/WebConfig.java @@ -0,0 +1,17 @@ +package org.baeldung.config; + +import org.baeldung.web.resolver.HeaderVersionArgumentResolver; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import java.util.List; + +@Configuration +public class WebConfig extends WebMvcConfigurerAdapter { + + @Override + public void addArgumentResolvers(final List argumentResolvers) { + argumentResolvers.add(new HeaderVersionArgumentResolver()); + } +} diff --git a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java index b6f88e7cd5..9af08f7b28 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java +++ b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java @@ -1,11 +1,15 @@ package org.baeldung.controller; import org.baeldung.domain.GenericEntity; +import org.baeldung.web.resolver.Version; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -35,4 +39,16 @@ public class GenericEntityController { public GenericEntity findById(@PathVariable Long id) { return entityList.stream().filter(entity -> entity.getId().equals(id)).findFirst().get(); } + + @RequestMapping("/entity/findbydate/{date}") + public GenericEntity findByDate(@PathVariable("date") LocalDateTime date) { + return entityList.stream().findFirst().get(); + } + + @RequestMapping("/entity/findbyversion") + public ResponseEntity findByVersion(@Version String version) { + return version != null + ? new ResponseEntity(entityList.stream().findFirst().get(), HttpStatus.OK) + : new ResponseEntity(HttpStatus.NOT_FOUND); + } } diff --git a/spring-boot/src/main/java/org/baeldung/converter/StringToEnumConverterFactory.java b/spring-boot/src/main/java/org/baeldung/converter/StringToEnumConverterFactory.java new file mode 100644 index 0000000000..17c6fd06de --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/converter/StringToEnumConverterFactory.java @@ -0,0 +1,27 @@ +package org.baeldung.converter; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterFactory; +import org.springframework.stereotype.Component; + +@Component +public class StringToEnumConverterFactory implements ConverterFactory { + + private static class StringToEnumConverter implements Converter { + + private Class enumType; + + public StringToEnumConverter(Class enumType) { + this.enumType = enumType; + } + + public T convert(String source) { + return (T) Enum.valueOf(this.enumType, source.trim()); + } + } + + @Override + public Converter getConverter(final Class targetType) { + return new StringToEnumConverter(targetType); + } +} diff --git a/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java b/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java new file mode 100644 index 0000000000..85c86faae1 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java @@ -0,0 +1,21 @@ +package org.baeldung.converter; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +@Component +public class StringToLocalDateTimeConverter implements Converter { + + @Override + public LocalDateTime convert(final String source) { + try { + return LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException("Couldn't parse value"); + } + } +} diff --git a/spring-boot/src/main/java/org/baeldung/web/resolver/HeaderVersionArgumentResolver.java b/spring-boot/src/main/java/org/baeldung/web/resolver/HeaderVersionArgumentResolver.java new file mode 100644 index 0000000000..89a77f38d1 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/web/resolver/HeaderVersionArgumentResolver.java @@ -0,0 +1,26 @@ +package org.baeldung.web.resolver; + +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import javax.servlet.http.HttpServletRequest; + +@Component +public class HeaderVersionArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(final MethodParameter methodParameter) { + return methodParameter.getParameterAnnotation(Version.class) != null; + } + + @Override + public Object resolveArgument(final MethodParameter methodParameter, final ModelAndViewContainer modelAndViewContainer, final NativeWebRequest nativeWebRequest, final WebDataBinderFactory webDataBinderFactory) throws Exception { + HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest(); + + return request.getHeader("Version"); + } +} diff --git a/spring-boot/src/main/java/org/baeldung/web/resolver/Version.java b/spring-boot/src/main/java/org/baeldung/web/resolver/Version.java new file mode 100644 index 0000000000..2a9e6e60b3 --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/web/resolver/Version.java @@ -0,0 +1,11 @@ +package org.baeldung.web.resolver; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface Version { +} diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java index 3c5444942c..7410166f0c 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java @@ -1,7 +1,9 @@ package org.baeldung; -import org.baeldung.domain.GenericEntity; -import org.baeldung.repository.GenericEntityRepository; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,11 +20,6 @@ import org.springframework.web.context.WebApplicationContext; import java.nio.charset.Charset; -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; - @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration @@ -42,4 +39,24 @@ public class SpringBootApplicationIntegrationTest { mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)).andExpect(jsonPath("$", hasSize(4))); } + + @Test + public void givenRequestHasBeenMade_whenMeetsFindByDateOfGivenConditions_thenCorrect() throws Exception { + MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); + + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbydate/{date}", "2011-12-03T10:15:30")) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType(contentType)) + .andExpect(jsonPath("$.id", equalTo(1))); + } + + @Test + public void givenRequestHasBeenMade_whenMeetsFindByVersionOfGivenConditions_thenCorrect() throws Exception { + MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); + + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbyversion").header("Version", "1.0.0")) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType(contentType)) + .andExpect(jsonPath("$.id", equalTo(1))); + } } From 792f4649527ec94d8d237e337679c03a80af366a Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 7 Jan 2017 12:04:35 +0100 Subject: [PATCH 028/120] BAEL-19 add comments to repo links --- kotlin/pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 59f71f91a6..bd58c8d5cd 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -9,17 +9,20 @@ 1.0-SNAPSHOT + org.jetbrains.kotlin kotlin-stdlib 1.0.4 + org.jetbrains.kotlin kotlin-test-junit 1.0.4 test + junit junit From 7b8d1dc6b2365b62e99039ebfde6eb769ab78c82 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 7 Jan 2017 12:10:59 +0100 Subject: [PATCH 029/120] BAEL-19 break long line --- kotlin/src/main/kotlin/com/baeldung/ItemService.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt index 0b1c419ab4..7c4ee5447d 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt +++ b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt @@ -12,7 +12,8 @@ class ItemService { class ItemManager(val categoryId: String, val dbConnection: String) { var email = "" - constructor(categoryId: String, dbConnection: String, email: String) : this(categoryId, dbConnection) { + constructor(categoryId: String, dbConnection: String, email: String) + : this(categoryId, dbConnection) { this.email = email } From 160b9ae6c30cc3f0bac5501c93b66bceb58ae77e Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 7 Jan 2017 12:15:18 +0100 Subject: [PATCH 030/120] BAEL-19 example of override --- kotlin/src/main/kotlin/com/baeldung/Item.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/Item.kt b/kotlin/src/main/kotlin/com/baeldung/Item.kt index 6e552b3a42..e1a5559cd2 100644 --- a/kotlin/src/main/kotlin/com/baeldung/Item.kt +++ b/kotlin/src/main/kotlin/com/baeldung/Item.kt @@ -1,6 +1,14 @@ package com.baeldung -open class Item(val id: String, val name: String = "unknown_name") +open class Item(val id: String, val name: String = "unknown_name") { + open fun getIdOfItem(): String { + return id + } +} -class ItemWithCategory(id: String, name: String, val categoryId: String) : Item(id, name) +class ItemWithCategory(id: String, name: String, val categoryId: String) : Item(id, name) { + override fun getIdOfItem(): String { + return id + name + } +} From dee7d1ab12376bbeba1412ec95cae34dbceee4ff Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 7 Jan 2017 12:25:18 +0100 Subject: [PATCH 031/120] BAEL-19 iterate --- kotlin/src/main/kotlin/com/baeldung/ItemService.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt index 7c4ee5447d..eff9b5f331 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt +++ b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt @@ -31,12 +31,14 @@ class ItemManager(val categoryId: String, val dbConnection: String) { fun main(args: Array) { val numbers = arrayOf("first", "second", "third", "fourth") + var concat = "" for (n in numbers) { - println(n) + concat += n } - for (i in 0..9) { - println(i) + var sum = 0 + for (i in 2..9) { + sum += i } val firstName = "Tom" From f5d8984ff5db6729b35ac5eaf1fa2d8ca53b7284 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 7 Jan 2017 12:29:40 +0100 Subject: [PATCH 032/120] BAEL-19 tempalte example --- kotlin/src/main/kotlin/com/baeldung/ItemService.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt index eff9b5f331..0adc709016 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt +++ b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt @@ -43,7 +43,8 @@ fun main(args: Array) { val firstName = "Tom" val secondName = "Mary" - println("Names: $firstName, $secondName") + val concatOfNames = "$firstName + $secondName" + println("Names: $concatOfNames") val itemManager = ItemManager("cat_id", "db://connection") print("function result: ${itemManager.isFromSpecificCategory("1")}") From 753b309c3ccf576e7b8821fa5cce318a41dc821e Mon Sep 17 00:00:00 2001 From: Victor Mosin Date: Sat, 7 Jan 2017 17:31:53 +0100 Subject: [PATCH 033/120] Added ConverterFactory test --- .../baeldung/controller/GenericEntityController.java | 6 ++++++ .../src/main/java/org/baeldung/domain/Modes.java | 6 ++++++ .../baeldung/SpringBootApplicationIntegrationTest.java | 10 ++++++++++ 3 files changed, 22 insertions(+) create mode 100644 spring-boot/src/main/java/org/baeldung/domain/Modes.java diff --git a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java index 9af08f7b28..c8649e0d3e 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java +++ b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java @@ -1,6 +1,7 @@ package org.baeldung.controller; import org.baeldung.domain.GenericEntity; +import org.baeldung.domain.Modes; import org.baeldung.web.resolver.Version; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -45,6 +46,11 @@ public class GenericEntityController { return entityList.stream().findFirst().get(); } + @RequestMapping("/entity/findbymode/{mode}") + public GenericEntity findByEnum(@PathVariable("mode") Modes mode) { + return entityList.stream().findFirst().get(); + } + @RequestMapping("/entity/findbyversion") public ResponseEntity findByVersion(@Version String version) { return version != null diff --git a/spring-boot/src/main/java/org/baeldung/domain/Modes.java b/spring-boot/src/main/java/org/baeldung/domain/Modes.java new file mode 100644 index 0000000000..41b1fa0d4e --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/domain/Modes.java @@ -0,0 +1,6 @@ +package org.baeldung.domain; + +public enum Modes { + + Alpha, Beta; +} diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java index 7410166f0c..94623d3cdd 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java @@ -50,6 +50,16 @@ public class SpringBootApplicationIntegrationTest { .andExpect(jsonPath("$.id", equalTo(1))); } + @Test + public void givenRequestHasBeenMade_whenMeetsFindByModeOfGivenConditions_thenCorrect() throws Exception { + MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); + + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", "Alpha")) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType(contentType)) + .andExpect(jsonPath("$.id", equalTo(1))); + } + @Test public void givenRequestHasBeenMade_whenMeetsFindByVersionOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); From 3253a2510cf81a3e051dca0458691b4bdc629d44 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sat, 7 Jan 2017 18:10:25 +0100 Subject: [PATCH 034/120] Refactor JacksonAnnotationTest --- .../jackson/test/JacksonAnnotationTest.java | 66 +++++++------------ 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java index d854d89b5f..091558a5e1 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java @@ -1,32 +1,6 @@ package com.baeldung.jackson.test; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; - -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -import org.junit.Test; - -import com.baeldung.jackson.annotation.BeanWithCreator; -import com.baeldung.jackson.annotation.BeanWithCustomAnnotation; -import com.baeldung.jackson.annotation.BeanWithFilter; -import com.baeldung.jackson.annotation.BeanWithGetter; -import com.baeldung.jackson.annotation.BeanWithIgnore; -import com.baeldung.jackson.annotation.BeanWithInject; -import com.baeldung.jackson.annotation.ExtendableBean; -import com.baeldung.jackson.annotation.MyBean; -import com.baeldung.jackson.annotation.PrivateBean; -import com.baeldung.jackson.annotation.RawBean; -import com.baeldung.jackson.annotation.UnwrappedUser; -import com.baeldung.jackson.annotation.UserWithIgnoreType; -import com.baeldung.jackson.annotation.Zoo; +import com.baeldung.jackson.annotation.*; import com.baeldung.jackson.bidirection.ItemWithIdentity; import com.baeldung.jackson.bidirection.ItemWithRef; import com.baeldung.jackson.bidirection.UserWithIdentity; @@ -38,7 +12,6 @@ import com.baeldung.jackson.dtos.withEnum.TypeEnumWithValue; import com.baeldung.jackson.exception.UserWithRoot; import com.baeldung.jackson.jsonview.Item; import com.baeldung.jackson.jsonview.Views; -import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.InjectableValues; import com.fasterxml.jackson.databind.MapperFeature; @@ -47,6 +20,17 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; +import org.junit.Test; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; public class JacksonAnnotationTest { @@ -101,7 +85,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonValue_thenCorrect() throws JsonParseException, IOException { + public void whenSerializingUsingJsonValue_thenCorrect() throws IOException { final String enumAsString = new ObjectMapper().writeValueAsString(TypeEnumWithValue.TYPE1); assertThat(enumAsString, is("\"Type A\"")); @@ -122,7 +106,7 @@ public class JacksonAnnotationTest { // ========================= Deserializing annotations ============================ @Test - public void whenDeserializingUsingJsonCreator_thenCorrect() throws JsonProcessingException, IOException { + public void whenDeserializingUsingJsonCreator_thenCorrect() throws IOException { final String json = "{\"id\":1,\"theName\":\"My bean\"}"; final BeanWithCreator bean = new ObjectMapper().readerFor(BeanWithCreator.class).readValue(json); @@ -130,7 +114,7 @@ public class JacksonAnnotationTest { } @Test - public void whenDeserializingUsingJsonInject_thenCorrect() throws JsonProcessingException, IOException { + public void whenDeserializingUsingJsonInject_thenCorrect() throws IOException { final String json = "{\"name\":\"My bean\"}"; final InjectableValues inject = new InjectableValues.Std().addValue(int.class, 1); @@ -140,7 +124,7 @@ public class JacksonAnnotationTest { } @Test - public void whenDeserializingUsingJsonAnySetter_thenCorrect() throws JsonProcessingException, IOException { + public void whenDeserializingUsingJsonAnySetter_thenCorrect() throws IOException { final String json = "{\"name\":\"My bean\",\"attr2\":\"val2\",\"attr1\":\"val1\"}"; final ExtendableBean bean = new ObjectMapper().readerFor(ExtendableBean.class).readValue(json); @@ -149,7 +133,7 @@ public class JacksonAnnotationTest { } @Test - public void whenDeserializingUsingJsonSetter_thenCorrect() throws JsonProcessingException, IOException { + public void whenDeserializingUsingJsonSetter_thenCorrect() throws IOException { final String json = "{\"id\":1,\"name\":\"My bean\"}"; final BeanWithGetter bean = new ObjectMapper().readerFor(BeanWithGetter.class).readValue(json); @@ -157,7 +141,7 @@ public class JacksonAnnotationTest { } @Test - public void whenDeserializingUsingJsonDeserialize_thenCorrect() throws JsonProcessingException, IOException { + public void whenDeserializingUsingJsonDeserialize_thenCorrect() throws IOException { final String json = "{\"name\":\"party\",\"eventDate\":\"20-12-2014 02:30:00\"}"; final SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); @@ -169,7 +153,7 @@ public class JacksonAnnotationTest { // ========================= Inclusion annotations ============================ @Test - public void whenSerializingUsingJsonIgnoreProperties_thenCorrect() throws JsonProcessingException, IOException { + public void whenSerializingUsingJsonIgnoreProperties_thenCorrect() throws IOException { final BeanWithIgnore bean = new BeanWithIgnore(1, "My bean"); final String result = new ObjectMapper().writeValueAsString(bean); @@ -178,7 +162,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonIgnore_thenCorrect() throws JsonProcessingException, IOException { + public void whenSerializingUsingJsonIgnore_thenCorrect() throws IOException { final BeanWithIgnore bean = new BeanWithIgnore(1, "My bean"); final String result = new ObjectMapper().writeValueAsString(bean); @@ -199,7 +183,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonInclude_thenCorrect() throws JsonProcessingException, IOException { + public void whenSerializingUsingJsonInclude_thenCorrect() throws IOException { final MyBean bean = new MyBean(1, null); final String result = new ObjectMapper().writeValueAsString(bean); @@ -208,7 +192,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonAutoDetect_thenCorrect() throws JsonProcessingException, IOException { + public void whenSerializingUsingJsonAutoDetect_thenCorrect() throws IOException { final PrivateBean bean = new PrivateBean(1, "My bean"); final String result = new ObjectMapper().writeValueAsString(bean); @@ -219,7 +203,7 @@ public class JacksonAnnotationTest { // ========================= Polymorphic annotations ============================ @Test - public void whenSerializingPolymorphic_thenCorrect() throws JsonProcessingException, IOException { + public void whenSerializingPolymorphic_thenCorrect() throws IOException { final Zoo.Dog dog = new Zoo.Dog("lacy"); final Zoo zoo = new Zoo(dog); @@ -230,7 +214,7 @@ public class JacksonAnnotationTest { } @Test - public void whenDeserializingPolymorphic_thenCorrect() throws JsonProcessingException, IOException { + public void whenDeserializingPolymorphic_thenCorrect() throws IOException { final String json = "{\"animal\":{\"name\":\"lacy\",\"type\":\"cat\"}}"; final Zoo zoo = new ObjectMapper().readerFor(Zoo.class).readValue(json); @@ -352,7 +336,7 @@ public class JacksonAnnotationTest { } @Test - public void whenDisablingAllAnnotations_thenAllDisabled() throws JsonProcessingException, IOException { + public void whenDisablingAllAnnotations_thenAllDisabled() throws IOException { final MyBean bean = new MyBean(1, null); final ObjectMapper mapper = new ObjectMapper(); From b58cc8cd5124755ede6241985efa00964a26bfd7 Mon Sep 17 00:00:00 2001 From: lor6 Date: Sun, 8 Jan 2017 05:41:52 +0200 Subject: [PATCH 035/120] spring performance monitoring interceptors (#965) --- aspectj/pom.xml | 32 +++++++++++- .../performancemonitor/AopConfiguration.java | 52 +++++++++++++++++++ .../MyPerformanceMonitorInterceptor.java | 42 +++++++++++++++ .../performancemonitor/PerfomanceApp.java | 16 ++++++ .../baeldung/performancemonitor/Person.java | 13 +++++ aspectj/src/main/resources/log4j.properties | 10 ++++ 6 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java create mode 100644 aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java create mode 100644 aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java create mode 100644 aspectj/src/main/java/com/baeldung/performancemonitor/Person.java create mode 100644 aspectj/src/main/resources/log4j.properties diff --git a/aspectj/pom.xml b/aspectj/pom.xml index 2fca4031fb..6e7ef1b961 100644 --- a/aspectj/pom.xml +++ b/aspectj/pom.xml @@ -44,7 +44,37 @@ junit ${junit.version} - + + + org.springframework + spring-context + 4.3.4.RELEASE + + + org.springframework + spring-beans + 4.3.4.RELEASE + + + org.springframework + spring-core + 4.3.4.RELEASE + + + cglib + cglib + 3.2.4 + + + org.springframework + spring-aop + 4.3.4.RELEASE + + + log4j + log4j + 1.2.17 + diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java b/aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java new file mode 100644 index 0000000000..3ebe9a7fd8 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java @@ -0,0 +1,52 @@ +package com.baeldung.performancemonitor; + +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.aop.Advisor; +import org.springframework.aop.aspectj.AspectJExpressionPointcut; +import org.springframework.aop.interceptor.PerformanceMonitorInterceptor; +import org.springframework.aop.support.DefaultPointcutAdvisor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +@Configuration +@EnableAspectJAutoProxy +public class AopConfiguration { + + @Pointcut("execution(public int com.baeldung.performancemonitor.Person.getAge())") + public void monitor() { } + + @Pointcut("execution(public void com.baeldung.performancemonitor.Person.setAge(int))") + public void myMonitor() { } + + @Bean + public PerformanceMonitorInterceptor performanceMonitorInterceptor() { + return new PerformanceMonitorInterceptor(true); + } + + @Bean + public Advisor performanceMonitorAdvisor() { + AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); + pointcut.setExpression("com.baeldung.performancemonitor.AopConfiguration.monitor()"); + return new DefaultPointcutAdvisor(pointcut, performanceMonitorInterceptor()); + } + + @Bean + public Person person(){ + return new Person(); + } + + @Bean + public MyPerformanceMonitorInterceptor myPerformanceMonitorInterceptor() { + return new MyPerformanceMonitorInterceptor(true); + } + + @Bean + public Advisor myPerformanceMonitorAdvisor() { + AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); + pointcut.setExpression("com.baeldung.performancemonitor.AopConfiguration.myMonitor()"); + return new DefaultPointcutAdvisor(pointcut, myPerformanceMonitorInterceptor()); + } + +} diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java b/aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java new file mode 100644 index 0000000000..c036359851 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java @@ -0,0 +1,42 @@ +package com.baeldung.performancemonitor; + +import java.util.Date; + +import org.aopalliance.intercept.MethodInvocation; +import org.apache.commons.logging.Log; +import org.apache.log4j.Logger; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.aop.interceptor.AbstractMonitoringInterceptor; +import org.springframework.util.StopWatch; + +public class MyPerformanceMonitorInterceptor extends AbstractMonitoringInterceptor { + + public MyPerformanceMonitorInterceptor() { + } + + public MyPerformanceMonitorInterceptor(boolean useDynamicLogger) { + setUseDynamicLogger(useDynamicLogger); + } + + @Override + protected Object invokeUnderTrace(MethodInvocation invocation, Log log) throws Throwable { + + String name = createInvocationTraceName(invocation); + long start = System.currentTimeMillis(); + log.info("Method "+name+" execution started at:"+new Date()); + try { + return invocation.proceed(); + } + finally { + long end = System.currentTimeMillis(); + long time = end - start; + log.info("Method "+name+" execution lasted:"+time+" ms"); + log.info("Method "+name+" execution ended at:"+new Date()); + + if (time > 10){ + log.warn("Method execution longer than 10 ms!"); + } + + } + } +} diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java b/aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java new file mode 100644 index 0000000000..62b8287649 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java @@ -0,0 +1,16 @@ +package com.baeldung.performancemonitor; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +public class PerfomanceApp { + public static void main(String[] args) { + + ApplicationContext context = new AnnotationConfigApplicationContext(AopConfiguration.class); + Person person = (Person) context.getBean("person"); + + person.setAge(20); + System.out.println("Age is:"+person.getAge()); + + } +} diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/Person.java b/aspectj/src/main/java/com/baeldung/performancemonitor/Person.java new file mode 100644 index 0000000000..02c779e6fa --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/Person.java @@ -0,0 +1,13 @@ +package com.baeldung.performancemonitor; + +public class Person { + private int age; + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } +} diff --git a/aspectj/src/main/resources/log4j.properties b/aspectj/src/main/resources/log4j.properties new file mode 100644 index 0000000000..9e2afcd5b0 --- /dev/null +++ b/aspectj/src/main/resources/log4j.properties @@ -0,0 +1,10 @@ +log4j.rootLogger=TRACE, stdout + +# Redirect log messages to console +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE, stdout +log4j.logger.com.baeldung.performancemonitor.MyPerformanceMonitorInterceptor=INFO, stdout \ No newline at end of file From 6d72f54a53bbb4f763cd83cfe17aefa0c4f2f1dc Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 8 Jan 2017 08:16:35 +0100 Subject: [PATCH 036/120] Refactor JacksonAnnotationTest --- .../jackson/test/JacksonAnnotationTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java index 091558a5e1..f2464d4251 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java @@ -85,7 +85,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonValue_thenCorrect() throws IOException { + public void whenSerializingUsingJsonValue_thenCorrect() throws JsonProcessingException { final String enumAsString = new ObjectMapper().writeValueAsString(TypeEnumWithValue.TYPE1); assertThat(enumAsString, is("\"Type A\"")); @@ -153,7 +153,7 @@ public class JacksonAnnotationTest { // ========================= Inclusion annotations ============================ @Test - public void whenSerializingUsingJsonIgnoreProperties_thenCorrect() throws IOException { + public void whenSerializingUsingJsonIgnoreProperties_thenCorrect() throws JsonProcessingException { final BeanWithIgnore bean = new BeanWithIgnore(1, "My bean"); final String result = new ObjectMapper().writeValueAsString(bean); @@ -162,7 +162,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonIgnore_thenCorrect() throws IOException { + public void whenSerializingUsingJsonIgnore_thenCorrect() throws JsonProcessingException { final BeanWithIgnore bean = new BeanWithIgnore(1, "My bean"); final String result = new ObjectMapper().writeValueAsString(bean); @@ -183,7 +183,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonInclude_thenCorrect() throws IOException { + public void whenSerializingUsingJsonInclude_thenCorrect() throws JsonProcessingException { final MyBean bean = new MyBean(1, null); final String result = new ObjectMapper().writeValueAsString(bean); @@ -192,7 +192,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonAutoDetect_thenCorrect() throws IOException { + public void whenSerializingUsingJsonAutoDetect_thenCorrect() throws JsonProcessingException { final PrivateBean bean = new PrivateBean(1, "My bean"); final String result = new ObjectMapper().writeValueAsString(bean); @@ -203,7 +203,7 @@ public class JacksonAnnotationTest { // ========================= Polymorphic annotations ============================ @Test - public void whenSerializingPolymorphic_thenCorrect() throws IOException { + public void whenSerializingPolymorphic_thenCorrect() throws JsonProcessingException { final Zoo.Dog dog = new Zoo.Dog("lacy"); final Zoo zoo = new Zoo(dog); @@ -260,7 +260,7 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonView_thenCorrect() throws JsonProcessingException { + public void whenSerializingUsingJsonView_thenCorrect() throws JsonProcessingException, JsonProcessingException { final Item item = new Item(2, "book", "John"); final String result = new ObjectMapper().writerWithView(Views.Public.class).writeValueAsString(item); @@ -336,7 +336,7 @@ public class JacksonAnnotationTest { } @Test - public void whenDisablingAllAnnotations_thenAllDisabled() throws IOException { + public void whenDisablingAllAnnotations_thenAllDisabled() throws JsonProcessingException { final MyBean bean = new MyBean(1, null); final ObjectMapper mapper = new ObjectMapper(); From 8dc3487b6749a49efaaeff3d7a21ad36c768f8ce Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sun, 8 Jan 2017 13:25:59 +0600 Subject: [PATCH 037/120] Added relevant articles (#962) * Added relevant articles * Added relevant articles * Created README.md and added relevant articles * Added relevant articles * Created README.md and added relevant articles * Added relevant articles * Added relevant articles * Added relevnat articles * Added relevant articles * Added relevant articles * Added relevant articles * Added relevant articles * Added relevant articles * Added relevant articles * Created README.md and added relevant articles * Update README.md * Added relevant articles * Created README.md and added relevant articles * Added relevant articles * Update README.md * Added relevant articles * Added relevant articles * Created README.md and added relevant articles * Created README.md and added relevant articles * Added relevant articles * Added relevant articles * Added relevant articles * Added relevant articles * Update README.md --- apache-poi/README.md | 2 ++ aspectj/README.md | 2 ++ core-java/README.md | 7 +++++++ core-java/src/test/java/com/baeldung/java/map/README.md | 2 ++ core-java/src/test/java/com/baeldung/java/nio2/README.md | 8 ++++++++ .../src/test/java/com/baeldung/java8/optional/README.md | 2 ++ .../src/test/java/org/baeldung/java/collections/README.md | 2 ++ image-processing/README.md | 2 ++ jackson/README.md | 1 + javaslang/README.md | 2 ++ jaxb/README.md | 2 ++ log-mdc/README.md | 1 + spring-apache-camel/README.md | 1 + spring-boot/README.MD | 1 + .../test/java/com/baeldung/applicationcontext/README.md | 3 +++ spring-integration/README.md | 2 ++ spring-jpa/README.md | 1 + spring-mvc-java/README.md | 1 + spring-rest/README.md | 1 + spring-security-core/README.md | 3 +++ spring-security-rest/README.md | 1 + 21 files changed, 47 insertions(+) create mode 100644 apache-poi/README.md create mode 100644 aspectj/README.md create mode 100644 core-java/src/test/java/com/baeldung/java/map/README.md create mode 100644 core-java/src/test/java/com/baeldung/java8/optional/README.md create mode 100644 core-java/src/test/java/org/baeldung/java/collections/README.md create mode 100644 image-processing/README.md create mode 100644 javaslang/README.md create mode 100644 jaxb/README.md create mode 100644 spring-core/src/test/java/com/baeldung/applicationcontext/README.md create mode 100644 spring-integration/README.md diff --git a/apache-poi/README.md b/apache-poi/README.md new file mode 100644 index 0000000000..cef6810c97 --- /dev/null +++ b/apache-poi/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Microsoft Word Processing in Java with Apache POI](http://www.baeldung.com/java-microsoft-word-with-apache-poi) diff --git a/aspectj/README.md b/aspectj/README.md new file mode 100644 index 0000000000..9793b742fa --- /dev/null +++ b/aspectj/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Intro to AspectJ](http://www.baeldung.com/aspectj) diff --git a/core-java/README.md b/core-java/README.md index 3abe1ba808..16cac81526 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -46,3 +46,10 @@ - [Grep in Java](http://www.baeldung.com/grep-in-java) - [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections) - [Simulated Annealing for Travelling Salesman Problem](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) +- [Slope One Algorithm: Collaborative Filtering Recommendation Systems](http://www.baeldung.com/java-collaborative-filtering-recommendations) +- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](http://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) +- [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java) +- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) +- [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size) +- [The Basics of Java Generics](http://www.baeldung.com/java-generics) +- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) diff --git a/core-java/src/test/java/com/baeldung/java/map/README.md b/core-java/src/test/java/com/baeldung/java/map/README.md new file mode 100644 index 0000000000..0bba153763 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/map/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap) diff --git a/core-java/src/test/java/com/baeldung/java/nio2/README.md b/core-java/src/test/java/com/baeldung/java/nio2/README.md index 65584f93b8..569be82d27 100644 --- a/core-java/src/test/java/com/baeldung/java/nio2/README.md +++ b/core-java/src/test/java/com/baeldung/java/nio2/README.md @@ -1,3 +1,11 @@ ### Relevant Articles: - [Introduction to the Java NIO2 File API](http://www.baeldung.com/java-nio-2-file-api) - [Java NIO2 Path API](http://www.baeldung.com/java-nio-2-path) +- [A Guide To NIO2 Asynchronous File Channel](http://www.baeldung.com/java-nio2-async-file-channel) +- [Guide to Selenium with JUnit / TestNG](http://www.baeldung.com/java-selenium-with-junit-and-testng) +- [A Guide to NIO2 Asynchronous Socket Channel](http://www.baeldung.com/java-nio2-async-socket-channel) +- [A Guide To NIO2 FileVisitor](http://www.baeldung.com/java-nio2-file-visitor) +- [A Guide To NIO2 File Attribute APIs](http://www.baeldung.com/java-nio2-file-attribute) +- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) +- [A Guide to WatchService in Java NIO2](http://www.baeldung.com/java-nio2-watchservice) +- [Guide to Java NIO2 Asynchronous Channel APIs](http://www.baeldung.com/java-nio-2-async-channels) diff --git a/core-java/src/test/java/com/baeldung/java8/optional/README.md b/core-java/src/test/java/com/baeldung/java8/optional/README.md new file mode 100644 index 0000000000..129131ae45 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/optional/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide To Java 8 Optional](http://www.baeldung.com/java-optional) diff --git a/core-java/src/test/java/org/baeldung/java/collections/README.md b/core-java/src/test/java/org/baeldung/java/collections/README.md new file mode 100644 index 0000000000..50748cbf81 --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/collections/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) diff --git a/image-processing/README.md b/image-processing/README.md new file mode 100644 index 0000000000..48604bdb1f --- /dev/null +++ b/image-processing/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Working with Images in Java](http://www.baeldung.com/java-images) diff --git a/jackson/README.md b/jackson/README.md index f48a7dc8ab..67a03589a8 100644 --- a/jackson/README.md +++ b/jackson/README.md @@ -24,3 +24,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [XML Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-xml-serialization-and-deserialization) - [More Jackson Annotations](http://www.baeldung.com/jackson-advanced-annotations) - [Inheritance with Jackson](http://www.baeldung.com/jackson-inheritance) +- [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat) diff --git a/javaslang/README.md b/javaslang/README.md new file mode 100644 index 0000000000..334ac02f60 --- /dev/null +++ b/javaslang/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to Javaslang](http://www.baeldung.com/javaslang) diff --git a/jaxb/README.md b/jaxb/README.md new file mode 100644 index 0000000000..4b603fca00 --- /dev/null +++ b/jaxb/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to JAXB](http://www.baeldung.com/jaxb) diff --git a/log-mdc/README.md b/log-mdc/README.md index e69507ae4d..be0b2670c3 100644 --- a/log-mdc/README.md +++ b/log-mdc/README.md @@ -1,6 +1,7 @@ ### Relevant Articles: - TBD - [Improved Java Logging with Mapped Diagnostic Context (MDC)](http://www.baeldung.com/mdc-in-log4j-2-logback) +- [Java Logging with Nested Diagnostic Context (NDC)](http://www.baeldung.com/java-logging-ndc-log4j) ### References diff --git a/spring-apache-camel/README.md b/spring-apache-camel/README.md index ab7cf5c575..e72e18b198 100644 --- a/spring-apache-camel/README.md +++ b/spring-apache-camel/README.md @@ -9,6 +9,7 @@ This article will demonstrate how to configure and use Apache Camel with Spring
  • Apache Camel
  • Enterprise Integration Patterns
  • Introduction To Apache Camel
  • +
  • Integration Patterns With Apache Camel
  • Framework Versions:

    diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 19203d2b8d..05173ef318 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -6,3 +6,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters) - [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) - [Introduction to WebJars](http://www.baeldung.com/maven-webjars) +- [Create a Fat Jar App with Spring Boot](http://www.baeldung.com/deployable-fat-jar-spring-boot) diff --git a/spring-core/src/test/java/com/baeldung/applicationcontext/README.md b/spring-core/src/test/java/com/baeldung/applicationcontext/README.md new file mode 100644 index 0000000000..211007e0cf --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/applicationcontext/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) +- [Intro to the Spring ClassPathXmlApplicationContext](http://www.baeldung.com/spring-classpathxmlapplicationcontext) diff --git a/spring-integration/README.md b/spring-integration/README.md new file mode 100644 index 0000000000..e5b0f601ce --- /dev/null +++ b/spring-integration/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to Spring Integration](http://www.baeldung.com/spring-integration) diff --git a/spring-jpa/README.md b/spring-jpa/README.md index 30b39e1a4e..313865e3f8 100644 --- a/spring-jpa/README.md +++ b/spring-jpa/README.md @@ -12,6 +12,7 @@ - [Spring JPA – Multiple Databases](http://www.baeldung.com/spring-data-jpa-multiple-databases) - [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache) - [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource) +- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index 3da7b42fa3..0f267c5ec9 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -17,3 +17,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [File Upload with Spring MVC](http://www.baeldung.com/spring-file-upload) - [Spring MVC Content Negotiation](http://www.baeldung.com/spring-mvc-content-negotiation-json-xml) - [Circular Dependencies in Spring](http://www.baeldung.com/circular-dependencies-in-spring) +- [Introduction to HtmlUnit](http://www.baeldung.com/htmlunit) diff --git a/spring-rest/README.md b/spring-rest/README.md index 3331b9c69f..85f0e13732 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -12,3 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Binary Data Formats in a Spring REST API](http://www.baeldung.com/spring-rest-api-with-binary-data-formats) - [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) diff --git a/spring-security-core/README.md b/spring-security-core/README.md index c7e0f645c7..0eb506e865 100644 --- a/spring-security-core/README.md +++ b/spring-security-core/README.md @@ -5,3 +5,6 @@ ``` mvn clean install ``` + +### Relevant Articles: +- [Intro to @PreFilter and @PostFilter in Spring Security](http://www.baeldung.com/spring-security-prefilter-postfilter) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index bea417a800..a1dfa32c6d 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -12,3 +12,4 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) - [Custom Error Message Handling for REST API](http://www.baeldung.com/global-error-handler-in-a-spring-rest-api) - [An Intro to Spring HATEOAS](http://www.baeldung.com/spring-hateoas-tutorial) +- [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation) From e8a9b608621fb8b18037dec42075e42e0761d543 Mon Sep 17 00:00:00 2001 From: tristanzhou Date: Sun, 8 Jan 2017 23:21:03 +1300 Subject: [PATCH 038/120] Introduction to pmd (#972) * initial check for introduction to pmd * change name to static-analysis * move it to static-analysis --- static-analysis/pom.xml | 30 +++++++++++++++ .../src/main/java/com/baeldung/pmd/Cnt.java | 12 ++++++ .../src/main/resources/customruleset.xml | 37 +++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 static-analysis/pom.xml create mode 100644 static-analysis/src/main/java/com/baeldung/pmd/Cnt.java create mode 100644 static-analysis/src/main/resources/customruleset.xml diff --git a/static-analysis/pom.xml b/static-analysis/pom.xml new file mode 100644 index 0000000000..737816ec10 --- /dev/null +++ b/static-analysis/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.baeldung + static-analysis + 1.0-SNAPSHOT + + + + + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.7 + + + rulesets/java/braces.xml + rulesets/java/naming.xml + + + + + + + \ No newline at end of file diff --git a/static-analysis/src/main/java/com/baeldung/pmd/Cnt.java b/static-analysis/src/main/java/com/baeldung/pmd/Cnt.java new file mode 100644 index 0000000000..4953646c9d --- /dev/null +++ b/static-analysis/src/main/java/com/baeldung/pmd/Cnt.java @@ -0,0 +1,12 @@ +package com.baeldung.pmd; + +public class Cnt { + + public int d(int a, int b) { + if (b == 0) + return Integer.MAX_VALUE; + else + return a / b; + } + +} diff --git a/static-analysis/src/main/resources/customruleset.xml b/static-analysis/src/main/resources/customruleset.xml new file mode 100644 index 0000000000..e0a009dd4a --- /dev/null +++ b/static-analysis/src/main/resources/customruleset.xml @@ -0,0 +1,37 @@ + + + + + This ruleset checks my code for bad stuff + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + \ No newline at end of file From 82fc8cf8fcc2e0dfc2ed29488ec3522d81bfee39 Mon Sep 17 00:00:00 2001 From: Sunil Mogadati Date: Sun, 8 Jan 2017 07:13:39 -0700 Subject: [PATCH 039/120] BAEL-245: Add Enum serialization example (#970) * Add NDC and JBoss Logging to the demo application * NDC for Log4j, Log4j2 and JBoss Logging * Simplify NDC example by making it a single operation instead of two * Make NDC example as RestController, Use JBoss Logging only as a logging bridge * Fix merge conflicts in pull request - log-mdc pom.xml updated * BAEL-445 Update to Spring security SpEL example * BAEL-445: Change tabs to spaces in the updated code * BAEL-245: Add Enum Serialization exmaple * BAEL-245: Remove the folder jackson/src/test/java/com/baeldung/jackson/dtos/withEnum as the example is not used anymore --- .../com/baeldung/jackson/enums/Distance.java | 54 ++++++++++++++++++ .../serialization/DistanceSerializer.java | 33 +++++++++++ .../jackson/dtos/withEnum/MyDtoWithEnum.java | 57 ------------------- .../dtos/withEnum/MyDtoWithEnumCustom.java | 57 ------------------- .../jackson/dtos/withEnum/TypeEnum.java | 35 ------------ .../jackson/dtos/withEnum/TypeEnumSimple.java | 32 ----------- .../TypeEnumWithCustomSerializer.java | 35 ------------ .../dtos/withEnum/TypeEnumWithValue.java | 36 ------------ .../jackson/dtos/withEnum/TypeSerializer.java | 32 ----------- .../enums/JacksonEnumSerializationTest.java | 22 +++++++ 10 files changed, 109 insertions(+), 284 deletions(-) create mode 100644 jackson/src/main/java/com/baeldung/jackson/enums/Distance.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java delete mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java diff --git a/jackson/src/main/java/com/baeldung/jackson/enums/Distance.java b/jackson/src/main/java/com/baeldung/jackson/enums/Distance.java new file mode 100644 index 0000000000..8026eedc44 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/enums/Distance.java @@ -0,0 +1,54 @@ +package com.baeldung.jackson.enums; + +import com.baeldung.jackson.serialization.DistanceSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +/** + * Use @JsonFormat to handle representation of Enum as JSON (available since Jackson 2.1.2) + * Use @JsonSerialize to configure a custom Jackson serializer + */ +// @JsonFormat(shape = JsonFormat.Shape.OBJECT) +@JsonSerialize(using = DistanceSerializer.class) +public enum Distance { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private Distance(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + /** + * Use @JsonValue to control marshalling output for an enum + */ + // @JsonValue + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + /** + * Usage example: Distance.MILE.convertFromMeters(1205.5); + */ + public double convertFromMeters(double distanceInMeters) { + return distanceInMeters / meters; + + } + + /** + * Usage example: Distance.MILE.convertToMeters(0.5); + */ + public double convertToMeters(double distanceInMeters) { + return distanceInMeters * meters; + } + +} \ No newline at end of file diff --git a/jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java b/jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java new file mode 100644 index 0000000000..ca013ff921 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/serialization/DistanceSerializer.java @@ -0,0 +1,33 @@ +package com.baeldung.jackson.serialization; + +import java.io.IOException; + +import com.baeldung.jackson.enums.Distance; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class DistanceSerializer extends StdSerializer { + + private static final long serialVersionUID = 1376504304439963619L; + + public DistanceSerializer() { + super(Distance.class); + } + + public DistanceSerializer(Class t) { + super(t); + } + + public void serialize(Distance distance, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException { + generator.writeStartObject(); + generator.writeFieldName("name"); + generator.writeNumber(distance.name()); + generator.writeFieldName("unit"); + generator.writeString(distance.getUnit()); + generator.writeFieldName("meters"); + generator.writeNumber(distance.getMeters()); + generator.writeEndObject(); + } +} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java deleted file mode 100644 index 258eb6febd..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnum.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -public class MyDtoWithEnum { - - private String stringValue; - private int intValue; - private boolean booleanValue; - private TypeEnum type; - - public MyDtoWithEnum() { - super(); - } - - public MyDtoWithEnum(final String stringValue, final int intValue, final boolean booleanValue, final TypeEnum type) { - super(); - - this.stringValue = stringValue; - this.intValue = intValue; - this.booleanValue = booleanValue; - this.type = type; - } - - // API - - public String getStringValue() { - return stringValue; - } - - public void setStringValue(final String stringValue) { - this.stringValue = stringValue; - } - - public int getIntValue() { - return intValue; - } - - public void setIntValue(final int intValue) { - this.intValue = intValue; - } - - public boolean isBooleanValue() { - return booleanValue; - } - - public void setBooleanValue(final boolean booleanValue) { - this.booleanValue = booleanValue; - } - - public TypeEnum getType() { - return type; - } - - public void setType(final TypeEnum type) { - this.type = type; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java deleted file mode 100644 index 676e22686e..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -public class MyDtoWithEnumCustom { - - private String stringValue; - private int intValue; - private boolean booleanValue; - private TypeEnumWithCustomSerializer type; - - public MyDtoWithEnumCustom() { - super(); - } - - public MyDtoWithEnumCustom(final String stringValue, final int intValue, final boolean booleanValue, final TypeEnumWithCustomSerializer type) { - super(); - - this.stringValue = stringValue; - this.intValue = intValue; - this.booleanValue = booleanValue; - this.type = type; - } - - // API - - public String getStringValue() { - return stringValue; - } - - public void setStringValue(final String stringValue) { - this.stringValue = stringValue; - } - - public int getIntValue() { - return intValue; - } - - public void setIntValue(final int intValue) { - this.intValue = intValue; - } - - public boolean isBooleanValue() { - return booleanValue; - } - - public void setBooleanValue(final boolean booleanValue) { - this.booleanValue = booleanValue; - } - - public TypeEnumWithCustomSerializer getType() { - return type; - } - - public void setType(final TypeEnumWithCustomSerializer type) { - this.type = type; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java deleted file mode 100644 index e0c9718330..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import com.fasterxml.jackson.annotation.JsonFormat; - -@JsonFormat(shape = JsonFormat.Shape.OBJECT) -public enum TypeEnum { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - private String name; - - private TypeEnum(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java deleted file mode 100644 index 477db67069..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumSimple.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -public enum TypeEnumSimple { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - private String name; - - private TypeEnumSimple(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java deleted file mode 100644 index e7c2859dd1..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithCustomSerializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -@JsonSerialize(using = TypeSerializer.class) -public enum TypeEnumWithCustomSerializer { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - private String name; - - private TypeEnumWithCustomSerializer(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java deleted file mode 100644 index c5ddf222ff..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeEnumWithValue.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TypeEnumWithValue { - TYPE1(1, "Type A"), TYPE2(2, "Type 2"); - - private Integer id; - - private String name; - - private TypeEnumWithValue(final Integer id, final String name) { - this.id = id; - this.name = name; - } - - // API - - public Integer getId() { - return id; - } - - public void setId(final Integer id) { - this.id = id; - } - - @JsonValue - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - -} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java deleted file mode 100644 index fc5011137c..0000000000 --- a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/TypeSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.jackson.dtos.withEnum; - -import java.io.IOException; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -public class TypeSerializer extends StdSerializer { - - private static final long serialVersionUID = -7650668914169390772L; - - public TypeSerializer() { - this(null); - } - - public TypeSerializer(final Class t) { - super(t); - } - - @Override - public void serialize(final TypeEnumWithCustomSerializer value, final JsonGenerator generator, final SerializerProvider provider) throws IOException, JsonProcessingException { - generator.writeStartObject(); - generator.writeFieldName("id"); - generator.writeNumber(value.getId()); - generator.writeFieldName("name"); - generator.writeString(value.getName()); - generator.writeEndObject(); - } - -} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java new file mode 100644 index 0000000000..af61e55bb4 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationTest.java @@ -0,0 +1,22 @@ +package com.baeldung.jackson.enums; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThat; + +import java.io.IOException; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JacksonEnumSerializationTest { + + @Test + public final void givenEnum_whenSerializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + final String dtoAsString = new ObjectMapper().writeValueAsString(Distance.MILE); + + assertThat(dtoAsString, containsString("1609.34")); + } + +} From e36d9282194e45754ee647a7d73c93ed9a38ae67 Mon Sep 17 00:00:00 2001 From: maibin Date: Sun, 8 Jan 2017 16:01:41 +0100 Subject: [PATCH 040/120] How to work with dates in Thymeleaf (#960) * How to work with dates in Thymeleaf * Fixes in PR for Thymeleaf --- spring-thymeleaf/.gitignore | 1 + spring-thymeleaf/pom.xml | 10 ++++- .../thymeleaf/config/WebMVCConfig.java | 2 + .../thymeleaf/controller/DatesController.java | 25 ++++++++++++ .../src/main/webapp/WEB-INF/views/dates.html | 35 +++++++++++++++++ ...ilityObjectsControllerIntegrationTest.java | 39 +++++++++++-------- 6 files changed, 94 insertions(+), 18 deletions(-) create mode 100644 spring-thymeleaf/.gitignore create mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java create mode 100644 spring-thymeleaf/src/main/webapp/WEB-INF/views/dates.html diff --git a/spring-thymeleaf/.gitignore b/spring-thymeleaf/.gitignore new file mode 100644 index 0000000000..b83d22266a --- /dev/null +++ b/spring-thymeleaf/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index b387539aa1..c43ab4dbb2 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -15,14 +15,15 @@ 1.7.21 1.1.7 - 3.0.2.RELEASE + 3.0.3.RELEASE + 3.0.0.RELEASE 2.1.2 1.1.0.Final 5.3.3.Final 5.2.5.Final - 4.12 + 4.12 3.6.0 2.6 @@ -78,6 +79,11 @@ thymeleaf-layout-dialect ${thymeleaf-layout-dialect.version}
    + + org.thymeleaf.extras + thymeleaf-extras-java8time + ${org.thymeleaf.extras-version} + org.slf4j diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java index ab048bdd87..3dc84ed6e9 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java @@ -13,6 +13,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.thymeleaf.TemplateEngine; +import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect; import org.thymeleaf.spring4.SpringTemplateEngine; import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring4.view.ThymeleafViewResolver; @@ -74,6 +75,7 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application private TemplateEngine templateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.addDialect(new LayoutDialect(new GroupingStrategy())); + engine.addDialect(new Java8TimeDialect()); engine.setTemplateResolver(templateResolver); return engine; } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java new file mode 100644 index 0000000000..74e2356076 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java @@ -0,0 +1,25 @@ +package com.baeldung.thymeleaf.controller; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class DatesController { + + @RequestMapping(value = "/dates", method = RequestMethod.GET) + public String getInfo(Model model) { + model.addAttribute("standardDate", new Date()); + model.addAttribute("localDateTime", LocalDateTime.now()); + model.addAttribute("localDate", LocalDate.now()); + model.addAttribute("timestamp", Instant.now()); + return "dates.html"; + } + +} diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/views/dates.html b/spring-thymeleaf/src/main/webapp/WEB-INF/views/dates.html new file mode 100644 index 0000000000..f8db1030f2 --- /dev/null +++ b/spring-thymeleaf/src/main/webapp/WEB-INF/views/dates.html @@ -0,0 +1,35 @@ + + + + +Baeldung - dates + + +

    Format ISO

    +

    +

    +

    +

    + +

    Format manually

    +

    +

    +

    + +

    Show only which day of a week

    +

    +

    +

    + +

    Show the name of the week day

    +

    +

    +

    + +

    Show the second of the day

    +

    +

    + + + \ No newline at end of file diff --git a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java index 0638dbbc11..923d98324b 100644 --- a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java @@ -30,29 +30,36 @@ import com.baeldung.thymeleaf.config.WebMVCSecurity; @WebAppConfiguration @ContextConfiguration(classes = { WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class }) public class ExpressionUtilityObjectsControllerIntegrationTest { - + @Autowired - WebApplicationContext wac; - @Autowired - MockHttpSession session; + WebApplicationContext wac; + @Autowired + MockHttpSession session; - private MockMvc mockMvc; + private MockMvc mockMvc; - @Autowired - private Filter springSecurityFilterChain; + @Autowired + private Filter springSecurityFilterChain; - protected RequestPostProcessor testUser() { - return user("user1").password("user1Pass").roles("USER"); - } + protected RequestPostProcessor testUser() { + return user("user1").password("user1Pass").roles("USER"); + } - @Before - public void setup() { - mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); - } + @Before + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); + } @Test - public void testGetDates() throws Exception{ - mockMvc.perform(get("/objects").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("objects.html")); + public void testGetObjects() throws Exception { + mockMvc.perform(get("/objects").with(testUser()).with(csrf())).andExpect(status().isOk()) + .andExpect(view().name("objects.html")); + } + + @Test + public void testDates() throws Exception { + mockMvc.perform(get("/dates").with(testUser()).with(csrf())).andExpect(status().isOk()) + .andExpect(view().name("dates.html")); } } From adccc13c322a8c1be3e811bf6d6586dac9010eff Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sun, 8 Jan 2017 16:46:47 +0100 Subject: [PATCH 041/120] BAEL-97 - simplifying code --- .../HandlerMappingCustomPrioritiesConfig.java | 43 +++++++++++++++ .../HandlerMappingPrioritiesConfig.java | 30 +++-------- ...HandlerMappingPrioritiesConfigNoOrder.java | 54 +++++++++++++++++++ ... => BeanNameHandlerMappingController.java} | 4 +- ...r.java => SimpleUrlMappingController.java} | 4 +- .../BeanNameMappingConfigTest.java | 2 +- ...ControllerClassNameHandlerMappingTest.java | 2 +- .../HandlerMappingPriorityConfigTest.java | 16 +++--- .../SimpleUrlMappingConfigTest.java | 2 +- 9 files changed, 120 insertions(+), 37 deletions(-) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java rename spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/{TestController.java => BeanNameHandlerMappingController.java} (74%) rename spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/{BaeldungController.java => SimpleUrlMappingController.java} (74%) rename spring-mvc-java/src/test/java/com/baeldung/{HandlerMapping => handlermappings}/BeanNameMappingConfigTest.java (97%) rename spring-mvc-java/src/test/java/com/baeldung/{HandlerMapping => handlermappings}/ControllerClassNameHandlerMappingTest.java (97%) rename spring-mvc-java/src/test/java/com/baeldung/{HandlerMapping => handlermappings}/HandlerMappingPriorityConfigTest.java (89%) rename spring-mvc-java/src/test/java/com/baeldung/{HandlerMapping => handlermappings}/SimpleUrlMappingConfigTest.java (97%) diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java new file mode 100644 index 0000000000..6545d1ec2d --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java @@ -0,0 +1,43 @@ +package com.baeldung.spring.web.config; + +import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; +import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; + +import java.util.HashMap; +import java.util.Map; + + +@Configuration +public class HandlerMappingCustomPrioritiesConfig { + + @Bean + BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { + BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); + beanNameUrlHandlerMapping.setOrder(0); + return beanNameUrlHandlerMapping; + } + + @Bean + public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { + SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + Map urlMap = new HashMap<>(); + urlMap.put("/welcome", simpleUrlMapping()); + simpleUrlHandlerMapping.setUrlMap(urlMap); + simpleUrlHandlerMapping.setOrder(1); + return simpleUrlHandlerMapping; + } + + @Bean + public SimpleUrlMappingController simpleUrlMapping() { + return new SimpleUrlMappingController(); + } + + @Bean("/welcome") + public BeanNameHandlerMappingController beanNameHandlerMapping() { + return new BeanNameHandlerMappingController(); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java index 07d32d35df..da54e5fc98 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java @@ -3,14 +3,13 @@ package com.baeldung.spring.web.config; import java.util.HashMap; import java.util.Map; -import com.baeldung.web.controller.handlermapping.BaeldungController; -import com.baeldung.web.controller.handlermapping.TestController; +import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; +import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; -import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; @Configuration @@ -19,7 +18,7 @@ public class HandlerMappingPrioritiesConfig { @Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - beanNameUrlHandlerMapping.setOrder(2); + beanNameUrlHandlerMapping.setOrder(0); return beanNameUrlHandlerMapping; } @@ -27,31 +26,18 @@ public class HandlerMappingPrioritiesConfig { public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); Map urlMap = new HashMap<>(); - urlMap.put("/welcome", test()); + urlMap.put("/welcome", simpleUrlMapping()); simpleUrlHandlerMapping.setUrlMap(urlMap); - simpleUrlHandlerMapping.setOrder(0); return simpleUrlHandlerMapping; } @Bean - public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { - ControllerClassNameHandlerMapping bean = new ControllerClassNameHandlerMapping(); - bean.setOrder(1); - return bean; + public SimpleUrlMappingController simpleUrlMapping() { + return new SimpleUrlMappingController(); } @Bean("/welcome") - public BaeldungController welcomeBaeldungController() { - return new BaeldungController(); - } - - @Bean - public TestController test() { - return new TestController(); - } - - @Bean - public WelcomeController welcomeController() { - return new WelcomeController(); + public BeanNameHandlerMappingController beanNameHandlerMapping() { + return new BeanNameHandlerMappingController(); } } \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java new file mode 100644 index 0000000000..d4cc30918e --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java @@ -0,0 +1,54 @@ +package com.baeldung.spring.web.config; + +import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; +import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; +import com.baeldung.web.controller.handlermapping.WelcomeController; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; +import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; + +import java.util.HashMap; +import java.util.Map; + + +@Configuration +public class HandlerMappingPrioritiesConfigNoOrder { + + @Bean + public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { + SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + Map urlMap = new HashMap<>(); + urlMap.put("/welcome", test()); + simpleUrlHandlerMapping.setUrlMap(urlMap); + return simpleUrlHandlerMapping; + } + + @Bean + public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { + ControllerClassNameHandlerMapping bean = new ControllerClassNameHandlerMapping(); + return bean; + } + + @Bean + BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { + BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); + return beanNameUrlHandlerMapping; + } + + @Bean("/welcome") + public SimpleUrlMappingController welcomeBaeldungController() { + return new SimpleUrlMappingController(); + } + + @Bean + public BeanNameHandlerMappingController test() { + return new BeanNameHandlerMappingController(); + } + + @Bean + public WelcomeController welcomeController() { + return new WelcomeController(); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/TestController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BeanNameHandlerMappingController.java similarity index 74% rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/TestController.java rename to spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BeanNameHandlerMappingController.java index 0f94321168..c40165f842 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/TestController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BeanNameHandlerMappingController.java @@ -6,10 +6,10 @@ import org.springframework.web.servlet.mvc.AbstractController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -public class TestController extends AbstractController { +public class BeanNameHandlerMappingController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { - ModelAndView model = new ModelAndView("test"); + ModelAndView model = new ModelAndView("bean-name-handler-mapping"); return model; } diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BaeldungController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/SimpleUrlMappingController.java similarity index 74% rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BaeldungController.java rename to spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/SimpleUrlMappingController.java index 363fa74b66..7732830d07 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/BaeldungController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/handlermapping/SimpleUrlMappingController.java @@ -6,10 +6,10 @@ import org.springframework.web.servlet.mvc.AbstractController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -public class BaeldungController extends AbstractController { +public class SimpleUrlMappingController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { - ModelAndView model = new ModelAndView("baeldung"); + ModelAndView model = new ModelAndView("simple-url-handler-mapping"); return model; } diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java similarity index 97% rename from spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java index f2e78c3309..628fd57e8c 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/BeanNameMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java @@ -1,4 +1,4 @@ -package com.baeldung.handlermapping; +package com.baeldung.handlermappings; import com.baeldung.spring.web.config.BeanNameUrlHandlerMappingConfig; import org.junit.Before; diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java similarity index 97% rename from spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java index 79dd8513a1..e81b46f817 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/ControllerClassNameHandlerMappingTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java @@ -1,4 +1,4 @@ -package com.baeldung.handlermapping; +package com.baeldung.handlermappings; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java similarity index 89% rename from spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java index aa48f02c09..3157209a73 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/HandlerMappingPriorityConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java @@ -1,10 +1,7 @@ -package com.baeldung.handlermapping; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; +package com.baeldung.handlermappings; +import com.baeldung.spring.web.config.HandlerMappingCustomPrioritiesConfig; +import com.baeldung.spring.web.config.HandlerMappingPrioritiesConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -17,7 +14,10 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.web.config.HandlerMappingPrioritiesConfig; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @@ -36,6 +36,6 @@ public class HandlerMappingPriorityConfigTest { @Test public void whenConfiguringPriorities_thenMappedOK() throws Exception { - mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("test")).andDo(print()); + mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("bean-name-handler-mapping")).andDo(print()); } } \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java similarity index 97% rename from spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java rename to spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java index 847b00323b..29420b155f 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/HandlerMapping/SimpleUrlMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java @@ -1,4 +1,4 @@ -package com.baeldung.handlermapping; +package com.baeldung.handlermappings; import com.baeldung.spring.web.config.SimpleUrlHandlerMappingConfig; import org.junit.Before; From 60da0a954208a1cf93114fb303aeadb87d71f626 Mon Sep 17 00:00:00 2001 From: lor6 Date: Sun, 8 Jan 2017 20:21:31 +0200 Subject: [PATCH 042/120] Performance monitoring (#974) * spring performance monitoring interceptors * added person service --- .../performancemonitor/AopConfiguration.java | 15 +++++-- .../MyPerformanceMonitorInterceptor.java | 3 -- .../performancemonitor/PerfomanceApp.java | 6 +-- .../baeldung/performancemonitor/Person.java | 41 ++++++++++++++++--- .../performancemonitor/PersonService.java | 17 ++++++++ 5 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 aspectj/src/main/java/com/baeldung/performancemonitor/PersonService.java diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java b/aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java index 3ebe9a7fd8..5e2ef90c0f 100644 --- a/aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/AopConfiguration.java @@ -1,6 +1,8 @@ package com.baeldung.performancemonitor; -import org.aspectj.lang.annotation.Aspect; +import java.time.LocalDate; +import java.time.Month; + import org.aspectj.lang.annotation.Pointcut; import org.springframework.aop.Advisor; import org.springframework.aop.aspectj.AspectJExpressionPointcut; @@ -14,10 +16,10 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy; @EnableAspectJAutoProxy public class AopConfiguration { - @Pointcut("execution(public int com.baeldung.performancemonitor.Person.getAge())") + @Pointcut("execution(public String com.baeldung.performancemonitor.PersonService.getFullName(..))") public void monitor() { } - @Pointcut("execution(public void com.baeldung.performancemonitor.Person.setAge(int))") + @Pointcut("execution(public int com.baeldung.performancemonitor.PersonService.getAge(..))") public void myMonitor() { } @Bean @@ -34,7 +36,12 @@ public class AopConfiguration { @Bean public Person person(){ - return new Person(); + return new Person("John","Smith", LocalDate.of(1980, Month.JANUARY, 12)); + } + + @Bean + public PersonService personService(){ + return new PersonService(); } @Bean diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java b/aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java index c036359851..e995e52182 100644 --- a/aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/MyPerformanceMonitorInterceptor.java @@ -4,10 +4,7 @@ import java.util.Date; import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.logging.Log; -import org.apache.log4j.Logger; -import org.aspectj.lang.annotation.Aspect; import org.springframework.aop.interceptor.AbstractMonitoringInterceptor; -import org.springframework.util.StopWatch; public class MyPerformanceMonitorInterceptor extends AbstractMonitoringInterceptor { diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java b/aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java index 62b8287649..00268c978e 100644 --- a/aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/PerfomanceApp.java @@ -8,9 +8,9 @@ public class PerfomanceApp { ApplicationContext context = new AnnotationConfigApplicationContext(AopConfiguration.class); Person person = (Person) context.getBean("person"); + PersonService personService = (PersonService) context.getBean("personService"); - person.setAge(20); - System.out.println("Age is:"+person.getAge()); - + System.out.println("Name is:"+personService.getFullName(person)); + System.out.println("Age is:"+personService.getAge(person)); } } diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/Person.java b/aspectj/src/main/java/com/baeldung/performancemonitor/Person.java index 02c779e6fa..f16f28fdef 100644 --- a/aspectj/src/main/java/com/baeldung/performancemonitor/Person.java +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/Person.java @@ -1,13 +1,42 @@ package com.baeldung.performancemonitor; -public class Person { - private int age; +import java.time.LocalDate; - public int getAge() { - return age; +public class Person { + private String lastName; + private String firstName; + private LocalDate dateOfBirth; + + public Person() { } - public void setAge(int age) { - this.age = age; + public Person(String firstName, String lastName, LocalDate dateOfBirth) { + this.firstName = firstName; + this.lastName = lastName; + this.dateOfBirth = dateOfBirth; + } + + public LocalDate getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(LocalDate dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; } } diff --git a/aspectj/src/main/java/com/baeldung/performancemonitor/PersonService.java b/aspectj/src/main/java/com/baeldung/performancemonitor/PersonService.java new file mode 100644 index 0000000000..f5bfdddc12 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/performancemonitor/PersonService.java @@ -0,0 +1,17 @@ +package com.baeldung.performancemonitor; + +import java.time.LocalDate; +import java.time.Period; + +public class PersonService { + + public String getFullName(Person person){ + return person.getLastName()+" "+person.getFirstName(); + } + + public int getAge(Person person){ + Period p = Period.between(person.getDateOfBirth(), LocalDate.now()); + return p.getYears(); + } + +} From 13a0c859bdb181a3da5acd531cee942c96da38fc Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Mon, 9 Jan 2017 01:10:57 +0530 Subject: [PATCH 043/120] BAEL-531: Hello World -Spring AMQP Project (#945) * BAEL-531: Hello World -Spring AMQP Project * Review Comments --- spring-amqp/pom.xml | 41 +++++++++++++++++++ .../springamqp/consumer/Consumer.java | 7 ++++ .../springamqp/producer/Producer.java | 17 ++++++++ spring-amqp/src/main/resources/beans.xml | 35 ++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100755 spring-amqp/pom.xml create mode 100644 spring-amqp/src/main/java/com/baeldung/springamqp/consumer/Consumer.java create mode 100644 spring-amqp/src/main/java/com/baeldung/springamqp/producer/Producer.java create mode 100644 spring-amqp/src/main/resources/beans.xml diff --git a/spring-amqp/pom.xml b/spring-amqp/pom.xml new file mode 100755 index 0000000000..bb26b2d15d --- /dev/null +++ b/spring-amqp/pom.xml @@ -0,0 +1,41 @@ + + 4.0.0 + + com.baeldung + springamqp + 0.1-SNAPSHOT + jar + + springamqp + Introduction to Spring-AMQP + + + UTF-8 + 3.6.0 + + + + + org.springframework.amqp + spring-rabbit + 1.6.6.RELEASE + + + + + springamqp + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + true + + + + + diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/consumer/Consumer.java b/spring-amqp/src/main/java/com/baeldung/springamqp/consumer/Consumer.java new file mode 100644 index 0000000000..42d7e88cbd --- /dev/null +++ b/spring-amqp/src/main/java/com/baeldung/springamqp/consumer/Consumer.java @@ -0,0 +1,7 @@ +package com.baeldung.springamqp.consumer; + +public class Consumer { + public void listen(String foo) { + System.out.println(foo); + } +} \ No newline at end of file diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/producer/Producer.java b/spring-amqp/src/main/java/com/baeldung/springamqp/producer/Producer.java new file mode 100644 index 0000000000..b4067ed795 --- /dev/null +++ b/spring-amqp/src/main/java/com/baeldung/springamqp/producer/Producer.java @@ -0,0 +1,17 @@ +package com.baeldung.springamqp.producer; + +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class Producer { + + public static void main(String[] args) throws InterruptedException { + AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); + AmqpTemplate template = ctx.getBean(RabbitTemplate.class); + template.convertAndSend("Hello, world!"); + Thread.sleep(1000); + ctx.destroy(); + } +} \ No newline at end of file diff --git a/spring-amqp/src/main/resources/beans.xml b/spring-amqp/src/main/resources/beans.xml new file mode 100644 index 0000000000..f6a966b0f6 --- /dev/null +++ b/spring-amqp/src/main/resources/beans.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From f39332f2698d3646113d873065226cd3672f561c Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Sun, 8 Jan 2017 20:47:10 +0100 Subject: [PATCH 044/120] Added spring-amqp module --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 89afb5f698..30503a0a9a 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,7 @@ selenium-junit-testng spring-akka + spring-amqp spring-all spring-apache-camel spring-autowire From ccd3e5b7286438b3151f4167447a2c010d7033e8 Mon Sep 17 00:00:00 2001 From: Diane Duan Date: Mon, 9 Jan 2017 11:53:32 +0800 Subject: [PATCH 045/120] metrics examples --- metrics/pom.xml | 25 ++++ .../metrics/core/ActiveUserCountGauge.java | 17 +++ .../metrics/core/ActiveUsersGauge.java | 25 ++++ .../metrics/core/AttendanceRatioGauge.java | 18 +++ .../baeldung/metrics/core/MetricsDemo.java | 4 - .../metrics/core/MetricsRegistryDemo.java | 6 - .../healthchecks/DatabaseHealthCheck.java | 10 ++ .../healthchecks/UserCenterHealthCheck.java | 10 ++ .../MyInstrumentedFilterContextListener.java | 13 ++ .../MyHealthCheckServletContextListener.java | 18 +++ .../MyMetricsServletContextListener.java | 25 ++++ .../baeldung/metrics/core/MetricsTest.java | 139 ++++++++++++++++++ .../baeldung/metrics/core/ReporterTest.java | 33 +++++ .../metrics/healthchecks/HealthCheckTest.java | 31 ++++ 14 files changed, 364 insertions(+), 10 deletions(-) create mode 100644 metrics/src/main/java/com/baeldung/metrics/core/ActiveUserCountGauge.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/core/ActiveUsersGauge.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/core/AttendanceRatioGauge.java delete mode 100644 metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java delete mode 100644 metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/healthchecks/UserCenterHealthCheck.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/servlet/MyInstrumentedFilterContextListener.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/servlets/MyHealthCheckServletContextListener.java create mode 100644 metrics/src/main/java/com/baeldung/metrics/servlets/MyMetricsServletContextListener.java create mode 100644 metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java create mode 100644 metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java create mode 100644 metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java diff --git a/metrics/pom.xml b/metrics/pom.xml index c4b433482b..189f9afbff 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -23,5 +23,30 @@ metrics-core ${dep.ver.metrics}
    + + io.dropwizard.metrics + metrics-healthchecks + ${dep.ver.metrics} + + + io.dropwizard.metrics + metrics-servlets + ${dep.ver.metrics} + + + io.dropwizard.metrics + metrics-servlet + ${dep.ver.metrics} + + + javax.servlet + javax.servlet-api + 3.1.0 + + + junit + junit + 4.12 +
    \ No newline at end of file diff --git a/metrics/src/main/java/com/baeldung/metrics/core/ActiveUserCountGauge.java b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUserCountGauge.java new file mode 100644 index 0000000000..f14e7b520a --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUserCountGauge.java @@ -0,0 +1,17 @@ +package com.baeldung.metrics.core; + +import java.util.List; + +import com.codahale.metrics.DerivativeGauge; +import com.codahale.metrics.Gauge; + +public class ActiveUserCountGauge extends DerivativeGauge, Integer> { + public ActiveUserCountGauge(Gauge> base) { + super(base); + } + + @Override + protected Integer transform(List value) { + return value.size(); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/core/ActiveUsersGauge.java b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUsersGauge.java new file mode 100644 index 0000000000..79ac132e0b --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/ActiveUsersGauge.java @@ -0,0 +1,25 @@ +package com.baeldung.metrics.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.codahale.metrics.CachedGauge; + +public class ActiveUsersGauge extends CachedGauge> { + public ActiveUsersGauge(long timeout, TimeUnit timeoutUnit) { + super(timeout, timeoutUnit); + } + + @Override + protected List loadValue() { + return getActiveUserCount(); + } + + private List getActiveUserCount() { + // mock reading from database and count the active users, return a fixed value + List result = new ArrayList(); + result.add(12L); + return result; + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/core/AttendanceRatioGauge.java b/metrics/src/main/java/com/baeldung/metrics/core/AttendanceRatioGauge.java new file mode 100644 index 0000000000..e4cdca6b0a --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/core/AttendanceRatioGauge.java @@ -0,0 +1,18 @@ +package com.baeldung.metrics.core; + +import com.codahale.metrics.RatioGauge; + +public class AttendanceRatioGauge extends RatioGauge { + private int attendanceCount; + private int courseCount; + + public AttendanceRatioGauge(int attendanceCount, int courseCount) { + this.attendanceCount = attendanceCount; + this.courseCount = courseCount; + } + + @Override + protected Ratio getRatio() { + return Ratio.of(attendanceCount, courseCount); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java b/metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java deleted file mode 100644 index 3f3127fd5a..0000000000 --- a/metrics/src/main/java/com/baeldung/metrics/core/MetricsDemo.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.baeldung.metrics.core; - -public class MetricsDemo { -} diff --git a/metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java b/metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java deleted file mode 100644 index fe390d5534..0000000000 --- a/metrics/src/main/java/com/baeldung/metrics/core/MetricsRegistryDemo.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.metrics.core; - -public class MetricsRegistryDemo { - public static void main(String[] args) { - } -} diff --git a/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java b/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java new file mode 100644 index 0000000000..46170f627f --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java @@ -0,0 +1,10 @@ +package com.baeldung.metrics.healthchecks; + +import com.codahale.metrics.health.HealthCheck; + +public class DatabaseHealthCheck extends HealthCheck { + @Override + protected Result check() throws Exception { + return HealthCheck.Result.healthy(); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/healthchecks/UserCenterHealthCheck.java b/metrics/src/main/java/com/baeldung/metrics/healthchecks/UserCenterHealthCheck.java new file mode 100644 index 0000000000..481ced142d --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/healthchecks/UserCenterHealthCheck.java @@ -0,0 +1,10 @@ +package com.baeldung.metrics.healthchecks; + +import com.codahale.metrics.health.HealthCheck; + +public class UserCenterHealthCheck extends HealthCheck { + @Override + protected Result check() throws Exception { + return Result.healthy(); + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/servlet/MyInstrumentedFilterContextListener.java b/metrics/src/main/java/com/baeldung/metrics/servlet/MyInstrumentedFilterContextListener.java new file mode 100644 index 0000000000..3036eeeb23 --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/servlet/MyInstrumentedFilterContextListener.java @@ -0,0 +1,13 @@ +package com.baeldung.metrics.servlet; + +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.servlet.InstrumentedFilterContextListener; + +public class MyInstrumentedFilterContextListener extends InstrumentedFilterContextListener { + public static final MetricRegistry REGISTRY = new MetricRegistry(); + + @Override + protected MetricRegistry getMetricRegistry() { + return REGISTRY; + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/servlets/MyHealthCheckServletContextListener.java b/metrics/src/main/java/com/baeldung/metrics/servlets/MyHealthCheckServletContextListener.java new file mode 100644 index 0000000000..12f12b3e6f --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/servlets/MyHealthCheckServletContextListener.java @@ -0,0 +1,18 @@ +package com.baeldung.metrics.servlets; + +import com.baeldung.metrics.healthchecks.DatabaseHealthCheck; +import com.codahale.metrics.health.HealthCheckRegistry; +import com.codahale.metrics.servlets.HealthCheckServlet; + +public class MyHealthCheckServletContextListener extends HealthCheckServlet.ContextListener { + public static final HealthCheckRegistry HEALTH_CHECK_REGISTRY = new HealthCheckRegistry(); + + static { + HEALTH_CHECK_REGISTRY.register("db", new DatabaseHealthCheck()); + } + + @Override + protected HealthCheckRegistry getHealthCheckRegistry() { + return HEALTH_CHECK_REGISTRY; + } +} diff --git a/metrics/src/main/java/com/baeldung/metrics/servlets/MyMetricsServletContextListener.java b/metrics/src/main/java/com/baeldung/metrics/servlets/MyMetricsServletContextListener.java new file mode 100644 index 0000000000..7b4f33447a --- /dev/null +++ b/metrics/src/main/java/com/baeldung/metrics/servlets/MyMetricsServletContextListener.java @@ -0,0 +1,25 @@ +package com.baeldung.metrics.servlets; + +import com.codahale.metrics.Counter; +import com.codahale.metrics.Histogram; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.servlets.MetricsServlet; + +public class MyMetricsServletContextListener extends MetricsServlet.ContextListener { + private static final MetricRegistry METRIC_REGISTRY = new MetricRegistry(); + + static { + Counter counter = METRIC_REGISTRY.counter("m01-counter"); + counter.inc(); + + Histogram histogram = METRIC_REGISTRY.histogram("m02-histogram"); + histogram.update(5); + histogram.update(20); + histogram.update(100); + } + + @Override + protected MetricRegistry getMetricRegistry() { + return METRIC_REGISTRY; + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java new file mode 100644 index 0000000000..b9bcc6a5fe --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java @@ -0,0 +1,139 @@ +package com.baeldung.metrics.core; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.codahale.metrics.*; + +public class MetricsTest { + @Test + public void testMeter() throws InterruptedException { + Meter meter = new Meter(); + + long initCount = meter.getCount(); + assertThat(initCount, equalTo(0L)); + + meter.mark(); + assertThat(meter.getCount(), equalTo(1L)); + + meter.mark(20); + assertThat(meter.getCount(), equalTo(21L)); + + // not use assert for these rate values because they change every time when this test is run + double meanRate = meter.getMeanRate(); + double oneMinRate = meter.getOneMinuteRate(); + double fiveMinRate = meter.getFiveMinuteRate(); + double fifteenMinRate = meter.getFifteenMinuteRate(); + System.out.println(meanRate); + System.out.println(oneMinRate); + System.out.println(fiveMinRate); + System.out.println(fifteenMinRate); + } + + @Test + public void testRatioGauge() { + Gauge ratioGauge = new AttendanceRatioGauge(15, 20); + assertThat(ratioGauge.getValue(), equalTo(0.75)); + } + + @Test + public void testCacheGauge() { + Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); + List expected = new ArrayList(); + expected.add(12L); + assertThat(activeUsersGauge.getValue(), equalTo(expected)); + } + + @Test + public void testDerivativeGauge() { + Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); + Gauge activeUserCountGauge = new ActiveUserCountGauge(activeUsersGauge); + assertThat(activeUserCountGauge.getValue(), equalTo(1)); + } + + @Test + public void testCounter() { + Counter counter = new Counter(); + + long initCount = counter.getCount(); + assertThat(initCount, equalTo(0L)); + + counter.inc(); + assertThat(counter.getCount(), equalTo(1L)); + + counter.inc(11); + assertThat(counter.getCount(), equalTo(12L)); + + counter.dec(); + assertThat(counter.getCount(), equalTo(11L)); + + counter.dec(6); + assertThat(counter.getCount(), equalTo(5L)); + } + + @Test + public void testHistogram() { + Histogram histogram = new Histogram(new UniformReservoir()); + + histogram.update(5); + long count1 = histogram.getCount(); + assertThat(count1, equalTo(1L)); + Snapshot snapshot1 = histogram.getSnapshot(); + assertThat(snapshot1.getValues().length, equalTo(1)); + assertThat(snapshot1.getValues()[0], equalTo(5L)); + assertThat(snapshot1.getMax(), equalTo(5L)); + assertThat(snapshot1.getMin(), equalTo(5L)); + assertThat(snapshot1.getMean(), equalTo(5.0)); + assertThat(snapshot1.getMedian(), equalTo(5.0)); + assertThat(snapshot1.getStdDev(), equalTo(0.0)); + assertThat(snapshot1.get75thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get95thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get98thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get99thPercentile(), equalTo(5.0)); + assertThat(snapshot1.get999thPercentile(), equalTo(5.0)); + + histogram.update(20); + long count2 = histogram.getCount(); + assertThat(count2, equalTo(2L)); + Snapshot snapshot2 = histogram.getSnapshot(); + assertThat(snapshot2.getValues().length, equalTo(2)); + assertThat(snapshot2.getValues()[0], equalTo(5L)); + assertThat(snapshot2.getValues()[1], equalTo(20L)); + assertThat(snapshot2.getMax(), equalTo(20L)); + assertThat(snapshot2.getMin(), equalTo(5L)); + assertThat(snapshot2.getMean(), equalTo(12.5)); + assertThat(snapshot2.getMedian(), equalTo(12.5)); + assertEquals(10.6, snapshot2.getStdDev(), 0.1); + assertThat(snapshot2.get75thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get95thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get98thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get99thPercentile(), equalTo(20.0)); + assertThat(snapshot2.get999thPercentile(), equalTo(20.0)); + } + + @Test + public void testTimer() throws InterruptedException { + Timer timer = new Timer(); + + Timer.Context context1 = timer.time(); + TimeUnit.SECONDS.sleep(5); + + long elapsed1 = context1.stop(); + assertEquals(5000000000L, elapsed1, 1000000); + assertThat(timer.getCount(), equalTo(1L)); + assertEquals(0.2, timer.getMeanRate(), 0.1); + + Timer.Context context2 = timer.time(); + TimeUnit.SECONDS.sleep(2); + context2.close(); + assertThat(timer.getCount(), equalTo(2L)); + assertEquals(0.3, timer.getMeanRate(), 0.1); + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java b/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java new file mode 100644 index 0000000000..4676f8c3a4 --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java @@ -0,0 +1,33 @@ +package com.baeldung.metrics.core; + +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.codahale.metrics.*; + +public class ReporterTest { + @Test + public void testConsoleReporter() { + MetricRegistry metricRegistry = new MetricRegistry(); + + Meter meter = metricRegistry.meter("meter"); + meter.mark(); + meter.mark(200); + Histogram histogram = metricRegistry.histogram("histogram"); + histogram.update(12); + histogram.update(17); + histogram.update(20); + Counter counter = metricRegistry.counter("counter"); + counter.inc(); + counter.dec(); + counter.inc(); + counter.inc(); + counter.inc(); + counter.inc(); + + ConsoleReporter reporter = ConsoleReporter.forRegistry(metricRegistry).build(); + reporter.start(5, TimeUnit.MICROSECONDS); + reporter.report(); + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java new file mode 100644 index 0000000000..4cefc9f3a0 --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java @@ -0,0 +1,31 @@ +package com.baeldung.metrics.healthchecks; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import java.util.Map; + +import org.junit.Test; + +import com.codahale.metrics.health.HealthCheck; +import com.codahale.metrics.health.HealthCheckRegistry; + +public class HealthCheckTest { + @Test + public void testHealthCheck() { + HealthCheckRegistry healthCheckRegistry = new HealthCheckRegistry(); + + healthCheckRegistry.register("db", new DatabaseHealthCheck()); + healthCheckRegistry.register("uc", new UserCenterHealthCheck()); + + assertThat(healthCheckRegistry.getNames().size(), equalTo(2)); + + Map results = healthCheckRegistry.runHealthChecks(); + for (Map.Entry entry : results.entrySet()) { + assertThat(entry.getValue().isHealthy(), equalTo(true)); + } + + healthCheckRegistry.unregister("uc"); + assertThat(healthCheckRegistry.getNames().size(), equalTo(1)); + } +} \ No newline at end of file From 02826096e9e40a6c63769189e68054ea2ede1be9 Mon Sep 17 00:00:00 2001 From: Victor Mosin Date: Mon, 9 Jan 2017 08:26:31 +0100 Subject: [PATCH 046/120] Applied latest changes --- .../org/baeldung/controller/GenericEntityController.java | 7 ++++--- .../baeldung/converter/StringToLocalDateTimeConverter.java | 7 +------ spring-boot/src/main/java/org/baeldung/domain/Modes.java | 2 +- .../org/baeldung/SpringBootApplicationIntegrationTest.java | 3 ++- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java index c8649e0d3e..7d6293056a 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java +++ b/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java @@ -5,6 +5,7 @@ import org.baeldung.domain.Modes; import org.baeldung.web.resolver.Version; import org.springframework.http.HttpStatus; 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.RequestMethod; @@ -41,17 +42,17 @@ public class GenericEntityController { return entityList.stream().filter(entity -> entity.getId().equals(id)).findFirst().get(); } - @RequestMapping("/entity/findbydate/{date}") + @GetMapping("/entity/findbydate/{date}") public GenericEntity findByDate(@PathVariable("date") LocalDateTime date) { return entityList.stream().findFirst().get(); } - @RequestMapping("/entity/findbymode/{mode}") + @GetMapping("/entity/findbymode/{mode}") public GenericEntity findByEnum(@PathVariable("mode") Modes mode) { return entityList.stream().findFirst().get(); } - @RequestMapping("/entity/findbyversion") + @GetMapping("/entity/findbyversion") public ResponseEntity findByVersion(@Version String version) { return version != null ? new ResponseEntity(entityList.stream().findFirst().get(), HttpStatus.OK) diff --git a/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java b/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java index 85c86faae1..cbb9e6ddb4 100644 --- a/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java +++ b/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java @@ -5,17 +5,12 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; @Component public class StringToLocalDateTimeConverter implements Converter { @Override public LocalDateTime convert(final String source) { - try { - return LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME); - } catch (DateTimeParseException e) { - throw new IllegalArgumentException("Couldn't parse value"); - } + return LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME); } } diff --git a/spring-boot/src/main/java/org/baeldung/domain/Modes.java b/spring-boot/src/main/java/org/baeldung/domain/Modes.java index 41b1fa0d4e..473406ef26 100644 --- a/spring-boot/src/main/java/org/baeldung/domain/Modes.java +++ b/spring-boot/src/main/java/org/baeldung/domain/Modes.java @@ -2,5 +2,5 @@ package org.baeldung.domain; public enum Modes { - Alpha, Beta; + ALPHA, BETA; } diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java index 94623d3cdd..8cdcdb2216 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java @@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import org.baeldung.domain.Modes; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -54,7 +55,7 @@ public class SpringBootApplicationIntegrationTest { public void givenRequestHasBeenMade_whenMeetsFindByModeOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", "Alpha")) + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", Modes.ALPHA.name())) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().contentType(contentType)) .andExpect(jsonPath("$.id", equalTo(1))); From 6a60defc94c2e0f0515448b1983119b8da3d980d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Soares?= Date: Mon, 9 Jan 2017 14:06:46 +0000 Subject: [PATCH 047/120] Remove Apache Commons IO dependency and split into smaller methods (#942) * Fix the requested changes * Split into smaller methods * Split into smaller methods * Remove apache dependency and split into smaller methods * Add unit tests --- jsoup/pom.xml | 9 +-- .../{JsoupExample.java => JsoupParser.java} | 58 ++++++++++--------- .../com/baeldung/jsoup/JsoupParserTest.java | 36 ++++++++++++ 3 files changed, 71 insertions(+), 32 deletions(-) rename jsoup/src/main/java/com/baeldung/jsoup/{JsoupExample.java => JsoupParser.java} (66%) create mode 100644 jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java diff --git a/jsoup/pom.xml b/jsoup/pom.xml index 989f30422c..343e139b46 100644 --- a/jsoup/pom.xml +++ b/jsoup/pom.xml @@ -15,15 +15,16 @@ ${jsoup.version} - commons-io - commons-io - ${commons.io.version} + junit + junit + 4.12 + test 1.8 1.8 - 2.5 + 1.10.1 diff --git a/jsoup/src/main/java/com/baeldung/jsoup/JsoupExample.java b/jsoup/src/main/java/com/baeldung/jsoup/JsoupParser.java similarity index 66% rename from jsoup/src/main/java/com/baeldung/jsoup/JsoupExample.java rename to jsoup/src/main/java/com/baeldung/jsoup/JsoupParser.java index 10431a621d..cb86b16888 100644 --- a/jsoup/src/main/java/com/baeldung/jsoup/JsoupExample.java +++ b/jsoup/src/main/java/com/baeldung/jsoup/JsoupParser.java @@ -1,47 +1,33 @@ package com.baeldung.jsoup; -import java.io.File; import java.io.IOException; -import org.apache.commons.io.FileUtils; -import org.jsoup.HttpStatusException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.parser.Tag; import org.jsoup.select.Elements; -public class JsoupExample { +public class JsoupParser { - public static void main(String[] args) throws IOException { - scrapeSpringBlog(); + Document doc; + + public void loadDocument(String blogUrl) throws IOException { + doc = Jsoup.connect(blogUrl).get(); } - static void scrapeSpringBlog() throws IOException { - String blogUrl = "https://spring.io/blog"; - Document doc = Jsoup.connect(blogUrl).get(); - - try { - Document doc404 = Jsoup.connect("https://spring.io/will-not-be-found").get(); - } catch (HttpStatusException ex) { - System.out.println(ex.getMessage()); - } - - Document docCustomConn = Jsoup.connect(blogUrl).userAgent("Mozilla").get(); - docCustomConn = Jsoup.connect(blogUrl).timeout(5000).get(); - docCustomConn = Jsoup.connect(blogUrl).cookie("cookiename", "val234").get(); - // docCustomConn = Jsoup.connect(blogUrl).data("datakey", "datavalue").post(); - docCustomConn = Jsoup.connect(blogUrl).header("headersecurity", "xyz123").get(); - - docCustomConn = Jsoup.connect(blogUrl) + void loadDocumentCustomized(String blogUrl) throws IOException { + doc = Jsoup.connect(blogUrl) .userAgent("Mozilla") .timeout(5000) .cookie("cookiename", "val234") .cookie("anothercookie", "ilovejsoup") + .referrer("http://google.com") .header("headersecurity", "xyz123") .get(); + } + void examplesSelectors() { Elements links = doc.select("a"); - Elements sections = doc.select("section"); Elements logo = doc.select(".spring-logo--container"); Elements pagination = doc.select("#pagination_control"); Elements divsDescendant = doc.select("header div"); @@ -50,6 +36,14 @@ public class JsoupExample { Element pag = doc.getElementById("pagination_control"); Elements desktopOnly = doc.getElementsByClass("desktopOnly"); + Elements sections = doc.select("section"); + Element firstSection = sections.first(); + Elements sectionParagraphs = firstSection.select(".paragraph"); + } + + void examplesTraversing() { + Elements sections = doc.select("section"); + Element firstSection = sections.first(); Element lastSection = sections.last(); Element secondSection = sections.get(2); @@ -59,9 +53,9 @@ public class JsoupExample { Elements siblings = firstSection.siblingElements(); sections.stream().forEach(el -> System.out.println("section: " + el)); + } - Elements sectionParagraphs = firstSection.select(".paragraph"); - + void examplesExtracting() { Element firstArticle = doc.select("article").first(); Element timeElement = firstArticle.select("time").first(); String dateTimeOfFirstArticle = timeElement.attr("datetime"); @@ -69,7 +63,14 @@ public class JsoupExample { String sectionDivText = sectionDiv.text(); String articleHtml = firstArticle.html(); String outerHtml = firstArticle.outerHtml(); + } + void examplesModifying() { + Element firstArticle = doc.select("article").first(); + Element timeElement = firstArticle.select("time").first(); + Element sectionDiv = firstArticle.select("section div").first(); + + String dateTimeOfFirstArticle = timeElement.attr("datetime"); timeElement.attr("datetime", "2016-12-16 15:19:54.3"); sectionDiv.text("foo bar"); firstArticle.select("h2").html("
    "); @@ -82,8 +83,9 @@ public class JsoupExample { doc.select("li.navbar-link").remove(); firstArticle.select("img").remove(); + } - File indexFile = new File("/tmp", "spring_blog_home.html"); - FileUtils.writeStringToFile(indexFile, doc.html(), doc.charset()); + String getTidyHtml() { + return doc.html(); } } diff --git a/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java new file mode 100644 index 0000000000..85fd3c3459 --- /dev/null +++ b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java @@ -0,0 +1,36 @@ +package com.baeldung.jsoup; + +import java.io.IOException; +import org.jsoup.HttpStatusException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Before; +import org.junit.Test; + +public class JsoupParserTest { + + JsoupParser jsoupParser; + + @Before + public void setUp() { + jsoupParser = new JsoupParser(); + } + + @Test + public void test404() throws IOException { + try { + jsoupParser.loadDocument("https://spring.io/will-not-be-found"); + } catch (HttpStatusException ex) { + assertEquals(404, ex.getStatusCode()); + } + } + + @Test + public void testChange() throws IOException { + jsoupParser.loadDocument("http://spring.io/blog"); + + jsoupParser.examplesModifying(); + + assertTrue(jsoupParser.getTidyHtml().contains("http://baeldung.com")); + } +} From 516fa14625efc3c0fa0918b4a49004df93282921 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Mon, 9 Jan 2017 08:24:36 -0600 Subject: [PATCH 048/120] Update README.md --- aspectj/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/aspectj/README.md b/aspectj/README.md index 9793b742fa..71724e76b6 100644 --- a/aspectj/README.md +++ b/aspectj/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Intro to AspectJ](http://www.baeldung.com/aspectj) +- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) From 66917a28772a707ca96c4ed6059162e3d6245ef6 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Mon, 9 Jan 2017 16:47:27 +0100 Subject: [PATCH 049/120] BAEL-97 - moving config to test source tree --- .../HandlerMappingCustomPrioritiesConfig.java | 43 --------------- ...HandlerMappingPrioritiesConfigNoOrder.java | 54 ------------------- .../BeanNameUrlHandlerMappingConfig.java | 2 +- ...ntrollerClassNameHandlerMappingConfig.java | 4 +- .../HandlerMappingPrioritiesConfig.java | 2 +- .../config/SimpleUrlHandlerMappingConfig.java | 2 +- .../BeanNameMappingConfigTest.java | 2 +- ...ControllerClassNameHandlerMappingTest.java | 2 +- .../HandlerMappingPriorityConfigTest.java | 3 +- .../SimpleUrlMappingConfigTest.java | 2 +- 10 files changed, 9 insertions(+), 107 deletions(-) delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java rename spring-mvc-java/src/{main/java/com/baeldung/spring/web => test/java/com/baeldung}/config/BeanNameUrlHandlerMappingConfig.java (94%) rename spring-mvc-java/src/{main/java/com/baeldung/spring/web => test/java/com/baeldung}/config/ControllerClassNameHandlerMappingConfig.java (93%) rename spring-mvc-java/src/{main/java/com/baeldung/spring/web => test/java/com/baeldung}/config/HandlerMappingPrioritiesConfig.java (97%) rename spring-mvc-java/src/{main/java/com/baeldung/spring/web => test/java/com/baeldung}/config/SimpleUrlHandlerMappingConfig.java (96%) diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java deleted file mode 100644 index 6545d1ec2d..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingCustomPrioritiesConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.spring.web.config; - -import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; -import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; - -import java.util.HashMap; -import java.util.Map; - - -@Configuration -public class HandlerMappingCustomPrioritiesConfig { - - @Bean - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - beanNameUrlHandlerMapping.setOrder(0); - return beanNameUrlHandlerMapping; - } - - @Bean - public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); - Map urlMap = new HashMap<>(); - urlMap.put("/welcome", simpleUrlMapping()); - simpleUrlHandlerMapping.setUrlMap(urlMap); - simpleUrlHandlerMapping.setOrder(1); - return simpleUrlHandlerMapping; - } - - @Bean - public SimpleUrlMappingController simpleUrlMapping() { - return new SimpleUrlMappingController(); - } - - @Bean("/welcome") - public BeanNameHandlerMappingController beanNameHandlerMapping() { - return new BeanNameHandlerMappingController(); - } -} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java deleted file mode 100644 index d4cc30918e..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfigNoOrder.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.spring.web.config; - -import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; -import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; -import com.baeldung.web.controller.handlermapping.WelcomeController; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; -import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; - -import java.util.HashMap; -import java.util.Map; - - -@Configuration -public class HandlerMappingPrioritiesConfigNoOrder { - - @Bean - public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { - SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); - Map urlMap = new HashMap<>(); - urlMap.put("/welcome", test()); - simpleUrlHandlerMapping.setUrlMap(urlMap); - return simpleUrlHandlerMapping; - } - - @Bean - public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping() { - ControllerClassNameHandlerMapping bean = new ControllerClassNameHandlerMapping(); - return bean; - } - - @Bean - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { - BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - return beanNameUrlHandlerMapping; - } - - @Bean("/welcome") - public SimpleUrlMappingController welcomeBaeldungController() { - return new SimpleUrlMappingController(); - } - - @Bean - public BeanNameHandlerMappingController test() { - return new BeanNameHandlerMappingController(); - } - - @Bean - public WelcomeController welcomeController() { - return new WelcomeController(); - } -} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/BeanNameUrlHandlerMappingConfig.java similarity index 94% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/BeanNameUrlHandlerMappingConfig.java index 081db6c6c3..e3dcb15de8 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/BeanNameUrlHandlerMappingConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/BeanNameUrlHandlerMappingConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/ControllerClassNameHandlerMappingConfig.java similarity index 93% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/ControllerClassNameHandlerMappingConfig.java index 0f67624658..6e9318602f 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/ControllerClassNameHandlerMappingConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/ControllerClassNameHandlerMappingConfig.java @@ -1,14 +1,14 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping; import org.springframework.web.servlet.view.InternalResourceViewResolver; -@EnableWebMvc @Configuration public class ControllerClassNameHandlerMappingConfig { diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java similarity index 97% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java index da54e5fc98..2b09947e97 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/HandlerMappingPrioritiesConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import java.util.HashMap; import java.util.Map; diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/SimpleUrlHandlerMappingConfig.java similarity index 96% rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java rename to spring-mvc-java/src/test/java/com/baeldung/config/SimpleUrlHandlerMappingConfig.java index a81b2fa14e..c7921c2706 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/SimpleUrlHandlerMappingConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/SimpleUrlHandlerMappingConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.web.config; +package com.baeldung.config; import java.util.HashMap; import java.util.Map; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java index 628fd57e8c..f58e5cb0a1 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/BeanNameMappingConfigTest.java @@ -1,6 +1,6 @@ package com.baeldung.handlermappings; -import com.baeldung.spring.web.config.BeanNameUrlHandlerMappingConfig; +import com.baeldung.config.BeanNameUrlHandlerMappingConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java index e81b46f817..6fdd168d0b 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/ControllerClassNameHandlerMappingTest.java @@ -17,7 +17,7 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.web.config.ControllerClassNameHandlerMappingConfig; +import com.baeldung.config.ControllerClassNameHandlerMappingConfig; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java index 3157209a73..26d7b88baa 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java @@ -1,7 +1,6 @@ package com.baeldung.handlermappings; -import com.baeldung.spring.web.config.HandlerMappingCustomPrioritiesConfig; -import com.baeldung.spring.web.config.HandlerMappingPrioritiesConfig; +import com.baeldung.config.HandlerMappingPrioritiesConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java index 29420b155f..636339f152 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/SimpleUrlMappingConfigTest.java @@ -1,6 +1,6 @@ package com.baeldung.handlermappings; -import com.baeldung.spring.web.config.SimpleUrlHandlerMappingConfig; +import com.baeldung.config.SimpleUrlHandlerMappingConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; From e27131f3a50543415aaa6ed3b8f257e66ee6a359 Mon Sep 17 00:00:00 2001 From: Shubham Aggarwal Date: Mon, 9 Jan 2017 22:20:14 +0530 Subject: [PATCH 050/120] Added java-mongodb module (#978) * Made maven project. * Added mongo driver dependencies. * Added crud operations. * Class rename * Added tests --- java-mongodb/.gitignore | 5 ++ java-mongodb/pom.xml | 44 ++++++++++++ .../main/java/com/baeldung/MongoExample.java | 53 ++++++++++++++ .../src/test/java/com/baeldung/AppTest.java | 72 +++++++++++++++++++ pom.xml | 8 +-- 5 files changed, 178 insertions(+), 4 deletions(-) create mode 100644 java-mongodb/.gitignore create mode 100644 java-mongodb/pom.xml create mode 100644 java-mongodb/src/main/java/com/baeldung/MongoExample.java create mode 100644 java-mongodb/src/test/java/com/baeldung/AppTest.java diff --git a/java-mongodb/.gitignore b/java-mongodb/.gitignore new file mode 100644 index 0000000000..79ba317cb5 --- /dev/null +++ b/java-mongodb/.gitignore @@ -0,0 +1,5 @@ +.classpath +.project +.settings +target +build \ No newline at end of file diff --git a/java-mongodb/pom.xml b/java-mongodb/pom.xml new file mode 100644 index 0000000000..66b4bbdc99 --- /dev/null +++ b/java-mongodb/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.baeldung + java-mongodb + 1.0-SNAPSHOT + + + 1.8 + 1.8 + 4.12 + 3.4.1 + 1.11 + + + + + + junit + junit + ${junit.version} + test + + + + de.flapdoodle.embedmongo + de.flapdoodle.embedmongo + ${flapdoodle.version} + test + + + + + org.mongodb + mongo-java-driver + ${mongo.version} + + + + + \ No newline at end of file diff --git a/java-mongodb/src/main/java/com/baeldung/MongoExample.java b/java-mongodb/src/main/java/com/baeldung/MongoExample.java new file mode 100644 index 0000000000..fbef17a15f --- /dev/null +++ b/java-mongodb/src/main/java/com/baeldung/MongoExample.java @@ -0,0 +1,53 @@ +package com.baeldung; + +import com.mongodb.BasicDBObject; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBCursor; +import com.mongodb.MongoClient; + +public class MongoExample { + public static void main( String[] args ) { + + MongoClient mongoClient = new MongoClient("localhost", 27017); + + DB database = mongoClient.getDB("myMongoDb"); + + // print existing databases + mongoClient.getDatabaseNames().forEach(System.out::println); + + database.createCollection("customers", null); + + // print all collections in customers database + database.getCollectionNames().forEach(System.out::println); + + // create data + DBCollection collection = database.getCollection("customers"); + BasicDBObject document = new BasicDBObject(); + document.put("name", "Shubham"); + document.put("company", "Baeldung"); + collection.insert(document); + + // update data + BasicDBObject query = new BasicDBObject(); + query.put("name", "Shubham"); + BasicDBObject newDocument = new BasicDBObject(); + newDocument.put("name", "John"); + BasicDBObject updateObject = new BasicDBObject(); + updateObject.put("$set", newDocument); + collection.update(query, updateObject); + + // read data + BasicDBObject searchQuery = new BasicDBObject(); + searchQuery.put("name", "John"); + DBCursor cursor = collection.find(searchQuery); + while (cursor.hasNext()) { + System.out.println(cursor.next()); + } + + // delete data + BasicDBObject deleteQuery = new BasicDBObject(); + deleteQuery.put("name", "John"); + collection.remove(deleteQuery); + } +} diff --git a/java-mongodb/src/test/java/com/baeldung/AppTest.java b/java-mongodb/src/test/java/com/baeldung/AppTest.java new file mode 100644 index 0000000000..5dd6bb66a9 --- /dev/null +++ b/java-mongodb/src/test/java/com/baeldung/AppTest.java @@ -0,0 +1,72 @@ +package com.baeldung; + +import static org.junit.Assert.assertEquals; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import com.mongodb.BasicDBObject; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBCursor; +import com.mongodb.Mongo; +import de.flapdoodle.embedmongo.MongoDBRuntime; +import de.flapdoodle.embedmongo.MongodExecutable; +import de.flapdoodle.embedmongo.MongodProcess; +import de.flapdoodle.embedmongo.config.MongodConfig; +import de.flapdoodle.embedmongo.distribution.Version; +import de.flapdoodle.embedmongo.runtime.Network; + +public class AppTest { + + private static final String DB_NAME = "myMongoDb"; + private MongodExecutable mongodExe; + private MongodProcess mongod; + private Mongo mongo; + private DB db; + private DBCollection collection; + + @Before + public void setup() throws Exception { + + // Creating Mongodbruntime instance + MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance(); + + // Creating MongodbExecutable + mongodExe = runtime.prepare(new MongodConfig(Version.V2_0_1, 12345, + Network.localhostIsIPv6())); + + // Starting Mongodb + mongod = mongodExe.start(); + mongo = new Mongo("localhost", 12345); + + // Creating DB + db = mongo.getDB(DB_NAME); + + // Creating collection Object and adding values + collection = db.getCollection("customers"); + } + + @After + public void teardown() throws Exception { + mongod.stop(); + mongodExe.cleanup(); + } + + @Test + public void testAddressPersistance() { + + BasicDBObject contact = new BasicDBObject(); + contact.put("name", "John"); + contact.put("company", "Baeldung"); + + // Inserting document + collection.insert(contact); + DBCursor cursorDoc = collection.find(); + BasicDBObject contact1 = new BasicDBObject(); + while (cursorDoc.hasNext()) { + contact1 = (BasicDBObject) cursorDoc.next(); + System.out.println(contact1); + } + assertEquals(contact1.get("name"), "John"); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 30503a0a9a..c590183137 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 com.baeldung parent-modules @@ -175,6 +174,7 @@ xml xmlunit2 xstream -
    + java-mongodb + - + \ No newline at end of file From f221faca4c62a9e35534faf62a2e73c091147cbc Mon Sep 17 00:00:00 2001 From: tschiman Date: Mon, 9 Jan 2017 23:26:30 -0700 Subject: [PATCH 051/120] BAEL-442 Adding spring-sleuth module and supporting code for application. --- pom.xml | 1 + spring-sleuth/pom.xml | 64 +++++++++++++++++ .../spring/session/SchedulingService.java | 26 +++++++ .../spring/session/SleuthController.java | 71 +++++++++++++++++++ .../spring/session/SleuthService.java | 46 ++++++++++++ .../baeldung/spring/session/SleuthWebApp.java | 11 +++ .../baeldung/spring/session/ThreadConfig.java | 56 +++++++++++++++ .../src/main/resources/application.properties | 1 + 8 files changed, 276 insertions(+) create mode 100644 spring-sleuth/pom.xml create mode 100644 spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java create mode 100644 spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java create mode 100644 spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java create mode 100644 spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java create mode 100644 spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java create mode 100644 spring-sleuth/src/main/resources/application.properties diff --git a/pom.xml b/pom.xml index c590183137..4ae672d6c8 100644 --- a/pom.xml +++ b/pom.xml @@ -160,6 +160,7 @@ spring-security-rest spring-security-x509 spring-session + spring-sleuth spring-social-login spring-spel spring-thymeleaf diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml new file mode 100644 index 0000000000..80415dc00d --- /dev/null +++ b/spring-sleuth/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + com.baeldung + spring-sleuth + 1.0.0-SNAPSHOT + jar + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR3 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + \ No newline at end of file diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java new file mode 100644 index 0000000000..70d4270b41 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +public class SchedulingService { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SleuthService sleuthService; + + @Autowired + public SchedulingService(SleuthService sleuthService) { + this.sleuthService = sleuthService; + } + + @Scheduled(fixedDelay = 30000) + public void scheduledWork() throws InterruptedException { + logger.info("Start some work from the scheduled task"); + sleuthService.asyncMethod(); + logger.info("End work from scheduled task"); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java new file mode 100644 index 0000000000..eeaed15bea --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java @@ -0,0 +1,71 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.Executor; + +@RestController +public class SleuthController { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SleuthService sleuthService; + private final Executor executor; + + @Autowired + public SleuthController(SleuthService sleuthService, Executor executor) { + this.sleuthService = sleuthService; + this.executor = executor; + } + + @GetMapping("/") + public String helloSleuth() { + logger.info("Hello Sleuth"); + return "success"; + } + + @GetMapping("/same-span") + public String helloSleuthSameSpan() throws InterruptedException { + logger.info("Same Span"); + sleuthService.doSomeWorkSameSpan(); + return "success"; + } + + @GetMapping("/new-span") + public String helloSleuthNewSpan() throws InterruptedException { + logger.info("New Span"); + sleuthService.doSomeWorkNewSpan(); + return "success"; + } + + @GetMapping("/new-thread") + public String helloSleuthNewThread() { + logger.info("New Thread"); + Runnable runnable = () -> { + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + logger.info("I'm inside the new thread - with a new span"); + }; + executor.execute(runnable); + + logger.info("I'm done - with the original span"); + return "success"; + } + + @GetMapping("/async") + public String helloSleuthAsync() throws InterruptedException { + logger.info("Before Async Method Call"); + sleuthService.asyncMethod(); + logger.info("After Async Method Call"); + return "success"; + } + + + +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java new file mode 100644 index 0000000000..38480a9b91 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java @@ -0,0 +1,46 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service +public class SleuthService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Tracer tracer; + + @Autowired + public SleuthService(Tracer tracer) { + this.tracer = tracer; + } + + public void doSomeWorkSameSpan() throws InterruptedException { + Thread.sleep(1000L); + logger.info("Doing some work"); + } + + public void doSomeWorkNewSpan() throws InterruptedException { + logger.info("I'm in the original span"); + + Span newSpan = tracer.createSpan("newSpan"); + try { + Thread.sleep(1000L); + logger.info("I'm in the new span doing some cool work that needs its own span"); + } finally { + tracer.close(newSpan); + } + + logger.info("I'm in the original span"); + } + + @Async + public void asyncMethod() throws InterruptedException { + logger.info("Start Async Method"); + Thread.sleep(1000L); + logger.info("End Async Method"); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java new file mode 100644 index 0000000000..eb57231f53 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.session; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SleuthWebApp { + public static void main(String[] args) { + SpringApplication.run(SleuthWebApp.class, args); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java new file mode 100644 index 0000000000..56cabee443 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java @@ -0,0 +1,56 @@ +package com.baeldung.spring.session; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.sleuth.instrument.async.LazyTraceExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurerSupport; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +@Configuration +@EnableAsync +@EnableScheduling +public class ThreadConfig extends AsyncConfigurerSupport implements SchedulingConfigurer{ + + @Autowired + private BeanFactory beanFactory; + + @Bean + public Executor executor() { + return makeExecutor(); + } + + @Override + public Executor getAsyncExecutor() { + return makeExecutor(); + } + + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + scheduledTaskRegistrar.setScheduler(schedulingExecutor()); + } + + @Bean(destroyMethod = "shutdown") + public Executor schedulingExecutor() { + return Executors.newScheduledThreadPool(100); + } + + private Executor makeExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(5); + threadPoolTaskExecutor.setMaxPoolSize(10); + threadPoolTaskExecutor.initialize(); + + return new LazyTraceExecutor(beanFactory, threadPoolTaskExecutor); + } + + +} diff --git a/spring-sleuth/src/main/resources/application.properties b/spring-sleuth/src/main/resources/application.properties new file mode 100644 index 0000000000..2678b57b0c --- /dev/null +++ b/spring-sleuth/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=Baeldung Sleuth Tutorial \ No newline at end of file From aacc25a75204f69e4876a8a901d313671e3ac8a8 Mon Sep 17 00:00:00 2001 From: Sunil Mogadati Date: Tue, 10 Jan 2017 00:51:36 -0700 Subject: [PATCH 052/120] BAEL-245: Add more tests to align with previous enum example and prevent build fail (#981) * Add NDC and JBoss Logging to the demo application * NDC for Log4j, Log4j2 and JBoss Logging * Simplify NDC example by making it a single operation instead of two * Make NDC example as RestController, Use JBoss Logging only as a logging bridge * Fix merge conflicts in pull request - log-mdc pom.xml updated * BAEL-445 Update to Spring security SpEL example * BAEL-445: Change tabs to spaces in the updated code * BAEL-245: Add Enum Serialization exmaple * BAEL-245: Remove the folder jackson/src/test/java/com/baeldung/jackson/dtos/withEnum as the example is not used anymore * Add more enum serialization examples to align with previous example and prevent build fail --- .../dtos/withEnum/DistanceEnumSimple.java | 26 ++++++++ .../withEnum/DistanceEnumWithJsonFormat.java | 29 +++++++++ .../dtos/withEnum/DistanceEnumWithValue.java | 29 +++++++++ .../dtos/withEnum/MyDtoWithEnumCustom.java | 59 +++++++++++++++++++ .../withEnum/MyDtoWithEnumJsonFormat.java | 57 ++++++++++++++++++ .../jackson/test/JacksonAnnotationTest.java | 47 ++++++++++----- .../JacksonSerializationEnumsUnitTest.java | 42 ++++++------- 7 files changed, 249 insertions(+), 40 deletions(-) create mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumSimple.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithJsonFormat.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithValue.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumJsonFormat.java diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumSimple.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumSimple.java new file mode 100644 index 0000000000..1118fb349a --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumSimple.java @@ -0,0 +1,26 @@ +package com.baeldung.jackson.dtos.withEnum; + +public enum DistanceEnumSimple { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumSimple(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithJsonFormat.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithJsonFormat.java new file mode 100644 index 0000000000..7dc6bb559b --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithJsonFormat.java @@ -0,0 +1,29 @@ +package com.baeldung.jackson.dtos.withEnum; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum DistanceEnumWithJsonFormat { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumWithJsonFormat(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithValue.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithValue.java new file mode 100644 index 0000000000..69c476d8a5 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/DistanceEnumWithValue.java @@ -0,0 +1,29 @@ +package com.baeldung.jackson.dtos.withEnum; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum DistanceEnumWithValue { + KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001); + + private String unit; + private final double meters; + + private DistanceEnumWithValue(String unit, double meters) { + this.unit = unit; + this.meters = meters; + } + + @JsonValue + public double getMeters() { + return meters; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java new file mode 100644 index 0000000000..bf9b7db395 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumCustom.java @@ -0,0 +1,59 @@ +package com.baeldung.jackson.dtos.withEnum; + +import com.baeldung.jackson.enums.Distance; + +public class MyDtoWithEnumCustom { + + private String stringValue; + private int intValue; + private boolean booleanValue; + private Distance type; + + public MyDtoWithEnumCustom() { + super(); + } + + public MyDtoWithEnumCustom(final String stringValue, final int intValue, final boolean booleanValue, final Distance type) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + this.type = type; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public Distance getType() { + return type; + } + + public void setType(final Distance type) { + this.type = type; + } + +} diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumJsonFormat.java b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumJsonFormat.java new file mode 100644 index 0000000000..8e2f1b835f --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/dtos/withEnum/MyDtoWithEnumJsonFormat.java @@ -0,0 +1,57 @@ +package com.baeldung.jackson.dtos.withEnum; + +public class MyDtoWithEnumJsonFormat { + + private String stringValue; + private int intValue; + private boolean booleanValue; + private DistanceEnumWithJsonFormat distanceType; + + public MyDtoWithEnumJsonFormat() { + super(); + } + + public MyDtoWithEnumJsonFormat(final String stringValue, final int intValue, final boolean booleanValue, final DistanceEnumWithJsonFormat type) { + super(); + + this.stringValue = stringValue; + this.intValue = intValue; + this.booleanValue = booleanValue; + this.distanceType = type; + } + + // API + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(final String stringValue) { + this.stringValue = stringValue; + } + + public int getIntValue() { + return intValue; + } + + public void setIntValue(final int intValue) { + this.intValue = intValue; + } + + public boolean isBooleanValue() { + return booleanValue; + } + + public void setBooleanValue(final boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public DistanceEnumWithJsonFormat getDistanceType() { + return distanceType; + } + + public void setDistanceType(final DistanceEnumWithJsonFormat type) { + this.distanceType = type; + } + +} diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java index f2464d4251..9351b929d3 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonAnnotationTest.java @@ -1,6 +1,32 @@ package com.baeldung.jackson.test; -import com.baeldung.jackson.annotation.*; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import org.junit.Test; + +import com.baeldung.jackson.annotation.BeanWithCreator; +import com.baeldung.jackson.annotation.BeanWithCustomAnnotation; +import com.baeldung.jackson.annotation.BeanWithFilter; +import com.baeldung.jackson.annotation.BeanWithGetter; +import com.baeldung.jackson.annotation.BeanWithIgnore; +import com.baeldung.jackson.annotation.BeanWithInject; +import com.baeldung.jackson.annotation.ExtendableBean; +import com.baeldung.jackson.annotation.MyBean; +import com.baeldung.jackson.annotation.PrivateBean; +import com.baeldung.jackson.annotation.RawBean; +import com.baeldung.jackson.annotation.UnwrappedUser; +import com.baeldung.jackson.annotation.UserWithIgnoreType; +import com.baeldung.jackson.annotation.Zoo; import com.baeldung.jackson.bidirection.ItemWithIdentity; import com.baeldung.jackson.bidirection.ItemWithRef; import com.baeldung.jackson.bidirection.UserWithIdentity; @@ -8,7 +34,7 @@ import com.baeldung.jackson.bidirection.UserWithRef; import com.baeldung.jackson.date.EventWithFormat; import com.baeldung.jackson.date.EventWithSerializer; import com.baeldung.jackson.dtos.MyMixInForIgnoreType; -import com.baeldung.jackson.dtos.withEnum.TypeEnumWithValue; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumWithValue; import com.baeldung.jackson.exception.UserWithRoot; import com.baeldung.jackson.jsonview.Item; import com.baeldung.jackson.jsonview.Views; @@ -20,17 +46,6 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; -import org.junit.Test; - -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; public class JacksonAnnotationTest { @@ -85,10 +100,10 @@ public class JacksonAnnotationTest { } @Test - public void whenSerializingUsingJsonValue_thenCorrect() throws JsonProcessingException { - final String enumAsString = new ObjectMapper().writeValueAsString(TypeEnumWithValue.TYPE1); + public void whenSerializingUsingJsonValue_thenCorrect() throws IOException { + final String enumAsString = new ObjectMapper().writeValueAsString(DistanceEnumWithValue.MILE); - assertThat(enumAsString, is("\"Type A\"")); + assertThat(enumAsString, is("1609.34")); } @Test diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java index 78c6316aa6..0f57d26d8b 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonSerializationEnumsUnitTest.java @@ -6,14 +6,14 @@ import static org.junit.Assert.assertThat; import java.io.IOException; -import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnum; -import com.baeldung.jackson.dtos.withEnum.TypeEnum; -import com.baeldung.jackson.dtos.withEnum.TypeEnumSimple; -import com.baeldung.jackson.dtos.withEnum.TypeEnumWithValue; -import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnumCustom; -import com.baeldung.jackson.dtos.withEnum.TypeEnumWithCustomSerializer; import org.junit.Test; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumSimple; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumWithJsonFormat; +import com.baeldung.jackson.dtos.withEnum.DistanceEnumWithValue; +import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnumCustom; +import com.baeldung.jackson.dtos.withEnum.MyDtoWithEnumJsonFormat; +import com.baeldung.jackson.enums.Distance; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -24,10 +24,9 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void whenSerializingASimpleEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(TypeEnumSimple.TYPE1); - System.out.println(enumAsString); + final String enumAsString = mapper.writeValueAsString(DistanceEnumSimple.MILE); - assertThat(enumAsString, containsString("TYPE1")); + assertThat(enumAsString, containsString("MILE")); } // tests - enum with main value @@ -35,10 +34,9 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void whenSerializingAEnumWithValue_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(TypeEnumWithValue.TYPE1); - System.out.println(enumAsString); + final String enumAsString = mapper.writeValueAsString(DistanceEnumWithValue.MILE); - assertThat(enumAsString, is("\"Type A\"")); + assertThat(enumAsString, is("1609.34")); } // tests - enum @@ -46,28 +44,25 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void whenSerializingAnEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(TypeEnum.TYPE1); + final String enumAsString = mapper.writeValueAsString(DistanceEnumWithJsonFormat.MILE); - System.out.println(enumAsString); - assertThat(enumAsString, containsString("\"name\":\"Type A\"")); + assertThat(enumAsString, containsString("\"meters\":1609.34")); } @Test public final void whenSerializingEntityWithEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnum("a", 1, true, TypeEnum.TYPE1)); + final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumJsonFormat("a", 1, true, DistanceEnumWithJsonFormat.MILE)); - System.out.println(enumAsString); - assertThat(enumAsString, containsString("\"name\":\"Type A\"")); + assertThat(enumAsString, containsString("\"meters\":1609.34")); } @Test public final void whenSerializingArrayOfEnums_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String json = mapper.writeValueAsString(new TypeEnum[] { TypeEnum.TYPE1, TypeEnum.TYPE2 }); + final String json = mapper.writeValueAsString(new DistanceEnumWithJsonFormat[] { DistanceEnumWithJsonFormat.MILE, DistanceEnumWithJsonFormat.KILOMETER }); - System.out.println(json); - assertThat(json, containsString("\"name\":\"Type A\"")); + assertThat(json, containsString("\"meters\":1609.34")); } // tests - enum with custom serializer @@ -75,10 +70,9 @@ public class JacksonSerializationEnumsUnitTest { @Test public final void givenCustomSerializer_whenSerializingEntityWithEnum_thenCorrect() throws JsonParseException, IOException { final ObjectMapper mapper = new ObjectMapper(); - final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumCustom("a", 1, true, TypeEnumWithCustomSerializer.TYPE1)); + final String enumAsString = mapper.writeValueAsString(new MyDtoWithEnumCustom("a", 1, true, Distance.MILE)); - System.out.println(enumAsString); - assertThat(enumAsString, containsString("\"name\":\"Type A\"")); + assertThat(enumAsString, containsString("\"meters\":1609.34")); } } From 1423907bf0dc51d1dccf578c4d12a3aab048620b Mon Sep 17 00:00:00 2001 From: eugenp Date: Tue, 10 Jan 2017 16:13:20 +0200 Subject: [PATCH 053/120] cleanup work --- spring-data-mongodb/pom.xml | 9 +++++---- .../{GridFSIntegrationTest.java => GridFSLiveTest.java} | 2 +- ...ryIntegrationTest.java => DocumentQueryLiveTest.java} | 2 +- ...egrationTest.java => MongoTemplateQueryLiveTest.java} | 2 +- ...eQueryIntegrationTest.java => BaseQueryLiveTest.java} | 2 +- ...SLQueryIntegrationTest.java => DSLQueryLiveTest.java} | 2 +- ...NQueryIntegrationTest.java => JSONQueryLiveTest.java} | 2 +- ...odsIntegrationTest.java => QueryMethodsLiveTest.java} | 2 +- ...yIntegrationTest.java => UserRepositoryLiveTest.java} | 2 +- spring-mvc-java/pom.xml | 4 ++-- 10 files changed, 15 insertions(+), 14 deletions(-) rename spring-data-mongodb/src/test/java/org/baeldung/gridfs/{GridFSIntegrationTest.java => GridFSLiveTest.java} (99%) rename spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/{DocumentQueryIntegrationTest.java => DocumentQueryLiveTest.java} (99%) rename spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/{MongoTemplateQueryIntegrationTest.java => MongoTemplateQueryLiveTest.java} (99%) rename spring-data-mongodb/src/test/java/org/baeldung/repository/{BaseQueryIntegrationTest.java => BaseQueryLiveTest.java} (94%) rename spring-data-mongodb/src/test/java/org/baeldung/repository/{DSLQueryIntegrationTest.java => DSLQueryLiveTest.java} (97%) rename spring-data-mongodb/src/test/java/org/baeldung/repository/{JSONQueryIntegrationTest.java => JSONQueryLiveTest.java} (97%) rename spring-data-mongodb/src/test/java/org/baeldung/repository/{QueryMethodsIntegrationTest.java => QueryMethodsLiveTest.java} (97%) rename spring-data-mongodb/src/test/java/org/baeldung/repository/{UserRepositoryIntegrationTest.java => UserRepositoryLiveTest.java} (99%) diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 7d7c9cd590..726fcf5f25 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 com.baeldung @@ -160,10 +161,10 @@ - + UTF-8 - + 4.3.4.RELEASE 1.8.6.RELEASE @@ -177,7 +178,7 @@ 1.7.21 1.1.7 3.6.0 - 2.19.1 + 2.19.1 diff --git a/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSLiveTest.java index bb4b268ca7..3853a406fb 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/gridfs/GridFSLiveTest.java @@ -33,7 +33,7 @@ import com.mongodb.gridfs.GridFSDBFile; @ContextConfiguration("file:src/main/resources/mongoConfig.xml") @RunWith(SpringJUnit4ClassRunner.class) -public class GridFSIntegrationTest { +public class GridFSLiveTest { private final Logger logger = LoggerFactory.getLogger(getClass()); diff --git a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryLiveTest.java index cf46c6ed6e..df3ebcb2d2 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/DocumentQueryLiveTest.java @@ -25,7 +25,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class DocumentQueryIntegrationTest { +public class DocumentQueryLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java index 1701b9ac5a..76162c6096 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java @@ -28,7 +28,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class MongoTemplateQueryIntegrationTest { +public class MongoTemplateQueryLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryLiveTest.java similarity index 94% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryLiveTest.java index 8572cc858e..afd7259c6c 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/BaseQueryLiveTest.java @@ -7,7 +7,7 @@ import org.junit.Before; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; -public class BaseQueryIntegrationTest { +public class BaseQueryLiveTest { @Autowired protected UserRepository userRepository; diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryLiveTest.java similarity index 97% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryLiveTest.java index ca8d46a97a..03fd38c796 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/DSLQueryLiveTest.java @@ -17,7 +17,7 @@ import com.mysema.query.types.Predicate; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class DSLQueryIntegrationTest extends BaseQueryIntegrationTest { +public class DSLQueryLiveTest extends BaseQueryLiveTest { @Test public void givenUsersExist_whenFindingUsersByName_thenUserAreFound() { diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryLiveTest.java similarity index 97% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryLiveTest.java index ed88429792..9464a4eb52 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/JSONQueryLiveTest.java @@ -14,7 +14,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class JSONQueryIntegrationTest extends BaseQueryIntegrationTest { +public class JSONQueryLiveTest extends BaseQueryLiveTest { @Test public void givenUsersExist_whenFindingUsersByName_thenUsersAreFound() { diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsLiveTest.java similarity index 97% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsLiveTest.java index f7c35c8de2..5705c119b8 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/QueryMethodsLiveTest.java @@ -14,7 +14,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class QueryMethodsIntegrationTest extends BaseQueryIntegrationTest { +public class QueryMethodsLiveTest extends BaseQueryLiveTest { @Test public void givenUsersExist_whenFindingUsersByName_thenUsersAreFound() { diff --git a/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryLiveTest.java similarity index 99% rename from spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java rename to spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryLiveTest.java index 53cadc09bc..1543b847ba 100644 --- a/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java +++ b/spring-data-mongodb/src/test/java/org/baeldung/repository/UserRepositoryLiveTest.java @@ -24,7 +24,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class UserRepositoryIntegrationTest { +public class UserRepositoryLiveTest { @Autowired private UserRepository userRepository; diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index 38443f2022..7d0cc24d41 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -323,9 +323,9 @@ - + - + 4.3.4.RELEASE From 6e9b667aef2a2e0bb1d0ecc0b4fbedbaaf44aa2b Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Tue, 10 Jan 2017 12:34:18 -0600 Subject: [PATCH 054/120] Update README.md --- spring-thymeleaf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 6b12bb676c..67bdddaf64 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -8,6 +8,7 @@ - [Thymeleaf: Custom Layout Dialect](http://www.baeldung.com/thymeleaf-spring-layouts) - [Spring and Thymeleaf 3: Expressions](http://www.baeldung.com/spring-thymeleaf-3-expressions) - [Spring MVC + Thymeleaf 3.0: New Features](http://www.baeldung.com/spring-thymeleaf-3) +- [How to Work with Dates in Thymeleaef](http://www.baeldung.com/dates-in-thymeleaf) ### Build the Project From a0de46efb99efe3ca0151d01b16ca343d6ea4af1 Mon Sep 17 00:00:00 2001 From: Daniele Demichelis Date: Tue, 10 Jan 2017 19:54:07 +0100 Subject: [PATCH 055/120] Intro to Spring Remoting with HTTP Invokers (#964) * First test with log4j rolling appenders * small fix * Log4j rolling appender * First set up with rolling file on log4j 2 * Added logback code. * log4j2 more detailed example * log4j2 more detailed example * Improved names and examples * Fixed configurations * improved configs * formatted * Final fix * fixed formatting * Formatting fix * Fix sample apps to avoid try / catch * Fix request to replace files * Fix end lines * Log4j2 logger is shot down at the end. * Initial commit, the server starts launched from maven * made room for client and server projects * made room for client and server projects * base example works * poms restructured * packages restructured * packages restructured * Some renaming and a proper formatting string * Small renamings * Small renamings * Fixed invoked URL in client through fixing bean name --- spring-remoting/pom.xml | 109 ++++++++++++++++++ spring-remoting/remoting-http/api/pom.xml | 14 +++ .../main/java/com/baeldung/api/Address.java | 26 +++++ .../main/java/com/baeldung/api/Booking.java | 53 +++++++++ .../com/baeldung/api/BookingException.java | 7 ++ .../com/baeldung/api/CabBookingService.java | 5 + spring-remoting/remoting-http/client/pom.xml | 30 +++++ .../com/baeldug/client/CabBookingClient.java | 25 ++++ .../main/java/com/baeldug/client/Main.java | 34 ++++++ spring-remoting/remoting-http/pom.xml | 20 ++++ spring-remoting/remoting-http/server/pom.xml | 65 +++++++++++ .../remoting-http/server/readme.md | 12 ++ .../com/baeldung/server/CabBookingConfig.java | 10 ++ .../server/CabBookingInitializer.java | 34 ++++++ .../server/CabBookingServiceImpl.java | 26 +++++ .../com/baeldung/server/DispatcherConfig.java | 18 +++ .../server/src/main/resources/logback.xml | 27 +++++ 17 files changed, 515 insertions(+) create mode 100644 spring-remoting/pom.xml create mode 100644 spring-remoting/remoting-http/api/pom.xml create mode 100644 spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Address.java create mode 100644 spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java create mode 100644 spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java create mode 100644 spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java create mode 100644 spring-remoting/remoting-http/client/pom.xml create mode 100644 spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java create mode 100644 spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java create mode 100644 spring-remoting/remoting-http/pom.xml create mode 100644 spring-remoting/remoting-http/server/pom.xml create mode 100644 spring-remoting/remoting-http/server/readme.md create mode 100644 spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingConfig.java create mode 100644 spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingInitializer.java create mode 100644 spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java create mode 100644 spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/DispatcherConfig.java create mode 100644 spring-remoting/remoting-http/server/src/main/resources/logback.xml diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml new file mode 100644 index 0000000000..cfb4af9d85 --- /dev/null +++ b/spring-remoting/pom.xml @@ -0,0 +1,109 @@ + + + 4.0.0 + com.baeldung + spring-remoting + 1.0-SNAPSHOT + pom + + + 3.6.0 + 3.0.0 + + 3.1.0 + 1.1.7 + 4.2.4.RELEASE + + + + + + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + + + ch.qos.logback + logback-core + ${logback.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + javax.servlet + javax.servlet-api + ${servlet.version} + provided + + + + + ${project.groupId} + api + ${project.version} + + + + + + + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + true + true + 1.8 + 1.8 + UTF-8 + true + true + + + + + maven-war-plugin + 3.0.0 + + false + + + + + + + + remoting-http + + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/api/pom.xml b/spring-remoting/remoting-http/api/pom.xml new file mode 100644 index 0000000000..633217f7de --- /dev/null +++ b/spring-remoting/remoting-http/api/pom.xml @@ -0,0 +1,14 @@ + + + + spring-remoting-http + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + api + spring-remoting-http-api + API definition shared between client and server. + \ No newline at end of file diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Address.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Address.java new file mode 100644 index 0000000000..f2382fabd9 --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Address.java @@ -0,0 +1,26 @@ +package com.baeldung.api; + +import java.io.Serializable; + +public class Address implements Serializable{ + + private String address; + private String countryCode; + + public Address(String address, String countryCode) { + this.address = address; + this.countryCode = countryCode; + } + + public String getAddress() { + return address; + } + + public String getCountryCode() { + return countryCode; + } + + @Override public String toString() { + return address + " (" + countryCode + ")"; + } +} diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java new file mode 100644 index 0000000000..0f52a7bfbd --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java @@ -0,0 +1,53 @@ +package com.baeldung.api; + +import java.io.Serializable; +import java.util.Date; + +public class Booking implements Serializable { + + private int costInCent; + private int etaInSeconds; + private String bookingCode; + private Date pickUptime; + private Address pickUpAddress; + private Address dropOffAddress; + + public Booking(Address pickUpAddress, Date pickUptime, Address dropOffAddress, int costInCent, int etaInSeconds, String bookingCode) { + this.costInCent = costInCent; + this.etaInSeconds = etaInSeconds; + this.bookingCode = bookingCode; + this.pickUptime = pickUptime; + this.pickUpAddress = pickUpAddress; + this.dropOffAddress = dropOffAddress; + } + + public int getCostInCent() { + return costInCent; + } + + public int getEtaInSeconds() { + return etaInSeconds; + } + + public String getBookingCode() { + return bookingCode; + } + + public Date getPickUptime() { + return pickUptime; + } + + public Address getDropOffAddress() { + return dropOffAddress; + } + + @Override public String toString() { + return String.format("Booking: pick up @ %tr in %s, drop down in %s after %d minutes, %.2f $.", pickUptime, pickUpAddress, dropOffAddress, etaInSeconds/60, costInCent/100.0); + } + + public static void main(String[] args) throws InterruptedException { + System.out.println( + new Booking(new Address("a", "b"), new Date(), new Address("c", "d"), 123_00, 600, "abc") + ); + } +} diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java new file mode 100644 index 0000000000..4099db2908 --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java @@ -0,0 +1,7 @@ +package com.baeldung.api; + +public class BookingException extends Exception { + public BookingException(String message) { + super(message); + } +} diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java new file mode 100644 index 0000000000..25b27264e8 --- /dev/null +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java @@ -0,0 +1,5 @@ +package com.baeldung.api; + +public interface CabBookingService { + Booking bookPickUp(Address pickUpLocation, Address dropOffLocation, int pax) throws BookingException; +} diff --git a/spring-remoting/remoting-http/client/pom.xml b/spring-remoting/remoting-http/client/pom.xml new file mode 100644 index 0000000000..77891c106a --- /dev/null +++ b/spring-remoting/remoting-http/client/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + + com.baeldung + spring-remoting-http + 1.0-SNAPSHOT + + + spring-remoting-http-client + Shows how to invoke a remote service using Spring Remoting. + + + + + org.springframework + spring-web + + + + + ${project.groupId} + api + + + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java new file mode 100644 index 0000000000..7cc8e5183c --- /dev/null +++ b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java @@ -0,0 +1,25 @@ +package com.baeldug.client; + +import com.baeldung.api.*; + +public class CabBookingClient { + + private CabBookingService cabService; + + public CabBookingClient(CabBookingService cabService) { + this.cabService = cabService; + } + + public void run() { + + Address pickUp = new Address("13 Seagate Blvd, Key Largo, FL 33037", "US"); + Address dropDown = new Address("91831 Overseas Hwy, Tavernier, FL 33070", "US"); + try { + System.out.println( cabService.bookPickUp(pickUp, dropDown, 3) ); + } catch (BookingException e) { + e.printStackTrace(); + } + + } + +} diff --git a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java new file mode 100644 index 0000000000..0ddb37c508 --- /dev/null +++ b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java @@ -0,0 +1,34 @@ +package com.baeldug.client; + +import com.baeldung.api.CabBookingService; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean; + +@Configuration +public class Main { + + @Bean + public HttpInvokerProxyFactoryBean invoker() { + HttpInvokerProxyFactoryBean invoker = new HttpInvokerProxyFactoryBean(); + invoker.setServiceUrl("http://localhost:9090/spring-remoting-http-server/booking"); + invoker.setServiceInterface(CabBookingService.class); + return invoker; + } + + @Bean + public CabBookingClient client(CabBookingService service){ + return new CabBookingClient(service); + } + + public static void main(String[] args) throws InterruptedException { + AnnotationConfigApplicationContext rootContext = + new AnnotationConfigApplicationContext(); + rootContext.scan(Main.class.getPackage().getName()); + rootContext.refresh(); + CabBookingClient bean = rootContext.getBean(CabBookingClient.class); + bean.run(); + } + +} diff --git a/spring-remoting/remoting-http/pom.xml b/spring-remoting/remoting-http/pom.xml new file mode 100644 index 0000000000..0d08779bd7 --- /dev/null +++ b/spring-remoting/remoting-http/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.baeldung + spring-remoting + 1.0-SNAPSHOT + + spring-remoting-http + Parent for all modules related to HTTP Spring Remoting + pom + + + server + client + api + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/server/pom.xml b/spring-remoting/remoting-http/server/pom.xml new file mode 100644 index 0000000000..32a99716a5 --- /dev/null +++ b/spring-remoting/remoting-http/server/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.baeldung + spring-remoting-http + 1.0-SNAPSHOT + + war + + spring-remoting-http-server + Shows how to expose a service using Spring Remoting + + + 2.2 + + + + + + + + + org.springframework + spring-webmvc + + + + + javax.servlet + javax.servlet-api + + + + + ${project.groupId} + api + + + + + + + + maven-compiler-plugin + + + + maven-war-plugin + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + ${tomcat7-maven-plugin.version} + + 9090 + + + + + + \ No newline at end of file diff --git a/spring-remoting/remoting-http/server/readme.md b/spring-remoting/remoting-http/server/readme.md new file mode 100644 index 0000000000..4a2abb5d03 --- /dev/null +++ b/spring-remoting/remoting-http/server/readme.md @@ -0,0 +1,12 @@ +Build and launch with the following command. + + mvn clean package tomcat7:run-war + +Exposed service is available at following URL. + + http://localhost:9090/spring-remoting-http-server/account + +## References + + + diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingConfig.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingConfig.java new file mode 100644 index 0000000000..146d2ecadb --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.server; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CabBookingConfig { + + + +} diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingInitializer.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingInitializer.java new file mode 100644 index 0000000000..53b3fd5faf --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingInitializer.java @@ -0,0 +1,34 @@ +package com.baeldung.server; + +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +import javax.servlet.ServletContext; +import javax.servlet.ServletRegistration; + +public class CabBookingInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext container) { + AnnotationConfigWebApplicationContext rootContext = + new AnnotationConfigWebApplicationContext(); + rootContext.register(CabBookingConfig.class); + + // Manage the lifecycle of the root application context + container.addListener(new ContextLoaderListener(rootContext)); + + // Create the dispatcher servlet's Spring application context + AnnotationConfigWebApplicationContext dispatcherContext = + new AnnotationConfigWebApplicationContext(); + dispatcherContext.register(DispatcherConfig.class); + + // Register and map the dispatcher servlet + ServletRegistration.Dynamic dispatcher = + container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); + dispatcher.setLoadOnStartup(1); + dispatcher.addMapping("/*"); + } + +} diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java new file mode 100644 index 0000000000..5f43c7e707 --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java @@ -0,0 +1,26 @@ +package com.baeldung.server; + +import com.baeldung.api.Address; +import com.baeldung.api.Booking; +import com.baeldung.api.BookingException; +import com.baeldung.api.CabBookingService; + +import java.util.Date; + +import static java.lang.Math.random; +import static java.lang.System.currentTimeMillis; +import static java.util.UUID.randomUUID; + +public class CabBookingServiceImpl implements CabBookingService { + + @Override public Booking bookPickUp(Address pickUpLocation, Address dropOffLocation, int pax) throws BookingException { + if(random()<0.3){ + throw new BookingException("Cab unavailable"); + } + int tripTimeInMinutes = (int) (5 + random() * 15); + int costInCent = 15_00 + tripTimeInMinutes * 5 * pax; + Date pickUpDate = new Date((long) (currentTimeMillis() + (1000 * 60 * random() * 15))); + return new Booking(pickUpLocation, pickUpDate, dropOffLocation, costInCent, tripTimeInMinutes * 60, + randomUUID().toString()); + } +} diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/DispatcherConfig.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/DispatcherConfig.java new file mode 100644 index 0000000000..8f9391f8ac --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/DispatcherConfig.java @@ -0,0 +1,18 @@ +package com.baeldung.server; + +import com.baeldung.api.CabBookingService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter; + +@Configuration +public class DispatcherConfig { + + @Bean(name = "/booking") HttpInvokerServiceExporter accountService() { + HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter(); + exporter.setService( new CabBookingServiceImpl() ); + exporter.setServiceInterface( CabBookingService.class ); + return exporter; + } + +} diff --git a/spring-remoting/remoting-http/server/src/main/resources/logback.xml b/spring-remoting/remoting-http/server/src/main/resources/logback.xml new file mode 100644 index 0000000000..7a03574f40 --- /dev/null +++ b/spring-remoting/remoting-http/server/src/main/resources/logback.xml @@ -0,0 +1,27 @@ + + + + + + + + ${logPattern} + + + + + C:\Users\danidemi\tmp\baledung\app.log + false + + ${logPattern} + + + + + + + + \ No newline at end of file From 4772976bdac504ef2d4f7652024da7588e0f7a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Soares?= Date: Wed, 11 Jan 2017 02:54:12 +0000 Subject: [PATCH 056/120] Exercise snippets only in tests (#982) * Exercise snippets only in tests * Increase Jsoup version --- jsoup/pom.xml | 2 +- .../java/com/baeldung/jsoup/JsoupParser.java | 91 ------------------- .../com/baeldung/jsoup/JsoupParserTest.java | 91 +++++++++++++++++-- 3 files changed, 83 insertions(+), 101 deletions(-) delete mode 100644 jsoup/src/main/java/com/baeldung/jsoup/JsoupParser.java diff --git a/jsoup/pom.xml b/jsoup/pom.xml index 343e139b46..25551cb3d6 100644 --- a/jsoup/pom.xml +++ b/jsoup/pom.xml @@ -25,6 +25,6 @@ 1.8 1.8 - 1.10.1 + 1.10.2 diff --git a/jsoup/src/main/java/com/baeldung/jsoup/JsoupParser.java b/jsoup/src/main/java/com/baeldung/jsoup/JsoupParser.java deleted file mode 100644 index cb86b16888..0000000000 --- a/jsoup/src/main/java/com/baeldung/jsoup/JsoupParser.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.baeldung.jsoup; - -import java.io.IOException; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.parser.Tag; -import org.jsoup.select.Elements; - -public class JsoupParser { - - Document doc; - - public void loadDocument(String blogUrl) throws IOException { - doc = Jsoup.connect(blogUrl).get(); - } - - void loadDocumentCustomized(String blogUrl) throws IOException { - doc = Jsoup.connect(blogUrl) - .userAgent("Mozilla") - .timeout(5000) - .cookie("cookiename", "val234") - .cookie("anothercookie", "ilovejsoup") - .referrer("http://google.com") - .header("headersecurity", "xyz123") - .get(); - } - - void examplesSelectors() { - Elements links = doc.select("a"); - Elements logo = doc.select(".spring-logo--container"); - Elements pagination = doc.select("#pagination_control"); - Elements divsDescendant = doc.select("header div"); - Elements divsDirect = doc.select("header > div"); - - Element pag = doc.getElementById("pagination_control"); - Elements desktopOnly = doc.getElementsByClass("desktopOnly"); - - Elements sections = doc.select("section"); - Element firstSection = sections.first(); - Elements sectionParagraphs = firstSection.select(".paragraph"); - } - - void examplesTraversing() { - Elements sections = doc.select("section"); - - Element firstSection = sections.first(); - Element lastSection = sections.last(); - Element secondSection = sections.get(2); - Elements allParents = firstSection.parents(); - Element parent = firstSection.parent(); - Elements children = firstSection.children(); - Elements siblings = firstSection.siblingElements(); - - sections.stream().forEach(el -> System.out.println("section: " + el)); - } - - void examplesExtracting() { - Element firstArticle = doc.select("article").first(); - Element timeElement = firstArticle.select("time").first(); - String dateTimeOfFirstArticle = timeElement.attr("datetime"); - Element sectionDiv = firstArticle.select("section div").first(); - String sectionDivText = sectionDiv.text(); - String articleHtml = firstArticle.html(); - String outerHtml = firstArticle.outerHtml(); - } - - void examplesModifying() { - Element firstArticle = doc.select("article").first(); - Element timeElement = firstArticle.select("time").first(); - Element sectionDiv = firstArticle.select("section div").first(); - - String dateTimeOfFirstArticle = timeElement.attr("datetime"); - timeElement.attr("datetime", "2016-12-16 15:19:54.3"); - sectionDiv.text("foo bar"); - firstArticle.select("h2").html("
    "); - - Element link = new Element(Tag.valueOf("a"), "") - .text("Checkout this amazing website!") - .attr("href", "http://baeldung.com") - .attr("target", "_blank"); - firstArticle.appendChild(link); - - doc.select("li.navbar-link").remove(); - firstArticle.select("img").remove(); - } - - String getTidyHtml() { - return doc.html(); - } -} diff --git a/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java index 85fd3c3459..aa8b8bad96 100644 --- a/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java +++ b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java @@ -2,6 +2,11 @@ package com.baeldung.jsoup; import java.io.IOException; import org.jsoup.HttpStatusException; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.parser.Tag; +import org.jsoup.select.Elements; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Before; @@ -9,28 +14,96 @@ import org.junit.Test; public class JsoupParserTest { - JsoupParser jsoupParser; + Document doc; @Before - public void setUp() { - jsoupParser = new JsoupParser(); + public void setUp() throws IOException { + doc = Jsoup.connect("https://spring.io/blog").get(); } @Test - public void test404() throws IOException { + public void loadDocument404() throws IOException { try { - jsoupParser.loadDocument("https://spring.io/will-not-be-found"); + doc = Jsoup.connect("https://spring.io/will-not-be-found").get(); } catch (HttpStatusException ex) { assertEquals(404, ex.getStatusCode()); } } @Test - public void testChange() throws IOException { - jsoupParser.loadDocument("http://spring.io/blog"); + public void loadDocumentCustomized() throws IOException { + doc = Jsoup.connect("https://spring.io/blog") + .userAgent("Mozilla") + .timeout(5000) + .cookie("cookiename", "val234") + .cookie("anothercookie", "ilovejsoup") + .referrer("http://google.com") + .header("headersecurity", "xyz123") + .get(); + } - jsoupParser.examplesModifying(); + @Test + public void examplesSelectors() { + Elements links = doc.select("a"); + Elements logo = doc.select(".spring-logo--container"); + Elements pagination = doc.select("#pagination_control"); + Elements divsDescendant = doc.select("header div"); + Elements divsDirect = doc.select("header > div"); - assertTrue(jsoupParser.getTidyHtml().contains("http://baeldung.com")); + Element pag = doc.getElementById("pagination_control"); + Elements desktopOnly = doc.getElementsByClass("desktopOnly"); + + Elements sections = doc.select("section"); + Element firstSection = sections.first(); + Elements sectionParagraphs = firstSection.select(".paragraph"); + } + + @Test + public void examplesTraversing() { + Elements sections = doc.select("section"); + + Element firstSection = sections.first(); + Element lastSection = sections.last(); + Element secondSection = sections.get(2); + Elements allParents = firstSection.parents(); + Element parent = firstSection.parent(); + Elements children = firstSection.children(); + Elements siblings = firstSection.siblingElements(); + + sections.stream().forEach(el -> System.out.println("section: " + el)); + } + + @Test + public void examplesExtracting() { + Element firstArticle = doc.select("article").first(); + Element timeElement = firstArticle.select("time").first(); + String dateTimeOfFirstArticle = timeElement.attr("datetime"); + Element sectionDiv = firstArticle.select("section div").first(); + String sectionDivText = sectionDiv.text(); + String articleHtml = firstArticle.html(); + String outerHtml = firstArticle.outerHtml(); + } + + @Test + public void examplesModifying() { + Element firstArticle = doc.select("article").first(); + Element timeElement = firstArticle.select("time").first(); + Element sectionDiv = firstArticle.select("section div").first(); + + String dateTimeOfFirstArticle = timeElement.attr("datetime"); + timeElement.attr("datetime", "2016-12-16 15:19:54.3"); + sectionDiv.text("foo bar"); + firstArticle.select("h2").html("
    "); + + Element link = new Element(Tag.valueOf("a"), "") + .text("Checkout this amazing website!") + .attr("href", "http://baeldung.com") + .attr("target", "_blank"); + firstArticle.appendChild(link); + + doc.select("li.navbar-link").remove(); + firstArticle.select("img").remove(); + + assertTrue(doc.html().contains("http://baeldung.com")); } } From 94c315c1c2071d33135821f9348a483d43a3c09d Mon Sep 17 00:00:00 2001 From: pivovarit Date: Wed, 11 Jan 2017 07:20:55 +0100 Subject: [PATCH 057/120] Refactor JsoupParserTest --- .../java/com/baeldung/jsoup/JsoupParserTest.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java index aa8b8bad96..ba6d7358bc 100644 --- a/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java +++ b/jsoup/src/test/java/com/baeldung/jsoup/JsoupParserTest.java @@ -1,17 +1,19 @@ package com.baeldung.jsoup; -import java.io.IOException; import org.jsoup.HttpStatusException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.parser.Tag; import org.jsoup.select.Elements; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + public class JsoupParserTest { Document doc; @@ -70,7 +72,7 @@ public class JsoupParserTest { Elements children = firstSection.children(); Elements siblings = firstSection.siblingElements(); - sections.stream().forEach(el -> System.out.println("section: " + el)); + sections.forEach(el -> System.out.println("section: " + el)); } @Test @@ -96,9 +98,9 @@ public class JsoupParserTest { firstArticle.select("h2").html("
    "); Element link = new Element(Tag.valueOf("a"), "") - .text("Checkout this amazing website!") - .attr("href", "http://baeldung.com") - .attr("target", "_blank"); + .text("Checkout this amazing website!") + .attr("href", "http://baeldung.com") + .attr("target", "_blank"); firstArticle.appendChild(link); doc.select("li.navbar-link").remove(); From 3fc01ee7e0db0610711710e5072046383873e50c Mon Sep 17 00:00:00 2001 From: eugenp Date: Wed, 11 Jan 2017 11:45:43 +0200 Subject: [PATCH 058/120] minor formatting cleanup --- annotations/pom.xml | 5 +- apache-cxf/pom.xml | 8 +- apache-fop/pom.xml | 295 ++++++++++++++++++------------------ aspectj/pom.xml | 85 ++++------- assertj/pom.xml | 4 +- autovalue/pom.xml | 2 +- cdi/pom.xml | 6 +- core-java-9/pom.xml | 141 +++++++++-------- couchbase-sdk/pom.xml | 188 +++++++++++------------ deltaspike/pom.xml | 74 ++++----- dozer/pom.xml | 8 +- ejb/pom.xml | 10 +- enterprise-patterns/pom.xml | 7 +- feign/pom.xml | 2 +- 14 files changed, 396 insertions(+), 439 deletions(-) diff --git a/annotations/pom.xml b/annotations/pom.xml index f691674cf1..0ddc17f8a7 100644 --- a/annotations/pom.xml +++ b/annotations/pom.xml @@ -1,7 +1,6 @@ - + parent-modules com.baeldung diff --git a/apache-cxf/pom.xml b/apache-cxf/pom.xml index e2cd7d344a..6849452908 100644 --- a/apache-cxf/pom.xml +++ b/apache-cxf/pom.xml @@ -5,20 +5,20 @@ apache-cxf 0.0.1-SNAPSHOT pom - + cxf-introduction cxf-spring cxf-jaxrs-implementation cxf-aegis - + 4.12 3.6.0 1.5.0 - + junit @@ -27,7 +27,7 @@ test - + install diff --git a/apache-fop/pom.xml b/apache-fop/pom.xml index 4dd61d8f4e..6f89497a7d 100644 --- a/apache-fop/pom.xml +++ b/apache-fop/pom.xml @@ -1,154 +1,155 @@ - - 4.0.0 - com.baeldung - apache-fop - 0.1-SNAPSHOT + + 4.0.0 + com.baeldung + apache-fop + 0.1-SNAPSHOT - apache-fop + apache-fop - + - + - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + - + - - junit - junit - ${junit.version} - test - + + junit + junit + ${junit.version} + test + - - org.hamcrest - hamcrest-core - ${org.hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + - - org.mockito - mockito-core - ${mockito.version} - test - + + org.mockito + mockito-core + ${mockito.version} + test + - + - - org.apache.xmlgraphics - fop - ${fop.version} - - - org.apache.avalon.framework - avalon-framework-api - - - org.apache.avalon.framework - avalon-framework-impl - - - + + org.apache.xmlgraphics + fop + ${fop.version} + + + org.apache.avalon.framework + avalon-framework-api + + + org.apache.avalon.framework + avalon-framework-impl + + + - - avalon-framework - avalon-framework-api - ${avalon-framework.version} - - - avalon-framework - avalon-framework-impl - ${avalon-framework.version} - + + avalon-framework + avalon-framework-api + ${avalon-framework.version} + + + avalon-framework + avalon-framework-impl + ${avalon-framework.version} + - - org.dbdoclet - dbdoclet - ${dbdoclet.version} - + + org.dbdoclet + dbdoclet + ${dbdoclet.version} + - - org.dbdoclet - herold - 6.1.0 - system - ${basedir}/src/test/resources/jars/herold.jar - - - - net.sf.jtidy - jtidy - ${jtidy.version} - + + org.dbdoclet + herold + 6.1.0 + system + ${basedir}/src/test/resources/jars/herold.jar + - + + net.sf.jtidy + jtidy + ${jtidy.version} + - - apache-fop - - - src/main/resources - true - - + - + + apache-fop + + + src/main/resources + true + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.7 - 1.7 - - + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.7 + 1.7 + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + **/*IntegrationTest.java **/*LiveTest.java - - - + + + - + - + @@ -170,7 +171,7 @@ **/*IntegrationTest.java - **/*LiveTest.java + **/*LiveTest.java @@ -185,25 +186,25 @@ - - - 1.1 - 4.3 - 8.0.2 - r938 - - 1.7.21 - 1.1.7 - - 1.3 - 4.12 - 1.10.19 + + 1.1 + 4.3 + 8.0.2 + r938 + + 1.7.21 + 1.1.7 - - 3.6.0 - 2.19.1 + + 1.3 + 4.12 + 1.10.19 - + + 3.6.0 + 2.19.1 + + \ No newline at end of file diff --git a/aspectj/pom.xml b/aspectj/pom.xml index 6e7ef1b961..90b527c14f 100644 --- a/aspectj/pom.xml +++ b/aspectj/pom.xml @@ -12,32 +12,32 @@ aspectjrt ${aspectj.version} - + org.aspectj aspectjweaver ${aspectj.version} - + org.slf4j slf4j-api ${org.slf4j.version} - + ch.qos.logback logback-classic ${logback.version} - + ch.qos.logback logback-core ${logback.version} - + junit @@ -46,34 +46,34 @@ - org.springframework - spring-context - 4.3.4.RELEASE + org.springframework + spring-context + 4.3.4.RELEASE - org.springframework - spring-beans - 4.3.4.RELEASE + org.springframework + spring-beans + 4.3.4.RELEASE - org.springframework - spring-core - 4.3.4.RELEASE + org.springframework + spring-core + 4.3.4.RELEASE - cglib - cglib - 3.2.4 + cglib + cglib + 3.2.4 - org.springframework - spring-aop - 4.3.4.RELEASE + org.springframework + spring-aop + 4.3.4.RELEASE - log4j - log4j - 1.2.17 + log4j + log4j + 1.2.17 @@ -95,9 +95,9 @@ ${source.version} ${source.version} - + - + org.codehaus.mojo aspectj-maven-plugin @@ -111,41 +111,22 @@ ignore ${project.build.sourceEncoding} - - + + compile - test-compile + test-compile - - - + + diff --git a/assertj/pom.xml b/assertj/pom.xml index 0b3bcbacdb..032f33c89d 100644 --- a/assertj/pom.xml +++ b/assertj/pom.xml @@ -54,8 +54,8 @@ 3.1.0 4.12 3.6.1 - + 3.6.0 - + \ No newline at end of file diff --git a/autovalue/pom.xml b/autovalue/pom.xml index 57c4662e5c..32616dc8bc 100644 --- a/autovalue/pom.xml +++ b/autovalue/pom.xml @@ -41,5 +41,5 @@ 4.12 3.6.0 - + diff --git a/cdi/pom.xml b/cdi/pom.xml index 231390ea5c..e5aaeb2c7b 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -45,7 +45,7 @@ - + @@ -61,7 +61,7 @@ - + integration @@ -101,7 +101,7 @@ 1.8.9 2.4.1.Final 4.12 - 2.19.1 + 2.19.1 \ No newline at end of file diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml index bf9325c935..decba19c53 100644 --- a/core-java-9/pom.xml +++ b/core-java-9/pom.xml @@ -1,91 +1,88 @@ - - 4.0.0 - com.baeldung - core-java9 - 0.2-SNAPSHOT + + 4.0.0 + com.baeldung + core-java9 + 0.2-SNAPSHOT - core-java9 + core-java9 - - - apache.snapshots - http://repository.apache.org/snapshots/ - - + + + apache.snapshots + http://repository.apache.org/snapshots/ + + - + - - org.slf4j - slf4j-api - ${org.slf4j.version} - + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + junit + junit + ${junit.version} + test + - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + org.mockito + mockito-core + ${mockito.version} + test + - - junit - junit - ${junit.version} - test - + - - org.mockito - mockito-core - ${mockito.version} - test - + + core-java-9 - + - - core-java-9 + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.9 + 1.9 + true + + - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.9 - 1.9 - true - - + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - + - + + + 1.7.21 - + + 3.6-jigsaw-SNAPSHOT + 2.19.1 - - - 1.7.21 - - - 3.6-jigsaw-SNAPSHOT - 2.19.1 - - - 1.3 - 4.12 - 1.10.19 - + + 1.3 + 4.12 + 1.10.19 + diff --git a/couchbase-sdk/pom.xml b/couchbase-sdk/pom.xml index 6462cfb57a..301fd81c51 100644 --- a/couchbase-sdk/pom.xml +++ b/couchbase-sdk/pom.xml @@ -1,91 +1,91 @@ - 4.0.0 - com.baeldung - couchbase-sdk - 0.1-SNAPSHOT - jar - couchbase-sdk - Couchbase SDK Tutorials + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + couchbase-sdk + 0.1-SNAPSHOT + jar + couchbase-sdk + Couchbase SDK Tutorials - - - - com.couchbase.client - java-client - ${couchbase.client.version} - + + + + com.couchbase.client + java-client + ${couchbase.client.version} + - - - org.springframework - spring-context - ${spring-framework.version} - - - org.springframework - spring-context-support - ${spring-framework.version} - + + + org.springframework + spring-context + ${spring-framework.version} + + + org.springframework + spring-context-support + ${spring-framework.version} + - - - org.slf4j - slf4j-api - ${org.slf4j.version} - compile - - - ch.qos.logback - logback-classic - ${logback.version} - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - + + + org.slf4j + slf4j-api + ${org.slf4j.version} + compile + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + - - - org.springframework - spring-test - ${spring-framework.version} - test - - - junit - junit - ${junit.version} - test - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - test - - + + + org.springframework + spring-test + ${spring-framework.version} + test + + + junit + junit + ${junit.version} + test + - - - - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - - - + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + test + + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + org.apache.maven.plugins maven-surefire-plugin ${maven-surefire-plugin.version} @@ -96,20 +96,20 @@ - - + + - - 1.8 - UTF-8 - 2.3.6 - 4.3.4.RELEASE - 1.1.7 - 1.7.21 - 4.12 - 3.5 - 3.6.0 + + 1.8 + UTF-8 + 2.3.6 + 4.3.4.RELEASE + 1.1.7 + 1.7.21 + 4.12 + 3.5 + 3.6.0 2.19.1 - + diff --git a/deltaspike/pom.xml b/deltaspike/pom.xml index b4a7657e97..141b5b0da6 100644 --- a/deltaspike/pom.xml +++ b/deltaspike/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.baeldung deltaspike @@ -19,21 +19,19 @@ - - - UTF-8 + + + + UTF-8 1.7.21 3.7.4 1.7.2 - + 1.0.2.Final - + 8.2.2.Final @@ -50,14 +48,11 @@ - + org.wildfly.bom jboss-javaee-7.0-with-tools @@ -77,43 +72,37 @@ - + - + javax.enterprise cdi-api provided - + org.jboss.spec.javax.annotation jboss-annotations-api_1.2_spec provided - + org.jboss.resteasy jaxrs-api provided - + org.hibernate.javax.persistence hibernate-jpa-2.1-api provided - + org.jboss.spec.javax.ejb jboss-ejb-api_3.2_spec @@ -135,8 +124,7 @@ - + org.jboss.spec.javax.faces jboss-jsf-api_2.2_spec @@ -145,16 +133,14 @@ - + org.hibernate hibernate-jpamodelgen provided - + org.hibernate hibernate-validator-annotation-processor @@ -169,8 +155,7 @@ - + org.jboss.arquillian.junit arquillian-junit-container @@ -225,8 +210,7 @@ - + ${project.artifactId} @@ -265,10 +249,8 @@ - - + + default true @@ -288,10 +270,8 @@ - - + + arq-wildfly-managed diff --git a/dozer/pom.xml b/dozer/pom.xml index 363285f619..56d5e889c3 100644 --- a/dozer/pom.xml +++ b/dozer/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - + com.baeldung dozer 1.0 - + dozer @@ -54,7 +54,7 @@ - + 1.7.21 3.5 @@ -62,5 +62,5 @@ 4.12 3.6.0 - + diff --git a/ejb/pom.xml b/ejb/pom.xml index b00f80a817..bfcc972417 100755 --- a/ejb/pom.xml +++ b/ejb/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.ejb ejb @@ -75,8 +75,8 @@ - - ejb-remote - ejb-client - + + ejb-remote + ejb-client + \ No newline at end of file diff --git a/enterprise-patterns/pom.xml b/enterprise-patterns/pom.xml index 763227e45b..1c895095dc 100644 --- a/enterprise-patterns/pom.xml +++ b/enterprise-patterns/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 com.baeldung.enterprise.patterns @@ -32,7 +31,7 @@ - + 3.6.0 diff --git a/feign/pom.xml b/feign/pom.xml index 721fa76682..160f37ec2c 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.feign From e4286380784b3a5a7e8d593ee3c6b57c648808be Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 11 Jan 2017 18:06:17 +0100 Subject: [PATCH 059/120] BAEL-19 remove comments --- kotlin/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index bd58c8d5cd..59f71f91a6 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -9,20 +9,17 @@ 1.0-SNAPSHOT - org.jetbrains.kotlin kotlin-stdlib 1.0.4 - org.jetbrains.kotlin kotlin-test-junit 1.0.4 test - junit junit From 79d13928e5ad489ff22ee893c5a36ba4d0d949da Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Wed, 11 Jan 2017 18:23:54 +0100 Subject: [PATCH 060/120] BAEL-19 more condition blocks examples --- .../main/kotlin/com/baeldung/ItemService.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt index 0adc709016..4a799a9901 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt +++ b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt @@ -47,5 +47,23 @@ fun main(args: Array) { println("Names: $concatOfNames") val itemManager = ItemManager("cat_id", "db://connection") - print("function result: ${itemManager.isFromSpecificCategory("1")}") + val result = "function result: ${itemManager.isFromSpecificCategory("1")}" + println(result) + + val number = 2 + if (number < 10) { + println("number less that 10") + } else if (number > 10) { + println("number is greater that 10") + } + + val name = "John" + when (name) { + "John" -> println("Hi man") + "Alice" -> println("Hi lady") + else -> { + println("Hi") + } + } + } \ No newline at end of file From 9e48d87306d072eed11a48f3e564cab95f431348 Mon Sep 17 00:00:00 2001 From: Ahmed-Saied Date: Wed, 11 Jan 2017 22:29:25 +0200 Subject: [PATCH 061/120] Spring scheduling beyond scheduled (#984) --- .../ThreadPoolTaskSchedulerConfig.java | 41 ++++++++++++++++ .../ThreadPoolTaskSchedulerExamples.java | 47 +++++++++++++++++++ .../ThreadPoolTaskSchedulerTest.java | 16 +++++++ 3 files changed, 104 insertions(+) create mode 100644 spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java create mode 100644 spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java create mode 100644 spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java diff --git a/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java new file mode 100644 index 0000000000..342a5fe3e6 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java @@ -0,0 +1,41 @@ +package org.baeldung.taskscheduler; + +import java.util.concurrent.TimeUnit; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.support.CronTrigger; +import org.springframework.scheduling.support.PeriodicTrigger; + +@Configuration +@ComponentScan(basePackages = "org.baeldung.taskscheduler", basePackageClasses = { ThreadPoolTaskSchedulerExamples.class }) +public class ThreadPoolTaskSchedulerConfig { + + @Bean + public ThreadPoolTaskScheduler threadPoolTaskScheduler() { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + threadPoolTaskScheduler.setPoolSize(5); + threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler"); + return threadPoolTaskScheduler; + } + + @Bean + public CronTrigger cronTrigger() { + return new CronTrigger("10 * * * * ?"); + } + + @Bean + public PeriodicTrigger periodicTrigger() { + return new PeriodicTrigger(2000, TimeUnit.MICROSECONDS); + } + + @Bean + public PeriodicTrigger periodicFixedDelayTrigger() { + PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS); + periodicTrigger.setFixedRate(true); + periodicTrigger.setInitialDelay(1000); + return periodicTrigger; + } +} \ No newline at end of file diff --git a/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java new file mode 100644 index 0000000000..7505b85516 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java @@ -0,0 +1,47 @@ +package org.baeldung.taskscheduler; + +import java.util.Date; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.support.CronTrigger; +import org.springframework.scheduling.support.PeriodicTrigger; +import org.springframework.stereotype.Component; + +@Component +public class ThreadPoolTaskSchedulerExamples { + @Autowired + private ThreadPoolTaskScheduler taskScheduler; + + @Autowired + private CronTrigger cronTrigger; + + @Autowired + private PeriodicTrigger periodicTrigger; + + @PostConstruct + public void scheduleRunnableWithCronTrigger(){ + taskScheduler.schedule(new RunnableTask("Current Date"), new Date()); + taskScheduler.scheduleWithFixedDelay(new RunnableTask("Fixed 1 second Delay"), 1000); + taskScheduler.scheduleWithFixedDelay(new RunnableTask("Current Date Fixed 1 second Delay"),new Date() , 1000); + taskScheduler.scheduleAtFixedRate(new RunnableTask("Fixed Rate of 2 seconds"),new Date(), 2000); + taskScheduler.scheduleAtFixedRate(new RunnableTask("Fixed Rate of 2 seconds"), 2000); + taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger); + taskScheduler.schedule(new RunnableTask("Periodic Trigger"), periodicTrigger); + } + + class RunnableTask implements Runnable{ + + private String message; + + public RunnableTask(String message){ + this.message = message; + } + @Override + public void run() { + System.out.println("Runnable Task with "+message+" on thread "+Thread.currentThread().getName()); + } + } +} \ No newline at end of file diff --git a/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java b/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java new file mode 100644 index 0000000000..cc247cb384 --- /dev/null +++ b/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerTest.java @@ -0,0 +1,16 @@ +package org.baeldung.taskscheduler; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { ThreadPoolTaskSchedulerConfig.class }, loader = AnnotationConfigContextLoader.class) +public class ThreadPoolTaskSchedulerTest { + @Test + public void testThreadPoolTaskSchedulerAnnotation() throws InterruptedException { + Thread.sleep(2550); + } +} \ No newline at end of file From 6afaa3b167ca734f458513385ae7cafa7f1bde5b Mon Sep 17 00:00:00 2001 From: Jeyvison Date: Wed, 11 Jan 2017 17:40:04 -0300 Subject: [PATCH 062/120] Gradle tutorial (#985) --- gradle-tutorial/build.gradle | 25 +++ gradle-tutorial/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53539 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + gradle-tutorial/gradlew | 160 ++++++++++++++++++ gradle-tutorial/gradlew.bat | 90 ++++++++++ gradle-tutorial/src/main/java/Main.java | 5 + 7 files changed, 289 insertions(+) create mode 100644 gradle-tutorial/build.gradle create mode 100644 gradle-tutorial/gradle.properties create mode 100644 gradle-tutorial/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle-tutorial/gradle/wrapper/gradle-wrapper.properties create mode 100644 gradle-tutorial/gradlew create mode 100644 gradle-tutorial/gradlew.bat create mode 100644 gradle-tutorial/src/main/java/Main.java diff --git a/gradle-tutorial/build.gradle b/gradle-tutorial/build.gradle new file mode 100644 index 0000000000..fc561987f7 --- /dev/null +++ b/gradle-tutorial/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'java' +apply plugin: 'maven' + +repositories{ + mavenCentral() +} + +dependencies{ + compile 'org.springframework:spring-context:4.3.5.RELEASE' +} + +task hello { + println "this Baeldung's tutorial is ${awesomeness}" +} + +uploadArchives { + repositories { + mavenDeployer { + repository(url: 'http://yourmavenrepo/repository') { + authentication(userName: 'user', password: 'password'); + } + + } + } +} diff --git a/gradle-tutorial/gradle.properties b/gradle-tutorial/gradle.properties new file mode 100644 index 0000000000..41701e5a19 --- /dev/null +++ b/gradle-tutorial/gradle.properties @@ -0,0 +1,3 @@ +awesomeness=awesome +group=com.baeldung.tutorial +version=1.0.1 diff --git a/gradle-tutorial/gradle/wrapper/gradle-wrapper.jar b/gradle-tutorial/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..3391a4cdf6b4057b1289f45659e6e46fd9902ce6 GIT binary patch literal 53539 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 literal 0 HcmV?d00001 diff --git a/gradle-tutorial/gradle/wrapper/gradle-wrapper.properties b/gradle-tutorial/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b601d97764 --- /dev/null +++ b/gradle-tutorial/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Dec 31 15:46:08 BRT 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip diff --git a/gradle-tutorial/gradlew b/gradle-tutorial/gradlew new file mode 100644 index 0000000000..9d82f78915 --- /dev/null +++ b/gradle-tutorial/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradle-tutorial/gradlew.bat b/gradle-tutorial/gradlew.bat new file mode 100644 index 0000000000..8a0b282aa6 --- /dev/null +++ b/gradle-tutorial/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle-tutorial/src/main/java/Main.java b/gradle-tutorial/src/main/java/Main.java new file mode 100644 index 0000000000..10edd1840b --- /dev/null +++ b/gradle-tutorial/src/main/java/Main.java @@ -0,0 +1,5 @@ +public class Main{ + public static void main(String[] args){ + System.out.println("Baeldung Rocks"); + } +} From 133018305554af20dd1439f60a47d0e0119f2890 Mon Sep 17 00:00:00 2001 From: DOHA Date: Wed, 11 Jan 2017 22:47:52 +0200 Subject: [PATCH 063/120] fix tests --- .../HttpClientMultipartLiveTest.java | 53 ++++++++----- .../httpclient/HttpsClientSslLiveTest.java | 76 +++++++++++++------ 2 files changed, 86 insertions(+), 43 deletions(-) diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java index 6fad126537..954236a56f 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java @@ -28,13 +28,14 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; -@Ignore("Server is not available") public class HttpClientMultipartLiveTest { - private static final String SERVER = "http://echo.200please.com"; + // No longer available + // private static final String SERVER = "http://echo.200please.com"; + + private static final String SERVER = "http://posttestserver.com/post.php"; private static final String TEXTFILENAME = "temp.txt"; private static final String IMAGEFILENAME = "image.jpg"; private static final String ZIPFILENAME = "zipFile.zip"; @@ -46,7 +47,8 @@ public class HttpClientMultipartLiveTest { @Before public final void before() { - client = HttpClientBuilder.create().build(); + client = HttpClientBuilder.create() + .build(); post = new HttpPost(SERVER); } @@ -80,7 +82,9 @@ public class HttpClientMultipartLiveTest { @Test public final void givenFileandMultipleTextParts_whenUploadwithAddPart_thenNoExceptions() throws IOException { - final URL url = Thread.currentThread().getContextClassLoader().getResource("uploads/" + TEXTFILENAME); + final URL url = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + TEXTFILENAME); final File file = new File(url.getPath()); final FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY); @@ -97,11 +101,12 @@ public class HttpClientMultipartLiveTest { post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -109,7 +114,9 @@ public class HttpClientMultipartLiveTest { @Test public final void givenFileandTextPart_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoExeption() throws ClientProtocolException, IOException { - final URL url = Thread.currentThread().getContextClassLoader().getResource("uploads/" + TEXTFILENAME); + final URL url = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + TEXTFILENAME); final File file = new File(url.getPath()); final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); @@ -119,11 +126,12 @@ public class HttpClientMultipartLiveTest { final HttpEntity entity = builder.build(); post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -131,8 +139,12 @@ public class HttpClientMultipartLiveTest { @Test public final void givenFileAndInputStreamandText_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoException() throws ClientProtocolException, IOException { - final URL url = Thread.currentThread().getContextClassLoader().getResource("uploads/" + ZIPFILENAME); - final URL url2 = Thread.currentThread().getContextClassLoader().getResource("uploads/" + IMAGEFILENAME); + final URL url = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + ZIPFILENAME); + final URL url2 = Thread.currentThread() + .getContextClassLoader() + .getResource("uploads/" + IMAGEFILENAME); final InputStream inputStream = new FileInputStream(url.getPath()); final File file = new File(url2.getPath()); final String message = "This is a multipart post"; @@ -144,11 +156,12 @@ public class HttpClientMultipartLiveTest { final HttpEntity entity = builder.build(); post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -166,11 +179,12 @@ public class HttpClientMultipartLiveTest { final HttpEntity entity = builder.build(); post.setEntity(entity); response = client.execute(post); - final int statusCode = response.getStatusLine().getStatusCode(); + final int statusCode = response.getStatusLine() + .getStatusCode(); final String responseString = getContent(); final String contentTypeInHeader = getContentTypeHeader(); assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - assertTrue(responseString.contains("Content-Type: multipart/form-data;")); + // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); System.out.println(responseString); System.out.println("POST Content Type: " + contentTypeInHeader); @@ -179,7 +193,8 @@ public class HttpClientMultipartLiveTest { // UTIL final String getContent() throws IOException { - rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); + rd = new BufferedReader(new InputStreamReader(response.getEntity() + .getContent())); String body = ""; String content = ""; while ((body = rd.readLine()) != null) { @@ -189,7 +204,9 @@ public class HttpClientMultipartLiveTest { } final String getContentTypeHeader() throws IOException { - return post.getEntity().getContentType().toString(); + return post.getEntity() + .getContentType() + .toString(); } } diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java index 278cdb3556..5dfecb85aa 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java @@ -1,11 +1,24 @@ package org.baeldung.httpclient; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLHandshakeException; + import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.conn.ssl.*; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClientBuilder; @@ -15,14 +28,6 @@ import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContexts; import org.junit.Test; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLException; -import java.io.IOException; -import java.security.GeneralSecurityException; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertThat; - /** * This test requires a localhost server over HTTPS
    * It should only be manually run, not part of the automated build @@ -35,13 +40,15 @@ public class HttpsClientSslLiveTest { // tests - @Test(expected = SSLException.class) + @Test(expected = SSLHandshakeException.class) public final void whenHttpsUrlIsConsumed_thenException() throws IOException { - final CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + final CloseableHttpClient httpClient = HttpClientBuilder.create() + .build(); final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); } @SuppressWarnings("deprecation") @@ -57,7 +64,8 @@ public class HttpsClientSslLiveTest { final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); httpClient.close(); } @@ -65,44 +73,62 @@ public class HttpsClientSslLiveTest { @Test public final void givenHttpClientAfter4_3_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { final TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true; - final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); + final SSLContext sslContext = SSLContexts.custom() + .loadTrustMaterial(null, acceptingTrustStrategy) + .build(); final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); - final CloseableHttpClient httpClient = HttpClients.custom().setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER).setSSLSocketFactory(sslsf).build(); + final CloseableHttpClient httpClient = HttpClients.custom() + .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) + .setSSLSocketFactory(sslsf) + .build(); final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); httpClient.close(); } @Test public final void givenHttpClientPost4_3_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { - final SSLContextBuilder builder = new SSLContextBuilder(); - builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); - final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build()); - final CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) + .build(); + final NoopHostnameVerifier hostnameVerifier = new NoopHostnameVerifier(); + + final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); + final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLHostnameVerifier(hostnameVerifier) + .setSSLSocketFactory(sslsf) + .build(); // new final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + httpClient.close(); + } @Test public final void givenIgnoringCertificates_whenHttpsUrlIsConsumed_thenCorrect() throws Exception { - SSLContext sslContext = new SSLContextBuilder() - .loadTrustMaterial(null, (certificate, authType) -> true).build(); + final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true) + .build(); - final CloseableHttpClient client = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + final CloseableHttpClient client = HttpClients.custom() + .setSSLContext(sslContext) + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .build(); final HttpGet httpGet = new HttpGet(HOST_WITH_SSL); httpGet.setHeader("Accept", "application/xml"); final HttpResponse response = client.execute(httpGet); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); } } From a5978cf2593ded7b79f2d6f6b454ca74c85e1fab Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Wed, 11 Jan 2017 21:05:36 -0600 Subject: [PATCH 064/120] Create README.md --- jsoup/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 jsoup/README.md diff --git a/jsoup/README.md b/jsoup/README.md new file mode 100644 index 0000000000..8728cc7c4e --- /dev/null +++ b/jsoup/README.md @@ -0,0 +1,10 @@ +========= + +## jsoup Example Project + +### Relevant Articles: +- [Parsing HTML in Java with Jsoup](http://www.baeldung.com/java-with-jsoup) + +### Build the Project + +mvn clean install From fa63fae6fc1bbada980db4b0a1af626e23f79e93 Mon Sep 17 00:00:00 2001 From: tschiman Date: Wed, 11 Jan 2017 21:59:38 -0700 Subject: [PATCH 065/120] BAEL-442 Making some changes to how many threads are in the executors. Cleaning up some white space. --- .../spring/session/SleuthController.java | 3 --- .../baeldung/spring/session/ThreadConfig.java | 27 +++++++++---------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java index eeaed15bea..ada1152a4e 100644 --- a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java @@ -65,7 +65,4 @@ public class SleuthController { logger.info("After Async Method Call"); return "success"; } - - - } diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java index 56cabee443..650be70f19 100644 --- a/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java @@ -25,12 +25,22 @@ public class ThreadConfig extends AsyncConfigurerSupport implements SchedulingCo @Bean public Executor executor() { - return makeExecutor(); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(1); + threadPoolTaskExecutor.setMaxPoolSize(1); + threadPoolTaskExecutor.initialize(); + + return new LazyTraceExecutor(beanFactory, threadPoolTaskExecutor); } @Override public Executor getAsyncExecutor() { - return makeExecutor(); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(1); + threadPoolTaskExecutor.setMaxPoolSize(1); + threadPoolTaskExecutor.initialize(); + + return new LazyTraceExecutor(beanFactory, threadPoolTaskExecutor); } @Override @@ -40,17 +50,6 @@ public class ThreadConfig extends AsyncConfigurerSupport implements SchedulingCo @Bean(destroyMethod = "shutdown") public Executor schedulingExecutor() { - return Executors.newScheduledThreadPool(100); + return Executors.newScheduledThreadPool(1); } - - private Executor makeExecutor() { - ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); - threadPoolTaskExecutor.setCorePoolSize(5); - threadPoolTaskExecutor.setMaxPoolSize(10); - threadPoolTaskExecutor.initialize(); - - return new LazyTraceExecutor(beanFactory, threadPoolTaskExecutor); - } - - } From 7df755545a310d46ab3c882ce6ca32fe13ed8a01 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 12 Jan 2017 11:16:34 +0100 Subject: [PATCH 066/120] BAEL-586 guava multimap examples --- .../java/com/baeldung/guava/MultimapTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 guava19/src/test/java/com/baeldung/guava/MultimapTest.java diff --git a/guava19/src/test/java/com/baeldung/guava/MultimapTest.java b/guava19/src/test/java/com/baeldung/guava/MultimapTest.java new file mode 100644 index 0000000000..dbe47923bb --- /dev/null +++ b/guava19/src/test/java/com/baeldung/guava/MultimapTest.java @@ -0,0 +1,62 @@ +package com.baeldung.guava; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import org.junit.Test; + +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class MultimapTest { + + @Test + public void givenMap_whenAddTwoValuesFroSameKey_shouldOverridePreviousKey() { + //given + String key = "a-key"; + Map map = new LinkedHashMap<>(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(1, map.size()); + } + + @Test + public void givenMultiMap_whenAddTwoValuesFroSameKey_shouldHaveTwoEntriesInMap() { + //given + String key = "a-key"; + Multimap map = ArrayListMultimap.create(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(2, map.size()); + } + + @Test + public void givenMapOfListValues_whenAddTwoValuesFroSameKey_shouldHaveTwoElementInList() { + //given + String key = "a-key"; + Map> map = new LinkedHashMap<>(); + + //when + List values = map.get(key); + if(values == null){ + values = new LinkedList<>(); + values.add("firstValue"); + values.add("secondValue"); + } + map.put(key, values); + + //then + assertEquals(1, map.size()); + } +} From 06ceb4d87c05adcad8551f9cf0037bc4b3a0c32f Mon Sep 17 00:00:00 2001 From: Saptarshi Basu Date: Thu, 12 Jan 2017 19:25:18 +0530 Subject: [PATCH 067/120] JAX-RS API using Jersey [BAEL-558] (#956) * WatchService vs. Apache Commons IO Mnitoring * Indentation fixed * Indentation fixed * JAX-RS API using Jersey [BAEL-558] * JAX-RS API using Jersey [BAEL-558] * Modifications made to remove xml * applicationContext.xml removed * All try catch moved to ExceptionMapper * fixes * review comments incorporated * module renamed --- pom.xml | 1 + spring-jersey/.gitignore | 13 ++ spring-jersey/README.md | 3 + spring-jersey/pom.xml | 210 ++++++++++++++++++ .../server/config/ApplicationInitializer.java | 22 ++ .../baeldung/server/config/RestConfig.java | 19 ++ .../AlreadyExistsExceptionHandler.java | 12 + .../exception/EmployeeAlreadyExists.java | 5 + .../server/exception/EmployeeNotFound.java | 5 + .../exception/NotFoundExceptionHandler.java | 12 + .../com/baeldung/server/model/Employee.java | 34 +++ .../server/repository/EmployeeRepository.java | 18 ++ .../repository/EmployeeRepositoryImpl.java | 65 ++++++ .../server/rest/EmployeeResource.java | 64 ++++++ spring-jersey/src/main/resources/logback.xml | 15 ++ .../baeldung/server/JerseyApiLiveTest.java | 91 ++++++++ 16 files changed, 589 insertions(+) create mode 100644 spring-jersey/.gitignore create mode 100644 spring-jersey/README.md create mode 100644 spring-jersey/pom.xml create mode 100644 spring-jersey/src/main/java/com/baeldung/server/config/ApplicationInitializer.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/config/RestConfig.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/exception/AlreadyExistsExceptionHandler.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeAlreadyExists.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeNotFound.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/exception/NotFoundExceptionHandler.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/model/Employee.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepository.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepositoryImpl.java create mode 100644 spring-jersey/src/main/java/com/baeldung/server/rest/EmployeeResource.java create mode 100644 spring-jersey/src/main/resources/logback.xml create mode 100644 spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java diff --git a/pom.xml b/pom.xml index c590183137..0b0351f462 100644 --- a/pom.xml +++ b/pom.xml @@ -117,6 +117,7 @@ spring-hibernate3 spring-hibernate4 spring-integration + spring-jersey spring-jms spring-jooq spring-jpa diff --git a/spring-jersey/.gitignore b/spring-jersey/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-jersey/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-jersey/README.md b/spring-jersey/README.md new file mode 100644 index 0000000000..2767ceb9a7 --- /dev/null +++ b/spring-jersey/README.md @@ -0,0 +1,3 @@ +========= + +## REST API with Jersey & Spring Example Project diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml new file mode 100644 index 0000000000..00d67febec --- /dev/null +++ b/spring-jersey/pom.xml @@ -0,0 +1,210 @@ + + + 4.0.0 + + com.baeldung + jersey-api + 0.1-SNAPSHOT + war + + + 2.25 + 1.7.22 + 1.1.8 + 4.12 + 3.0.0 + 2.19.1 + 1.6.1 + 4.12 + 4.4.5 + 4.5.2 + 3.1.0 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + 8082 + + + + + + + + + + + + + org.glassfish.jersey.core + jersey-server + ${jersey.version} + + + org.glassfish.jersey.containers + jersey-container-servlet + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + + + + javax.servlet + javax.servlet-api + ${servlet-api-version} + provided + + + + + org.glassfish.jersey.ext + jersey-spring3 + ${jersey.version} + + + commons-logging + commons-logging + + + + + + org.slf4j + jcl-over-slf4j + ${jcl.slf4j.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + test + + + + org.apache.httpcomponents + httpcore + ${httpcore.version} + test + + + + + + junit + junit + ${junit.version} + test + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*IntegrationTest.java + + + **/*LiveTest.java + + + + + + + json + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + false + + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + + + + \ No newline at end of file diff --git a/spring-jersey/src/main/java/com/baeldung/server/config/ApplicationInitializer.java b/spring-jersey/src/main/java/com/baeldung/server/config/ApplicationInitializer.java new file mode 100644 index 0000000000..d91d4d5f38 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/config/ApplicationInitializer.java @@ -0,0 +1,22 @@ +package com.baeldung.server.config; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +@Order(Ordered.HIGHEST_PRECEDENCE) +public class ApplicationInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + servletContext.addListener(new ContextLoaderListener(context)); + servletContext.setInitParameter("contextConfigLocation", "com.baeldung.server"); + } + +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/config/RestConfig.java b/spring-jersey/src/main/java/com/baeldung/server/config/RestConfig.java new file mode 100644 index 0000000000..34d8948f59 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/config/RestConfig.java @@ -0,0 +1,19 @@ +package com.baeldung.server.config; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +import com.baeldung.server.exception.AlreadyExistsExceptionHandler; +import com.baeldung.server.exception.NotFoundExceptionHandler; +import com.baeldung.server.rest.EmployeeResource; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +@ApplicationPath("/resources") +public class RestConfig extends Application { + public Set> getClasses() { + return new HashSet>(Arrays.asList(EmployeeResource.class, NotFoundExceptionHandler.class, AlreadyExistsExceptionHandler.class)); + } +} \ No newline at end of file diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/AlreadyExistsExceptionHandler.java b/spring-jersey/src/main/java/com/baeldung/server/exception/AlreadyExistsExceptionHandler.java new file mode 100644 index 0000000000..4603372807 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/AlreadyExistsExceptionHandler.java @@ -0,0 +1,12 @@ +package com.baeldung.server.exception; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +@Provider +public class AlreadyExistsExceptionHandler implements ExceptionMapper { + public Response toResponse(EmployeeAlreadyExists ex) { + return Response.status(Response.Status.CONFLICT.getStatusCode()).build(); + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeAlreadyExists.java b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeAlreadyExists.java new file mode 100644 index 0000000000..827e4bf1e7 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeAlreadyExists.java @@ -0,0 +1,5 @@ +package com.baeldung.server.exception; + +public class EmployeeAlreadyExists extends RuntimeException { + +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeNotFound.java b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeNotFound.java new file mode 100644 index 0000000000..f205b5dfae --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/EmployeeNotFound.java @@ -0,0 +1,5 @@ +package com.baeldung.server.exception; + +public class EmployeeNotFound extends RuntimeException { + +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/exception/NotFoundExceptionHandler.java b/spring-jersey/src/main/java/com/baeldung/server/exception/NotFoundExceptionHandler.java new file mode 100644 index 0000000000..5de9b53c30 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/exception/NotFoundExceptionHandler.java @@ -0,0 +1,12 @@ +package com.baeldung.server.exception; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +@Provider +public class NotFoundExceptionHandler implements ExceptionMapper { + public Response toResponse(EmployeeNotFound ex) { + return Response.status(Response.Status.NOT_FOUND).build(); + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/model/Employee.java b/spring-jersey/src/main/java/com/baeldung/server/model/Employee.java new file mode 100644 index 0000000000..1801134f68 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/model/Employee.java @@ -0,0 +1,34 @@ +package com.baeldung.server.model; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class Employee { + private int id; + private String firstName; + + public Employee() { + + } + + public Employee(int id, String firstName) { + this.id = id; + this.firstName = firstName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepository.java b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepository.java new file mode 100644 index 0000000000..15132cd618 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepository.java @@ -0,0 +1,18 @@ +package com.baeldung.server.repository; + +import java.util.List; + +import com.baeldung.server.model.Employee; + +public interface EmployeeRepository { + + public List getAllEmployees(); + + public Employee getEmployee(int id); + + public void updateEmployee(Employee employee, int id); + + public void deleteEmployee(int id); + + public void addEmployee(Employee employee); +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepositoryImpl.java b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepositoryImpl.java new file mode 100644 index 0000000000..8e61e1395b --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/repository/EmployeeRepositoryImpl.java @@ -0,0 +1,65 @@ +package com.baeldung.server.repository; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Component; + +import com.baeldung.server.exception.EmployeeAlreadyExists; +import com.baeldung.server.exception.EmployeeNotFound; +import com.baeldung.server.model.Employee; + +@Component +public class EmployeeRepositoryImpl implements EmployeeRepository { + private List employeeList; + + public EmployeeRepositoryImpl() { + employeeList = new ArrayList(); + employeeList.add(new Employee(1, "Jane")); + employeeList.add(new Employee(2, "Jack")); + employeeList.add(new Employee(3, "George")); + } + + public List getAllEmployees() { + return employeeList; + } + + public Employee getEmployee(int id) { + for (Employee emp : employeeList) { + if (emp.getId() == id) { + return emp; + } + } + throw new EmployeeNotFound(); + } + + public void updateEmployee(Employee employee, int id) { + for (Employee emp : employeeList) { + if (emp.getId() == id) { + emp.setId(employee.getId()); + emp.setFirstName(employee.getFirstName()); + return; + } + } + throw new EmployeeNotFound(); + } + + public void deleteEmployee(int id) { + for (Employee emp : employeeList) { + if (emp.getId() == id) { + employeeList.remove(emp); + return; + } + } + throw new EmployeeNotFound(); + } + + public void addEmployee(Employee employee) { + for (Employee emp : employeeList) { + if (emp.getId() == employee.getId()) { + throw new EmployeeAlreadyExists(); + } + } + employeeList.add(employee); + } +} diff --git a/spring-jersey/src/main/java/com/baeldung/server/rest/EmployeeResource.java b/spring-jersey/src/main/java/com/baeldung/server/rest/EmployeeResource.java new file mode 100644 index 0000000000..2301f3eaf3 --- /dev/null +++ b/spring-jersey/src/main/java/com/baeldung/server/rest/EmployeeResource.java @@ -0,0 +1,64 @@ +package com.baeldung.server.rest; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.baeldung.server.model.Employee; +import com.baeldung.server.repository.EmployeeRepository; + +@Path("/employees") +public class EmployeeResource { + + @Autowired + private EmployeeRepository employeeRepository; + + @GET + @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public List getAllEmployees() { + return employeeRepository.getAllEmployees(); + } + + @GET + @Path("/{id}") + @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Employee getEmployee(@PathParam("id") int id) { + return employeeRepository.getEmployee(id); + } + + @PUT + @Path("/{id}") + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Response updateEmployee(Employee employee, @PathParam("id") int id) { + employeeRepository.updateEmployee(employee, id); + return Response.status(Response.Status.OK.getStatusCode()).build(); + } + + @DELETE + @Path("/{id}") + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Response deleteEmployee(@PathParam("id") int id) { + employeeRepository.deleteEmployee(id); + return Response.status(Response.Status.OK.getStatusCode()).build(); + } + + @POST + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Response addEmployee(Employee employee, @Context UriInfo uriInfo) { + employeeRepository.addEmployee(new Employee(employee.getId(), employee.getFirstName())); + return Response.status(Response.Status.CREATED.getStatusCode()).header("Location", String.format("%s/%s", uriInfo.getAbsolutePath().toString(), employee.getId())).build(); + } +} diff --git a/spring-jersey/src/main/resources/logback.xml b/spring-jersey/src/main/resources/logback.xml new file mode 100644 index 0000000000..788096686a --- /dev/null +++ b/spring-jersey/src/main/resources/logback.xml @@ -0,0 +1,15 @@ + + + + + web - %date [%thread] %-5level %logger{36} - + %message%n + + + + + + + + + \ No newline at end of file diff --git a/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java b/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java new file mode 100644 index 0000000000..80c4e94b50 --- /dev/null +++ b/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java @@ -0,0 +1,91 @@ +package com.baeldung.server; + +import java.io.IOException; + +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClientBuilder; +import org.junit.Test; + +import com.baeldung.server.model.Employee; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JerseyApiLiveTest { + + private static final String SERVICE_URL = "http://localhost:8082/jersey-api/resources/employees"; + + @Test + public void givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess() throws ClientProtocolException, IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL); + + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK); + } + + @Test + public void givenGetEmployee_whenEmployeeExists_thenResponseCodeSuccess() throws ClientProtocolException, IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1"); + + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK); + } + + @Test + public void givenGetEmployee_whenEmployeeDoesNotExist_thenResponseCodeNotFound() throws ClientProtocolException, IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1000"); + + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND); + } + + @Test + public void givenGetEmployee_whenJsonRequested_thenCorrectDataRetrieved() throws ClientProtocolException, IOException { + final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1"); + + request.setHeader("Accept", "application/json"); + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + ObjectMapper mapper = new ObjectMapper(); + Employee emp = mapper.readValue(httpResponse.getEntity().getContent(), Employee.class); + + assert(emp.getFirstName().equals("Jane")); + } + + @Test + public void givenAddEmployee_whenJsonRequestSent_thenResponseCodeCreated() throws ClientProtocolException, IOException { + final HttpPost request = new HttpPost(SERVICE_URL); + + Employee emp = new Employee(5, "Johny"); + ObjectMapper mapper = new ObjectMapper(); + String empJson = mapper.writeValueAsString(emp); + StringEntity input = new StringEntity(empJson); + input.setContentType("application/json"); + request.setEntity(input); + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED); + } + + @Test + public void givenAddEmployee_whenRequestForExistingObjectSent_thenResponseCodeConflict() throws ClientProtocolException, IOException { + final HttpPost request = new HttpPost(SERVICE_URL); + + Employee emp = new Employee(1, "Johny"); + ObjectMapper mapper = new ObjectMapper(); + String empJson = mapper.writeValueAsString(emp); + StringEntity input = new StringEntity(empJson); + input.setContentType("application/json"); + request.setEntity(input); + final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); + + assert(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_CONFLICT); + } + +} \ No newline at end of file From 91fb87c06dc2fb406c8d8d0b14351c55095fdf96 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 12 Jan 2017 18:41:04 +0100 Subject: [PATCH 068/120] BAEL-586 rename tests according to pr review --- guava19/src/test/java/com/baeldung/guava/MultimapTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guava19/src/test/java/com/baeldung/guava/MultimapTest.java b/guava19/src/test/java/com/baeldung/guava/MultimapTest.java index dbe47923bb..c984ab1e4b 100644 --- a/guava19/src/test/java/com/baeldung/guava/MultimapTest.java +++ b/guava19/src/test/java/com/baeldung/guava/MultimapTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.assertEquals; public class MultimapTest { @Test - public void givenMap_whenAddTwoValuesFroSameKey_shouldOverridePreviousKey() { + public void givenMap_whenAddTwoValuesForSameKey_shouldOverridePreviousKey() { //given String key = "a-key"; Map map = new LinkedHashMap<>(); @@ -28,7 +28,7 @@ public class MultimapTest { } @Test - public void givenMultiMap_whenAddTwoValuesFroSameKey_shouldHaveTwoEntriesInMap() { + public void givenMultiMap_whenAddTwoValuesForSameKey_shouldHaveTwoEntriesInMap() { //given String key = "a-key"; Multimap map = ArrayListMultimap.create(); @@ -42,7 +42,7 @@ public class MultimapTest { } @Test - public void givenMapOfListValues_whenAddTwoValuesFroSameKey_shouldHaveTwoElementInList() { + public void givenMapOfListValues_whenAddTwoValuesForSameKey_shouldHaveTwoElementsInList() { //given String key = "a-key"; Map> map = new LinkedHashMap<>(); From 8734c956bb5ce53619f1a330f20c4a8a21bb8054 Mon Sep 17 00:00:00 2001 From: Tuan Date: Fri, 13 Jan 2017 13:53:59 +0700 Subject: [PATCH 069/120] BAEL-470-Spring Retry (#967) * add Spring Retry * remove redundant code * convert tab to space in XML file * align spaces in xml file --- spring-all/pom.xml | 7 ++- .../org/baeldung/springretry/AppConfig.java | 34 +++++++++++++ .../springretry/DefaultListenerSupport.java | 31 ++++++++++++ .../org/baeldung/springretry/MyService.java | 21 ++++++++ .../baeldung/springretry/MyServiceImpl.java | 39 +++++++++++++++ spring-all/src/main/resources/retryadvice.xml | 50 +++++++++++++++++++ .../baeldung/springretry/SpringRetryTest.java | 45 +++++++++++++++++ 7 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 spring-all/src/main/java/org/baeldung/springretry/AppConfig.java create mode 100644 spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java create mode 100644 spring-all/src/main/java/org/baeldung/springretry/MyService.java create mode 100644 spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java create mode 100644 spring-all/src/main/resources/retryadvice.xml create mode 100644 spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java diff --git a/spring-all/pom.xml b/spring-all/pom.xml index e77bf0b284..deb6bd6f6a 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -38,6 +38,11 @@ org.springframework spring-context
    + + org.springframework.retry + spring-retry + ${springretry.version} + @@ -166,7 +171,6 @@ ehcache ${ehcache.version} -
    @@ -275,6 +279,7 @@ 4.3.4.RELEASE 4.2.0.RELEASE + 1.1.5.RELEASE 5.2.5.Final diff --git a/spring-all/src/main/java/org/baeldung/springretry/AppConfig.java b/spring-all/src/main/java/org/baeldung/springretry/AppConfig.java new file mode 100644 index 0000000000..63bb2a53f1 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/AppConfig.java @@ -0,0 +1,34 @@ +package org.baeldung.springretry; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.retry.annotation.EnableRetry; +import org.springframework.retry.backoff.FixedBackOffPolicy; +import org.springframework.retry.policy.SimpleRetryPolicy; +import org.springframework.retry.support.RetryTemplate; + +@Configuration +@ComponentScan(basePackages = "org.baeldung.springretry") +@EnableRetry +//Uncomment this two lines if we need XML configuration +//@EnableAspectJAutoProxy +//@ImportResource("classpath:/retryadvice.xml") +public class AppConfig { + + @Bean + public RetryTemplate retryTemplate() { + RetryTemplate retryTemplate = new RetryTemplate(); + + FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); + fixedBackOffPolicy.setBackOffPeriod(2000l); + retryTemplate.setBackOffPolicy(fixedBackOffPolicy); + + SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); + retryPolicy.setMaxAttempts(2); + retryTemplate.setRetryPolicy(retryPolicy); + + retryTemplate.registerListener(new DefaultListenerSupport()); + return retryTemplate; + } +} diff --git a/spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java b/spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java new file mode 100644 index 0000000000..bc251b4c2f --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java @@ -0,0 +1,31 @@ +package org.baeldung.springretry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.retry.RetryCallback; +import org.springframework.retry.RetryContext; +import org.springframework.retry.listener.RetryListenerSupport; + +public class DefaultListenerSupport extends RetryListenerSupport { + + private static final Logger logger = LoggerFactory.getLogger(DefaultListenerSupport.class); + + @Override + public void close(RetryContext context, RetryCallback callback, Throwable throwable) { + logger.info("onClose"); + super.close(context, callback, throwable); + } + + @Override + public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { + logger.info("onError"); + super.onError(context, callback, throwable); + } + + @Override + public boolean open(RetryContext context, RetryCallback callback) { + logger.info("onOpen"); + return super.open(context, callback); + } + +} diff --git a/spring-all/src/main/java/org/baeldung/springretry/MyService.java b/spring-all/src/main/java/org/baeldung/springretry/MyService.java new file mode 100644 index 0000000000..2b8cc16eb3 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/MyService.java @@ -0,0 +1,21 @@ +package org.baeldung.springretry; + +import java.sql.SQLException; + +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Recover; +import org.springframework.retry.annotation.Retryable; + +public interface MyService { + + @Retryable + void retryService(); + + @Retryable(value = { SQLException.class }, maxAttempts = 2, backoff = @Backoff(delay = 5000)) + void retryServiceWithRecovery(String sql) throws SQLException; + + @Recover + void recover(SQLException e, String sql); + + void templateRetryService(); +} diff --git a/spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java b/spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java new file mode 100644 index 0000000000..1b698f26c9 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java @@ -0,0 +1,39 @@ +package org.baeldung.springretry; + +import java.sql.SQLException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +@Service +public class MyServiceImpl implements MyService { + + private static final Logger logger = LoggerFactory.getLogger(MyServiceImpl.class); + + @Override + public void retryService() { + logger.info("throw RuntimeException in method retryService()"); + throw new RuntimeException(); + } + + @Override + public void retryServiceWithRecovery(String sql) throws SQLException { + if (StringUtils.isEmpty(sql)) { + logger.info("throw SQLException in method retryServiceWithRecovery()"); + throw new SQLException(); + } + } + + @Override + public void recover(SQLException e, String sql) { + logger.info("In recover method"); + } + + @Override + public void templateRetryService() { + logger.info("throw RuntimeException in method templateRetryService()"); + throw new RuntimeException(); + } +} diff --git a/spring-all/src/main/resources/retryadvice.xml b/spring-all/src/main/resources/retryadvice.xml new file mode 100644 index 0000000000..8de7801a58 --- /dev/null +++ b/spring-all/src/main/resources/retryadvice.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Initial sleep interval value, default 300 ms + + + + + The maximum value of the backoff period in milliseconds. + + + + + The value to increment the exp seed with for each retry attempt. + + + + + \ No newline at end of file diff --git a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java new file mode 100644 index 0000000000..52f59dc49a --- /dev/null +++ b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java @@ -0,0 +1,45 @@ +package org.baeldung.springretry; + +import java.sql.SQLException; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.retry.RetryCallback; +import org.springframework.retry.RetryContext; +import org.springframework.retry.support.RetryTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) +public class SpringRetryTest { + + @Autowired + private MyService myService; + + @Autowired + private RetryTemplate retryTemplate; + + @Test(expected = RuntimeException.class) + public void givenRetryService_whenCallWithException_thenRetry() { + myService.retryService(); + } + + @Test + public void givenRetryServiceWithRecovery_whenCallWithException_thenRetryRecover() throws SQLException { + myService.retryServiceWithRecovery(null); + } + + @Test(expected = RuntimeException.class) + public void givenTemplateRetryService_whenCallWithException_thenRetry() { + retryTemplate.execute(new RetryCallback() { + @Override + public Void doWithRetry(RetryContext arg0) { + myService.templateRetryService(); + return null; + } + }); + } +} From f60ae3be29004f9e844ca2e88ed876e2eb01ab63 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Fri, 13 Jan 2017 07:56:41 +0100 Subject: [PATCH 070/120] Refactor SpringRetryTest --- .../org/baeldung/springretry/SpringRetryTest.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java index 52f59dc49a..2f3411957e 100644 --- a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java +++ b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java @@ -1,17 +1,15 @@ package org.baeldung.springretry; -import java.sql.SQLException; - import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.retry.RetryCallback; -import org.springframework.retry.RetryContext; import org.springframework.retry.support.RetryTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; +import java.sql.SQLException; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) public class SpringRetryTest { @@ -34,12 +32,9 @@ public class SpringRetryTest { @Test(expected = RuntimeException.class) public void givenTemplateRetryService_whenCallWithException_thenRetry() { - retryTemplate.execute(new RetryCallback() { - @Override - public Void doWithRetry(RetryContext arg0) { - myService.templateRetryService(); - return null; - } + retryTemplate.execute(arg0 -> { + myService.templateRetryService(); + return null; }); } } From 129921bcdcdebf2359071e0db114a5c5c657434f Mon Sep 17 00:00:00 2001 From: Mobi Blunt Date: Fri, 13 Jan 2017 10:25:10 +0100 Subject: [PATCH 071/120] JGit (#993) * First Commit * Second Commit for Guide to JGit --- JGit/pom.xml | 63 ++++++++++++++++ .../baeldung/jgit/CreateNewRepository.java | 30 ++++++++ .../com/baeldung/jgit/OpenRepository.java | 65 ++++++++++++++++ .../java/com/baeldung/jgit/helper/Helper.java | 33 +++++++++ .../com/baeldung/jgit/porcelain/AddFile.java | 36 +++++++++ .../baeldung/jgit/porcelain/CommitAll.java | 51 +++++++++++++ .../jgit/porcelain/CreateAndDeleteTag.java | 56 ++++++++++++++ .../java/com/baeldung/jgit/porcelain/Log.java | 74 +++++++++++++++++++ .../java/com/baeldung/jgit/JGitBugTest.java | 31 ++++++++ .../jgit/porcelain/PorcelainTest.java | 17 +++++ 10 files changed, 456 insertions(+) create mode 100644 JGit/pom.xml create mode 100644 JGit/src/main/java/com/baeldung/jgit/CreateNewRepository.java create mode 100644 JGit/src/main/java/com/baeldung/jgit/OpenRepository.java create mode 100644 JGit/src/main/java/com/baeldung/jgit/helper/Helper.java create mode 100644 JGit/src/main/java/com/baeldung/jgit/porcelain/AddFile.java create mode 100644 JGit/src/main/java/com/baeldung/jgit/porcelain/CommitAll.java create mode 100644 JGit/src/main/java/com/baeldung/jgit/porcelain/CreateAndDeleteTag.java create mode 100644 JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java create mode 100644 JGit/src/test/java/com/baeldung/jgit/JGitBugTest.java create mode 100644 JGit/src/test/java/com/baeldung/jgit/porcelain/PorcelainTest.java diff --git a/JGit/pom.xml b/JGit/pom.xml new file mode 100644 index 0000000000..93c49edb92 --- /dev/null +++ b/JGit/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + com.baeldung + JGitSnippets + 1.0-SNAPSHOT + jar + http://maven.apache.org + + UTF-8 + 1.8 + 1.8 + + + + jgit-repository + https://repo.eclipse.org/content/groups/releases/ + + + + + + + org.eclipse.jgit + org.eclipse.jgit + 4.5.0.201609210915-r + + + org.eclipse.jgit + org.eclipse.jgit.archive + 4.5.0.201609210915-r + + + commons-io + commons-io + 2.5 + + + org.slf4j + slf4j-simple + 1.7.21 + + + junit + junit + 4.12 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.7 + 1.7 + + + + + \ No newline at end of file diff --git a/JGit/src/main/java/com/baeldung/jgit/CreateNewRepository.java b/JGit/src/main/java/com/baeldung/jgit/CreateNewRepository.java new file mode 100644 index 0000000000..1702efc315 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/CreateNewRepository.java @@ -0,0 +1,30 @@ +package com.baeldung.jgit; + +import java.io.File; +import java.io.IOException; +import org.apache.commons.io.FileUtils; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; + +/** + * Simple snippet which shows how to create a new repository + * + * + */ +public class CreateNewRepository { + + public static void main(String[] args) throws IOException, IllegalStateException, GitAPIException { + // prepare a new folder + File localPath = File.createTempFile("TestGitRepository", ""); + if(!localPath.delete()) { + throw new IOException("Could not delete temporary file " + localPath); + } + + // create the directory + try (Git git = Git.init().setDirectory(localPath).call()) { + System.out.println("Having repository: " + git.getRepository().getDirectory()); + } + + FileUtils.deleteDirectory(localPath); + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/OpenRepository.java b/JGit/src/main/java/com/baeldung/jgit/OpenRepository.java new file mode 100644 index 0000000000..671df2a844 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/OpenRepository.java @@ -0,0 +1,65 @@ +package com.baeldung.jgit; + +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; +import java.io.File; +import java.io.IOException; + +/** + * Simple snippet which shows how to open an existing repository + * + * + */ +public class OpenRepository { + + public static void main(String[] args) throws IOException, GitAPIException { + // first create a test-repository, the return is including the .get directory here! + File repoDir = createSampleGitRepo(); + + // now open the resulting repository with a FileRepositoryBuilder + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + try (Repository repository = builder.setGitDir(repoDir) + .readEnvironment() // scan environment GIT_* variables + .findGitDir() // scan up the file system tree + .build()) { + System.out.println("Having repository: " + repository.getDirectory()); + + // the Ref holds an ObjectId for any type of object (tree, commit, blob, tree) + Ref head = repository.exactRef("refs/heads/master"); + System.out.println("Ref of refs/heads/master: " + head); + } + } + + private static File createSampleGitRepo() throws IOException, GitAPIException { + try (Repository repository = Helper.createNewRepository()) { + System.out.println("Temporary repository at " + repository.getDirectory()); + + // create the file + File myfile = new File(repository.getDirectory().getParent(), "testfile"); + if(!myfile.createNewFile()) { + throw new IOException("Could not create file " + myfile); + } + + // run the add-call + try (Git git = new Git(repository)) { + git.add() + .addFilepattern("testfile") + .call(); + + + // and then commit the changes + git.commit() + .setMessage("Added testfile") + .call(); + } + + System.out.println("Added file " + myfile + " to repository at " + repository.getDirectory()); + + return repository.getDirectory(); + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/helper/Helper.java b/JGit/src/main/java/com/baeldung/jgit/helper/Helper.java new file mode 100644 index 0000000000..39d7b767d2 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/helper/Helper.java @@ -0,0 +1,33 @@ + +package com.baeldung.jgit.helper; + +import java.io.File; +import java.io.IOException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; + +public class Helper { + + public static Repository openJGitRepository() throws IOException { + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + return builder + .readEnvironment() // scan environment GIT_* variables + .findGitDir() // scan up the file system tree + .build(); + } + + public static Repository createNewRepository() throws IOException { + // prepare a new folder + File localPath = File.createTempFile("TestGitRepository", ""); + if(!localPath.delete()) { + throw new IOException("Could not delete temporary file " + localPath); + } + + // create the directory + Repository repository = FileRepositoryBuilder.create(new File(localPath, ".git")); + repository.create(); + + return repository; + } + +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/AddFile.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/AddFile.java new file mode 100644 index 0000000000..314366f08c --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/AddFile.java @@ -0,0 +1,36 @@ +package com.baeldung.jgit.porcelain; + +import java.io.File; +import java.io.IOException; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; + +/** + * Simple snippet which shows how to add a file to the index + * + * + */ +public class AddFile { + + public static void main(String[] args) throws IOException, GitAPIException { + // prepare a new test-repository + try (Repository repository = Helper.createNewRepository()) { + try (Git git = new Git(repository)) { + // create the file + File myfile = new File(repository.getDirectory().getParent(), "testfile"); + if(!myfile.createNewFile()) { + throw new IOException("Could not create file " + myfile); + } + + // run the add-call + git.add() + .addFilepattern("testfile") + .call(); + + System.out.println("Added file " + myfile + " to repository at " + repository.getDirectory()); + } + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/CommitAll.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/CommitAll.java new file mode 100644 index 0000000000..4c0956ebf8 --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/CommitAll.java @@ -0,0 +1,51 @@ +package com.baeldung.jgit.porcelain; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; + +/** + * Simple snippet which shows how to commit all files + * + * + */ +public class CommitAll { + + public static void main(String[] args) throws IOException, GitAPIException { + // prepare a new test-repository + try (Repository repository = Helper.createNewRepository()) { + try (Git git = new Git(repository)) { + // create the file + File myfile = new File(repository.getDirectory().getParent(), "testfile"); + if(!myfile.createNewFile()) { + throw new IOException("Could not create file " + myfile); + } + + // Stage all files in the repo including new files + git.add().addFilepattern(".").call(); + + // and then commit the changes. + git.commit() + .setMessage("Commit all changes including additions") + .call(); + + try(PrintWriter writer = new PrintWriter(myfile)) { + writer.append("Hello, world!"); + } + + // Stage all changed files, omitting new files, and commit with one command + git.commit() + .setAll(true) + .setMessage("Commit changes to all files") + .call(); + + + System.out.println("Committed all changes to repository at " + repository.getDirectory()); + } + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/CreateAndDeleteTag.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/CreateAndDeleteTag.java new file mode 100644 index 0000000000..0f735daf8c --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/CreateAndDeleteTag.java @@ -0,0 +1,56 @@ +package com.baeldung.jgit.porcelain; + +import java.io.IOException; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; + +/** + * Simple snippet which shows how to create a tag + * + * + */ +public class CreateAndDeleteTag { + + public static void main(String[] args) throws IOException, GitAPIException { + // prepare test-repository + try (Repository repository = Helper.openJGitRepository()) { + try (Git git = new Git(repository)) { + // remove the tag before creating it + git.tagDelete().setTags("tag_for_testing").call(); + + // set it on the current HEAD + Ref tag = git.tag().setName("tag_for_testing").call(); + System.out.println("Created/moved tag " + tag + " to repository at " + repository.getDirectory()); + + // remove the tag again + git.tagDelete().setTags("tag_for_testing").call(); + + // read some other commit and set the tag on it + ObjectId id = repository.resolve("HEAD^"); + try (RevWalk walk = new RevWalk(repository)) { + RevCommit commit = walk.parseCommit(id); + tag = git.tag().setObjectId(commit).setName("tag_for_testing").call(); + System.out.println("Created/moved tag " + tag + " to repository at " + repository.getDirectory()); + + // remove the tag again + git.tagDelete().setTags("tag_for_testing").call(); + + // create an annotated tag + tag = git.tag().setName("tag_for_testing").setAnnotated(true).call(); + System.out.println("Created/moved tag " + tag + " to repository at " + repository.getDirectory()); + + // remove the tag again + git.tagDelete().setTags("tag_for_testing").call(); + + walk.dispose(); + } + } + } + } +} diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java new file mode 100644 index 0000000000..cb476b9d9e --- /dev/null +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java @@ -0,0 +1,74 @@ +package com.baeldung.jgit.porcelain; + +import java.io.IOException; +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +/** + * Simple snippet which shows how to get the commit-ids for a file to provide log information. + * + * + */ +public class Log { + + @SuppressWarnings("unused") + public static void main(String[] args) throws IOException, GitAPIException { + try (Repository repository = Helper.openJGitRepository()) { + try (Git git = new Git(repository)) { + Iterable logs = git.log() + .call(); + int count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits overall on current branch"); + + logs = git.log() + .add(repository.resolve("remotes/origin/testbranch")) + .call(); + count = 0; + for (RevCommit rev : logs) { + System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits overall on test-branch"); + + logs = git.log() + .all() + .call(); + count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits overall in repository"); + + logs = git.log() + // for all log.all() + .addPath("README.md") + .call(); + count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits on README.md"); + + logs = git.log() + // for all log.all() + .addPath("pom.xml") + .call(); + count = 0; + for (RevCommit rev : logs) { + //System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); + count++; + } + System.out.println("Had " + count + " commits on pom.xml"); + } + } + } +} diff --git a/JGit/src/test/java/com/baeldung/jgit/JGitBugTest.java b/JGit/src/test/java/com/baeldung/jgit/JGitBugTest.java new file mode 100644 index 0000000000..acad4e395f --- /dev/null +++ b/JGit/src/test/java/com/baeldung/jgit/JGitBugTest.java @@ -0,0 +1,31 @@ +import com.baeldung.jgit.helper.Helper; +import org.eclipse.jgit.lib.ObjectLoader; +import org.eclipse.jgit.lib.ObjectReader; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; +import org.junit.Test; +import java.io.IOException; +import static org.junit.Assert.assertNotNull; + +/** + * Tests which show issues with JGit that we reported upstream. + */ +public class JGitBugTest { + @Test + public void testRevWalkDisposeClosesReader() throws IOException { + try (Repository repo = Helper.openJGitRepository()) { + try (ObjectReader reader = repo.newObjectReader()) { + try (RevWalk walk = new RevWalk(reader)) { + walk.dispose(); + + Ref head = repo.exactRef("refs/heads/master"); + System.out.println("Found head: " + head); + + ObjectLoader loader = reader.open(head.getObjectId()); + assertNotNull(loader); + } + } + } + } +} diff --git a/JGit/src/test/java/com/baeldung/jgit/porcelain/PorcelainTest.java b/JGit/src/test/java/com/baeldung/jgit/porcelain/PorcelainTest.java new file mode 100644 index 0000000000..ce3a41e657 --- /dev/null +++ b/JGit/src/test/java/com/baeldung/jgit/porcelain/PorcelainTest.java @@ -0,0 +1,17 @@ +package com.baeldung.jgit.porcelain; + +import org.junit.Test; + +public class PorcelainTest { + @Test + public void runSamples() throws Exception { + // simply call all the samples to see any severe problems with the samples + AddFile.main(null); + + CommitAll.main(null); + + CreateAndDeleteTag.main(null); + + Log.main(null); + } +} From c5260fbdd07e7c0136bd238a8f6a5c0bacb17eb3 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Fri, 13 Jan 2017 14:46:53 +0100 Subject: [PATCH 072/120] Rename gradle-tutorial module --- {gradle-tutorial => gradle}/build.gradle | 0 {gradle-tutorial => gradle}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {gradle-tutorial => gradle}/gradlew | 0 {gradle-tutorial => gradle}/gradlew.bat | 0 {gradle-tutorial => gradle}/src/main/java/Main.java | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename {gradle-tutorial => gradle}/build.gradle (100%) rename {gradle-tutorial => gradle}/gradle.properties (100%) rename {gradle-tutorial => gradle}/gradle/wrapper/gradle-wrapper.jar (100%) rename {gradle-tutorial => gradle}/gradle/wrapper/gradle-wrapper.properties (100%) rename {gradle-tutorial => gradle}/gradlew (100%) rename {gradle-tutorial => gradle}/gradlew.bat (100%) rename {gradle-tutorial => gradle}/src/main/java/Main.java (100%) diff --git a/gradle-tutorial/build.gradle b/gradle/build.gradle similarity index 100% rename from gradle-tutorial/build.gradle rename to gradle/build.gradle diff --git a/gradle-tutorial/gradle.properties b/gradle/gradle.properties similarity index 100% rename from gradle-tutorial/gradle.properties rename to gradle/gradle.properties diff --git a/gradle-tutorial/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from gradle-tutorial/gradle/wrapper/gradle-wrapper.jar rename to gradle/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle-tutorial/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from gradle-tutorial/gradle/wrapper/gradle-wrapper.properties rename to gradle/gradle/wrapper/gradle-wrapper.properties diff --git a/gradle-tutorial/gradlew b/gradle/gradlew similarity index 100% rename from gradle-tutorial/gradlew rename to gradle/gradlew diff --git a/gradle-tutorial/gradlew.bat b/gradle/gradlew.bat similarity index 100% rename from gradle-tutorial/gradlew.bat rename to gradle/gradlew.bat diff --git a/gradle-tutorial/src/main/java/Main.java b/gradle/src/main/java/Main.java similarity index 100% rename from gradle-tutorial/src/main/java/Main.java rename to gradle/src/main/java/Main.java From 38c0a6f9a73b922196702e42a79f8d6ec07911ba Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 14 Jan 2017 09:37:31 +0200 Subject: [PATCH 073/120] cleanup formatting --- spring-thymeleaf/pom.xml | 512 +++++++++--------- .../thymeleaf/config/WebMVCConfig.java | 73 ++- .../thymeleaf/config/WebMVCSecurity.java | 8 +- .../thymeleaf/controller/DatesController.java | 16 +- .../ExpressionUtilityObjectsController.java | 24 +- .../controller/InliningController.java | 20 +- .../controller/LayoutDialectController.java | 4 +- .../controller/StudentController.java | 42 +- .../baeldung/thymeleaf/utils/ArrayUtil.java | 6 +- .../thymeleaf/utils/StudentUtils.java | 38 +- ...ilityObjectsControllerIntegrationTest.java | 47 +- ...ayoutDialectControllerIntegrationTest.java | 10 +- .../csrf/CsrfEnabledIntegrationTest.java | 6 +- 13 files changed, 404 insertions(+), 402 deletions(-) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index c43ab4dbb2..457ac6dd56 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -1,262 +1,272 @@ - 4.0.0 - com.baeldung - spring-thymeleaf - 0.1-SNAPSHOT - war - - 1.8 - - 4.3.4.RELEASE - 4.2.0.RELEASE - 3.1.0 - - 1.7.21 - 1.1.7 - - 3.0.3.RELEASE - 3.0.0.RELEASE - 2.1.2 - - 1.1.0.Final - 5.3.3.Final - 5.2.5.Final + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + spring-thymeleaf + 0.1-SNAPSHOT + war - 4.12 - - 3.6.0 - 2.6 - 2.19.1 - 1.6.1 - 2.2 - + + + + org.springframework + spring-context + ${org.springframework-version} + + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + ${org.springframework-version} + - - - - org.springframework - spring-context - ${org.springframework-version} - - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - ${org.springframework-version} - - - - org.springframework.security - spring-security-web - ${springframework-security.version} - - - org.springframework.security - spring-security-config - ${springframework-security.version} - - - - org.thymeleaf - thymeleaf - ${org.thymeleaf-version} - - - org.thymeleaf - thymeleaf-spring4 - ${org.thymeleaf-version} - - - - nz.net.ultraq.thymeleaf - thymeleaf-layout-dialect - ${thymeleaf-layout-dialect.version} - - - org.thymeleaf.extras - thymeleaf-extras-java8time - ${org.thymeleaf.extras-version} - - - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - - javax.servlet - javax.servlet-api - ${javax.servlet-version} - provided - - - - javax.validation - validation-api - ${javax.validation-version} - - - org.hibernate - hibernate-validator - ${hibernate-validator.version} - - + + + org.springframework.security + spring-security-web + ${springframework-security.version} + + + org.springframework.security + spring-security-config + ${springframework-security.version} + - - org.springframework - spring-test - ${org.springframework-version} - test - + + + org.thymeleaf + thymeleaf + ${org.thymeleaf-version} + + + org.thymeleaf + thymeleaf-spring4 + ${org.thymeleaf-version} + - - - org.springframework.security - spring-security-test - ${springframework-security.version} - test - + + nz.net.ultraq.thymeleaf + thymeleaf-layout-dialect + ${thymeleaf-layout-dialect.version} + + + org.thymeleaf.extras + thymeleaf-extras-java8time + ${org.thymeleaf.extras-version} + - - - junit - junit - ${junit.version} - test - + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + - + + + javax.servlet + javax.servlet-api + ${javax.servlet-version} + provided + - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java-version} - ${java-version} - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - false - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - **/*IntegrationTest.java - **/*LiveTest.java - - - + + + javax.validation + validation-api + ${javax.validation-version} + + + org.hibernate + hibernate-validator + ${hibernate-validator.version} + - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - true - - jetty8x - embedded - - - - - - 8082 - - - - - - org.apache.tomcat.maven - tomcat7-maven-plugin - ${tomcat7-maven-plugin.version} - - - tomcat-run - - exec-war-only - - package - - / - false - webapp.jar - utf-8 - - - - - - + + + org.springframework + spring-test + ${org.springframework-version} + test + + + + org.springframework.security + spring-security-test + ${springframework-security.version} + test + + + + junit + junit + ${junit.version} + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java-version} + ${java-version} + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + + + 8082 + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + ${tomcat7-maven-plugin.version} + + + tomcat-run + + exec-war-only + + package + + / + false + webapp.jar + utf-8 + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + 1.8 + + 4.3.5.RELEASE + 4.2.1.RELEASE + 3.1.0 + + + 1.7.21 + 1.1.7 + + + 3.0.3.RELEASE + 3.0.0.RELEASE + 2.1.2 + + + 1.1.0.Final + 5.3.3.Final + 5.2.5.Final + + 4.12 + + + 3.6.0 + 2.6 + 2.19.1 + 1.6.1 + 2.2 + + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java index 3dc84ed6e9..10b9f0b7a0 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java @@ -26,7 +26,6 @@ import com.baeldung.thymeleaf.utils.ArrayUtil; import nz.net.ultraq.thymeleaf.LayoutDialect; import nz.net.ultraq.thymeleaf.decorators.strategies.GroupingStrategy; - @Configuration @EnableWebMvc @ComponentScan({ "com.baeldung.thymeleaf" }) @@ -36,23 +35,23 @@ import nz.net.ultraq.thymeleaf.decorators.strategies.GroupingStrategy; */ public class WebMVCConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { - private ApplicationContext applicationContext; + private ApplicationContext applicationContext; - public void setApplicationContext(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } - @Bean - public ViewResolver htmlViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.setTemplateEngine(templateEngine(htmlTemplateResolver())); - resolver.setContentType("text/html"); - resolver.setCharacterEncoding("UTF-8"); - resolver.setViewNames(ArrayUtil.array("*.html")); - return resolver; - } - - @Bean + @Bean + public ViewResolver htmlViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.setTemplateEngine(templateEngine(htmlTemplateResolver())); + resolver.setContentType("text/html"); + resolver.setCharacterEncoding("UTF-8"); + resolver.setViewNames(ArrayUtil.array("*.html")); + return resolver; + } + + @Bean public ViewResolver javascriptViewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver())); @@ -61,8 +60,8 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application resolver.setViewNames(ArrayUtil.array("*.js")); return resolver; } - - @Bean + + @Bean public ViewResolver plainViewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine(plainTemplateResolver())); @@ -72,7 +71,7 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application return resolver; } - private TemplateEngine templateEngine(ITemplateResolver templateResolver) { + private TemplateEngine templateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.addDialect(new LayoutDialect(new GroupingStrategy())); engine.addDialect(new Java8TimeDialect()); @@ -88,7 +87,7 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application resolver.setTemplateMode(TemplateMode.HTML); return resolver; } - + private ITemplateResolver javascriptTemplateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setApplicationContext(applicationContext); @@ -97,7 +96,7 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application resolver.setTemplateMode(TemplateMode.JAVASCRIPT); return resolver; } - + private ITemplateResolver plainTemplateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setApplicationContext(applicationContext); @@ -107,22 +106,22 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application return resolver; } - @Bean - @Description("Spring Message Resolver") - public ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("messages"); - return messageSource; - } + @Bean + @Description("Spring Message Resolver") + public ResourceBundleMessageSource messageSource() { + ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + messageSource.setBasename("messages"); + return messageSource; + } - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/"); - } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/"); + } - @Override - @Description("Custom Conversion Service") - public void addFormatters(FormatterRegistry registry) { - registry.addFormatter(new NameFormatter()); - } + @Override + @Description("Custom Conversion Service") + public void addFormatters(FormatterRegistry registry) { + registry.addFormatter(new NameFormatter()); + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java index 37844a2976..46bff38a3f 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java @@ -37,13 +37,7 @@ public class WebMVCSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(final HttpSecurity http) throws Exception { - http - .authorizeRequests() - .anyRequest() - .authenticated() - .and() - .httpBasic() - ; + http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java index 74e2356076..20f5d02fed 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java @@ -13,13 +13,13 @@ import org.springframework.web.bind.annotation.RequestMethod; @Controller public class DatesController { - @RequestMapping(value = "/dates", method = RequestMethod.GET) - public String getInfo(Model model) { - model.addAttribute("standardDate", new Date()); - model.addAttribute("localDateTime", LocalDateTime.now()); - model.addAttribute("localDate", LocalDate.now()); - model.addAttribute("timestamp", Instant.now()); - return "dates.html"; - } + @RequestMapping(value = "/dates", method = RequestMethod.GET) + public String getInfo(Model model) { + model.addAttribute("standardDate", new Date()); + model.addAttribute("localDateTime", LocalDateTime.now()); + model.addAttribute("localDate", LocalDate.now()); + model.addAttribute("timestamp", Instant.now()); + return "dates.html"; + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java index f30b9b2078..61c3e8de8f 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsController.java @@ -17,17 +17,17 @@ import org.springframework.web.bind.annotation.RequestMethod; @Controller public class ExpressionUtilityObjectsController { - @RequestMapping(value = "/objects", method = RequestMethod.GET) - public String getDates(Model model) { - model.addAttribute("date", new Date()); - model.addAttribute("calendar", Calendar.getInstance()); - model.addAttribute("num", Math.random() * 10); - model.addAttribute("string", "new text"); - model.addAttribute("emptyString", ""); - model.addAttribute("nullString", null); - model.addAttribute("array", new int[] { 1, 3, 4, 5 }); - model.addAttribute("set", new HashSet(Arrays.asList(1, 3, 8))); - return "objects.html"; - } + @RequestMapping(value = "/objects", method = RequestMethod.GET) + public String getDates(Model model) { + model.addAttribute("date", new Date()); + model.addAttribute("calendar", Calendar.getInstance()); + model.addAttribute("num", Math.random() * 10); + model.addAttribute("string", "new text"); + model.addAttribute("emptyString", ""); + model.addAttribute("nullString", null); + model.addAttribute("array", new int[] { 1, 3, 4, 5 }); + model.addAttribute("set", new HashSet(Arrays.asList(1, 3, 8))); + return "objects.html"; + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java index 9e3f14ac8e..e8e6339663 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/InliningController.java @@ -11,23 +11,23 @@ import com.baeldung.thymeleaf.utils.StudentUtils; @Controller public class InliningController { - @RequestMapping(value = "/html", method = RequestMethod.GET) + @RequestMapping(value = "/html", method = RequestMethod.GET) public String getExampleHTML(Model model) { - model.addAttribute("title", "Baeldung"); - model.addAttribute("description", "Thymeleaf tutorial"); + model.addAttribute("title", "Baeldung"); + model.addAttribute("description", "Thymeleaf tutorial"); return "inliningExample.html"; } - - @RequestMapping(value = "/js", method = RequestMethod.GET) + + @RequestMapping(value = "/js", method = RequestMethod.GET) public String getExampleJS(Model model) { - model.addAttribute("students", StudentUtils.buildStudents()); + model.addAttribute("students", StudentUtils.buildStudents()); return "studentCheck.js"; } - - @RequestMapping(value = "/plain", method = RequestMethod.GET) + + @RequestMapping(value = "/plain", method = RequestMethod.GET) public String getExamplePlain(Model model) { - model.addAttribute("username", SecurityContextHolder.getContext().getAuthentication().getName()); - model.addAttribute("students", StudentUtils.buildStudents()); + model.addAttribute("username", SecurityContextHolder.getContext().getAuthentication().getName()); + model.addAttribute("students", StudentUtils.buildStudents()); return "studentsList.txt"; } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java index 28a38ce30b..af999233bf 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/LayoutDialectController.java @@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.RequestMethod; @Controller public class LayoutDialectController { - - @RequestMapping(value = "/layout", method = RequestMethod.GET) + + @RequestMapping(value = "/layout", method = RequestMethod.GET) public String getNewPage(Model model) { return "content.html"; } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java index 1f40046caa..77cf02c902 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/StudentController.java @@ -21,30 +21,30 @@ import com.baeldung.thymeleaf.utils.StudentUtils; @Controller public class StudentController { - @RequestMapping(value = "/saveStudent", method = RequestMethod.POST) - public String saveStudent(@Valid @ModelAttribute Student student, BindingResult errors, Model model) { - if (!errors.hasErrors()) { - // get mock objects - List students = StudentUtils.buildStudents(); - // add current student - students.add(student); - model.addAttribute("students", students); - } - return ((errors.hasErrors()) ? "addStudent.html" : "listStudents.html"); - } + @RequestMapping(value = "/saveStudent", method = RequestMethod.POST) + public String saveStudent(@Valid @ModelAttribute Student student, BindingResult errors, Model model) { + if (!errors.hasErrors()) { + // get mock objects + List students = StudentUtils.buildStudents(); + // add current student + students.add(student); + model.addAttribute("students", students); + } + return ((errors.hasErrors()) ? "addStudent.html" : "listStudents.html"); + } - @RequestMapping(value = "/addStudent", method = RequestMethod.GET) - public String addStudent(Model model) { - model.addAttribute("student", new Student()); - return "addStudent.html"; - } + @RequestMapping(value = "/addStudent", method = RequestMethod.GET) + public String addStudent(Model model) { + model.addAttribute("student", new Student()); + return "addStudent.html"; + } - @RequestMapping(value = "/listStudents", method = RequestMethod.GET) - public String listStudent(Model model) { + @RequestMapping(value = "/listStudents", method = RequestMethod.GET) + public String listStudent(Model model) { - model.addAttribute("students", StudentUtils.buildStudents()); + model.addAttribute("students", StudentUtils.buildStudents()); - return "listStudents.html"; - } + return "listStudents.html"; + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java index d85c70c1b7..5c07476c9b 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/ArrayUtil.java @@ -2,7 +2,7 @@ package com.baeldung.thymeleaf.utils; public class ArrayUtil { - public static String[] array(String... args) { - return args; - } + public static String[] array(String... args) { + return args; + } } \ No newline at end of file diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java index f7ed254641..5ee2b7eb85 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/StudentUtils.java @@ -7,28 +7,28 @@ import com.baeldung.thymeleaf.model.Student; public class StudentUtils { - private static List students = new ArrayList(); + private static List students = new ArrayList(); - public static List buildStudents() { - if (students.isEmpty()){ - Student student1 = new Student(); - student1.setId(1001); - student1.setName("John Smith"); - student1.setGender('M'); - student1.setPercentage(Float.valueOf("80.45")); + public static List buildStudents() { + if (students.isEmpty()) { + Student student1 = new Student(); + student1.setId(1001); + student1.setName("John Smith"); + student1.setGender('M'); + student1.setPercentage(Float.valueOf("80.45")); - students.add(student1); + students.add(student1); - Student student2 = new Student(); - student2.setId(1002); - student2.setName("Jane Williams"); - student2.setGender('F'); - student2.setPercentage(Float.valueOf("60.25")); + Student student2 = new Student(); + student2.setId(1002); + student2.setName("Jane Williams"); + student2.setGender('F'); + student2.setPercentage(Float.valueOf("60.25")); - students.add(student2); - } - - return students; - } + students.add(student2); + } + + return students; + } } diff --git a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java index 923d98324b..5211136c35 100644 --- a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java @@ -31,35 +31,34 @@ import com.baeldung.thymeleaf.config.WebMVCSecurity; @ContextConfiguration(classes = { WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class }) public class ExpressionUtilityObjectsControllerIntegrationTest { - @Autowired - WebApplicationContext wac; - @Autowired - MockHttpSession session; + @Autowired + WebApplicationContext wac; + + @Autowired + MockHttpSession session; - private MockMvc mockMvc; + private MockMvc mockMvc; - @Autowired - private Filter springSecurityFilterChain; + @Autowired + private Filter springSecurityFilterChain; - protected RequestPostProcessor testUser() { - return user("user1").password("user1Pass").roles("USER"); - } + protected RequestPostProcessor testUser() { + return user("user1").password("user1Pass").roles("USER"); + } - @Before - public void setup() { - mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); - } + @Before + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); + } - @Test - public void testGetObjects() throws Exception { - mockMvc.perform(get("/objects").with(testUser()).with(csrf())).andExpect(status().isOk()) - .andExpect(view().name("objects.html")); - } + @Test + public void testGetObjects() throws Exception { + mockMvc.perform(get("/objects").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("objects.html")); + } - @Test - public void testDates() throws Exception { - mockMvc.perform(get("/dates").with(testUser()).with(csrf())).andExpect(status().isOk()) - .andExpect(view().name("dates.html")); - } + @Test + public void testDates() throws Exception { + mockMvc.perform(get("/dates").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("dates.html")); + } } diff --git a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java index 23113dc229..62c364f864 100644 --- a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/LayoutDialectControllerIntegrationTest.java @@ -31,7 +31,7 @@ import com.baeldung.thymeleaf.config.WebMVCSecurity; @ContextConfiguration(classes = { WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class }) public class LayoutDialectControllerIntegrationTest { - @Autowired + @Autowired WebApplicationContext wac; @Autowired MockHttpSession session; @@ -50,9 +50,9 @@ public class LayoutDialectControllerIntegrationTest { mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); } - @Test - public void testGetDates() throws Exception{ - mockMvc.perform(get("/layout").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("content.html")); - } + @Test + public void testGetDates() throws Exception { + mockMvc.perform(get("/layout").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("content.html")); + } } diff --git a/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java b/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java index 3542571bbc..3d8ddfdd5c 100644 --- a/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/org/baeldung/security/csrf/CsrfEnabledIntegrationTest.java @@ -59,17 +59,17 @@ public class CsrfEnabledIntegrationTest { public void addStudentWithCSRF() throws Exception { mockMvc.perform(post("/saveStudent").contentType(MediaType.APPLICATION_JSON).param("id", "1234567").param("name", "Joe").param("gender", "M").with(testUser()).with(csrf())).andExpect(status().isOk()); } - + @Test public void htmlInliningTest() throws Exception { mockMvc.perform(get("/html").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("inliningExample.html")); } - + @Test public void jsInliningTest() throws Exception { mockMvc.perform(get("/js").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("studentCheck.js")); } - + @Test public void plainInliningTest() throws Exception { mockMvc.perform(get("/plain").with(testUser()).with(csrf())).andExpect(status().isOk()).andExpect(view().name("studentsList.txt")); From 30d9102310434913de614e0b3c61aa93751694a8 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 14 Jan 2017 10:07:53 +0100 Subject: [PATCH 074/120] BAEL-586 increment guava version, move Test to guava module --- guava/pom.xml | 2 +- .../org/baeldung/guava/GuavaStringTest.java | 57 +++++++++++++++-- .../java/com/baeldung/guava/MultimapTest.java | 62 ------------------- 3 files changed, 52 insertions(+), 69 deletions(-) delete mode 100644 guava19/src/test/java/com/baeldung/guava/MultimapTest.java diff --git a/guava/pom.xml b/guava/pom.xml index a7b4e79e34..0a50fad2c3 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -92,7 +92,7 @@ - 19.0 + 21.0 3.5 4.1 diff --git a/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java b/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java index be230a9b0e..7cf986baaf 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java @@ -8,10 +8,9 @@ import static org.junit.Assert.assertTrue; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +import com.google.common.collect.*; import org.junit.Test; import com.google.common.base.CharMatcher; @@ -19,9 +18,6 @@ import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; public class GuavaStringTest { @@ -215,4 +211,53 @@ public class GuavaStringTest { assertEquals("hello", result); } + public static class MultimapTest { + + @Test + public void givenMap_whenAddTwoValuesForSameKey_shouldOverridePreviousKey() { + //given + String key = "a-key"; + Map map = new LinkedHashMap<>(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(1, map.size()); + } + + @Test + public void givenMultiMap_whenAddTwoValuesForSameKey_shouldHaveTwoEntriesInMap() { + //given + String key = "a-key"; + Multimap map = ArrayListMultimap.create(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(2, map.size()); + } + + @Test + public void givenMapOfListValues_whenAddTwoValuesForSameKey_shouldHaveTwoElementsInList() { + //given + String key = "a-key"; + Map> map = new LinkedHashMap<>(); + + //when + List values = map.get(key); + if(values == null){ + values = new LinkedList<>(); + values.add("firstValue"); + values.add("secondValue"); + } + map.put(key, values); + + //then + assertEquals(1, map.size()); + } + } } diff --git a/guava19/src/test/java/com/baeldung/guava/MultimapTest.java b/guava19/src/test/java/com/baeldung/guava/MultimapTest.java deleted file mode 100644 index c984ab1e4b..0000000000 --- a/guava19/src/test/java/com/baeldung/guava/MultimapTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.guava; - -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; -import org.junit.Test; - -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import static org.junit.Assert.assertEquals; - -public class MultimapTest { - - @Test - public void givenMap_whenAddTwoValuesForSameKey_shouldOverridePreviousKey() { - //given - String key = "a-key"; - Map map = new LinkedHashMap<>(); - - //when - map.put(key, "firstValue"); - map.put(key, "secondValue"); - - //then - assertEquals(1, map.size()); - } - - @Test - public void givenMultiMap_whenAddTwoValuesForSameKey_shouldHaveTwoEntriesInMap() { - //given - String key = "a-key"; - Multimap map = ArrayListMultimap.create(); - - //when - map.put(key, "firstValue"); - map.put(key, "secondValue"); - - //then - assertEquals(2, map.size()); - } - - @Test - public void givenMapOfListValues_whenAddTwoValuesForSameKey_shouldHaveTwoElementsInList() { - //given - String key = "a-key"; - Map> map = new LinkedHashMap<>(); - - //when - List values = map.get(key); - if(values == null){ - values = new LinkedList<>(); - values.add("firstValue"); - values.add("secondValue"); - } - map.put(key, values); - - //then - assertEquals(1, map.size()); - } -} From 75bc156357fa0110adc1de21dbb86653d3fa22c5 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 14 Jan 2017 10:11:52 +0100 Subject: [PATCH 075/120] BAEL-586 proper file for test --- .../org/baeldung/guava/GuavaMultiMapTest.java | 63 +++++++++++++++++++ .../org/baeldung/guava/GuavaStringTest.java | 49 --------------- 2 files changed, 63 insertions(+), 49 deletions(-) create mode 100644 guava/src/test/java/org/baeldung/guava/GuavaMultiMapTest.java diff --git a/guava/src/test/java/org/baeldung/guava/GuavaMultiMapTest.java b/guava/src/test/java/org/baeldung/guava/GuavaMultiMapTest.java new file mode 100644 index 0000000000..5e80dd2f87 --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/GuavaMultiMapTest.java @@ -0,0 +1,63 @@ +package org.baeldung.guava; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import org.junit.Test; + +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + + +public class GuavaMultiMapTest { + + @Test + public void givenMap_whenAddTwoValuesForSameKey_shouldOverridePreviousKey() { + //given + String key = "a-key"; + Map map = new LinkedHashMap<>(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(1, map.size()); + } + + @Test + public void givenMultiMap_whenAddTwoValuesForSameKey_shouldHaveTwoEntriesInMap() { + //given + String key = "a-key"; + Multimap map = ArrayListMultimap.create(); + + //when + map.put(key, "firstValue"); + map.put(key, "secondValue"); + + //then + assertEquals(2, map.size()); + } + + @Test + public void givenMapOfListValues_whenAddTwoValuesForSameKey_shouldHaveTwoElementsInList() { + //given + String key = "a-key"; + Map> map = new LinkedHashMap<>(); + + //when + List values = map.get(key); + if(values == null){ + values = new LinkedList<>(); + values.add("firstValue"); + values.add("secondValue"); + } + map.put(key, values); + + //then + assertEquals(1, map.size()); + } +} \ No newline at end of file diff --git a/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java b/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java index 7cf986baaf..cedbe60d91 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaStringTest.java @@ -211,53 +211,4 @@ public class GuavaStringTest { assertEquals("hello", result); } - public static class MultimapTest { - - @Test - public void givenMap_whenAddTwoValuesForSameKey_shouldOverridePreviousKey() { - //given - String key = "a-key"; - Map map = new LinkedHashMap<>(); - - //when - map.put(key, "firstValue"); - map.put(key, "secondValue"); - - //then - assertEquals(1, map.size()); - } - - @Test - public void givenMultiMap_whenAddTwoValuesForSameKey_shouldHaveTwoEntriesInMap() { - //given - String key = "a-key"; - Multimap map = ArrayListMultimap.create(); - - //when - map.put(key, "firstValue"); - map.put(key, "secondValue"); - - //then - assertEquals(2, map.size()); - } - - @Test - public void givenMapOfListValues_whenAddTwoValuesForSameKey_shouldHaveTwoElementsInList() { - //given - String key = "a-key"; - Map> map = new LinkedHashMap<>(); - - //when - List values = map.get(key); - if(values == null){ - values = new LinkedList<>(); - values.add("firstValue"); - values.add("secondValue"); - } - map.put(key, values); - - //then - assertEquals(1, map.size()); - } - } } From 49cf1e6ed84c4a8b37b083bdb688f66337f510e1 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sat, 14 Jan 2017 15:32:05 +0100 Subject: [PATCH 076/120] BAEL-97 - simplifying code --- .../config/HandlerMappingDefaultConfig.java | 28 +++++++++++++ .../HandlerMappingPrioritiesConfig.java | 3 +- .../HandlerMappingDefaultConfigTest.java | 41 +++++++++++++++++++ .../HandlerMappingPriorityConfigTest.java | 2 +- 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java create mode 100644 spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java diff --git a/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java new file mode 100644 index 0000000000..9190d07d6b --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java @@ -0,0 +1,28 @@ +package com.baeldung.config; + +import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; +import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; +import com.baeldung.web.controller.handlermapping.WelcomeController; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; + +import java.util.HashMap; +import java.util.Map; + + +@Configuration +public class HandlerMappingDefaultConfig { + + @Bean("/welcome") + public BeanNameHandlerMappingController beanNameHandlerMapping() { + return new BeanNameHandlerMappingController(); + } + + @Bean + public WelcomeController welcome() { + return new WelcomeController(); + } + +} \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java index 2b09947e97..2d80dbfeaf 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingPrioritiesConfig.java @@ -18,13 +18,14 @@ public class HandlerMappingPrioritiesConfig { @Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping(); - beanNameUrlHandlerMapping.setOrder(0); + beanNameUrlHandlerMapping.setOrder(1); return beanNameUrlHandlerMapping; } @Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); + simpleUrlHandlerMapping.setOrder(0); Map urlMap = new HashMap<>(); urlMap.put("/welcome", simpleUrlMapping()); simpleUrlHandlerMapping.setUrlMap(urlMap); diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java new file mode 100644 index 0000000000..01be65b829 --- /dev/null +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingDefaultConfigTest.java @@ -0,0 +1,41 @@ +package com.baeldung.handlermappings; + +import com.baeldung.config.HandlerMappingDefaultConfig; +import com.baeldung.config.HandlerMappingPrioritiesConfig; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = HandlerMappingDefaultConfig.class) +public class HandlerMappingDefaultConfigTest { + + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext).build(); + } + + @Test + public void whenDefaultConfig_thenMappedOK() throws Exception { + mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("bean-name-handler-mapping")).andDo(print()); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java index 26d7b88baa..d6329ca6c1 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/handlermappings/HandlerMappingPriorityConfigTest.java @@ -35,6 +35,6 @@ public class HandlerMappingPriorityConfigTest { @Test public void whenConfiguringPriorities_thenMappedOK() throws Exception { - mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("bean-name-handler-mapping")).andDo(print()); + mockMvc.perform(get("/welcome")).andExpect(status().isOk()).andExpect(view().name("simple-url-handler-mapping")).andDo(print()); } } \ No newline at end of file From fde39503a3f50457c86f0ffaaa75670e50df40c3 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Sat, 14 Jan 2017 19:27:43 +0100 Subject: [PATCH 077/120] BAEL-586 no need for else block --- kotlin/src/main/kotlin/com/baeldung/ItemService.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt index 4a799a9901..f117ea5c52 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt +++ b/kotlin/src/main/kotlin/com/baeldung/ItemService.kt @@ -61,9 +61,6 @@ fun main(args: Array) { when (name) { "John" -> println("Hi man") "Alice" -> println("Hi lady") - else -> { - println("Hi") - } } } \ No newline at end of file From 2b2dc447bf4f72b933f770db1e6fcf85e23170b7 Mon Sep 17 00:00:00 2001 From: gatmeister Date: Sun, 15 Jan 2017 06:49:14 +0800 Subject: [PATCH 078/120] BAEL-112 | Spring MVC Validation - a Custom Validator (#934) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BAEL-112 | Spring MVC Validation - a Custom Validator ### Implementation of a custom validator in Employee class using Validator interface * BAEL-112 | Spring MVC Validation - a Custom Validator Implementation of a custom validator in Employee class using Validator interface * BAEL-112 | Spring MVC Validation - a Custom Validator Reverting changes made for a previous module * BAEL-112 | Spring MVC Validation - a Custom Validator Reverting changes to module ‘spring-mvc-java’ * BAEL-112 | Spring MVC Validation - a Custom Validator Reverting changes to module ‘spring-mvc-java’ * BAEL-112 | Spring MVC Validation - a Custom Validator Final reversion of changes to previous module used * BAEL-112 | Spring MVC Validation - a Custom Validator formats the EmployeeValidator class * BAEL-112 | Spring MVC Validation - a Custom Validator Modification from @RequestMapping POST to @PostMapping as per Final Review * BAEL-112 | Spring MVC Validation - a Custom Validator Reverts the changes made to Employee and Employee Controller. Created a new class, Customer as implementation for custom validation * BAEL-112 | Spring MVC Validation - a Custom Validator Reverting EmployeeController * BAEL-112 | Spring MVC Validation - a Custom Validator Reverting EmployeeHome --- .../controller/CustomerController.java | 42 +++++++++++++++++ .../springmvcforms/domain/Customer.java | 45 ++++++++++++++++++ .../validator/CustomerValidator.java | 28 +++++++++++ .../webapp/WEB-INF/views/customerHome.jsp | 47 +++++++++++++++++++ .../webapp/WEB-INF/views/customerView.jsp | 28 +++++++++++ 5 files changed, 190 insertions(+) create mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java create mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java create mode 100644 spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp create mode 100644 spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java new file mode 100644 index 0000000000..586c2467fe --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java @@ -0,0 +1,42 @@ +package com.baeldung.springmvcforms.controller; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import com.baeldung.springmvcforms.domain.Customer; +import com.baeldung.springmvcforms.validator.CustomerValidator; + +@Controller +public class CustomerController { + + @Autowired + CustomerValidator validator; + + @RequestMapping(value = "/customer", method = RequestMethod.GET) + public ModelAndView showForm() { + return new ModelAndView("customerHome", "customer", new Customer()); + } + + @PostMapping("/addCustomer") + public String submit(@Valid @ModelAttribute("customer") final Customer customer, final BindingResult result, final ModelMap model) { + validator.validate(customer, result); + if (result.hasErrors()) { + return "customerHome"; + } + model.addAttribute("customerId", customer.getCustomerId()); + model.addAttribute("customerName", customer.getCustomerName()); + model.addAttribute("customerContact", customer.getCustomerContact()); + model.addAttribute("customerEmail", customer.getCustomerEmail()); + return "customerView"; + } + +} diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java new file mode 100644 index 0000000000..8ecb2aa503 --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java @@ -0,0 +1,45 @@ +package com.baeldung.springmvcforms.domain; + +public class Customer { + private String customerId; + private String customerName; + private String customerContact; + private String customerEmail; + + public Customer() { + super(); + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getCustomerContact() { + return customerContact; + } + + public void setCustomerContact(String customerContact) { + this.customerContact = customerContact; + } + + public String getCustomerEmail() { + return customerEmail; + } + + public void setCustomerEmail(String customerEmail) { + this.customerEmail = customerEmail; + } + +} diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java new file mode 100644 index 0000000000..94a7bd0ebd --- /dev/null +++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java @@ -0,0 +1,28 @@ +package com.baeldung.springmvcforms.validator; + +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; + +import com.baeldung.springmvcforms.domain.Customer; + +@Component +public class CustomerValidator implements Validator { + + @Override + public boolean supports(Class clazz) { + return Customer.class.isAssignableFrom(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerId", "error.customerId", "Customer Id is required."); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerName", "error.customerName", "Customer Name is required."); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerContact", "error.customerNumber", "Customer Contact is required."); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "customerEmail", "error.customerEmail", "Customer Email is required."); + + } + +} diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp new file mode 100644 index 0000000000..df34a47cc0 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp @@ -0,0 +1,47 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> + + + +Form Example - Add Customer + + + +

    Welcome, Enter The Customer Details

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Customer Id
    Customer Name
    Customer Contact
    Customer Email
    +
    + + + + \ No newline at end of file diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp new file mode 100644 index 0000000000..ab2631bd02 --- /dev/null +++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp @@ -0,0 +1,28 @@ +<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + +Spring MVC Form Handling + + + +

    Submitted Customer Information

    + + + + + + + + + + + + + + + + + +
    Customer Id :${customerId}
    Customer Name :${customerName}
    Customer Contact :${customerContact}
    Customer Email :${customerEmail}
    + + \ No newline at end of file From b5d525ad7c6c7ea9f94833c4ef1b039f63f2bf43 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 15 Jan 2017 06:50:07 +0100 Subject: [PATCH 079/120] Refactor JerseyApiLiveTest --- .../baeldung/server/JerseyApiLiveTest.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java b/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java index 80c4e94b50..835f9144ab 100644 --- a/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java +++ b/spring-jersey/src/test/java/com/baeldung/server/JerseyApiLiveTest.java @@ -1,10 +1,9 @@ package com.baeldung.server; -import java.io.IOException; - +import com.baeldung.server.model.Employee; +import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; @@ -12,15 +11,14 @@ import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.junit.Test; -import com.baeldung.server.model.Employee; -import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; public class JerseyApiLiveTest { private static final String SERVICE_URL = "http://localhost:8082/jersey-api/resources/employees"; @Test - public void givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess() throws ClientProtocolException, IOException { + public void givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess() throws IOException { final HttpUriRequest request = new HttpGet(SERVICE_URL); final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); @@ -29,7 +27,7 @@ public class JerseyApiLiveTest { } @Test - public void givenGetEmployee_whenEmployeeExists_thenResponseCodeSuccess() throws ClientProtocolException, IOException { + public void givenGetEmployee_whenEmployeeExists_thenResponseCodeSuccess() throws IOException { final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1"); final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); @@ -38,7 +36,7 @@ public class JerseyApiLiveTest { } @Test - public void givenGetEmployee_whenEmployeeDoesNotExist_thenResponseCodeNotFound() throws ClientProtocolException, IOException { + public void givenGetEmployee_whenEmployeeDoesNotExist_thenResponseCodeNotFound() throws IOException { final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1000"); final HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request); @@ -47,7 +45,7 @@ public class JerseyApiLiveTest { } @Test - public void givenGetEmployee_whenJsonRequested_thenCorrectDataRetrieved() throws ClientProtocolException, IOException { + public void givenGetEmployee_whenJsonRequested_thenCorrectDataRetrieved() throws IOException { final HttpUriRequest request = new HttpGet(SERVICE_URL + "/1"); request.setHeader("Accept", "application/json"); @@ -59,7 +57,7 @@ public class JerseyApiLiveTest { } @Test - public void givenAddEmployee_whenJsonRequestSent_thenResponseCodeCreated() throws ClientProtocolException, IOException { + public void givenAddEmployee_whenJsonRequestSent_thenResponseCodeCreated() throws IOException { final HttpPost request = new HttpPost(SERVICE_URL); Employee emp = new Employee(5, "Johny"); @@ -74,7 +72,7 @@ public class JerseyApiLiveTest { } @Test - public void givenAddEmployee_whenRequestForExistingObjectSent_thenResponseCodeConflict() throws ClientProtocolException, IOException { + public void givenAddEmployee_whenRequestForExistingObjectSent_thenResponseCodeConflict() throws IOException { final HttpPost request = new HttpPost(SERVICE_URL); Employee emp = new Employee(1, "Johny"); From 5a6eaeb1d23dae06260e3caad17b8894828c9f7e Mon Sep 17 00:00:00 2001 From: pivovarit Date: Sun, 15 Jan 2017 09:27:07 +0100 Subject: [PATCH 080/120] Refactor InputStreamToFile examples --- .../java/io/JavaInputStreamToXUnitTest.java | 54 ++++++++----------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java b/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java index 1a6ac5f8ce..6d6d4d9c9b 100644 --- a/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java +++ b/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java @@ -1,38 +1,26 @@ package org.baeldung.java.io; -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.io.StringWriter; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.StandardCopyOption; -import java.util.Scanner; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.common.base.Charsets; import com.google.common.io.ByteSource; import com.google.common.io.ByteStreams; import com.google.common.io.CharStreams; import com.google.common.io.Files; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.StandardCopyOption; +import java.util.Scanner; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; @SuppressWarnings("unused") public class JavaInputStreamToXUnitTest { @@ -163,7 +151,7 @@ public class JavaInputStreamToXUnitTest { // tests - InputStream to File @Test - public final void givenUsingPlainJava_whenConvertingAnFullInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingToFile_thenCorrect() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); @@ -177,7 +165,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingPlainJava_whenConvertingAnInProgressInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingInProgressToFile_thenCorrect() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final File targetFile = new File("src/main/resources/targetFile.tmp"); final OutputStream outStream = new FileOutputStream(targetFile); @@ -193,7 +181,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingPlainJava8_whenConvertingAnInProgressInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingAnInProgressInputStreamToFile_thenCorrect2() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final File targetFile = new File("src/main/resources/targetFile.tmp"); @@ -203,7 +191,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingGuava_whenConvertingAnInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingInputStreamToFile_thenCorrect3() throws IOException { final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); final byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); @@ -215,7 +203,7 @@ public class JavaInputStreamToXUnitTest { } @Test - public final void givenUsingCommonsIO_whenConvertingAnInputStreamToAFile_thenCorrect() throws IOException { + public final void whenConvertingInputStreamToFile_thenCorrect4() throws IOException { final InputStream initialStream = FileUtils.openInputStream(new File("src/main/resources/sample.txt")); final File targetFile = new File("src/main/resources/targetFile.tmp"); From d77ca20ff20cab8fbbc9589b947d8c6615d0c660 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sun, 15 Jan 2017 15:15:11 +0100 Subject: [PATCH 081/120] BAEL-583 - adding asserts to test --- .../baeldung/java8/Java8FindAnyFindFirstTest.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstTest.java b/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstTest.java index 7708d7e098..c90b7d79c2 100644 --- a/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstTest.java +++ b/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstTest.java @@ -1,17 +1,16 @@ package com.baeldung.java8; -import org.assertj.core.condition.AnyOf; -import org.hamcrest.Matchers; -import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.Optional; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; +import static org.hamcrest.Matchers.anyOf; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; public class Java8FindAnyFindFirstTest { @@ -22,7 +21,7 @@ public class Java8FindAnyFindFirstTest { Optional result = list.stream().findAny(); - assert result.isPresent(); + assertTrue(result.isPresent()); assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D"))); } @@ -33,7 +32,7 @@ public class Java8FindAnyFindFirstTest { Optional result = list.stream().findFirst(); - assert result.isPresent(); + assertTrue(result.isPresent()); assertThat(result.get(),is("A")); } } From baf7d5fb392241a74d0ca7c6d1c4d6f49b11f481 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sun, 15 Jan 2017 21:02:24 +0600 Subject: [PATCH 082/120] Added relevant Articles --- javax-servlets/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 javax-servlets/README.md diff --git a/javax-servlets/README.md b/javax-servlets/README.md new file mode 100644 index 0000000000..d6bc6db8b8 --- /dev/null +++ b/javax-servlets/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) From f528fbf7cfaf8bb2cac567430f343367f7a06d79 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sun, 15 Jan 2017 21:05:01 +0600 Subject: [PATCH 083/120] Added relevant articles --- core-java/src/test/java/org/baeldung/java/collections/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/src/test/java/org/baeldung/java/collections/README.md b/core-java/src/test/java/org/baeldung/java/collections/README.md index 50748cbf81..317d81fae7 100644 --- a/core-java/src/test/java/org/baeldung/java/collections/README.md +++ b/core-java/src/test/java/org/baeldung/java/collections/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) +- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) From 2a7c1add3675062291e686c5b4820bea3af1d5c7 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sun, 15 Jan 2017 21:07:43 +0600 Subject: [PATCH 084/120] Added relevant articles --- selenium-junit-testng/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 selenium-junit-testng/README.md diff --git a/selenium-junit-testng/README.md b/selenium-junit-testng/README.md new file mode 100644 index 0000000000..f34081ccea --- /dev/null +++ b/selenium-junit-testng/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to Selenium with JUnit / TestNG](http://www.baeldung.com/java-selenium-with-junit-and-testng) From d8af6f371b8d33e8c64cc03469b24b67517d4163 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sun, 15 Jan 2017 21:09:29 +0600 Subject: [PATCH 085/120] Added relevant articles --- spring-core/src/main/java/com/baeldung/factorybean/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/factorybean/README.md diff --git a/spring-core/src/main/java/com/baeldung/factorybean/README.md b/spring-core/src/main/java/com/baeldung/factorybean/README.md new file mode 100644 index 0000000000..13f9f379e0 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/factorybean/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) From 8ac66dd7610c988e984d04fd24a6f4c34e2aeb69 Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Sun, 15 Jan 2017 21:11:46 +0600 Subject: [PATCH 086/120] Added relevant articles --- spring-mvc-xml/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index 097353c88c..b699c37d00 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -13,4 +13,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Basic Forms with Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial) - [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data) - [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind) -- [Guide to JSP](http://www.baeldung.com/guide-to-jsp) \ No newline at end of file +- [Guide to JavaServer Pages (JSP)](http://www.baeldung.com/jsp) From a8d61e77ddb05e262e923a95567c428d0b9600b9 Mon Sep 17 00:00:00 2001 From: Muhammed Almas Date: Mon, 16 Jan 2017 00:18:42 +0530 Subject: [PATCH 087/120] BAEL-519 Introduction to LMAX Disruptor (#948) * BAL-36 File size api in java and apache commons IO * BAEL-282 grep in java - fixes after code review * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved asserts and test classes in test folder. * BAEL-519 moved test related producer and consumer to src. * BAEL-586 Guide to Guava BiMap. * BAEL-587 formatted code. * BAEL-519 LMAX Disruptor * BAEL-587 resolved merge * BAEL-587 Resolved merge * BAEL-519 Removed disruptor link. * BAEL-519 Reverted Guava changes --- core-java/README.md | 2 +- core-java/pom.xml | 7 ++ .../disruptor/DelayedMultiEventProducer.java | 34 ++++++++ .../com/baeldung/disruptor/EventConsumer.java | 13 +++ .../com/baeldung/disruptor/EventProducer.java | 15 ++++ .../disruptor/MultiEventPrintConsumer.java | 23 +++++ .../disruptor/SingleEventPrintConsumer.java | 22 +++++ .../disruptor/SingleEventProducer.java | 22 +++++ .../com/baeldung/disruptor/ValueEvent.java | 25 ++++++ .../com/baeldung/disruptor/DisruptorTest.java | 83 +++++++++++++++++++ .../disruptor/MultiEventConsumer.java | 27 ++++++ .../disruptor/SingleEventConsumer.java | 21 +++++ 12 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 core-java/src/main/java/com/baeldung/disruptor/DelayedMultiEventProducer.java create mode 100644 core-java/src/main/java/com/baeldung/disruptor/EventConsumer.java create mode 100644 core-java/src/main/java/com/baeldung/disruptor/EventProducer.java create mode 100644 core-java/src/main/java/com/baeldung/disruptor/MultiEventPrintConsumer.java create mode 100644 core-java/src/main/java/com/baeldung/disruptor/SingleEventPrintConsumer.java create mode 100644 core-java/src/main/java/com/baeldung/disruptor/SingleEventProducer.java create mode 100644 core-java/src/main/java/com/baeldung/disruptor/ValueEvent.java create mode 100644 core-java/src/test/java/com/baeldung/disruptor/DisruptorTest.java create mode 100644 core-java/src/test/java/com/baeldung/disruptor/MultiEventConsumer.java create mode 100644 core-java/src/test/java/com/baeldung/disruptor/SingleEventConsumer.java diff --git a/core-java/README.md b/core-java/README.md index 16cac81526..015e18cec1 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -52,4 +52,4 @@ - [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) - [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size) - [The Basics of Java Generics](http://www.baeldung.com/java-generics) -- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) +- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) \ No newline at end of file diff --git a/core-java/pom.xml b/core-java/pom.xml index 6979d980b7..5766224b3a 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -63,6 +63,12 @@ grep4j ${grep4j.version} + + + com.lmax + disruptor + ${disruptor.version} + @@ -363,6 +369,7 @@ 0.4 1.8.7 1.16.12 + 3.3.6 1.3 diff --git a/core-java/src/main/java/com/baeldung/disruptor/DelayedMultiEventProducer.java b/core-java/src/main/java/com/baeldung/disruptor/DelayedMultiEventProducer.java new file mode 100644 index 0000000000..bb9f91b99f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/DelayedMultiEventProducer.java @@ -0,0 +1,34 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.RingBuffer; + +public class DelayedMultiEventProducer implements EventProducer { + + @Override + public void startProducing(final RingBuffer ringBuffer, final int count) { + final Runnable simpleProducer = () -> produce(ringBuffer, count, false); + final Runnable delayedProducer = () -> produce(ringBuffer, count, true); + new Thread(simpleProducer).start(); + new Thread(delayedProducer).start(); + } + + private void produce(final RingBuffer ringBuffer, final int count, final boolean addDelay) { + for (int i = 0; i < count; i++) { + final long seq = ringBuffer.next(); + final ValueEvent valueEvent = ringBuffer.get(seq); + valueEvent.setValue(i); + ringBuffer.publish(seq); + if (addDelay) { + addDelay(); + } + } + } + + private void addDelay() { + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + // No-Op lets swallow it + } + } +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/EventConsumer.java b/core-java/src/main/java/com/baeldung/disruptor/EventConsumer.java new file mode 100644 index 0000000000..20d72ff9be --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/EventConsumer.java @@ -0,0 +1,13 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.EventHandler; + +/** + * Consumer that consumes event from ring buffer. + */ +public interface EventConsumer { + /** + * One or more event handler to handle event from ring buffer. + */ + public EventHandler[] getEventHandler(); +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/EventProducer.java b/core-java/src/main/java/com/baeldung/disruptor/EventProducer.java new file mode 100644 index 0000000000..ede1aef8bf --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/EventProducer.java @@ -0,0 +1,15 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.RingBuffer; + +/** + * Producer that produces event for ring buffer. + */ +public interface EventProducer { + /** + * Start the producer that would start producing the values. + * @param ringBuffer + * @param count + */ + public void startProducing(final RingBuffer ringBuffer, final int count); +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/MultiEventPrintConsumer.java b/core-java/src/main/java/com/baeldung/disruptor/MultiEventPrintConsumer.java new file mode 100644 index 0000000000..67901db7d5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/MultiEventPrintConsumer.java @@ -0,0 +1,23 @@ +package com.baeldung.disruptor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.lmax.disruptor.EventHandler; + +public class MultiEventPrintConsumer implements EventConsumer { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> print(event.getValue(), sequence); + final EventHandler otherEventHandler = (event, sequence, endOfBatch) -> print(event.getValue(), sequence); + return new EventHandler[] { eventHandler, otherEventHandler }; + } + + private void print(final int id, final long sequenceId) { + logger.info("Id is " + id + " sequence id that was used is " + sequenceId); + } +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/SingleEventPrintConsumer.java b/core-java/src/main/java/com/baeldung/disruptor/SingleEventPrintConsumer.java new file mode 100644 index 0000000000..766cbcf659 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/SingleEventPrintConsumer.java @@ -0,0 +1,22 @@ +package com.baeldung.disruptor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.lmax.disruptor.EventHandler; + +public class SingleEventPrintConsumer implements EventConsumer { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> print(event.getValue(), sequence); + return new EventHandler[] { eventHandler }; + } + + private void print(final int id, final long sequenceId) { + logger.info("Id is " + id + " sequence id that was used is " + sequenceId); + } +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/SingleEventProducer.java b/core-java/src/main/java/com/baeldung/disruptor/SingleEventProducer.java new file mode 100644 index 0000000000..771d1ab90d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/SingleEventProducer.java @@ -0,0 +1,22 @@ +package com.baeldung.disruptor; + +import com.lmax.disruptor.RingBuffer; + +public class SingleEventProducer implements EventProducer { + + @Override + public void startProducing(RingBuffer ringBuffer, int count) { + final Runnable producer = () -> produce(ringBuffer, count); + new Thread(producer).start(); + } + + private void produce(final RingBuffer ringBuffer, final int count) { + for (int i = 0; i < count; i++) { + final long seq = ringBuffer.next(); + final ValueEvent valueEvent = ringBuffer.get(seq); + valueEvent.setValue(i); + ringBuffer.publish(seq); + } + } + +} diff --git a/core-java/src/main/java/com/baeldung/disruptor/ValueEvent.java b/core-java/src/main/java/com/baeldung/disruptor/ValueEvent.java new file mode 100644 index 0000000000..ad466b6a31 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/disruptor/ValueEvent.java @@ -0,0 +1,25 @@ +package com.baeldung.disruptor; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +import com.lmax.disruptor.EventFactory; + +public final class ValueEvent { + + private int value; + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public final static EventFactory EVENT_FACTORY = () -> new ValueEvent(); + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/core-java/src/test/java/com/baeldung/disruptor/DisruptorTest.java b/core-java/src/test/java/com/baeldung/disruptor/DisruptorTest.java new file mode 100644 index 0000000000..28a5ff72ce --- /dev/null +++ b/core-java/src/test/java/com/baeldung/disruptor/DisruptorTest.java @@ -0,0 +1,83 @@ +package com.baeldung.disruptor; + +import java.util.concurrent.ThreadFactory; +import org.junit.Before; +import org.junit.Test; +import com.lmax.disruptor.BusySpinWaitStrategy; +import com.lmax.disruptor.RingBuffer; +import com.lmax.disruptor.WaitStrategy; +import com.lmax.disruptor.dsl.Disruptor; +import com.lmax.disruptor.dsl.ProducerType; +import com.lmax.disruptor.util.DaemonThreadFactory; + +public class DisruptorTest { + private Disruptor disruptor; + private WaitStrategy waitStrategy; + + @Before + public void setUp() throws Exception { + waitStrategy = new BusySpinWaitStrategy(); + } + + private void createDisruptor(final ProducerType producerType, final EventConsumer eventConsumer) { + final ThreadFactory threadFactory = DaemonThreadFactory.INSTANCE; + disruptor = new Disruptor(ValueEvent.EVENT_FACTORY, 16, threadFactory, producerType, waitStrategy); + disruptor.handleEventsWith(eventConsumer.getEventHandler()); + } + + private void startProducing(final RingBuffer ringBuffer, final int count, final EventProducer eventProducer) { + eventProducer.startProducing(ringBuffer, count); + } + + @Test + public void whenMultipleProducerSingleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new SingleEventPrintConsumer(); + final EventProducer eventProducer = new DelayedMultiEventProducer(); + createDisruptor(ProducerType.MULTI, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } + + @Test + public void whenSingleProducerSingleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new SingleEventConsumer(); + final EventProducer eventProducer = new SingleEventProducer(); + createDisruptor(ProducerType.SINGLE, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } + + @Test + public void whenSingleProducerMultipleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new MultiEventConsumer(); + final EventProducer eventProducer = new SingleEventProducer(); + createDisruptor(ProducerType.SINGLE, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } + + @Test + public void whenMultipleProducerMultipleConsumer_thenOutputInFifoOrder() { + final EventConsumer eventConsumer = new MultiEventPrintConsumer(); + final EventProducer eventProducer = new DelayedMultiEventProducer(); + createDisruptor(ProducerType.MULTI, eventConsumer); + final RingBuffer ringBuffer = disruptor.start(); + + startProducing(ringBuffer, 32, eventProducer); + + disruptor.halt(); + disruptor.shutdown(); + } +} diff --git a/core-java/src/test/java/com/baeldung/disruptor/MultiEventConsumer.java b/core-java/src/test/java/com/baeldung/disruptor/MultiEventConsumer.java new file mode 100644 index 0000000000..304f62c2ee --- /dev/null +++ b/core-java/src/test/java/com/baeldung/disruptor/MultiEventConsumer.java @@ -0,0 +1,27 @@ +package com.baeldung.disruptor; + +import static org.junit.Assert.assertEquals; + +import com.lmax.disruptor.EventHandler; + +public class MultiEventConsumer implements EventConsumer { + + private int expectedValue = -1; + private int otherExpectedValue = -1; + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> assertExpectedValue(event.getValue()); + final EventHandler otherEventHandler = (event, sequence, endOfBatch) -> assertOtherExpectedValue(event.getValue()); + return new EventHandler[] { eventHandler, otherEventHandler }; + } + + private void assertExpectedValue(final int id) { + assertEquals(++expectedValue, id); + } + + private void assertOtherExpectedValue(final int id) { + assertEquals(++otherExpectedValue, id); + } +} diff --git a/core-java/src/test/java/com/baeldung/disruptor/SingleEventConsumer.java b/core-java/src/test/java/com/baeldung/disruptor/SingleEventConsumer.java new file mode 100644 index 0000000000..efc7432b5a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/disruptor/SingleEventConsumer.java @@ -0,0 +1,21 @@ +package com.baeldung.disruptor; + +import static org.junit.Assert.assertEquals; + +import com.lmax.disruptor.EventHandler; + +public class SingleEventConsumer implements EventConsumer { + + private int expectedValue = -1; + + @Override + @SuppressWarnings("unchecked") + public EventHandler[] getEventHandler() { + final EventHandler eventHandler = (event, sequence, endOfBatch) -> assertExpectedValue(event.getValue()); + return new EventHandler[] { eventHandler }; + } + + private void assertExpectedValue(final int id) { + assertEquals(++expectedValue, id); + } +} From d5acd709e188364f015090fd7dc62d4db8025cc1 Mon Sep 17 00:00:00 2001 From: Muhammed Almas Date: Mon, 16 Jan 2017 02:15:46 +0530 Subject: [PATCH 088/120] BAEL-587 Guide to Bimap (#995) * BAL-36 File size api in java and apache commons IO * BAEL-282 grep in java - fixes after code review * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor library * BAEL-519 Added support for disruptor * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved all supporting classes to main source * BAEL-519 Moved asserts and test classes in test folder. * BAEL-519 moved test related producer and consumer to src. * BAEL-587 Initial commit for BiMap support. * BAEL-587 Added new tests * BAEL-587 Added new tests. * BAEL-519 Removed Disruptor link from readme file. * BAEL-587 Reverted Disruptor changes * BAEL-587 reverted changes --- core-java/pom.xml | 2 +- .../com/baeldung/guava/GuavaBiMapTest.java | 122 ++++++++++++++++++ 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 5766224b3a..3406bddda9 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -358,7 +358,7 @@ 1.1.7 - 19.0 + 21.0 3.5 1.55 1.10 diff --git a/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java new file mode 100644 index 0000000000..c04cfb14fb --- /dev/null +++ b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java @@ -0,0 +1,122 @@ +package com.baeldung.guava; + +import static org.junit.Assert.*; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; +import com.google.common.collect.BiMap; +import com.google.common.collect.EnumHashBiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.ImmutableBiMap; + +public class GuavaBiMapTest { + @Test + public void whenQueryByValue_shouldReturnKey() { + final BiMap personCountryHeadBiMap = HashBiMap.create(); + personCountryHeadBiMap.put("Modi", "India"); + personCountryHeadBiMap.put("Obama", "USA"); + personCountryHeadBiMap.put("Putin", "USSR"); + + final String countryHeadName = personCountryHeadBiMap.inverse().get("India"); + + assertEquals("Modi", countryHeadName); + } + + @Test + public void whenCreateBiMapFromExistingMap_shouldReturnKey() { + final Map personCountryHeadMap = new HashMap<>(); + personCountryHeadMap.put("Modi", "India"); + personCountryHeadMap.put("Obama", "USA"); + personCountryHeadMap.put("Putin", "USSR"); + final BiMap personCountryHeadBiMap = HashBiMap.create(personCountryHeadMap); + + final String countryHeadName = personCountryHeadBiMap.inverse().get("India"); + + assertEquals("Modi", countryHeadName); + } + + @Test + public void whenQueryByKey_shouldReturnValue() { + final BiMap personCountryHeadBiMap = HashBiMap.create(); + + personCountryHeadBiMap.put("Modi", "India"); + personCountryHeadBiMap.put("Obama", "USA"); + personCountryHeadBiMap.put("Putin", "USSR"); + + assertEquals("USA", personCountryHeadBiMap.get("Obama")); + } + + @Test(expected = IllegalArgumentException.class) + public void whenSameValueIsBeingPresent_shouldThrowException() { + final BiMap personCountryHeadBiMap = HashBiMap.create(); + + personCountryHeadBiMap.put("Modi", "India"); + personCountryHeadBiMap.put("Obama", "USA"); + personCountryHeadBiMap.put("Putin", "USSR"); + personCountryHeadBiMap.put("Trump", "USA"); + } + + @Test + public void givenSameValueIsBeingPresent_whenForcePutIsUsed_shouldCompleteSuccessfully() { + final BiMap personCountryHeadBiMap = HashBiMap.create(); + + personCountryHeadBiMap.put("Modi", "India"); + personCountryHeadBiMap.put("Obama", "USA"); + personCountryHeadBiMap.put("Putin", "USSR"); + personCountryHeadBiMap.forcePut("Trump", "USA"); + + assertEquals("USA", personCountryHeadBiMap.get("Trump")); + assertEquals("Trump", personCountryHeadBiMap.inverse().get("USA")); + } + + @Test + public void whenSameKeyIsBeingPresent_shouldReplaceAlreadyPresent() { + final BiMap personCountryHeadBiMap = HashBiMap.create(); + + personCountryHeadBiMap.put("Modi", "India"); + personCountryHeadBiMap.put("Obama", "USA"); + personCountryHeadBiMap.put("Putin", "USSR"); + personCountryHeadBiMap.put("Obama", "HongKong"); + + assertEquals("HongKong", personCountryHeadBiMap.get("Obama")); + } + + @Test + public void whenUsingImmutableBiMap_shouldAllowPutSuccessfully() { + final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build(); + + assertEquals("USA", personCountryHeadBiMap.get("Obama")); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenUsingImmutableBiMap_shouldNotAllowRemove() { + final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build(); + + personCountryHeadBiMap.remove("Modi"); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenUsingImmutableBiMap_shouldNotAllowPut() { + final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build(); + + personCountryHeadBiMap.put("Trump", "USA"); + } + + private enum Operation { + ADD, SUBTRACT, MULTIPLY, DIVIDE + } + + @Test + public void whenUsingEnumAsKeyInMap_shouldReplaceAlreadyPresent() { + final BiMap operationStringBiMap = EnumHashBiMap.create(Operation.class); + + operationStringBiMap.put(Operation.ADD, "Add"); + operationStringBiMap.put(Operation.SUBTRACT, "Subtract"); + operationStringBiMap.put(Operation.MULTIPLY, "Multiply"); + operationStringBiMap.put(Operation.DIVIDE, "Divide"); + + assertEquals("Divide", operationStringBiMap.get(Operation.DIVIDE)); + } +} From 348b3ca5ad6fc41c78a1be2d032e497dccdc88fe Mon Sep 17 00:00:00 2001 From: dhruba619 Date: Mon, 16 Jan 2017 22:04:47 +0530 Subject: [PATCH 089/120] BAEL-581 Convert Iterable to Stream --- .../IterableStreamConversionTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java diff --git a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java new file mode 100644 index 0000000000..ba7339fc7e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java @@ -0,0 +1,44 @@ +package com.baeldung.java.conversion; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import org.junit.Assert; +import org.junit.Test; + +public class IterableStreamConversionTest { + + @Test + public void givenIterable_whenConvertedToStream_thenTrue() { + String[] names = { "Testing", "Iterable", "conversion", "to", "Stream" }; + StreamIterable iterable = new StreamIterable<>(names); + Assert.assertTrue(StreamSupport.stream(iterable.spliterator(), false) instanceof Stream); + } + + @Test + public void whenConvertedToList_thenCorrect() { + String[] names = { "Testing", "Iterable", "conversion", "to", "Stream" }; + StreamIterable iterable = new StreamIterable<>(names); + Stream convertedStream = StreamSupport.stream(iterable.spliterator(), false); + Assert.assertTrue(convertedStream.map(String::toUpperCase) + .collect(Collectors.toList()) instanceof List); + } +} + +class StreamIterable implements Iterable { + private List list; + + public StreamIterable(T[] array) { + this.list = Arrays.asList(array); + } + + @Override + public Iterator iterator() { + return list.iterator(); + } + +} From efd384a3d0c96cc6192c4ef3fcabfac4e5635548 Mon Sep 17 00:00:00 2001 From: Felipe Reis Date: Mon, 16 Jan 2017 18:53:40 -0200 Subject: [PATCH 090/120] BAEL-390: json processing with java ee 7 --- .../main/java/com/baeldung/json/Person.java | 43 ++++++ .../java/com/baeldung/json/PersonBuilder.java | 49 +++++++ .../java/com/baeldung/json/PersonWriter.java | 67 +++++++++ .../java/com/baeldug/json/JsonUnitTest.java | 135 ++++++++++++++++++ 4 files changed, 294 insertions(+) create mode 100644 jee7/src/main/java/com/baeldung/json/Person.java create mode 100644 jee7/src/main/java/com/baeldung/json/PersonBuilder.java create mode 100644 jee7/src/main/java/com/baeldung/json/PersonWriter.java create mode 100644 jee7/src/test/java/com/baeldug/json/JsonUnitTest.java diff --git a/jee7/src/main/java/com/baeldung/json/Person.java b/jee7/src/main/java/com/baeldung/json/Person.java new file mode 100644 index 0000000000..847597b6f5 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/json/Person.java @@ -0,0 +1,43 @@ +package com.baeldung.json; + +import java.util.Date; +import java.util.List; + +public class Person { + private String firstName; + private String lastName; + private Date birthdate; + private List emails; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Date getBirthdate() { + return birthdate; + } + + public void setBirthdate(Date birthdate) { + this.birthdate = birthdate; + } + + public List getEmails() { + return emails; + } + + public void setEmails(List emails) { + this.emails = emails; + } +} diff --git a/jee7/src/main/java/com/baeldung/json/PersonBuilder.java b/jee7/src/main/java/com/baeldung/json/PersonBuilder.java new file mode 100644 index 0000000000..5d060827dc --- /dev/null +++ b/jee7/src/main/java/com/baeldung/json/PersonBuilder.java @@ -0,0 +1,49 @@ +package com.baeldung.json; + +import java.io.IOException; +import java.io.StringReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; + +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonReader; +import javax.json.JsonString; + +public class PersonBuilder { + private String jsonString; + + private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); + + public PersonBuilder(String jsonString) { + this.jsonString = jsonString; + } + + public Person build() throws IOException, ParseException { + JsonReader reader = Json.createReader(new StringReader(jsonString)); + + JsonObject jsonObject = reader.readObject(); + + Person person = new Person(); + + person.setFirstName(jsonObject.getString("firstName")); + person.setLastName(jsonObject.getString("lastName")); + person.setBirthdate(dateFormat.parse(jsonObject.getString("birthdate"))); + + JsonArray emailsJson = jsonObject.getJsonArray("emails"); + + List emails = new ArrayList<>(); + + for (JsonString j : emailsJson.getValuesAs(JsonString.class)) { + emails.add(j.getString()); + } + + person.setEmails(emails); + + return person; + } + +} diff --git a/jee7/src/main/java/com/baeldung/json/PersonWriter.java b/jee7/src/main/java/com/baeldung/json/PersonWriter.java new file mode 100644 index 0000000000..f94c02d613 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/json/PersonWriter.java @@ -0,0 +1,67 @@ +package com.baeldung.json; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; + +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonWriterFactory; +import javax.json.stream.JsonGenerator; + +public class PersonWriter { + private Person person; + + private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); + + public PersonWriter(Person person) { + this.person = person; + } + + public String write() throws IOException { + JsonObjectBuilder objectBuilder = Json.createObjectBuilder() + .add("firstName", person.getFirstName()) + .add("lastName", person.getLastName()) + .add("birthdate", dateFormat.format(person.getBirthdate())); + + JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + + for(String email : person.getEmails()) { + arrayBuilder.add(email); + } + + objectBuilder.add("emails", arrayBuilder); + + JsonObject jsonObject = objectBuilder.build(); + + JsonWriterFactory writerFactory = createWriterFactory(); + + String jsonString = writeToString(jsonObject, writerFactory); + + return jsonString; + + } + + private String writeToString(JsonObject jsonObject, JsonWriterFactory writerFactory) throws IOException { + String jsonString; + try(Writer writer = new StringWriter()) { + writerFactory.createWriter(writer).write(jsonObject); + jsonString = writer.toString(); + } + return jsonString; + } + + private JsonWriterFactory createWriterFactory() { + Map config = new HashMap<>(); + + config.put(JsonGenerator.PRETTY_PRINTING, true); + + JsonWriterFactory writerFactory = Json.createWriterFactory(config); + return writerFactory; + } +} diff --git a/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java b/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java new file mode 100644 index 0000000000..04e9cef766 --- /dev/null +++ b/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java @@ -0,0 +1,135 @@ +package com.baeldug.json; + +import static org.hamcrest.CoreMatchers.hasItems; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.io.StringReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; +import javax.json.stream.JsonParser; +import javax.json.stream.JsonParser.Event; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.json.Person; +import com.baeldung.json.PersonBuilder; +import com.baeldung.json.PersonWriter; + +public class JsonUnitTest { + private Person person; + + private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); + private String personJson; + private String petshopJson; + + @Test + public void whenPersonIsConvertedToString_thenAValidJsonStringIsReturned() throws IOException { + String generatedJsonString = new PersonWriter(person).write(); + + assertEquals( + "Generated String has the expected format and content", + personJson, + generatedJsonString); + } + + @Test + public void whenJsonStringIsConvertedToPerson_thenAValidObjectIsReturned( + ) throws IOException, ParseException { + Person person = new PersonBuilder(personJson).build(); + + assertEquals("First name has expected value", "Michael", person.getFirstName()); + assertEquals("Last name has expected value", "Scott", person.getLastName()); + assertEquals( + "Birthdate has expected value", + dateFormat.parse("06/15/1978"), + person.getBirthdate()); + assertThat( + "Email list has two items", + person.getEmails(), + hasItems("michael.scott@dd.com", "michael.scarn@gmail.com")); + } + + @Test + public void whenUsingObjectModelToQueryForSpecificProperty_thenExpectedValueIsReturned( + ) throws IOException, ParseException { + JsonReader reader = Json.createReader(new StringReader(petshopJson)); + + JsonObject jsonObject = reader.readObject(); + + assertEquals( + "The query should return the 'name' property of the third pet from the list", + "Jake", + jsonObject.getJsonArray("pets").getJsonObject(2).getString("name")); + } + + @Test + public void whenUsingStreamingApiToQueryForSpecificProperty_thenExpectedValueIsReturned( + ) throws IOException, ParseException { + JsonParser jsonParser = Json.createParser(new StringReader(petshopJson)); + + int count = 0; + String result = null; + + while(jsonParser.hasNext()) { + Event e = jsonParser.next(); + + if (e == Event.KEY_NAME) { + if(jsonParser.getString().equals("name")) { + jsonParser.next(); + + if(++count == 3) { + result = jsonParser.getString(); + break; + } + } + } + } + + assertEquals( + "The query should return the 'name' property of the third pet from the list", + "Jake", + result); + } + + @Before + public void init() throws ParseException { + // Creates a Person object + person = new Person(); + + person.setFirstName("Michael"); + person.setLastName("Scott"); + person.setBirthdate(dateFormat.parse("06/15/1978")); + person.setEmails(Arrays.asList("michael.scott@dd.com", "michael.scarn@gmail.com")); + + // Initializes the Person Json + personJson = "\n" + + "{\n" + + " \"firstName\":\"Michael\",\n" + + " \"lastName\":\"Scott\",\n" + + " \"birthdate\":\"06/15/1978\",\n" + + " \"emails\":[\n" + + " \"michael.scott@dd.com\",\n" + + " \"michael.scarn@gmail.com\"\n" + + " ]\n" + + "}"; + + // Initializes the Pet Shop Json + petshopJson = "\n" + + "{\n" + + " \"ownerId\":\"1\", \n" + + " \"pets\":[ \n" + + " {\"name\": \"Kitty\", \"type\": \"cat\"}, \n" + + " {\"name\": \"Rex\", \"type\": \"dog\"}, \n" + + " {\"name\": \"Jake\", \"type\": \"dog\"} \n" + + " ]\n" + + "}"; + } +} From 63d20dc1b1f53f69e8912fc394163b71abb97514 Mon Sep 17 00:00:00 2001 From: Diane Duan Date: Tue, 17 Jan 2017 09:56:45 +0800 Subject: [PATCH 091/120] pom, ut method names --- metrics/pom.xml | 7 +++++-- .../metrics/healthchecks/DatabaseHealthCheck.java | 2 +- .../com/baeldung/metrics/core/MetricsTest.java | 14 +++++++------- .../com/baeldung/metrics/core/ReporterTest.java | 2 +- .../metrics/healthchecks/HealthCheckTest.java | 2 +- pom.xml | 2 +- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/metrics/pom.xml b/metrics/pom.xml index 189f9afbff..df22f1aca6 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -15,6 +15,8 @@ 3.1.0 + 3.1.0 + 4.12 @@ -41,12 +43,13 @@ javax.servlet javax.servlet-api - 3.1.0 + ${dep.ver.servlet} junit junit - 4.12 + ${dep.ver.junit} + test
    \ No newline at end of file diff --git a/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java b/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java index 46170f627f..2ecce4f9f5 100644 --- a/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java +++ b/metrics/src/main/java/com/baeldung/metrics/healthchecks/DatabaseHealthCheck.java @@ -5,6 +5,6 @@ import com.codahale.metrics.health.HealthCheck; public class DatabaseHealthCheck extends HealthCheck { @Override protected Result check() throws Exception { - return HealthCheck.Result.healthy(); + return Result.healthy(); } } diff --git a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java index b9bcc6a5fe..3301dcd96a 100644 --- a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java @@ -14,7 +14,7 @@ import com.codahale.metrics.*; public class MetricsTest { @Test - public void testMeter() throws InterruptedException { + public void whenMarkMeter_thenCorrectRates() throws InterruptedException { Meter meter = new Meter(); long initCount = meter.getCount(); @@ -38,13 +38,13 @@ public class MetricsTest { } @Test - public void testRatioGauge() { + public void whenInitRatioGauge_thenCorrectRatio() { Gauge ratioGauge = new AttendanceRatioGauge(15, 20); assertThat(ratioGauge.getValue(), equalTo(0.75)); } @Test - public void testCacheGauge() { + public void whenUseCacheGauge_thenCorrectGauge() { Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); List expected = new ArrayList(); expected.add(12L); @@ -52,14 +52,14 @@ public class MetricsTest { } @Test - public void testDerivativeGauge() { + public void whenUseDerivativeGauge_thenCorrectGaugeFromBase() { Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); Gauge activeUserCountGauge = new ActiveUserCountGauge(activeUsersGauge); assertThat(activeUserCountGauge.getValue(), equalTo(1)); } @Test - public void testCounter() { + public void whenIncDecCounter_thenCorrectCount() { Counter counter = new Counter(); long initCount = counter.getCount(); @@ -79,7 +79,7 @@ public class MetricsTest { } @Test - public void testHistogram() { + public void whenUpdateHistogram_thenCorrectDistributionData() { Histogram histogram = new Histogram(new UniformReservoir()); histogram.update(5); @@ -119,7 +119,7 @@ public class MetricsTest { } @Test - public void testTimer() throws InterruptedException { + public void whenUseTimer_thenCorrectTimerContexts() throws InterruptedException { Timer timer = new Timer(); Timer.Context context1 = timer.time(); diff --git a/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java b/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java index 4676f8c3a4..7f8b1422e6 100644 --- a/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/core/ReporterTest.java @@ -8,7 +8,7 @@ import com.codahale.metrics.*; public class ReporterTest { @Test - public void testConsoleReporter() { + public void whenConsoleReporter_thenOutputReport() { MetricRegistry metricRegistry = new MetricRegistry(); Meter meter = metricRegistry.meter("meter"); diff --git a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java index 4cefc9f3a0..4b0d996821 100644 --- a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java @@ -12,7 +12,7 @@ import com.codahale.metrics.health.HealthCheckRegistry; public class HealthCheckTest { @Test - public void testHealthCheck() { + public void whenUseHealthCheck_thenHealthChecked() { HealthCheckRegistry healthCheckRegistry = new HealthCheckRegistry(); healthCheckRegistry.register("db", new DatabaseHealthCheck()); diff --git a/pom.xml b/pom.xml index 1d683b36b9..3766f9abbd 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,7 @@ lombok mapstruct + metrics mockito mocks @@ -173,7 +174,6 @@ xml xmlunit2 xstream - metrics
    From 5c99b291d541ea53fb6d5245ca729473c3f03e45 Mon Sep 17 00:00:00 2001 From: Daniele Demichelis Date: Tue, 17 Jan 2017 05:00:33 +0100 Subject: [PATCH 092/120] BAEL-553 - Intro to Spring Remoting with HTTP Invokers (#998) * First test with log4j rolling appenders * small fix * Log4j rolling appender * First set up with rolling file on log4j 2 * Added logback code. * log4j2 more detailed example * log4j2 more detailed example * Improved names and examples * Fixed configurations * improved configs * formatted * Final fix * fixed formatting * Formatting fix * Fix sample apps to avoid try / catch * Fix request to replace files * Fix end lines * Log4j2 logger is shot down at the end. * Initial commit, the server starts launched from maven * made room for client and server projects * made room for client and server projects * base example works * poms restructured * packages restructured * packages restructured * Some renaming and a proper formatting string * Small renamings * Small renamings * Fixed invoked URL in client through fixing bean name * java.time.* instead of java.util.Date * java.time.* instead of java.util.Date * Removed log on file, kepts log on console * Updated Spring and Logback version to latest release. * Exception removed from run() --- spring-remoting/pom.xml | 4 ++-- .../src/main/java/com/baeldung/api/Booking.java | 15 +++++++-------- .../java/com/baeldug/client/CabBookingClient.java | 8 ++------ .../src/main/java/com/baeldug/client/Main.java | 2 +- .../baeldung/server/CabBookingServiceImpl.java | 13 +++++++------ .../server/src/main/resources/logback.xml | 11 ----------- 6 files changed, 19 insertions(+), 34 deletions(-) diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index cfb4af9d85..2e3b7e76f8 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -13,8 +13,8 @@ 3.0.0 3.1.0 - 1.1.7 - 4.2.4.RELEASE + 1.1.8 + 4.3.5.RELEASE diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java index 0f52a7bfbd..7bec4e162d 100644 --- a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java +++ b/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java @@ -1,18 +1,18 @@ package com.baeldung.api; import java.io.Serializable; -import java.util.Date; +import java.time.LocalDateTime; public class Booking implements Serializable { private int costInCent; private int etaInSeconds; private String bookingCode; - private Date pickUptime; + private LocalDateTime pickUptime; private Address pickUpAddress; private Address dropOffAddress; - public Booking(Address pickUpAddress, Date pickUptime, Address dropOffAddress, int costInCent, int etaInSeconds, String bookingCode) { + public Booking(Address pickUpAddress, LocalDateTime pickUptime, Address dropOffAddress, int costInCent, int etaInSeconds, String bookingCode) { this.costInCent = costInCent; this.etaInSeconds = etaInSeconds; this.bookingCode = bookingCode; @@ -33,7 +33,7 @@ public class Booking implements Serializable { return bookingCode; } - public Date getPickUptime() { + public LocalDateTime getPickUptime() { return pickUptime; } @@ -42,12 +42,11 @@ public class Booking implements Serializable { } @Override public String toString() { - return String.format("Booking: pick up @ %tr in %s, drop down in %s after %d minutes, %.2f $.", pickUptime, pickUpAddress, dropOffAddress, etaInSeconds/60, costInCent/100.0); + return String.format("Booking: pick up @ %tr in %s, drop down in %s after %d minutes, %.2f $.", pickUptime, pickUpAddress, dropOffAddress, etaInSeconds / 60, costInCent / 100.0); } public static void main(String[] args) throws InterruptedException { - System.out.println( - new Booking(new Address("a", "b"), new Date(), new Address("c", "d"), 123_00, 600, "abc") - ); + System.out.println(new Booking(new Address("a", "b"), + LocalDateTime.now(), new Address("c", "d"), 123_00, 600, "abc")); } } diff --git a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java index 7cc8e5183c..9669970403 100644 --- a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java +++ b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/CabBookingClient.java @@ -10,15 +10,11 @@ public class CabBookingClient { this.cabService = cabService; } - public void run() { + public void run() throws BookingException { Address pickUp = new Address("13 Seagate Blvd, Key Largo, FL 33037", "US"); Address dropDown = new Address("91831 Overseas Hwy, Tavernier, FL 33070", "US"); - try { - System.out.println( cabService.bookPickUp(pickUp, dropDown, 3) ); - } catch (BookingException e) { - e.printStackTrace(); - } + System.out.println( cabService.bookPickUp(pickUp, dropDown, 3) ); } diff --git a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java index 0ddb37c508..a5e3ccd912 100644 --- a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java +++ b/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Main.java @@ -22,7 +22,7 @@ public class Main { return new CabBookingClient(service); } - public static void main(String[] args) throws InterruptedException { + public static void main(String[] args) throws Exception { AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext(); rootContext.scan(Main.class.getPackage().getName()); diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java index 5f43c7e707..8f3c099fe0 100644 --- a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java +++ b/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java @@ -5,22 +5,23 @@ import com.baeldung.api.Booking; import com.baeldung.api.BookingException; import com.baeldung.api.CabBookingService; -import java.util.Date; +import java.time.LocalDateTime; import static java.lang.Math.random; -import static java.lang.System.currentTimeMillis; +import static java.time.LocalDateTime.now; +import static java.time.temporal.ChronoUnit.MINUTES; import static java.util.UUID.randomUUID; public class CabBookingServiceImpl implements CabBookingService { @Override public Booking bookPickUp(Address pickUpLocation, Address dropOffLocation, int pax) throws BookingException { - if(random()<0.3){ + if (random() < 0.3) { throw new BookingException("Cab unavailable"); } int tripTimeInMinutes = (int) (5 + random() * 15); int costInCent = 15_00 + tripTimeInMinutes * 5 * pax; - Date pickUpDate = new Date((long) (currentTimeMillis() + (1000 * 60 * random() * 15))); - return new Booking(pickUpLocation, pickUpDate, dropOffLocation, costInCent, tripTimeInMinutes * 60, - randomUUID().toString()); + LocalDateTime pickUpDate = now().plus(15L * (long) (random() * 10), MINUTES); + + return new Booking(pickUpLocation, pickUpDate, dropOffLocation, costInCent, tripTimeInMinutes * 60, randomUUID().toString()); } } diff --git a/spring-remoting/remoting-http/server/src/main/resources/logback.xml b/spring-remoting/remoting-http/server/src/main/resources/logback.xml index 7a03574f40..566c44b448 100644 --- a/spring-remoting/remoting-http/server/src/main/resources/logback.xml +++ b/spring-remoting/remoting-http/server/src/main/resources/logback.xml @@ -5,23 +5,12 @@ value="%-30(%d{MMM dd YYYY HH:mm:ss.SSS} [%thread]) %-5level %logger{5} [%file:%line] - %msg%n"/> - ${logPattern} - - - C:\Users\danidemi\tmp\baledung\app.log - false - - ${logPattern} - - - \ No newline at end of file From e17dd32c49a3dfd77cf2aaa99a0ff0f5a59eb5a9 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Tue, 17 Jan 2017 06:03:30 +0100 Subject: [PATCH 093/120] Refactor HealthCheckTest --- .../metrics/healthchecks/HealthCheckTest.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java index 4b0d996821..99a3970761 100644 --- a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java @@ -1,16 +1,18 @@ package com.baeldung.metrics.healthchecks; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertThat; - -import java.util.Map; - -import org.junit.Test; - import com.codahale.metrics.health.HealthCheck; import com.codahale.metrics.health.HealthCheckRegistry; +import org.junit.Test; + +import java.util.Map; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; public class HealthCheckTest { + @Test public void whenUseHealthCheck_thenHealthChecked() { HealthCheckRegistry healthCheckRegistry = new HealthCheckRegistry(); @@ -21,9 +23,8 @@ public class HealthCheckTest { assertThat(healthCheckRegistry.getNames().size(), equalTo(2)); Map results = healthCheckRegistry.runHealthChecks(); - for (Map.Entry entry : results.entrySet()) { - assertThat(entry.getValue().isHealthy(), equalTo(true)); - } + assertFalse(results.isEmpty()); + results.forEach((k, v) -> assertTrue(v.isHealthy())); healthCheckRegistry.unregister("uc"); assertThat(healthCheckRegistry.getNames().size(), equalTo(1)); From b2a03d92aada93a5923469730ac5f46ca9748dc4 Mon Sep 17 00:00:00 2001 From: Shubham Aggarwal Date: Tue, 17 Jan 2017 11:04:00 +0530 Subject: [PATCH 094/120] Added chainedexceptions in core-java --- core-java/.gitignore | 4 ++ .../chainedexception/LogWithChain.java | 44 +++++++++++++++++ .../chainedexception/LogWithoutChain.java | 47 +++++++++++++++++++ .../GirlFriendOfManagerUpsetException.java | 12 +++++ .../exceptions/ManagerUpsetException.java | 12 +++++ .../exceptions/NoLeaveGrantedException.java | 12 +++++ .../exceptions/TeamLeadUpsetException.java | 12 +++++ 7 files changed, 143 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java create mode 100644 core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java create mode 100644 core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java create mode 100644 core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java create mode 100644 core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java create mode 100644 core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java diff --git a/core-java/.gitignore b/core-java/.gitignore index 464f7e5e38..251a8755bd 100644 --- a/core-java/.gitignore +++ b/core-java/.gitignore @@ -16,3 +16,7 @@ *.txt /bin/ /temp + +#IntelliJ specific +.idea +*.iml \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java b/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java new file mode 100644 index 0000000000..8542e8c7ac --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java @@ -0,0 +1,44 @@ +package com.baeldung.chainedexception; + +import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; + +public class LogWithChain { + + public static void main(String[] args) throws Exception { + getLeave(); + } + + private static void getLeave() throws NoLeaveGrantedException { + try { + howIsTeamLead(); + } catch (TeamLeadUpsetException e) { + throw new NoLeaveGrantedException("Leave not sanctioned.", e); + } + } + + private static void howIsTeamLead() throws TeamLeadUpsetException { + try { + howIsManager(); + } catch (ManagerUpsetException e) { + throw new TeamLeadUpsetException( + "Team lead is not in good mood", e); + } + } + + private static void howIsManager() throws ManagerUpsetException { + try { + howIsGirlFriendOfManager(); + } catch (GirlFriendOfManagerUpsetException e) { + throw new ManagerUpsetException("Manager is in bad mood", e); + } + } + + private static void howIsGirlFriendOfManager() + throws GirlFriendOfManagerUpsetException { + throw new GirlFriendOfManagerUpsetException( + "Girl friend of manager is in bad mood"); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java b/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java new file mode 100644 index 0000000000..a06a324f03 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java @@ -0,0 +1,47 @@ +package com.baeldung.chainedexception; + +import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; + +public class LogWithoutChain { + + public static void main(String[] args) throws Exception { + getLeave(); + } + + private static void getLeave() throws NoLeaveGrantedException { + try { + howIsTeamLead(); + } catch (TeamLeadUpsetException e) { + e.printStackTrace(); + throw new NoLeaveGrantedException("Leave not sanctioned."); + } + } + + private static void howIsTeamLead() throws TeamLeadUpsetException { + try { + howIsManager(); + } catch (ManagerUpsetException e) { + e.printStackTrace(); + throw new TeamLeadUpsetException( + "Team lead is not in good mood"); + } + } + + private static void howIsManager() throws ManagerUpsetException { + try { + howIsGirlFriendOfManager(); + } catch (GirlFriendOfManagerUpsetException e) { + e.printStackTrace(); + throw new ManagerUpsetException("Manager is in bad mood"); + } + } + + private static void howIsGirlFriendOfManager() + throws GirlFriendOfManagerUpsetException { + throw new GirlFriendOfManagerUpsetException( + "Girl friend of manager is in bad mood"); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java new file mode 100644 index 0000000000..e20c58ea5b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class GirlFriendOfManagerUpsetException extends Exception { + + public GirlFriendOfManagerUpsetException(String message, Throwable cause) { + super(message, cause); + } + + public GirlFriendOfManagerUpsetException(String message) { + super(message); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java new file mode 100644 index 0000000000..e95a3921a4 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class ManagerUpsetException extends Exception { + + public ManagerUpsetException(String message, Throwable cause) { + super(message, cause); + } + + public ManagerUpsetException(String message) { + super(message); + } +} diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java new file mode 100644 index 0000000000..b9521858b3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class NoLeaveGrantedException extends Exception { + + public NoLeaveGrantedException(String message, Throwable cause) { + super(message, cause); + } + + public NoLeaveGrantedException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java new file mode 100644 index 0000000000..f874620f00 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java @@ -0,0 +1,12 @@ +package com.baeldung.chainedexception.exceptions; + +public class TeamLeadUpsetException extends Exception { + + public TeamLeadUpsetException(String message, Throwable cause) { + super(message, cause); + } + + public TeamLeadUpsetException(String message) { + super(message); + } +} From ffd8963fd57e7e701a4cfc76188e24ccc301b7c5 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Tue, 17 Jan 2017 06:38:31 +0100 Subject: [PATCH 095/120] Refactor PersonWriter --- .../java/com/baeldung/json/PersonWriter.java | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/jee7/src/main/java/com/baeldung/json/PersonWriter.java b/jee7/src/main/java/com/baeldung/json/PersonWriter.java index f94c02d613..7b6f82e23b 100644 --- a/jee7/src/main/java/com/baeldung/json/PersonWriter.java +++ b/jee7/src/main/java/com/baeldung/json/PersonWriter.java @@ -1,5 +1,7 @@ package com.baeldung.json; +import javax.json.*; +import javax.json.stream.JsonGenerator; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; @@ -7,50 +9,42 @@ import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; -import javax.json.Json; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonWriterFactory; -import javax.json.stream.JsonGenerator; - public class PersonWriter { private Person person; private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); - + public PersonWriter(Person person) { this.person = person; } public String write() throws IOException { - JsonObjectBuilder objectBuilder = Json.createObjectBuilder() - .add("firstName", person.getFirstName()) - .add("lastName", person.getLastName()) - .add("birthdate", dateFormat.format(person.getBirthdate())); - - JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); - - for(String email : person.getEmails()) { - arrayBuilder.add(email); - } - + JsonObjectBuilder objectBuilder = Json + .createObjectBuilder() + .add("firstName", person.getFirstName()) + .add("lastName", person.getLastName()) + .add("birthdate", dateFormat.format(person.getBirthdate())); + + final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + + person.getEmails().forEach(arrayBuilder::add); + objectBuilder.add("emails", arrayBuilder); - + JsonObject jsonObject = objectBuilder.build(); - + JsonWriterFactory writerFactory = createWriterFactory(); - - String jsonString = writeToString(jsonObject, writerFactory); - - return jsonString; - + + return writeToString(jsonObject, writerFactory); + } private String writeToString(JsonObject jsonObject, JsonWriterFactory writerFactory) throws IOException { String jsonString; - try(Writer writer = new StringWriter()) { - writerFactory.createWriter(writer).write(jsonObject); + try (Writer writer = new StringWriter()) { + writerFactory + .createWriter(writer) + .write(jsonObject); jsonString = writer.toString(); } return jsonString; @@ -60,8 +54,7 @@ public class PersonWriter { Map config = new HashMap<>(); config.put(JsonGenerator.PRETTY_PRINTING, true); - - JsonWriterFactory writerFactory = Json.createWriterFactory(config); - return writerFactory; + + return Json.createWriterFactory(config); } } From deb694bc885e970828946c21b530fd1b7e6cfa62 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Tue, 17 Jan 2017 06:40:44 +0100 Subject: [PATCH 096/120] Refactor PersonBuilder --- jee7/pom.xml | 2 +- .../java/com/baeldung/json/PersonBuilder.java | 17 +++++----------- metrics/pom.xml | 20 +++++++++++++++++++ .../baeldung/springretry/SpringRetryTest.java | 5 +---- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/jee7/pom.xml b/jee7/pom.xml index 66991d03a8..f275f56d58 100644 --- a/jee7/pom.xml +++ b/jee7/pom.xml @@ -10,7 +10,7 @@ war - 1.7 + 1.8 3.0.0 4.12 diff --git a/jee7/src/main/java/com/baeldung/json/PersonBuilder.java b/jee7/src/main/java/com/baeldung/json/PersonBuilder.java index 5d060827dc..a9ac4032ce 100644 --- a/jee7/src/main/java/com/baeldung/json/PersonBuilder.java +++ b/jee7/src/main/java/com/baeldung/json/PersonBuilder.java @@ -1,17 +1,12 @@ package com.baeldung.json; +import javax.json.*; import java.io.IOException; import java.io.StringReader; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.List; - -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonString; +import java.util.stream.Collectors; public class PersonBuilder { private String jsonString; @@ -35,11 +30,9 @@ public class PersonBuilder { JsonArray emailsJson = jsonObject.getJsonArray("emails"); - List emails = new ArrayList<>(); - - for (JsonString j : emailsJson.getValuesAs(JsonString.class)) { - emails.add(j.getString()); - } + List emails = emailsJson.getValuesAs(JsonString.class).stream() + .map(JsonString::getString) + .collect(Collectors.toList()); person.setEmails(emails); diff --git a/metrics/pom.xml b/metrics/pom.xml index df22f1aca6..0829c9a116 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -17,6 +17,10 @@ 3.1.0 3.1.0 4.12 + + 3.6.0 + 1.8 + 1.8 @@ -52,4 +56,20 @@ test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + $[maven.compiler-plugin.version] + + ${maven.compiler.source} + ${maven.compiler.target} + + + + +
    \ No newline at end of file diff --git a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java index 2f3411957e..3027d67d9e 100644 --- a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java +++ b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java @@ -32,9 +32,6 @@ public class SpringRetryTest { @Test(expected = RuntimeException.class) public void givenTemplateRetryService_whenCallWithException_thenRetry() { - retryTemplate.execute(arg0 -> { - myService.templateRetryService(); - return null; - }); + retryTemplate.execute(arg0 -> myService.templateRetryService()); } } From 0aa46996a6ec9c7a1f84e5b9230d446fc1efdf27 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Date: Tue, 17 Jan 2017 13:31:59 +0530 Subject: [PATCH 097/120] BAEL-580 handling exceptions in lambda expressions (#1004) --- .../exceptions/LambdaExceptionWrappers.java | 57 +++++++++++++++++++ .../lambda/exceptions/ThrowingConsumer.java | 8 +++ .../LambdaExceptionWrappersTest.java | 46 +++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java create mode 100644 core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java create mode 100644 core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java diff --git a/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java new file mode 100644 index 0000000000..64532c8b6f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java @@ -0,0 +1,57 @@ +package com.baeldung.java8.lambda.exceptions; + +import java.util.function.Consumer; + +public class LambdaExceptionWrappers { + + public static Consumer lambdaWrapper(Consumer consumer) { + return i -> { + try { + consumer.accept(i); + } catch (ArithmeticException e) { + System.err.println("Arithmetic Exception occured : " + e.getMessage()); + } + }; + } + + static Consumer consumerWrapper(Consumer consumer, Class clazz) { + return i -> { + try { + consumer.accept(i); + } catch (Exception ex) { + try { + E exCast = clazz.cast(ex); + System.err.println("Exception occured : " + exCast.getMessage()); + } catch (ClassCastException ccEx) { + throw ex; + } + } + }; + } + + public static Consumer throwingConsumerWrapper(ThrowingConsumer throwingConsumer) { + return i -> { + try { + throwingConsumer.accept(i); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }; + } + + public static Consumer handlingConsumerWrapper(ThrowingConsumer throwingConsumer, Class exceptionClass) { + return i -> { + try { + throwingConsumer.accept(i); + } catch (Exception ex) { + try { + E exCast = exceptionClass.cast(ex); + System.err.println("Exception occured : " + exCast.getMessage()); + } catch (ClassCastException ccEx) { + throw new RuntimeException(ex); + } + } + }; + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java new file mode 100644 index 0000000000..c5860e7f6b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java @@ -0,0 +1,8 @@ +package com.baeldung.java8.lambda.exceptions; + +@FunctionalInterface +public interface ThrowingConsumer { + + void accept(T t) throws E; + +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java new file mode 100644 index 0000000000..7b8ee55a27 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java @@ -0,0 +1,46 @@ +package com.baeldung.java8.lambda.exceptions; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import static com.baeldung.java8.lambda.exceptions.LambdaExceptionWrappers.*; + +public class LambdaExceptionWrappersTest { + + private List integers; + + @Before + public void init() { + integers = Arrays.asList(3, 9, 7, 0, 10, 20); + } + + @Test + public void whenNoExceptionFromLambdaWrapper_thenSuccess() { + integers.forEach(lambdaWrapper(i -> System.out.println(50 / i))); + } + + @Test + public void whenNoExceptionFromConsumerWrapper_thenSuccess() { + integers.forEach(consumerWrapper(i -> System.out.println(50 / i), ArithmeticException.class)); + } + + @Test(expected = RuntimeException.class) + public void whenExceptionFromThrowingConsumerWrapper_thenSuccess() { + integers.forEach(throwingConsumerWrapper(i -> writeToFile(i))); + } + + @Test + public void whenNoExceptionFromHandlingConsumerWrapper_thenSuccess() { + integers.forEach(handlingConsumerWrapper(i -> writeToFile(i), IOException.class)); + } + + void writeToFile(Integer i) throws IOException { + if (i == 0) { + throw new IOException(); // mock IOException + } + } +} From 7f8ee6f118f419b572fff8ecd9d7ddfcd052fe73 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Tue, 17 Jan 2017 09:04:42 +0100 Subject: [PATCH 098/120] Refactor LambdaExceptionWrappersTest --- .../lambda/exceptions/LambdaExceptionWrappersTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java index 7b8ee55a27..05e84e2dab 100644 --- a/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java +++ b/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersTest.java @@ -1,12 +1,12 @@ package com.baeldung.java8.lambda.exceptions; +import org.junit.Before; +import org.junit.Test; + import java.io.IOException; import java.util.Arrays; import java.util.List; -import org.junit.Before; -import org.junit.Test; - import static com.baeldung.java8.lambda.exceptions.LambdaExceptionWrappers.*; public class LambdaExceptionWrappersTest { @@ -38,7 +38,7 @@ public class LambdaExceptionWrappersTest { integers.forEach(handlingConsumerWrapper(i -> writeToFile(i), IOException.class)); } - void writeToFile(Integer i) throws IOException { + private void writeToFile(Integer i) throws IOException { if (i == 0) { throw new IOException(); // mock IOException } From 9512edb66714b7a268bf5160f3aa35bfe5aee55c Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 17 Jan 2017 09:54:51 +0100 Subject: [PATCH 099/120] BAEL-586 moved code to com.baeldung.kotlin package, use version properties in pom.xml --- kotlin/pom.xml | 15 +++++++++++---- .../kotlin/com/baeldung/{ => kotlin}/Example1.kt | 2 +- .../main/kotlin/com/baeldung/{ => kotlin}/Item.kt | 2 +- .../com/baeldung/{ => kotlin}/ItemService.kt | 2 +- .../com/baeldung/{ => kotlin}/ListExtension.kt | 2 +- .../com/baeldung/{ => kotlin}/ItemServiceTest.kt | 2 +- .../baeldung/{ => kotlin}/ListExtensionTest.kt | 3 ++- 7 files changed, 18 insertions(+), 10 deletions(-) rename kotlin/src/main/kotlin/com/baeldung/{ => kotlin}/Example1.kt (68%) rename kotlin/src/main/kotlin/com/baeldung/{ => kotlin}/Item.kt (91%) rename kotlin/src/main/kotlin/com/baeldung/{ => kotlin}/ItemService.kt (98%) rename kotlin/src/main/kotlin/com/baeldung/{ => kotlin}/ListExtension.kt (91%) rename kotlin/src/test/kotlin/com/baeldung/{ => kotlin}/ItemServiceTest.kt (93%) rename kotlin/src/test/kotlin/com/baeldung/{ => kotlin}/ListExtensionTest.kt (84%) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 59f71f91a6..eba248e1b9 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -12,18 +12,18 @@ org.jetbrains.kotlin kotlin-stdlib - 1.0.4 + ${kotlin-stdlib.version} org.jetbrains.kotlin kotlin-test-junit - 1.0.4 + ${kotlin-test-junit.version} test junit junit - 4.12 + ${junit.version} test @@ -35,7 +35,7 @@ kotlin-maven-plugin org.jetbrains.kotlin - 1.0.4 + ${kotlin-maven-plugin.version} compile @@ -55,4 +55,11 @@ + + 4.12 + 1.0.4 + 1.0.4 + 1.0.4 + +
    \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/Example1.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt similarity index 68% rename from kotlin/src/main/kotlin/com/baeldung/Example1.kt rename to kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt index 9637ec9145..bca1e54a6c 100644 --- a/kotlin/src/main/kotlin/com/baeldung/Example1.kt +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/Example1.kt @@ -1,4 +1,4 @@ -package com.baeldung +package com.baeldung.kotlin fun main(args: Array){ println("hello word") diff --git a/kotlin/src/main/kotlin/com/baeldung/Item.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt similarity index 91% rename from kotlin/src/main/kotlin/com/baeldung/Item.kt rename to kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt index e1a5559cd2..36994e4994 100644 --- a/kotlin/src/main/kotlin/com/baeldung/Item.kt +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/Item.kt @@ -1,4 +1,4 @@ -package com.baeldung +package com.baeldung.kotlin open class Item(val id: String, val name: String = "unknown_name") { open fun getIdOfItem(): String { diff --git a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt similarity index 98% rename from kotlin/src/main/kotlin/com/baeldung/ItemService.kt rename to kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt index f117ea5c52..3c0d2eacb1 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ItemService.kt +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/ItemService.kt @@ -1,4 +1,4 @@ -package com.baeldung +package com.baeldung.kotlin import java.util.* diff --git a/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt similarity index 91% rename from kotlin/src/main/kotlin/com/baeldung/ListExtension.kt rename to kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt index 9245bf991d..da1773b7c9 100644 --- a/kotlin/src/main/kotlin/com/baeldung/ListExtension.kt +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/ListExtension.kt @@ -1,4 +1,4 @@ -package com.baeldung +package com.baeldung.kotlin import java.util.concurrent.ThreadLocalRandom diff --git a/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt similarity index 93% rename from kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt rename to kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt index d681627f81..3d730b1283 100644 --- a/kotlin/src/test/kotlin/com/baeldung/ItemServiceTest.kt +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/ItemServiceTest.kt @@ -1,4 +1,4 @@ -package com.baeldung +package com.baeldung.kotlin import org.junit.Test import kotlin.test.assertNotNull diff --git a/kotlin/src/test/kotlin/com/baeldung/ListExtensionTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt similarity index 84% rename from kotlin/src/test/kotlin/com/baeldung/ListExtensionTest.kt rename to kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt index 42453f2057..7a496e7437 100644 --- a/kotlin/src/test/kotlin/com/baeldung/ListExtensionTest.kt +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/ListExtensionTest.kt @@ -1,5 +1,6 @@ -package com.baeldung +package com.baeldung.kotlin +import com.baeldung.kotlin.ListExtension import org.junit.Test import kotlin.test.assertTrue From a7c1fb3b72078b07facc64eddb6803e50bd4d6be Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Tue, 17 Jan 2017 11:30:15 +0100 Subject: [PATCH 100/120] BAEL-581 - Fixing assertions --- .../IterableStreamConversionTest.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java index ba7339fc7e..d7df9514cd 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java @@ -10,29 +10,33 @@ import java.util.stream.StreamSupport; import org.junit.Assert; import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; + public class IterableStreamConversionTest { @Test - public void givenIterable_whenConvertedToStream_thenTrue() { + public void givenIterable_whenConvertedToStream_thenNotNull() { String[] names = { "Testing", "Iterable", "conversion", "to", "Stream" }; StreamIterable iterable = new StreamIterable<>(names); - Assert.assertTrue(StreamSupport.stream(iterable.spliterator(), false) instanceof Stream); + Assert.assertNotNull(StreamSupport.stream(iterable.spliterator(), false)); } - @Test - public void whenConvertedToList_thenCorrect() { - String[] names = { "Testing", "Iterable", "conversion", "to", "Stream" }; - StreamIterable iterable = new StreamIterable<>(names); - Stream convertedStream = StreamSupport.stream(iterable.spliterator(), false); - Assert.assertTrue(convertedStream.map(String::toUpperCase) - .collect(Collectors.toList()) instanceof List); - } +@Test +public void whenConvertedToList_thenCorrect() { + String[] names = { "Testing", "Iterable", "conversion", "to", "Stream" }; + StreamIterable iterable = new StreamIterable<>(names); + Stream convertedStream = StreamSupport.stream(iterable.spliterator(), false); + List collected = convertedStream.map(String::toUpperCase).collect(Collectors.toList()); + assertThat(collected, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM")); +} } class StreamIterable implements Iterable { private List list; - public StreamIterable(T[] array) { + StreamIterable(T[] array) { this.list = Arrays.asList(array); } From 543c6eeb291dda9449edc66ce0902ac1fdac2afd Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Tue, 17 Jan 2017 11:31:13 +0100 Subject: [PATCH 101/120] BAEL-581 - reformatting --- .../IterableStreamConversionTest.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java index d7df9514cd..1271519179 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java @@ -18,19 +18,19 @@ public class IterableStreamConversionTest { @Test public void givenIterable_whenConvertedToStream_thenNotNull() { - String[] names = { "Testing", "Iterable", "conversion", "to", "Stream" }; + String[] names = {"Testing", "Iterable", "conversion", "to", "Stream"}; StreamIterable iterable = new StreamIterable<>(names); Assert.assertNotNull(StreamSupport.stream(iterable.spliterator(), false)); } -@Test -public void whenConvertedToList_thenCorrect() { - String[] names = { "Testing", "Iterable", "conversion", "to", "Stream" }; - StreamIterable iterable = new StreamIterable<>(names); - Stream convertedStream = StreamSupport.stream(iterable.spliterator(), false); - List collected = convertedStream.map(String::toUpperCase).collect(Collectors.toList()); - assertThat(collected, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM")); -} + @Test + public void whenConvertedToList_thenCorrect() { + String[] names = {"Testing", "Iterable", "conversion", "to", "Stream"}; + StreamIterable iterable = new StreamIterable<>(names); + Stream convertedStream = StreamSupport.stream(iterable.spliterator(), false); + List collected = convertedStream.map(String::toUpperCase).collect(Collectors.toList()); + assertThat(collected, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM")); + } } class StreamIterable implements Iterable { From 2c522ca047f8ce04423a9c61b666293b90835fb6 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Tue, 17 Jan 2017 14:29:42 +0100 Subject: [PATCH 102/120] Refactor IterableStreamConversionTest --- .../IterableStreamConversionTest.java | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java index 1271519179..f52f73558f 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionTest.java @@ -1,48 +1,32 @@ package com.baeldung.java.conversion; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; public class IterableStreamConversionTest { @Test public void givenIterable_whenConvertedToStream_thenNotNull() { - String[] names = {"Testing", "Iterable", "conversion", "to", "Stream"}; - StreamIterable iterable = new StreamIterable<>(names); + Iterable iterable = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream"); + Assert.assertNotNull(StreamSupport.stream(iterable.spliterator(), false)); } @Test public void whenConvertedToList_thenCorrect() { - String[] names = {"Testing", "Iterable", "conversion", "to", "Stream"}; - StreamIterable iterable = new StreamIterable<>(names); - Stream convertedStream = StreamSupport.stream(iterable.spliterator(), false); - List collected = convertedStream.map(String::toUpperCase).collect(Collectors.toList()); - assertThat(collected, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM")); + Iterable iterable = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream"); + + List result = StreamSupport.stream(iterable.spliterator(), false) + .map(String::toUpperCase).collect(Collectors.toList()); + + assertThat(result, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM")); } } - -class StreamIterable implements Iterable { - private List list; - - StreamIterable(T[] array) { - this.list = Arrays.asList(array); - } - - @Override - public Iterator iterator() { - return list.iterator(); - } - -} From 056bbc02afd9a18546c17da392dae97530ee1ed8 Mon Sep 17 00:00:00 2001 From: Zeger Hendrikse Date: Tue, 17 Jan 2017 21:26:25 +0100 Subject: [PATCH 103/120] Changed presidents for capitals in BiMap test --- .../com/baeldung/guava/GuavaBiMapTest.java | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java index c04cfb14fb..1dab8b384b 100644 --- a/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java +++ b/core-java/src/test/java/com/baeldung/guava/GuavaBiMapTest.java @@ -14,94 +14,94 @@ import com.google.common.collect.ImmutableBiMap; public class GuavaBiMapTest { @Test public void whenQueryByValue_shouldReturnKey() { - final BiMap personCountryHeadBiMap = HashBiMap.create(); - personCountryHeadBiMap.put("Modi", "India"); - personCountryHeadBiMap.put("Obama", "USA"); - personCountryHeadBiMap.put("Putin", "USSR"); + final BiMap capitalCountryBiMap = HashBiMap.create(); + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); - final String countryHeadName = personCountryHeadBiMap.inverse().get("India"); + final String countryHeadName = capitalCountryBiMap.inverse().get("India"); - assertEquals("Modi", countryHeadName); + assertEquals("New Delhi", countryHeadName); } @Test public void whenCreateBiMapFromExistingMap_shouldReturnKey() { final Map personCountryHeadMap = new HashMap<>(); - personCountryHeadMap.put("Modi", "India"); - personCountryHeadMap.put("Obama", "USA"); - personCountryHeadMap.put("Putin", "USSR"); - final BiMap personCountryHeadBiMap = HashBiMap.create(personCountryHeadMap); + personCountryHeadMap.put("New Delhi", "India"); + personCountryHeadMap.put("Washingon, D.C.", "USA"); + personCountryHeadMap.put("Moscow", "Russia"); + final BiMap capitalCountryBiMap = HashBiMap.create(personCountryHeadMap); - final String countryHeadName = personCountryHeadBiMap.inverse().get("India"); + final String countryHeadName = capitalCountryBiMap.inverse().get("India"); - assertEquals("Modi", countryHeadName); + assertEquals("New Delhi", countryHeadName); } @Test public void whenQueryByKey_shouldReturnValue() { - final BiMap personCountryHeadBiMap = HashBiMap.create(); + final BiMap capitalCountryBiMap = HashBiMap.create(); - personCountryHeadBiMap.put("Modi", "India"); - personCountryHeadBiMap.put("Obama", "USA"); - personCountryHeadBiMap.put("Putin", "USSR"); + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); - assertEquals("USA", personCountryHeadBiMap.get("Obama")); + assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); } @Test(expected = IllegalArgumentException.class) public void whenSameValueIsBeingPresent_shouldThrowException() { - final BiMap personCountryHeadBiMap = HashBiMap.create(); + final BiMap capitalCountryBiMap = HashBiMap.create(); - personCountryHeadBiMap.put("Modi", "India"); - personCountryHeadBiMap.put("Obama", "USA"); - personCountryHeadBiMap.put("Putin", "USSR"); - personCountryHeadBiMap.put("Trump", "USA"); + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.put("Trump", "USA"); } @Test public void givenSameValueIsBeingPresent_whenForcePutIsUsed_shouldCompleteSuccessfully() { - final BiMap personCountryHeadBiMap = HashBiMap.create(); + final BiMap capitalCountryBiMap = HashBiMap.create(); - personCountryHeadBiMap.put("Modi", "India"); - personCountryHeadBiMap.put("Obama", "USA"); - personCountryHeadBiMap.put("Putin", "USSR"); - personCountryHeadBiMap.forcePut("Trump", "USA"); + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.forcePut("Trump", "USA"); - assertEquals("USA", personCountryHeadBiMap.get("Trump")); - assertEquals("Trump", personCountryHeadBiMap.inverse().get("USA")); + assertEquals("USA", capitalCountryBiMap.get("Trump")); + assertEquals("Trump", capitalCountryBiMap.inverse().get("USA")); } @Test public void whenSameKeyIsBeingPresent_shouldReplaceAlreadyPresent() { - final BiMap personCountryHeadBiMap = HashBiMap.create(); + final BiMap capitalCountryBiMap = HashBiMap.create(); - personCountryHeadBiMap.put("Modi", "India"); - personCountryHeadBiMap.put("Obama", "USA"); - personCountryHeadBiMap.put("Putin", "USSR"); - personCountryHeadBiMap.put("Obama", "HongKong"); + capitalCountryBiMap.put("New Delhi", "India"); + capitalCountryBiMap.put("Washingon, D.C.", "USA"); + capitalCountryBiMap.put("Moscow", "Russia"); + capitalCountryBiMap.put("Washingon, D.C.", "HongKong"); - assertEquals("HongKong", personCountryHeadBiMap.get("Obama")); + assertEquals("HongKong", capitalCountryBiMap.get("Washingon, D.C.")); } @Test public void whenUsingImmutableBiMap_shouldAllowPutSuccessfully() { - final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build(); + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); - assertEquals("USA", personCountryHeadBiMap.get("Obama")); + assertEquals("USA", capitalCountryBiMap.get("Washingon, D.C.")); } @Test(expected = UnsupportedOperationException.class) public void whenUsingImmutableBiMap_shouldNotAllowRemove() { - final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build(); + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); - personCountryHeadBiMap.remove("Modi"); + capitalCountryBiMap.remove("New Delhi"); } @Test(expected = UnsupportedOperationException.class) public void whenUsingImmutableBiMap_shouldNotAllowPut() { - final BiMap personCountryHeadBiMap = new ImmutableBiMap.Builder().put("Modi", "India").put("Obama", "USA").put("Putin", "USSR").build(); + final BiMap capitalCountryBiMap = new ImmutableBiMap.Builder().put("New Delhi", "India").put("Washingon, D.C.", "USA").put("Moscow", "Russia").build(); - personCountryHeadBiMap.put("Trump", "USA"); + capitalCountryBiMap.put("New York", "USA"); } private enum Operation { From ada5fca2d5f26b16e893df58d22bf4745aaa67c9 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Wed, 18 Jan 2017 08:13:39 +0100 Subject: [PATCH 104/120] Refactor RegistrationController --- .../org/baeldung/config/RegistrationController.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java b/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java index da8f5f0e73..2414ff9cac 100644 --- a/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java +++ b/spring-security-client/spring-security-thymeleaf-authentication/src/main/java/org/baeldung/config/RegistrationController.java @@ -1,11 +1,9 @@ package org.baeldung.config; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; @@ -14,9 +12,10 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.WebAuthenticationDetails; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.context.annotation.Profile; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * Manually authenticate a user using Spring Security / Spring Web MVC' (upon successful account registration) @@ -40,7 +39,7 @@ public class RegistrationController { * @return The view. Page confirming either successful registration (and/or * successful authentication) or failed registration. */ - @RequestMapping(value = "/register", method = RequestMethod.GET) + @GetMapping("/register") public String registerAndAuthenticate(HttpServletRequest request, HttpServletResponse response) { logger.debug("registerAndAuthenticate: attempt to register, application should manually authenticate."); From 00e79b78f85d95feafd2a7f088a55bdc85c626c1 Mon Sep 17 00:00:00 2001 From: pedja4 Date: Wed, 18 Jan 2017 19:52:39 +0100 Subject: [PATCH 105/120] Updated pom.xml in metrics module Fixed property name for maven.compiler-plugin.version --- metrics/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metrics/pom.xml b/metrics/pom.xml index 0829c9a116..cadcacda01 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -18,7 +18,7 @@ 3.1.0 4.12 - 3.6.0 + 3.6.0 1.8 1.8 @@ -72,4 +72,4 @@ - \ No newline at end of file + From 4c437b59bbab4e47e37f3d58720a0676cb6acb1f Mon Sep 17 00:00:00 2001 From: pedja4 Date: Wed, 18 Jan 2017 20:39:59 +0100 Subject: [PATCH 106/120] Fixed pom.xml in metrics module --- metrics/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/pom.xml b/metrics/pom.xml index cadcacda01..7094b93811 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -63,7 +63,7 @@ org.apache.maven.plugins maven-compiler-plugin - $[maven.compiler-plugin.version] + ${maven.compiler-plugin.version} ${maven.compiler.source} ${maven.compiler.target} From 66449db339542884bc072ab6cec72d4398f5436c Mon Sep 17 00:00:00 2001 From: DOHA Date: Thu, 19 Jan 2017 00:09:47 +0200 Subject: [PATCH 107/120] spring cloud rest initial commit --- spring-cloud/pom.xml | 1 + spring-cloud/spring-cloud-rest/.gitignore | 24 +++ spring-cloud/spring-cloud-rest/pom.xml | 43 ++++++ .../spring-cloud-rest-client/pom.xml | 78 ++++++++++ .../SpringCloudRestClientApplication.java | 14 ++ .../persistence/dao/BookRepository.java | 10 ++ .../org/baeldung/persistence/model/Book.java | 138 ++++++++++++++++++ .../src/main/resources/application.properties | 9 ++ ...SpringCloudRestClientApplicationTests.java | 16 ++ .../spring-cloud-rest-server/.gitignore | 24 +++ .../.mvn/wrapper/maven-wrapper.properties | 1 + .../spring-cloud-rest-server/pom.xml | 63 ++++++++ .../SpringCloudRestServerApplication.java | 14 ++ .../src/main/resources/application.properties | 3 + ...SpringCloudRestServerApplicationTests.java | 15 ++ 15 files changed, 453 insertions(+) create mode 100644 spring-cloud/spring-cloud-rest/.gitignore create mode 100644 spring-cloud/spring-cloud-rest/pom.xml create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-client/pom.xml create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/SpringCloudRestClientApplication.java create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/dao/BookRepository.java create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/model/Book.java create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/resources/application.properties create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/test/java/org/baeldung/SpringCloudRestClientApplicationTests.java create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.gitignore create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.mvn/wrapper/maven-wrapper.properties create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-server/pom.xml create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/resources/application.properties create mode 100644 spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/test/java/org/baeldung/SpringCloudRestServerApplicationTests.java diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 299115634e..5b5b006d01 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -12,6 +12,7 @@ spring-cloud-hystrix spring-cloud-bootstrap spring-cloud-ribbon-client + spring-cloud-rest pom diff --git a/spring-cloud/spring-cloud-rest/.gitignore b/spring-cloud/spring-cloud-rest/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-cloud/spring-cloud-rest/.gitignore @@ -0,0 +1,24 @@ +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/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/pom.xml b/spring-cloud/spring-cloud-rest/pom.xml new file mode 100644 index 0000000000..fef6d93cfc --- /dev/null +++ b/spring-cloud/spring-cloud-rest/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-rest + 1.0.0-SNAPSHOT + + spring-cloud-rest-server + spring-cloud-rest-client + + pom + + spring-cloud-rest + + + UTF-8 + 3.6.0 + 1.4.2.RELEASE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/pom.xml new file mode 100644 index 0000000000..824e17e59c --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-rest-client + 0.0.1-SNAPSHOT + jar + + spring-cloud-rest + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-starter-eureka + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-rest + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR4 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/SpringCloudRestClientApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/SpringCloudRestClientApplication.java new file mode 100644 index 0000000000..a13aaa54bc --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/SpringCloudRestClientApplication.java @@ -0,0 +1,14 @@ +package org.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +@SpringBootApplication +@EnableEurekaClient +public class SpringCloudRestClientApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudRestClientApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/dao/BookRepository.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/dao/BookRepository.java new file mode 100644 index 0000000000..419c735d63 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/dao/BookRepository.java @@ -0,0 +1,10 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.Book; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.rest.core.annotation.RepositoryRestResource; + +@RepositoryRestResource(collectionResourceRel = "books", path = "books") +public interface BookRepository extends JpaRepository { + +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/model/Book.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/model/Book.java new file mode 100644 index 0000000000..69d217b096 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/java/org/baeldung/persistence/model/Book.java @@ -0,0 +1,138 @@ +package org.baeldung.persistence.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String isbn; + + @Column(nullable = false) + private String author; + + // + + public Book() { + super(); + } + + public Book(String title, String isbn, String author) { + super(); + this.title = title; + this.isbn = isbn; + this.author = author; + } + + // + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + ((author == null) ? 0 : author.hashCode()); + result = (prime * result) + (int) (id ^ (id >>> 32)); + result = (prime * result) + ((isbn == null) ? 0 : isbn.hashCode()); + result = (prime * result) + ((title == null) ? 0 : title.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Book other = (Book) obj; + if (author == null) { + if (other.author != null) { + return false; + } + } else if (!author.equals(other.author)) { + return false; + } + if (id != other.id) { + return false; + } + if (isbn == null) { + if (other.isbn != null) { + return false; + } + } else if (!isbn.equals(other.isbn)) { + return false; + } + if (title == null) { + if (other.title != null) { + return false; + } + } else if (!title.equals(other.title)) { + return false; + } + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Book [id=") + .append(id) + .append(", title=") + .append(title) + .append(", isbn=") + .append(isbn) + .append(", author=") + .append(author) + .append("]"); + return builder.toString(); + } + +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/resources/application.properties b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/resources/application.properties new file mode 100644 index 0000000000..45100d4788 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.application.name=spring-cloud-eureka-client +server.port=0 +eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8761/eureka} +eureka.instance.preferIpAddress=true + +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:cloud_rest;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/test/java/org/baeldung/SpringCloudRestClientApplicationTests.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/test/java/org/baeldung/SpringCloudRestClientApplicationTests.java new file mode 100644 index 0000000000..c16adfbb34 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-client/src/test/java/org/baeldung/SpringCloudRestClientApplicationTests.java @@ -0,0 +1,16 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringCloudRestClientApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.gitignore b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.gitignore @@ -0,0 +1,24 @@ +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/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.mvn/wrapper/maven-wrapper.properties b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..c954cec91c --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/pom.xml new file mode 100644 index 0000000000..e513b2d0c4 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-rest-server + 0.0.1-SNAPSHOT + jar + + spring-cloud-rest-server + Spring Cloud REST server + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Camden.SR4 + + + + + org.springframework.cloud + spring-cloud-starter-eureka-server + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java new file mode 100644 index 0000000000..2845ccf961 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java @@ -0,0 +1,14 @@ +package org.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; + +@SpringBootApplication +@EnableEurekaServer +public class SpringCloudRestServerApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudRestServerApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/resources/application.properties new file mode 100644 index 0000000000..2c7dfa193e --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8761 +eureka.client.registerWithEureka=false +eureka.client.fetchRegistry=false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/test/java/org/baeldung/SpringCloudRestServerApplicationTests.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/test/java/org/baeldung/SpringCloudRestServerApplicationTests.java new file mode 100644 index 0000000000..b5636c32d3 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-server/src/test/java/org/baeldung/SpringCloudRestServerApplicationTests.java @@ -0,0 +1,15 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringCloudRestServerApplicationTests { + @Test + public void contextLoads() { + } + +} From dfcfbec611e2b2539bdd1bfabbcb57f842511de3 Mon Sep 17 00:00:00 2001 From: Diane Duan Date: Thu, 19 Jan 2017 12:48:10 +0800 Subject: [PATCH 108/120] update metrics version --- metrics/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/pom.xml b/metrics/pom.xml index df22f1aca6..26226b3106 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -14,7 +14,7 @@ - 3.1.0 + 3.1.2 3.1.0 4.12 From 1d71f63693cfad50cf672a0762de1b8193149ce6 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 19 Jan 2017 08:48:48 +0100 Subject: [PATCH 109/120] Bael 19 jackson inheritance (#954) * BAEL-19 event inheritance * BAEL-19 test for json inheritance * BAEL-19 example event processor * BAEL-19 do not need json ignore * BAEL-19 simpler event, example of abstract * BAEL-19 ignoring superclass property * BAEL-586 change class event names --- .../baeldung/jackson/inheritance/Event.java | 25 +++++++++++ .../inheritance/ItemIdAddedToUser.java | 31 ++++++++++++++ .../inheritance/ItemIdRemovedFromUser.java | 29 +++++++++++++ .../ItemIdRemovedFromUserTest.java | 41 +++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 jackson/src/main/java/com/baeldung/jackson/inheritance/Event.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdAddedToUser.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUser.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUserTest.java diff --git a/jackson/src/main/java/com/baeldung/jackson/inheritance/Event.java b/jackson/src/main/java/com/baeldung/jackson/inheritance/Event.java new file mode 100644 index 0000000000..797bde98b2 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/inheritance/Event.java @@ -0,0 +1,25 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "eventType") +abstract public class Event { + private final String id; + private final Long timestamp; + + @JsonCreator + public Event(@JsonProperty("id") String id, @JsonProperty("timestamp") Long timestamp) { + this.id = id; + this.timestamp = timestamp; + } + + public Long getTimestamp() { + return timestamp; + } + + public String getId() { + return id; + } +} \ No newline at end of file diff --git a/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdAddedToUser.java b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdAddedToUser.java new file mode 100644 index 0000000000..11aa8ddb1a --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdAddedToUser.java @@ -0,0 +1,31 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +@JsonTypeName("itemIdAddedToUser") +@JsonIgnoreProperties("id") +public class ItemIdAddedToUser extends Event { + private final String itemId; + private final Long quantity; + + @JsonCreator + public ItemIdAddedToUser(@JsonProperty("id") String id, + @JsonProperty("timestamp") Long timestamp, + @JsonProperty("itemId") String itemId, + @JsonProperty("quantity") Long quantity) { + super(id, timestamp); + this.itemId = itemId; + this.quantity = quantity; + } + + public String getItemId() { + return itemId; + } + + public Long getQuantity() { + return quantity; + } +} \ No newline at end of file diff --git a/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUser.java b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUser.java new file mode 100644 index 0000000000..682394ddf3 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUser.java @@ -0,0 +1,29 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; + +@JsonTypeName("itemIdRemovedFromUser") +public class ItemIdRemovedFromUser extends Event { + private final String itemId; + private final Long quantity; + + @JsonCreator + public ItemIdRemovedFromUser(@JsonProperty("id") String id, + @JsonProperty("timestamp") Long timestamp, + @JsonProperty("itemId") String itemId, + @JsonProperty("quantity") Long quantity) { + super(id, timestamp); + this.itemId = itemId; + this.quantity = quantity; + } + + public String getItemId() { + return itemId; + } + + public Long getQuantity() { + return quantity; + } +} \ No newline at end of file diff --git a/jackson/src/test/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUserTest.java b/jackson/src/test/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUserTest.java new file mode 100644 index 0000000000..5aee03555e --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/inheritance/ItemIdRemovedFromUserTest.java @@ -0,0 +1,41 @@ +package com.baeldung.jackson.inheritance; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ItemIdRemovedFromUserTest { + @Test + public void givenRemoveItemJson_whenDeserialize_shouldHaveProperClassType() throws IOException { + //given + Event event = new ItemIdRemovedFromUser("1", 12345567L, "item_1", 2L); + ObjectMapper objectMapper = new ObjectMapper(); + String eventJson = objectMapper.writeValueAsString(event); + + //when + Event result = new ObjectMapper().readValue(eventJson, Event.class); + + //then + assertTrue(result instanceof ItemIdRemovedFromUser); + assertEquals("item_1", ((ItemIdRemovedFromUser) result).getItemId()); + } + + @Test + public void givenAdddItemJson_whenSerialize_shouldIgnoreIdPropertyFromSuperclass() throws IOException { + //given + Event event = new ItemIdAddedToUser("1", 12345567L, "item_1", 2L); + ObjectMapper objectMapper = new ObjectMapper(); + + //when + String eventJson = objectMapper.writeValueAsString(event); + + //then + assertFalse(eventJson.contains("id")); + } + +} \ No newline at end of file From e150b2ff54c67faa719ce889782351b3ad91e3b1 Mon Sep 17 00:00:00 2001 From: maibin Date: Thu, 19 Jan 2017 11:37:38 +0100 Subject: [PATCH 110/120] i18n fixes Thymeleaf (#1015) * How to work with dates in Thymeleaf * Fixes in PR for Thymeleaf * Changes to i18n --- spring-thymeleaf/pom.xml | 514 +++++++++--------- .../thymeleaf/config/WebMVCConfig.java | 147 ++--- .../thymeleaf/controller/DatesController.java | 16 +- .../thymeleaf/controller/HomeController.java | 1 - ...n_US.properties => messages_en.properties} | 0 .../src/main/webapp/WEB-INF/views/home.html | 4 +- ...ilityObjectsControllerIntegrationTest.java | 29 +- 7 files changed, 362 insertions(+), 349 deletions(-) rename spring-thymeleaf/src/main/resources/{messages_en_US.properties => messages_en.properties} (100%) diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index 457ac6dd56..f5dfc9931e 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -1,272 +1,262 @@ - 4.0.0 - com.baeldung - spring-thymeleaf - 0.1-SNAPSHOT - war + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + spring-thymeleaf + 0.1-SNAPSHOT + war + + 1.8 + + 4.3.4.RELEASE + 4.2.0.RELEASE + 3.1.0 + + 1.7.21 + 1.1.7 + + 3.0.3.RELEASE + 3.0.0.RELEASE + 2.1.2 + + 1.1.0.Final + 5.3.3.Final + 5.2.5.Final - - - - org.springframework - spring-context - ${org.springframework-version} - - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - ${org.springframework-version} - + 4.12 + + 3.6.0 + 2.6 + 2.19.1 + 1.6.1 + 2.2 + - - - org.springframework.security - spring-security-web - ${springframework-security.version} - - - org.springframework.security - spring-security-config - ${springframework-security.version} - + + + + org.springframework + spring-context + ${org.springframework-version} + + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + ${org.springframework-version} + + + + org.springframework.security + spring-security-web + ${springframework-security.version} + + + org.springframework.security + spring-security-config + ${springframework-security.version} + + + + org.thymeleaf + thymeleaf + ${org.thymeleaf-version} + + + org.thymeleaf + thymeleaf-spring4 + ${org.thymeleaf-version} + + + + nz.net.ultraq.thymeleaf + thymeleaf-layout-dialect + ${thymeleaf-layout-dialect.version} + + + org.thymeleaf.extras + thymeleaf-extras-java8time + ${org.thymeleaf.extras-version} + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + + javax.servlet + javax.servlet-api + ${javax.servlet-version} + provided + + + + javax.validation + validation-api + ${javax.validation-version} + + + org.hibernate + hibernate-validator + ${hibernate-validator.version} + + - - - org.thymeleaf - thymeleaf - ${org.thymeleaf-version} - - - org.thymeleaf - thymeleaf-spring4 - ${org.thymeleaf-version} - + + org.springframework + spring-test + ${org.springframework-version} + test + - - nz.net.ultraq.thymeleaf - thymeleaf-layout-dialect - ${thymeleaf-layout-dialect.version} - - - org.thymeleaf.extras - thymeleaf-extras-java8time - ${org.thymeleaf.extras-version} - + + + org.springframework.security + spring-security-test + ${springframework-security.version} + test + - - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - + + + junit + junit + ${junit.version} + test + - - - javax.servlet - javax.servlet-api - ${javax.servlet-version} - provided - + - - - javax.validation - validation-api - ${javax.validation-version} - - - org.hibernate - hibernate-validator - ${hibernate-validator.version} - + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java-version} + ${java-version} + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LiveTest.java + + + - - - org.springframework - spring-test - ${org.springframework-version} - test - + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + + + 8082 + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + ${tomcat7-maven-plugin.version} + + + tomcat-run + + exec-war-only + + package + + / + false + webapp.jar + utf-8 + + + + + + - - org.springframework.security - spring-security-test - ${springframework-security.version} - test - - - - junit - junit - ${junit.version} - test - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java-version} - ${java-version} - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - false - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - **/*IntegrationTest.java - **/*LiveTest.java - - - - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - true - - jetty8x - embedded - - - - - - 8082 - - - - - - org.apache.tomcat.maven - tomcat7-maven-plugin - ${tomcat7-maven-plugin.version} - - - tomcat-run - - exec-war-only - - package - - / - false - webapp.jar - utf-8 - - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - - 1.8 - - 4.3.5.RELEASE - 4.2.1.RELEASE - 3.1.0 - - - 1.7.21 - 1.1.7 - - - 3.0.3.RELEASE - 3.0.0.RELEASE - 2.1.2 - - - 1.1.0.Final - 5.3.3.Final - 5.2.5.Final - - 4.12 - - - 3.6.0 - 2.6 - 2.19.1 - 1.6.1 - 2.2 - - - - + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + \ No newline at end of file diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java index 10b9f0b7a0..e4335cbcf3 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java @@ -1,5 +1,7 @@ package com.baeldung.thymeleaf.config; +import java.util.Locale; + import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; @@ -8,10 +10,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.thymeleaf.TemplateEngine; import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect; import org.thymeleaf.spring4.SpringTemplateEngine; @@ -41,70 +47,70 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application this.applicationContext = applicationContext; } - @Bean - public ViewResolver htmlViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.setTemplateEngine(templateEngine(htmlTemplateResolver())); - resolver.setContentType("text/html"); - resolver.setCharacterEncoding("UTF-8"); - resolver.setViewNames(ArrayUtil.array("*.html")); - return resolver; - } + @Bean + public ViewResolver htmlViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.setTemplateEngine(templateEngine(htmlTemplateResolver())); + resolver.setContentType("text/html"); + resolver.setCharacterEncoding("UTF-8"); + resolver.setViewNames(ArrayUtil.array("*.html")); + return resolver; + } - @Bean - public ViewResolver javascriptViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver())); - resolver.setContentType("application/javascript"); - resolver.setCharacterEncoding("UTF-8"); - resolver.setViewNames(ArrayUtil.array("*.js")); - return resolver; - } + @Bean + public ViewResolver javascriptViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver())); + resolver.setContentType("application/javascript"); + resolver.setCharacterEncoding("UTF-8"); + resolver.setViewNames(ArrayUtil.array("*.js")); + return resolver; + } - @Bean - public ViewResolver plainViewResolver() { - ThymeleafViewResolver resolver = new ThymeleafViewResolver(); - resolver.setTemplateEngine(templateEngine(plainTemplateResolver())); - resolver.setContentType("text/plain"); - resolver.setCharacterEncoding("UTF-8"); - resolver.setViewNames(ArrayUtil.array("*.txt")); - return resolver; - } + @Bean + public ViewResolver plainViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.setTemplateEngine(templateEngine(plainTemplateResolver())); + resolver.setContentType("text/plain"); + resolver.setCharacterEncoding("UTF-8"); + resolver.setViewNames(ArrayUtil.array("*.txt")); + return resolver; + } - private TemplateEngine templateEngine(ITemplateResolver templateResolver) { - SpringTemplateEngine engine = new SpringTemplateEngine(); - engine.addDialect(new LayoutDialect(new GroupingStrategy())); - engine.addDialect(new Java8TimeDialect()); - engine.setTemplateResolver(templateResolver); - return engine; - } + private TemplateEngine templateEngine(ITemplateResolver templateResolver) { + SpringTemplateEngine engine = new SpringTemplateEngine(); + engine.addDialect(new LayoutDialect(new GroupingStrategy())); + engine.addDialect(new Java8TimeDialect()); + engine.setTemplateResolver(templateResolver); + return engine; + } - private ITemplateResolver htmlTemplateResolver() { - SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); - resolver.setApplicationContext(applicationContext); - resolver.setPrefix("/WEB-INF/views/"); - resolver.setCacheable(false); - resolver.setTemplateMode(TemplateMode.HTML); - return resolver; - } + private ITemplateResolver htmlTemplateResolver() { + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setApplicationContext(applicationContext); + resolver.setPrefix("/WEB-INF/views/"); + resolver.setCacheable(false); + resolver.setTemplateMode(TemplateMode.HTML); + return resolver; + } - private ITemplateResolver javascriptTemplateResolver() { - SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); - resolver.setApplicationContext(applicationContext); - resolver.setPrefix("/WEB-INF/js/"); - resolver.setCacheable(false); - resolver.setTemplateMode(TemplateMode.JAVASCRIPT); - return resolver; - } + private ITemplateResolver javascriptTemplateResolver() { + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setApplicationContext(applicationContext); + resolver.setPrefix("/WEB-INF/js/"); + resolver.setCacheable(false); + resolver.setTemplateMode(TemplateMode.JAVASCRIPT); + return resolver; + } - private ITemplateResolver plainTemplateResolver() { - SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); - resolver.setApplicationContext(applicationContext); - resolver.setPrefix("/WEB-INF/txt/"); - resolver.setCacheable(false); - resolver.setTemplateMode(TemplateMode.TEXT); - return resolver; - } + private ITemplateResolver plainTemplateResolver() { + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setApplicationContext(applicationContext); + resolver.setPrefix("/WEB-INF/txt/"); + resolver.setCacheable(false); + resolver.setTemplateMode(TemplateMode.TEXT); + return resolver; + } @Bean @Description("Spring Message Resolver") @@ -114,12 +120,31 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application return messageSource; } - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/"); + @Bean + public LocaleResolver localeResolver() { + SessionLocaleResolver localeResolver = new SessionLocaleResolver(); + localeResolver.setDefaultLocale(new Locale("en")); + return localeResolver; + } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor() { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("lang"); + return localeChangeInterceptor; } @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/"); + } + + @Override @Description("Custom Conversion Service") public void addFormatters(FormatterRegistry registry) { registry.addFormatter(new NameFormatter()); diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java index 20f5d02fed..74e2356076 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java @@ -13,13 +13,13 @@ import org.springframework.web.bind.annotation.RequestMethod; @Controller public class DatesController { - @RequestMapping(value = "/dates", method = RequestMethod.GET) - public String getInfo(Model model) { - model.addAttribute("standardDate", new Date()); - model.addAttribute("localDateTime", LocalDateTime.now()); - model.addAttribute("localDate", LocalDate.now()); - model.addAttribute("timestamp", Instant.now()); - return "dates.html"; - } + @RequestMapping(value = "/dates", method = RequestMethod.GET) + public String getInfo(Model model) { + model.addAttribute("standardDate", new Date()); + model.addAttribute("localDateTime", LocalDateTime.now()); + model.addAttribute("localDate", LocalDate.now()); + model.addAttribute("timestamp", Instant.now()); + return "dates.html"; + } } diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java index f1a394cac4..21f230c84c 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/HomeController.java @@ -18,7 +18,6 @@ public class HomeController { @RequestMapping(value = "/", method = RequestMethod.GET) public String getHome(Model model) { - DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.getDefault()); model.addAttribute("serverTime", dateFormat.format(new Date())); return "home.html"; diff --git a/spring-thymeleaf/src/main/resources/messages_en_US.properties b/spring-thymeleaf/src/main/resources/messages_en.properties similarity index 100% rename from spring-thymeleaf/src/main/resources/messages_en_US.properties rename to spring-thymeleaf/src/main/resources/messages_en.properties diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html index 8adecc49f1..aa4047641c 100644 --- a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html +++ b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html @@ -1,6 +1,6 @@ - + Home diff --git a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java index 5211136c35..597583eee0 100644 --- a/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java +++ b/spring-thymeleaf/src/test/java/com/baeldung/thymeleaf/controller/ExpressionUtilityObjectsControllerIntegrationTest.java @@ -31,25 +31,24 @@ import com.baeldung.thymeleaf.config.WebMVCSecurity; @ContextConfiguration(classes = { WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class }) public class ExpressionUtilityObjectsControllerIntegrationTest { - @Autowired - WebApplicationContext wac; - - @Autowired - MockHttpSession session; + @Autowired + WebApplicationContext wac; + @Autowired + MockHttpSession session; - private MockMvc mockMvc; + private MockMvc mockMvc; - @Autowired - private Filter springSecurityFilterChain; + @Autowired + private Filter springSecurityFilterChain; - protected RequestPostProcessor testUser() { - return user("user1").password("user1Pass").roles("USER"); - } + protected RequestPostProcessor testUser() { + return user("user1").password("user1Pass").roles("USER"); + } - @Before - public void setup() { - mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); - } + @Before + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build(); + } @Test public void testGetObjects() throws Exception { From 761603c76a66cb7ff15065ebec15309725003e8a Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Thu, 19 Jan 2017 13:01:10 +0100 Subject: [PATCH 111/120] Formatting in metrics tests --- .../baeldung/metrics/core/MetricsTest.java | 22 +++++++++++++++---- .../metrics/healthchecks/HealthCheckTest.java | 3 +++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java index 3301dcd96a..882cc6785f 100644 --- a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java @@ -16,14 +16,16 @@ public class MetricsTest { @Test public void whenMarkMeter_thenCorrectRates() throws InterruptedException { Meter meter = new Meter(); - long initCount = meter.getCount(); + assertThat(initCount, equalTo(0L)); meter.mark(); + assertThat(meter.getCount(), equalTo(1L)); meter.mark(20); + assertThat(meter.getCount(), equalTo(21L)); // not use assert for these rate values because they change every time when this test is run @@ -40,6 +42,7 @@ public class MetricsTest { @Test public void whenInitRatioGauge_thenCorrectRatio() { Gauge ratioGauge = new AttendanceRatioGauge(15, 20); + assertThat(ratioGauge.getValue(), equalTo(0.75)); } @@ -48,6 +51,7 @@ public class MetricsTest { Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); List expected = new ArrayList(); expected.add(12L); + assertThat(activeUsersGauge.getValue(), equalTo(expected)); } @@ -55,36 +59,42 @@ public class MetricsTest { public void whenUseDerivativeGauge_thenCorrectGaugeFromBase() { Gauge> activeUsersGauge = new ActiveUsersGauge(15, TimeUnit.MINUTES); Gauge activeUserCountGauge = new ActiveUserCountGauge(activeUsersGauge); + assertThat(activeUserCountGauge.getValue(), equalTo(1)); } @Test public void whenIncDecCounter_thenCorrectCount() { Counter counter = new Counter(); - long initCount = counter.getCount(); + assertThat(initCount, equalTo(0L)); counter.inc(); + assertThat(counter.getCount(), equalTo(1L)); counter.inc(11); + assertThat(counter.getCount(), equalTo(12L)); counter.dec(); + assertThat(counter.getCount(), equalTo(11L)); counter.dec(6); + assertThat(counter.getCount(), equalTo(5L)); } @Test public void whenUpdateHistogram_thenCorrectDistributionData() { Histogram histogram = new Histogram(new UniformReservoir()); - histogram.update(5); long count1 = histogram.getCount(); + assertThat(count1, equalTo(1L)); + Snapshot snapshot1 = histogram.getSnapshot(); assertThat(snapshot1.getValues().length, equalTo(1)); assertThat(snapshot1.getValues()[0], equalTo(5L)); @@ -101,8 +111,11 @@ public class MetricsTest { histogram.update(20); long count2 = histogram.getCount(); + assertThat(count2, equalTo(2L)); + Snapshot snapshot2 = histogram.getSnapshot(); + assertThat(snapshot2.getValues().length, equalTo(2)); assertThat(snapshot2.getValues()[0], equalTo(5L)); assertThat(snapshot2.getValues()[1], equalTo(20L)); @@ -121,11 +134,11 @@ public class MetricsTest { @Test public void whenUseTimer_thenCorrectTimerContexts() throws InterruptedException { Timer timer = new Timer(); - Timer.Context context1 = timer.time(); TimeUnit.SECONDS.sleep(5); long elapsed1 = context1.stop(); + assertEquals(5000000000L, elapsed1, 1000000); assertThat(timer.getCount(), equalTo(1L)); assertEquals(0.2, timer.getMeanRate(), 0.1); @@ -133,6 +146,7 @@ public class MetricsTest { Timer.Context context2 = timer.time(); TimeUnit.SECONDS.sleep(2); context2.close(); + assertThat(timer.getCount(), equalTo(2L)); assertEquals(0.3, timer.getMeanRate(), 0.1); } diff --git a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java index 99a3970761..b1b2cc2ff9 100644 --- a/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/healthchecks/HealthCheckTest.java @@ -23,10 +23,13 @@ public class HealthCheckTest { assertThat(healthCheckRegistry.getNames().size(), equalTo(2)); Map results = healthCheckRegistry.runHealthChecks(); + assertFalse(results.isEmpty()); + results.forEach((k, v) -> assertTrue(v.isHealthy())); healthCheckRegistry.unregister("uc"); + assertThat(healthCheckRegistry.getNames().size(), equalTo(1)); } } \ No newline at end of file From 3a566b4cce5fadaf55fcd17de43b3ba6ca866914 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 19 Jan 2017 14:13:45 +0100 Subject: [PATCH 112/120] Refactor SpringRetryTest --- .../test/java/org/baeldung/springretry/SpringRetryTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java index 3027d67d9e..2f3411957e 100644 --- a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java +++ b/spring-all/src/test/java/org/baeldung/springretry/SpringRetryTest.java @@ -32,6 +32,9 @@ public class SpringRetryTest { @Test(expected = RuntimeException.class) public void givenTemplateRetryService_whenCallWithException_thenRetry() { - retryTemplate.execute(arg0 -> myService.templateRetryService()); + retryTemplate.execute(arg0 -> { + myService.templateRetryService(); + return null; + }); } } From a9a3f3ba5808da708d963295f514324794cf01b4 Mon Sep 17 00:00:00 2001 From: maibin Date: Thu, 19 Jan 2017 16:55:19 +0100 Subject: [PATCH 113/120] Thymeleaf i18n resolved (#1016) * How to work with dates in Thymeleaf * Fixes in PR for Thymeleaf * Changes to i18n * Resolved issue with i18n --- .../main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java index e4335cbcf3..bbc4fa2532 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCConfig.java @@ -82,6 +82,7 @@ public class WebMVCConfig extends WebMvcConfigurerAdapter implements Application engine.addDialect(new LayoutDialect(new GroupingStrategy())); engine.addDialect(new Java8TimeDialect()); engine.setTemplateResolver(templateResolver); + engine.setTemplateEngineMessageSource(messageSource()); return engine; } From c256938a1cdfa49dbd87ff7dd3678bfcdd4d99a7 Mon Sep 17 00:00:00 2001 From: Jesus Boadas Date: Thu, 19 Jan 2017 14:33:37 -0400 Subject: [PATCH 114/120] Building an Application with Spring Boot (#1018) * Initial commit * Initial commit * deleted old files * classNotFoundException-contextLoaderListener * Spring Boot Application * delete ClassNotFoundException --- spring-boot/MyFirstSpringBoot/pom.xml | 39 +++++++++++++++++++ .../src/main/java/com/baeldung/App.java | 13 +++++++ .../baeldung/controller/HomeController.java | 18 +++++++++ .../src/main/resources/public/error/404.html | 8 ++++ .../src/test/java/com/baeldung/AppTest.java | 39 +++++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 spring-boot/MyFirstSpringBoot/pom.xml create mode 100644 spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/App.java create mode 100644 spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/controller/HomeController.java create mode 100644 spring-boot/MyFirstSpringBoot/src/main/resources/public/error/404.html create mode 100644 spring-boot/MyFirstSpringBoot/src/test/java/com/baeldung/AppTest.java diff --git a/spring-boot/MyFirstSpringBoot/pom.xml b/spring-boot/MyFirstSpringBoot/pom.xml new file mode 100644 index 0000000000..a5cbb37263 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + + com.baeldung + MyFirstSpringBoot + 0.0.1-SNAPSHOT + jar + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + MyFirstSpringBoot + http://maven.apache.org + + + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + junit + junit + test + + + diff --git a/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/App.java b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/App.java new file mode 100644 index 0000000000..d7cc90fcb9 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/App.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class App +{ + public static void main( String[] args ) + { + SpringApplication.run(App.class, args); + } +} diff --git a/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/controller/HomeController.java b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/controller/HomeController.java new file mode 100644 index 0000000000..757e0a06b1 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/main/java/com/baeldung/controller/HomeController.java @@ -0,0 +1,18 @@ +package com.baeldung.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HomeController { + + @RequestMapping("/") + public String root(){ + return "Index Page"; + } + + @RequestMapping("/local") + public String local(){ + return "/local"; + } +} diff --git a/spring-boot/MyFirstSpringBoot/src/main/resources/public/error/404.html b/spring-boot/MyFirstSpringBoot/src/main/resources/public/error/404.html new file mode 100644 index 0000000000..02d6092bee --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/main/resources/public/error/404.html @@ -0,0 +1,8 @@ + + + RESOURCE NOT FOUND + + +

    404 RESOURCE NOT FOUND

    + + \ No newline at end of file diff --git a/spring-boot/MyFirstSpringBoot/src/test/java/com/baeldung/AppTest.java b/spring-boot/MyFirstSpringBoot/src/test/java/com/baeldung/AppTest.java new file mode 100644 index 0000000000..8450740863 --- /dev/null +++ b/spring-boot/MyFirstSpringBoot/src/test/java/com/baeldung/AppTest.java @@ -0,0 +1,39 @@ +package com.baeldung; + +import static org.hamcrest.Matchers.equalTo; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class AppTest { + + @Autowired + private MockMvc mvc; + + @Test + public void getIndex() throws Exception { + mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("Index Page"))); + } + + @Test + public void getLocal() throws Exception { + mvc.perform(MockMvcRequestBuilders.get("/local").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(equalTo("/local"))); + } + +} \ No newline at end of file From b68337b329ed4a4710381231e79a14424ecf38d3 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 19 Jan 2017 20:49:39 +0100 Subject: [PATCH 115/120] Add surefire plugin --- spring-reactor/pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index 7b6b1318cf..a04955eada 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -39,6 +39,17 @@ org.springframework.boot spring-boot-maven-plugin
    + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LiveTest.java + + + From 71c298276f53af90cf585701c214ef0169610f91 Mon Sep 17 00:00:00 2001 From: pivovarit Date: Thu, 19 Jan 2017 21:00:55 +0100 Subject: [PATCH 116/120] Refactor MetricsTest --- .../java/com/baeldung/metrics/core/MetricsTest.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java index 882cc6785f..f670acfaef 100644 --- a/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/core/MetricsTest.java @@ -1,16 +1,15 @@ package com.baeldung.metrics.core; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import com.codahale.metrics.*; +import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import org.junit.Test; - -import com.codahale.metrics.*; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; public class MetricsTest { @Test @@ -139,7 +138,7 @@ public class MetricsTest { long elapsed1 = context1.stop(); - assertEquals(5000000000L, elapsed1, 1000000); + assertEquals(5000000000L, elapsed1, 10000000); assertThat(timer.getCount(), equalTo(1L)); assertEquals(0.2, timer.getMeanRate(), 0.1); From 61fa5ff781f8093082379d3f2ac29f42410c5205 Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 19 Jan 2017 23:12:01 +0200 Subject: [PATCH 117/120] minor cleanup --- .../main/java/com/baeldung/MongoExample.java | 84 +++++++++---------- .../java/com/baeldung/AppIntegrationTest.java | 72 ++++++++++++++++ .../src/test/java/com/baeldung/AppTest.java | 72 ---------------- 3 files changed, 114 insertions(+), 114 deletions(-) create mode 100644 java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java delete mode 100644 java-mongodb/src/test/java/com/baeldung/AppTest.java diff --git a/java-mongodb/src/main/java/com/baeldung/MongoExample.java b/java-mongodb/src/main/java/com/baeldung/MongoExample.java index fbef17a15f..9af1e1f6a4 100644 --- a/java-mongodb/src/main/java/com/baeldung/MongoExample.java +++ b/java-mongodb/src/main/java/com/baeldung/MongoExample.java @@ -7,47 +7,47 @@ import com.mongodb.DBCursor; import com.mongodb.MongoClient; public class MongoExample { - public static void main( String[] args ) { - - MongoClient mongoClient = new MongoClient("localhost", 27017); - - DB database = mongoClient.getDB("myMongoDb"); - - // print existing databases - mongoClient.getDatabaseNames().forEach(System.out::println); - - database.createCollection("customers", null); - - // print all collections in customers database - database.getCollectionNames().forEach(System.out::println); - - // create data - DBCollection collection = database.getCollection("customers"); - BasicDBObject document = new BasicDBObject(); - document.put("name", "Shubham"); - document.put("company", "Baeldung"); - collection.insert(document); - - // update data - BasicDBObject query = new BasicDBObject(); - query.put("name", "Shubham"); - BasicDBObject newDocument = new BasicDBObject(); - newDocument.put("name", "John"); - BasicDBObject updateObject = new BasicDBObject(); - updateObject.put("$set", newDocument); - collection.update(query, updateObject); - - // read data - BasicDBObject searchQuery = new BasicDBObject(); - searchQuery.put("name", "John"); - DBCursor cursor = collection.find(searchQuery); - while (cursor.hasNext()) { - System.out.println(cursor.next()); - } - - // delete data - BasicDBObject deleteQuery = new BasicDBObject(); - deleteQuery.put("name", "John"); - collection.remove(deleteQuery); + public static void main(String[] args) { + + MongoClient mongoClient = new MongoClient("localhost", 27017); + + DB database = mongoClient.getDB("myMongoDb"); + + // print existing databases + mongoClient.getDatabaseNames().forEach(System.out::println); + + database.createCollection("customers", null); + + // print all collections in customers database + database.getCollectionNames().forEach(System.out::println); + + // create data + DBCollection collection = database.getCollection("customers"); + BasicDBObject document = new BasicDBObject(); + document.put("name", "Shubham"); + document.put("company", "Baeldung"); + collection.insert(document); + + // update data + BasicDBObject query = new BasicDBObject(); + query.put("name", "Shubham"); + BasicDBObject newDocument = new BasicDBObject(); + newDocument.put("name", "John"); + BasicDBObject updateObject = new BasicDBObject(); + updateObject.put("$set", newDocument); + collection.update(query, updateObject); + + // read data + BasicDBObject searchQuery = new BasicDBObject(); + searchQuery.put("name", "John"); + DBCursor cursor = collection.find(searchQuery); + while (cursor.hasNext()) { + System.out.println(cursor.next()); + } + + // delete data + BasicDBObject deleteQuery = new BasicDBObject(); + deleteQuery.put("name", "John"); + collection.remove(deleteQuery); } } diff --git a/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java b/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java new file mode 100644 index 0000000000..94d1a01492 --- /dev/null +++ b/java-mongodb/src/test/java/com/baeldung/AppIntegrationTest.java @@ -0,0 +1,72 @@ +package com.baeldung; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.mongodb.BasicDBObject; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBCursor; +import com.mongodb.Mongo; + +import de.flapdoodle.embedmongo.MongoDBRuntime; +import de.flapdoodle.embedmongo.MongodExecutable; +import de.flapdoodle.embedmongo.MongodProcess; +import de.flapdoodle.embedmongo.config.MongodConfig; +import de.flapdoodle.embedmongo.distribution.Version; +import de.flapdoodle.embedmongo.runtime.Network; + +public class AppIntegrationTest { + + private static final String DB_NAME = "myMongoDb"; + private MongodExecutable mongodExe; + private MongodProcess mongod; + private Mongo mongo; + private DB db; + private DBCollection collection; + + @Before + public void setup() throws Exception { + // Creating Mongodbruntime instance + MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance(); + + // Creating MongodbExecutable + mongodExe = runtime.prepare(new MongodConfig(Version.V2_0_1, 12345, Network.localhostIsIPv6())); + + // Starting Mongodb + mongod = mongodExe.start(); + mongo = new Mongo("localhost", 12345); + + // Creating DB + db = mongo.getDB(DB_NAME); + + // Creating collection Object and adding values + collection = db.getCollection("customers"); + } + + @After + public void teardown() throws Exception { + mongod.stop(); + mongodExe.cleanup(); + } + + @Test + public void testAddressPersistance() { + BasicDBObject contact = new BasicDBObject(); + contact.put("name", "John"); + contact.put("company", "Baeldung"); + + // Inserting document + collection.insert(contact); + DBCursor cursorDoc = collection.find(); + BasicDBObject contact1 = new BasicDBObject(); + while (cursorDoc.hasNext()) { + contact1 = (BasicDBObject) cursorDoc.next(); + System.out.println(contact1); + } + assertEquals(contact1.get("name"), "John"); + } +} \ No newline at end of file diff --git a/java-mongodb/src/test/java/com/baeldung/AppTest.java b/java-mongodb/src/test/java/com/baeldung/AppTest.java deleted file mode 100644 index 5dd6bb66a9..0000000000 --- a/java-mongodb/src/test/java/com/baeldung/AppTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.baeldung; - -import static org.junit.Assert.assertEquals; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import com.mongodb.BasicDBObject; -import com.mongodb.DB; -import com.mongodb.DBCollection; -import com.mongodb.DBCursor; -import com.mongodb.Mongo; -import de.flapdoodle.embedmongo.MongoDBRuntime; -import de.flapdoodle.embedmongo.MongodExecutable; -import de.flapdoodle.embedmongo.MongodProcess; -import de.flapdoodle.embedmongo.config.MongodConfig; -import de.flapdoodle.embedmongo.distribution.Version; -import de.flapdoodle.embedmongo.runtime.Network; - -public class AppTest { - - private static final String DB_NAME = "myMongoDb"; - private MongodExecutable mongodExe; - private MongodProcess mongod; - private Mongo mongo; - private DB db; - private DBCollection collection; - - @Before - public void setup() throws Exception { - - // Creating Mongodbruntime instance - MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance(); - - // Creating MongodbExecutable - mongodExe = runtime.prepare(new MongodConfig(Version.V2_0_1, 12345, - Network.localhostIsIPv6())); - - // Starting Mongodb - mongod = mongodExe.start(); - mongo = new Mongo("localhost", 12345); - - // Creating DB - db = mongo.getDB(DB_NAME); - - // Creating collection Object and adding values - collection = db.getCollection("customers"); - } - - @After - public void teardown() throws Exception { - mongod.stop(); - mongodExe.cleanup(); - } - - @Test - public void testAddressPersistance() { - - BasicDBObject contact = new BasicDBObject(); - contact.put("name", "John"); - contact.put("company", "Baeldung"); - - // Inserting document - collection.insert(contact); - DBCursor cursorDoc = collection.find(); - BasicDBObject contact1 = new BasicDBObject(); - while (cursorDoc.hasNext()) { - contact1 = (BasicDBObject) cursorDoc.next(); - System.out.println(contact1); - } - assertEquals(contact1.get("name"), "John"); - } -} \ No newline at end of file From 522599fc02b643e827c2e3646bf40c273b6a8150 Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 19 Jan 2017 23:14:44 +0200 Subject: [PATCH 118/120] testing cleanup --- java-mongodb/pom.xml | 122 +++++++++++++++++++++++++++++++------------ 1 file changed, 88 insertions(+), 34 deletions(-) diff --git a/java-mongodb/pom.xml b/java-mongodb/pom.xml index 66b4bbdc99..4e5b847a01 100644 --- a/java-mongodb/pom.xml +++ b/java-mongodb/pom.xml @@ -1,44 +1,98 @@ - - 4.0.0 + + 4.0.0 - com.baeldung - java-mongodb - 1.0-SNAPSHOT + com.baeldung + java-mongodb + 1.0-SNAPSHOT - - 1.8 - 1.8 - 4.12 - 3.4.1 - 1.11 - + - + + junit + junit + ${junit.version} + test + - - junit - junit - ${junit.version} - test - - - - de.flapdoodle.embedmongo - de.flapdoodle.embedmongo - ${flapdoodle.version} - test - + + de.flapdoodle.embedmongo + de.flapdoodle.embedmongo + ${flapdoodle.version} + test + - - org.mongodb - mongo-java-driver - ${mongo.version} - + + org.mongodb + mongo-java-driver + ${mongo.version} + - + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + 1.8 + 1.8 + 4.12 + 3.4.1 + 1.11 + + 2.19.1 + \ No newline at end of file From 117635f9550acab84981ed98d45720336ffde55c Mon Sep 17 00:00:00 2001 From: Naoshadul Islam Date: Fri, 20 Jan 2017 04:10:13 +0600 Subject: [PATCH 119/120] Added relevant articles (#1021) * Added relevant articles * Update README.md * Added relevant articles * Update README.md * Added relevant articles --- core-java/README.md | 3 ++- redis/README.md | 2 ++ spring-mvc-xml/README.md | 1 + spring-thymeleaf/README.md | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 redis/README.md diff --git a/core-java/README.md b/core-java/README.md index 015e18cec1..b653cfcfaf 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -52,4 +52,5 @@ - [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) - [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size) - [The Basics of Java Generics](http://www.baeldung.com/java-generics) -- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) \ No newline at end of file +- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) +- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) diff --git a/redis/README.md b/redis/README.md new file mode 100644 index 0000000000..3ce9031b62 --- /dev/null +++ b/redis/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Intro to Jedis – the Java Redis Client Library](http://www.baeldung.com/jedis-java-redis-client-library) diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index b699c37d00..7a5e8c75e9 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -14,3 +14,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data) - [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind) - [Guide to JavaServer Pages (JSP)](http://www.baeldung.com/jsp) +- [Exploring SpringMVC’s Form Tag Library](http://www.baeldung.com/spring-mvc-form-tags) diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 67bdddaf64..3f8f0ab244 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -9,6 +9,7 @@ - [Spring and Thymeleaf 3: Expressions](http://www.baeldung.com/spring-thymeleaf-3-expressions) - [Spring MVC + Thymeleaf 3.0: New Features](http://www.baeldung.com/spring-thymeleaf-3) - [How to Work with Dates in Thymeleaef](http://www.baeldung.com/dates-in-thymeleaf) +- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) ### Build the Project From ad63b55edbd4372577160f8038c0b083801aa208 Mon Sep 17 00:00:00 2001 From: Parth Joshi Date: Fri, 20 Jan 2017 07:44:30 +0530 Subject: [PATCH 120/120] Spark Java Article BAEL-498 (#912) * Initial Commit for Spark Java Article BAEL-498 * reverting main pom.xml and rollbacking accidental changes. * Changes as per review: 1. Added UserService 2. Renamed UserStore to UserServiceMapImpl 3. Removed Empty spaces in User.java 4. Removed AppTest 5. Changes in SparkRestExample for using UserServiceMapImp instead of UserStore static functions. * Suggested changes in print messages. * Changes as per comments on github... for PR: https://github.com/eugenp/tutorials/pull/912 * Changes in editUser function as per guidance by Kevin. * Clean up * added 1.8 config for pom.xml * Clean up. * Removed junit dep. * Added Application/json in response type. --- pom.xml | 1 + spark-java/pom.xml | 29 +++++++ .../baeldung/sparkjava/HelloWorldService.java | 12 +++ .../baeldung/sparkjava/SparkRestExample.java | 76 +++++++++++++++++++ .../baeldung/sparkjava/StandardResponse.java | 47 ++++++++++++ .../baeldung/sparkjava/StatusResponse.java | 17 +++++ .../java/com/baeldung/sparkjava/User.java | 59 ++++++++++++++ .../com/baeldung/sparkjava/UserException.java | 13 ++++ .../com/baeldung/sparkjava/UserService.java | 12 +++ .../sparkjava/UserServiceMapImpl.java | 68 +++++++++++++++++ 10 files changed, 334 insertions(+) create mode 100644 spark-java/pom.xml create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/HelloWorldService.java create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/SparkRestExample.java create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/StandardResponse.java create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/StatusResponse.java create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/User.java create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/UserException.java create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/UserService.java create mode 100644 spark-java/src/main/java/com/baeldung/sparkjava/UserServiceMapImpl.java diff --git a/pom.xml b/pom.xml index 6d26517999..661b80fca5 100644 --- a/pom.xml +++ b/pom.xml @@ -94,6 +94,7 @@ resteasy selenium-junit-testng + spark-java spring-akka spring-amqp spring-all diff --git a/spark-java/pom.xml b/spark-java/pom.xml new file mode 100644 index 0000000000..5b8923322a --- /dev/null +++ b/spark-java/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + com.baeldung + spark-java + 0.1.0-SNAPSHOT + spark-java + http://maven.apache.org + + UTF-8 + 1.8 + 1.8 + + + + com.sparkjava + spark-core + 2.5.4 + + + + com.google.code.gson + gson + 2.8.0 + + + diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/HelloWorldService.java b/spark-java/src/main/java/com/baeldung/sparkjava/HelloWorldService.java new file mode 100644 index 0000000000..55b3fbe3f2 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/HelloWorldService.java @@ -0,0 +1,12 @@ +package com.baeldung.sparkjava; +import static spark.Spark.*; + +public class HelloWorldService { + public static void main(String[] args) { + get("/hello", (req,res)->"Hello, Baeldung"); + + get("/hello/:name", (req,res)->{ + return "Hello: "+ req.params(":name"); + }); + } +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/SparkRestExample.java b/spark-java/src/main/java/com/baeldung/sparkjava/SparkRestExample.java new file mode 100644 index 0000000000..bb610fd7f0 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/SparkRestExample.java @@ -0,0 +1,76 @@ +package com.baeldung.sparkjava; + +import static spark.Spark.delete; +import static spark.Spark.get; +import static spark.Spark.options; +import static spark.Spark.post; +import static spark.Spark.put; + +import com.google.gson.Gson; + +public class SparkRestExample { + public static void main(String[] args) { + final UserService userService = new UserServiceMapImpl(); + + post("/users", (request, response) -> { + response.type("application/json"); + + User user = new Gson().fromJson(request.body(), User.class); + userService.addUser(user); + + return new Gson().toJson(new StandardResponse(StatusResponse.SUCCESS)); + }); + + get("/users", (request, response) -> { + response.type("application/json"); + + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS,new Gson() + .toJsonTree(userService.getUsers()))); + }); + + get("/users/:id", (request, response) -> { + response.type("application/json"); + + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS,new Gson() + .toJsonTree(userService.getUser(request.params(":id"))))); + }); + + put("/users/:id", (request, response) -> { + response.type("application/json"); + + User toEdit = new Gson().fromJson(request.body(), User.class); + User editedUser = userService.editUser(toEdit); + + if (editedUser != null) { + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS,new Gson() + .toJsonTree(editedUser))); + }else { + return new Gson().toJson( + new StandardResponse(StatusResponse.ERROR,new Gson() + .toJson("User not found or error in edit"))); + } + }); + + delete("/users/:id", (request, response) -> { + response.type("application/json"); + + userService.deleteUser(request.params(":id")); + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS, "user deleted")); + }); + + options("/users/:id", (request, response) -> { + response.type("application/json"); + + return new Gson().toJson( + new StandardResponse(StatusResponse.SUCCESS, + (userService.userExist( + request.params(":id"))) ? "User exists" : "User does not exists" )); + }); + + } + +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/StandardResponse.java b/spark-java/src/main/java/com/baeldung/sparkjava/StandardResponse.java new file mode 100644 index 0000000000..51f1954e57 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/StandardResponse.java @@ -0,0 +1,47 @@ +package com.baeldung.sparkjava; + +import com.google.gson.JsonElement; + +public class StandardResponse { + private StatusResponse status; + private String message; + private JsonElement data; + + public StandardResponse(StatusResponse status) { + this.status = status; + } + + public StandardResponse(StatusResponse status, String message) { + this.status = status; + this.message = message; + } + + public StandardResponse(StatusResponse status, JsonElement data) { + this.status = status; + this.data = data; + } + + public StatusResponse getStatus() { + return status; + } + + public void setStatus(StatusResponse status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public JsonElement getData() { + return data; + } + + public void setData(JsonElement data) { + this.data = data; + } +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/StatusResponse.java b/spark-java/src/main/java/com/baeldung/sparkjava/StatusResponse.java new file mode 100644 index 0000000000..0e3137293a --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/StatusResponse.java @@ -0,0 +1,17 @@ +package com.baeldung.sparkjava; + +public enum StatusResponse { + SUCCESS ("Success"), + ERROR ("Error"); + + final private String status; + + StatusResponse(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/User.java b/spark-java/src/main/java/com/baeldung/sparkjava/User.java new file mode 100644 index 0000000000..7447671470 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/User.java @@ -0,0 +1,59 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.sparkjava; + +class User { + + private String id; + private String firstName; + private String lastName; + private String email; + + public User(String id, String firstName, String lastName, String email) { + super(); + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return new StringBuffer().append(getEmail()).toString(); + } +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/UserException.java b/spark-java/src/main/java/com/baeldung/sparkjava/UserException.java new file mode 100644 index 0000000000..929c0dfdb7 --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/UserException.java @@ -0,0 +1,13 @@ +package com.baeldung.sparkjava; + +public class UserException extends Exception{ + + public UserException() { + super(); + } + + public UserException(String message) { + super(message); + } + +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/UserService.java b/spark-java/src/main/java/com/baeldung/sparkjava/UserService.java new file mode 100644 index 0000000000..9b1fa7be3a --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/UserService.java @@ -0,0 +1,12 @@ +package com.baeldung.sparkjava; + +import java.util.Collection; + +public interface UserService { + public void addUser (User user) ; + public Collection getUsers () ; + public User getUser (String id) ; + public User editUser (User user) throws UserException; + public void deleteUser (String id) ; + public boolean userExist (String id); +} diff --git a/spark-java/src/main/java/com/baeldung/sparkjava/UserServiceMapImpl.java b/spark-java/src/main/java/com/baeldung/sparkjava/UserServiceMapImpl.java new file mode 100644 index 0000000000..0b5072647f --- /dev/null +++ b/spark-java/src/main/java/com/baeldung/sparkjava/UserServiceMapImpl.java @@ -0,0 +1,68 @@ +package com.baeldung.sparkjava; + +import java.util.Collection; +import java.util.HashMap; + +public class UserServiceMapImpl implements UserService{ + private HashMap userMap; + + public UserServiceMapImpl() { + userMap = new HashMap<>(); + } + + @Override + public void addUser (User user) { + userMap.put(user.getId(), user); + } + + @Override + public Collection getUsers () { + return userMap.values(); + } + + @Override + public User getUser (String id) { + return userMap.get(id); + } + + @Override + public User editUser (User forEdit) throws UserException{ + try{ + if (forEdit.getId() == null) + throw new UserException("ID cannot be blank"); + + User toEdit = userMap.get(forEdit.getId()); + + if (toEdit == null ) + throw new UserException("User not found"); + + if (forEdit.getEmail()!=null) { + toEdit.setEmail(forEdit.getEmail()); + } + if (forEdit.getFirstName()!=null) { + toEdit.setFirstName(forEdit.getFirstName()); + } + if (forEdit.getLastName()!=null) { + toEdit.setLastName(forEdit.getLastName()); + } + if (forEdit.getId()!=null) { + toEdit.setId(forEdit.getId()); + } + + return toEdit; + }catch (Exception ex) { + throw new UserException(ex.getMessage()); + } + } + + @Override + public void deleteUser (String id) { + userMap.remove(id); + } + + @Override + public boolean userExist (String id) { + return userMap.containsKey(id); + } + +}