From 24c25206a4d8b748e727f0cc9db5d64d456017e8 Mon Sep 17 00:00:00 2001 From: oreva Date: Thu, 28 Jul 2016 18:41:17 +0300 Subject: [PATCH 001/115] Spring MVC Email application added. --- spring-mvc-email/pom.xml | 142 ++++++++++++++++++ .../com/baeldung/spring/config/AppConfig.java | 100 ++++++++++++ .../spring/controllers/HomeController.java | 19 +++ .../spring/controllers/MailController.java | 44 ++++++ .../com/baeldung/spring/mail/Application.java | 20 +++ .../com/baeldung/spring/mail/MailService.java | 73 +++++++++ .../baeldung/spring/web/dto/MailObject.java | 50 ++++++ .../main/resources/META-INF/application.xml | 19 +++ .../src/main/webapp/WEB-INF/views/home.jsp | 25 +++ .../main/webapp/WEB-INF/views/mail/send.jsp | 60 ++++++++ .../src/main/webapp/WEB-INF/web.xml | 28 ++++ 11 files changed, 580 insertions(+) create mode 100644 spring-mvc-email/pom.xml create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/MailService.java create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java create mode 100644 spring-mvc-email/src/main/resources/META-INF/application.xml create mode 100644 spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp create mode 100644 spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp create mode 100644 spring-mvc-email/src/main/webapp/WEB-INF/web.xml diff --git a/spring-mvc-email/pom.xml b/spring-mvc-email/pom.xml new file mode 100644 index 0000000000..0ac84f5cc9 --- /dev/null +++ b/spring-mvc-email/pom.xml @@ -0,0 +1,142 @@ + + + 4.0.0 + + org.baeldung.spring + SpringMVCEmail + war + 1.0 + + + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + + javax.servlet + jstl + 1.2 + + + + + org.springframework + spring-context + 4.2.5.RELEASE + + + + org.springframework + spring-core + 4.2.5.RELEASE + + + + org.springframework + spring-web + 4.2.5.RELEASE + + + + org.springframework + spring-webmvc + 4.2.5.RELEASE + + + + + javax.validation + validation-api + 1.1.0.Final + + + + + org.hibernate + hibernate-validator + 5.0.1.Final + + + + + org.springframework.data + spring-data-jpa + 1.10.1.RELEASE + + + + + org.springframework.security + spring-security-web + 4.0.4.RELEASE + + + org.springframework.security + spring-security-config + 4.0.4.RELEASE + + + + + com.sun.mail + javax.mail + 1.5.5 + + + + + org.springframework.integration + spring-integration-mail + 4.3.0.RELEASE + + + + + SpringMVCEmail + + + + + org.apache.tomcat.maven + tomcat6-maven-plugin + 2.2 + + http://localhost:8080/manager/text + TomcatServer + /SpringMVCEmail + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.7 + 1.7 + + + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + src/main/webapp/WEB-INF/web.xml + + + src/main/resources/META-INF + + + + + + + \ No newline at end of file diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java b/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java new file mode 100644 index 0000000000..2a7caadf23 --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java @@ -0,0 +1,100 @@ +package com.baeldung.spring.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; +import org.springframework.web.servlet.view.UrlBasedViewResolver; + +import java.util.Properties; + +/** + * Created with IntelliJ IDEA. + * User: Olga + */ +@Configuration +@ComponentScan("com.baeldung.spring") +@EnableWebMvc //tha same as +public class AppConfig extends WebMvcConfigurerAdapter { + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); + } + + @Bean + public UrlBasedViewResolver urlBasedViewResolver() { + UrlBasedViewResolver resolver = new UrlBasedViewResolver(); + resolver.setOrder(0); + resolver.setPrefix("/WEB-INF/views/"); + resolver.setSuffix(".jsp"); + resolver.setCache(false); + resolver.setViewClass(JstlView.class); + return resolver; + } + + @Bean + public InternalResourceViewResolver internalResourceViewResolver() { + InternalResourceViewResolver resolver = new InternalResourceViewResolver(); + resolver.setOrder(1); + resolver.setPrefix("/WEB-INF/views/"); + resolver.setSuffix(".jsp"); + resolver.setViewClass(JstlView.class); + return resolver; + } + + /* Gmail */ + @Bean + public JavaMailSenderImpl mailSender() { + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + mailSender.setHost("smtp.gmail.com"); + mailSender.setPort(587); + mailSender.setUsername("reva.olga"); + mailSender.setPassword("zakpnejnnoqkehgs"); + mailSender.setJavaMailProperties(javaMailProperties()); + return mailSender; + } + + private Properties javaMailProperties() { + Properties props = new Properties(); + props.setProperty("mail.smtp.auth", "true"); + props.setProperty("mail.smtp.starttls.enable", "true"); + return props; + } + + @Bean + public SimpleMailMessage templateMessage() { + SimpleMailMessage message = new SimpleMailMessage(); + message.setText("This is automatically generated email,\n" + + "Original mail text is included : %s\n" + + "\n" + + "Sincerely yours,\n" + + "Yourcompany."); + return message; + } + + /*Amazon SES + @Bean + public JavaMailSenderImpl mailSender() { + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + mailSender.setHost("email-smtp.us-west-2.amazonaws.com"); + mailSender.setUsername("username"); + mailSender.setPassword("password"); + mailSender.setJavaMailProperties(javaMailProperties()); + return mailSender; + } + + private Properties javaMailProperties() { + Properties props = new Properties(); + props.setProperty("mail.transport.protocol", "smtps"); + props.setProperty("mail.smtp.port", "25"); + + props.put("mail.smtp.auth", "true"); + props.put("mail.smtp.starttls.enable", "true"); + props.put("mail.smtp.starttls.required", "true"); + return props; + }*/ +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java new file mode 100644 index 0000000000..656e237a9e --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.controllers; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +/** + * Created with IntelliJ IDEA. + * User: Olga + */ +@Controller +@RequestMapping({"/","/home"}) +public class HomeController { + + @RequestMapping(method = RequestMethod.GET) + public String showHomePage() { + return "home"; + } +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java new file mode 100644 index 0000000000..5de722f444 --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java @@ -0,0 +1,44 @@ +package com.baeldung.spring.controllers; + +import com.baeldung.spring.mail.MailService; +import com.baeldung.spring.web.dto.MailObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.Errors; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.validation.Valid; + +/** + * Created by Olga on 7/20/2016. + */ +@Controller +@RequestMapping("/mail") +public class MailController { + @Autowired + public MailService mailService; + + @RequestMapping(value = "/send", method = RequestMethod.GET) + public String createMail(Model model) { + model.addAttribute("mailObject", new MailObject()); + return "mail/send"; + } + + @RequestMapping(value = "/send", method = RequestMethod.POST) + public String createMail(Model model, + @ModelAttribute("mailObject") @Valid MailObject mailObject, + Errors errors) { + if(errors.hasErrors()) { + return "mail/send"; + } + + SimpleMailMessage mailMessage = mailService.createSimpleMailMessage(mailObject); + mailService.sendMail(mailMessage); + + return "redirect:/home"; + } +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java new file mode 100644 index 0000000000..68f89f778d --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.mail; + +import org.springframework.mail.SimpleMailMessage; + +/** + * Created by Olga on 7/15/2016. + */ +public class Application { + + public static void main(String ...args) { + MailService mailService = new MailService(); + + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom("from@test.com"); + message.setTo("to@test.com"); + message.setSubject("Test Message"); + + mailService.sendMail(message); + } +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/MailService.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/MailService.java new file mode 100644 index 0000000000..4deab12e0a --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/MailService.java @@ -0,0 +1,73 @@ +package com.baeldung.spring.mail; + +import com.baeldung.spring.web.dto.MailObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileSystemResource; +import org.springframework.mail.MailException; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.File; + +/** + * Created by Olga on 7/15/2016. + */ +@Service +public class MailService { + @Autowired + public JavaMailSender mailSender; + + public void sendMail(MimeMessage message) { + try { + mailSender.send(message); + } catch (MailException exception) { + exception.printStackTrace(); + } + } + + public MimeMessage createMessageWithAttachment(MailObject mailObject) { + MimeMessage message = mailSender.createMimeMessage(); + try { + // pass 'true' to the constructor to create a multipart message + MimeMessageHelper helper = new MimeMessageHelper(message, true); + + helper.setFrom(mailObject.getFrom()); + helper.setTo(mailObject.getTo()); + helper.setSubject(mailObject.getSubject()); + helper.setText(mailObject.getText()); + + // attach a sample image attachment + FileSystemResource file = new FileSystemResource(new File("c:/attachment.jpg")); + helper.addAttachment("Attachment.jpg", file); + } catch (MessagingException e) { + e.printStackTrace(); + } + return message; + } + + public void sendMail(SimpleMailMessage message) { + try { + mailSender.send(message); + } catch (MailException exception) { + exception.printStackTrace(); + } + } + + @Autowired + public SimpleMailMessage template; + + public SimpleMailMessage createSimpleMailMessage(MailObject mailObject) { + SimpleMailMessage mailMessage = new SimpleMailMessage(template); + + mailMessage.setFrom(mailObject.getFrom()); + mailMessage.setTo(mailObject.getTo()); + mailMessage.setSubject(mailObject.getSubject()); + mailMessage.setText(String.format(template.getText(), mailObject.getText())); + + return mailMessage; + } +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java b/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java new file mode 100644 index 0000000000..70975be84c --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java @@ -0,0 +1,50 @@ +package com.baeldung.spring.web.dto; + +import org.hibernate.validator.constraints.Email; + +import javax.validation.constraints.NotNull; + +/** + * Created by Olga on 7/20/2016. + */ +public class MailObject { + @Email + private String from; + @NotNull + @Email + private String to; + private String subject; + private String text; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } +} diff --git a/spring-mvc-email/src/main/resources/META-INF/application.xml b/spring-mvc-email/src/main/resources/META-INF/application.xml new file mode 100644 index 0000000000..f2d901b497 --- /dev/null +++ b/spring-mvc-email/src/main/resources/META-INF/application.xml @@ -0,0 +1,19 @@ + + + + + + SpringMVCEmail.war + SpringMVCEmail + + + + + web.war + SpringMVCEmail + + + \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp b/spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp new file mode 100644 index 0000000000..74165f2626 --- /dev/null +++ b/spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp @@ -0,0 +1,25 @@ +<%-- + Created by IntelliJ IDEA. + User: Olga + Date: 1/19/16 + Time: 3:53 PM + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + Home Page + + +
+
+

Send Email

+
+ +
+
+
+ + \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp new file mode 100644 index 0000000000..9e9cbc1ff7 --- /dev/null +++ b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp @@ -0,0 +1,60 @@ +<%-- + Created by IntelliJ IDEA. + User: Olga + Date: 7/20/2016 + Time: 1:47 PM + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + Send Email + + +
+

Create Email

+ +
+ + + + + + + + + + + + + + + + + + + + +
+ Enter email address
+ +
+ Enter your email address
+ +
+ Enter the subject
+ +
+ Enter message text
+ +
+ Send +
+
+
+
+ + diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/web.xml b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..5fe46d45d6 --- /dev/null +++ b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,28 @@ + + + + + simpleweb + org.springframework.web.servlet.DispatcherServlet + + contextClass + + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + + contextConfigLocation + com.baeldung.spring.config.AppConfig + + 1 + + + + simpleweb + / + + From 2bef18b3db5c1362f5ac7f9a3574762cba9c13ca Mon Sep 17 00:00:00 2001 From: oreva Date: Thu, 28 Jul 2016 21:56:36 +0300 Subject: [PATCH 002/115] Validation for empty "to" and "from" fields added. --- .../main/java/com/baeldung/spring/web/dto/MailObject.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java b/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java index 70975be84c..3369ccd9f6 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java @@ -3,15 +3,19 @@ package com.baeldung.spring.web.dto; import org.hibernate.validator.constraints.Email; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; /** * Created by Olga on 7/20/2016. */ public class MailObject { @Email - private String from; @NotNull + @Size(min = 1, message = "Please, specify your email address") + private String from; @Email + @NotNull + @Size(min = 1, message = "Please, set an email address to send the message to it") private String to; private String subject; private String text; From 8c21d6a3b090cc9c89ee034e8b1fccb22bd742d0 Mon Sep 17 00:00:00 2001 From: oreva Date: Thu, 28 Jul 2016 21:57:56 +0300 Subject: [PATCH 003/115] My personal username and pwd removed, test strings added instead. --- .../src/main/java/com/baeldung/spring/config/AppConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java b/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java index 2a7caadf23..4c5286490b 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java @@ -52,8 +52,8 @@ public class AppConfig extends WebMvcConfigurerAdapter { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.gmail.com"); mailSender.setPort(587); - mailSender.setUsername("reva.olga"); - mailSender.setPassword("zakpnejnnoqkehgs"); + mailSender.setUsername("username"); + mailSender.setPassword("password"); mailSender.setJavaMailProperties(javaMailProperties()); return mailSender; } From 468ccfc2168c004c9e9a5458ea353df7b487ab00 Mon Sep 17 00:00:00 2001 From: oreva Date: Thu, 18 Aug 2016 22:33:41 +0300 Subject: [PATCH 004/115] Spring-boot-starter-mail added. Don't work (JavaMailSender is not created automatically). --- spring-mvc-email/pom.xml | 160 +++++++----------- spring-mvc-email/pom_old.xml | 142 ++++++++++++++++ .../java/com/baeldung/spring/Application.java | 35 ++++ .../spring/{ => app}/config/AppConfig.java | 17 +- .../baeldung/spring/application.properties | 4 + .../spring/controllers/HomeController.java | 8 +- .../spring/controllers/MailController.java | 16 +- .../com/baeldung/spring/mail/Application.java | 20 --- ...MailService.java => EmailServiceImpl.java} | 26 +-- .../main/resources/META-INF/application.xml | 2 +- .../main/webapp/WEB-INF/simpleweb-servlet.xml | 23 +++ .../src/main/webapp/WEB-INF/web.xml | 19 ++- 12 files changed, 307 insertions(+), 165 deletions(-) create mode 100644 spring-mvc-email/pom_old.xml create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/Application.java rename spring-mvc-email/src/main/java/com/baeldung/spring/{ => app}/config/AppConfig.java (89%) create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/application.properties delete mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java rename spring-mvc-email/src/main/java/com/baeldung/spring/mail/{MailService.java => EmailServiceImpl.java} (81%) create mode 100644 spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml diff --git a/spring-mvc-email/pom.xml b/spring-mvc-email/pom.xml index 0ac84f5cc9..6b2ef0bf9b 100644 --- a/spring-mvc-email/pom.xml +++ b/spring-mvc-email/pom.xml @@ -1,142 +1,96 @@ - 4.0.0 org.baeldung.spring SpringMVCEmail + 1.0-SNAPSHOT war - 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 1.4.0.RELEASE + + - - javax.servlet - javax.servlet-api - 3.0.1 + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-mail + 1.4.0.RELEASE + + + org.springframework.boot + spring-boot-starter-tomcat provided - - - javax.servlet - jstl - 1.2 + + com.jayway.jsonpath + json-path + test + --> + + + - - javax.validation - validation-api - 1.1.0.Final - - - - - org.hibernate - hibernate-validator - 5.0.1.Final - - - - - org.springframework.data - spring-data-jpa - 1.10.1.RELEASE - - - - - org.springframework.security - spring-security-web - 4.0.4.RELEASE - - - org.springframework.security - spring-security-config - 4.0.4.RELEASE - - - - - com.sun.mail - javax.mail - 1.5.5 - - - - - org.springframework.integration - spring-integration-mail - 4.3.0.RELEASE - + 4.3.2.RELEASE + --> + + 1.8 + + + - SpringMVCEmail - - - org.apache.tomcat.maven - tomcat6-maven-plugin - 2.2 - - http://localhost:8080/manager/text - TomcatServer - /SpringMVCEmail - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.7 - 1.7 - - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - src/main/webapp/WEB-INF/web.xml - - - src/main/resources/META-INF - - - + org.springframework.boot + spring-boot-maven-plugin - \ No newline at end of file + + + + spring-releases + https://repo.spring.io/libs-release + + + + + spring-releases + https://repo.spring.io/libs-release + + + diff --git a/spring-mvc-email/pom_old.xml b/spring-mvc-email/pom_old.xml new file mode 100644 index 0000000000..0ac84f5cc9 --- /dev/null +++ b/spring-mvc-email/pom_old.xml @@ -0,0 +1,142 @@ + + + 4.0.0 + + org.baeldung.spring + SpringMVCEmail + war + 1.0 + + + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + + javax.servlet + jstl + 1.2 + + + + + org.springframework + spring-context + 4.2.5.RELEASE + + + + org.springframework + spring-core + 4.2.5.RELEASE + + + + org.springframework + spring-web + 4.2.5.RELEASE + + + + org.springframework + spring-webmvc + 4.2.5.RELEASE + + + + + javax.validation + validation-api + 1.1.0.Final + + + + + org.hibernate + hibernate-validator + 5.0.1.Final + + + + + org.springframework.data + spring-data-jpa + 1.10.1.RELEASE + + + + + org.springframework.security + spring-security-web + 4.0.4.RELEASE + + + org.springframework.security + spring-security-config + 4.0.4.RELEASE + + + + + com.sun.mail + javax.mail + 1.5.5 + + + + + org.springframework.integration + spring-integration-mail + 4.3.0.RELEASE + + + + + SpringMVCEmail + + + + + org.apache.tomcat.maven + tomcat6-maven-plugin + 2.2 + + http://localhost:8080/manager/text + TomcatServer + /SpringMVCEmail + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.7 + 1.7 + + + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + src/main/webapp/WEB-INF/web.xml + + + src/main/resources/META-INF + + + + + + + \ No newline at end of file diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java new file mode 100644 index 0000000000..0ab568e111 --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java @@ -0,0 +1,35 @@ +package com.baeldung.spring; + +import com.baeldung.spring.mail.EmailServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.mail.SimpleMailMessage; + +import javax.annotation.PostConstruct; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + + } + + @Autowired + public EmailServiceImpl emailService; + + @PostConstruct + public void postConstruct() { + sendSimpleEmail(); + } + + private void sendSimpleEmail() { + + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom("from@test.com"); + message.setTo("to@test.com"); + message.setSubject("Test Message"); + + emailService.sendMail(message); + } +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java similarity index 89% rename from spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java rename to spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java index 4c5286490b..4dcf9c1b7d 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/config/AppConfig.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java @@ -1,24 +1,19 @@ -package com.baeldung.spring.config; +package com.baeldung.spring.app.config; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; import org.springframework.mail.SimpleMailMessage; -import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.UrlBasedViewResolver; -import java.util.Properties; - /** * Created with IntelliJ IDEA. * User: Olga */ -@Configuration -@ComponentScan("com.baeldung.spring") -@EnableWebMvc //tha same as +//@Configuration +//@ComponentScan("com.baeldung.spring") +//@EnableWebMvc //tha same as public class AppConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { @@ -47,7 +42,7 @@ public class AppConfig extends WebMvcConfigurerAdapter { } /* Gmail */ - @Bean + /*@Bean public JavaMailSenderImpl mailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.gmail.com"); @@ -63,7 +58,7 @@ public class AppConfig extends WebMvcConfigurerAdapter { props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.starttls.enable", "true"); return props; - } + }*/ @Bean public SimpleMailMessage templateMessage() { diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/application.properties b/spring-mvc-email/src/main/java/com/baeldung/spring/application.properties new file mode 100644 index 0000000000..573f901152 --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/application.properties @@ -0,0 +1,4 @@ +spring.mail.host=smtp.gmail.com +spring.mail.port=25 +spring.mail.username=test +spring.mail.password=test \ No newline at end of file diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java index 656e237a9e..234593f02e 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java @@ -3,17 +3,19 @@ package com.baeldung.spring.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; /** * Created with IntelliJ IDEA. * User: Olga */ -@Controller +@RestController @RequestMapping({"/","/home"}) public class HomeController { @RequestMapping(method = RequestMethod.GET) - public String showHomePage() { - return "home"; + public ModelAndView showHomePage() { + return new ModelAndView("home"); } } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java index 5de722f444..90f628f586 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java @@ -1,17 +1,7 @@ package com.baeldung.spring.controllers; -import com.baeldung.spring.mail.MailService; -import com.baeldung.spring.web.dto.MailObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.validation.Errors; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -import javax.validation.Valid; /** * Created by Olga on 7/20/2016. @@ -19,8 +9,8 @@ import javax.validation.Valid; @Controller @RequestMapping("/mail") public class MailController { - @Autowired - public MailService mailService; + /*@Autowired + public EMailService mailService; @RequestMapping(value = "/send", method = RequestMethod.GET) public String createMail(Model model) { @@ -40,5 +30,5 @@ public class MailController { mailService.sendMail(mailMessage); return "redirect:/home"; - } + }*/ } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java deleted file mode 100644 index 68f89f778d..0000000000 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Application.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.spring.mail; - -import org.springframework.mail.SimpleMailMessage; - -/** - * Created by Olga on 7/15/2016. - */ -public class Application { - - public static void main(String ...args) { - MailService mailService = new MailService(); - - SimpleMailMessage message = new SimpleMailMessage(); - message.setFrom("from@test.com"); - message.setTo("to@test.com"); - message.setSubject("Test Message"); - - mailService.sendMail(message); - } -} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/MailService.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java similarity index 81% rename from spring-mvc-email/src/main/java/com/baeldung/spring/mail/MailService.java rename to spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java index 4deab12e0a..bba646afcc 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/MailService.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java @@ -2,11 +2,13 @@ package com.baeldung.spring.mail; import com.baeldung.spring.web.dto.MailObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.MailException; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.mail.MessagingException; @@ -16,21 +18,23 @@ import java.io.File; /** * Created by Olga on 7/15/2016. */ -@Service -public class MailService { - @Autowired - public JavaMailSender mailSender; +@Component +@ConditionalOnClass(JavaMailSender.class) +public class EmailServiceImpl { - public void sendMail(MimeMessage message) { + @Autowired + public JavaMailSender emailSender; + + /*public void sendMail(MimeMessage message) { try { - mailSender.send(message); + emailSender.send(message); } catch (MailException exception) { exception.printStackTrace(); } } public MimeMessage createMessageWithAttachment(MailObject mailObject) { - MimeMessage message = mailSender.createMimeMessage(); + MimeMessage message = emailSender.createMimeMessage(); try { // pass 'true' to the constructor to create a multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); @@ -47,17 +51,17 @@ public class MailService { e.printStackTrace(); } return message; - } + }*/ public void sendMail(SimpleMailMessage message) { try { - mailSender.send(message); + emailSender.send(message); } catch (MailException exception) { exception.printStackTrace(); } } - @Autowired + /*@Autowired public SimpleMailMessage template; public SimpleMailMessage createSimpleMailMessage(MailObject mailObject) { @@ -69,5 +73,5 @@ public class MailService { mailMessage.setText(String.format(template.getText(), mailObject.getText())); return mailMessage; - } + }*/ } diff --git a/spring-mvc-email/src/main/resources/META-INF/application.xml b/spring-mvc-email/src/main/resources/META-INF/application.xml index f2d901b497..759a312bd4 100644 --- a/spring-mvc-email/src/main/resources/META-INF/application.xml +++ b/spring-mvc-email/src/main/resources/META-INF/application.xml @@ -13,7 +13,7 @@ web.war - SpringMVCEmail + SpringMVCEmailWeb \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml b/spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml new file mode 100644 index 0000000000..5a3bb2377a --- /dev/null +++ b/spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/web.xml b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml index 5fe46d45d6..b979e00276 100644 --- a/spring-mvc-email/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml @@ -8,7 +8,7 @@ simpleweb org.springframework.web.servlet.DispatcherServlet - + 1 @@ -25,4 +25,17 @@ simpleweb / + + + + org.springframework.web.context.ContextLoaderListener + + + + + contextConfigLocation + + /WEB-INF/simpleweb-servlet.xml + + From faf368d10c4ac7d086eb7f2b9d1a02226fa7ea5d Mon Sep 17 00:00:00 2001 From: oreva Date: Mon, 22 Aug 2016 23:58:18 +0300 Subject: [PATCH 005/115] Spring-boot-starter-mail provided succsessfully. --- spring-mvc-email/pom.xml | 59 +++---------------- .../java/com/baeldung/spring/Application.java | 25 ++++---- .../baeldung/spring/app/config/AppConfig.java | 29 ++++----- .../baeldung/spring/application.properties | 4 -- .../spring/controllers/HomeController.java | 6 +- .../spring/controllers/MailController.java | 23 +++++--- .../baeldung/spring/mail/EmailService.java | 20 +++++++ .../spring/mail/EmailServiceImpl.java | 57 ++++++++++++++---- .../java/com/baeldung/spring/mail/Order.java | 43 ++++++++++++++ .../baeldung/spring/mail/OrderManager.java | 29 +++++++++ .../src/main/resources/application.properties | 20 +++++++ .../src/main/webapp/WEB-INF/web.xml | 8 +-- 12 files changed, 216 insertions(+), 107 deletions(-) delete mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/application.properties create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailService.java create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java create mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java create mode 100644 spring-mvc-email/src/main/resources/application.properties diff --git a/spring-mvc-email/pom.xml b/spring-mvc-email/pom.xml index 6b2ef0bf9b..0d3acec1fe 100644 --- a/spring-mvc-email/pom.xml +++ b/spring-mvc-email/pom.xml @@ -5,7 +5,7 @@ org.baeldung.spring SpringMVCEmail - 1.0-SNAPSHOT + 1.0 war @@ -20,51 +20,23 @@ org.springframework.boot spring-boot-starter-web + org.springframework.boot spring-boot-starter-mail 1.4.0.RELEASE + - org.springframework.boot - spring-boot-starter-tomcat - provided - - - - - @@ -80,17 +52,4 @@ - - - - spring-releases - https://repo.spring.io/libs-release - - - - - spring-releases - https://repo.spring.io/libs-release - - diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java index 0ab568e111..769658fdde 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java @@ -1,9 +1,14 @@ package com.baeldung.spring; +import com.baeldung.spring.mail.EmailService; import com.baeldung.spring.mail.EmailServiceImpl; +import com.baeldung.spring.mail.Order; +import com.baeldung.spring.mail.OrderManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ImportResource; import org.springframework.mail.SimpleMailMessage; import javax.annotation.PostConstruct; @@ -12,24 +17,18 @@ import javax.annotation.PostConstruct; public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); - } @Autowired - public EmailServiceImpl emailService; + public EmailService emailService; + + @Autowired + public OrderManager orderManager; @PostConstruct public void postConstruct() { - sendSimpleEmail(); - } - - private void sendSimpleEmail() { - - SimpleMailMessage message = new SimpleMailMessage(); - message.setFrom("from@test.com"); - message.setTo("to@test.com"); - message.setSubject("Test Message"); - - emailService.sendMail(message); + //emailService.sendSimpleMessage("to@gmail.com", "Test Subject", "Test Message"); + Order order = new Order("reva.olga@gmail.com", "First Name", "Last Name"); + orderManager.placeOrder(order); } } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java index 4dcf9c1b7d..0c1662a36c 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java @@ -1,6 +1,8 @@ package com.baeldung.spring.app.config; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; import org.springframework.mail.SimpleMailMessage; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; @@ -11,9 +13,9 @@ import org.springframework.web.servlet.view.UrlBasedViewResolver; * Created with IntelliJ IDEA. * User: Olga */ -//@Configuration -//@ComponentScan("com.baeldung.spring") -//@EnableWebMvc //tha same as +@Configuration +@ComponentScan("com.baeldung.spring") +@EnableWebMvc //tha same as public class AppConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { @@ -41,6 +43,16 @@ public class AppConfig extends WebMvcConfigurerAdapter { return resolver; } + @Bean + public SimpleMailMessage templateMessage() { + SimpleMailMessage message = new SimpleMailMessage(); + message.setText("Dear %s %s, \nthank you for placing order.\n" + + "\n" + + "Sincerely yours,\n" + + "Yourcompany."); + return message; + } + /* Gmail */ /*@Bean public JavaMailSenderImpl mailSender() { @@ -60,17 +72,6 @@ public class AppConfig extends WebMvcConfigurerAdapter { return props; }*/ - @Bean - public SimpleMailMessage templateMessage() { - SimpleMailMessage message = new SimpleMailMessage(); - message.setText("This is automatically generated email,\n" + - "Original mail text is included : %s\n" + - "\n" + - "Sincerely yours,\n" + - "Yourcompany."); - return message; - } - /*Amazon SES @Bean public JavaMailSenderImpl mailSender() { diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/application.properties b/spring-mvc-email/src/main/java/com/baeldung/spring/application.properties deleted file mode 100644 index 573f901152..0000000000 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.mail.host=smtp.gmail.com -spring.mail.port=25 -spring.mail.username=test -spring.mail.password=test \ No newline at end of file diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java index 234593f02e..50643684d1 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java @@ -10,12 +10,12 @@ import org.springframework.web.servlet.ModelAndView; * Created with IntelliJ IDEA. * User: Olga */ -@RestController +@Controller @RequestMapping({"/","/home"}) public class HomeController { @RequestMapping(method = RequestMethod.GET) - public ModelAndView showHomePage() { - return new ModelAndView("home"); + public String showHomePage() { + return "home"; } } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java index 90f628f586..79152797ff 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java @@ -1,7 +1,17 @@ package com.baeldung.spring.controllers; +import com.baeldung.spring.mail.EmailServiceImpl; +import com.baeldung.spring.web.dto.MailObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.Errors; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.validation.Valid; /** * Created by Olga on 7/20/2016. @@ -9,8 +19,8 @@ import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/mail") public class MailController { - /*@Autowired - public EMailService mailService; + @Autowired + public EmailServiceImpl emailService; @RequestMapping(value = "/send", method = RequestMethod.GET) public String createMail(Model model) { @@ -22,13 +32,8 @@ public class MailController { public String createMail(Model model, @ModelAttribute("mailObject") @Valid MailObject mailObject, Errors errors) { - if(errors.hasErrors()) { - return "mail/send"; - } - - SimpleMailMessage mailMessage = mailService.createSimpleMailMessage(mailObject); - mailService.sendMail(mailMessage); + emailService.sendSimpleMessage("to@gmail.com", "Test Subject", "Test Message"); return "redirect:/home"; - }*/ + } } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailService.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailService.java new file mode 100644 index 0000000000..43d7378227 --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailService.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.mail; + +import org.springframework.mail.SimpleMailMessage; + +/** + * Created by Olga on 8/22/2016. + */ +public interface EmailService { + void sendSimpleMessage(String to, + String subject, + String text); + void sendSimpleMessageUsingTemplate(String to, + String subject, + SimpleMailMessage template, + String ...templateArgs); + void sendMessageWithAttachment(String to, + String subject, + String text, + String pathToAttachment); +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java index bba646afcc..a6bcb00943 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java @@ -19,12 +19,57 @@ import java.io.File; * Created by Olga on 7/15/2016. */ @Component -@ConditionalOnClass(JavaMailSender.class) -public class EmailServiceImpl { +public class EmailServiceImpl implements EmailService { @Autowired public JavaMailSender emailSender; + public void sendSimpleMessage(String to, String subject, String text) { + try { + SimpleMailMessage message = new SimpleMailMessage(); + + message.setTo(to); + message.setSubject(subject); + message.setText(text); + + emailSender.send(message); + } catch (MailException exception) { + exception.printStackTrace(); + } + } + + @Override + public void sendSimpleMessageUsingTemplate(String to, + String subject, + SimpleMailMessage template, + String ...templateArgs) { + String text = String.format(template.getText(), templateArgs); + sendSimpleMessage(to, subject, text); + } + + @Override + public void sendMessageWithAttachment(String to, + String subject, + String text, + String pathToAttachment) { + try { + MimeMessage message = emailSender.createMimeMessage(); + // pass 'true' to the constructor to create a multipart message + MimeMessageHelper helper = new MimeMessageHelper(message, true); + + helper.setTo(to); + helper.setSubject(subject); + helper.setText(text); + + FileSystemResource file = new FileSystemResource(new File(pathToAttachment)); + helper.addAttachment("Invoice", file); + + emailSender.send(message); + } catch (MessagingException e) { + e.printStackTrace(); + } + } + /*public void sendMail(MimeMessage message) { try { emailSender.send(message); @@ -53,14 +98,6 @@ public class EmailServiceImpl { return message; }*/ - public void sendMail(SimpleMailMessage message) { - try { - emailSender.send(message); - } catch (MailException exception) { - exception.printStackTrace(); - } - } - /*@Autowired public SimpleMailMessage template; diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java new file mode 100644 index 0000000000..cd1448b84b --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java @@ -0,0 +1,43 @@ +package com.baeldung.spring.mail; + +/** + * Created by Olga on 8/22/2016. + */ +public class Order { + + public Order(String customerEmail, + String customerFirstName, + String customerLastName) { + this.customerEmail = customerEmail; + this.customerFirstName = customerFirstName; + this.customerLastName = customerLastName; + } + + private String customerEmail; + private String customerFirstName; + private String customerLastName; + + public String getCustomerEmail() { + return customerEmail; + } + + public void setCustomerEmail(String customerEmail) { + this.customerEmail = customerEmail; + } + + public String getCustomerFirstName() { + return customerFirstName; + } + + public void setCustomerFirstName(String customerFirstName) { + this.customerFirstName = customerFirstName; + } + + public String getCustomerLastName() { + return customerLastName; + } + + public void setCustomerLastName(String customerLastName) { + this.customerLastName = customerLastName; + } +} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java new file mode 100644 index 0000000000..23f6184c8a --- /dev/null +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.mail; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.stereotype.Component; + +/** + * Created by Olga on 8/22/2016. + */ +@Component +public class OrderManager { + @Autowired + public EmailService emailService; + + @Value("${attachment.invoice}") + private String invoiceAttachmentPath; + + @Autowired + public SimpleMailMessage template; + + public void placeOrder(Order order) { + emailService.sendSimpleMessageUsingTemplate(order.getCustomerEmail(), + "Order Confirmation", + template, + order.getCustomerFirstName(), + order.getCustomerLastName()); + } +} diff --git a/spring-mvc-email/src/main/resources/application.properties b/spring-mvc-email/src/main/resources/application.properties new file mode 100644 index 0000000000..07ded8f46b --- /dev/null +++ b/spring-mvc-email/src/main/resources/application.properties @@ -0,0 +1,20 @@ +# Gmail SMTP +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=reva.olga@gmail.com +spring.mail.password=yubtqniqehrimqyf +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true + +# Amazon SES SMTP +#spring.mail.host=email-smtp.us-west-2.amazonaws.com +#spring.mail.username=username +#spring.mail.password=password +#spring.mail.properties.mail.transport.protocol=smtp +#spring.mail.properties.mail.smtp.port=25 +#spring.mail.properties.mail.smtp.auth=true +#spring.mail.properties.mail.smtp.starttls.enable=true +#spring.mail.properties.mail.smtp.starttls.required=true + +# path to attachment file +attachment.invoice=c:/invoice.jpg \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/web.xml b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml index b979e00276..cbc1bee20a 100644 --- a/spring-mvc-email/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml @@ -8,7 +8,7 @@ simpleweb org.springframework.web.servlet.DispatcherServlet - + 1 @@ -26,7 +26,7 @@ / - + From 31bac637ac766856ca22b09ea21c9c6cdb9a638c Mon Sep 17 00:00:00 2001 From: oreva Date: Tue, 23 Aug 2016 00:04:26 +0300 Subject: [PATCH 006/115] Changed application.properties on defaults for username and pwd. --- spring-mvc-email/src/main/resources/application.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-mvc-email/src/main/resources/application.properties b/spring-mvc-email/src/main/resources/application.properties index 07ded8f46b..61a42050e5 100644 --- a/spring-mvc-email/src/main/resources/application.properties +++ b/spring-mvc-email/src/main/resources/application.properties @@ -1,8 +1,8 @@ # Gmail SMTP spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username=reva.olga@gmail.com -spring.mail.password=yubtqniqehrimqyf +spring.mail.username=username +spring.mail.password=password spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true @@ -17,4 +17,4 @@ spring.mail.properties.mail.smtp.starttls.enable=true #spring.mail.properties.mail.smtp.starttls.required=true # path to attachment file -attachment.invoice=c:/invoice.jpg \ No newline at end of file +attachment.invoice=path_to_file \ No newline at end of file From 6a599b94068a8dfb33bb8afca2367f9f3a09ce67 Mon Sep 17 00:00:00 2001 From: oreva Date: Mon, 29 Aug 2016 11:49:29 +0300 Subject: [PATCH 007/115] pom_old.xml deleted. --- spring-mvc-email/pom_old.xml | 142 ----------------------------------- 1 file changed, 142 deletions(-) delete mode 100644 spring-mvc-email/pom_old.xml diff --git a/spring-mvc-email/pom_old.xml b/spring-mvc-email/pom_old.xml deleted file mode 100644 index 0ac84f5cc9..0000000000 --- a/spring-mvc-email/pom_old.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - 4.0.0 - - org.baeldung.spring - SpringMVCEmail - war - 1.0 - - - - - javax.servlet - javax.servlet-api - 3.0.1 - provided - - - - javax.servlet - jstl - 1.2 - - - - - org.springframework - spring-context - 4.2.5.RELEASE - - - - org.springframework - spring-core - 4.2.5.RELEASE - - - - org.springframework - spring-web - 4.2.5.RELEASE - - - - org.springframework - spring-webmvc - 4.2.5.RELEASE - - - - - javax.validation - validation-api - 1.1.0.Final - - - - - org.hibernate - hibernate-validator - 5.0.1.Final - - - - - org.springframework.data - spring-data-jpa - 1.10.1.RELEASE - - - - - org.springframework.security - spring-security-web - 4.0.4.RELEASE - - - org.springframework.security - spring-security-config - 4.0.4.RELEASE - - - - - com.sun.mail - javax.mail - 1.5.5 - - - - - org.springframework.integration - spring-integration-mail - 4.3.0.RELEASE - - - - - SpringMVCEmail - - - - - org.apache.tomcat.maven - tomcat6-maven-plugin - 2.2 - - http://localhost:8080/manager/text - TomcatServer - /SpringMVCEmail - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.7 - 1.7 - - - - - org.apache.maven.plugins - maven-war-plugin - 2.4 - - src/main/webapp/WEB-INF/web.xml - - - src/main/resources/META-INF - - - - - - - \ No newline at end of file From 095fe5625a1a50a534f31f094cfbdbd2b133d0a1 Mon Sep 17 00:00:00 2001 From: oreva Date: Tue, 13 Sep 2016 09:35:23 +0300 Subject: [PATCH 008/115] Implemented changes according to the latest comments in my pull request. Now we can send email from the web. Access: http://localhost:8080 --- spring-mvc-email/readme.txt | 6 +++ .../java/com/baeldung/spring/Application.java | 3 +- .../baeldung/spring/app/config/AppConfig.java | 44 ++--------------- .../spring/controllers/MailController.java | 47 ++++++++++++++++++- .../spring/mail/EmailServiceImpl.java | 42 ----------------- .../baeldung/spring/mail/OrderManager.java | 4 +- .../baeldung/spring/web/dto/MailObject.java | 12 ----- .../src/main/resources/application.properties | 3 +- .../main/webapp/WEB-INF/simpleweb-servlet.xml | 23 --------- .../main/webapp/WEB-INF/views/mail/send.jsp | 12 ++--- .../src/main/webapp/WEB-INF/web.xml | 12 ----- 11 files changed, 67 insertions(+), 141 deletions(-) create mode 100644 spring-mvc-email/readme.txt delete mode 100644 spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml diff --git a/spring-mvc-email/readme.txt b/spring-mvc-email/readme.txt new file mode 100644 index 0000000000..24ff5438d7 --- /dev/null +++ b/spring-mvc-email/readme.txt @@ -0,0 +1,6 @@ +You can send test email in several ways: +First of all, you should set application.properties properly. +1. Just build the project and the test email for order confirmation will be sent on Spring Boot Start. +2. You can use the web form and test all the cases of sending email in your browser. +Just start the application then type http://localhost:8080 and follow the web flow. +You can send simple email, email with template, email with attachment from the web. \ No newline at end of file diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java index 769658fdde..7d92c2964a 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java @@ -27,8 +27,7 @@ public class Application { @PostConstruct public void postConstruct() { - //emailService.sendSimpleMessage("to@gmail.com", "Test Subject", "Test Message"); - Order order = new Order("reva.olga@gmail.com", "First Name", "Last Name"); + Order order = new Order("user_email_address", "First Name", "Last Name"); orderManager.placeOrder(order); } } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java index 0c1662a36c..4fb684c2b6 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java @@ -44,7 +44,7 @@ public class AppConfig extends WebMvcConfigurerAdapter { } @Bean - public SimpleMailMessage templateMessage() { + public SimpleMailMessage templateOrderMessage() { SimpleMailMessage message = new SimpleMailMessage(); message.setText("Dear %s %s, \nthank you for placing order.\n" + "\n" + @@ -53,44 +53,10 @@ public class AppConfig extends WebMvcConfigurerAdapter { return message; } - /* Gmail */ - /*@Bean - public JavaMailSenderImpl mailSender() { - JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost("smtp.gmail.com"); - mailSender.setPort(587); - mailSender.setUsername("username"); - mailSender.setPassword("password"); - mailSender.setJavaMailProperties(javaMailProperties()); - return mailSender; - } - - private Properties javaMailProperties() { - Properties props = new Properties(); - props.setProperty("mail.smtp.auth", "true"); - props.setProperty("mail.smtp.starttls.enable", "true"); - return props; - }*/ - - /*Amazon SES @Bean - public JavaMailSenderImpl mailSender() { - JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost("email-smtp.us-west-2.amazonaws.com"); - mailSender.setUsername("username"); - mailSender.setPassword("password"); - mailSender.setJavaMailProperties(javaMailProperties()); - return mailSender; + public SimpleMailMessage templateSimpleMessage() { + SimpleMailMessage message = new SimpleMailMessage(); + message.setText("This is the test email template for your email:\n%s\n"); + return message; } - - private Properties javaMailProperties() { - Properties props = new Properties(); - props.setProperty("mail.transport.protocol", "smtps"); - props.setProperty("mail.smtp.port", "25"); - - props.put("mail.smtp.auth", "true"); - props.put("mail.smtp.starttls.enable", "true"); - props.put("mail.smtp.starttls.required", "true"); - return props; - }*/ } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java index 79152797ff..832a60ba5d 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java @@ -3,6 +3,8 @@ package com.baeldung.spring.controllers; import com.baeldung.spring.mail.EmailServiceImpl; import com.baeldung.spring.web.dto.MailObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -22,6 +24,13 @@ public class MailController { @Autowired public EmailServiceImpl emailService; + @Value("${attachment.invoice}") + private String attachmentPath; + + @Autowired + @Qualifier("templateSimpleMessage") + public SimpleMailMessage template; + @RequestMapping(value = "/send", method = RequestMethod.GET) public String createMail(Model model) { model.addAttribute("mailObject", new MailObject()); @@ -32,7 +41,43 @@ public class MailController { public String createMail(Model model, @ModelAttribute("mailObject") @Valid MailObject mailObject, Errors errors) { - emailService.sendSimpleMessage("to@gmail.com", "Test Subject", "Test Message"); + if (errors.hasErrors()) { + return "mail/send"; + } + emailService.sendSimpleMessage(mailObject.getTo(), + mailObject.getSubject(), mailObject.getText()); + + return "redirect:/home"; + } + + @RequestMapping(value = "/sendTemplate", method = RequestMethod.POST) + public String createMailWithTemplate(Model model, + @ModelAttribute("mailObject") @Valid MailObject mailObject, + Errors errors) { + if (errors.hasErrors()) { + return "mail/send"; + } + emailService.sendSimpleMessageUsingTemplate(mailObject.getTo(), + mailObject.getSubject(), + template, + mailObject.getText()); + + return "redirect:/home"; + } + + @RequestMapping(value = "/sendAttachment", method = RequestMethod.POST) + public String createMailWithAttachment(Model model, + @ModelAttribute("mailObject") @Valid MailObject mailObject, + Errors errors) { + if (errors.hasErrors()) { + return "mail/send"; + } + emailService.sendMessageWithAttachment( + mailObject.getTo(), + mailObject.getSubject(), + mailObject.getText(), + attachmentPath + ); return "redirect:/home"; } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java index a6bcb00943..8ecde598f9 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java @@ -69,46 +69,4 @@ public class EmailServiceImpl implements EmailService { e.printStackTrace(); } } - - /*public void sendMail(MimeMessage message) { - try { - emailSender.send(message); - } catch (MailException exception) { - exception.printStackTrace(); - } - } - - public MimeMessage createMessageWithAttachment(MailObject mailObject) { - MimeMessage message = emailSender.createMimeMessage(); - try { - // pass 'true' to the constructor to create a multipart message - MimeMessageHelper helper = new MimeMessageHelper(message, true); - - helper.setFrom(mailObject.getFrom()); - helper.setTo(mailObject.getTo()); - helper.setSubject(mailObject.getSubject()); - helper.setText(mailObject.getText()); - - // attach a sample image attachment - FileSystemResource file = new FileSystemResource(new File("c:/attachment.jpg")); - helper.addAttachment("Attachment.jpg", file); - } catch (MessagingException e) { - e.printStackTrace(); - } - return message; - }*/ - - /*@Autowired - public SimpleMailMessage template; - - public SimpleMailMessage createSimpleMailMessage(MailObject mailObject) { - SimpleMailMessage mailMessage = new SimpleMailMessage(template); - - mailMessage.setFrom(mailObject.getFrom()); - mailMessage.setTo(mailObject.getTo()); - mailMessage.setSubject(mailObject.getSubject()); - mailMessage.setText(String.format(template.getText(), mailObject.getText())); - - return mailMessage; - }*/ } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java index 23f6184c8a..5dfe25f20f 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java @@ -1,6 +1,7 @@ package com.baeldung.spring.mail; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Component; @@ -16,7 +17,8 @@ public class OrderManager { @Value("${attachment.invoice}") private String invoiceAttachmentPath; - @Autowired + @Autowired() + @Qualifier("templateOrderMessage") public SimpleMailMessage template; public void placeOrder(Order order) { diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java b/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java index 3369ccd9f6..9623ff5d78 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/web/dto/MailObject.java @@ -9,10 +9,6 @@ import javax.validation.constraints.Size; * Created by Olga on 7/20/2016. */ public class MailObject { - @Email - @NotNull - @Size(min = 1, message = "Please, specify your email address") - private String from; @Email @NotNull @Size(min = 1, message = "Please, set an email address to send the message to it") @@ -20,14 +16,6 @@ public class MailObject { private String subject; private String text; - public String getFrom() { - return from; - } - - public void setFrom(String from) { - this.from = from; - } - public String getTo() { return to; } diff --git a/spring-mvc-email/src/main/resources/application.properties b/spring-mvc-email/src/main/resources/application.properties index 61a42050e5..ba0608c3af 100644 --- a/spring-mvc-email/src/main/resources/application.properties +++ b/spring-mvc-email/src/main/resources/application.properties @@ -17,4 +17,5 @@ spring.mail.properties.mail.smtp.starttls.enable=true #spring.mail.properties.mail.smtp.starttls.required=true # path to attachment file -attachment.invoice=path_to_file \ No newline at end of file +attachment.invoice=path_to_file +#attachment.invoice=c:/invoice.jpg \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml b/spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml deleted file mode 100644 index 5a3bb2377a..0000000000 --- a/spring-mvc-email/src/main/webapp/WEB-INF/simpleweb-servlet.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp index 9e9cbc1ff7..1307fc2baf 100644 --- a/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp +++ b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp @@ -24,13 +24,6 @@ - - - - Enter your email address
- - - @@ -48,8 +41,11 @@ + - Send + + + diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/web.xml b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml index cbc1bee20a..4cd41216d9 100644 --- a/spring-mvc-email/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-email/src/main/webapp/WEB-INF/web.xml @@ -26,16 +26,4 @@ / - From 6e97acc1ca9b0209a97dec455b1a890802910f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Sat, 17 Sep 2016 01:29:51 +0200 Subject: [PATCH 009/115] BAEL-41: Added including tests: - console appender using default layout - console appender using colorized pattern layout - async file appender using JSON layout --- logging/log4j2/pom.xml | 58 +++++++++++++++++++ .../AsyncFileAppenderUsingJsonLayoutTest.java | 45 ++++++++++++++ ...ConsoleAppenderUsingDefaultLayoutTest.java | 18 ++++++ ...enderUsingPatternLayoutWithColorsTest.java | 27 +++++++++ ...sync-file-appender_json-layout_colored.xml | 16 +++++ ...log4j2-console-appender_pattern-layout.xml | 11 ++++ ...onsole-appender_pattern-layout_colored.xml | 4 ++ logging/log4j2/src/test/resources/log4j2.xml | 13 +++++ logging/pom.xml | 40 +++++++++++++ 9 files changed, 232 insertions(+) create mode 100644 logging/log4j2/pom.xml create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java create mode 100644 logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout_colored.xml create mode 100644 logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml create mode 100644 logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml create mode 100644 logging/log4j2/src/test/resources/log4j2.xml create mode 100644 logging/pom.xml diff --git a/logging/log4j2/pom.xml b/logging/log4j2/pom.xml new file mode 100644 index 0000000000..537427e232 --- /dev/null +++ b/logging/log4j2/pom.xml @@ -0,0 +1,58 @@ + + + + logging + com.baeldung.logging + 1.0.0-SNAPSHOT + + 4.0.0 + + log4j2 + + + + + org.apache.logging.log4j + log4j-api + 2.6.2 + + + org.apache.logging.log4j + log4j-core + 2.6.2 + + + + + com.fasterxml.jackson.core + jackson-databind + 2.8.2 + + + + + org.apache.logging.log4j + log4j-core + 2.6.2 + test-jar + test + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java new file mode 100644 index 0000000000..c9ce0c2828 --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java @@ -0,0 +1,45 @@ +package com.baeldung.logging.log4j2.tests; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertTrue; + +@RunWith(JUnit4.class) +public class AsyncFileAppenderUsingJsonLayoutTest { + + @Rule + public LoggerContextRule contextRule = new LoggerContextRule("log4j2-async-file-appender_json-layout_colored.xml"); + + @Test + public void givenLoggerWithAsyncConfig_shouldLogToJsonFile() throws Exception { + Logger logger = contextRule.getLogger(getClass().getSimpleName()); + final int count = 88; + for (int i = 0; i < count; i++) { + logger.info("This is async JSON message #{} at INFO level.", count); + } + ObjectMapper objectMapper = new ObjectMapper(); + List logEvents = Files.readAllLines(Paths.get("target/logfile.json")).stream() + .map(s -> { + try { + return objectMapper.readValue(s.getBytes(), LogEvent.class); + } catch (IOException e) { + throw new RuntimeException("Failed to import LogEvent!", e); + } + }) + .collect(Collectors.toList()); + assertTrue(logEvents.size() <= count); + } +} diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java new file mode 100644 index 0000000000..9d8b2ae81b --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java @@ -0,0 +1,18 @@ +package com.baeldung.logging.log4j2.tests; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class ConsoleAppenderUsingDefaultLayoutTest { + + @Test + public void givenLoggerWithDefaultConfig_shouldLogToConsole() throws Exception { + Logger logger = LogManager.getLogger(ConsoleAppenderUsingDefaultLayoutTest.class); + Exception e = new RuntimeException("This is only a test!"); + logger.error("This is a simple message at ERROR level. This is the minimum visible level.", e); + } +} diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java new file mode 100644 index 0000000000..c8d017122e --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java @@ -0,0 +1,27 @@ +package com.baeldung.logging.log4j2.tests; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class ConsoleAppenderUsingPatternLayoutWithColorsTest { + + @Rule + public LoggerContextRule contextRule = new LoggerContextRule("log4j2-console-appender_pattern-layout.xml"); + + @Test + public void givenLoggerWithConsoleConfig_shouldLogToConsoleInColors() throws Exception { + Logger logger = contextRule.getLogger(getClass().getSimpleName()); + logger.trace("This is a colored message at TRACE level. This is the minimum visible level."); + logger.debug("This is a colored message at DEBUG level."); + logger.info("This is a colored message at INFO level."); + logger.warn("This is a colored message at WARN level."); + Exception e = new RuntimeException("This is only a test!"); + logger.error("This is a colored message at ERROR level.", e); + logger.fatal("This is a colored message at FATAL level."); + } +} diff --git a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout_colored.xml b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout_colored.xml new file mode 100644 index 0000000000..74767cfb0d --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout_colored.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml new file mode 100644 index 0000000000..2c6f6a1ed0 --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml b/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml new file mode 100644 index 0000000000..02f75be4de --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml @@ -0,0 +1,4 @@ + + + + diff --git a/logging/log4j2/src/test/resources/log4j2.xml b/logging/log4j2/src/test/resources/log4j2.xml new file mode 100644 index 0000000000..3f214e230a --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/logging/pom.xml b/logging/pom.xml new file mode 100644 index 0000000000..535c9e1c54 --- /dev/null +++ b/logging/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.baeldung.logging + logging + 1.0.0-SNAPSHOT + + log4j2 + + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + .. + + + + UTF-8 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + From b86dd316bb7cc920c96909e939152daeb3bf266f Mon Sep 17 00:00:00 2001 From: oreva Date: Sun, 18 Sep 2016 20:47:55 +0300 Subject: [PATCH 010/115] README.md file added. --- spring-mvc-email/README.md | 13 +++++++++++++ spring-mvc-email/readme.txt | 6 ------ 2 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 spring-mvc-email/README.md delete mode 100644 spring-mvc-email/readme.txt diff --git a/spring-mvc-email/README.md b/spring-mvc-email/README.md new file mode 100644 index 0000000000..0de6532393 --- /dev/null +++ b/spring-mvc-email/README.md @@ -0,0 +1,13 @@ +## Spring MVC Email + +Example Spring MVC project to send email from web form. + +### Installing and Running + +Just run the Spring Boot application. +Type http://localhost:8080 in your browser to open the application. + + +### Sending test emails + +Follow UI links to send simple email, email using template or email with attachment. \ No newline at end of file diff --git a/spring-mvc-email/readme.txt b/spring-mvc-email/readme.txt deleted file mode 100644 index 24ff5438d7..0000000000 --- a/spring-mvc-email/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -You can send test email in several ways: -First of all, you should set application.properties properly. -1. Just build the project and the test email for order confirmation will be sent on Spring Boot Start. -2. You can use the web form and test all the cases of sending email in your browser. -Just start the application then type http://localhost:8080 and follow the web flow. -You can send simple email, email with template, email with attachment from the web. \ No newline at end of file From 2f4ac59c54966294d01756446cff09e6170a03b0 Mon Sep 17 00:00:00 2001 From: oreva Date: Sun, 18 Sep 2016 20:53:09 +0300 Subject: [PATCH 011/115] Unused imports removed; Application filed cleaned up from the logic of sending email on startup. --- .../java/com/baeldung/spring/Application.java | 21 ------------------- .../baeldung/spring/app/config/AppConfig.java | 4 +++- .../spring/controllers/HomeController.java | 2 -- .../spring/mail/EmailServiceImpl.java | 3 --- 4 files changed, 3 insertions(+), 27 deletions(-) diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java index 7d92c2964a..f146ee1d04 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/Application.java @@ -1,33 +1,12 @@ package com.baeldung.spring; -import com.baeldung.spring.mail.EmailService; -import com.baeldung.spring.mail.EmailServiceImpl; -import com.baeldung.spring.mail.Order; -import com.baeldung.spring.mail.OrderManager; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.ImportResource; -import org.springframework.mail.SimpleMailMessage; -import javax.annotation.PostConstruct; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } - - @Autowired - public EmailService emailService; - - @Autowired - public OrderManager orderManager; - - @PostConstruct - public void postConstruct() { - Order order = new Order("user_email_address", "First Name", "Last Name"); - orderManager.placeOrder(order); - } } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java index 4fb684c2b6..9f8339c2fe 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java @@ -4,7 +4,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.mail.SimpleMailMessage; -import org.springframework.web.servlet.config.annotation.*; +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.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.UrlBasedViewResolver; diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java index 50643684d1..656e237a9e 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/HomeController.java @@ -3,8 +3,6 @@ package com.baeldung.spring.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.ModelAndView; /** * Created with IntelliJ IDEA. diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java index 8ecde598f9..dab5400d25 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java @@ -1,15 +1,12 @@ package com.baeldung.spring.mail; -import com.baeldung.spring.web.dto.MailObject; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.MailException; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; From b5c4200ca1ba71b7e43da98ec7f2ef2cf7513678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Sun, 25 Sep 2016 08:24:29 +0200 Subject: [PATCH 012/115] BAEL-41: Added failover appender. --- .../FailoverSyslogConsoleAppenderTest.java | 28 +++++++++++++++++++ ...syslog-console-appender_pattern-layout.xml | 20 +++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java create mode 100644 logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java new file mode 100644 index 0000000000..72d32d76fb --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java @@ -0,0 +1,28 @@ +package com.baeldung.logging.log4j2.tests; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class FailoverSyslogConsoleAppenderTest { + + @Rule + public LoggerContextRule contextRule = + new LoggerContextRule("log4j2-failover-syslog-console-appender_pattern-layout.xml"); + + @Test + public void givenLoggerWithFailoverConfig_shouldLog() throws Exception { + Logger logger = contextRule.getLogger(getClass().getSimpleName()); + logger.trace("This is a syslog message at TRACE level."); + logger.debug("This is a syslog message at DEBUG level."); + logger.info("This is a syslog message at INFO level. This is the minimum visible level."); + logger.warn("This is a syslog message at WARN level."); + Exception e = new RuntimeException("This is only a test!"); + logger.error("This is a syslog message at ERROR level.", e); + logger.fatal("This is a syslog message at FATAL level."); + } +} diff --git a/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml b/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml new file mode 100644 index 0000000000..efb4516489 --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + From a929225e1345ba4563240b4efb90cb934510d35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Sun, 2 Oct 2016 20:50:41 +0200 Subject: [PATCH 013/115] BAEL-41: Added including tests: - rolling file appender using XML layout - async file appender using JSON layout --- logging/log4j2/pom.xml | 7 ++++ .../AsyncFileAppenderUsingJsonLayoutTest.java | 20 ++--------- ...RollingFileAppenderUsingXMLLayoutTest.java | 34 +++++++++++++++++++ ...og4j2-async-file-appender_json-layout.xml} | 0 ...og4j2-rolling-file-appender_xml-layout.xml | 17 ++++++++++ 5 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java rename logging/log4j2/src/test/resources/{log4j2-async-file-appender_json-layout_colored.xml => log4j2-async-file-appender_json-layout.xml} (100%) create mode 100644 logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml diff --git a/logging/log4j2/pom.xml b/logging/log4j2/pom.xml index 537427e232..01cdfc5872 100644 --- a/logging/log4j2/pom.xml +++ b/logging/log4j2/pom.xml @@ -31,6 +31,13 @@ 2.8.2 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.8.2 + + org.apache.logging.log4j diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java index c9ce0c2828..1006b38b14 100644 --- a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java @@ -1,19 +1,14 @@ package com.baeldung.logging.log4j2.tests; -import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.junit.LoggerContextRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.List; -import java.util.stream.Collectors; import static org.junit.Assert.assertTrue; @@ -21,7 +16,7 @@ import static org.junit.Assert.assertTrue; public class AsyncFileAppenderUsingJsonLayoutTest { @Rule - public LoggerContextRule contextRule = new LoggerContextRule("log4j2-async-file-appender_json-layout_colored.xml"); + public LoggerContextRule contextRule = new LoggerContextRule("log4j2-async-file-appender_json-layout.xml"); @Test public void givenLoggerWithAsyncConfig_shouldLogToJsonFile() throws Exception { @@ -30,16 +25,7 @@ public class AsyncFileAppenderUsingJsonLayoutTest { for (int i = 0; i < count; i++) { logger.info("This is async JSON message #{} at INFO level.", count); } - ObjectMapper objectMapper = new ObjectMapper(); - List logEvents = Files.readAllLines(Paths.get("target/logfile.json")).stream() - .map(s -> { - try { - return objectMapper.readValue(s.getBytes(), LogEvent.class); - } catch (IOException e) { - throw new RuntimeException("Failed to import LogEvent!", e); - } - }) - .collect(Collectors.toList()); - assertTrue(logEvents.size() <= count); + long logEventsCount = Files.lines(Paths.get("target/logfile.json")).count(); + assertTrue(logEventsCount == count); } } diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java new file mode 100644 index 0000000000..f455003b08 --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java @@ -0,0 +1,34 @@ +package com.baeldung.logging.log4j2.tests; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertTrue; + +@RunWith(JUnit4.class) +public class RollingFileAppenderUsingXMLLayoutTest { + + @Rule + public LoggerContextRule contextRule = new LoggerContextRule("log4j2-rolling-file-appender_xml-layout.xml"); + + @Test + public void givenLoggerWithRollingFileConfig_shouldLogToXMLFile() throws Exception { + Logger logger = contextRule.getLogger(getClass().getSimpleName()); + final int count = 88; + for (int i = 0; i < count; i++) { + logger.info("This is rolling file XML message #{} at INFO level.", count); + } + String[] logEvents = Files.readAllLines(Paths.get("target/logfile.xml")).stream() + .collect(Collectors.joining(System.lineSeparator())) + .split("\\n\\n+"); + assertTrue(logEvents.length == count); + } +} diff --git a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout_colored.xml b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout_colored.xml rename to logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml diff --git a/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml b/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml new file mode 100644 index 0000000000..8d47061a9e --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + From 0bd7a5d0ea944daeec8ab43d97fa1110c29864bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Mon, 3 Oct 2016 11:27:05 +0200 Subject: [PATCH 014/115] BAEL-41: Added including tests: - added JDBC appender. --- logging/log4j2/pom.xml | 12 +++++ .../log4j2/tests/JDBCAppenderTest.java | 52 +++++++++++++++++++ .../log4j2/tests/jdbc/ConnectionFactory.java | 25 +++++++++ ...log4j2-async-file-appender_json-layout.xml | 6 +-- ...log4j2-console-appender_pattern-layout.xml | 4 +- ...syslog-console-appender_pattern-layout.xml | 8 +-- ...onsole-appender_pattern-layout_colored.xml | 2 +- .../test/resources/log4j2-jdbc-appender.xml | 19 +++++++ ...og4j2-rolling-file-appender_xml-layout.xml | 7 +-- logging/log4j2/src/test/resources/log4j2.xml | 6 +-- 10 files changed, 125 insertions(+), 16 deletions(-) create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java create mode 100644 logging/log4j2/src/test/resources/log4j2-jdbc-appender.xml diff --git a/logging/log4j2/pom.xml b/logging/log4j2/pom.xml index 01cdfc5872..d386836b6c 100644 --- a/logging/log4j2/pom.xml +++ b/logging/log4j2/pom.xml @@ -38,6 +38,18 @@ 2.8.2 + + + com.h2database + h2 + 1.4.192 + + + org.apache.commons + commons-dbcp2 + 2.1.1 + + org.apache.logging.log4j diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java new file mode 100644 index 0000000000..2ceda2083b --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java @@ -0,0 +1,52 @@ +package com.baeldung.logging.log4j2.tests; + +import com.baeldung.logging.log4j2.tests.jdbc.ConnectionFactory; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.sql.Connection; +import java.sql.ResultSet; + +import static org.junit.Assert.assertTrue; + +@RunWith(JUnit4.class) +public class JDBCAppenderTest { + + @Rule + public LoggerContextRule contextRule = new LoggerContextRule("log4j2-jdbc-appender.xml"); + + @BeforeClass + public static void setup() throws Exception { + Connection connection = ConnectionFactory.getConnection(); + connection.createStatement() + .execute("CREATE TABLE logs(" + + "when TIMESTAMP," + + "logger VARCHAR(255)," + + "level VARCHAR(255)," + + "message VARCHAR(4096)," + + "throwable TEXT)"); + //connection.commit(); + } + + @Test + public void givenLoggerWithJdbcConfig_shouldLogToDataSource() throws Exception { + Logger logger = contextRule.getLogger(getClass().getSimpleName()); + final int count = 88; + for (int i = 0; i < count; i++) { + logger.info("This is JDBC message #{} at INFO level.", count); + } + Connection connection = ConnectionFactory.getConnection(); + ResultSet resultSet = connection.createStatement() + .executeQuery("SELECT COUNT(*) AS ROW_COUNT FROM logs"); + int logCount = 0; + if (resultSet.next()) { + logCount = resultSet.getInt("ROW_COUNT"); + } + assertTrue(logCount == count); + } +} diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java new file mode 100644 index 0000000000..73b323f335 --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java @@ -0,0 +1,25 @@ +package com.baeldung.logging.log4j2.tests.jdbc; + +import org.apache.commons.dbcp2.BasicDataSource; +import org.h2.Driver; + +import java.sql.Connection; +import java.sql.SQLException; + +public class ConnectionFactory { + private interface Singleton { + ConnectionFactory INSTANCE = new ConnectionFactory(); + } + + private BasicDataSource dataSource; + + private ConnectionFactory() { + dataSource = new BasicDataSource(); + dataSource.setDriver(new Driver()); + dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1"); + } + + public static Connection getConnection() throws SQLException { + return Singleton.INSTANCE.dataSource.getConnection(); + } +} diff --git a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml index 74767cfb0d..eb338dd496 100644 --- a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml @@ -4,13 +4,13 @@ - + - - + + diff --git a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml index 2c6f6a1ed0..4167fb9366 100644 --- a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml @@ -4,8 +4,8 @@ - - + + diff --git a/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml b/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml index efb4516489..62ba37f28c 100644 --- a/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml @@ -6,15 +6,15 @@ - + - + - - + + diff --git a/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml b/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml index 02f75be4de..c2b9c65430 100644 --- a/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml +++ b/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml @@ -1,4 +1,4 @@ - + diff --git a/logging/log4j2/src/test/resources/log4j2-jdbc-appender.xml b/logging/log4j2/src/test/resources/log4j2-jdbc-appender.xml new file mode 100644 index 0000000000..6b50f7d5a4 --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2-jdbc-appender.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml b/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml index 8d47061a9e..059007f660 100644 --- a/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml @@ -1,7 +1,8 @@ - @@ -10,8 +11,8 @@ - - + + diff --git a/logging/log4j2/src/test/resources/log4j2.xml b/logging/log4j2/src/test/resources/log4j2.xml index 3f214e230a..8f7608aa78 100644 --- a/logging/log4j2/src/test/resources/log4j2.xml +++ b/logging/log4j2/src/test/resources/log4j2.xml @@ -1,13 +1,13 @@ - + - - + + From 8bab22bdca7b6178b1d2802e7c780eba9e1593aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Mon, 3 Oct 2016 13:07:45 +0200 Subject: [PATCH 015/115] BAEL-41: Added including tests: - burst filter --- .../AsyncFileAppenderUsingJsonLayoutTest.java | 2 +- ...derUsingJsonLayoutWithBurstFilterTest.java | 33 +++++++++++++++++++ ...log4j2-async-file-appender_json-layout.xml | 4 +-- ...file-appender_json-layout_burst-filter.xml | 14 ++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java create mode 100644 logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java index 1006b38b14..db3a4d2458 100644 --- a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java @@ -26,6 +26,6 @@ public class AsyncFileAppenderUsingJsonLayoutTest { logger.info("This is async JSON message #{} at INFO level.", count); } long logEventsCount = Files.lines(Paths.get("target/logfile.json")).count(); - assertTrue(logEventsCount == count); + assertTrue(logEventsCount > 0 && logEventsCount <= count); } } diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java new file mode 100644 index 0000000000..4ff22c821b --- /dev/null +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java @@ -0,0 +1,33 @@ +package com.baeldung.logging.log4j2.tests; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertTrue; + +@RunWith(JUnit4.class) +public class FileAppenderUsingJsonLayoutWithBurstFilterTest { + + @Rule + public LoggerContextRule contextRule = new LoggerContextRule("log4j2-file-appender_json-layout_burst-filter.xml"); + + @Test + public void givenLoggerWithBurstFileConfig_shouldLogToJsonFile() throws Exception { + Logger logger = contextRule.getLogger(getClass().getSimpleName()); + final int count = 88; + for (int i = 0; i < count; i++) { + logger.info("This is burst JSON message #{} at INFO level.", count); + TimeUnit.MILLISECONDS.sleep(100); + } + long logEventsCount = Files.lines(Paths.get("target/logfile-burst.json")).count(); + assertTrue(logEventsCount > 0 && logEventsCount < count); + } +} diff --git a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml index eb338dd496..695399ca66 100644 --- a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml @@ -1,11 +1,11 @@ - + - + diff --git a/logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml b/logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml new file mode 100644 index 0000000000..edadcbaecb --- /dev/null +++ b/logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + From b04ede30f5da9f7adf9d8fbe7483eb1c21108250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Mon, 3 Oct 2016 22:28:16 +0200 Subject: [PATCH 016/115] BAEL-41: Added including tests: - marker filter --- ...enderUsingPatternLayoutWithColorsTest.java | 15 +++++++-- ...derUsingJsonLayoutWithBurstFilterTest.java | 33 ------------------- ...log4j2-async-file-appender_json-layout.xml | 1 + ...log4j2-console-appender_pattern-layout.xml | 9 ++++- ...file-appender_json-layout_burst-filter.xml | 14 -------- 5 files changed, 22 insertions(+), 50 deletions(-) delete mode 100644 logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java delete mode 100644 logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java index c8d017122e..635e05c841 100644 --- a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java @@ -1,6 +1,8 @@ package com.baeldung.logging.log4j2.tests; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; import org.apache.logging.log4j.junit.LoggerContextRule; import org.junit.Rule; import org.junit.Test; @@ -16,12 +18,21 @@ public class ConsoleAppenderUsingPatternLayoutWithColorsTest { @Test public void givenLoggerWithConsoleConfig_shouldLogToConsoleInColors() throws Exception { Logger logger = contextRule.getLogger(getClass().getSimpleName()); - logger.trace("This is a colored message at TRACE level. This is the minimum visible level."); - logger.debug("This is a colored message at DEBUG level."); + logger.trace("This is a colored message at TRACE level."); + logger.debug("This is a colored message at DEBUG level. This is the minimum visible level."); logger.info("This is a colored message at INFO level."); logger.warn("This is a colored message at WARN level."); Exception e = new RuntimeException("This is only a test!"); logger.error("This is a colored message at ERROR level.", e); logger.fatal("This is a colored message at FATAL level."); } + + @Test + public void givenLoggerWithConsoleConfig_shouldFilterByMarker() throws Exception { + Logger logger = contextRule.getLogger("ConnTrace"); + Marker appError = MarkerManager.getMarker("APP_ERROR"); + logger.error(appError, "This marker message at ERROR level should be hidden."); + Marker connectionTrace = MarkerManager.getMarker("CONN_TRACE"); + logger.trace(connectionTrace, "This is a marker message at TRACE level."); + } } diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java deleted file mode 100644 index 4ff22c821b..0000000000 --- a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FileAppenderUsingJsonLayoutWithBurstFilterTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.logging.log4j2.tests; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.junit.LoggerContextRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.concurrent.TimeUnit; - -import static org.junit.Assert.assertTrue; - -@RunWith(JUnit4.class) -public class FileAppenderUsingJsonLayoutWithBurstFilterTest { - - @Rule - public LoggerContextRule contextRule = new LoggerContextRule("log4j2-file-appender_json-layout_burst-filter.xml"); - - @Test - public void givenLoggerWithBurstFileConfig_shouldLogToJsonFile() throws Exception { - Logger logger = contextRule.getLogger(getClass().getSimpleName()); - final int count = 88; - for (int i = 0; i < count; i++) { - logger.info("This is burst JSON message #{} at INFO level.", count); - TimeUnit.MILLISECONDS.sleep(100); - } - long logEventsCount = Files.lines(Paths.get("target/logfile-burst.json")).count(); - assertTrue(logEventsCount > 0 && logEventsCount < count); - } -} diff --git a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml index 695399ca66..c291eacd59 100644 --- a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml @@ -3,6 +3,7 @@ + diff --git a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml index 4167fb9366..9cd3ccea50 100644 --- a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml @@ -2,9 +2,16 @@ + + + + - + + + + diff --git a/logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml b/logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml deleted file mode 100644 index edadcbaecb..0000000000 --- a/logging/log4j2/src/test/resources/log4j2-file-appender_json-layout_burst-filter.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - From cf335e30a4af3bdf59db07eb3cb25accf309240a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Tue, 4 Oct 2016 02:28:27 +0200 Subject: [PATCH 017/115] BAEL-41: Added including tests: - thread context filter and pattern --- ...nsoleAppenderUsingPatternLayoutWithColorsTest.java | 11 +++++++++++ .../log4j2-console-appender_pattern-layout.xml | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java index 635e05c841..1e16ba7d0b 100644 --- a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java +++ b/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java @@ -3,6 +3,7 @@ package com.baeldung.logging.log4j2.tests; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; +import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.junit.LoggerContextRule; import org.junit.Rule; import org.junit.Test; @@ -35,4 +36,14 @@ public class ConsoleAppenderUsingPatternLayoutWithColorsTest { Marker connectionTrace = MarkerManager.getMarker("CONN_TRACE"); logger.trace(connectionTrace, "This is a marker message at TRACE level."); } + + @Test + public void givenLoggerWithConsoleConfig_shouldFilterByThreadContext() throws Exception { + Logger logger = contextRule.getLogger("UserAudit"); + ThreadContext.put("userId", "1000"); + logger.info("This is a log-visible user login. Maybe from an admin account?"); + ThreadContext.put("userId", "1001"); + logger.info("This is a log-invisible user login."); + boolean b = true; + } } diff --git a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml index 9cd3ccea50..d6621f9166 100644 --- a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml +++ b/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml @@ -6,11 +6,20 @@ + + + + + + + + + From 309e1a2da75e769bd2ff5bb9ec747e55bc2ac581 Mon Sep 17 00:00:00 2001 From: oreva Date: Thu, 6 Oct 2016 12:53:00 +0300 Subject: [PATCH 018/115] Options to send different types of emails were moved to the home page. --- .../spring/controllers/MailController.java | 2 +- .../src/main/webapp/WEB-INF/views/home.jsp | 24 ++++++++++++++++--- .../main/webapp/WEB-INF/views/mail/send.jsp | 4 +--- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java index 832a60ba5d..1f536e3297 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java @@ -31,7 +31,7 @@ public class MailController { @Qualifier("templateSimpleMessage") public SimpleMailMessage template; - @RequestMapping(value = "/send", method = RequestMethod.GET) + @RequestMapping(value = {"/send", "/sendTemplate", "/sendAttachment"}, method = RequestMethod.GET) public String createMail(Model model) { model.addAttribute("mailObject", new MailObject()); return "mail/send"; diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp b/spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp index 74165f2626..63351bbf3a 100644 --- a/spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp +++ b/spring-mvc-email/src/main/webapp/WEB-INF/views/home.jsp @@ -15,9 +15,27 @@
-

Send Email

-
- +

Select any of the options below to send sample email:

+ +
+ + + + + + + + + + +
+ +
+ +
+ +
+
diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp index 1307fc2baf..294cb2c49c 100644 --- a/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp +++ b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp @@ -43,9 +43,7 @@ - - - + From 2892e9347673c2e47b0930f0f6c89558c806c833 Mon Sep 17 00:00:00 2001 From: Ivan Paolillo Date: Wed, 19 Oct 2016 11:01:40 +0200 Subject: [PATCH 019/115] Code improvement --- .../baeldung/okhttp/OkHttpGetLiveTest.java | 3 ++ .../baeldung/okhttp/OkHttpMiscLiveTest.java | 28 +++++++------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java index 9a49c8d9a2..dc80ce7cf5 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java @@ -14,6 +14,9 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +//@RunWith(SpringJUnit4ClassRunner.class) +//@WebAppConfiguration +//@ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/api-servlet.xml") public class OkHttpGetLiveTest { private static final String BASE_URL = "http://localhost:8080/spring-rest"; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java index c44500f4be..dcdb4e328c 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java @@ -37,7 +37,7 @@ public class OkHttpMiscLiveTest { response.close(); } - @Test + @Test(expected = IOException.class) public void whenCancelRequest_thenCorrect() throws IOException { ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); @@ -49,30 +49,22 @@ public class OkHttpMiscLiveTest { .build(); final int seconds = 1; - final long startNanos = System.nanoTime(); + final Call call = client.newCall(request); // Schedule a job to cancel the call in 1 second. - executor.schedule(new Runnable() { - public void run() { + executor.schedule(() -> { + + logger.debug("Canceling call: " + (System.nanoTime() - startNanos) / 1e9f); + call.cancel(); + logger.debug("Canceled call: " + (System.nanoTime() - startNanos) / 1e9f); - logger.debug("Canceling call: " + (System.nanoTime() - startNanos) / 1e9f); - call.cancel(); - logger.debug("Canceled call: " + (System.nanoTime() - startNanos) / 1e9f); - } }, seconds, TimeUnit.SECONDS); - try { - - logger.debug("Executing call: " + (System.nanoTime() - startNanos) / 1e9f); - Response response = call.execute(); - logger.debug("Call was expected to fail, but completed: " + (System.nanoTime() - startNanos) / 1e9f, response); - - } catch (IOException e) { - - logger.debug("Call failed as expected: " + (System.nanoTime() - startNanos) / 1e9f, e); - } + logger.debug("Executing call: " + (System.nanoTime() - startNanos) / 1e9f); + Response response = call.execute(); + logger.debug("Call completed: " + (System.nanoTime() - startNanos) / 1e9f, response); } @Test From 35dbb1cfb0206f2c518597b52a77c13c2ba3b6ea Mon Sep 17 00:00:00 2001 From: Ivan Paolillo Date: Wed, 19 Oct 2016 12:18:03 +0200 Subject: [PATCH 020/115] Code improvement --- .../java/org/baeldung/okhttp/OkHttpGetLiveTest.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java index dc80ce7cf5..8049e23784 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java @@ -2,6 +2,7 @@ package org.baeldung.okhttp; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; import java.io.IOException; @@ -21,7 +22,7 @@ public class OkHttpGetLiveTest { private static final String BASE_URL = "http://localhost:8080/spring-rest"; - @Test + //@Test public void whenGetRequest_thenCorrect() throws IOException { OkHttpClient client = new OkHttpClient(); @@ -36,7 +37,7 @@ public class OkHttpGetLiveTest { assertThat(response.code(), equalTo(200)); } - @Test + //@Test public void whenGetRequestWithQueryParameter_thenCorrect() throws IOException { OkHttpClient client = new OkHttpClient(); @@ -57,7 +58,7 @@ public class OkHttpGetLiveTest { } @Test - public void whenAsynchronousGetRequest_thenCorrect() { + public void whenAsynchronousGetRequest_thenCorrect() throws InterruptedException { OkHttpClient client = new OkHttpClient(); @@ -70,12 +71,16 @@ public class OkHttpGetLiveTest { call.enqueue(new Callback() { public void onResponse(Call call, Response response) throws IOException { + assertThat(response.code(), equalTo(200)); } public void onFailure(Call call, IOException e) { + fail(); } }); + + Thread.sleep(3000); } } From 91faa251d51a76cff2451c19ec6404166446bae4 Mon Sep 17 00:00:00 2001 From: Ivan Paolillo Date: Wed, 19 Oct 2016 12:23:03 +0200 Subject: [PATCH 021/115] Code improvement --- .../test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java index 8049e23784..632d7577a4 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java @@ -22,7 +22,7 @@ public class OkHttpGetLiveTest { private static final String BASE_URL = "http://localhost:8080/spring-rest"; - //@Test + @Test public void whenGetRequest_thenCorrect() throws IOException { OkHttpClient client = new OkHttpClient(); @@ -37,7 +37,7 @@ public class OkHttpGetLiveTest { assertThat(response.code(), equalTo(200)); } - //@Test + @Test public void whenGetRequestWithQueryParameter_thenCorrect() throws IOException { OkHttpClient client = new OkHttpClient(); @@ -71,12 +71,10 @@ public class OkHttpGetLiveTest { call.enqueue(new Callback() { public void onResponse(Call call, Response response) throws IOException { - assertThat(response.code(), equalTo(200)); } public void onFailure(Call call, IOException e) { - fail(); } }); From 0930c78ff7bc270b13276c254e5ba9ac4494a875 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Tue, 25 Oct 2016 21:13:32 +0530 Subject: [PATCH 022/115] BAEL-29-String Conversion changes --- .../java/conversion/StringConversion.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java diff --git a/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java b/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java new file mode 100644 index 0000000000..c83ea6a20c --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java @@ -0,0 +1,60 @@ +package com.baeldung.java.conversion; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalTime; +import java.util.Date; + +import com.baeldung.datetime.UseLocalTime; + +public class StringConversion { + + public static int getInt(String str) { + return Integer.parseInt(str); + } + + public static int getInteger(String str) { + return Integer.valueOf(str); + } + + public static long getLongPrimitive(String str) { + return Long.parseLong(str); + } + + public static Long getLong(String str) { + return Long.valueOf(str); + } + + public static double getDouble(String str) { + return Double.parseDouble(str); + } + + public static double getDoublePrimitive(String str) { + return Double.valueOf(str); + } + + public static byte[] getByteArray(String str) { + return str.getBytes(); + } + + public static char[] getCharArray(String str) { + return str.toCharArray(); + } + + public static boolean getBooleanPrimitive(String str) { + return Boolean.parseBoolean(str); + } + + public static boolean getBoolean(String str) { + return Boolean.valueOf(str); + } + + public static Date getJava6Date(String str, String format) throws ParseException { + SimpleDateFormat formatter = new SimpleDateFormat(format); + return formatter.parse(str); + } + + public static LocalTime getJava8Date(String str) throws ParseException { + return new UseLocalTime().getLocalTimeUsingParseMethod(str); + } +} From 6989041dc2afc899a349545e72a0653d5b0b5354 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Tue, 25 Oct 2016 22:34:25 +0530 Subject: [PATCH 023/115] Changes for String Conversions --- core-java/0.12457740242410742 | 0 .../com/baeldung/java/conversion/StringConversion.java | 8 ++++---- core-java/src/main/resources/targetFile.tmp | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 core-java/0.12457740242410742 create mode 100644 core-java/src/main/resources/targetFile.tmp diff --git a/core-java/0.12457740242410742 b/core-java/0.12457740242410742 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java b/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java index c83ea6a20c..0a0f79566e 100644 --- a/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java +++ b/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java @@ -2,10 +2,10 @@ package com.baeldung.java.conversion; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalTime; +import java.time.LocalDateTime; import java.util.Date; -import com.baeldung.datetime.UseLocalTime; +import com.baeldung.datetime.UseLocalDateTime; public class StringConversion { @@ -54,7 +54,7 @@ public class StringConversion { return formatter.parse(str); } - public static LocalTime getJava8Date(String str) throws ParseException { - return new UseLocalTime().getLocalTimeUsingParseMethod(str); + public static LocalDateTime getJava8Date(String str) throws ParseException { + return new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); } } diff --git a/core-java/src/main/resources/targetFile.tmp b/core-java/src/main/resources/targetFile.tmp new file mode 100644 index 0000000000..20f137b416 --- /dev/null +++ b/core-java/src/main/resources/targetFile.tmp @@ -0,0 +1,2 @@ +line 1 +a second line \ No newline at end of file From 13f7d5dfdf01d45807b5568b54758af785bb4c2c Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 28 Oct 2016 22:26:56 +0530 Subject: [PATCH 024/115] Updating the Selenium version --- selenium-junit-testng/pom.xml | 2 +- .../java/com/baeldung/selenium/SeleniumExample.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/selenium-junit-testng/pom.xml b/selenium-junit-testng/pom.xml index 861c0b1986..cc96ea8529 100644 --- a/selenium-junit-testng/pom.xml +++ b/selenium-junit-testng/pom.xml @@ -53,7 +53,7 @@ org.seleniumhq.selenium selenium-java - 2.53.1 + 3.0.1 junit diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java b/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java index ce60a1f638..58d47c0162 100644 --- a/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java +++ b/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java @@ -15,6 +15,7 @@ public class SeleniumExample { private String url = "http://www.baeldung.com/"; public SeleniumExample() { + System.setProperty("webdriver.firefox.marionette", "C:\\selenium\\geckodriver.exe"); webDriver = new FirefoxDriver(); webDriver.manage().window().maximize(); webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); @@ -29,16 +30,20 @@ public class SeleniumExample { return webDriver.getTitle(); } - public void getAboutBaeldungPage() throws Exception { + public void getAboutBaeldungPage() { closeOverlay(); clickAboutLink(); clickAboutUsLink(); } - private void closeOverlay() throws Exception { + private void closeOverlay() { List webElementList = webDriver.findElements(By.tagName("a")); - if (webElementList != null && !webElementList.isEmpty() && webElementList.stream().filter(webElement -> "Close".equalsIgnoreCase(webElement.getAttribute("title"))).findAny().isPresent()) { - webElementList.stream().filter(webElement -> "Close".equalsIgnoreCase(webElement.getAttribute("title"))).findAny().orElseThrow(NoSuchElementException::new).click(); + try { + if (webElementList != null && !webElementList.isEmpty()) { + webElementList.stream().filter(webElement -> "Close".equalsIgnoreCase(webElement.getAttribute("title"))).findAny().orElseThrow(NoSuchElementException::new).click(); + } + } catch (NoSuchElementException exception) { + exception.printStackTrace(); } } From 1646eb9813c3b4f6e0e52f26c39f7591d0205aab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Fri, 28 Oct 2016 21:04:41 +0200 Subject: [PATCH 025/115] BAEL-41: Moved module location. --- {logging/log4j2 => log4j2}/pom.xml | 32 ++++++++------- .../AsyncFileAppenderUsingJsonLayoutTest.java | 0 ...ConsoleAppenderUsingDefaultLayoutTest.java | 0 ...enderUsingPatternLayoutWithColorsTest.java | 0 .../FailoverSyslogConsoleAppenderTest.java | 0 .../log4j2/tests/JDBCAppenderTest.java | 0 ...RollingFileAppenderUsingXMLLayoutTest.java | 2 +- .../log4j2/tests/jdbc/ConnectionFactory.java | 0 ...log4j2-async-file-appender_json-layout.xml | 0 ...log4j2-console-appender_pattern-layout.xml | 0 ...syslog-console-appender_pattern-layout.xml | 0 ...onsole-appender_pattern-layout_colored.xml | 0 .../test/resources/log4j2-jdbc-appender.xml | 0 ...og4j2-rolling-file-appender_xml-layout.xml | 0 .../src/test/resources/log4j2.xml | 0 logging/pom.xml | 40 ------------------- 16 files changed, 18 insertions(+), 56 deletions(-) rename {logging/log4j2 => log4j2}/pom.xml (80%) rename {logging/log4j2 => log4j2}/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java (100%) rename {logging/log4j2 => log4j2}/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java (100%) rename {logging/log4j2 => log4j2}/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java (100%) rename {logging/log4j2 => log4j2}/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java (100%) rename {logging/log4j2 => log4j2}/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java (100%) rename {logging/log4j2 => log4j2}/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java (98%) rename {logging/log4j2 => log4j2}/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java (100%) rename {logging/log4j2 => log4j2}/src/test/resources/log4j2-async-file-appender_json-layout.xml (100%) rename {logging/log4j2 => log4j2}/src/test/resources/log4j2-console-appender_pattern-layout.xml (100%) rename {logging/log4j2 => log4j2}/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml (100%) rename {logging/log4j2 => log4j2}/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml (100%) rename {logging/log4j2 => log4j2}/src/test/resources/log4j2-jdbc-appender.xml (100%) rename {logging/log4j2 => log4j2}/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml (100%) rename {logging/log4j2 => log4j2}/src/test/resources/log4j2.xml (100%) delete mode 100644 logging/pom.xml diff --git a/logging/log4j2/pom.xml b/log4j2/pom.xml similarity index 80% rename from logging/log4j2/pom.xml rename to log4j2/pom.xml index d386836b6c..83904f2075 100644 --- a/logging/log4j2/pom.xml +++ b/log4j2/pom.xml @@ -2,40 +2,37 @@ - - logging - com.baeldung.logging - 1.0.0-SNAPSHOT - 4.0.0 log4j2 + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + .. + + - - - org.apache.logging.log4j - log4j-api - 2.6.2 - + org.apache.logging.log4j log4j-core - 2.6.2 + 2.7 com.fasterxml.jackson.core jackson-databind - 2.8.2 + 2.8.4 com.fasterxml.jackson.dataformat jackson-dataformat-xml - 2.8.2 + 2.8.4 @@ -54,7 +51,7 @@ org.apache.logging.log4j log4j-core - 2.6.2 + 2.7 test-jar test @@ -71,6 +68,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java similarity index 100% rename from logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java rename to log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java similarity index 100% rename from logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java rename to log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java similarity index 100% rename from logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java rename to log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java similarity index 100% rename from logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java rename to log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java similarity index 100% rename from logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java rename to log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java similarity index 98% rename from logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java rename to log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java index f455003b08..2ebdccfc75 100644 --- a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java @@ -24,7 +24,7 @@ public class RollingFileAppenderUsingXMLLayoutTest { Logger logger = contextRule.getLogger(getClass().getSimpleName()); final int count = 88; for (int i = 0; i < count; i++) { - logger.info("This is rolling file XML message #{} at INFO level.", count); + logger.info("This is rolling file XML message #{} at INFO level.", i); } String[] logEvents = Files.readAllLines(Paths.get("target/logfile.xml")).stream() .collect(Collectors.joining(System.lineSeparator())) diff --git a/logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java similarity index 100% rename from logging/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java rename to log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java diff --git a/logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml b/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml rename to log4j2/src/test/resources/log4j2-async-file-appender_json-layout.xml diff --git a/logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml b/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml rename to log4j2/src/test/resources/log4j2-console-appender_pattern-layout.xml diff --git a/logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml b/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml rename to log4j2/src/test/resources/log4j2-failover-syslog-console-appender_pattern-layout.xml diff --git a/logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml b/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml rename to log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml diff --git a/logging/log4j2/src/test/resources/log4j2-jdbc-appender.xml b/log4j2/src/test/resources/log4j2-jdbc-appender.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2-jdbc-appender.xml rename to log4j2/src/test/resources/log4j2-jdbc-appender.xml diff --git a/logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml b/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml rename to log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml diff --git a/logging/log4j2/src/test/resources/log4j2.xml b/log4j2/src/test/resources/log4j2.xml similarity index 100% rename from logging/log4j2/src/test/resources/log4j2.xml rename to log4j2/src/test/resources/log4j2.xml diff --git a/logging/pom.xml b/logging/pom.xml deleted file mode 100644 index 535c9e1c54..0000000000 --- a/logging/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - - com.baeldung.logging - logging - 1.0.0-SNAPSHOT - - log4j2 - - pom - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - .. - - - - UTF-8 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - 1.8 - 1.8 - - - - - - From 06e7facc846ed655c4b8d23b2b7cca919f371238 Mon Sep 17 00:00:00 2001 From: Shubham Aggarwal Date: Sat, 29 Oct 2016 16:29:14 +0530 Subject: [PATCH 026/115] Added HexToAscii example. --- .../com/baeldung/hextToAscii/HexToAscii.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java diff --git a/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java b/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java new file mode 100644 index 0000000000..a3e0dd431d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java @@ -0,0 +1,38 @@ +package com.baeldung.hexToAscii; + +public class HexToAscii { + + public static void main(String[] args) { + + String demoString = "http://www.baeldung.com/jackson-serialize-dates"; + + System.out.println("Original statement: " + demoString); + + String hexEquivalent = asciiToHex(demoString); + System.out.println("Hex equivalent: " + hexEquivalent); + + String asciiEquivalent = hexToASCII(hexEquivalent); + System.out.println("Ascii equivalent: " + asciiEquivalent); + } + + private static String asciiToHex(String asciiStr) { + + char[] chars = asciiStr.toCharArray(); + StringBuilder hex = new StringBuilder(); + for (char ch : chars) { + hex.append(Integer.toHexString((int) ch)); + } + + return hex.toString(); + } + + private static String hexToASCII(String hexStr) { + + StringBuilder output = new StringBuilder(""); + for (int i = 0; i < hexStr.length(); i += 2) { + String str = hexStr.substring(i, i + 2); + output.append((char) Integer.parseInt(str, 16)); + } + return output.toString(); + } +} From 771a81d5bd3a409c00279e8acddcdf9535fde3a9 Mon Sep 17 00:00:00 2001 From: mujah Date: Sat, 29 Oct 2016 21:46:34 +0800 Subject: [PATCH 027/115] Spring Data Solr project created --- spring-data-solr/pom.xml | 78 ++++++++++++ .../spring/data/solr/config/SolrConfig.java | 25 ++++ .../spring/data/solr/model/Product.java | 62 ++++++++++ .../solr/repository/ProductRepository.java | 24 ++++ .../resources/solr-named-queries.properties | 1 + .../ProductRepositoryIntegrationTest.java | 117 ++++++++++++++++++ 6 files changed, 307 insertions(+) create mode 100644 spring-data-solr/pom.xml create mode 100644 spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java create mode 100644 spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java create mode 100644 spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java create mode 100644 spring-data-solr/src/main/resources/solr-named-queries.properties create mode 100644 spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java diff --git a/spring-data-solr/pom.xml b/spring-data-solr/pom.xml new file mode 100644 index 0000000000..9ec017e376 --- /dev/null +++ b/spring-data-solr/pom.xml @@ -0,0 +1,78 @@ + + 4.0.0 + + com.baeldung + spring-data-solr + 0.0.1-SNAPSHOT + jar + + spring-data-solr + + + + UTF-8 + 4.2.5.RELEASE + 2.19.1 + 2.0.4.RELEASE + + + + + + org.springframework + spring-core + ${spring.version} + + + + org.springframework.data + spring-data-solr + ${spring-data-solr} + + + + + org.springframework + spring-context + ${spring.version} + + + + + log4j + log4j + 1.2.16 + + + + + junit + junit + 4.12 + test + + + + org.springframework + spring-test + ${spring.version} + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*IntegrationTest.java + + + + + + diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java new file mode 100644 index 0000000000..1fe1e5468b --- /dev/null +++ b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/config/SolrConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.spring.data.solr.config; + +import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.impl.HttpSolrClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.solr.core.SolrTemplate; +import org.springframework.data.solr.repository.config.EnableSolrRepositories; + +@Configuration +@EnableSolrRepositories(basePackages = "com.baeldung.spring.data.solr.repository", namedQueriesLocation = "classpath:solr-named-queries.properties", multicoreSupport = true) +@ComponentScan +public class SolrConfig { + + @Bean + public SolrClient solrClient() { + return new HttpSolrClient("http://localhost:8983/solr"); + } + + @Bean + public SolrTemplate solrTemplate(SolrClient client) throws Exception { + return new SolrTemplate(client); + } +} diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java new file mode 100644 index 0000000000..2c16a2cdbf --- /dev/null +++ b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java @@ -0,0 +1,62 @@ +package com.baeldung.spring.data.solr.model; + +import org.apache.solr.client.solrj.beans.Field; +import org.springframework.data.annotation.Id; +import org.springframework.data.solr.core.mapping.SolrDocument; + +@SolrDocument(solrCoreName="product") +public class Product { + + @Id + @Field("id") + private String id; + + @Field("name") + private String name; + + @Field("category") + private String category; + + @Field("description") + private String description; + + + public Product(String id,String name,String category){ + this.id = id; + this.name = name; + this.category = category; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java new file mode 100644 index 0000000000..1f57816dd6 --- /dev/null +++ b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.data.solr.repository; + + +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.solr.repository.Query; +import org.springframework.data.solr.repository.SolrCrudRepository; + +import com.baeldung.spring.data.solr.model.Product; + +public interface ProductRepository extends SolrCrudRepository{ + + public List findByName(String name); + + @Query("name:*?0* OR category:*?0* OR description:*?0*") + public Page findByCustomQuery(String searchTerm,Pageable pageable); + + + // @Query(name="Product.findByNamedQuery") + public Page findByNamedQuery(String searchTerm,Pageable pageable); + +} diff --git a/spring-data-solr/src/main/resources/solr-named-queries.properties b/spring-data-solr/src/main/resources/solr-named-queries.properties new file mode 100644 index 0000000000..cec59cbebd --- /dev/null +++ b/spring-data-solr/src/main/resources/solr-named-queries.properties @@ -0,0 +1 @@ +Product.findByNamedQuery=name:*?0* OR category:*?0* OR description:*?0* \ No newline at end of file diff --git a/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java b/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java new file mode 100644 index 0000000000..52a1a2837d --- /dev/null +++ b/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java @@ -0,0 +1,117 @@ +package com.baeldung.spring.data.solr.repo; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.data.solr.config.SolrConfig; +import com.baeldung.spring.data.solr.model.Product; +import com.baeldung.spring.data.solr.repository.ProductRepository; + + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SolrConfig.class) +public class ProductRepositoryIntegrationTest { + + @Autowired + private ProductRepository productRepository; + + @Before + public void clearSolrData(){ + productRepository.deleteAll(); + } + + @Test + public void whenSavingProduct_thenAvailableOnRetrieval() throws Exception{ + final Product product = new Product("P00001","Desk","Furniture"); + product.setDescription("New Desk"); + productRepository.save(product); + final Product retrievedProduct = productRepository.findOne(product.getId()); + assertEquals(product.getId(),retrievedProduct.getId()); + } + + @Test + public void whenUpdatingProduct_thenChangeAvailableOnRetrieval() throws Exception { + final Product product = new Product("P0001", "T-Shirt","Kitchen"); + product.setDescription("New T-Shirt"); + productRepository.save(product); + + product.setCategory("Clothes"); + productRepository.save(product); + + final Product retrievedProduct = productRepository.findOne(product.getId()); + assertEquals(product.getCategory(), retrievedProduct.getCategory()); + } + + + + @Test + public void whenDeletingProduct_thenNotAvailableOnRetrieval() throws Exception { + final Product product = new Product("P0001", "Desk","Furniture"); + product.setDescription("New Desk"); + productRepository.save(product); + + productRepository.delete(product); + + Product retrievedProduct = productRepository.findOne(product.getId()); + assertNull(retrievedProduct); + + } + + @Test + public void whenFindByName_thenAvailableOnRetrieval() throws Exception{ + final Product phone = new Product("P0001", "Phone", "Electronics"); + phone.setDescription("New Phone"); + productRepository.save(phone); + + List retrievedProducts = productRepository.findByName("Phone"); + assertEquals(phone.getId(), retrievedProducts.get(0).getId()); + } + + @Test + public void whenSearchingProductsByQuery_thenAllMatchingProductsShouldAvialble() throws Exception { + final Product phone = new Product("P0001", "Smart Phone", "Electronics"); + phone.setDescription("New Item"); + productRepository.save(phone); + + final Product phoneCover = new Product("P0002", "Cover", "Phone"); + phoneCover.setDescription("New Product"); + productRepository.save(phoneCover); + + final Product wirelessCharger = new Product("P0003", "Charging Cable", "Cable"); + wirelessCharger.setDescription("Wireless Charger for Phone"); + productRepository.save(wirelessCharger); + + Page result = productRepository.findByCustomQuery("Pho", new PageRequest(0, 10)); + assertEquals(3, result.getNumberOfElements()); + } + + @Test + public void whenSearchingProductsByNamedQuery_thenAllMatchingProductsShouldAvialble() throws Exception { + final Product phone = new Product("P0001", "Smart Phone", "Electronics"); + phone.setDescription("New Item"); + productRepository.save(phone); + + final Product phoneCover = new Product("P0002", "Cover", "Phone"); + phoneCover.setDescription("New Product"); + productRepository.save(phoneCover); + + final Product wirelessCharger = new Product("P0003", "Charging Cable", "Cable"); + wirelessCharger.setDescription("Wireless Charger for Phone"); + productRepository.save(wirelessCharger); + + Page result = productRepository.findByNamedQuery("one", new PageRequest(0, 10)); + assertEquals(3, result.getNumberOfElements()); + } + +} From 74fccfb5247345dce41afe29cec3cbcb632a0061 Mon Sep 17 00:00:00 2001 From: mujah Date: Sat, 29 Oct 2016 21:51:11 +0800 Subject: [PATCH 028/115] pom.xml format changed --- spring-data-solr/pom.xml | 79 ++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/spring-data-solr/pom.xml b/spring-data-solr/pom.xml index 9ec017e376..437bc2b277 100644 --- a/spring-data-solr/pom.xml +++ b/spring-data-solr/pom.xml @@ -1,37 +1,36 @@ - 4.0.0 - - com.baeldung - spring-data-solr - 0.0.1-SNAPSHOT - jar - - spring-data-solr - - - - UTF-8 - 4.2.5.RELEASE - 2.19.1 - 2.0.4.RELEASE - - - - - - org.springframework - spring-core - ${spring.version} - - - - org.springframework.data - spring-data-solr - ${spring-data-solr} - - - + 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-data-solr + 0.0.1-SNAPSHOT + jar + spring-data-solr + + + + UTF-8 + 4.2.5.RELEASE + 2.19.1 + 2.0.4.RELEASE + + + + + + org.springframework + spring-core + ${spring.version} + + + + org.springframework.data + spring-data-solr + ${spring-data-solr} + + + org.springframework spring-context @@ -45,24 +44,25 @@ 1.2.16 - + junit junit 4.12 test - + org.springframework spring-test ${spring.version} test - - - - + + + + + org.apache.maven.plugins maven-surefire-plugin @@ -75,4 +75,5 @@ + From 5876c981aa16a764f9390048ef1eb5304f5c534c Mon Sep 17 00:00:00 2001 From: mujah Date: Sat, 29 Oct 2016 21:53:04 +0800 Subject: [PATCH 029/115] pom.xml format changed --- spring-data-solr/pom.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/spring-data-solr/pom.xml b/spring-data-solr/pom.xml index 437bc2b277..bd48a53d06 100644 --- a/spring-data-solr/pom.xml +++ b/spring-data-solr/pom.xml @@ -17,48 +17,38 @@
- org.springframework spring-core ${spring.version} - org.springframework.data spring-data-solr ${spring-data-solr} - - org.springframework spring-context ${spring.version} - - log4j log4j 1.2.16 - - junit junit 4.12 test - org.springframework spring-test ${spring.version} test - From d9eeb7c21a921a2a806fa0cd3f9fb23a956ef130 Mon Sep 17 00:00:00 2001 From: mujah Date: Sun, 30 Oct 2016 17:03:26 +0800 Subject: [PATCH 030/115] spring-data-solr module added --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 95182ab63c..182b2d5147 100644 --- a/pom.xml +++ b/pom.xml @@ -84,6 +84,7 @@ spring-data-mongodb spring-data-redis spring-data-rest + spring-data-solr spring-exceptions spring-freemarker From b3976c7fb59be85afb7ad1ff153b9b09346373e2 Mon Sep 17 00:00:00 2001 From: mujah Date: Sun, 30 Oct 2016 17:12:50 +0800 Subject: [PATCH 031/115] formatting format changes --- .../spring/data/solr/model/Product.java | 7 ++- .../solr/repository/ProductRepository.java | 18 ++++---- .../ProductRepositoryIntegrationTest.java | 45 +++++++++---------- 3 files changed, 32 insertions(+), 38 deletions(-) diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java index 2c16a2cdbf..d08640123a 100644 --- a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java +++ b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java @@ -4,7 +4,7 @@ import org.apache.solr.client.solrj.beans.Field; import org.springframework.data.annotation.Id; import org.springframework.data.solr.core.mapping.SolrDocument; -@SolrDocument(solrCoreName="product") +@SolrDocument(solrCoreName = "product") public class Product { @Id @@ -20,13 +20,12 @@ public class Product { @Field("description") private String description; - - public Product(String id,String name,String category){ + public Product(String id, String name, String category) { this.id = id; this.name = name; this.category = category; } - + public String getId() { return id; } diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java index 1f57816dd6..01ec1fb909 100644 --- a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java +++ b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/repository/ProductRepository.java @@ -1,6 +1,5 @@ package com.baeldung.spring.data.solr.repository; - import java.util.List; import org.springframework.data.domain.Page; @@ -10,15 +9,14 @@ import org.springframework.data.solr.repository.SolrCrudRepository; import com.baeldung.spring.data.solr.model.Product; -public interface ProductRepository extends SolrCrudRepository{ - +public interface ProductRepository extends SolrCrudRepository { + public List findByName(String name); - + @Query("name:*?0* OR category:*?0* OR description:*?0*") - public Page findByCustomQuery(String searchTerm,Pageable pageable); - - - // @Query(name="Product.findByNamedQuery") - public Page findByNamedQuery(String searchTerm,Pageable pageable); - + public Page findByCustomQuery(String searchTerm, Pageable pageable); + + @Query(name = "Product.findByNamedQuery") + public Page findByNamedQuery(String searchTerm, Pageable pageable); + } diff --git a/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java b/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java index 52a1a2837d..b55e65e04a 100644 --- a/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java +++ b/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java @@ -18,59 +18,56 @@ import com.baeldung.spring.data.solr.config.SolrConfig; import com.baeldung.spring.data.solr.model.Product; import com.baeldung.spring.data.solr.repository.ProductRepository; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SolrConfig.class) public class ProductRepositoryIntegrationTest { - + @Autowired private ProductRepository productRepository; - + @Before - public void clearSolrData(){ + public void clearSolrData() { productRepository.deleteAll(); } - + @Test - public void whenSavingProduct_thenAvailableOnRetrieval() throws Exception{ - final Product product = new Product("P00001","Desk","Furniture"); + public void whenSavingProduct_thenAvailableOnRetrieval() throws Exception { + final Product product = new Product("P00001", "Desk", "Furniture"); product.setDescription("New Desk"); productRepository.save(product); final Product retrievedProduct = productRepository.findOne(product.getId()); - assertEquals(product.getId(),retrievedProduct.getId()); + assertEquals(product.getId(), retrievedProduct.getId()); } - + @Test public void whenUpdatingProduct_thenChangeAvailableOnRetrieval() throws Exception { - final Product product = new Product("P0001", "T-Shirt","Kitchen"); + final Product product = new Product("P0001", "T-Shirt", "Kitchen"); product.setDescription("New T-Shirt"); productRepository.save(product); - + product.setCategory("Clothes"); productRepository.save(product); - + final Product retrievedProduct = productRepository.findOne(product.getId()); assertEquals(product.getCategory(), retrievedProduct.getCategory()); } - - - + @Test public void whenDeletingProduct_thenNotAvailableOnRetrieval() throws Exception { - final Product product = new Product("P0001", "Desk","Furniture"); + final Product product = new Product("P0001", "Desk", "Furniture"); product.setDescription("New Desk"); productRepository.save(product); - + productRepository.delete(product); - - Product retrievedProduct = productRepository.findOne(product.getId()); + + Product retrievedProduct = productRepository.findOne(product.getId()); assertNull(retrievedProduct); - + } - + @Test - public void whenFindByName_thenAvailableOnRetrieval() throws Exception{ - final Product phone = new Product("P0001", "Phone", "Electronics"); + public void whenFindByName_thenAvailableOnRetrieval() throws Exception { + Product phone = new Product("P0001", "Phone", "Electronics"); phone.setDescription("New Phone"); productRepository.save(phone); @@ -92,7 +89,7 @@ public class ProductRepositoryIntegrationTest { wirelessCharger.setDescription("Wireless Charger for Phone"); productRepository.save(wirelessCharger); - Page result = productRepository.findByCustomQuery("Pho", new PageRequest(0, 10)); + Page result = productRepository.findByCustomQuery("Phone", new PageRequest(0, 10)); assertEquals(3, result.getNumberOfElements()); } From e8dc2be8c1637d81ffa90e3b080100d35201cbfd Mon Sep 17 00:00:00 2001 From: Ankush Sharma Date: Mon, 31 Oct 2016 12:07:36 +0530 Subject: [PATCH 032/115] Added ErrorController, edited web.xml and added error pages code, added errorPage.jsp --- .../spring/controller/ErrorController.java | 52 +++++++++++++++++++ .../main/webapp/WEB-INF/view/errorPage.jsp | 13 +++++ .../src/main/webapp/WEB-INF/web.xml | 5 ++ 3 files changed, 70 insertions(+) create mode 100644 spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java create mode 100644 spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java new file mode 100644 index 0000000000..3da613cd56 --- /dev/null +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.controller; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class ErrorController { + + @RequestMapping(value = "500Error" , method = RequestMethod.GET) + public void throwRuntimeException(){ + throw new NullPointerException("Throwing a null pointer exception"); + } + + + @RequestMapping(value = "errors" , method = RequestMethod.GET) + public ModelAndView renderErrorPages(HttpServletRequest httpRequest){ + ModelAndView errorPage = new ModelAndView("errorPage"); + String errorMsg = ""; + int httpErrorCode = getErrorCode(httpRequest); + + switch( httpErrorCode ){ + case 400:{ + errorMsg = "Http Error Code : 400 . Bad Request"; + break; + } + case 401:{ + errorMsg = "Http Error Code : 401. Unauthorized"; + break; + } + case 404:{ + errorMsg = "Http Error Code : 404. Resource not found"; + break; + } + //Handle other 4xx error codes. + case 500:{ + errorMsg = "Http Error Code : 500. Internal Server Error"; + break; + } + //Handle other 5xx error codes. + } + errorPage.addObject("errorMsg", errorMsg); + return errorPage; + } + + private int getErrorCode(HttpServletRequest httpRequest){ + return (Integer) httpRequest.getAttribute("javax.servlet.error.status_code"); + } +} diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp new file mode 100644 index 0000000000..a94858c6b1 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp @@ -0,0 +1,13 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page session="false" %> + + + Home + + +

+ ${errorMsg} +

+ + + diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml index 29608a17ef..3aecded8d6 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml @@ -43,4 +43,9 @@ index.jsp + + + /errors + + \ No newline at end of file From d100f84ea9c33c3f0ce96d963a43219415b0eafa Mon Sep 17 00:00:00 2001 From: Ankush Sharma Date: Mon, 31 Oct 2016 12:11:37 +0530 Subject: [PATCH 033/115] code formatted. --- .../spring/controller/ErrorController.java | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java index 3da613cd56..8ca815b4d7 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java @@ -9,44 +9,43 @@ import org.springframework.web.servlet.ModelAndView; @Controller public class ErrorController { - - @RequestMapping(value = "500Error" , method = RequestMethod.GET) - public void throwRuntimeException(){ + + @RequestMapping(value = "500Error", method = RequestMethod.GET) + public void throwRuntimeException() { throw new NullPointerException("Throwing a null pointer exception"); } - - @RequestMapping(value = "errors" , method = RequestMethod.GET) - public ModelAndView renderErrorPages(HttpServletRequest httpRequest){ + @RequestMapping(value = "errors", method = RequestMethod.GET) + public ModelAndView renderErrorPages(HttpServletRequest httpRequest) { ModelAndView errorPage = new ModelAndView("errorPage"); String errorMsg = ""; int httpErrorCode = getErrorCode(httpRequest); - - switch( httpErrorCode ){ - case 400:{ - errorMsg = "Http Error Code : 400 . Bad Request"; - break; - } - case 401:{ - errorMsg = "Http Error Code : 401. Unauthorized"; - break; - } - case 404:{ - errorMsg = "Http Error Code : 404. Resource not found"; - break; - } - //Handle other 4xx error codes. - case 500:{ - errorMsg = "Http Error Code : 500. Internal Server Error"; - break; - } - //Handle other 5xx error codes. + + switch (httpErrorCode) { + case 400: { + errorMsg = "Http Error Code : 400 . Bad Request"; + break; + } + case 401: { + errorMsg = "Http Error Code : 401. Unauthorized"; + break; + } + case 404: { + errorMsg = "Http Error Code : 404. Resource not found"; + break; + } + // Handle other 4xx error codes. + case 500: { + errorMsg = "Http Error Code : 500. Internal Server Error"; + break; + } + // Handle other 5xx error codes. } errorPage.addObject("errorMsg", errorMsg); return errorPage; } - - private int getErrorCode(HttpServletRequest httpRequest){ + + private int getErrorCode(HttpServletRequest httpRequest) { return (Integer) httpRequest.getAttribute("javax.servlet.error.status_code"); } } From 62de84bb5285f1f094837a8319e5d8b27e0a424e Mon Sep 17 00:00:00 2001 From: danidemi Date: Mon, 31 Oct 2016 16:43:48 +0100 Subject: [PATCH 034/115] Log4J MDC, Log4J2 MDC samples added. --- log-mdc-ndc/README.md | 13 +++++++ log-mdc-ndc/pom.xml | 39 +++++++++++++++++++ .../com/baeldung/mdc/BusinessService.java | 7 ++++ .../com/baeldung/mdc/TransactionContext.java | 29 ++++++++++++++ .../mdc/log4j/Log4jBusinessService.java | 16 ++++++++ .../com/baeldung/mdc/log4j/Log4jDemo.java | 17 ++++++++ .../com/baeldung/mdc/log4j/Log4jExecutor.java | 23 +++++++++++ .../mdc/log4j2/Log4j2BusinessService.java | 19 +++++++++ .../com/baeldung/mdc/log4j2/Log4j2Demo.java | 17 ++++++++ .../baeldung/mdc/log4j2/Log4j2Executor.java | 22 +++++++++++ .../src/main/resources/log4j.properties | 12 ++++++ log-mdc-ndc/src/main/resources/log4j2.xml | 32 +++++++++++++++ 12 files changed, 246 insertions(+) create mode 100644 log-mdc-ndc/README.md create mode 100644 log-mdc-ndc/pom.xml create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java create mode 100644 log-mdc-ndc/src/main/resources/log4j.properties create mode 100644 log-mdc-ndc/src/main/resources/log4j2.xml diff --git a/log-mdc-ndc/README.md b/log-mdc-ndc/README.md new file mode 100644 index 0000000000..29b0c95996 --- /dev/null +++ b/log-mdc-ndc/README.md @@ -0,0 +1,13 @@ +### Relevant Articles: +- TBD + +### References + +_Log4j MDC_ +* +* + +_Log4j2_ +* + + diff --git a/log-mdc-ndc/pom.xml b/log-mdc-ndc/pom.xml new file mode 100644 index 0000000000..b82285a283 --- /dev/null +++ b/log-mdc-ndc/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + com.baeldug + logmdcndc + 0.0.1-SNAPSHOT + logmdcndc + tutorial on logging with MDC and NDC + + + + + log4j + log4j + 1.2.17 + + + + + org.apache.logging.log4j + log4j-api + 2.7 + + + org.apache.logging.log4j + log4j-core + 2.7 + + + + + com.lmax + disruptor + 3.3.4 + + + + + \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java new file mode 100644 index 0000000000..dc33580aca --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java @@ -0,0 +1,7 @@ +package com.baeldung.mdc; + +public interface BusinessService { + + void businessMethod(String transactionId); + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java new file mode 100644 index 0000000000..f5694d0df0 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java @@ -0,0 +1,29 @@ +package com.baeldung.mdc; + +import java.util.Date; + +public class TransactionContext { + + private String transactionId; + private String owner; + private Date createdAt; + + public TransactionContext(String transactionId, String owner) { + this.transactionId = transactionId; + this.owner = owner; + this.createdAt = new Date(); + } + + public String getOwner() { + return owner; + } + + public String getTransactionId() { + return transactionId; + } + + public Date getCreatedAt() { + return createdAt; + } + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java new file mode 100644 index 0000000000..4587f49be4 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java @@ -0,0 +1,16 @@ +package com.baeldung.mdc.log4j; + +import org.apache.log4j.Logger; + +import com.baeldung.mdc.BusinessService; + +public class Log4jBusinessService implements BusinessService { + + private final static Logger logger = Logger.getLogger(Log4jBusinessService.class); + + @Override + public void businessMethod(String transactionId) { + logger.info("Executing transaction #" + transactionId ); + } + +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java new file mode 100644 index 0000000000..de3945020b --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java @@ -0,0 +1,17 @@ +package com.baeldung.mdc.log4j; + +public class Log4jDemo { + + public static void main(String[] args) throws InterruptedException { + Log4jExecutor greeter = new Log4jExecutor(); + Thread thread1 = new Thread(greeter); + Thread thread2 = new Thread(greeter); + + thread1.start(); + thread2.start(); + + thread1.join(); + thread2.join(); + } + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java new file mode 100644 index 0000000000..fb949aa4ef --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java @@ -0,0 +1,23 @@ +package com.baeldung.mdc.log4j; + +import org.apache.log4j.Logger; +import org.apache.log4j.MDC; + +import com.baeldung.mdc.TransactionContext; + +public class Log4jExecutor implements Runnable { + + public void run() { + + String transactionId = "" + Math.random(); + String owner = "owner" + Math.random(); + TransactionContext ctx = new TransactionContext(transactionId, owner); + + MDC.put("transaction.id", transactionId); + MDC.put("transaction.owner", owner); + MDC.put("transaction.createdAt", ctx.getCreatedAt()); + + new Log4jBusinessService().businessMethod(ctx.getTransactionId()); + } + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java new file mode 100644 index 0000000000..e9e0461a0a --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java @@ -0,0 +1,19 @@ +package com.baeldung.mdc.log4j2; + + + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.baeldung.mdc.BusinessService; + +public class Log4j2BusinessService implements BusinessService { + + private static final Logger logger = LogManager.getLogger(); //Log4j2BusinessService.class); + + @Override + public void businessMethod(String transactionId) { + logger.info("Executing transaction #{}", transactionId ); + } + +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java new file mode 100644 index 0000000000..0dec8a9a18 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java @@ -0,0 +1,17 @@ +package com.baeldung.mdc.log4j2; + +public class Log4j2Demo { + + public static void main(String[] args) throws InterruptedException { + Log4j2Executor greeter = new Log4j2Executor(); + Thread thread1 = new Thread(greeter); + Thread thread2 = new Thread(greeter); + + thread1.start(); + thread2.start(); + + thread1.join(); + thread2.join(); + } + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java new file mode 100644 index 0000000000..b206638ceb --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java @@ -0,0 +1,22 @@ +package com.baeldung.mdc.log4j2; + +import org.apache.logging.log4j.ThreadContext; + +import com.baeldung.mdc.TransactionContext; + +public class Log4j2Executor implements Runnable { + + public void run() { + + String transactionId = "" + Math.random(); + String owner = "owner" + Math.random(); + TransactionContext ctx = new TransactionContext(transactionId, owner); + + ThreadContext.put("transaction.id", transactionId); + ThreadContext.put("transaction.owner", owner); + ThreadContext.put("transaction.createdAt", ctx.getCreatedAt().toString()); + + new Log4j2BusinessService().businessMethod(ctx.getTransactionId()); + } + +} diff --git a/log-mdc-ndc/src/main/resources/log4j.properties b/log-mdc-ndc/src/main/resources/log4j.properties new file mode 100644 index 0000000000..dac8abf6b8 --- /dev/null +++ b/log-mdc-ndc/src/main/resources/log4j.properties @@ -0,0 +1,12 @@ +log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender +log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout + +log4j.appender.file=org.apache.log4j.FileAppender +log4j.appender.file.File=/tmp/$X{transaction.owner} +log4j.appender.file.layout=org.apache.log4j.PatternLayout + +#note the %X{userName} - this is how you fetch data from Mapped Diagnostic Context (MDC) +log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n +log4j.appender.file.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n + +log4j.rootLogger = ALL, consoleAppender, file \ No newline at end of file diff --git a/log-mdc-ndc/src/main/resources/log4j2.xml b/log-mdc-ndc/src/main/resources/log4j2.xml new file mode 100644 index 0000000000..f9a2bdcf1a --- /dev/null +++ b/log-mdc-ndc/src/main/resources/log4j2.xml @@ -0,0 +1,32 @@ + + + + # Console appender + + # Pattern of log message for console appender + + + + # File appender + + + + + # Override log level for specified package + + + + + + + + \ No newline at end of file From be967daeb39f0f4a0f42a11568d3c4f278cb7a0b Mon Sep 17 00:00:00 2001 From: danidemi Date: Mon, 31 Oct 2016 17:02:30 +0100 Subject: [PATCH 035/115] Logback demo added --- log-mdc-ndc/README.md | 5 ++++- log-mdc-ndc/pom.xml | 7 ++++++ .../mdc/logback/LogbackBusinessService.java | 17 ++++++++++++++ .../com/baeldung/mdc/logback/LogbackDemo.java | 17 ++++++++++++++ .../baeldung/mdc/logback/LogbackExecutor.java | 22 +++++++++++++++++++ log-mdc-ndc/src/main/resources/logback.xml | 14 ++++++++++++ 6 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java create mode 100644 log-mdc-ndc/src/main/resources/logback.xml diff --git a/log-mdc-ndc/README.md b/log-mdc-ndc/README.md index 29b0c95996..c271cbc63a 100644 --- a/log-mdc-ndc/README.md +++ b/log-mdc-ndc/README.md @@ -7,7 +7,10 @@ _Log4j MDC_ * * -_Log4j2_ +_Log4j2 MDC_ * +_Logback MDC_ +* + diff --git a/log-mdc-ndc/pom.xml b/log-mdc-ndc/pom.xml index b82285a283..9f1d48cae4 100644 --- a/log-mdc-ndc/pom.xml +++ b/log-mdc-ndc/pom.xml @@ -34,6 +34,13 @@ 3.3.4 + + + ch.qos.logback + logback-classic + 1.1.7 + + \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java new file mode 100644 index 0000000000..d15016c5c9 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java @@ -0,0 +1,17 @@ +package com.baeldung.mdc.logback; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.mdc.BusinessService; + +public class LogbackBusinessService implements BusinessService { + + private static final Logger logger = LoggerFactory.getLogger(LogbackBusinessService.class); + + @Override + public void businessMethod(String transactionId) { + logger.info("Executing transaction #{}", transactionId); + } + +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java new file mode 100644 index 0000000000..877ded8cc3 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java @@ -0,0 +1,17 @@ +package com.baeldung.mdc.logback; + +public class LogbackDemo { + + public static void main(String[] args) throws InterruptedException { + LogbackExecutor greeter = new LogbackExecutor(); + Thread thread1 = new Thread(greeter); + Thread thread2 = new Thread(greeter); + + thread1.start(); + thread2.start(); + + thread1.join(); + thread2.join(); + } + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java new file mode 100644 index 0000000000..1e53ef9585 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java @@ -0,0 +1,22 @@ +package com.baeldung.mdc.logback; + +import org.slf4j.MDC; + +import com.baeldung.mdc.TransactionContext; + +public class LogbackExecutor implements Runnable { + + public void run() { + + String transactionId = "" + Math.random(); + String owner = "owner" + Math.random(); + TransactionContext ctx = new TransactionContext(transactionId, owner); + + MDC.put("transaction.id", transactionId); + MDC.put("transaction.owner", owner); + MDC.put("transaction.createdAt", ctx.getCreatedAt().toString()); + + new LogbackBusinessService().businessMethod(ctx.getTransactionId()); + } + +} diff --git a/log-mdc-ndc/src/main/resources/logback.xml b/log-mdc-ndc/src/main/resources/logback.xml new file mode 100644 index 0000000000..7bea9976e7 --- /dev/null +++ b/log-mdc-ndc/src/main/resources/logback.xml @@ -0,0 +1,14 @@ + + + # Console appender + + + logback %d{yyyy-MM-dd HH:mm:ss} %p %m %X{transaction.owner} %X{transaction.createdAt} %n + + + + + + + + \ No newline at end of file From 189bee78720d88d6c5e28c34157df28d6a27c3fd Mon Sep 17 00:00:00 2001 From: danidemi Date: Tue, 1 Nov 2016 22:49:32 +0100 Subject: [PATCH 036/115] Intermediate work --- log-mdc-ndc/pom.xml | 22 +++++++++ .../com/baeldung/mdc/BusinessService.java | 2 +- .../baeldung/mdc/DefaultBusinessService.java | 15 ++++++ .../com/baeldung/mdc/DelegateBusiness.java | 30 ++++++++++++ .../java/com/baeldung/mdc/GenericApp.java | 46 +++++++++++++++++++ .../com/baeldung/mdc/TransactionContext.java | 6 +++ .../com/baeldung/mdc/TransactionFactory.java | 10 ++++ .../mdc/log4j/Log4jBusinessService.java | 5 +- .../com/baeldung/mdc/log4j/Log4jExecutor.java | 12 ++--- .../mdc/log4j2/Log4j2BusinessService.java | 5 +- .../baeldung/mdc/log4j2/Log4j2Executor.java | 11 ++--- .../mdc/logback/LogbackBusinessService.java | 5 +- .../baeldung/mdc/logback/LogbackExecutor.java | 13 +++--- .../java/com/baeldung/web/Application.java | 12 +++++ .../com/baeldung/web/GreetingController.java | 18 ++++++++ 15 files changed, 186 insertions(+), 26 deletions(-) create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/web/Application.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java diff --git a/log-mdc-ndc/pom.xml b/log-mdc-ndc/pom.xml index 9f1d48cae4..7e973b940e 100644 --- a/log-mdc-ndc/pom.xml +++ b/log-mdc-ndc/pom.xml @@ -6,8 +6,30 @@ 0.0.1-SNAPSHOT logmdcndc tutorial on logging with MDC and NDC + + + org.springframework.boot + spring-boot-starter-parent + 1.4.1.RELEASE + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + com.jayway.jsonpath + json-path + test + + log4j diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java index dc33580aca..21d065dc90 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java @@ -2,6 +2,6 @@ package com.baeldung.mdc; public interface BusinessService { - void businessMethod(String transactionId); + boolean transfer(Long amount); } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java new file mode 100644 index 0000000000..1df6783185 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java @@ -0,0 +1,15 @@ +package com.baeldung.mdc; + +public class DefaultBusinessService implements BusinessService { + + @Override + public boolean transfer(Long amount) { + try { + Thread.sleep((long) (Math.random()*1000)); + } catch (InterruptedException e) { + // should not happen + } + return Math.random() >= 0.5; + } + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java new file mode 100644 index 0000000000..ada8f79b62 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java @@ -0,0 +1,30 @@ +package com.baeldung.mdc; + +public abstract class DelegateBusiness { + + private BusinessService delegate = null; + + public DelegateBusiness(BusinessService delegate) { + super(); + this.delegate = delegate; + } + + + public DelegateBusiness() { + this( new DefaultBusinessService() ); + } + + public boolean transfer(Long amount) { + preTransfer(); + boolean outcome = delegate.transfer(amount); + postTransfer(outcome); + return outcome; + } + + abstract protected void postTransfer(boolean outcome); + + abstract protected void preTransfer(); + + + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java new file mode 100644 index 0000000000..3eee17ba5d --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java @@ -0,0 +1,46 @@ +package com.baeldung.mdc; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.apache.log4j.MDC; + +import com.baeldung.mdc.log4j.Log4jBusinessService; + +public class GenericApp { + public static void main(String[] args) { + + ExecutorService executor = Executors.newFixedThreadPool(3); + TransactionFactory transactionFactory = new TransactionFactory(); + + for(int i=0; i<10; i++){ + + TransactionContext tx = transactionFactory.buildTransaction(); + + executor.submit(new Runnable() { + @Override + public void run() { + new DelegateBusiness() { + + @Override + protected void preTransfer() { + MDC.put("transaction.id", tx.getTransactionId()); + MDC.put("transaction.owner", tx.getOwner()); + MDC.put("transaction.createdAt", tx.getCreatedAt()); + } + + @Override + protected void postTransfer(boolean outcome) { + // TODO Auto-generated method stub + + } + }.transfer( + tx.getAmount() + ); + } + }); + } + + } +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java index f5694d0df0..c6750edfda 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java @@ -7,11 +7,13 @@ public class TransactionContext { private String transactionId; private String owner; private Date createdAt; + private Long amount; public TransactionContext(String transactionId, String owner) { this.transactionId = transactionId; this.owner = owner; this.createdAt = new Date(); + this.amount = (long) (Math.random()*100); } public String getOwner() { @@ -26,4 +28,8 @@ public class TransactionContext { return createdAt; } + public Long getAmount() { + return amount; + } + } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java new file mode 100644 index 0000000000..4631c662c0 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java @@ -0,0 +1,10 @@ +package com.baeldung.mdc; + +public class TransactionFactory { + + public TransactionContext buildTransaction() { + TransactionContext ctx = new TransactionContext("" + Math.random(), "owner" + Math.random()); + return ctx; + } + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java index 4587f49be4..415e686cae 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java @@ -9,8 +9,9 @@ public class Log4jBusinessService implements BusinessService { private final static Logger logger = Logger.getLogger(Log4jBusinessService.class); @Override - public void businessMethod(String transactionId) { - logger.info("Executing transaction #" + transactionId ); + public boolean transfer(Long amount) { + logger.info("Executing transaction #" + amount ); + return false; } } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java index fb949aa4ef..96fe63a3ed 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java @@ -1,23 +1,21 @@ package com.baeldung.mdc.log4j; -import org.apache.log4j.Logger; import org.apache.log4j.MDC; import com.baeldung.mdc.TransactionContext; +import com.baeldung.mdc.TransactionFactory; public class Log4jExecutor implements Runnable { public void run() { - String transactionId = "" + Math.random(); - String owner = "owner" + Math.random(); - TransactionContext ctx = new TransactionContext(transactionId, owner); + TransactionContext ctx = new TransactionFactory().buildTransaction(); - MDC.put("transaction.id", transactionId); - MDC.put("transaction.owner", owner); + MDC.put("transaction.id", ctx.getTransactionId()); + MDC.put("transaction.owner", ctx.getOwner()); MDC.put("transaction.createdAt", ctx.getCreatedAt()); - new Log4jBusinessService().businessMethod(ctx.getTransactionId()); + new Log4jBusinessService().transfer(ctx.getAmount()); } } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java index e9e0461a0a..d1a8dca518 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java @@ -12,8 +12,9 @@ public class Log4j2BusinessService implements BusinessService { private static final Logger logger = LogManager.getLogger(); //Log4j2BusinessService.class); @Override - public void businessMethod(String transactionId) { - logger.info("Executing transaction #{}", transactionId ); + public boolean transfer(Long amount) { + logger.info("Executing transaction #{}", amount ); + return false; } } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java index b206638ceb..a686486e8e 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java @@ -3,20 +3,19 @@ package com.baeldung.mdc.log4j2; import org.apache.logging.log4j.ThreadContext; import com.baeldung.mdc.TransactionContext; +import com.baeldung.mdc.TransactionFactory; public class Log4j2Executor implements Runnable { public void run() { - String transactionId = "" + Math.random(); - String owner = "owner" + Math.random(); - TransactionContext ctx = new TransactionContext(transactionId, owner); + TransactionContext ctx = new TransactionFactory().buildTransaction(); - ThreadContext.put("transaction.id", transactionId); - ThreadContext.put("transaction.owner", owner); + ThreadContext.put("transaction.id", ctx.getTransactionId()); + ThreadContext.put("transaction.owner", ctx.getOwner()); ThreadContext.put("transaction.createdAt", ctx.getCreatedAt().toString()); - new Log4j2BusinessService().businessMethod(ctx.getTransactionId()); + new Log4j2BusinessService().transfer(ctx.getAmount()); } } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java index d15016c5c9..74f96ef15e 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java @@ -10,8 +10,9 @@ public class LogbackBusinessService implements BusinessService { private static final Logger logger = LoggerFactory.getLogger(LogbackBusinessService.class); @Override - public void businessMethod(String transactionId) { - logger.info("Executing transaction #{}", transactionId); + public boolean transfer(Long amount) { + logger.info("Executing transaction #{}", amount); + return false; } } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java index 1e53ef9585..614188b757 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java @@ -3,20 +3,21 @@ package com.baeldung.mdc.logback; import org.slf4j.MDC; import com.baeldung.mdc.TransactionContext; +import com.baeldung.mdc.TransactionFactory; public class LogbackExecutor implements Runnable { public void run() { - String transactionId = "" + Math.random(); - String owner = "owner" + Math.random(); - TransactionContext ctx = new TransactionContext(transactionId, owner); + TransactionContext ctx = new TransactionFactory().buildTransaction(); - MDC.put("transaction.id", transactionId); - MDC.put("transaction.owner", owner); + MDC.put("transaction.id", ctx.getTransactionId()); + MDC.put("transaction.owner", ctx.getOwner()); MDC.put("transaction.createdAt", ctx.getCreatedAt().toString()); - new LogbackBusinessService().businessMethod(ctx.getTransactionId()); + new LogbackBusinessService().transfer(ctx.getAmount()); } + + } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/web/Application.java b/log-mdc-ndc/src/main/java/com/baeldung/web/Application.java new file mode 100644 index 0000000000..a700e345db --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/web/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.web; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java b/log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java new file mode 100644 index 0000000000..760e26a705 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java @@ -0,0 +1,18 @@ +package com.baeldung.web; + +import java.util.concurrent.atomic.AtomicLong; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class GreetingController { + + @GetMapping("/echo") + public String echo(@RequestBody String body) { + return body; + } +} \ No newline at end of file From 41da06a7bc7a203e3bb22e27767649a417753a84 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 2 Nov 2016 07:56:47 +0530 Subject: [PATCH 037/115] Remove try-catch from Test classes --- .../selenium/junit/SeleniumWithJUnitLiveTest.java | 5 ----- .../testng/SeleniumWithTestNGLiveTest.java | 15 +++++---------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java b/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java index f8d9a5dada..180b3d9d33 100644 --- a/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java +++ b/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java @@ -26,16 +26,11 @@ public class SeleniumWithJUnitLiveTest { @Test public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() { - try { seleniumExample.getAboutBaeldungPage(); String actualTitle = seleniumExample.getTitle(); assertNotNull(actualTitle); assertEquals(actualTitle, expecteTilteAboutBaeldungPage); assertTrue(seleniumExample.isAuthorInformationAvailable()); - } catch (Exception exception) { - exception.printStackTrace(); - seleniumExample.closeWindow(); - } } } diff --git a/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java b/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java index 5ec9ade39f..bc8fc712bf 100644 --- a/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java +++ b/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java @@ -26,15 +26,10 @@ public class SeleniumWithTestNGLiveTest { @Test public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() { - try { - seleniumExample.getAboutBaeldungPage(); - String actualTitle = seleniumExample.getTitle(); - assertNotNull(actualTitle); - assertEquals(actualTitle, expecteTilteAboutBaeldungPage); - assertTrue(seleniumExample.isAuthorInformationAvailable()); - } catch (Exception exception) { - exception.printStackTrace(); - seleniumExample.closeWindow(); - } + seleniumExample.getAboutBaeldungPage(); + String actualTitle = seleniumExample.getTitle(); + assertNotNull(actualTitle); + assertEquals(actualTitle, expecteTilteAboutBaeldungPage); + assertTrue(seleniumExample.isAuthorInformationAvailable()); } } From 1c13d2ccf90eae4bdc18b9ad9fb8088f86d55745 Mon Sep 17 00:00:00 2001 From: Ankush Sharma Date: Wed, 2 Nov 2016 21:53:19 +0530 Subject: [PATCH 038/115] formatted according to eugen's formatter. --- .../spring/controller/ErrorController.java | 74 ++++++++++--------- .../main/webapp/WEB-INF/view/errorPage.jsp | 10 +-- .../src/main/webapp/WEB-INF/web.xml | 4 +- 3 files changed, 43 insertions(+), 45 deletions(-) diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java index 8ca815b4d7..c1aa147df5 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java @@ -2,6 +2,7 @@ package com.baeldung.spring.controller; import javax.servlet.http.HttpServletRequest; +import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -9,43 +10,44 @@ import org.springframework.web.servlet.ModelAndView; @Controller public class ErrorController { + + @RequestMapping(value = "500Error", method = RequestMethod.GET) + public void throwRuntimeException() { + throw new NullPointerException("Throwing a null pointer exception"); + } - @RequestMapping(value = "500Error", method = RequestMethod.GET) - public void throwRuntimeException() { - throw new NullPointerException("Throwing a null pointer exception"); - } + @RequestMapping(value = "errors", method = RequestMethod.GET) + public ModelAndView renderErrorPage(HttpServletRequest httpRequest) { + ModelAndView errorPage = new ModelAndView("errorPage"); + String errorMsg = ""; + int httpErrorCode = getErrorCode(httpRequest); - @RequestMapping(value = "errors", method = RequestMethod.GET) - public ModelAndView renderErrorPages(HttpServletRequest httpRequest) { - ModelAndView errorPage = new ModelAndView("errorPage"); - String errorMsg = ""; - int httpErrorCode = getErrorCode(httpRequest); + switch (httpErrorCode) { + case 400: { + errorMsg = "Http Error Code : 400 . Bad Request"; + break; + } + case 401: { + errorMsg = "Http Error Code : 401. Unauthorized"; + break; + } + case 404: { + errorMsg = "Http Error Code : 404. Resource not found"; + break; + } + // Handle other 4xx error codes. + case 500: { + errorMsg = "Http Error Code : 500. Internal Server Error"; + break; + } + // Handle other 5xx error codes. + } + errorPage.addObject("errorMsg", errorMsg); + return errorPage; + } - switch (httpErrorCode) { - case 400: { - errorMsg = "Http Error Code : 400 . Bad Request"; - break; - } - case 401: { - errorMsg = "Http Error Code : 401. Unauthorized"; - break; - } - case 404: { - errorMsg = "Http Error Code : 404. Resource not found"; - break; - } - // Handle other 4xx error codes. - case 500: { - errorMsg = "Http Error Code : 500. Internal Server Error"; - break; - } - // Handle other 5xx error codes. - } - errorPage.addObject("errorMsg", errorMsg); - return errorPage; - } - - private int getErrorCode(HttpServletRequest httpRequest) { - return (Integer) httpRequest.getAttribute("javax.servlet.error.status_code"); - } + private int getErrorCode(HttpServletRequest httpRequest) { + return (Integer) httpRequest + .getAttribute("javax.servlet.error.status_code"); + } } diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp index a94858c6b1..9fc7e523cb 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp @@ -1,13 +1,11 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> -<%@ page session="false" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%@ page session="false"%> - Home +Home -

- ${errorMsg} -

+

${errorMsg}

diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml index 3aecded8d6..e73d772483 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml @@ -44,8 +44,6 @@ - - /errors - + /errors \ No newline at end of file From 362bc6ff9b72fd39c4983ccbd4f13a34c23afdd3 Mon Sep 17 00:00:00 2001 From: Ankush Sharma Date: Wed, 2 Nov 2016 22:04:17 +0530 Subject: [PATCH 039/115] Unused imports removed --- .../java/com/baeldung/spring/controller/ErrorController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java index c1aa147df5..96556bd5b1 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java @@ -2,7 +2,6 @@ package com.baeldung.spring.controller; import javax.servlet.http.HttpServletRequest; -import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; From 961f4f5b1e7ea99b4b25c3d77bcb05621b98b3dd Mon Sep 17 00:00:00 2001 From: Shubham Aggarwal Date: Thu, 3 Nov 2016 09:13:21 +0530 Subject: [PATCH 040/115] Test case created for HexToAscii --- .../java/com/baeldung/hextToAscii/HexToAscii.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java b/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java index a3e0dd431d..d6db2218bf 100644 --- a/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java +++ b/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java @@ -2,17 +2,14 @@ package com.baeldung.hexToAscii; public class HexToAscii { - public static void main(String[] args) { + @Test + public static void main() { - String demoString = "http://www.baeldung.com/jackson-serialize-dates"; + String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; + String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; - System.out.println("Original statement: " + demoString); - - String hexEquivalent = asciiToHex(demoString); - System.out.println("Hex equivalent: " + hexEquivalent); - - String asciiEquivalent = hexToASCII(hexEquivalent); - System.out.println("Ascii equivalent: " + asciiEquivalent); + assertEquals(hexEquivalent, asciiToHex(asciiString)); + assertEquals(asciiString, hexToAscii(hexEquivalent)); } private static String asciiToHex(String asciiStr) { From f1d720919859a0187ef36d89e219c233eb95036d Mon Sep 17 00:00:00 2001 From: Shubham Aggarwal Date: Thu, 3 Nov 2016 09:17:28 +0530 Subject: [PATCH 041/115] Test case created for HexToAscii --- .../java/com/baeldung/hextToAscii/HexToAscii.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java b/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java index d6db2218bf..4c20215288 100644 --- a/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java +++ b/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java @@ -3,13 +3,21 @@ package com.baeldung.hexToAscii; public class HexToAscii { @Test - public static void main() { + public static void whenHexToAscii() { + + String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; + String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; + + assertEquals(asciiString, hexToAscii(hexEquivalent)); + } + + @Test + public static void whenAsciiToHex() { String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; assertEquals(hexEquivalent, asciiToHex(asciiString)); - assertEquals(asciiString, hexToAscii(hexEquivalent)); } private static String asciiToHex(String asciiStr) { From f27e421c89d2c0391837fe1ecf7a0c0f78cebdea Mon Sep 17 00:00:00 2001 From: Ankush Sharma Date: Thu, 3 Nov 2016 11:16:28 +0530 Subject: [PATCH 042/115] xml and html formatted by 4 spaces. --- spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp | 5 ++--- spring-mvc-xml/src/main/webapp/WEB-INF/web.xml | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp index 9fc7e523cb..ba8a836285 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/errorPage.jsp @@ -2,10 +2,9 @@ <%@ page session="false"%> -Home + Home -

${errorMsg}

- +

${errorMsg}

diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml index e73d772483..2240ac0a22 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml @@ -43,7 +43,7 @@ index.jsp - - /errors - + + /errors + \ No newline at end of file From d0d62b53c2bab74a02d0fab6317c468269bf8877 Mon Sep 17 00:00:00 2001 From: maibin Date: Thu, 3 Nov 2016 10:58:57 +0100 Subject: [PATCH 043/115] PDF to X conversions (#799) * PDF to X * PDF to X * Remove created doc --- pdf/.gitignore | 1 + pdf/pom.xml | 100 ++++++++++++++++++ .../com/baeldung/pdf/PDF2HTMLExample.java | 49 +++++++++ .../com/baeldung/pdf/PDF2ImageExample.java | 38 +++++++ .../com/baeldung/pdf/PDF2TextExample.java | 65 ++++++++++++ .../com/baeldung/pdf/PDF2WordExample.java | 61 +++++++++++ pdf/src/main/resources/pdf.pdf | Bin 0 -> 829637 bytes pom.xml | 9 +- 8 files changed, 319 insertions(+), 4 deletions(-) create mode 100644 pdf/.gitignore create mode 100644 pdf/pom.xml create mode 100644 pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java create mode 100644 pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java create mode 100644 pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java create mode 100644 pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java create mode 100644 pdf/src/main/resources/pdf.pdf diff --git a/pdf/.gitignore b/pdf/.gitignore new file mode 100644 index 0000000000..b83d22266a --- /dev/null +++ b/pdf/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/pdf/pom.xml b/pdf/pom.xml new file mode 100644 index 0000000000..078a364e77 --- /dev/null +++ b/pdf/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + pdf + pdf + http://maven.apache.org + + + UTF-8 + 3.5.1 + + + + + junit + junit + 3.8.1 + test + + + + org.apache.pdfbox + pdfbox + 2.0.3 + + + + org.apache.pdfbox + pdfbox-tools + 2.0.3 + + + + net.sf.cssbox + pdf2dom + 1.6 + + + + com.itextpdf + itextpdf + 5.5.10 + + + + org.apache.poi + poi + 3.15 + + + + org.apache.poi + poi-ooxml + 3.15 + + + + org.apache.poi + poi-scratchpad + 3.15 + + + + org.apache.xmlgraphics + batik-transcoder + 1.8 + + + + + pdf + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java new file mode 100644 index 0000000000..72877a465a --- /dev/null +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java @@ -0,0 +1,49 @@ +package com.baeldung.pdf; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; + +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.fit.pdfdom.PDFDomTree; + +public class PDF2HTMLExample { + + private static final String FILENAME = "src/main/resources/pdf.pdf"; + + public static void main(String[] args) { + try { + generateHTMLFromPDF(FILENAME); + } catch (IOException | ParserConfigurationException e) { + e.printStackTrace(); + } + } + + private static void generateHTMLFromPDF(String filename) throws ParserConfigurationException, IOException { + System.out.println("Creating HTML file from a PDF file: " + filename); + PDDocument pdf = null; + try { + // load the PDF file using PDFBox + pdf = PDDocument.load(new File(filename)); + // create the DOM parser + PDFDomTree parser = new PDFDomTree(); + // parse the file and get the DOM Document + Writer output = new PrintWriter("src/output/pdf.html", "utf-8"); + parser.writeText(pdf, output); + output.close(); + } finally { + if (pdf != null) { + try { + pdf.close(); + } catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + } + System.out.println("Done."); + } + +} diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java new file mode 100644 index 0000000000..4cfaea26b9 --- /dev/null +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java @@ -0,0 +1,38 @@ +package com.baeldung.pdf; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.rendering.ImageType; +import org.apache.pdfbox.rendering.PDFRenderer; +import org.apache.pdfbox.tools.imageio.ImageIOUtil; + +public class PDF2ImageExample { + + private static final String FILENAME = "src/main/resources/pdf.pdf"; + + public static void main(String[] args) { + try { + generateImageFromPDF(FILENAME, "png"); + generateImageFromPDF(FILENAME, "jpeg"); + generateImageFromPDF(FILENAME, "gif"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void generateImageFromPDF(String filename, String extension) throws IOException { + System.out.println("Creating " + extension + " image from a PDF file: " + filename); + PDDocument document = PDDocument.load(new File(filename)); + PDFRenderer pdfRenderer = new PDFRenderer(document); + for (int page = 0; page < document.getNumberOfPages(); ++page) { + System.out.println("Page number: " + (page + 1) + " is being rendered"); + BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); + ImageIOUtil.writeImage(bim, "src/output/pdf" + "-" + (page + 1) + "." + extension, 300); + } + document.close(); + System.out.println("Done."); + } +} diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java new file mode 100644 index 0000000000..eafdc07560 --- /dev/null +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java @@ -0,0 +1,65 @@ +package com.baeldung.pdf; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; + +import org.apache.pdfbox.cos.COSDocument; +import org.apache.pdfbox.io.RandomAccessFile; +import org.apache.pdfbox.pdfparser.PDFParser; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; + +public class PDF2TextExample { + + private static final String FILENAME = "src/main/resources/pdf.pdf"; + + public static void main(String[] args) { + try { + generateTxtFromPDF(FILENAME); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void generateTxtFromPDF(String filename) throws IOException { + System.out.println("Parsing text from PDF file " + filename); + String parsedText = null; + PDFTextStripper pdfStripper; + PDDocument pdDoc = null; + COSDocument cosDoc = null; + + File f = new File(filename); + PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); + + try { + parser.parse(); + cosDoc = parser.getDocument(); + pdfStripper = new PDFTextStripper(); + pdDoc = new PDDocument(cosDoc); + parsedText = pdfStripper.getText(pdDoc); + } catch (Exception e) { + System.err.println("An exception occured in parsing the PDF Document."); + e.printStackTrace(); + try { + if (cosDoc != null) + cosDoc.close(); + if (pdDoc != null) + pdDoc.close(); + } catch (Exception e1) { + e.printStackTrace(); + } + } + System.out.println("Writing PDF text to output text file"); + try { + PrintWriter pw = new PrintWriter("src/output/pdf.txt"); + pw.print(parsedText); + pw.close(); + } catch (Exception e) { + System.out.println("An exception occured in writing the pdf text to file."); + e.printStackTrace(); + } + System.out.println("Done."); + } + +} diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java new file mode 100644 index 0000000000..6777ea9c45 --- /dev/null +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java @@ -0,0 +1,61 @@ +package com.baeldung.pdf; + +import java.io.FileOutputStream; +import java.io.IOException; + +import org.apache.poi.xwpf.usermodel.BreakType; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; + +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.PdfReaderContentParser; +import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy; +import com.itextpdf.text.pdf.parser.TextExtractionStrategy; + +public class PDF2WordExample { + + private static final String FILENAME = "src/main/resources/pdf.pdf"; + + public static void main(String[] args) { + try { + generateDocFromPDF(FILENAME); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void generateDocFromPDF(String filename) throws IOException { + System.out.println("Creating a docx file from a PDF file: " + filename); + // Create the word document + XWPFDocument doc = new XWPFDocument(); + + // Open the pdf file + String pdf = filename; + PdfReader reader = new PdfReader(pdf); + PdfReaderContentParser parser = new PdfReaderContentParser(reader); + + // Read the PDF page by page + for (int i = 1; i <= reader.getNumberOfPages(); i++) { + TextExtractionStrategy strategy = parser.processContent(i, new SimpleTextExtractionStrategy()); + // Extract the text + String text = strategy.getResultantText(); + // Create a new paragraph in the word document, adding the extracted + // text + XWPFParagraph p = doc.createParagraph(); + XWPFRun run = p.createRun(); + run.setText(text); + // Adding a page break + run.addBreak(BreakType.PAGE); + } + // Write the word document + FileOutputStream out = new FileOutputStream("src/output/pdf.docx"); + doc.write(out); + // Close all open files + out.close(); + reader.close(); + doc.close(); + System.out.println("Done."); + } + +} diff --git a/pdf/src/main/resources/pdf.pdf b/pdf/src/main/resources/pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f45d226b39874bc6e8db65fde28713f2a7d26140 GIT binary patch literal 829637 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®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Ǖ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 N~?8 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%0AB!iNESYgNe__3Msr45VWL=-{_2Fs3lK9A|6rz zIl4?9BeA)TUqch-rLA^>LQ}rUCP@uj-$Z_%8So+DMw{W?R=iXF)o3#u{#~gcs3Bj_ z-y=7_bCWuqi{E_*et#ySbCw$%lRwRNhB4xaW^H}jxf7cmY57qyl|(GpqaTg(^C z=<}&68a!>Ri-1UhC%~+*t>{TRYXtt_ovNaa7sKiplWi4K%lsc3uss3csjF))uqD>k z?Bv1I-Wu(DAghi8K(1nNjS`B-+;nw0C@XrbM8VJWb{zE8+_DAMq{*TiRy`WV>sBNh_BJ4!Sri|w^>xalZCu!|z` zu)fy9nN}KL*KFy@opaAbJkE~~bI~KdWFQ6>T|Nw81=w=OEbeexVf7N1DTbPL*6$@q zsQD6BdNO%^k;!nV_YFs=KD5#*i%Lx!gUY9H%Kw!teLso~|27b00yV=Gk87 znV!+bYv3G+xBOp2VW6dm`AEZ=) zUE^C?^li)6W-wgd4a65Oh8cP4TdIsNujw;*DBR6qoblLf_bEV6SZf{ zwYF7YZKJt%Yi@0`TZ_RDt+jQn1_^U*lQReM?IVfUXXmQcY4vH#TwGdht&_7$6Nf`U z?wJKLUj*6%fHt3B5-OgtvFn%!$A@b8U2OShjkxw?%@E^R1aVfc6+xak z$01@18>~K#R|-?b!#v#`#`|KP-dof4e&?m$+ZGs9O+s^ZQW(d3VwuAJ%E+eD93+bksg*+PpB0B=t=e%o^ZNSy1?oq8C}R_l8! zSALI@b%pnu@K}?G9RG-9^#+JF!?8NKsH4sh55?~x?CE0#7joqVb07rk_2R6W+h+?n zvcv(zXM=15scJE0sIUD2sW1wN@&;fv57v~8YOWLINbwIswIP4Lmh4x}i7FuREOt#!5~n#)8TxaUga?R}79rlrq|0wfXbaK(3M6rD zAcWDo3Efv+8E)rRCEz&}!ozfx7t~i*ftbt6RNs-o6VWAfVWtR-dyk&*Zu#b}Im|s@ zU6&>(vg1>Jkd1ef8n{mjzrO(ZftZS|=EF(#RpSi!4i1fVfpv`?-1 zVriTiCS4zsG+`1cM4D>*`)Yed4t{Wf9}=;+wMyh#UzLDq+7|+1WXac&(+J4OcQlgB z&t3gAqQ5Xd1;j$UX!F0Mr$j9P5odoZ24P7ZLXan+zY!w);brdX^r^8D_C*P`5n&zo zi5gmo2hykHkU}2MM&$4j=3*Kkf&!VUWr(gJRmW~FWLSo~h8#FT*kuh8WD%R$*O|^> z?9TdmC=xoz{-P|mn@Pv1t1)3tV}GKtWcx|I=AmwY6?Vn?0w19f6{|<$Dkj>fW9RC) z$6*fyo+obP1_QW+d1*~t@WroLjb4P3^&_3il9QFy&PTj&31teggFrkn0$|1d z+g}Wta9ob2Ooog<{!rbFo=-{$kkx5+KyC zq!y)GW&Bq3B?}9)0F5Wjf>=Z$cY4XhScIdqj8#0aYjWZ;w3W0hzwt;{m=J`khk!JZ z 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 ES(SnXdZlm8qET27{O6_*0b*(rumqV}wnm+PNW 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

|OY8gR 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 SqRYEPa?ABg$W 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

u>JIlhLYmhyvG-XA~m+f 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%0DN{cys*|NNeV_q1ZZQsqEM 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

cw=BK#cIT;%FASEen=V-Z3B*Z+_48H_*J?%?6 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

Oe z=CFC8`->*ok=Or3athXHk(?6gDzo-e@@nCFh+`R}Uv)i1bYT-F1gR%sLX^vVUySvn z>)}u0Vk|AH$4FccceXqt9|44$O9jRWFg+Oepb z)*WSCk*q+g^<)4k3Cd?{GJVqtoL&Mc8gSQw#_uB1Fth9)$v?2{9E+}>SoZky4@{Ue z;ayy{1Imp1cL`%Ks$KNaHxJO8D0y&+;xOG{xFONrY09?U^b5}R{xwDALk&~Wt zG1!3TIbtjNc|;dvSL0*S;RB(4peZINV)IuRnYbVuYa@So!qOSsV%hn1x6f>ca*m4V{{tZ**G? z=cJ3L&(4JIm|I+v#5>2h(Uh+dn@RT_;IxXjct(dWM^0QUQka;_UIFoY<0y5a43l9a zgcuNR7$$S`s;JL|td>Dx6(jDwt z6=WjT##DB0H@`*us=O@tScB!<5$?|jJrQY(!;etcZ_P(IOoR;)6XDN15&Py!Ti0Wn zhxzWwiL2|x1-_{QTo!ISPSnF6<&z^GmkVZ8FS@qaDX~Jm)x9BAD|JUl#fBiSKS53rG=qRm?KEyz)6+hlhpb_7KEI{ z9pyp6k}2a8_pzjS7OKvC zIoaZqvkMe6c2+()hF;~Jv@wx&-<6kSun%jurS)CuR$iYkJgwpaeef|wOm z`Wpmjp|zYG=6EtNm|+ssjk`rBg$J?o*Jwh7QmETBHkQ-$L(8KYwjD}e=joMbPAUyK@Zb33H8v~!ok+f zC6TnZ#CC|9=66s5r9^UibZvhbcpiCd_5P8T<1Pu@Lr)iXo|)({c;m*3_yLN=LZwvX z>x1lyn1~{L(v@W4kD*;e71u7x8vI-BLzl`}S7BNuv8?o#_%1PmuvcJ)o1}LpU{bgc z9d@(LwUK;hWmtsd^>HOgq+EHzJ}Aq=gRvFwaB!z$i&KHj8hhO1MUv`mq z{%>Y=c_2A!TQ3NQjV@{A3M|rL$)HT6CQ5C*sI$NSVaS^paZ#g1?z{0E*iOlR64Eeb z_{BLo0Gbq9bN*(DM`q*$!_u6TFJvjiR1sdrSm7k908cp#q@_nF zr{SYUe(Hw;^M$9@s_9aC&OIwkQ`kc&A->&8i`nYhvDZcF+`#*Wd|*E|o{=w?u(Ss1 zmZiuV31_}b!gM@)wZ$d{K7G^363LS5V%ozzwoVv>{Z#=i??`bi^MJ6u*_Z|Gd^iZGx z7ZqU(#;_YF(Me#>LIe2ZQv~=6h=+7szcM2syI}nzzVRui>V66kM(G~M3w3NrvlnPR z6$}(e2Z_F5PZ95wIamWfmv}y-6CaF}aZrbl=}!=Uc+y`|U8vflU9K{8d(i9V^^h|g z&ri)z$`eyQI(j3C52iCCL7S_>GViQR zsqlHhjZ$QfbEXvcZ4%MzDq37ndRmIP+5Z&p6|5xkuzF-eK!zv{2pWCGX~XuippCy6 zyp5O@VhnR(vEi);!td}N7Irq#vgOIFAAoZHyrt^b@eQ75Y6MQ!Lnclx$n`ui$&8$w zhO>R|`hQKI3i_I4uUky5bc}aSe5XCcNDbdzMIb=QDG;CN=ZoEwx%9DJ1qLd+z6BZp zS-IVh35GoDkqzHPh6LX$g{NszpkUvd~K3Q@wM8QLdO{bg82* zkQ@-WSG`qv$S|gJth3}G19dBPX+Ex~i4Pe-S3IJ8sL+PwlvKHWFizjWliv{Y9*8RS z*|+$H5=dMG2bldkUxai*z{!hjdlB?gq6Bip77U5j|1}~CpLx`&)3bQ`uq)`7yG)Xq zGP!Kl`^J@R>40{rkO#lOA~Q0Z7x4M+(}ckrL0t&vbQWXi094k+S2zyB;)#th^RCQauAB09D!wYQGA5RKigM(PCMF7*QGoU_wdimj zv^{+!>CxY8+zWcDb_TZggL{WPCtqL}kTvf(`l2MBH~E zlHgZDa0PNC2{QT#cor(8cxqnGFz6lb8OPP&P7>lE-RM}0c>n=01b}8Vc*&+>z63fU z$lVDDwK06oH`FRQ4~ZlP2WEIE}wH_=>v6(IL~gyVIbRFW_${9pDg6QKcZj@ z;lo7c5+eRZ`DAg--O^hBNg$0*K@;LAg3k4sGWku9^0asWg>mGy^MELX4ADPsJi=yS zeim+w;2c4QA>Zb+xQ7)QV6Jw`3B1mgLS zdx?%HqJgJ8T`{^smc9NUIxi^wZMv2z(_9@K8yo9%781f9g`7`y7IKM}0rcLMwafq}oKqpRo*cGYte{yk zGDcv|aYZ9t4+tC{cMTU&NylAug(fz1x_4Os1dS5H<$`C;G`j(ZHw?rJ)O_MMr(p9S1t{j^A}jE@|$@d~Nc zgisFo2fH&N>fUiIl_+V+709f=>gaP=w2*vE$Ydm^m{Q(MJQ?8A!pMQ!fS@W>*?xiL zr`YLX4T`}i*$v>VX(BqSxs>Yhk*$cm;B=;TV8}!yKw-<+fdf~IeO&DY7z z&8u1YNX-t4ys@ga^-^L0;nLFN=ughDY+|SGr*@1Q99GgmVi8J;pbjB;13PO7r+usF z$Ce0%cZ0!4>5+jKh*?AKbA%J$Z-7Ug**ZQW-QMnvtl6k^wrEg9P~GP036BWCl} zr=sDVsVA}PNZ7=w7rL9MLZbJloN26;STC72j7P>ow!DpyE3~6C829d zP&>~etzt;BrCmL^ffN$=~WKB`1YvS z&+3Lj6Z%K%FE&7pRlF%1QZ!6KhoOag@((fT2L!j9xT+g(0>nlpBur+nP9~QCx_{w3 z%nU^N3cMfsR+w$SUQZ#`gZX#oOt>t}0?MZdt>i&VBO*Cwbm*7*b)0Xgb;!XVl+oNX zy2y*e17dhWgE29vZ$w+P)Nsm>wJh3aLIU6$-%T@c6%PV`K*lUO;L zr(voVu$_#g>2m@jnNpe4d0-8FBCv-ZTZU0A;WosGwmO3T^T^Jzy^JL*11Gvnv0HCU z#tfE7?}-x2$@aN{%yr8P zV)^-f^e=|e?*uVjmTjR@**ksnCyFfQ9=zr43oSBI@V6CZoG6Z~Qp2=l_S*TEs&sA8 zez;tZCpxJ!5bVipVbLz&288-O$v&=aE)uJrmq@`t!HjlEpqPons;yW=LrIGq_fTIT ze!RfvL9Y1mp@oo$%PGoIh&%<^*i_5m(KR2*JFwq#<%FBfFBRm1BddGb*z=&USmt5M zstOkbV~;tp(YSm_e&7W68l|I(ENl14F&x{qBRrw0Gq=`YBd^&M=nYkIsN!P}w)a+K zrzBCDYK_RHZV*Puh%yw2qjBa|$oOg)h3XEO{c3toTDk71AKh8&aG@$()}&M); zzATIpRTBkja@tJgT)c^KZ|RSY6Sp*Fn1EJdEHpu(tHzvgK38p!SmXg@6v|Z+Qew8_ zpiM*f9CY?{S}2_85xSo3zhU_w`xJa-WcEawyIN|o)USRifY78#itB7XJUh-Tt&h51 zz&#E3%tP!6uk1wwEfeJNG`$_RuWcoLL->yD_Ut&7e`{V``VELrVso@xt-sv1TOqF<6^5Zm zrgG{x;V}pi2SM+;&yP@hFb4j`ds3{$m)_nj7t6LS&;7lNi1o>3hS&hR+G^q8R2dB0 zzYfyO(0U;x-D<-V{M4xqsS*^t>sl#uelPUybYhlaOK>OoBJmv_v8lPntC?D7yjhL& za&5a+AR~?^!%fk3j!?}NdrZo4Z~n{bjm~mknCiJ*l&~8~RuDWT&m+8n81rUMNQD1p z?ha3GyTE8?9{=ws5?a+%1{yV~JRS6rIWt^9{~%;sLmwkU4@&r~~Il0!>106Uxp;}t)k7By7EjP@?)^D`#@W_-w8QERMs^T4)D?QXd{%ytjPI%JsYGw;0B?6*_V% z7i?qBJBV$tX}TzLRH}LO1)aa;9odE99o^->6r`QQBcrHq6ooyv4oM&Bh`jT})#xMR z9X=J_7-S#L1UVQu!%=w`4vZpQu8Hb}E)sryEdR&|{t?j8);Q3S2t$rxJIfnil!x>e zvI+*i!Duul&xZsM39vQGMmFAE?|h2_ZkUwsaMXu*GT<-r@7LG7vf17bK%?Qe@%Q`X zuJ6q`P1`46x^|q6ymo?i#4yw!I7AhSxA5@m|y@Nv$+7JsroN!-VicFvN%q?#mx-EJyg4~`GtPdloT2y{}iwt1-*9@&VXE8exyUygvRYU^PvA7F=m_BOZDi6uvNtG-w)NOaYQc!0@`3fVJs zrW0gfAIuni(G5HfECNKhe#q4RIZnEbry8&q3ZIxBJbBPU7xQL_c373p8{`_e57+p{ z9qcSQnFEnxOt_ol1T>UoA7fS9rNH4#qG6j&jp&#}6{ub>Q|IRVdi@IkW(6=&(kpTV zn#tq+RtCXYomCm=LZBfGbM%k^**As;+>l2+rUnguFlU^uWP;7e8^b8Bpq{D5`84SOpyaKT_- zgRz6E*2E>E{lhhDLovfDHW)&jRs{rCI)Y&~JTWi6!w-JA4=gLm65}&73vr2GT=gqc z1Bi(XYr4m6YpkFn*aZ|@@@)b>-i6s8e=&3o+FZDX41rEN7VsDvMD1V~&N>ltMzB5r z1f3zcYSa+5+(|1YBtn72R`<Bw3JWhCtIW4uq(dn@hzK)l9x(57Xz> zq^2~%iGgVVpfuo|4!SLm>sQ;)F)yby8pHlLDWnkrG6?dbaoo} zYwN5YzcOPq-;iT8#g5|?skwH}u*f{q3^!;7FIh6IKoOkB=)ozfb@N?JxWytZI3?hj zVvn}aMrVx;BFYS;$jgw7%2+w(11z6}EZi9BBeHE{RtFN2m=P;OAI3K+u#Dm#H8v=& zH8&q@e5AN+!GOR54s}d4o2zm-=Fc9NS~Nhj(LdUA_!Nt91WyOc7h;wjmz2BfLj%o^ z7~75zXAfMcN*nEmjirAZW*>oOW_!I9c;|;+c@T?;8LtrR~jB^~8ll~3&?Sty+qePK_2-fQ}Pn8ET#Ujcx zlc}3#bs-XmxMIYj@rXEv+lB^rD~XQe5&0%!?b9)Wh_o@1^(XRJkJg{_HBm37&CgfD ztpNfSnGU-bo4tpHrAA`N4UFNZD{yTpb)Yv#0I{;f071jWM8SIl#)#*f8*#8IEG1s= z3Yps{;W3@2jyL+Q^W+jeQ!5f{+ybSP3XC3xqaCphvhL$m=8aIlg&qi2I$#1O$Om;R z2!7MU7fXndS%BmR9&!*bK@Jt;r`4y(34kSr`8Q-&}-}+yhKS8v%lvE zX}#mK7a1isDe0TIWyC&~9n2nF+8lyAaURB+3gO(Q_`GQ$`#kq-2J6nQrPNDWBLs8p zDZ67qWp>3rnZ0!*_3$;V--+UEu}c?Y>qIn(2%uZrU#Jy}hQO0dr*)x)zHiszSfv1n zi%EwhYhep`6uusSScEPg5Ol5-4?;(Mpy+TC!q22R;OEyp)YPA4zM%PzieTMnq93pq}wK} zIA~dgk*k`poy(SQ726zajuUIEv)grYW14PSqjFJ@7&w*KRjhjyyjP5196EkI41&O$ z?&Al^Y^a#&@jFbfc_jZrsbwSSI3Y0%(H9#7{soKyWZsotVB1hCN6V_0y}@@`%Y(q& zvj}=MaSv_Vv(F`#XC%>z9}Wu0Bh(qj#(|R`pSp)^<-iL#p1Uy9#1HT_9lXbcGtI5J zmahvWuHpU4zD_+)~i0*3^;SE9;<@rXu(p~Qc zN%A`>IYPR-PTZnp?p|{o@TwIxN65Yh%R+hk2f>S${so1T6q*81)5r7q%dq{*R*SxW zZ$1(sWP7hVVnPrBJYp_k0Uih&rtBIhh%=r3ohJ4~ny@J6GU*VJ1Ib{n=GZkeki9uI z(EmKNl3I2hCZ6(*UVV~*q%fb_A_y6gEIrL$-U#>v_IhC@**{}`eteoYaa{2Wn9F|u zO1FqYX18kc3z(5>>$>{~d>ab8pBym#in*Bn{uQe1*CS{*JoU;M^LO%fRO4hW%p2D? zV81AvA+StDNI3;?U_Gx4lqqY#Jb@v~`j_X~A^Zl8H%kK!>knX4_yGHrSk<--5w*>y z->*E$#MAYa_(suBr9)WVwDl;L(m$kB2rcY$+pcXDGt{?{nXU4kIgSLG-JT`<90+RmVDPda|ItQYo3_XVGUSM= zHCv+_k*b>i>pO18=KAhTDCvNv+0P1~Wl2{`>zhNuZ-$N33@eoC$*=yNXu$VV?-BXG zXhQ2S2{(xCq;J6KJL9`zrbeAc)AVv^Lf+FMV_v|^p(5Sq*W>8VN0__Q@5R&jfbVxq z!4W3!u`F!K`HM1O$_c95NkqVN79o=zsHDK4qhF^#_xqY4XQiB56z66WCY4v)$HK2%?4Ch#wR{uJ854Ho%lxr>pd=#D)h?8o13|w%7bth7m|$H}m259Sdya!s2~NJ4G#H1N&mOWRF9r zx6xV84$0eQS{WS5kwxB##+PO-DqG%?kiUL!&y1+h@lMY&eDL@CF|q`YXmS{1C4`I$ zkU?8IE~u||cP4=(QycYfMq5#DghUz~>Wt-_*N+tSTDMm_`S!5KEQu!}2VnLT`3kRf z8lSoTjOCQfUT<}qI2y*vX`D(xZ;zZ3=0;S{m*5Y2wriV&IH11R97r=H-$nMvhAZE1 zlib+*gf=mE=CI-@?C(WfAvj>)|0e0!s`lP{gq=)_>L#gVWy2c)zZA@y^oLNz82G^z zCso&LSHsgQ&aB1*Mu|gsQ?I%p#$#2*DOgFNb31j+*NEEdS=f_&9tiKeFWV{=d4_TW;YTGxC$&gX{Wl?Hzw_3nw*c=>&6- zcUyV|Dm!1Ao2KAWmC&S?awK}MWWGV<*Cw<1XgT`pGx&r;edD})P9L9VaA7As9ospK zF&$fcY-JdKe%DF67a1pdbpJ->W-hv=i<0cA9z5Q}4f9TT^> zFjk~=0$hsN4Wo|;4Gr;0p__K>WW2*O?)nrm)op)Dwfv5x&D161bpjqm(&JwtU;5=4 zo=*r><~(h;CM z4b-I+x|u7l2i6wo&i-Q%PsYfDTlo{{%6wEI#yEk24#Sd$D1T;bPAqJZ^@O)sM6ol@ z4X0+AMrNMdV-U`&_zU>2&GvSk#<*;XYewu(mY&Y< z9--uMybn(@)8>7Z`|*s?_hh3Q_~Z3ES}jhWSEQ&Xc5Q|V4`T3tQn6+ zbgt1MoL8t^DPj5)rD*m${xKQVwp84q+<|Kn|6`Jt3=jPJvk%8Gf_e|-VLG1Q$Z5Nry_#Hr9ce?KGHgM1wkb_6C>tRe@_|@(ni0b0Axd4ZR#9ZnfZx z%jgFd=YiI;_NHW5)h5Jnu6FVYEP@r%RR&u)WXD_+n_{?6-*0U$T^-qNRta?eSA9;4 z?IJI!CIQzn_YjkCd-m$z2}ZURyl)X1#qvR8WgX@`NQ9QAysj-8r6KWTO~UgE(#y;q zRqU9hhd`{-Ju>ySF=s5gUTV-DLpN^aiJF^*Yrur|s7|Liiz8S*6!!L;>-k#lEBvq_ zg4a^V%bF@pqPlLXnILU&-aJi3J8U0vO)YYx+WURlK_w2=aG*w_Grj zn**(7zl;TIz{!trBftIk_p#noS9KUwKkBbdp(*Tz&>`L0Mlil!@iE6`;bS|`2m-i& zF&!fX@s2!b`4ecaVe>X}{f=&G3HDt33CF6^T78q6%Vd?;@64HwQi z7q1hvc8JOB0Fu@K`_2Z_x1Abl7PwVo(M+Z$NWejm7W?+JJF7eZg)lX<8KriGN@vQm z|0#}4uyon>`;jZ!64E+Zs>=qgszjNAHcrPnineHLvpqTZ5@S5IT916(c_({kgi6=L zl*sy*5lf*;^}^jR#a%W!_Y?ql{Hx1JwbCKZv{h%&T8mZ7+&7Ip2ebNyd?r0pqr@T- z(|=?@4}+AtzY9mv&i+bqd;OJrW=t~54#jk;zD`Cbf6Z&h`~2t9q`u;$`*-x}se=sg z7l>JfaAQawqvSGZ_GH<_*Ywzn^F?Q&C9epOhtr*Eh&P@D|9DpHbi8L%YWl;f28Urqe&#|0Un)Po= z{Z9v6SiROA2ZQLfYP?(2dSm){R5b#4A_|mOcSzvYHb`KfFvCa8#jme7V^R3!qeM6y z1t*+s?&0{Qp+ZaXg&PQK^C;)KF`jZs2d?kNR()2>?j;+3-rqTX1q4mP^_D9)mwczk zP(EiR{5h-U()E@zW~mKDx_VdIX-#?c+lDO+^;zTo)vDQ8H%)2xu-YDSWl$z2#Xwm1 zrvW@14JjCD;r{vw!57F5w>)|KfBN#~|RDPR86JyGc!zVares8DAMIR6#^_p}|i>+*T%5#7fe@tMasDK+)g zkRvlke*Ou#b{sMvid;AA5F=UcT6td4nx9cc!D4KgXnjDkvIve5RzxdpVqC)0+qr?k zJ|Vm6RW6NUnE7HMt+D=B@#@x^PlB7QfI zNSUISeE$>CB-}6vl^XIBFty_*azMT0pA?Gs#wCkKuSmCW3`9XC{?vg(uS2=cLTF1C zjZvMPO*f+#jbb9`9S_*szIaqajAHZSxvhtbqsa5uP>qRdQgA7tK7)yl##gPIZ7gV( z(}E~_{5v7Fg!ON*Rn+|H3a_CR(SV&R$!ryp9n0L7cvT9ex+B}!gk6dObK%3s^#B+4{o?Cq1Is_Pzw*xLPFwX~xC++4 z&Y94lI{e@!WGs@iUKPVN$~3mvJ{yu`ldAvdZ61`;`X*# zn>_7{@6`{dqkG{YtLB)=7S$x+6#`ag{c_BrS1ZZFg^WVX!aLTYCE6kj*(V4lt@5w) zA^s|MnR>l6iSn%xbO|?vr(HE$v?EK|=VyF9Q& z*{a?*wm1TKEP=9ztli8@7%tj^SELTcKxsk3U??FoFUu~0NGt&K@2n|l&0JF`e8-yaZb19gny=7+m| zB@9#o0b9fF1A%r8m~jj~pVXr>9ci-0hB3Tbq(D2~p}{W<{rTbv?wd zA-?ulx}nE2(qD;G?;)qXSjTITT({8;!q}lUla7K<)d9-rj$Dn{6lL~}d*8I%=UA)k-!Ln0tVp6w-(Hf04e5} z%^slraNPUHcmbY&C;@)%PFoKQ!h zIx?Nf-SHwT;aKR;f!=j3jxZ1v$=OpU+DW88#1+yba>$Q|mZ$)V#WEXs1QYf)qbf?+ zXchFgx(-K2j#852(!d~t9F>U|r;Ga|=3?EWBWH+fE==s6BwLD!ref~B%uxen(N7GE z@$7>niKjxje(S0%IoL_g4MkkF7uVk|=|92uA9ua0OrN&TqAMpGIA9mSA) z;tH}NzQOVUJp4!WVwX74wp_PS;1hdJsSmpy!*{&R0#6Af6-sVng{fk)3^>+tqN8IX z(feRN-&Rfa7=r{6m)~VP9#auQDC1Q$EQ7pYzG6Smg#8^4Wj1ifnL`xDe{0f%?7t-4 zGV^AuQP~&IGmbI3DuwZ;Oxb?q8AKS57qCo#adm%pjPyVd$!1RKOB8k_H^xgRUu+kO zNR|kIA!Zc#&m<=+*NUPZ>+rG!kZOSst2j;KBOK(^9;Ujgp=Pi`e&APbEm6x?Xb|m^ zB>ZXMEEPP^?YVqgZSoa2feG_$Q;25CMhOeyXAm`4*FiIgP1di+F{uyQNBuUhp zFpWO6EuzzCQ*dFC5%;ajwp)~p)1)7aB4E_;?9b~5oill-8MX_%B-7RKj5WIl`oT`C zM~1}*=z95{>fV zyNWG!1?pK_F=i8Q_>8JOeOG`Q#a}%ZoeVX3T$h$mTvy0KTu@9!94MoCsb>OBM{}{A<&>r}DPf0$_eoo+-pwT2C@8! z4*>iilPQG}FpzzK3tS9h#xmR**5!#BeDFI#(^yWu!FaNi6*x>Dej9GYSHZC&6FUyQ z9^3dw#-q1Sx?$!R<&rhx4bqqj6}zCgKicu*Xoix^{pmE_seszpIX`TsQknYjXz&p= z>X$X^ZDwU^-IBEe3`s2260RT}S1eK3ujI7a`^th-6m$9jy9661=0tSQ(?qT8Z z=3*0ZS_w5W0CUEHTsVCSAU#9*P1Q+Gadz@5d3-lFW0~Ncx&m803jfm^?5DB#ofiKk zuyOH178CbyW;|vrq!|-G=V#bRBj%{$iMg=kWONuJkI$3;U?}#V=Zpd$2OEZOv`GU@ z_HQX^`CGJey(RKUQ$4!nK)ruGA`1HP@t29ACONOa8=13u{_Czr6Zkq9ot+at7YKaY zec4U|jwc~36}kWEnA^>^awN{FBl}|0r)c3}*;_FORE7ftd9k+S(Xe4hBbUbstK>eY zIxt4&D5P&cV+_|s%vsToaS=%V818z}Xf$q#LPN=ihG#}H)dd(Y$IF@2j|uLZ1^wr6 zNZ2S`e}W#MD;!E$6!Dy+p=M4=;KK4bf|z{;OtqG7~{CMLSm6~`Xvx#RA2?NY&I0=~e9q_;+!yjRry)?;OLrL9} z=v!(N={$=ST*hBOq>Mgu5S~?qSYSE>L&Y})!wFf4jKTE0^iu|mt^>ZkUCWRYe0Ok5PR^v zB`SZw9M4`2HI7*@EK^M$Y}BAgOR?*p10@?3s^2G>(;uvTHdY5f6xM-9xC+FIfaE*>i*)h%##!+f!P^c{T4SobfQ`v{(cipE_+DdpH(?j%Z zhqD_s_bf>G)L|x*JCpzrzPgH=F+v@dHMLg9*|XRDN{9ECsW^`@&o=%k`byQSg!@1o zO$M=_X^@ne2u^l#Er-@9;xFFvi9@*D8hq-v8}{UI#eYN90!H1atL{gvZ@3uo@*eBs z#d6LqNBj`+u>Ch%ADl{hnR8*?v~f{9$q(EGlgi4aY{|ue;I-OaAh0%QyRK??WtfD*yP8$z37C)yys(s0RZkwPSPS zPI%K+8Yz*DSI~T*hDCT2=@=Id&uuKbM=>$c4&(YRqG6++YU3axbi7-?3hYhHg00eSMvU6Fv8p{odaWf=PZIuCLtQcY_Pps+hA1^t9$ne$%d= z{#@Xn0th%r`fK%q_w$dP9t=+*GBQwsEPL=~mh$zaQ|&x)5^$drwv*hrQC31tr0lML zPhNUB7Q7)bZzK^q@ZL`NdB!W^-Re=NnTuax%aINiXA<*32#i4?z80IfzbW$_(P`(1ZF>O_{7g9W|@bRiI1Ga z6CoP?_58zPlZeCU4DPF=_vlA+V&d#eO893dT++_UJFA`?MLiX-d)w$$7Rd9@0A4M~sgQz$i0L)pOQ+ygxQ|FlJX?+MaFQ zwnF$m%NMu4%2B5Y`Hjc1{v8#)OCJ}V;!85TJOYYpXP?}R&i5C&7Wbv?OD);w9p2~T zG6)jm-X+5+n=^v-Zqkx99lDxJDR0`o(bEVNEi!YLEWCx^+BQE1HjA8cJbF9k_U=v< zYf!~O81u@Glj9#c^8^D%OXR357$X1iJqpyx*&MPmbnp|VryeD^)o=?4@_kVCrtIu~ zHKv8Wfyon1aP7wfiU*Ea?oKHHiP}p3uQQ?AK?5OEe{-RCxry=P36s$k6!)BWnwvoQ z2<#%Ko&z{|-Q_1(Z{W?txJSMKUST|jI^+E# zkAh`-e$O&&RWn~98jV&0T1Ddg`b#oC1{o~YM?M>H&2`VLoZ#P5m|iCH&^72T(YUJ| za(w#@*gw?~Y+WY|nPk-TC#Y0^_p+JPi8Hva5 zRfjw7HIlrni-6~S>2>hw+R<4=XNz=yetxew_fOLB^hxKB$A@CLp6L$$@WA2O$>fK} z4}ZiJ{Wj$1hCKgnzV$b+sej%Bvdwu74E$b6?wo4->&X`TzTOXHms~>({sy@z{jJ)+ z)?81q(xl=H3G-6&epoJ`wi7`{MGk+4ODGEO(5yNK&j-9qm?!!w+*~>>PSHI}q&N7% zVUNST8XvJV%J~#vgjx8_uftox@2k~-wScb=PEofKhofwH4fj+0Qtl~*oqkF?4k63n z!( zd9A+&9?bm(tb!KfiabBO|DCG-e?6WP7mPm@O2Yz?I%(PY`zc|+n=1l`7__;1Y?*BT zl*w)G%MnX$uBCOKOp7*n<4gK`Ma?Olvx!xSjp z-&5$bph-#f&vP`H4R`cw44KgIEF)jd3N?R_(gBg-$Zv`4ZTcJKn%Tkhg`tfgfA;$Z zx6Z4fKwwtkbFBZf$gX_-nMLVGt* zmRrw7{L$rUY*xf-4?!pG?a}`6xPK?k$_5soj$1Hpa58z?YxrKxUtlx4eDkx7TUKDZ zj$Lpequx?9g+8-~f4fk#i>YzGtA$vg;g2FWtv#(F88&-Ll`pb_!gcyuY;3}?K=+lz zSduRnD6U4#7FuQQ@3eO>4%Slls_UYR3~U32BtVAx_lE!t2Q~H|l5xV>>ms^wb3*h< zXVRWrjoNPHR7OQIuS+9-R@P%ZgW_`!Ai|^Ae6qtlBWj@VH7sABd~ty3n*+2Su{KE7a3&_LZT;#%K+r_3#)Y+;@J50*MJ%+11w43*}&E`tDSLWZc z+L#b>QB=Wg5SW3Oj&nA+EuJTAH~XCG&+W}g18hk>)x@D@K>B89vGI5?U*!8!(p;HbqgX9gb$P*aH*?V~Ze4Z>-=&Zq*7C=8(dX>+_ zb>00F`!p*l-EAn1Zk#>#ua?PUvf?#itIX;ZnX#wlXfY&ncTHm1IZmwCDZiKmwWxyw zvV%D9IS8ZBkV^@qfGqAR3)EhH2@a-7U{2%-7E(s;fy&o4jh3=;uu7Lq{G zNK{mUQ|0;+l>WbZJnI52uBV%f5C5OHN?JrGw2v;T-pEwP{>kBxZ(*jVUQ`|Ake^5+ zDf#oHIVt90@im;Y;&BythE+(N2>*Sdc{0iyIP?6isY&rXS=xo7J4Dj?4)k+o`JY3x zv-vL~#r`g?&iIq*_9KOhG&;VJ8WA-A zUDe6hcOyB^Xu9r_s<=9P3=e2GAk{93SdFqBTbKQL&$JPiIZ&Hitgv6IU6Ty>_Li_# zJ>vDKP3)uV#WB3#ZFfY))O%cVTFykocEOU-_ zpA*o+Gpckc-{WhO`Ls0UTx_C`de4a?!;j?#luT2;3qr`S!##cGhn^$9>%)tgV@sjL z+f`}Y{XBRHV!ZZM?BE|xSUapmxo1KqeR-G~=F2@+x6_uEL3(_Z{Ys6H zTRYqb5al|`=YYlGTmPLj-(5?;ygKT0@6L`|Py$J8 zL;y)_B{p#UCsZE-AjZ%6mP63e`iLFB96I9lxLHhmADnS=i-n$QmR*W|FCkP>YqMA$ zl%sV5-X^Om2MlW&MgHW53F{d!D@_$99sa`YY*$DW5G6W?7$y)E-2fd&5`!{XnPhf| zFmR8tym<6@5~@(W%4kNnkYuZID?T4!JN zZV1ZzEkNL46*PxsIy<4H=*f+*Ys;@($6aL1YEEx|6~7o;d{KUl&GBOCpTsJc6eab& z8K-i>FaMNxV=)=_Rc~6bzC`(vm%O1&zTU`S=8P`LLmE!`nV907?#hr}TSq@@)RkPZ=* zRzjppLb@BIn?wKR829qr`#kUeeeV1J{C)#-X3w4--@W$QYp>a}*32CnF3;pT9!J$3 zZ;QFxIDR?BonI3IP69pPs3L9z!MP}kL6$vatw&ZEfdEx>=iXJv-WZ@09jw)Oyp8(& zBl4a0YMu?&&m=beJK5PA^|>x8f!+hvuy3?scY66>p|*+U$DQrPT2}BIy>KBWIF>>a z*sE}?=<@dLx3X<(%-(jhvAsADY0JZPf8p`UGRDq@8ibO;3@qwiL;3!3-}sKykm8{o zInTmIVKH#qyPoU=ehoYZL}{1nt36m`&v`{jr}2O!1()%(4W}Z2e~>hW+{Uf3Lk}GD6V_Rn z^Absam*hoky0%30i@s^8%4e+Or&g*hWx*!#FP53hW8%MU!*_%qek});#=z8H(5OA4 zVfNSzdFM0Q)$`T(;Q4SW4rs1@zV$mkNL*O}l0;PdFc|qDr1HuntO(GuKR0xk-^KYBp(IBK-mx zV`u>MTD(*vupS~S-{2j3v{)&{n_?JA&9&%IJQ?sgJOAW0k6X#nwY@L*f$w0H#%g{m z$=Tm~)sNrOqkEk?7&pkQeckuW&)joy+2-BQw(44PawBYMnYdKw%*SkKsNSTj*K#|{ z%&-89w%#Nw1-Bi(ca|**Z~8d9+$^$C-4oS#G84g|u~+Sg-cW!?k$%a|23`^T0dzRvk{lZbf-apInP&YN|0{H+d~T8XCI7u;M=0;?>+?Sr>VkM z@7O7Z2zNJ4h-l~;gx{zPd3OeuxsLkcrXT&$T61JXvfxyZb$WDxt)2_H>XDRR^;02Q zb~2ZuA&#w}GeA|o`%+i*l7;N@8Nub&pps|?Rb-r$$Rec zsj_`oTBTpwk)og11T%37){-2f=qB;NvTU+StP08(MKiU)!DCEO;(L!H?XezC zaeJZ8`-z(DJX~fCCKT^?cql(=?)fFby0uBQVwzf3f83(~=(O+f{9!vokd=r%X^s!C zy}3)gWuBaouboa4w?sZwC$e&{hY>!v$(+N5Kox%pUySZz&0_}8mQZ}hD4`}$z>f5l_&giGGB>B|!o zP$zpgyBOwAHA%-VLaVNXI4kfcBxOtbm~)Bl=t~zmlAMS9Fz>={B|VC@_a0@vfP;7jA~3{U&?MY&mMqO zc)pnlDbxwxGi;pL(cujB^09c18@F{WK9x5_bjfCEJy+|J$B1G2CR6lHo^2V%b-6?{ zooDEyWd@E>3r3AiMFHNsul;PZS{&Vgd{A6sBk8AAmTXJ1)A>BcR1brIG-cz%5Yt`X zJs#mz9KFy{@bM5&K!f&|B<*GKuBg>7gFyWb*Gf~;ltgKF?ynVbUEjkfuYMmiq!_m# z8$TKP!UOkP_Du(Wy8}!_)reC;76_m};d(t`NVh_pBq}aYPiW4zsEg$+YFxds`9S`aIR@a4j?C+;xcXOwn-zbsv zePge>?N*vjQ2f;og-y>&vL8rI!})MGV>_{wCQR3=KH&3ODYwAsL(^skOWyUcKHL+2niyo@G@qEo7zu zW_pFLPCCy@zj1`Fw;5(1rw=pxK@#5{?20{pS+R6mk=N(3oBy@DdMS`m3eu$VS_>_f z6M8{Ne%73PYfoZCvmxy+NpC#j z^6YVEm`x;W?*`r-__|P2QZwD>5EN=QZA#q%_AYdlk6WkvQ1>C8Et%Yber&W%Wu~rR)^;<+s`K6k**17!7E85At@AI zqZ9%*VjtM++V44MIYNRMj`VxE&D+1?l2)qnV<+@9BPFy}YYbIMeN%?ClBK+Os21!@ z$T){tws^1u8Cm zBj!3OgsO~iFz?m?^x zIAEReIP(S8d*VXgfGybw%jN0x`b|km;7z^B(G@HXD>-auAZrW0V&S(@?=jl@^2Oe! z7i+DvfV9d{%8MVojdGH48G5*(!#s>bq?I?qyT(r>^ZgTP7llQaQ+F{Xat9ZQ+^Qw( zM9i&Gy2!?ORWkUfOHTxq$pq&~P5dxWwi6sy)K zg9|RDl`G^%H3Hcfys>BiV|&*Y&DG-C3;G6mHq zD+VTp0*|wkDrJFzQI(Hh@y_<14_^m)k7yI|PEh}PF|$X6 zpyrRTc|`=kJm4Q8K>=Z5kw4@4e#MK6gSmlaTL_q2-OTF8uQSBK6^zKH3Fg*>xIo>U zEg&vnUJ=2cQ8G{mS0DuNOGIi>5iqv`#Ky|n70f3nbQLW2Ph{NE zHm)w}5N8>vy(82CL0ce)oQ<6;#2L(eS4R6T!~$vwL7@88b(bTTGav#bIYl`T5)ufc z0Q`Y2XF>O5J#8L>Kq@LAHV_De2|^0B0igmRAPMLuu!Dem3nUN78VqxO|3CamT$VezC z$fzi2XozZ%e1YpAR6;Z&T3#u1VhuA4IwumofY{fV^wRGeNHzPm8Tiee1F^8l$gkhH z$;iaa!pbHfC?qT*dQ0Z6tem`pqLP-jj;@}*fuV&ZI@K5bXl!`LkKT@6VR~rCo$TyO2>)QBW}u?LtEKKs1~X6^)h` zok&Up!_0}8jxPX{L^}5M`vxp}e$8!CbLT#6G6sQJ#vMe{ezfd=*Ra5U)UrPs_Gi1s zK{6oZ9~%lXG71_B3JMxJ8nB^bq9Zm;Y|I}U_OI>Qj|~s8;s3E+0)-#}WuT&>VgUaH zI9NCY|Mhk`39u#ZcR zo)Yb&)+_)0=~o#CpG9fpN2d%|$=*+mDwQ_yg~)3?lghvm&}-Q{^V{)}K!?Z7IiXco zZM)|&CVtouvs4%mGM(7m_-=H|ukuuT)m`W$s*L*ju7iaEvFjd6d5fG>OgQMIF8nyF zp`N6UPXA1{3~sw4uli28R&_|Z$mo^O!z4a>h_1Y@4x67@kIY&NKFTb2czPLr(~UD_ zr&$X7Yx;1Q*2ixnlL7^_r=qjlg^jT*kC&qpkPeGUcl3fTm@fKFxV8^^A_Tg{?o@qv zpR&YiZj&1>Cln{(jK;)=u0)i5xE4LBaGt?^0DKr~_-PrAWeCl6lk>PGQS^C2LWPa8 zlaPC`*gG`38nPrH4O!1iQ1peQ&kZ=lZ%i+`=DtPtH2B)kuBeUwgX<3kt~G)KMOLIX z*>9D2A z4oaGu8xyspqE}>&7UY`#l5sYPu8QW%uMyg;Sy)}5sOTm3O0+^Y>a&Vwt9l}Ophw%jZ=(9c&n3^?MTZx98SNfbUjDGm)fLEXApu+}~J!zm=dX5j2NO z-gIL3xGunp>L9z8A#%ae4b@FkED(u0(M7$!tbaXcfIGdTGQdOZK?U&ShIyNG-KZp@ki_nA=pgjC203?J*nh6 zEyhKhlGLrklSXM<1dp3JnZ7y1*) zPfb31{D8*pyR|8q_>DPx8MS`bQHWPL_Ro6C{!TR<83DHOAZFSk7oqqgPGXdUlQ7LDXIy z?}X;`3FBQ`w`+PSTFzu{;*QvcV~vEz({e20$B7eBseH?YX-!Th;{|6%aNj)m6Zqp@ zcY94%`p6bqj`k&a%C@HYU{)5^HT!y-*gWXOX4xe)HqjzIrw zDrGj-+q`X{6wvM^$e-+pY#P%?inL3G_~j&|;$xzS%@UiVH-Qv&X5EABvk#uoS(-0Y z@_H53;hfxtX-0|4UY2nJySX=bGfNN5#%q1ovVAnRC5oss1?mN7zZIKoE+$PrvAs!@ zP1YhDcO7ljJzYlIjV8hrZ+}DilxRk5%IipIrzxp9GH#sI0Qs8B-ZTFrsDm|1+$AU^ z2d=eN1e?j-y97n)mBN*qQ`Dkd6?~*Jz3MGfpVj%OTubLR&hl^EL9W8`R5HE+vx!a!jft@L%| zRTLL{!FP$Xd|AvdZXkVgY*}O=z+4p(AKtY(y?^l~ov8jHlvMuqyZ9y(>>;kZxBT7~ z1;#0jD0_bviFWXWRx|4~Ohha{)UKZG7#!AGuVSX$9x1U`au6h~Htailu~;x~kB$*& z6yRZJ87&%^ZM{W(fS1K|7b6h!f!B2g){dAJ;R~$xougJ5r61K=uV;m#8-*nHgpq;4 zss|g{>hfd$8W*!v(J-I-)K^_JOYJu#yAl^-jZGAW!oLuWo5_j2u%M({9(80tNxcLG zI-Lo}&$g~-%{qA@Ro3rtB;V}rcsJ(adP>VIz6Yh$*-Mp7`j&OSBeDO$YQv9v=Pfr+ zM?qifZik+(PvQ3io3Yiyp)rZ3>2i+<=(z4TA5zp{j(Pw4T^Tcq^rdX*2bd(Wn^Rxv zBuXk^k6=iTgi9dvz>6+Y*scA#-AOE4!ke?61&nh5*6(^vgJ-t$oRr$0p#(d6Lld>t z_Bl15j;9MQ@Xx{47G}-*c~N!6BBlPe zcpdvRYxV(8f1~Q9Z8x^U_g+Fn$C?Tq-Q_Z34s&EL%6EF!`(`-h^>=(s_^QI<@AV5O zxL+sw+M&*NvVr=Z{x!&>JhnEo4Y1Qoragy zG&b~Dq9muLXZ8|=>6|)G(d4PH5UrFaV3gpHV4kw%T#;H}@_jSKu+m~J{C_F>XrDj(ycGVoaF0JWUwdC1})2Im_|R6QKob`PVz#fN*HE@f(`n*E<8~8KfL@!4~s3N~>cW z#Cn_x+Z^#u;crwD8&A}JQ5stP`m)XZ#S|85e$T!69PjieXX4`A*{^6BqO}cj6AeXb z;_kjRU8Z>Hvhb>>WwVO(%pCT=sp+u6;A34>wr7w^y4>)a2LolNIpc!0UCIJ{TrQze z4Z1f#GvOB;u-USDTj&Y<1Mdp$cbl(kx{ zed1#Hh0Z{he@7!KwG?{I)cnj*BTmtDW%ukSHGx;HkL;y=`xMmr>!Z{EM!moD>1-=R z-&j+bSc$)4qFwB<@op(cJVvC3eg|)XeRXCIR5{P$RKKjO{9Q%#*A|k>$|v>;^Xg9v z#n7&UeA${|#FwD|-%O%2emy@su6N%IjUU~*IZmb-8ipU4f{WqFT0wWWm(raI zSB1rDifk3qyt2n~UfMYYb_b)T;(?emN~D0hG{T+6i?HRV_1jurm!Ot{$lVn7!TQ;| zK90bs_L}29BbkEj6uvI>p@e_Rv^lz2S3cwG{H3MuTD-BbO|ph85#F24onZCbip?Oe zW)h7%X#ZiSx%_qodJzv@R}=wF?P-Uv(;%$z5>%p7z}(yKI;M30Mpll(yH%bWo>Ai# zm!N9!*!1hd((!J)MMlkRGSg;N{57o!zr&%a`Hw-wzIuu0m^8t*kEXx#-u}Eg&Lz3E z8^F8>K7aJ6F{z~RqMkqa>mcz~-sB|+&o}lGgxafq3949bw1nuPmD`2d7sBRrJO=$m zXo6w-x1Jb6at_|?+Vr+N7M&)R5BOBSYU+I_t7okf04D2v;IAG?V+*6If8W}Ik8_54 zp6x@mW8301p_paO>0@Q2pX3!YW@lBQ^1if%VmZ+znbPXJX=NJF?}0TJUBkm<@iMcM zGFk*2dBQ38So*5Rv^wcljgjTMKhuLE2i->f^3=-n(>Y8(4V(*v-u?JKaB6P&%g2df z$LBdXLLU{T9i;Ou4qJ35k#PukW zcnV)Qam4ZS?JDm*b9M>zvwR1j==SS`+E6@tEFVVu5xk{fHxtL>(lTtDz#OAPI!{y9 zdPXX9XbZ31#%YCJtKl@8V>y5k*|?03m3Jo)eqns(RGYNeW~xbY&Kh~)fnYzjF0unOIT zI8BzjtnDUVH!@~6@qMOTddTbz@i*HOBzZO1(-dVTGgKp5ppxYos#ev1fMZc%GOO6YmfS=p^Ja$2Vj@Q$yAWVG!GTW^ij=`C1;@&);n&8@eo0%|wD6D$&FQ;uEWg0Y1T7x@RA9NuwbU_NQGkSW!iD!Y5S$!)0^p5A^ zoyV;Vko(U3fqY19+0$`;8LM9=l97uCA~?8UKxD0q}j-W z7f43g+N>uhJ!BT~B+U~2zNqA!cY#EUdhT1q_%K|Thm0(puQ{EXvW>b=_&n>Cn za?m_d5z3`|CyzDhx?9`#D(Bl0nXgR!u%}62C2IrA%`*%0-D*1ZXOi|3a>Q9J8`z!M+6G17<1=5d{R>B3f=UquOWHs`EMGz#1 zuSTA^mmnqS9UivN79zJ>yratx@Yg3#+2P}dK|29uy$xZ~ue+gP@Fthcgc@ zqArF_%kY9u**qPl4>itTt>sm)H8lQxdleb9VEz-u~+tqy_`ta-#qVOM=B5d2QKg*30+5XaW+XV3nGx_B^*ZqwhZTVJqM&sxcaqw9qO3v?OM3mzut3JF(=Ggy=;t zpf}W8!tiXN+wzSk+7jYBhm(qF-8HA$#JLuqUOXe92PcP+(%yLS5=6!czcGia)+E6` zv{j>AG9^(|_{imUb9Yl57GshD-qORZINu_ub#&Wo9;0W`iS04v1}Vd{Zt|0nQHhN3 z=mN19N_bq|`hYmH31rLtqcBfoG++$hFm>v$ zW?6`1Cc4{v-4#3&UcoK%%z@Sb^MZC)c&WyZfmn+}oMI_x5%!qBfVJ9XWjgoblVp>@ zo10jMWQoEB4XDpxe7q-viuBemZ3)y)Ij;LXNSU~qQ`14T<@(u`m?a_R)H;U}-^?I+ z+LABG8u_j0n119X=(9il!AZY*3cTXLbem>Iv!pvKI6eN`&OnYy!M5bxZHzDpE>AUJ z1|@+qzT2*NoiBs7-}~%M0qvK?o(btwnR*>*eP{L&m?i#by4rcJ56orul~vQ>6y>}3 z0Xc4a^ukA6QrH!}qG(^zQ{-AmJy*Ycj2WXi#DY(56K~v_a8KV(^33|v9Wwg_~;UZBltphevT%@bou`JFcu#c8Y+6AdocJ1DFyyU2P)kF)9dX%Yia>CP$M0*bio1xR)~ zbBBM)<2nGi^Nj(@E7@< z_&Cy?A?8ump)y76ONtoIOVD!a0_z#gW_qi=m8?Lo(8~QRi9!X*9K%ze7+^^sGagn` zC3)08TW{DoqIHVfx??(=DSA=T`9|R46RZ)x>ixim*`&Awtz?sgbuDzzi$)Bg*CRz2r=KZhm?NS2Qw}G<=^M!2p4yy`C$D?zQmH zDlq^YDBm@nfHH@F9oE2K|40(a;1UG2HXTi)uljI)l$>Rvd|1XiTPasbXq03Y>;L5a zZS+UW4Ny2sNh>TUCCk%vuEqu4qg)0lPXjEhg0#wbL?=+Ygvn8#%|RZD;8fpvLlaQH ztpSap!S&IDy3J3Tz$iVPt>`xU_lu0#L@Cmyd@%IXMRb|?zoF2E4x4Uk!~|X7z+Y}B z%b&lMppc?!)=%WX3u-~Dd z3I5_K-&{E)j8kZ1l+s~4)0N#SnAQko)oseO^{U*Y;ekw=CIQRW^&x50aF0`^)guXt zG$f3$%oy#Ie&Md9Vg5_d+o>vwyKk=*wSS%ecD>}ugEVi0tm=x`%oHZP=qE+&tZm?E zDU8>o9{NLWF$Aj~H;3wdCGzs`R~)}}fY{_FzK^VlR_6WOqL^`Q?3c3gTWR^JxD5Zj z>)AKdMzs#<;i0FhHDePVGK~@hWiFH{Z?<1V_D8=Tm#G%-uWxA{)ElVm)TuXzjwas& zmR*>Yv*0m$5o*0<*ZX%*CLuW9UWE3UVy0(cK;m16^|DVnQ5MAPA9;Pp#~7^8WWWp-=4YmJ>7n&y%V)$|TF~ofqC;BEz)j16 zC?OPeXp{49D|Y7UgxGb;^MN!`o)PROOIpy`3@lLcdghKH{H7Y3EmlcQAnilDheS!t zpn%HFv`=-LqF+TzhI_`y8=Lh4Zhd_CK&GyvW^8<=@R}?(eBo~UaREO zX__+&<|se;4e;9YCd)+w9ocn8Hvd=mADWlD6$?a?NK|J&<6Q-gGai2mcMKHP~$?G3%MNWUv=J9cd z^Up00Cx6*EEDAHLJZ0QSwQW=|-(ysqZJ^UguTouLt%~WR87(>tgiD>;dYUR%?retT zwa=$xbd#Q?xOH#@iq0MD9`^VtM#i@-w2bJsjdU-;wpF8GbGMV%zt6!)eB1^YCD4P@ ze7WXz+}+7|o0fJe6_bQUQ67j}O7sPp21(r5`TA-5s8#4f6z<|H6amXME<5DQg3KGI z(p!b1sSfL+=@Vgsf#-_eKu0V4c<&5r!keaW;Q@9h!cSb6_^pKwH@j^;2IwScuM;?5EwMv64Zj>oASM1JiVUxRB`Ifv5p-fpy zrwLoE3X->d8oZG7^n)>H-R#oy*ioHSF87cJ{E?}8`}jLr>+YuS>qFGmZ3P~qh2O6# zOVg|vCTzsUFJ*GN&6r_`m*TvAifo99w)8JgK4f;phus!c4%_`-ZlNEjh<;K&4$fGhlAP(3#j1an`Gsp zrjgy*G)6i1)WBlOm$1h?qeKttJ59Im)uJ?==(Q;Kggt&+51sA788Mm|d&KVRnzXE* zq9aDDzwp4cBc6yqHkdtf@x3X%-?y~e+n1mi37!dfOvAcFr>$A`D9)4PdzEBlJVu>h z`g|fe9ep<)&0D<~D@SJ}^R4w{=n)?)NbVSR+oi3ZIX3BA@1^ZG%-87ut#?7>b*ojq=F@kZynkU6qARwAR%k#BcD z_Xc98PrdrIEkk}boPi9e0RPjD|9cgSeFZiOaFXrL(FRV@Q=CpCd251U>O+;a#`zi{c1 ze6aZ^{86>T+#US&OVB(O7nSbn=2nBLov^Sw&xcYOhG*>#4)#OpZ46kn6IIA}KnzrG z>T{>b>TT7CeURa0K4|k$OdARQZKh8yj9A zsgHoYuWYD~Hrz~?^v@{WHYqPEE+XkKUVMt4*5aKcETowb$Xf>{kzO5{tmj}snU=I! z+!=1!8ZGpm9t~|4zL}W&uGmRHXy{&Xp@GD_0D&3_@3Av~{1R=0^GzXeT=CgpJ7ugw zpHdDLmagt~a5N@(pRQiTHJ!+>H+@?rouqvhdR-P;0=H<=FjldF;N|u;GPEHV_cPpM z3J$U-LcjBYOPi>J3MNt`KS!n2{CINssbIm~;mXLHa@Zt38EpO-4>IsgMBA7Ad4KD2 z|I_jJdLLVN;>OfVFLb~a#c0y7?L#vg(c3uMi8tBKnDpSmM=U5O)^NytE%RXj9Cx;4 zOx_^M&6LoS2v_NQR)lKE+|twqs$80w{^;kac51qIv?t*cw~Fw;)JLV4>oreD!3gYq zyo%PezV}-%yiG)V`JAX7U-KpJX>02iO_A&AYi$qH51|_d80#C5xmq#fKGP=mTd&@w ztCj5mPxA-*o?$#g#zY9mP%#1`<@qrbZRumLWuG(L7U)r=`;+6hn9@*Ahks0Th zC4$0?>@O@1_y&{uNbjItu*z=q`irrk)N9%%UYXYZM;cvO z;rSz7kx+$R@>h!wfy$v8arBxC_{JdM_UDZLFE-x0W5|+O*LLyf zs)lzpEcw@)ZbU=A`*6>7TYMppn_hVv#?g0dcV8x|8sqg5@~0U1{fpa|ptNn+bYclz zX3d1E+LK~Q8^gHx&A!89nlNLjB(ou6?pEy_mHWFb_UyI$Y6WXHJEg5onJw|3N$;Q> zvG?kc&c%?eQFGUXpBlP)nZ|Nh9D4@dp@){XFB ze*}?V2rMYTj|~{f3JUW71>#j}-Tws9(efc+i0djUDu}@OFEA07uvcOJGTi+~FnLA! z!9oIj*uWwtSV)lXFF+9`|E}pD0KIAsjG*T)Gvt2+6k(3b%g2MwFDwj3@a(^K`qeS< zKLGuA)V!J%0rHn&^gjX#bh?13C@@@k!GgSh?e(kF_)i#JY^)s2T-}@@{|@QZ-asJz zWfA?4kn#zN{^)mpUZH=}?^ikOA3?p!;RvWd&9(p8VCNU+1&i`x3-I!Sd3gl?((zY^ z?0-TE45fcZ&Z~j~f$_J2_dgOyfSLJ!=FY2j>Hj6jtAZB+@|QLHKk9Q{K0&YmzW_Eb zFq8xY{yKzy&ou}U|KEY+y_!`D5Y7nD|5UUK00U4^SP)wf04oT1DO?@rKTG~!2&8}0 z-Mm*j0Ri&=GXEf)B@iI_0MCTKgS^UE|0N}_vNHnY|78Z^1tg`Qh%h!E4=@J-Bk*4- zd3A*Tmmsf72L#Cf%lrdKOd%doY+#5B0c`ZI5UsxrlMm6z3>A?`rlUn2HrYJ?||jjJ65%p&V)0kH$iSerS!g3TN(!CH=h*OR4- zH3Z_y3V78(fSP`3t=NFCjjICK!OhMNU=~2v{Ndij$MaJx{;6*MjQQ0sSEH{=fnP1+ z{Uxq`7Y58Th<><|>qpGr3;U7rci&${iSP)zg7UA;Rj`3Ln>kxp+gO;{fz6>%TYEES zTd*q>tmSHE?+CF3--TMZ*#o{stk{3F5OBl#E2t}-a|P><{`m)>6dhchp_XnIt~O8y z1Qu6o2w45c#0l1NvvGw0SX2=nTzr6D^Mg(QAlJ{abp-+-6#q~guSQ=T&wru)PZIGW zyv7iW0=RhnsN*M-0V>LmvtQhz1rQ0~8a-g123!836xhQCaNh#%Lu_6C1p13N{{Z?+ z;{WHKx(fFHQ||rI;(ySI|9|4Fs{-Q>>ixBwdHJtS`#*2me)#PD>05`01o~9k%mwoE zilVlximn2?wv9c+g;Nu1Z|3mR&kyJl3uhZgSEw^ErT!8UvJQYJos9!UPd?x_7n>irCh$Y#AO<+%4-tdd5n(>TpXZ1p;!p60 z)`Ix`8M+dS%_oe&^!rbk50JG&!aw#OVL&_x0xA_EjM#tIAOysV0D9r?cpyJEA|E0x z;u_D7E24lR_PgXij|lY)f#d2CQSNVi0HPnL5a$SVfHUYH*M8#v(N>^##MR%q5J-N9 z5hees5Btx0|Bs>n7fM33>tED_e^KoIWWzsM>L-h-n%M*Xu>Y0;?aZuP!2Ena(@Fnu zedR=G+MN7=)aB&?RxU&Z1%cT{5m@oCv5<1G0;CTxc}clgApAc?fkgstg@bO}EYq>(~b-{ox%dP(_S_l~6KcW@D{6I-6W}d(NPx%n1h_M2=ltTCc zLHM_c?O&AbUrw%ke29JnH10pVT7Qf@8K9_No~d$nfbZ_#d{aG<=^KfmW?R3s%v{TjxUbWm|;)e)J~NjZXMy(9|g;L-UI7%ka2tV zB;Efc#5qC19nV6J(GDS0?CQa>p&`5NjeL$xQ7ql+H+)`~u!l{k-kBzi!%XZ}Y8rMx zY5z*%7WC%%WGDAE()Wh?jc@vnPXiCR^{X6X>y2M4hQ&l_g-svs?GejAYPu|^n_|&u zX=MtV{%qRMpjj==q^QYBxD~6=R45WA!eqimc)EpsZL-28!t)~O)oGIvgJN6)W`PKg zpyo{)M!csnaSW`CI8D5}B)k^^$1;?RYT?m(&7JWH%1vvDbC~ZnX~V)>Uoxz+gasPt zGw3R4TJ9(@UT{V0g zCwK-cMXFt!s5)+@(s3eWTQY`-n~-%{Y{&QQ=4&t6zsn)FEqn@R$kAuim``7rQwS5e zWm51=&U(9gB!Q06?+m-31D-u1scOog8rvk7eOH;W!|BsCHdqZ!>5eIs>b1Ip;Jo+Z z{K)yy@eW(g-J7MBRy7=aI;_;o+BI66%yiQrRMcax?$7vWty+9{?f@F9Uw zm{*gDImHehZ~BP5&z%}&4sc-DMw9cLin%1=of`Qk1Y%Edo3QB;Mik-1b*Smj?{+ch zH<6el^CmtZE`4hA1b>H*_vLd{Pa+cDpyvv2T4|*`XE>P+wn}d?d)`xj=e7R8J*c&a zx|tG>IeG84aNH?lb@F-+nff`g7cnf2gztNDG6VNH-zd-V_k?n-w0pQ|kL||_ZH~Wj z)dJrh(fUTNTF-MXd3#OV#$+iH!vDqx2}Uz5>e6zr$c*!(qmj@o}Om1$nLBJWhV`1a3$_7a=Eo z!~M{C4Xj1!`;T_{Bkto1X;=g>l%U%6uL&)v*W3}DluZky5Ydvi@TUmb|5ozRAgh7v z!mJ2*g)P7K-RXVR<;)e{dH4MgUV0AGj1UZCOZ|_vIUTDk?;}EH@8Y>SpOWjc+O^-| z2C}Ckxu;)cSWG z##Z08|3+qul%u4k$K;xQZQ_<2*4Juqpz@0BVRT2hToEW8KXw02#G4rE#;BOl!F}5^ zO1tA&B8a_}}p`K9Vx5rQ~s3RY~~WGGS*i@;tV zQJX}c-sBXgor9}j<^7!83kkF;x!cBXmStQwFunJ0pWwkb5>V^p8Ve~SeexnE)H6N& zKao&9rTXk}`G!R7&h@ak)^K(7`%O|90~00A>vHb`Zh8aXo7{h7iZf;98fzO~jyt0l zo+kfg?tMHZhR5oP(a7-Q73SNIl9x*fpY!iZFw}ZNha&6RmqiB`=2O{-^?TqX`cNMD zl12@x;2F*_!9?+z=+NY>1d?h1tx9^C&d{6ulZ=zp+P9hSqvsT3hQz#2tfXQfdcBWd z)0`w-QeInjUE4nF>{!b8H+W!b=$gQ$LHwc|R~=)2k&13)D^N#}}R;p~t!u5q|h5+k(wY>dGNf?7g=0{4${6C&v0}+%qD5+?LcSO$CcduvJ$R z6cQ5WSX(L5AQCdB7P9Hr>QeOIojgTLMHkJJJUu)69@Icb*~;X>G*6v2 za(n8=?%b;k8{%{aa6@@Gb@HUfEXyWm%f$oj_*$=MW2;;vQ)(P{^%XJaNVOtS>*5qK zOiBY^jDq)64BQLT)vb1MR(T%g7!8}RX)-T|T9Kcb#}J9USc zu~W5qInzjOxib|svv);~cB{+sCCubAwKh-u%{9Z`$Qcy{@VQ{zK1f-9)yi{FK+c_) z>KANkVvVxsf9oMX4M|jU?1TDt66@EVP-`>1b}?h+x9kGif%vR&q0z)%YwFL@Jl`=^ zke0tB3;UifrEMqp&Sqj{=UAH>rka)Lf~JjIp`QkBpN)Pme=5C>vUY}#?pA3QhtgeX zrisDu$zY#ur4!%Co54m56ItFcp3C-esn}kL*7hyowcKjK9GM~CdA z45M4lrT29+l`{7_*?lay&x3wkds>y{nGqlE$A7MwvADjelP3 z){T$((8=%QFrz4c>v$s(a;^q_*pyBrF)>_E2}aIPjAfsaydGCJ4(H0qj1>9OYU8$I z`=HltthAX}UaiG~I}Iuyz?Rbt+CxLK?Z4&z4g8op*inY zL(=g<6Gn+T=;$mbR>ajvzTFrd#zCU&IFu0#+pNfu z%_p3_u?FvY-+W4{X%K~?htToeH`UMnLf!H73AM-wey8_Nd!(j%pJcz$IOtBuZV9pTjvd;*N_!gk&YdMwDySOpcO0oCcdRkJ7 zn(Jt!r2I0tH#8!v!bERR$SvU|hUs!-xuaL`rPhNpWfME?Z?_k4eDppUc+iyE?{m~O z8k*>%R%vby ze>YW3;&BT~CXM6aHPt9V)WR2EqT{$4JtlhBSni3K1nzB8J>SWw4pw3AojRMhZF5Zx z?YA$0Ooe01D)MC{y*V1l#ZW#ol?S z3d-`6+6_Uf4DtyPk#|$!@SLdzS=Pmjn^j_;QaU?u?9g;)Ix5K%0;zkK?Vy`>PVNEx z8G?CI(^9Y3-y58LUFYV=Lpt!yqjf(Tvu^UT@>o+3>XvYn(?*6ZnA(2_UQyQHQ5anA zq!W5apq!a?v-j=OmpwcIk@LovH2ckcO3xcwYo4_v-kenGYBLUrB?^fhy$p%Pfbj(S zwhlL;ZdKjV*NPl$xQ)%!P`!|xA*XjBp<00KQroA(?L@J9y8(B_qcx%u(+?TC<1%X( z9riLk{l$ItXE>;254iXe)oW5d3=GU!rt3)2UU=WiOnVacmccb=m?c1)AdLk-EO~5g z@Jm_N3*3-SZFIv&%VTWe5j@{({GDgopr5g-Tl)J`jn?*Nve-SovWR)OMG)-7));z_ z2;iKI8HI3HHgnrP2xrApNymw_9uJe*vxi4Y@=WNuP^w!+w>S{JMqwB+7h12VQMW&3 z;&JtHt-a(T1UlJMsC4P;p|<{%EPvOuCcxJeKy!YIbL2l0$9 z9%NJ8ZgHQKyLCJ-t5#lLwxF)Z6aGK!y>)O@+qU)%ad#!|#E82QcXuJ~LfqZm-Q9`1 zyAmbt#62M%qF(}=z1jEdbKiSz)mQKPN2&?*nrrr4Yj!tP8RPklXBcV%Tz2fRqiSf2 zmkF`@;cFFMQ97&28(0fQo4iT^^7c#HP!Mi2M?|bHQCkLQaO5iP1Y!&WEh(F;4~tYZ zQ&NvbJAnF@xsi*X5Ljyc)#@FUE=7pjpm`z1zV}2KrZQ#{3VbmNwn$hN#Sjh^kn6d* znCs@3we5p(scQ_JSfhGxM|nqi<&hy7WM-bstN!j(2={7j?2XP;t{N9E8x>}o8-X*D zuL#T~oY)J*WeS)}!VDHwniM3lCekM7M(t3vpWZBJZD&??T~C9K?;B#XR%SRZ<-Q*; z86G9H0C0f#dS2T44#F?`t8whT2si_BZSv@NG#mTtA#OGcD>s187L^-IZh!`#g8+*8 z6H<)^h8RUJvB5w0=Q>D=&BYz0DC3qaiHroUsKIb%y?9>7ecxZ6ymFX@L_~EE*cUKu*E;^^AC=5=DWpZaW4uImQUSrEREf zNDDV)5<Q1g|C$%h>&Xec!`6`om$pV|f-Fvqz+ zEN)?ny!tS1qKNO;4!pPa{x}p7aBudVmU9+C11p@t#K|6{By0yZ>V7i3gOLw35!{Iu zHTaRd0%y6_>U1eFj;>5<_=j04XB$dk>A$L*zSxZ=eMXM;~KiSs+2sG2e_N+t~AI^a~&s z^+L665{RoK$k7e`{A4%h6fpDZ-u5>J_~V&~@tVgl7d3?4N4j<|eW+ryn6KfRkzYBY z2jX9U^9epDpI)#O&;9%^A_8)c0oo8?s=ub4A*Etp4N|4cXoHbQ!5h*^Gtq~?E0`E+ zp))H5b{ai|{IooiZZ?9!n{)(fIi2+&9KFF+K%CQYoP0GU&wirV0w-k%3>yB(`z%F2 z17yp^y3~=g=rj%TGi4Y%=-a+jizlz)AhuOFthr=!I@nRqXz6tO$etv#VX~H%vK5K3KH{J~*TR*`G;EM=6l00vesNXi+?gY>7hY*RfnOY|qt7 zv#3IBfx;G4PC;g!Mc{OF;x(w20jiwn)B(RNx@>hNKgJHUjONuAiZX~wCtSJg^q2IPy+Q_% zQk1v*gvM1PFUYtNpSaJP0edsoB%+W<)dQS6q(0?y8(?~T9610lYf1_Xfbo{J?5Hbr zU8BVW^b^rX7a$Z~=C%rK4*e!-y4=OV&LW=0Yg@S;%ep8rFIOkt_b^+%8-##Cp~zqH z`5%3x7t3N3m`wUeAmY7C$Cg9WO3PO7s1mn6ZuhyAEGJ}lNk<%_A#h`U-?mb*4J}*} zRP*#uX?}R`F_^kMrnFu9)KP}CJn-~0wZIajY#jlxx+cyh#-jadD z`iAj{6^e?djo9yi#&>vCXql6s=8Y+`;>atcInlIOP8>5Um%9?PZ)}KgJJr~L4SV1% zYjh1bP{=GvzqQEHW38lY>-1V0GZYh#+)@g8!`rxgNQpCs3267Vd|@7f##_44suEfb zV;=UwXUl=$-Dxy`QWfGU5G(VH@L(v>rA+d~5ekRbM62MMwrC`<643kT)a3RUUDU8r z#gPh&3G{ZC*>~(Bm8zc;q-A6s1roqwY1#KKkuhHBrHX2FXlov!T5i zK6tz-3h%lBmfX2a5aSlRmth&m;Q0Vu&)tDgX;xlkhb9$og4~La6f7vKtlU&}!fQp6 zs76RmJL$C!fF|52JU%mh03*EIB3aOYxzY^l1K6<458rOquI=6*BMc({q4flKq3xE|biLxs9Oh6hK#p?MuoXSl z{nyauRmtx}i5I{M-1@0Kz+~Jyygk5vW_3x;YEqGorh575b!fJkEaw{s^NVlv9~6(v zQ)|`)Pp3BKF!S>aXcn35LM#J_&PA?|W<|oHZ-H3JRB$2FY*LFUxHM?e&KE6~1<#G^ zNDf@;w>(jg1yzDBPSu?3nNgSCEDX=VglEPQ9?yVUY=WVh-3NqMHc(@5u76eIWbGUF zGD)j+9w&Y<$e&Mg@;iRW-A8>z0>DhL^_`6%GCykn${vlbxed%P%tU#nzQ&3&0aTso zn#^txP`BctDG_qVdFOMu(zjJC#zg`54u8BwV<|P=nhUr6RHKR9MC&geuY~IZe1{wm zVX>3=Ei(gzz7QrJpZq~-5#9ajZnGZsxPN9x{-I<9ai)V|Pi*m|%Th$X zIYKdhHsk1B4Khj`gri`P=_{n0m{^rcgiV@TZ9X)Qp_QFrG_NHKf=8g?F6BZ5W}xj! z$`kP2O79}8HW7EN@1-(%-?@G2%osHCWJL5X3eB*fFU-savuS%lpdR2LrvNT3*{`5I zfN``xR0Lf5f2VK=yWC#5DdM7P15p9K*i(s>DUsG=MxAV?d0wtz<7#ztoUY+d1-Qe@-B$ONuUn9c(i!l3M&Z@6e|L}P-osg^P&GhBkD)Xz za9O7`r_ksyz20Cfji1u{66hvajYc)sl2T#0bxxHzh=R5hr7(rneO2-6`~1hw_*_EK z=&-!%S|%(rGs%zI%b%8j=E~tJl`R;t9=1W@POt5g&yS?>80Y+_HWl7|xwEF*Mif}4 zs>bPH)|Z4+;r!HAJ-SqJ2O(UHF*@pBpI1DqeWRk^W@Jit0l zJYG(7sZA;PU?D?79Tb9}D)q{qklRhHXq@?!gcDvhJJhXeUo$+C8TOkGHAgzJgPGDV0Bel)Z9x24Ntm}43fBH`tZ80eJ&(g_;B}PugC)RNcLko z`@FT*bo>HU3-X&%@et%eq{fZO4 z{mwf4C5-)7mFRbURz*QZnMaabNYB(x&*lkFpyV+()%__*{iUZt(9-^)r2i$z{&x~B zcQdPz;}S$!BHsU)9HFUGwLe=Q%&mKOg^10sL`0ztr--Hu~2c z|J=b(1@PZ(@t;J%XS#=y?&*De5&@q`V`l1qF9OoD{3Zg@J+Uvpi-1oY@E;-|%@bz( zmkRi-IX;VnLbxQpFhx=>cFL zkkUodM-}U)q2sN0bMEi90BY~=Zy!9w^tUKhtXsE-0zGKac))=Gf_;Mlcu~GHe}4i1 zAWCQ%oz~cEL`Kq?Ep>nvXYo>M;G9>B+sqy)-|LD~Qn(m*3WpXBR_I?6+)O84B*Ls8 z!QhP5C}tqKkX}!@%|%gzl8|hF-`fa5(sS{OOIZS+KXN7RvFFg2vN z)W-X4aQS$67n}7+X@tZteljQ&1TFK~dz&1^vCsE9r~B3zAKuqvTs$%Vovi93UcLM zF@&lJP-f)GelA3hAwU)=$?z(0j3KXy(ti8YN|Gppf)vr1UXLF-yH~1^28uxx6OOByS`bLm1dKb^s47ah)wr;^^2 zx(V4mzo-DNlyO6J|}@KHOCU$m6Sc7D|DV&JJv z5=&)uzuz{xT@!j2TumLtM*YgOYV$FNZt3_Tscwg| z@lo$~_;RFdC0iZHW-%Ff$@2p?!+InkXt=KCEEXF(GMmG!wvH+7K7*z4+R}{X7aRrZ zb$ZR-K8SaSyc{S}g5GepiYZN}hr@gEV0>Uua#X1HC5>yUVbDUR{SDa<47}aF0o*nN zh@8?hfY+x*a7J&l@XK(WCDYDR9hR1TQfvq<0|Qbh zRH^$mYnO49Mjkz9tIZKe_YZSEO?i)C5|6xpvq4uL08;Ef+JSAlbfj&7-Z~|z5=Mh- zuY9sJ@6(`e30?)3ARN$7MeKeA$m$dEIu)wxAd%*Y27ZT&N6Kt(Qa;n4ifdt zlIP;oD*Y_c*k6gmTCv^O1G9hs5Y!*q6mKI*3>+u7U)H}NjybB*)En`s|e zlU4{ST=XyD=$c>T0JB)$FZzTXvevH7`Yj^m@PVsNCSq_d)VmoVMZu|?taRPxd%a7W zGV__L>hP*^AIpH9RG@1O3ZRW>WcqdfN&g zW1PF4(nDg#Edq1^1YIS5_mmgSE^)7y%Qa|q2N2#>+`?$a2z37XzG97I3a)L)_Cn+O ziIR;Y>1?r{`E;8|nS6G{ct@sXv{@Ye(i|z#FgdE^12v)-cr4HR>j0z>hZA}BJRZMY zgjyx}5EVfUcKgb0N0U!8uQ~ZusMpv*=jk0gebiEc6-CvYC}2VYE>&ZcCh&X}yOnil z7#mkX*KkJU)l1?*P8V@}fcCFPx-H7kr4UY+2n?rpHO^om!kx-LKynKsgky2hM)x00 zgJ;YDcr~cN*XCEer|RNmL2vWxxlw^PatDmB=Y&k?*Qm@~y2!&$DFmy!GX`m^%1 z^8-KU9XUu_7CUFkcFA$frWj?C*>!g})q+=oY*^zV&b7IfwowBp(MF@aLa6Pjwe~8X zQy>k=gjFZwnD!+!i$y;{SLIqL7msTN##{L`Mj2-+Fe|eW(0PWuIWT21nv>42INlRv zy&dVa5_dOB_*HCuE~4L|+t0a7f~?G(V%#;Egdlus2p!{jWnk}@9u4{$@|W)xNp3^BAACpzz)8@4vRo? za-0iwB}c!fcFI&I_JThjk7nQ(7drhg5rqCRlHA2Bb}HWfY;;bY{VtJQ2z()BrS%EW z8jewPnB4OjE<#f#oej>=!~ND9A?Y;k^B^n;LDnjMw4IcANU17HN47RXRd53&&U>~g zy*%EUm&vikv;QivZ0)Bf! zO%CcF^se4*I4FEKq;3Q>kP}TF&H`&z8mo_#X6Q*IS02fD1n5lZG8q`T)Okyx@sP;zPEQA zilpQi_M+}vD0EC1@lC^FP>@g|9PY<%_r4}BK3u&J)89I*x^?C7dLAQ8d2ck)GQXA) zl#YEJ6`jHmMvb`Qr)J)=k1dGyOW>Ts#b_V^w5I9*?xs2(-#)|*IW6GZO(C8hQqIt+ z?)_!e<$SSQd|}o|0!9I^zGNOO~CUV`zOn3maB;uBTKE&j=vsZ4d+ zg1(uwJ4$LnD8Hr9hZsj=ovB*Y9dsv)o#jHij4YZ|UZY46j$&t+%>KFL007;qW872i1Pdy3avwCt*J?Sriaxi-Z~_|Il4n zdX`mAik|8)AIa_i8CQA4mj-Sm-t^rgd44RXf?}4lGlt*2OA+)v&s)|Lc)NBxx;&je zEJIa^IHXS^yY5r9YHbRrn;dNXz9c%CNEl6hl#5}4!u8c1L7VGb08U`({-^9mUVJU!cw|?7Vlk_V4HFrC{n%qxKbf>KfTJ=c!c}{dSX`98khKZE5NH~ z?T?Hm(d1jgaW|<|A!FN_CppeDpkEHRJ$XpZ>Oj%fm{;&x_}$c7-e#S(CEa8rSu;|_ zV(+;|Nl_zedLK&x%>)xusC5{OWU0x=*GZP54gZwW_*E|ORR72DE2r_J4B}VV`&X#{ z-{mwU6on)t<^Fr-{0ZUx!O#BB5*p88`=1F7nkOLl&x{7dFPi*cGa1h#|Ml!oQv3PL zU(fz{<^O@CerCx3`5J$X{v^Dg{)Tv7{rTt@nf{As|If(rzvo<@-?4xFApSY$@{b?E zKP6oLAEBiUJcexa^ksOuN%`h~iFp{`%3 z>lfiUJcexa^ksOuN%`h~iFp{`%3>lf}vSKE9#do*3*pV<7aK~hj-MI()g@4{`z^+DxbB-ANu6;vtRRmtw;SgZ>(Qr_p{&C zGt2#a{A1N8Me^rL%ye{5YyHJ}|MB|g`9B!vXMe1JV#9yk&ksMVKkn~oWr$znv_D?` zeD?X-(^dZ5!LJ$5yZmwf>Arr9JV1yR6Kv$QT;D`rW76J5Vz;k(P-)LgQH*q3=ulW04kdx zKOX2I0ztk*!+TE;p5RlXz0}xWTyrRIG8L4y_NCEd#uy%Xym1PcQpFntDThCIO5xa* z*tM%+g)Os0{T=<)Z^fXaQrK)x()@WMo4;mB4RGVzMRf)ND> z@78Aj0G#=79O7O&i^F5&HWDE}>5~O_n+-h}xeKYI^5D&HxSuTymg&pQ6ECui$Kl7V zkE>%?vRz&8^-+-GcBdS_3-FJ12O=T|4#?Xjn76E?h6FoJ-nAxjIf6x`HcPva$5oUuui26 zsr^a@ewNNlUG}>7269Mykp0$_jy!Q9@2JtB=bUUarMd0I!UFc#vS~DokS-Yt26Xtj z-#OCd<2DHe_zhQoun2%*=YCkm_(m>C?UAp>PCAl1vWU<>KryG_ zG>Bg0eg#CsVD~YeDJUyzEkAy@az!FRT0MfUN-7qqf}V**CY_0VFd`knOfJ6{i82jK zwV9BzlrLM1YU*7QBCFGTKG{8EUd?t{Te zqC~QhlVHXu$o#-E<}##m^vHanIWmQ4WC?Hhhx4=x;RcgMveycvjOk+~TKGeAT?$y_ z*crl3bC>fF3eYDV$h<{z^kop=hE?XPJvDU0Aj$%f4U1vh35Ezp+d@pbwe0U|@Cb(vJg3UJgv2UF781;7 ztR$>kHVG@WJ%{1(y&Ow2i}|hd&@+c^pl$nK!)F(r;2hh z?{qWaSNRqqWPYR(t21PIRHsbW>Q$H@K=3HiEDePHgmA+8_Uq9az<}r*^J+t)SBg&)ZrbvDG6_wR&(F&5@IF{ zO&gH{mm@Pfu)mu6+l=xmF15;b(d0bDk%iGS6Q28ycrt`+yS z-+Kp8d2l*ul1HQbgi(87B3J}+8cKWlLetP<- zlh7qgflD91D3+9J<|U6OV%heEPb#GHqe>arWk13z3~F#WTrZ~L6;$M?+X~q->!=b2 zmU$laGBGQG&Du`+7fv`o$TCN@M8QVIq zcV{ZR3>Wiw6os!7$=#&=S{po~z}Maw{zMqy2Al3HVQ85u7U9J8HxyItuWZYage@nM z)tME%P|nu`nApe%fdm$O`6MBJ(jUq+-*o%6cDJ6|t}aHOt3mUo?pB-J$P7@yL@xf-eCi=914eH%? ztlEt4fCHRe3Ihuv?#XLr&xuV?uBf5SH^VOB%D8ns{(>nmJb+@%NTC9<^hUxJbZ5N;-RNE^1$gI3Xlh>fkS3Ux?+{!4=4#3@u}XZ%;%}?Qc91KX!+`b?AB7#;8;qE@TWQCC(`q*u zET)o>#M4YKhhvpKrq7z|LlPekS_CsGweGa51<1DfvHiSM11Jp>-g#QU3eaa3o5vQ} z&wG>M#OYY#5)4*Qc&GI2hkdKm5Sa5H0a~Kr=Fk|Zs6cYFftw&DVlb7gGfpX*9*D1u zMth160~jUqcW(ZFPQH~4fK;{unP z+QZkr0<-sPPi3GT+#R`H`w4Sr^xgIPD=L{s8o0BlyKBgP0y=m8_h~rulx_zQ{)Pdd z;QbjuK^0j27G9V*SxwFy%nuM^I-1?EoXqfjl31aFVBC+sI~r=Z7Ak}Jg0w8+1E5(# zJC(Q;cnp{i{fN4h`B&-%(d*t&*hYy%9K>oC9Wd^e9VeCFNg5C_34?e%&JE$0j1jx^ zdA6nKT;%wD1xXQeD5j)rQXW#k&hC6o? zMv-I2jH8YX9NPLzVlGIBe=Mgq{ldY{<2QO?++?)e1;fb0dRA|Fv@x)2?QMpy?H4{I zrKLmA3=GTSRzJszNp}6d%9cZViLA;NA!xz_zS zj3eEpDa^HB2yjO6lX6`r0W_rwEmKG=F&9y#phpw1_d^7yVLizf;K1EeyYaz=TOBat zBkqKrRh?pjwvmV#y;O~PpVDme%P9>5NOYtMW37r(p{nu&vmBm1@m?yCy3&Wcd+!5g zr|hd1T?+wX8=cY2^*#x+maz83&2==jq;^{diJp%RQuC7$?Q^x-oaRnuRT0Or@^wMhmOKm5P}NpL`A%?o$fZw-^ zcGmCE+@Ko;`jEYEoUCbEg`gU`2JVp8s#O3RxGqLF-Sv>q!RbDcP}?*gU(pr>2$+a* zNDu6@*33}&NOoVF)reNONJob{s+2KbS*%p+vhS?A!ZqkOhEcvgtV|s;dGhtrgi1_V z!}%~$av8owybcn}mh0l8Bbg~|N53pS5@_}&PP}_wXaQjb|IKu<8G*Q{p)vzQah&{s zUA+01Y_-}lTiafy78X~}lM*p>OkB0kM5~jKH&iiUSgR`da6}rsby&kNQHs5pz>od& zS+=0U45@9-!^<@sv0tT}bO-UyD#}JO7*W*n=yj;j-AoBGJHvLI;f-E{Dk#PukSrNC3M*c++$f)^RkUW4wntxRo|#oAC}M%N^MH z8|cY>42^tc{<+MzUOU(mU8E5GH?muy;VHpHU`-XXU|kltx_4iksxN9k%?nyZQr~1$ z_+B-THi{P=$@278P-_EV!^68S6lF|=8mCu8)eUFvNM%;8wd(ly!_8Gd+r_g^yOlXS{e411fx^X3?J!IYlkH~2Z@j4N zHti+a^U?W@bqznA&dQ^Yij_OjWzNXB#|l%e@Io^{4FQ9M3hj5f0 zSEDD{N@1??U3#+n6ytt?`SL;Wm6(6w*fDrW%n62B+KBE6;aPg848j0`)&nufu#>rE zL+hvaAJT$n`%`ZGPo3K8&`iyfK)m12&qKVUec;p3g8zVgVxZQsf)WuwWe#MS_w+yD zlN*E;{CjVlzClOGG}n>Cy;sKIo2I*vNGU|7c-WhtK|W5+!;aks zOtnI@XZIwo0*H=J!@3G^qgac6yAmLxC@5#C>YprOfsbprA$Q(!OH`DrYU=x zIuqlr;dT9NT({a?t&|5Q?yQr@oOnlz$-R)DS{!Ir$kF+`6xJp*^3Mnlwr~MB;Su({ zWXmCQgzgLz0-08U)QB8KyxE38nbpu70?LF;vkl@BuPXMH$r+iVoN1fSe-vyPcL*80IA%HNx>m<88A{=Ss_$V|dq) zY6@##AOIiKP=6(yb>TZ503d9^cm9#0RBxidh}*tUr@4d3ei{XO6fvI7mj^On>#@M; zWWihpUoBJN`0krCuvC*LbcfEoFsQ`=?Nl#PaMB+oP2{Bo+r7k`?hNx$5f6qN&g-i~ z00!{K1Jg!CX9hTQ{EvwKx@+Zd2c*pW+2E{VaAVw@;f>ucnMB@Im)R2~rBR^gTo^EB z<~#=zqLyjq#3a{#qs2`c6tJ0G$u)(V+h25yR!oi%g__gafN-R)xw?4iD&tL12d=pD zfF$5m8qbmg!HN7Kh^XB{4*h20hyim$Avja*Yi@%c6A2>2Jz1rkEbI4l%Bz&^5Y-sD zgMb-$L;h#hfTh6K$Mhb^^90II*`fZU*^Tps_opd1Hcr+Ugi> z9CWgfeP>N@dzgc?0d`G2bEFq#KTtZ-(y7$2kXg(L1ZQ$TXtrtKE!SX-`K}?fv*259 zo7o)Gt99M-_8>Kke3rxpD~8>V1rEYkK`J*sD=a=`CYKh3pOPxEE>51N4kq1&5Y(S@ zuRY$r{XLYuq8h4PlzX>TG;H;Q+ULL}K_E6_7zTJhSP1a0wb>=d6{-kf_vD!9R7^&o zrUy(Q2&ub8U^SD=oGR!0l8=j~%$9=h?xE9b_nTu_wOnM3 z$7XXN&CKFQ5Jh3aHHWY8fr`5=kV-8bp8Tx%ZIGm{LO-4;BVeG=F*pR|gq3>YA;8fw zsXaR9goBe3*Yo(~KpLk9VrXI3VO4SQz2SYIsJgs#jTqAWTQJL6?2gA+w@=0T7b?!fMw>&= z;k#C(%y?}fq6nv!>cR(6!y^pUMW){4>f3c`;n>h6Js%+ly<-t!L}+qKa`1g&86V;O zejZUURi7CS%d^MS9F%3gohe|!rtb3aSBSw;HVuhqh#_u_RpmFFab7sr2?I=;!2LmP zNmr>9S2m}d+Hze7Y16j|u1Q?(LxzuzT)eC~GhD7@F6g*CC%7_s=_mUv`!^Dzy%Yl8 z{6wF>jaf0KRrkxC^SSKVB81&10%;k8x~I4ZG{9H7Pj)EZPGGd%pBnZhZf}D;S{;c& z8huBF79Uj6J4~U{mVygXj*8AvEa_Kai$2WZV!ar67%eJpd(by0&_31>Nla>V_~??x zt_gFA-A1j?0AsVwP`j+TcD!iq`Dnur&%@XyLv5M7o4rrSkzdsdJSqYEE!BRn?n+4B zTxc$)$#o!dNA){LPL2TQt_R+S@A-X)@uE2DE4Nd-3%u<{GLV<;>atzs$NrTPPu(Fg z?97+tPmhzsQShC|CQSN@9IjFM8#wzRsN_e`DdSuCo}i|psa-H_f`fpPo@@s zrETe+jQpS1dQOD?-Z0=ty7D<4`}BBzPDA}8uljuW`{P%R^hYho)AXN}ABHkBxVmS_ZSpe9Wz7=EmmnOU%Hb#jYH4 z!|v6vD|M~=ko(z+^HqxT2uIr)Td+?8t8au5VI^fC+xq%UFL4F2pSy8vPXVf=j&CA@ z)-;lq9gq|JQiFyA7pWCv#rO9c1YX9h<23t`ER_}f;ow}40`(U=IjP3N`8gW+-OVWp z&A5zqtH!|$;W`sv%+9Mm$5Ce2IG(!`oxkxjm>4=|zl-cbqf|iDsin-Sqk%FLH82D; z(cPIk0cT_CF3HxJ?r9M#(;0%wr}+Xtr$SJi%~ZwOJ46R*=^(pff|GAYC3&OPdn7>3Anz#h%)0G{h(%xj;d0GL2q!k>%|2u{^=7 zI<`u)0bI1a5D3zI-4@fNW_(tsGbx^U#ZYu+mamOHxTm_ugW&?@LoFI~Ej?+KkrJKc z0va1<<(P`!bXD_I!9bT=1u1!-1Up``!LU)AlZKGBSd!la2D)2kX~1CFNgyf?UrB{Z zs3W31CF1P;T6)b%$awkNFb1P4N7ixeFA2NMpJ|=wT71W==JFn&dU=;VQh5S#^O=v( z?bj-uL&f)!%+H$bS23Y6EQrtRdN~Bm@^>Se1n~0#RKz(1&I)`Yi3;fH{@g9F#-jbY zBK4Z1!dHo(0&gu~s#}I9Fi=>mr>~BPjmSU$ZQene6~o&1fW|^_S*`%FK-17WZWUpK zoH$dWGAXCMMczFBWoKsiX}(YnXdbmIH2A0`kI~Tx)jnNnMXfk}icy9<17qlgQ-xP# zBg>2VC?SOP(_dVw;vh2JEjD6ZK_S{}zO*=nuOCa0JR}^t20>wN1HRc(Lw1yn%ZY?MJ9_1@YnA zZa@X9k2`5E2jQ&3#Bopn5>d%~O?{z;b($f3*b+Cw z4Q*(Ivg;@a-KcDF@oUaKcvgvh%OIsPJRsmp>l%V~B9=EnjlP>}3)@`=t9M{ZmA1Zj^vGn72Dx40~q6GxWCXlpMgU zuGW2R%z$b~tLO7+g>#er#JqrM6+Rg{DQF)-%Fr{6#<8jsGY}n5-mHh~%ahzcSw-v) zkuesdN1s$2=Rf|bt@qBF`2Yt~O1`!D)h5yRur)Q+FggsWg$DafOfuG$2DqcGM3e*O z%pDyxcL2^AO8BjgKBUGEz0GnNpj&_}eWzhDepjyVx$CO$f;&BjqS5nZ0EA~pbwstt z*y)eYl&*ISw!=cyWe9N83JW|ZV9!$kKV+0-Ebr7RsutNx`6jG@CrFQihyqrgX$#@J zujpJjiob|0iwUDUv<>}$W$Z{{scJzAGM~U7d|=e1F~G*@lz-U$%1>R{Mo#HXoZRCp zd3%DdZ|~$@Z|g^I`feh_NWq8{K`x?))~ck`7%-YDSFYL&h8OOU=e>i`m2r}tPOBlk zXR?+> z#8F2xS{EPmhR!46+nMw`!Y1H!|KzWO=%@QS&b&eFQU|0)0;Jz`&)Li}w@SxWCEQ_m z@^R6v;mu?+O=KLo1l3CnNr8$BE!B96MMUD7EIeKAMYTGxQVAzB+xU1w{K4 zQd+2Rj4jv)5~j;t&ici(`R#mpHJx{|QZaxrC@_I@KYWcz_x77zY0=$>6Nk_F5ApcfexriE3T74=_NM{(aq_e-LH;+YQ0hEyoI!UVU9@k)m6^G^B4ts_&o15VRjl#AcMQn(s z)LUJ<_>+*av-0LXH`>|fu52L#0Cxm_&}~5jK1>8E%tCbM)UX;SZ#E0V1y%x*DKN zg8GG#E=oRM{jRxs4)DAyWFn&2*x0AO271zoGi8318>r;|(nvvS4eOHgxb}_tU*{EB_Ho~` zjDa@ZlSt}($=s+zR?sQ+28|)juiEA@KVF%iswX}J(6I)HswmNhq9D01=u`xu<>t;M z;6ff4-yRnNHlM$}VtAd7U~~OOQlW|4I<^d=%QBe&^mB7=CgBcN8^#i;uia|!S0T|e zsZ?6ygFWwthb`SBVuM?j0%z)l&lp&+BHb)=p`W`EEQ5&fN9@AeN*X+)+_%ilOH5K7 z2MvPL6Ao1jD!74a(a2}k_%&tbD9Lb4dy+g@ch?b#(x{U|F3Pm|(h{YtUmgExmq~)GxWhTFjwN z4HhHC;spE7qX^kvx|`h3rG-0{xu%BdD=eUKjx$G+r(9lWGX3J za-m>^VhbE+?gB`!u4qshV}Cq_3B*`=C3qRfRIg&+aei`~-IPNu(eFjxSM{y;l|AGN z)0IuNze$XA!)tCtkAc@l*IGi7kpB6S{x*H*f?#W0hQnkD{}4C+_znO0*M3?SM&>`` z#@{K4|5@C~tD+(xt^D8n5j=$?|3TpRT5{^gRv{?xYluP@*~$KL<=)%*9s_y6_ocTZpJ|Kh{&W8`0A??1YQ z{^zmxix0z#55tQO!;25Yix0z#55tQO!;25Yix0z#55tQO!;25Yix0z#55tQO!;25Y zix0z#55tQO!;25Yix0z#55tQO!;25Yix0#9i#`lbMehIL!|=aof2YJFrOc=Bml4Ci zX@5uetai%aQvJ`|82*26fA`~deraO=CkgQ1ZSkK}!2f63-_iZFzxd6a;K#_XJ^#tz z{xmW8U%3;!w7+|4fA`YSxmWUmrgUnV+fbzf;WrysdwxnE!c0|D3>}ekurlx>*|Pr>bBU28MrM zL;TbM@UI$TTBfHO;NNP9X=xz-FjstbQT(%n_{p{Lj}l_qzn2g{mmvRELi|)}{9iEU zA0z)Yeev|FAD_X0jxo#sEFpdkJ{neor9)O|wwx?sBLCL#aE)|B&Hs_P=;Z_#i1lLyE z_hqiDRO?YI_wAIGRZYZBY8Zby1~XfywRyeqLR#QlSDjo5!g#&#&)JE)m|MBjTbmY_ z9JSvo_D@m*;wyao0!L{(g_Z6_qfsOr>Gx;CJJWO??(SqIIVGsJ`Op~YDD}EN?d&Av zlGR8PL~rf%H$b9L;8ulfv@z(i=f(=hZa~?L$y&v#aFg0rY_JC5+p-{$Mh=i#?at?f zk|Qcc&?yq;MUuZI%7q^o$Z4jC!AQjYoEM{Fj6y1HBt(ezh*u>qQXxhnOIlO0p-oAO zUt>(B>KF2smoXPxu{*+8Bs;>WW=CwWI!BH`X74Rcp=>0rUM;&MJ2v(J5m|1SoQa%J z*;A`)GU41Qqbdg4nlL{2=(TvRVd;2+FQI)?gAqw`!einUWNhYl4E+;#==;7 z@9~in`6IOx6(~{BrPVe>N+LOg@g&J*Mcf0id5zx|3K7J~&Xc(HNq^sTUH5x*tPv`S z!$_YkO4Gbrxu#8xixSmF)C>B=PMMe`6A+`DW&AqveV)`8_68wdPRjE~_3K>IM-4n0 zsCCjRd2I%waiJO(R^>GHcQVbMS|$|^6yU0UL^_`C%P(d@OrdLm zM7xP~WThpw5zDO(oJV9vQmM^nVOMXynIN*_Z}Fw9^;)svqw?FWB7XA=TniM~Ngo=k zeSKZmL0W#1wEfwrSyhZUrGLg;Q6wY}AGdsgoNVxQ0Xnfn*C(*$ZN1Ddc}b{O1*+Y} zh|`tkEo664WJVfE@*1ac!kR&t=W=Y^oEAn+

1>+6K=>?RJPu$ze1!WYEgVa-m@2sSH6A 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 HE$06R$PiZp literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index ddd2c57d81..d8830e2a59 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ - + + 4.0.0 com.baeldung parent-modules @@ -144,6 +144,7 @@ xml xmlunit2 xstream - + pdf + - + \ No newline at end of file From 8628a63d955b596ba4d116091658297a7e53c3c2 Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 3 Nov 2016 12:47:43 +0200 Subject: [PATCH 044/115] test fixes --- .../{hextToAscii => hexToAscii}/HexToAscii.java | 13 ++++++++----- spring-jpa/README.md | 11 +++++++++-- spring-thymeleaf/README.md | 3 ++- 3 files changed, 19 insertions(+), 8 deletions(-) rename core-java/src/main/java/com/baeldung/{hextToAscii => hexToAscii}/HexToAscii.java (90%) diff --git a/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java b/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java similarity index 90% rename from core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java rename to core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java index 4c20215288..2a3c4b109e 100644 --- a/core-java/src/main/java/com/baeldung/hextToAscii/HexToAscii.java +++ b/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java @@ -1,10 +1,13 @@ package com.baeldung.hexToAscii; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + public class HexToAscii { @Test public static void whenHexToAscii() { - String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; @@ -13,15 +16,15 @@ public class HexToAscii { @Test public static void whenAsciiToHex() { - String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; assertEquals(hexEquivalent, asciiToHex(asciiString)); } - private static String asciiToHex(String asciiStr) { + // + private static String asciiToHex(String asciiStr) { char[] chars = asciiStr.toCharArray(); StringBuilder hex = new StringBuilder(); for (char ch : chars) { @@ -31,8 +34,7 @@ public class HexToAscii { return hex.toString(); } - private static String hexToASCII(String hexStr) { - + private static String hexToAscii(String hexStr) { StringBuilder output = new StringBuilder(""); for (int i = 0; i < hexStr.length(); i += 2) { String str = hexStr.substring(i, i + 2); @@ -40,4 +42,5 @@ public class HexToAscii { } return output.toString(); } + } diff --git a/spring-jpa/README.md b/spring-jpa/README.md index bc768bee22..30b39e1a4e 100644 --- a/spring-jpa/README.md +++ b/spring-jpa/README.md @@ -13,5 +13,12 @@ - [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) -To ignore "No persistence xml file found in project", you do: -Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project" +### Eclipse Config +After importing the project into Eclipse, you may see the following error: +"No persistence xml file found in project" + +This can be ignored: +- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project" +Or: +- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator + diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index a8ca755044..98fb4b043b 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -2,15 +2,16 @@ ## Spring Thymeleaf Example Project - ### Relevant Articles: - [Introduction to Using Thymeleaf in Spring](http://www.baeldung.com/thymeleaf-in-spring-mvc) - [CSRF Protection with Spring MVC and Thymeleaf](http://www.baeldung.com/csrf-thymeleaf-with-spring-security) + ### Build the Project mvn clean install + ### Run the Project mvn cargo:run - **note**: starts on port '8082' From 0ea29df5890af686ba67902e9f40897d9e6f2483 Mon Sep 17 00:00:00 2001 From: maibin Date: Thu, 3 Nov 2016 12:04:43 +0100 Subject: [PATCH 045/115] Code cleanup for PDF module (#800) * PDF to X * PDF to X * Remove created doc * Code fixes and cleanup for PDF module --- .../com/baeldung/pdf/PDF2HTMLExample.java | 18 ++------ .../com/baeldung/pdf/PDF2ImageExample.java | 3 -- .../com/baeldung/pdf/PDF2TextExample.java | 43 +++++++------------ .../com/baeldung/pdf/PDF2WordExample.java | 11 ----- 4 files changed, 19 insertions(+), 56 deletions(-) diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java index 72877a465a..14e886e23b 100644 --- a/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java @@ -23,27 +23,17 @@ public class PDF2HTMLExample { } private static void generateHTMLFromPDF(String filename) throws ParserConfigurationException, IOException { - System.out.println("Creating HTML file from a PDF file: " + filename); - PDDocument pdf = null; try { - // load the PDF file using PDFBox - pdf = PDDocument.load(new File(filename)); - // create the DOM parser + PDDocument pdf = PDDocument.load(new File(filename)); PDFDomTree parser = new PDFDomTree(); - // parse the file and get the DOM Document Writer output = new PrintWriter("src/output/pdf.html", "utf-8"); parser.writeText(pdf, output); output.close(); - } finally { if (pdf != null) { - try { - pdf.close(); - } catch (IOException e) { - System.err.println("Error: " + e.getMessage()); - } + pdf.close(); } + } catch (IOException e) { + e.printStackTrace(); } - System.out.println("Done."); } - } diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java index 4cfaea26b9..d7587dfc17 100644 --- a/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java @@ -24,15 +24,12 @@ public class PDF2ImageExample { } private static void generateImageFromPDF(String filename, String extension) throws IOException { - System.out.println("Creating " + extension + " image from a PDF file: " + filename); PDDocument document = PDDocument.load(new File(filename)); PDFRenderer pdfRenderer = new PDFRenderer(document); for (int page = 0; page < document.getNumberOfPages(); ++page) { - System.out.println("Page number: " + (page + 1) + " is being rendered"); BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); ImageIOUtil.writeImage(bim, "src/output/pdf" + "-" + (page + 1) + "." + extension, 300); } document.close(); - System.out.println("Done."); } } diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java index eafdc07560..e4fb29dfaa 100644 --- a/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java @@ -23,43 +23,30 @@ public class PDF2TextExample { } private static void generateTxtFromPDF(String filename) throws IOException { - System.out.println("Parsing text from PDF file " + filename); - String parsedText = null; - PDFTextStripper pdfStripper; - PDDocument pdDoc = null; - COSDocument cosDoc = null; - - File f = new File(filename); - PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); - try { + File f = new File(filename); + String parsedText; + PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); parser.parse(); - cosDoc = parser.getDocument(); - pdfStripper = new PDFTextStripper(); - pdDoc = new PDDocument(cosDoc); + + COSDocument cosDoc = parser.getDocument(); + + PDFTextStripper pdfStripper = new PDFTextStripper(); + PDDocument pdDoc = new PDDocument(cosDoc); + parsedText = pdfStripper.getText(pdDoc); - } catch (Exception e) { - System.err.println("An exception occured in parsing the PDF Document."); - e.printStackTrace(); - try { - if (cosDoc != null) - cosDoc.close(); - if (pdDoc != null) - pdDoc.close(); - } catch (Exception e1) { - e.printStackTrace(); - } - } - System.out.println("Writing PDF text to output text file"); - try { + + if (cosDoc != null) + cosDoc.close(); + if (pdDoc != null) + pdDoc.close(); + PrintWriter pw = new PrintWriter("src/output/pdf.txt"); pw.print(parsedText); pw.close(); } catch (Exception e) { - System.out.println("An exception occured in writing the pdf text to file."); e.printStackTrace(); } - System.out.println("Done."); } } diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java index 6777ea9c45..1f416592ef 100644 --- a/pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2WordExample.java @@ -26,36 +26,25 @@ public class PDF2WordExample { } private static void generateDocFromPDF(String filename) throws IOException { - System.out.println("Creating a docx file from a PDF file: " + filename); - // Create the word document XWPFDocument doc = new XWPFDocument(); - // Open the pdf file String pdf = filename; PdfReader reader = new PdfReader(pdf); PdfReaderContentParser parser = new PdfReaderContentParser(reader); - // Read the PDF page by page for (int i = 1; i <= reader.getNumberOfPages(); i++) { TextExtractionStrategy strategy = parser.processContent(i, new SimpleTextExtractionStrategy()); - // Extract the text String text = strategy.getResultantText(); - // Create a new paragraph in the word document, adding the extracted - // text XWPFParagraph p = doc.createParagraph(); XWPFRun run = p.createRun(); run.setText(text); - // Adding a page break run.addBreak(BreakType.PAGE); } - // Write the word document FileOutputStream out = new FileOutputStream("src/output/pdf.docx"); doc.write(out); - // Close all open files out.close(); reader.close(); doc.close(); - System.out.println("Done."); } } From b0cfdb180e939de189fb6fec79138012f701785a Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Thu, 3 Nov 2016 13:12:43 +0100 Subject: [PATCH 046/115] BAEL-315 - removing obsolete files --- .../front/controller/filters/AuditFilter.java | 25 ------------- .../filters/VisitorCounterFilter.java | 23 ------------ enterprise-patterns/pom.xml | 35 ------------------- 3 files changed, 83 deletions(-) delete mode 100644 enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java delete mode 100644 enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java delete mode 100644 enterprise-patterns/pom.xml diff --git a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java deleted file mode 100644 index d24c0a94b3..0000000000 --- a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.enterprise.patterns.front.controller.filters; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import java.io.IOException; - -public class AuditFilter extends BaseFilter { - @Override - public void doFilter( - ServletRequest request, - ServletResponse response, - FilterChain chain - ) throws IOException, ServletException { - HttpServletRequest httpServletRequest = (HttpServletRequest) request; - HttpSession session = httpServletRequest.getSession(false); - if (session != null && session.getAttribute("username") != null) { - request.setAttribute("username", session.getAttribute("username")); - } - chain.doFilter(request, response); - } -} diff --git a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java deleted file mode 100644 index 0ae7cd73fd..0000000000 --- a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.enterprise.patterns.front.controller.filters; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import java.io.IOException; - -@WebFilter(servletNames = "front-controller") -public class VisitorCounterFilter extends BaseFilter { - private int counter; - - @Override - public void doFilter( - ServletRequest request, - ServletResponse response, - FilterChain chain - ) throws IOException, ServletException { - request.setAttribute("counter", ++counter); - chain.doFilter(request, response); - } -} diff --git a/enterprise-patterns/pom.xml b/enterprise-patterns/pom.xml deleted file mode 100644 index 036a61c44a..0000000000 --- a/enterprise-patterns/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - com.baeldung.enterprise.patterns - enterprise-patterns-parent - pom - - spring-dispatcher-servlet - - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - 1.8 - 1.8 - - - - - - From bde9a0032f9f11838c9d7ab793ad1f6984e5fca2 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Thu, 3 Nov 2016 13:29:17 +0100 Subject: [PATCH 047/115] NOJIRA - test and some minor fixes --- .../{main => test}/java/com/baeldung/hexToAscii/HexToAscii.java | 0 spring-integration/pom.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename core-java/src/{main => test}/java/com/baeldung/hexToAscii/HexToAscii.java (100%) diff --git a/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java b/core-java/src/test/java/com/baeldung/hexToAscii/HexToAscii.java similarity index 100% rename from core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java rename to core-java/src/test/java/com/baeldung/hexToAscii/HexToAscii.java diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index 251322295f..886b4b21a6 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -7,7 +7,7 @@ 1.0.0.BUILD-SNAPSHOT jar - Baeldung Spring Intro + spring-integration http://www.springsource.org/spring-integration From 455df4e499a9de09c5bbeb235e6a585bd5607bdf Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 3 Nov 2016 18:03:47 +0200 Subject: [PATCH 048/115] minor cleanup in the java project --- .../baeldung/equalshashcode/entities/ComplexClass.java | 2 +- .../baeldung/equalshashcode/entities/PrimitiveClass.java | 2 +- .../baeldung/equalshashcode/entities/Rectangle.java | 2 +- .../{org => com}/baeldung/equalshashcode/entities/Shape.java | 2 +- .../{org => com}/baeldung/equalshashcode/entities/Square.java | 2 +- .../{org => com}/baeldung/executable/ExecutableMavenJar.java | 2 +- .../baeldung/equalshashcode/entities/ComplexClassUnitTest.java | 2 ++ .../equalshashcode/entities/PrimitiveClassUnitTest.java | 2 ++ .../baeldung/equalshashcode/entities/SquareClassUnitTest.java | 2 ++ 9 files changed, 12 insertions(+), 6 deletions(-) rename core-java/src/main/java/{org => com}/baeldung/equalshashcode/entities/ComplexClass.java (97%) rename core-java/src/main/java/{org => com}/baeldung/equalshashcode/entities/PrimitiveClass.java (96%) rename core-java/src/main/java/{org => com}/baeldung/equalshashcode/entities/Rectangle.java (96%) rename core-java/src/main/java/{org => com}/baeldung/equalshashcode/entities/Shape.java (70%) rename core-java/src/main/java/{org => com}/baeldung/equalshashcode/entities/Square.java (96%) rename core-java/src/main/java/{org => com}/baeldung/executable/ExecutableMavenJar.java (86%) diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java b/core-java/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java similarity index 97% rename from core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java rename to core-java/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java index 6329f41252..5a13f505c2 100644 --- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java +++ b/core-java/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java @@ -1,4 +1,4 @@ -package org.baeldung.equalshashcode.entities; +package com.baeldung.equalshashcode.entities; import java.util.List; import java.util.Set; diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java similarity index 96% rename from core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java rename to core-java/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java index ebe005688c..29b280865e 100644 --- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java +++ b/core-java/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java @@ -1,4 +1,4 @@ -package org.baeldung.equalshashcode.entities; +package com.baeldung.equalshashcode.entities; public class PrimitiveClass { diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java similarity index 96% rename from core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java rename to core-java/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java index 1e1423f0b3..168e3af0c6 100644 --- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java +++ b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java @@ -1,4 +1,4 @@ -package org.baeldung.equalshashcode.entities; +package com.baeldung.equalshashcode.entities; public class Rectangle extends Shape { private double width; diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Shape.java similarity index 70% rename from core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java rename to core-java/src/main/java/com/baeldung/equalshashcode/entities/Shape.java index 3bfc81da8f..628359becf 100644 --- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java +++ b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Shape.java @@ -1,4 +1,4 @@ -package org.baeldung.equalshashcode.entities; +package com.baeldung.equalshashcode.entities; public abstract class Shape { public abstract double area(); diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java similarity index 96% rename from core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java rename to core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java index f11e34f0ba..b9125c3e2f 100644 --- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java +++ b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java @@ -1,4 +1,4 @@ -package org.baeldung.equalshashcode.entities; +package com.baeldung.equalshashcode.entities; import java.awt.Color; diff --git a/core-java/src/main/java/org/baeldung/executable/ExecutableMavenJar.java b/core-java/src/main/java/com/baeldung/executable/ExecutableMavenJar.java similarity index 86% rename from core-java/src/main/java/org/baeldung/executable/ExecutableMavenJar.java rename to core-java/src/main/java/com/baeldung/executable/ExecutableMavenJar.java index 09344902b7..6c79e89717 100644 --- a/core-java/src/main/java/org/baeldung/executable/ExecutableMavenJar.java +++ b/core-java/src/main/java/com/baeldung/executable/ExecutableMavenJar.java @@ -1,4 +1,4 @@ -package org.baeldung.executable; +package com.baeldung.executable; import javax.swing.JOptionPane; diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java index e4866d0078..680a6d57b5 100644 --- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java +++ b/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java @@ -7,6 +7,8 @@ import java.util.List; import org.junit.Assert; import org.junit.Test; +import com.baeldung.equalshashcode.entities.ComplexClass; + public class ComplexClassUnitTest { @Test diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java index 603b0bfbf9..f4e9f2b99f 100644 --- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java +++ b/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java @@ -3,6 +3,8 @@ package org.baeldung.equalshashcode.entities; import org.junit.Assert; import org.junit.Test; +import com.baeldung.equalshashcode.entities.PrimitiveClass; + public class PrimitiveClassUnitTest { @Test diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java index 0943436883..5c860bd62d 100644 --- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java +++ b/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java @@ -5,6 +5,8 @@ import java.awt.Color; import org.junit.Assert; import org.junit.Test; +import com.baeldung.equalshashcode.entities.Square; + public class SquareClassUnitTest { @Test From 8ce7e1f5884bda6cbfd2c3bd38a1d95b0ab94296 Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 3 Nov 2016 18:04:09 +0200 Subject: [PATCH 049/115] formatting work --- .../java/networking/udp/EchoClient.java | 2 +- .../datetime/UseLocalDateTimeUnitTest.java | 10 +- .../datetime/UseLocalDateUnitTest.java | 50 +++++----- .../datetime/UseLocalTimeUnitTest.java | 32 +++---- .../baeldung/datetime/UsePeriodUnitTest.java | 14 +-- .../datetime/UseZonedDateTimeUnitTest.java | 14 +-- .../EncoderDecoderUnitTest.java | 12 +-- .../com/baeldung/enums/PizzaUnitTest.java | 1 - .../networking/udp/UDPIntegrationTest.java | 1 - .../java8/Java8StreamApiUnitTest.java | 92 ++++++++----------- .../baeldung/java8/Java8StreamsUnitTest.java | 16 +--- .../GuavaThreadPoolIntegrationTest.java | 4 +- .../baeldung/java/enums/PizzaUnitTest.java | 2 +- 13 files changed, 106 insertions(+), 144 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/java/networking/udp/EchoClient.java b/core-java/src/main/java/com/baeldung/java/networking/udp/EchoClient.java index 1fb9af3a9d..916442533b 100644 --- a/core-java/src/main/java/com/baeldung/java/networking/udp/EchoClient.java +++ b/core-java/src/main/java/com/baeldung/java/networking/udp/EchoClient.java @@ -24,7 +24,7 @@ public class EchoClient { public String sendEcho(String msg) { DatagramPacket packet = null; try { - buf=msg.getBytes(); + buf = msg.getBytes(); packet = new DatagramPacket(buf, buf.length, address, 4445); socket.send(packet); packet = new DatagramPacket(buf, buf.length); diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java index 906d641632..57e1f33280 100644 --- a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java +++ b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java @@ -8,12 +8,12 @@ import org.junit.Assert; import org.junit.Test; public class UseLocalDateTimeUnitTest { - + UseLocalDateTime useLocalDateTime = new UseLocalDateTime(); - + @Test - public void givenString_whenUsingParse_thenLocalDateTime(){ - Assert.assertEquals(LocalDate.of(2016, Month.MAY, 10),useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalDate()); - Assert.assertEquals(LocalTime.of(6,30),useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalTime()); + public void givenString_whenUsingParse_thenLocalDateTime() { + Assert.assertEquals(LocalDate.of(2016, Month.MAY, 10), useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalDate()); + Assert.assertEquals(LocalTime.of(6, 30), useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalTime()); } } diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java index dcfca792af..8f1997e9e8 100644 --- a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java +++ b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java @@ -8,47 +8,47 @@ import org.junit.Assert; import org.junit.Test; public class UseLocalDateUnitTest { - + UseLocalDate useLocalDate = new UseLocalDate(); - + @Test - public void givenValues_whenUsingFactoryOf_thenLocalDate(){ - Assert.assertEquals("2016-05-10",useLocalDate.getLocalDateUsingFactoryOfMethod(2016,5,10).toString()); + public void givenValues_whenUsingFactoryOf_thenLocalDate() { + Assert.assertEquals("2016-05-10", useLocalDate.getLocalDateUsingFactoryOfMethod(2016, 5, 10).toString()); } - + @Test - public void givenString_whenUsingParse_thenLocalDate(){ - Assert.assertEquals("2016-05-10",useLocalDate.getLocalDateUsingParseMethod("2016-05-10").toString()); + public void givenString_whenUsingParse_thenLocalDate() { + Assert.assertEquals("2016-05-10", useLocalDate.getLocalDateUsingParseMethod("2016-05-10").toString()); } - + @Test - public void whenUsingClock_thenLocalDate(){ - Assert.assertEquals(LocalDate.now(),useLocalDate.getLocalDateFromClock()); + public void whenUsingClock_thenLocalDate() { + Assert.assertEquals(LocalDate.now(), useLocalDate.getLocalDateFromClock()); } - + @Test - public void givenDate_whenUsingPlus_thenNextDay(){ - Assert.assertEquals(LocalDate.now().plusDays(1),useLocalDate.getNextDay(LocalDate.now())); + public void givenDate_whenUsingPlus_thenNextDay() { + Assert.assertEquals(LocalDate.now().plusDays(1), useLocalDate.getNextDay(LocalDate.now())); } - + @Test - public void givenDate_whenUsingMinus_thenPreviousDay(){ - Assert.assertEquals(LocalDate.now().minusDays(1),useLocalDate.getPreviousDay(LocalDate.now())); + public void givenDate_whenUsingMinus_thenPreviousDay() { + Assert.assertEquals(LocalDate.now().minusDays(1), useLocalDate.getPreviousDay(LocalDate.now())); } - + @Test - public void givenToday_whenUsingGetDayOfWeek_thenDayOfWeek(){ - Assert.assertEquals(DayOfWeek.SUNDAY,useLocalDate.getDayOfWeek(LocalDate.parse("2016-05-22"))); + public void givenToday_whenUsingGetDayOfWeek_thenDayOfWeek() { + Assert.assertEquals(DayOfWeek.SUNDAY, useLocalDate.getDayOfWeek(LocalDate.parse("2016-05-22"))); } - + @Test - public void givenToday_whenUsingWithTemporalAdjuster_thenFirstDayOfMonth(){ - Assert.assertEquals(1,useLocalDate.getFirstDayOfMonth().getDayOfMonth()); + public void givenToday_whenUsingWithTemporalAdjuster_thenFirstDayOfMonth() { + Assert.assertEquals(1, useLocalDate.getFirstDayOfMonth().getDayOfMonth()); } - + @Test - public void givenLocalDate_whenUsingAtStartOfDay_thenReturnMidnight(){ - Assert.assertEquals(LocalDateTime.parse("2016-05-22T00:00:00"),useLocalDate.getStartOfDay(LocalDate.parse("2016-05-22"))); + public void givenLocalDate_whenUsingAtStartOfDay_thenReturnMidnight() { + Assert.assertEquals(LocalDateTime.parse("2016-05-22T00:00:00"), useLocalDate.getStartOfDay(LocalDate.parse("2016-05-22"))); } } diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java b/core-java/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java index 520b79d4bf..996e200ae9 100644 --- a/core-java/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java +++ b/core-java/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java @@ -6,31 +6,31 @@ import org.junit.Assert; import org.junit.Test; public class UseLocalTimeUnitTest { - + UseLocalTime useLocalTime = new UseLocalTime(); - + @Test - public void givenValues_whenUsingFactoryOf_thenLocalTime(){ - Assert.assertEquals("07:07:07",useLocalTime.getLocalTimeUsingFactoryOfMethod(7,7,7).toString()); + public void givenValues_whenUsingFactoryOf_thenLocalTime() { + Assert.assertEquals("07:07:07", useLocalTime.getLocalTimeUsingFactoryOfMethod(7, 7, 7).toString()); } - + @Test - public void givenString_whenUsingParse_thenLocalTime(){ - Assert.assertEquals("06:30",useLocalTime.getLocalTimeUsingParseMethod("06:30").toString()); + public void givenString_whenUsingParse_thenLocalTime() { + Assert.assertEquals("06:30", useLocalTime.getLocalTimeUsingParseMethod("06:30").toString()); } - + @Test - public void givenTime_whenAddHour_thenLocalTime(){ - Assert.assertEquals("07:30",useLocalTime.addAnHour(LocalTime.of(6,30)).toString()); + public void givenTime_whenAddHour_thenLocalTime() { + Assert.assertEquals("07:30", useLocalTime.addAnHour(LocalTime.of(6, 30)).toString()); } - + @Test - public void getHourFromLocalTime(){ - Assert.assertEquals(1, useLocalTime.getHourFromLocalTime(LocalTime.of(1,1))); + public void getHourFromLocalTime() { + Assert.assertEquals(1, useLocalTime.getHourFromLocalTime(LocalTime.of(1, 1))); } - + @Test - public void getLocalTimeWithMinuteSetToValue(){ - Assert.assertEquals(LocalTime.of(10, 20), useLocalTime.getLocalTimeWithMinuteSetToValue(LocalTime.of(10,10), 20)); + public void getLocalTimeWithMinuteSetToValue() { + Assert.assertEquals(LocalTime.of(10, 20), useLocalTime.getLocalTimeWithMinuteSetToValue(LocalTime.of(10, 10), 20)); } } diff --git a/core-java/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java b/core-java/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java index a060d974ed..7c030c328a 100644 --- a/core-java/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java +++ b/core-java/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java @@ -7,20 +7,20 @@ import org.junit.Assert; import org.junit.Test; public class UsePeriodUnitTest { - UsePeriod usingPeriod=new UsePeriod(); - + UsePeriod usingPeriod = new UsePeriod(); + @Test - public void givenPeriodAndLocalDate_thenCalculateModifiedDate(){ + public void givenPeriodAndLocalDate_thenCalculateModifiedDate() { Period period = Period.ofDays(1); LocalDate localDate = LocalDate.parse("2007-05-10"); - Assert.assertEquals(localDate.plusDays(1),usingPeriod.modifyDates(localDate, period)); + Assert.assertEquals(localDate.plusDays(1), usingPeriod.modifyDates(localDate, period)); } - + @Test - public void givenDates_thenGetPeriod(){ + public void givenDates_thenGetPeriod() { LocalDate localDate1 = LocalDate.parse("2007-05-10"); LocalDate localDate2 = LocalDate.parse("2007-05-15"); - + Assert.assertEquals(Period.ofDays(5), usingPeriod.getDifferenceBetweenDates(localDate1, localDate2)); } } diff --git a/core-java/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java b/core-java/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java index d5652430fe..5fb079b94c 100644 --- a/core-java/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java +++ b/core-java/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java @@ -8,13 +8,13 @@ import org.junit.Assert; import org.junit.Test; public class UseZonedDateTimeUnitTest { - - UseZonedDateTime zonedDateTime=new UseZonedDateTime(); - + + UseZonedDateTime zonedDateTime = new UseZonedDateTime(); + @Test - public void givenZoneId_thenZonedDateTime(){ - ZoneId zoneId=ZoneId.of("Europe/Paris"); - ZonedDateTime zonedDatetime=zonedDateTime.getZonedDateTime(LocalDateTime.parse("2016-05-20T06:30"), zoneId); - Assert.assertEquals(zoneId,ZoneId.from(zonedDatetime)); + public void givenZoneId_thenZonedDateTime() { + ZoneId zoneId = ZoneId.of("Europe/Paris"); + ZonedDateTime zonedDatetime = zonedDateTime.getZonedDateTime(LocalDateTime.parse("2016-05-20T06:30"), zoneId); + Assert.assertEquals(zoneId, ZoneId.from(zonedDatetime)); } } diff --git a/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java b/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java index 0e3ec29dfd..c944dfa6fe 100644 --- a/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java +++ b/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java @@ -32,7 +32,6 @@ public class EncoderDecoderUnitTest { return encoded; } - private String decode(String value) { String decoded = null; try { @@ -59,9 +58,7 @@ public class EncoderDecoderUnitTest { requestParams.put("key2", "value@!$2"); requestParams.put("key3", "value%3"); - String encodedURL = requestParams.keySet().stream() - .map(key -> key + "=" + encodeValue(requestParams.get(key))) - .collect(joining("&", "http://www.baeldung.com?", "")); + String encodedURL = requestParams.keySet().stream().map(key -> key + "=" + encodeValue(requestParams.get(key))).collect(joining("&", "http://www.baeldung.com?", "")); Assert.assertThat(testUrl, CoreMatchers.is(encodedURL)); } @@ -72,12 +69,9 @@ public class EncoderDecoderUnitTest { String query = url.getQuery(); - String decodedQuery = Arrays.stream(query.split("&")) - .map(param -> param.split("=")[0] + "=" + decode(param.split("=")[1])) - .collect(joining("&")); + String decodedQuery = Arrays.stream(query.split("&")).map(param -> param.split("=")[0] + "=" + decode(param.split("=")[1])).collect(joining("&")); - Assert.assertEquals( - "http://www.baeldung.com?key1=value 1&key2=value@!$2&key3=value%3", url.getProtocol() + "://" + url.getHost() + "?" + decodedQuery); + Assert.assertEquals("http://www.baeldung.com?key1=value 1&key2=value@!$2&key3=value%3", url.getProtocol() + "://" + url.getHost() + "?" + decodedQuery); } } diff --git a/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java index de60becfce..6cf6ad3551 100644 --- a/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java +++ b/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.enums; - import org.junit.Test; import java.util.ArrayList; diff --git a/core-java/src/test/java/com/baeldung/java/networking/udp/UDPIntegrationTest.java b/core-java/src/test/java/com/baeldung/java/networking/udp/UDPIntegrationTest.java index 2ca2d3a0c8..aff851ae4b 100644 --- a/core-java/src/test/java/com/baeldung/java/networking/udp/UDPIntegrationTest.java +++ b/core-java/src/test/java/com/baeldung/java/networking/udp/UDPIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.java.networking.udp; - import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core-java/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/core-java/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java index d9a72063af..73a10a57f4 100644 --- a/core-java/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java @@ -27,18 +27,14 @@ public class Java8StreamApiUnitTest { @Before public void init() { - productList = Arrays.asList( - new Product(23, "potatoes"), new Product(14, "orange"), - new Product(13, "lemon"), new Product(23, "bread"), - new Product(13, "sugar")); + productList = Arrays.asList(new Product(23, "potatoes"), new Product(14, "orange"), new Product(13, "lemon"), new Product(23, "bread"), new Product(13, "sugar")); } @Test public void checkPipeline_whenStreamOneElementShorter_thenCorrect() { List list = Arrays.asList("abc1", "abc2", "abc3"); - long size = list.stream().skip(1) - .map(element -> element.substring(0, 3)).count(); + long size = list.stream().skip(1).map(element -> element.substring(0, 3)).count(); assertEquals(list.size() - 1, size); } @@ -48,11 +44,10 @@ public class Java8StreamApiUnitTest { List list = Arrays.asList("abc1", "abc2", "abc3"); counter = 0; - long sizeFirst = list.stream() - .skip(2).map(element -> { - wasCalled(); - return element.substring(0, 3); - }).count(); + long sizeFirst = list.stream().skip(2).map(element -> { + wasCalled(); + return element.substring(0, 3); + }).count(); assertEquals(1, counter); counter = 0; @@ -84,7 +79,7 @@ public class Java8StreamApiUnitTest { Stream streamOfArray = Stream.of("a", "b", "c"); assertEquals(3, streamOfArray.count()); - String[] arr = new String[]{"a", "b", "c"}; + String[] arr = new String[] { "a", "b", "c" }; Stream streamOfArrayPart = Arrays.stream(arr, 1, 3); assertEquals(2, streamOfArrayPart.count()); @@ -112,7 +107,7 @@ public class Java8StreamApiUnitTest { } assertEquals("a", streamOfStrings.findFirst().get()); - Stream streamBuilder = Stream.builder().add("a").add("b").add("c").build(); + Stream streamBuilder = Stream. builder().add("a").add("b").add("c").build(); assertEquals(3, streamBuilder.count()); Stream streamGenerated = Stream.generate(() -> "element").limit(10); @@ -126,14 +121,13 @@ public class Java8StreamApiUnitTest { public void runStreamPipeline_whenOrderIsRight_thenCorrect() { List list = Arrays.asList("abc1", "abc2", "abc3"); - Optional stream = list.stream() - .filter(element -> { - log.info("filter() was called"); - return element.contains("2"); - }).map(element -> { - log.info("map() was called"); - return element.toUpperCase(); - }).findFirst(); + Optional stream = list.stream().filter(element -> { + log.info("filter() was called"); + return element.contains("2"); + }).map(element -> { + log.info("map() was called"); + return element.toUpperCase(); + }).findFirst(); } @Test @@ -145,32 +139,28 @@ public class Java8StreamApiUnitTest { int reducedTwoParams = IntStream.range(1, 4).reduce(10, (a, b) -> a + b); assertEquals(16, reducedTwoParams); - int reducedThreeParams = Stream.of(1, 2, 3) - .reduce(10, (a, b) -> a + b, (a, b) -> { - log.info("combiner was called"); - return a + b; - }); + int reducedThreeParams = Stream.of(1, 2, 3).reduce(10, (a, b) -> a + b, (a, b) -> { + log.info("combiner was called"); + return a + b; + }); assertEquals(16, reducedThreeParams); - int reducedThreeParamsParallel = Arrays.asList(1, 2, 3).parallelStream() - .reduce(10, (a, b) -> a + b, (a, b) -> { - log.info("combiner was called"); - return a + b; - }); + int reducedThreeParamsParallel = Arrays.asList(1, 2, 3).parallelStream().reduce(10, (a, b) -> a + b, (a, b) -> { + log.info("combiner was called"); + return a + b; + }); assertEquals(36, reducedThreeParamsParallel); } @Test public void collecting_whenAsExpected_thenCorrect() { - List collectorCollection = productList.stream() - .map(Product::getName).collect(Collectors.toList()); + List collectorCollection = productList.stream().map(Product::getName).collect(Collectors.toList()); assertTrue(collectorCollection instanceof List); assertEquals(5, collectorCollection.size()); - String listToString = productList.stream().map(Product::getName) - .collect(Collectors.joining(", ", "[", "]")); + String listToString = productList.stream().map(Product::getName).collect(Collectors.joining(", ", "[", "]")); assertTrue(listToString.contains(",") && listToString.contains("[") && listToString.contains("]")); @@ -180,36 +170,29 @@ public class Java8StreamApiUnitTest { int summingPrice = productList.stream().collect(Collectors.summingInt(Product::getPrice)); assertEquals(86, summingPrice); - IntSummaryStatistics statistics = productList.stream() - .collect(Collectors.summarizingInt(Product::getPrice)); + IntSummaryStatistics statistics = productList.stream().collect(Collectors.summarizingInt(Product::getPrice)); assertEquals(23, statistics.getMax()); - Map> collectorMapOfLists = productList.stream() - .collect(Collectors.groupingBy(Product::getPrice)); + Map> collectorMapOfLists = productList.stream().collect(Collectors.groupingBy(Product::getPrice)); assertEquals(3, collectorMapOfLists.keySet().size()); - Map> mapPartioned = productList.stream() - .collect(Collectors.partitioningBy(element -> element.getPrice() > 15)); + Map> mapPartioned = productList.stream().collect(Collectors.partitioningBy(element -> element.getPrice() > 15)); assertEquals(2, mapPartioned.keySet().size()); } @Test(expected = UnsupportedOperationException.class) public void collect_whenThrows_thenCorrect() { - Set unmodifiableSet = productList.stream() - .collect(Collectors.collectingAndThen(Collectors.toSet(), - Collections::unmodifiableSet)); + Set unmodifiableSet = productList.stream().collect(Collectors.collectingAndThen(Collectors.toSet(), Collections::unmodifiableSet)); unmodifiableSet.add(new Product(4, "tea")); } @Test public void customCollector_whenResultContainsAllElementsFrSource_thenCorrect() { - Collector> toLinkedList = - Collector.of(LinkedList::new, LinkedList::add, - (first, second) -> { - first.addAll(second); - return first; - }); + Collector> toLinkedList = Collector.of(LinkedList::new, LinkedList::add, (first, second) -> { + first.addAll(second); + return first; + }); LinkedList linkedListOfPersons = productList.stream().collect(toLinkedList); assertTrue(linkedListOfPersons.containsAll(productList)); @@ -219,23 +202,20 @@ public class Java8StreamApiUnitTest { public void parallelStream_whenWorks_thenCorrect() { Stream streamOfCollection = productList.parallelStream(); boolean isParallel = streamOfCollection.isParallel(); - boolean haveBigPrice = streamOfCollection.map(product -> product.getPrice() * 12) - .anyMatch(price -> price > 200); + boolean haveBigPrice = streamOfCollection.map(product -> product.getPrice() * 12).anyMatch(price -> price > 200); assertTrue(isParallel && haveBigPrice); } @Test public void parallel_whenIsParallel_thenCorrect() { - IntStream intStreamParallel = - IntStream.range(1, 150).parallel().map(element -> element * 34); + IntStream intStreamParallel = IntStream.range(1, 150).parallel().map(element -> element * 34); boolean isParallel = intStreamParallel.isParallel(); assertTrue(isParallel); } @Test public void parallel_whenIsSequential_thenCorrect() { - IntStream intStreamParallel = - IntStream.range(1, 150).parallel().map(element -> element * 34); + IntStream intStreamParallel = IntStream.range(1, 150).parallel().map(element -> element * 34); IntStream intStreamSequential = intStreamParallel.sequential(); boolean isParallel = intStreamParallel.isParallel(); assertFalse(isParallel); diff --git a/core-java/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java b/core-java/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java index fc83553c6e..e40f9f9506 100644 --- a/core-java/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java +++ b/core-java/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java @@ -36,7 +36,7 @@ public class Java8StreamsUnitTest { @Test public void checkStreamCount_whenCreating_givenDifferentSources() { - String[] arr = new String[]{"a", "b", "c"}; + String[] arr = new String[] { "a", "b", "c" }; Stream streamArr = Arrays.stream(arr); assertEquals(streamArr.count(), 3); @@ -47,14 +47,12 @@ public class Java8StreamsUnitTest { assertEquals(count, 9); } - @Test public void checkStreamCount_whenOperationFilter_thanCorrect() { Stream streamFilter = list.stream().filter(element -> element.isEmpty()); assertEquals(streamFilter.count(), 2); } - @Test public void checkStreamCount_whenOperationMap_thanCorrect() { List uris = new ArrayList<>(); @@ -65,12 +63,10 @@ public class Java8StreamsUnitTest { List details = new ArrayList<>(); details.add(new Detail()); details.add(new Detail()); - Stream streamFlatMap = details.stream() - .flatMap(detail -> detail.getParts().stream()); + Stream streamFlatMap = details.stream().flatMap(detail -> detail.getParts().stream()); assertEquals(streamFlatMap.count(), 4); } - @Test public void checkStreamCount_whenOperationMatch_thenCorrect() { boolean isValid = list.stream().anyMatch(element -> element.contains("h")); @@ -81,7 +77,6 @@ public class Java8StreamsUnitTest { assertFalse(isValidTwo); } - @Test public void checkStreamReducedValue_whenOperationReduce_thenCorrect() { List integers = new ArrayList<>(); @@ -94,20 +89,17 @@ public class Java8StreamsUnitTest { @Test public void checkStreamContains_whenOperationCollect_thenCorrect() { - List resultList = list.stream() - .map(element -> element.toUpperCase()) - .collect(Collectors.toList()); + List resultList = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList()); assertEquals(resultList.size(), list.size()); assertTrue(resultList.contains("")); } - @Test public void checkParallelStream_whenDoWork() { list.parallelStream().forEach(element -> doWork(element)); } private void doWork(String string) { - assertTrue(true); //just imitate an amount of work + assertTrue(true); // just imitate an amount of work } } diff --git a/core-java/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java b/core-java/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java index fd13a4fd78..550e9dda6f 100644 --- a/core-java/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java +++ b/core-java/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java @@ -46,9 +46,7 @@ public class GuavaThreadPoolIntegrationTest { ListenableFuture future1 = listeningExecutorService.submit(() -> "Hello"); ListenableFuture future2 = listeningExecutorService.submit(() -> "World"); - String greeting = Futures.allAsList(future1, future2).get() - .stream() - .collect(Collectors.joining(" ")); + String greeting = Futures.allAsList(future1, future2).get().stream().collect(Collectors.joining(" ")); assertEquals("Hello World", greeting); } diff --git a/core-java/src/test/java/org/baeldung/java/enums/PizzaUnitTest.java b/core-java/src/test/java/org/baeldung/java/enums/PizzaUnitTest.java index cc042eeca9..bb3abff28d 100644 --- a/core-java/src/test/java/org/baeldung/java/enums/PizzaUnitTest.java +++ b/core-java/src/test/java/org/baeldung/java/enums/PizzaUnitTest.java @@ -77,5 +77,5 @@ public class PizzaUnitTest { pz.deliver(); assertTrue(pz.getStatus() == Pizza.PizzaStatusEnum.DELIVERED); } - + } From 108adf84f6847cc4221c59024dfb0567748e00d3 Mon Sep 17 00:00:00 2001 From: "nguyenminhtuanfit@gmail.com" Date: Fri, 4 Nov 2016 07:57:11 +0700 Subject: [PATCH 050/115] aspectj introduction --- aspectj/pom.xml | 131 ++++++++++++++++++ .../java/com/baeldung/aspectj/Account.java | 13 ++ .../com/baeldung/aspectj/AccountAspect.aj | 30 ++++ .../java/com/baeldung/aspectj/Secured.java | 12 ++ .../com/baeldung/aspectj/SecuredMethod.java | 23 +++ .../baeldung/aspectj/SecuredMethodAspect.java | 27 ++++ aspectj/src/main/resources/META-INF/aop.xml | 8 ++ aspectj/src/main/resources/logback.xml | 18 +++ .../baeldung/aspectj/test/AccountTest.java | 27 ++++ .../aspectj/test/SecuredMethodTest.java | 14 ++ 10 files changed, 303 insertions(+) create mode 100644 aspectj/pom.xml create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/Account.java create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/Secured.java create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java create mode 100644 aspectj/src/main/resources/META-INF/aop.xml create mode 100644 aspectj/src/main/resources/logback.xml create mode 100644 aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java create mode 100644 aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java diff --git a/aspectj/pom.xml b/aspectj/pom.xml new file mode 100644 index 0000000000..2a1cff11c8 --- /dev/null +++ b/aspectj/pom.xml @@ -0,0 +1,131 @@ + + 4.0.0 + com.baeldung + aspectj + 0.0.1-SNAPSHOT + aspectj + + + + org.aspectj + 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 + junit + ${junit.version} + + + + + + aspectj + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${source.version} + ${source.version} + + + + + + org.codehaus.mojo + aspectj-maven-plugin + 1.7 + + ${source.version} + ${source.version} + ${source.version} + true + true + ignore + ${project.build.sourceEncoding} + + + + + + + compile + test-compile + + + + + + + + + + + 1.8 + 1.6.11 + UTF-8 + 1.8.9 + 1.7.21 + 1.1.7 + 3.5.1 + 4.12 + + + \ No newline at end of file diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Account.java b/aspectj/src/main/java/com/baeldung/aspectj/Account.java new file mode 100644 index 0000000000..59cab72ebf --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/Account.java @@ -0,0 +1,13 @@ +package com.baeldung.aspectj; + +public class Account { + int balance = 20; + + public boolean withdraw(int amount) { + if (balance - amount > 0) { + balance = balance - amount; + return true; + } else + return false; + } +} diff --git a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj new file mode 100644 index 0000000000..3bdddd22a8 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj @@ -0,0 +1,30 @@ +package com.baeldung.aspectj; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public aspect AccountAspect { + private static final Logger logger = LoggerFactory.getLogger(AccountAspect.class); + final int MIN_BALANCE = 10; + + pointcut callWithDraw(int amount, Account account): + call(boolean Account.withdraw(int)) && args(amount) && target(account); + + before(int amount, Account account) : callWithDraw(amount, account) { + logger.info(" Balance before withdrawal: {}", account.balance); + logger.info(" Withdraw ammout: {}", amount); + } + + boolean around(int amount, Account account) : callWithDraw(amount, account) { + if (account.balance - amount >= MIN_BALANCE) + return proceed(amount, account); + else { + logger.info("Withdrawal Rejected!"); + return false; + } + } + + after(int amount, Account balance) : callAtWithDraw(amount, balance) { + logger.info("Balance after withdrawal : {}", balance.balance); + } +} diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Secured.java b/aspectj/src/main/java/com/baeldung/aspectj/Secured.java new file mode 100644 index 0000000000..923f208c2f --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/Secured.java @@ -0,0 +1,12 @@ +package com.baeldung.aspectj; + +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.METHOD) +public @interface Secured { + public boolean isLocked() default false; +} diff --git a/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java new file mode 100644 index 0000000000..aa4b733a00 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java @@ -0,0 +1,23 @@ +package com.baeldung.aspectj; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SecuredMethod { + private static final Logger logger = LoggerFactory.getLogger(SecuredMethod.class); + + @Secured(isLocked = true) + public void lockedMethod() throws Exception { + logger.info("lockedMethod"); + } + + @Secured(isLocked = false) + public void unlockedMethod() { + logger.info("unlockedMethod"); + } + + public static void main(String[] args) throws Exception { + SecuredMethod sv = new SecuredMethod(); + sv.lockedMethod(); + } +} \ No newline at end of file diff --git a/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java new file mode 100644 index 0000000000..9ea45ec43b --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java @@ -0,0 +1,27 @@ +package com.baeldung.aspectj; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Aspect +public class SecuredMethodAspect { + private static final Logger logger = LoggerFactory.getLogger(SecuredMethodAspect.class); + + @Pointcut("@annotation(secured)") + public void callAt(Secured secured) { + } + + @Around("callAt(secured)") + public Object around(ProceedingJoinPoint pjp, Secured secured) throws Throwable { + if (secured.isLocked()) { + logger.info(pjp.getSignature().toLongString() + " is locked"); + return null; + } else { + return pjp.proceed(); + } + } +} diff --git a/aspectj/src/main/resources/META-INF/aop.xml b/aspectj/src/main/resources/META-INF/aop.xml new file mode 100644 index 0000000000..f930cde942 --- /dev/null +++ b/aspectj/src/main/resources/META-INF/aop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/aspectj/src/main/resources/logback.xml b/aspectj/src/main/resources/logback.xml new file mode 100644 index 0000000000..8b566286b8 --- /dev/null +++ b/aspectj/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n + + + + + + + + + + + + \ No newline at end of file diff --git a/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java b/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java new file mode 100644 index 0000000000..d90793f681 --- /dev/null +++ b/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java @@ -0,0 +1,27 @@ +package com.baeldung.aspectj.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.aspectj.Account; + +public class AccountTest { + private Account account; + + @Before + public void before() { + account = new Account(); + } + + @Test + public void givenBalance20AndMinBalance10_whenWithdraw5_thenSuccess() { + assertTrue(account.withdraw(5)); + } + + @Test + public void givenBalance20AndMinBalance10_whenWithdraw100_thenFail() { + assertFalse(account.withdraw(100)); + } +} diff --git a/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java b/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java new file mode 100644 index 0000000000..924bb279fd --- /dev/null +++ b/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java @@ -0,0 +1,14 @@ +package com.baeldung.aspectj.test; + +import org.junit.Test; + +import com.baeldung.aspectj.SecuredMethod; + +public class SecuredMethodTest { + @Test + public void testMethod() throws Exception { + SecuredMethod service = new SecuredMethod(); + service.unlockedMethod(); + service.lockedMethod(); + } +} \ No newline at end of file From 8848d988095484c6d904ccf33e8c569b9899d9be Mon Sep 17 00:00:00 2001 From: Egima profile Date: Fri, 4 Nov 2016 10:41:57 +0300 Subject: [PATCH 051/115] FileTest names fixed with phrase method/API changes (#801) * made changes to java reflection * removed redundant method makeSound in Animal abstract class * added project for play-framework article * added project for regex * changed regex project from own model to core-java * added project for routing in play * made changes to regex project * refactored code for REST API with Play project * refactored student store indexing to zero base * added unit tests, removed bad names * added NIO Selector project under core-java module * requested changes made * added project for nio2 * standardized exception based tests * fixed exception based tests * removed redundant files * added network interface project * used UUID other than timestamps * fixed network interface tests * removed filetest change * made changes to NIO2 FileTest names --- .../src/test/java/com/baeldung/java/nio2/FileTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java b/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java index f1cb572d9b..64fbb4ae25 100644 --- a/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java +++ b/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java @@ -32,7 +32,7 @@ public class FileTest { } @Test - public void givenExistentDirPath_whenConfirmsNotRegularFile_thenCorrect() { + public void givenDirPath_whenConfirmsNotRegularFile_thenCorrect() { Path p = Paths.get(HOME); assertFalse(Files.isRegularFile(p)); } @@ -118,7 +118,7 @@ public class FileTest { } @Test - public void givenFilePath_whenCreatesTempFileWithDefaultsNaming_thenCorrect() throws IOException { + public void givenPath_whenCreatesTempFileWithDefaults_thenCorrect() throws IOException { Path p = Paths.get(HOME + "/"); p = Files.createTempFile(p, null, null); // like 8600179353689423985.tmp @@ -161,7 +161,9 @@ public class FileTest { @Test(expected = NoSuchFileException.class) public void givenInexistentFile_whenDeleteFails_thenCorrect() throws IOException { Path p = Paths.get(HOME + "/inexistentFile.txt"); + assertFalse(Files.exists(p)); Files.delete(p); + } @Test From 0fbf3945e0d3b1ebc10f28b129403918d4f9fd76 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 4 Nov 2016 09:47:48 +0000 Subject: [PATCH 052/115] Rename NetworkInterfaceTest --- ...st.java => NetworkInterfaceManualTest.java} | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) rename core-java/src/test/java/com/baeldung/java/networking/interfaces/{NetworkInterfaceTest.java => NetworkInterfaceManualTest.java} (95%) diff --git a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceTest.java b/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java similarity index 95% rename from core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceTest.java rename to core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java index 4a8ef57b8f..8635a24f18 100644 --- a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceTest.java +++ b/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java @@ -1,18 +1,14 @@ package com.baeldung.java.networking.interfaces; -import static org.junit.Assert.*; - -import java.net.InetAddress; -import java.net.InterfaceAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.Enumeration; -import java.util.List; - import org.junit.Test; -public class NetworkInterfaceTest { +import java.net.*; +import java.util.Enumeration; +import java.util.List; + +import static org.junit.Assert.*; + +public class NetworkInterfaceManualTest { @Test public void givenName_whenReturnsNetworkInterface_thenCorrect() throws SocketException { NetworkInterface nif = NetworkInterface.getByName("lo"); From 7185c54c2b9a551528ed37bba8b1e1aca77c6f9c Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 4 Nov 2016 09:49:17 +0000 Subject: [PATCH 053/115] Rename PathTest --- .../baeldung/java/nio2/{PathTest.java => PathManualTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java/src/test/java/com/baeldung/java/nio2/{PathTest.java => PathManualTest.java} (99%) diff --git a/core-java/src/test/java/com/baeldung/java/nio2/PathTest.java b/core-java/src/test/java/com/baeldung/java/nio2/PathManualTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/java/nio2/PathTest.java rename to core-java/src/test/java/com/baeldung/java/nio2/PathManualTest.java index 004aeb3deb..acfb2c08e9 100644 --- a/core-java/src/test/java/com/baeldung/java/nio2/PathTest.java +++ b/core-java/src/test/java/com/baeldung/java/nio2/PathManualTest.java @@ -13,7 +13,7 @@ import java.util.Date; import org.junit.Test; -public class PathTest { +public class PathManualTest { private static final String HOME = System.getProperty("user.home"); From a028c5c9f226db3f12f266b70bf2a807f970da53 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 4 Nov 2016 15:45:06 +0000 Subject: [PATCH 054/115] Refactor PDF2ImageExample --- .../main/java/com/baeldung/pdf/PDF2ImageExample.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java index d7587dfc17..00778d16c1 100644 --- a/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2ImageExample.java @@ -1,14 +1,14 @@ package com.baeldung.pdf; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.tools.imageio.ImageIOUtil; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + public class PDF2ImageExample { private static final String FILENAME = "src/main/resources/pdf.pdf"; @@ -28,7 +28,7 @@ public class PDF2ImageExample { PDFRenderer pdfRenderer = new PDFRenderer(document); for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); - ImageIOUtil.writeImage(bim, "src/output/pdf" + "-" + (page + 1) + "." + extension, 300); + ImageIOUtil.writeImage(bim, String.format("src/output/pdf-%d.%s", page + 1, extension), 300); } document.close(); } From 6e5916e1bcea23dd61da24b2231d286ac46c73ea Mon Sep 17 00:00:00 2001 From: eugenp Date: Fri, 4 Nov 2016 21:50:25 +0200 Subject: [PATCH 055/115] minor artifact cleanup --- spring-integration/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index 886b4b21a6..b33f8bd740 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.baeldung.samples.spring.integration - baeldungSIsample + spring-integration 1.0.0.BUILD-SNAPSHOT jar From 8c953fe0f3c15ed8ff128dfe76978c565529e259 Mon Sep 17 00:00:00 2001 From: michal_aibin Date: Fri, 4 Nov 2016 22:23:17 +0100 Subject: [PATCH 056/115] Fix web.xml in spring-mvc-web-vs-initializer project --- spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml index 9bebc263be..5c7a0b52d4 100644 --- a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml @@ -9,11 +9,11 @@ org.springframework.web.servlet.DispatcherServlet - 1 contextConfigLocation classpath*:mvc-configuration.xml + 1 From 90783532a5e91be0592fbf684733719b766ed0a0 Mon Sep 17 00:00:00 2001 From: michal_aibin Date: Fri, 4 Nov 2016 22:42:20 +0100 Subject: [PATCH 057/115] Rollback web.xml --- spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml index 5c7a0b52d4..9bebc263be 100644 --- a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml @@ -9,11 +9,11 @@ org.springframework.web.servlet.DispatcherServlet + 1 contextConfigLocation classpath*:mvc-configuration.xml - 1 From d6363949475c8fbf784cc30d96bdcaf7969a12f7 Mon Sep 17 00:00:00 2001 From: michal_aibin Date: Fri, 4 Nov 2016 22:47:09 +0100 Subject: [PATCH 058/115] Fix web.xml file --- spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml index 9bebc263be..5c7a0b52d4 100644 --- a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml @@ -9,11 +9,11 @@ org.springframework.web.servlet.DispatcherServlet - 1 contextConfigLocation classpath*:mvc-configuration.xml + 1 From c29601db412811fdabe60e46bd79fe3560b84b0e Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 5 Nov 2016 12:12:08 +0000 Subject: [PATCH 059/115] Refactor Bar.java --- .../src/main/java/com/baeldung/persistence/model/Bar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java b/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java index efc6367116..c7f05254cc 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java +++ b/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java @@ -80,7 +80,7 @@ public class Bar implements Serializable { @Column(name = "timestamp") private long timestamp; - @Column(name = "created_date") + @Column(name = "created_date", updatable = false, nullable = false) @CreatedDate private long createdDate; From 04d33298ac01ad2e46cc79b083136ecafab3b97f Mon Sep 17 00:00:00 2001 From: maibin Date: Sat, 5 Nov 2016 22:07:52 +0100 Subject: [PATCH 060/115] Fixes to PDF module (#807) * PDF to X * PDF to X * Remove created doc * Code fixes and cleanup for PDF module * Fix web.xml in spring-mvc-web-vs-initializer project * Rollback web.xml * Fixes to PDF article --- pdf/pom.xml | 18 ---------- .../com/baeldung/pdf/PDF2HTMLExample.java | 18 ++++------ .../com/baeldung/pdf/PDF2TextExample.java | 36 +++++++++---------- 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/pdf/pom.xml b/pdf/pom.xml index 078a364e77..be1e9822e2 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -24,49 +24,31 @@ 3.8.1 test - - - org.apache.pdfbox - pdfbox - 2.0.3 - - org.apache.pdfbox pdfbox-tools 2.0.3 - net.sf.cssbox pdf2dom 1.6 - com.itextpdf itextpdf 5.5.10 - org.apache.poi poi 3.15 - - - org.apache.poi - poi-ooxml - 3.15 - - org.apache.poi poi-scratchpad 3.15 - org.apache.xmlgraphics batik-transcoder diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java index 14e886e23b..0d38208bab 100644 --- a/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2HTMLExample.java @@ -23,17 +23,13 @@ public class PDF2HTMLExample { } private static void generateHTMLFromPDF(String filename) throws ParserConfigurationException, IOException { - try { - PDDocument pdf = PDDocument.load(new File(filename)); - PDFDomTree parser = new PDFDomTree(); - Writer output = new PrintWriter("src/output/pdf.html", "utf-8"); - parser.writeText(pdf, output); - output.close(); - if (pdf != null) { - pdf.close(); - } - } catch (IOException e) { - e.printStackTrace(); + PDDocument pdf = PDDocument.load(new File(filename)); + PDFDomTree parser = new PDFDomTree(); + Writer output = new PrintWriter("src/output/pdf.html", "utf-8"); + parser.writeText(pdf, output); + output.close(); + if (pdf != null) { + pdf.close(); } } } diff --git a/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java b/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java index e4fb29dfaa..c5880a4e91 100644 --- a/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java +++ b/pdf/src/main/java/com/baeldung/pdf/PDF2TextExample.java @@ -23,30 +23,26 @@ public class PDF2TextExample { } private static void generateTxtFromPDF(String filename) throws IOException { - try { - File f = new File(filename); - String parsedText; - PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); - parser.parse(); + File f = new File(filename); + String parsedText; + PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); + parser.parse(); - COSDocument cosDoc = parser.getDocument(); + COSDocument cosDoc = parser.getDocument(); - PDFTextStripper pdfStripper = new PDFTextStripper(); - PDDocument pdDoc = new PDDocument(cosDoc); + PDFTextStripper pdfStripper = new PDFTextStripper(); + PDDocument pdDoc = new PDDocument(cosDoc); - parsedText = pdfStripper.getText(pdDoc); + parsedText = pdfStripper.getText(pdDoc); - if (cosDoc != null) - cosDoc.close(); - if (pdDoc != null) - pdDoc.close(); - - PrintWriter pw = new PrintWriter("src/output/pdf.txt"); - pw.print(parsedText); - pw.close(); - } catch (Exception e) { - e.printStackTrace(); - } + if (cosDoc != null) + cosDoc.close(); + if (pdDoc != null) + pdDoc.close(); + + PrintWriter pw = new PrintWriter("src/output/pdf.txt"); + pw.print(parsedText); + pw.close(); } } From 4d46d5273386270c738f910036f9b0c500d9dfa6 Mon Sep 17 00:00:00 2001 From: oreva Date: Sun, 6 Nov 2016 10:23:19 +0200 Subject: [PATCH 061/115] Patch 0001-Code-cleanup.patch applied. --- .../baeldung/spring/app/config/AppConfig.java | 10 ----- .../spring/mail/EmailServiceImpl.java | 3 +- .../java/com/baeldung/spring/mail/Order.java | 43 ------------------- .../baeldung/spring/mail/OrderManager.java | 31 ------------- 4 files changed, 1 insertion(+), 86 deletions(-) delete mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java delete mode 100644 spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java index 9f8339c2fe..9078d44764 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/app/config/AppConfig.java @@ -45,16 +45,6 @@ public class AppConfig extends WebMvcConfigurerAdapter { return resolver; } - @Bean - public SimpleMailMessage templateOrderMessage() { - SimpleMailMessage message = new SimpleMailMessage(); - message.setText("Dear %s %s, \nthank you for placing order.\n" + - "\n" + - "Sincerely yours,\n" + - "Yourcompany."); - return message; - } - @Bean public SimpleMailMessage templateSimpleMessage() { SimpleMailMessage message = new SimpleMailMessage(); diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java index dab5400d25..ca418a7d90 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/EmailServiceImpl.java @@ -24,7 +24,6 @@ public class EmailServiceImpl implements EmailService { public void sendSimpleMessage(String to, String subject, String text) { try { SimpleMailMessage message = new SimpleMailMessage(); - message.setTo(to); message.setSubject(subject); message.setText(text); @@ -40,7 +39,7 @@ public class EmailServiceImpl implements EmailService { String subject, SimpleMailMessage template, String ...templateArgs) { - String text = String.format(template.getText(), templateArgs); + String text = String.format(template.getText(), templateArgs); sendSimpleMessage(to, subject, text); } diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java deleted file mode 100644 index cd1448b84b..0000000000 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/Order.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.spring.mail; - -/** - * Created by Olga on 8/22/2016. - */ -public class Order { - - public Order(String customerEmail, - String customerFirstName, - String customerLastName) { - this.customerEmail = customerEmail; - this.customerFirstName = customerFirstName; - this.customerLastName = customerLastName; - } - - private String customerEmail; - private String customerFirstName; - private String customerLastName; - - public String getCustomerEmail() { - return customerEmail; - } - - public void setCustomerEmail(String customerEmail) { - this.customerEmail = customerEmail; - } - - public String getCustomerFirstName() { - return customerFirstName; - } - - public void setCustomerFirstName(String customerFirstName) { - this.customerFirstName = customerFirstName; - } - - public String getCustomerLastName() { - return customerLastName; - } - - public void setCustomerLastName(String customerLastName) { - this.customerLastName = customerLastName; - } -} diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java b/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java deleted file mode 100644 index 5dfe25f20f..0000000000 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/mail/OrderManager.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.spring.mail; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.mail.SimpleMailMessage; -import org.springframework.stereotype.Component; - -/** - * Created by Olga on 8/22/2016. - */ -@Component -public class OrderManager { - @Autowired - public EmailService emailService; - - @Value("${attachment.invoice}") - private String invoiceAttachmentPath; - - @Autowired() - @Qualifier("templateOrderMessage") - public SimpleMailMessage template; - - public void placeOrder(Order order) { - emailService.sendSimpleMessageUsingTemplate(order.getCustomerEmail(), - "Order Confirmation", - template, - order.getCustomerFirstName(), - order.getCustomerLastName()); - } -} From 807a4d2db9fadd1df4976d8b5b3e0d9fd0c30813 Mon Sep 17 00:00:00 2001 From: oreva Date: Sun, 6 Nov 2016 12:07:51 +0200 Subject: [PATCH 062/115] Implemented changes regarding the latest review. --- .../spring/controllers/MailController.java | 49 ++++++++++++- .../src/main/resources/application.properties | 3 +- .../main/webapp/WEB-INF/views/mail/send.jsp | 70 ++++++++++--------- 3 files changed, 86 insertions(+), 36 deletions(-) diff --git a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java index 1f536e3297..768a0f8e7b 100644 --- a/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java +++ b/spring-mvc-email/src/main/java/com/baeldung/spring/controllers/MailController.java @@ -13,7 +13,12 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; /** * Created by Olga on 7/20/2016. @@ -31,8 +36,50 @@ public class MailController { @Qualifier("templateSimpleMessage") public SimpleMailMessage template; + private static final Map> labels; + + static { + labels = new HashMap<>(); + + //Simple email + Map props = new HashMap<>(); + props.put("headerText", "Send Simple Email"); + props.put("messageLabel", "Message"); + props.put("additionalInfo", ""); + labels.put("send", props); + + //Email with template + props = new HashMap<>(); + props.put("headerText", "Send Email Using Template"); + props.put("messageLabel", "Template Parameter"); + props.put("additionalInfo", + "The parameter value will be added to the following message template:
" + + "This is the test email template for your email:
'Template Parameter'
" + ); + labels.put("sendTemplate", props); + + //Email with attachment + props = new HashMap<>(); + props.put("headerText", "Send Email With Attachment"); + props.put("messageLabel", "Message"); + props.put("additionalInfo", "To make sure that you send an attachment with this email, change the value for the 'attachment.invoice' in the application.properties file to the path to the attachment."); + labels.put("sendAttachment", props); + } + @RequestMapping(value = {"/send", "/sendTemplate", "/sendAttachment"}, method = RequestMethod.GET) - public String createMail(Model model) { + public String createMail(Model model, + HttpServletRequest request) { + String action = request.getRequestURL().substring( + request.getRequestURL().lastIndexOf("/") + 1 + ); + Map props = labels.get(action); + Set keys = props.keySet(); + Iterator iterator = keys.iterator(); + while (iterator.hasNext()) { + String key = iterator.next(); + model.addAttribute(key, props.get(key)); + } + model.addAttribute("mailObject", new MailObject()); return "mail/send"; } diff --git a/spring-mvc-email/src/main/resources/application.properties b/spring-mvc-email/src/main/resources/application.properties index ba0608c3af..61a42050e5 100644 --- a/spring-mvc-email/src/main/resources/application.properties +++ b/spring-mvc-email/src/main/resources/application.properties @@ -17,5 +17,4 @@ spring.mail.properties.mail.smtp.starttls.enable=true #spring.mail.properties.mail.smtp.starttls.required=true # path to attachment file -attachment.invoice=path_to_file -#attachment.invoice=c:/invoice.jpg \ No newline at end of file +attachment.invoice=path_to_file \ No newline at end of file diff --git a/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp index 294cb2c49c..d27aa09d9a 100644 --- a/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp +++ b/spring-mvc-email/src/main/webapp/WEB-INF/views/mail/send.jsp @@ -13,40 +13,44 @@

From 9bd83d921cff2b0ccfb0b575a06a5daf2f72dc1b Mon Sep 17 00:00:00 2001 From: danidemi Date: Sun, 6 Nov 2016 15:57:07 +0100 Subject: [PATCH 063/115] Examples done. --- log-mdc-ndc/pom.xml | 32 ++++++----------- .../com/baeldung/mdc/BusinessService.java | 4 ++- .../baeldung/mdc/DefaultBusinessService.java | 14 +++++--- .../com/baeldung/mdc/DelegateBusiness.java | 11 +++--- .../java/com/baeldung/mdc/GenericApp.java | 35 ++++--------------- ...ansactionContext.java => Transaction.java} | 6 ++-- .../com/baeldung/mdc/TransactionFactory.java | 16 +++++++-- .../mdc/log4j/Log4JBusinessService.java | 22 ++++++++++++ .../com/baeldung/mdc/log4j/Log4JRunnable.java | 25 +++++++++++++ .../mdc/log4j/Log4jBusinessService.java | 17 --------- .../com/baeldung/mdc/log4j/Log4jDemo.java | 17 --------- .../com/baeldung/mdc/log4j/Log4jExecutor.java | 21 ----------- .../mdc/log4j2/Log4J2BusinessService.java | 21 +++++++++++ .../baeldung/mdc/log4j2/Log4J2Runnable.java | 25 +++++++++++++ .../mdc/log4j2/Log4j2BusinessService.java | 20 ----------- .../com/baeldung/mdc/log4j2/Log4j2Demo.java | 17 --------- .../baeldung/mdc/log4j2/Log4j2Executor.java | 21 ----------- .../mdc/logback/LogbackBusinessService.java | 18 ---------- .../com/baeldung/mdc/logback/LogbackDemo.java | 17 --------- .../baeldung/mdc/logback/LogbackExecutor.java | 23 ------------ .../mdc/slf4j/Slf4jBusinessService.java | 22 ++++++++++++ .../com/baeldung/mdc/slf4j/Slf4jRunnable.java | 25 +++++++++++++ .../java/com/baeldung/web/Application.java | 12 ------- .../com/baeldung/web/GreetingController.java | 18 ---------- .../src/main/resources/log4j.properties | 10 +++--- 25 files changed, 197 insertions(+), 272 deletions(-) rename log-mdc-ndc/src/main/java/com/baeldung/mdc/{TransactionContext.java => Transaction.java} (76%) create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/web/Application.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java diff --git a/log-mdc-ndc/pom.xml b/log-mdc-ndc/pom.xml index 7e973b940e..8e9d52a750 100644 --- a/log-mdc-ndc/pom.xml +++ b/log-mdc-ndc/pom.xml @@ -7,28 +7,18 @@ logmdcndc tutorial on logging with MDC and NDC - - org.springframework.boot - spring-boot-starter-parent - 1.4.1.RELEASE - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - com.jayway.jsonpath - json-path - test - + + + org.springframework + spring-context + 4.3.3.RELEASE + + + org.springframework + spring-webmvc + 4.3.3.RELEASE + diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java index 21d065dc90..51bebeb713 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java @@ -2,6 +2,8 @@ package com.baeldung.mdc; public interface BusinessService { - boolean transfer(Long amount); + /** Sample service transferring a given amount of money. + * @return {@code true} when the transfer complete successfully, {@code false} otherwise. */ + boolean transfer(long amount); } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java index 1df6783185..d5bb94d21a 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java @@ -1,15 +1,19 @@ package com.baeldung.mdc; +/** + * A fake {@link BusinessService} simulating an actual one. + */ public class DefaultBusinessService implements BusinessService { - @Override - public boolean transfer(Long amount) { + public boolean transfer(long amount) { try { - Thread.sleep((long) (Math.random()*1000)); + // let's pause randomly to properly simulate an actual system. + Thread.sleep((long) (500 + Math.random()*500)); } catch (InterruptedException e) { - // should not happen + // should never happen } - return Math.random() >= 0.5; + // let's simulate both failing and successful transfers + return Math.random() >= 0.25; } } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java index ada8f79b62..d7aab0e284 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java @@ -9,21 +9,20 @@ public abstract class DelegateBusiness { this.delegate = delegate; } - public DelegateBusiness() { this( new DefaultBusinessService() ); } - public boolean transfer(Long amount) { - preTransfer(); + public boolean transfer(long amount) { + preTransfer(amount); boolean outcome = delegate.transfer(amount); - postTransfer(outcome); + postTransfer(amount, outcome); return outcome; } - abstract protected void postTransfer(boolean outcome); + abstract protected void postTransfer(long amount, boolean outcome); - abstract protected void preTransfer(); + abstract protected void preTransfer(long amount); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java index 3eee17ba5d..3652032e0e 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java @@ -1,46 +1,25 @@ package com.baeldung.mdc; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import org.apache.log4j.MDC; +import org.apache.log4j.Logger; -import com.baeldung.mdc.log4j.Log4jBusinessService; +import com.baeldung.mdc.log4j.Log4JRunnable; public class GenericApp { + public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); TransactionFactory transactionFactory = new TransactionFactory(); for(int i=0; i<10; i++){ - - TransactionContext tx = transactionFactory.buildTransaction(); - - executor.submit(new Runnable() { - @Override - public void run() { - new DelegateBusiness() { - - @Override - protected void preTransfer() { - MDC.put("transaction.id", tx.getTransactionId()); - MDC.put("transaction.owner", tx.getOwner()); - MDC.put("transaction.createdAt", tx.getCreatedAt()); - } - - @Override - protected void postTransfer(boolean outcome) { - // TODO Auto-generated method stub - - } - }.transfer( - tx.getAmount() - ); - } - }); + final Transaction tx = transactionFactory.newInstance(); + executor.submit(new Log4JRunnable(tx)); } + executor.shutdown(); + } } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java similarity index 76% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java rename to log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java index c6750edfda..ac0fe75ac5 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionContext.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java @@ -2,18 +2,18 @@ package com.baeldung.mdc; import java.util.Date; -public class TransactionContext { +public class Transaction { private String transactionId; private String owner; private Date createdAt; private Long amount; - public TransactionContext(String transactionId, String owner) { + public Transaction(String transactionId, String owner, long amount) { this.transactionId = transactionId; this.owner = owner; this.createdAt = new Date(); - this.amount = (long) (Math.random()*100); + this.amount = amount; } public String getOwner() { diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java index 4631c662c0..26039ba1d4 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java @@ -1,10 +1,20 @@ package com.baeldung.mdc; +import static java.lang.Math.floor; +import static java.lang.Math.random; + +import java.util.UUID; + public class TransactionFactory { - public TransactionContext buildTransaction() { - TransactionContext ctx = new TransactionContext("" + Math.random(), "owner" + Math.random()); - return ctx; + private static final String[] NAMES = {"John", "Susan", "Marc", "Samantha"}; + + public Transaction newInstance() { + String transactionId = UUID.randomUUID().toString(); + String owner = NAMES[ (int) floor(random()*NAMES.length) ]; + long amount = (long) (random()*1500 + 500); + Transaction tx = new Transaction(transactionId, owner, amount); + return tx; } } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java new file mode 100644 index 0000000000..52439a25f7 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java @@ -0,0 +1,22 @@ +package com.baeldung.mdc.log4j; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.baeldung.mdc.DelegateBusiness; + +final class Log4JBusinessService extends DelegateBusiness { + + private static final Logger logger = LogManager.getLogger(); + + @Override + protected void preTransfer(long amount) { + logger.info("Preparing to transfer {}$."); + } + + @Override + protected void postTransfer(long amount, boolean outcome) { + logger.info("Has transfer of {}$ completed successfully ? {}."); + } + +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java new file mode 100644 index 0000000000..2aeb75f95a --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java @@ -0,0 +1,25 @@ +package com.baeldung.mdc.log4j; + +import org.apache.log4j.MDC; + +import com.baeldung.mdc.Transaction; + +public class Log4JRunnable implements Runnable { + private final Transaction tx; + + public Log4JRunnable(Transaction tx) { + this.tx = tx; + } + + public void run() { + + MDC.put("transaction.id", tx.getTransactionId()); + MDC.put("transaction.owner", tx.getOwner()); + MDC.put("transaction.createdAt", tx.getCreatedAt()); + + new Log4JBusinessService().transfer(tx.getAmount()); + + MDC.clear(); + + } +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java deleted file mode 100644 index 415e686cae..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jBusinessService.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.mdc.log4j; - -import org.apache.log4j.Logger; - -import com.baeldung.mdc.BusinessService; - -public class Log4jBusinessService implements BusinessService { - - private final static Logger logger = Logger.getLogger(Log4jBusinessService.class); - - @Override - public boolean transfer(Long amount) { - logger.info("Executing transaction #" + amount ); - return false; - } - -} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java deleted file mode 100644 index de3945020b..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jDemo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.mdc.log4j; - -public class Log4jDemo { - - public static void main(String[] args) throws InterruptedException { - Log4jExecutor greeter = new Log4jExecutor(); - Thread thread1 = new Thread(greeter); - Thread thread2 = new Thread(greeter); - - thread1.start(); - thread2.start(); - - thread1.join(); - thread2.join(); - } - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java deleted file mode 100644 index 96fe63a3ed..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4jExecutor.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.mdc.log4j; - -import org.apache.log4j.MDC; - -import com.baeldung.mdc.TransactionContext; -import com.baeldung.mdc.TransactionFactory; - -public class Log4jExecutor implements Runnable { - - public void run() { - - TransactionContext ctx = new TransactionFactory().buildTransaction(); - - MDC.put("transaction.id", ctx.getTransactionId()); - MDC.put("transaction.owner", ctx.getOwner()); - MDC.put("transaction.createdAt", ctx.getCreatedAt()); - - new Log4jBusinessService().transfer(ctx.getAmount()); - } - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java new file mode 100644 index 0000000000..8e7655697e --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java @@ -0,0 +1,21 @@ +package com.baeldung.mdc.log4j2; + +import org.apache.log4j.Logger; + +import com.baeldung.mdc.DelegateBusiness; + +final class Log4J2BusinessService extends DelegateBusiness { + + private Logger logger = Logger.getLogger(Log4J2BusinessService.class); + + @Override + protected void preTransfer(long amount) { + logger .info("Preparing to transfer " + amount + "$."); + } + + @Override + protected void postTransfer(long amount, boolean outcome) { + logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); + } + +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java new file mode 100644 index 0000000000..32f2161af8 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java @@ -0,0 +1,25 @@ +package com.baeldung.mdc.log4j2; + +import org.apache.logging.log4j.ThreadContext; + +import com.baeldung.mdc.Transaction; + +final class Log4J2Runnable implements Runnable { + private final Transaction tx; + + Log4J2Runnable(Transaction tx) { + this.tx = tx; + } + + public void run() { + + ThreadContext.put("transaction.id", tx.getTransactionId()); + ThreadContext.put("transaction.owner", tx.getOwner()); + ThreadContext.put("transaction.createdAt", tx.getCreatedAt().toString()); + + new Log4J2BusinessService().transfer(tx.getAmount()); + + ThreadContext.clearAll(); + + } +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java deleted file mode 100644 index d1a8dca518..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2BusinessService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.mdc.log4j2; - - - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import com.baeldung.mdc.BusinessService; - -public class Log4j2BusinessService implements BusinessService { - - private static final Logger logger = LogManager.getLogger(); //Log4j2BusinessService.class); - - @Override - public boolean transfer(Long amount) { - logger.info("Executing transaction #{}", amount ); - return false; - } - -} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java deleted file mode 100644 index 0dec8a9a18..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Demo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.mdc.log4j2; - -public class Log4j2Demo { - - public static void main(String[] args) throws InterruptedException { - Log4j2Executor greeter = new Log4j2Executor(); - Thread thread1 = new Thread(greeter); - Thread thread2 = new Thread(greeter); - - thread1.start(); - thread2.start(); - - thread1.join(); - thread2.join(); - } - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java deleted file mode 100644 index a686486e8e..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4j2Executor.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.mdc.log4j2; - -import org.apache.logging.log4j.ThreadContext; - -import com.baeldung.mdc.TransactionContext; -import com.baeldung.mdc.TransactionFactory; - -public class Log4j2Executor implements Runnable { - - public void run() { - - TransactionContext ctx = new TransactionFactory().buildTransaction(); - - ThreadContext.put("transaction.id", ctx.getTransactionId()); - ThreadContext.put("transaction.owner", ctx.getOwner()); - ThreadContext.put("transaction.createdAt", ctx.getCreatedAt().toString()); - - new Log4j2BusinessService().transfer(ctx.getAmount()); - } - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java deleted file mode 100644 index 74f96ef15e..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackBusinessService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.mdc.logback; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.baeldung.mdc.BusinessService; - -public class LogbackBusinessService implements BusinessService { - - private static final Logger logger = LoggerFactory.getLogger(LogbackBusinessService.class); - - @Override - public boolean transfer(Long amount) { - logger.info("Executing transaction #{}", amount); - return false; - } - -} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java deleted file mode 100644 index 877ded8cc3..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackDemo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.mdc.logback; - -public class LogbackDemo { - - public static void main(String[] args) throws InterruptedException { - LogbackExecutor greeter = new LogbackExecutor(); - Thread thread1 = new Thread(greeter); - Thread thread2 = new Thread(greeter); - - thread1.start(); - thread2.start(); - - thread1.join(); - thread2.join(); - } - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java deleted file mode 100644 index 614188b757..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/logback/LogbackExecutor.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.mdc.logback; - -import org.slf4j.MDC; - -import com.baeldung.mdc.TransactionContext; -import com.baeldung.mdc.TransactionFactory; - -public class LogbackExecutor implements Runnable { - - public void run() { - - TransactionContext ctx = new TransactionFactory().buildTransaction(); - - MDC.put("transaction.id", ctx.getTransactionId()); - MDC.put("transaction.owner", ctx.getOwner()); - MDC.put("transaction.createdAt", ctx.getCreatedAt().toString()); - - new LogbackBusinessService().transfer(ctx.getAmount()); - } - - - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java new file mode 100644 index 0000000000..af14abcf0f --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java @@ -0,0 +1,22 @@ +package com.baeldung.mdc.slf4j; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.mdc.DelegateBusiness; + +final class Slf4jBusinessService extends DelegateBusiness { + + private static final Logger logger = LoggerFactory.getLogger(Slf4jBusinessService.class); + + @Override + protected void preTransfer(long amount) { + logger.info("Preparing to transfer " + amount + "$."); + } + + @Override + protected void postTransfer(long amount, boolean outcome) { + logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); + } + +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java new file mode 100644 index 0000000000..938b18c257 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java @@ -0,0 +1,25 @@ +package com.baeldung.mdc.slf4j; + +import org.slf4j.MDC; + +import com.baeldung.mdc.Transaction; + +final class Slf4jRunnable implements Runnable { + private final Transaction tx; + + Slf4jRunnable(Transaction tx) { + this.tx = tx; + } + + public void run() { + + MDC.put("transaction.id", tx.getTransactionId()); + MDC.put("transaction.owner", tx.getOwner()); + MDC.put("transaction.createdAt", tx.getCreatedAt().toString()); + + new Slf4jBusinessService().transfer(tx.getAmount()); + + MDC.clear(); + + } +} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/web/Application.java b/log-mdc-ndc/src/main/java/com/baeldung/web/Application.java deleted file mode 100644 index a700e345db..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/web/Application.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.web; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java b/log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java deleted file mode 100644 index 760e26a705..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/web/GreetingController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.web; - -import java.util.concurrent.atomic.AtomicLong; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class GreetingController { - - @GetMapping("/echo") - public String echo(@RequestBody String body) { - return body; - } -} \ No newline at end of file diff --git a/log-mdc-ndc/src/main/resources/log4j.properties b/log-mdc-ndc/src/main/resources/log4j.properties index dac8abf6b8..03ae9a0c02 100644 --- a/log-mdc-ndc/src/main/resources/log4j.properties +++ b/log-mdc-ndc/src/main/resources/log4j.properties @@ -2,11 +2,13 @@ log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout log4j.appender.file=org.apache.log4j.FileAppender -log4j.appender.file.File=/tmp/$X{transaction.owner} +log4j.appender.file.File=/tmp/baeldung.log log4j.appender.file.layout=org.apache.log4j.PatternLayout #note the %X{userName} - this is how you fetch data from Mapped Diagnostic Context (MDC) -log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n -log4j.appender.file.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n +#log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n +#log4j.appender.file.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n +log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m%n +log4j.appender.file.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m%n -log4j.rootLogger = ALL, consoleAppender, file \ No newline at end of file +log4j.rootLogger = TRACE, consoleAppender, file \ No newline at end of file From dd1679f7b0d46519c0deb5c19134e30e02c7da34 Mon Sep 17 00:00:00 2001 From: danidemi Date: Sun, 6 Nov 2016 16:30:50 +0100 Subject: [PATCH 064/115] Removed some clutter --- .../com/baeldung/mdc/BusinessService.java | 25 +++++++++++++--- .../baeldung/mdc/DefaultBusinessService.java | 19 ------------ .../com/baeldung/mdc/DelegateBusiness.java | 29 ------------------- .../com/baeldung/mdc/IBusinessService.java | 9 ++++++ .../mdc/log4j/Log4JBusinessService.java | 8 ++--- .../mdc/log4j2/Log4J2BusinessService.java | 8 ++--- .../mdc/slf4j/Slf4jBusinessService.java | 8 ++--- 7 files changed, 42 insertions(+), 64 deletions(-) delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java create mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java index 51bebeb713..a5fa940a42 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java @@ -1,9 +1,26 @@ package com.baeldung.mdc; -public interface BusinessService { +/** + * A fake {@link IBusinessService} simulating an actual one. + */ +public abstract class BusinessService implements IBusinessService { - /** Sample service transferring a given amount of money. - * @return {@code true} when the transfer complete successfully, {@code false} otherwise. */ - boolean transfer(long amount); + public boolean transfer(long amount) { + beforeTransfer(amount); + // exchange messages with a remote system to transfer the money + try { + // let's pause randomly to properly simulate an actual system. + Thread.sleep((long) (500 + Math.random() * 500)); + } catch (InterruptedException e) { + // should never happen + } + // let's simulate both failing and successful transfers + boolean outcome = Math.random() >= 0.25; + afterTransfer(amount, outcome); + return outcome; + } + abstract protected void beforeTransfer(long amount); + + abstract protected void afterTransfer(long amount, boolean outcome); } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java deleted file mode 100644 index d5bb94d21a..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DefaultBusinessService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.mdc; - -/** - * A fake {@link BusinessService} simulating an actual one. - */ -public class DefaultBusinessService implements BusinessService { - - public boolean transfer(long amount) { - try { - // let's pause randomly to properly simulate an actual system. - Thread.sleep((long) (500 + Math.random()*500)); - } catch (InterruptedException e) { - // should never happen - } - // let's simulate both failing and successful transfers - return Math.random() >= 0.25; - } - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java deleted file mode 100644 index d7aab0e284..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/DelegateBusiness.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.mdc; - -public abstract class DelegateBusiness { - - private BusinessService delegate = null; - - public DelegateBusiness(BusinessService delegate) { - super(); - this.delegate = delegate; - } - - public DelegateBusiness() { - this( new DefaultBusinessService() ); - } - - public boolean transfer(long amount) { - preTransfer(amount); - boolean outcome = delegate.transfer(amount); - postTransfer(amount, outcome); - return outcome; - } - - abstract protected void postTransfer(long amount, boolean outcome); - - abstract protected void preTransfer(long amount); - - - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java new file mode 100644 index 0000000000..a2f2fbfdb3 --- /dev/null +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java @@ -0,0 +1,9 @@ +package com.baeldung.mdc; + +public interface IBusinessService { + + /** Sample service transferring a given amount of money. + * @return {@code true} when the transfer complete successfully, {@code false} otherwise. */ + boolean transfer(long amount); + +} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java index 52439a25f7..c7d5c6904a 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java @@ -3,19 +3,19 @@ package com.baeldung.mdc.log4j; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.baeldung.mdc.DelegateBusiness; +import com.baeldung.mdc.BusinessService; -final class Log4JBusinessService extends DelegateBusiness { +class Log4JBusinessService extends BusinessService { private static final Logger logger = LogManager.getLogger(); @Override - protected void preTransfer(long amount) { + protected void beforeTransfer(long amount) { logger.info("Preparing to transfer {}$."); } @Override - protected void postTransfer(long amount, boolean outcome) { + protected void afterTransfer(long amount, boolean outcome) { logger.info("Has transfer of {}$ completed successfully ? {}."); } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java index 8e7655697e..1000b7edc2 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java @@ -2,19 +2,19 @@ package com.baeldung.mdc.log4j2; import org.apache.log4j.Logger; -import com.baeldung.mdc.DelegateBusiness; +import com.baeldung.mdc.BusinessService; -final class Log4J2BusinessService extends DelegateBusiness { +final class Log4J2BusinessService extends BusinessService { private Logger logger = Logger.getLogger(Log4J2BusinessService.class); @Override - protected void preTransfer(long amount) { + protected void beforeTransfer(long amount) { logger .info("Preparing to transfer " + amount + "$."); } @Override - protected void postTransfer(long amount, boolean outcome) { + protected void afterTransfer(long amount, boolean outcome) { logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java index af14abcf0f..b241ec4b77 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java @@ -3,19 +3,19 @@ package com.baeldung.mdc.slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.baeldung.mdc.DelegateBusiness; +import com.baeldung.mdc.BusinessService; -final class Slf4jBusinessService extends DelegateBusiness { +final class Slf4jBusinessService extends BusinessService { private static final Logger logger = LoggerFactory.getLogger(Slf4jBusinessService.class); @Override - protected void preTransfer(long amount) { + protected void beforeTransfer(long amount) { logger.info("Preparing to transfer " + amount + "$."); } @Override - protected void postTransfer(long amount, boolean outcome) { + protected void afterTransfer(long amount, boolean outcome) { logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); } From 3df5c8210dad905c3d7d53bfe3a16f704c0385ae Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 6 Nov 2016 18:17:07 +0200 Subject: [PATCH 065/115] code snippets for the `Java 9 Stream API improvements` article (#809) * code snippets for the `Java 9 Stream API improvements` article * code snippets for the `Java 9 Stream API improvements` article [2 attempt] * removed the first attempt --- .../language/stream/StreamFeaturesTest.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 core-java-9/src/test/java/com/baeldung/java9/language/stream/StreamFeaturesTest.java diff --git a/core-java-9/src/test/java/com/baeldung/java9/language/stream/StreamFeaturesTest.java b/core-java-9/src/test/java/com/baeldung/java9/language/stream/StreamFeaturesTest.java new file mode 100644 index 0000000000..a260e84164 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/language/stream/StreamFeaturesTest.java @@ -0,0 +1,119 @@ +package com.baeldung.java9.language.stream; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.lang.Integer.*; +import static org.junit.Assert.assertEquals; + +public class StreamFeaturesTest { + + public static class TakeAndDropWhileTest { + + public Stream getStreamAfterTakeWhileOperation() { + return Stream + .iterate("", s -> s + "s") + .takeWhile(s -> s.length() < 10); + } + + public Stream getStreamAfterDropWhileOperation() { + return Stream + .iterate("", s -> s + "s") + .takeWhile(s -> s.length() < 10) + .dropWhile(s -> !s.contains("sssss")); + } + + @Test + public void testTakeWhileOperation() { + List list = getStreamAfterTakeWhileOperation().collect(Collectors.toList()); + + assertEquals(10, list.size()); + + assertEquals("", list.get(0)); + assertEquals("ss", list.get(2)); + assertEquals("sssssssss", list.get(list.size() - 1)); + } + + @Test + public void testDropWhileOperation() { + List list = getStreamAfterDropWhileOperation().collect(Collectors.toList()); + + assertEquals(5, list.size()); + + assertEquals("sssss", list.get(0)); + assertEquals("sssssss", list.get(2)); + assertEquals("sssssssss", list.get(list.size() - 1)); + } + + } + + public static class IterateTest { + + private Stream getStream() { + return Stream.iterate(0, i -> i < 10, i -> i + 1); + } + + @Test + public void testIterateOperation() { + List list = getStream().collect(Collectors.toList()); + + assertEquals(10, list.size()); + + assertEquals(valueOf(0), list.get(0)); + assertEquals(valueOf(5), list.get(5)); + assertEquals(valueOf(9), list.get(list.size() - 1)); + } + + } + + public static class OfNullableTest { + + private List collection = Arrays.asList("A", "B", "C"); + private Map map = new HashMap<>() {{ + put("A", 10); + put("C", 30); + }}; + + private Stream getStreamWithOfNullable() { + return collection.stream() + .flatMap(s -> Stream.ofNullable(map.get(s))); + } + + private Stream getStream() { + return collection.stream() + .flatMap(s -> { + Integer temp = map.get(s); + return temp != null ? Stream.of(temp) : Stream.empty(); + }); + } + + private List testOfNullableFrom(Stream stream) { + List list = stream.collect(Collectors.toList()); + + assertEquals(2, list.size()); + + assertEquals(valueOf(10), list.get(0)); + assertEquals(valueOf(30), list.get(list.size() - 1)); + + return list; + } + + @Test + public void testOfNullable() { + + assertEquals( + testOfNullableFrom(getStream()), + testOfNullableFrom(getStreamWithOfNullable()) + ); + + } + + } + +} From d0e95dfbdd1bb0a927fbe41436ffbdb896bc0495 Mon Sep 17 00:00:00 2001 From: danidemi Date: Sun, 6 Nov 2016 17:39:06 +0100 Subject: [PATCH 066/115] Applied formatting as defined in the rules. --- log-mdc-ndc/pom.xml | 80 +++++++++---------- .../java/com/baeldung/mdc/GenericApp.java | 35 ++++---- .../com/baeldung/mdc/TransactionFactory.java | 3 +- .../mdc/log4j/Log4JBusinessService.java | 27 +++---- .../com/baeldung/mdc/log4j/Log4JRunnable.java | 26 +++--- .../mdc/log4j2/Log4J2BusinessService.java | 27 ++++--- .../baeldung/mdc/log4j2/Log4J2Runnable.java | 34 ++++---- .../mdc/slf4j/Slf4jBusinessService.java | 22 ++--- .../com/baeldung/mdc/slf4j/Slf4jRunnable.java | 32 ++++---- .../src/main/resources/log4j.properties | 12 +-- log-mdc-ndc/src/main/resources/log4j2.xml | 39 +++------ log-mdc-ndc/src/main/resources/logback.xml | 3 +- 12 files changed, 166 insertions(+), 174 deletions(-) diff --git a/log-mdc-ndc/pom.xml b/log-mdc-ndc/pom.xml index 8e9d52a750..927473ad4e 100644 --- a/log-mdc-ndc/pom.xml +++ b/log-mdc-ndc/pom.xml @@ -6,53 +6,53 @@ 0.0.1-SNAPSHOT logmdcndc tutorial on logging with MDC and NDC - + - - - org.springframework - spring-context - 4.3.3.RELEASE - - - org.springframework - spring-webmvc - 4.3.3.RELEASE - - + + + org.springframework + spring-context + 4.3.3.RELEASE + + + org.springframework + spring-webmvc + 4.3.3.RELEASE + + log4j log4j 1.2.17 - - - - org.apache.logging.log4j - log4j-api - 2.7 - - - org.apache.logging.log4j - log4j-core - 2.7 - - - - - com.lmax - disruptor - 3.3.4 - - - - - ch.qos.logback - logback-classic - 1.1.7 - - + + + + org.apache.logging.log4j + log4j-api + 2.7 + + + org.apache.logging.log4j + log4j-core + 2.7 + + + + + com.lmax + disruptor + 3.3.4 + + + + + ch.qos.logback + logback-classic + 1.1.7 + + \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java index 3652032e0e..9f08e33455 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java @@ -6,20 +6,27 @@ import java.util.concurrent.Executors; import org.apache.log4j.Logger; import com.baeldung.mdc.log4j.Log4JRunnable; +import com.baeldung.mdc.log4j2.Log4J2Runnable; +import com.baeldung.mdc.slf4j.Slf4jRunnable; public class GenericApp { - - public static void main(String[] args) { - - ExecutorService executor = Executors.newFixedThreadPool(3); - TransactionFactory transactionFactory = new TransactionFactory(); - - for(int i=0; i<10; i++){ - final Transaction tx = transactionFactory.newInstance(); - executor.submit(new Log4JRunnable(tx)); - } - - executor.shutdown(); - - } + + public static void main(String[] args) { + + ExecutorService executor = Executors.newFixedThreadPool(3); + TransactionFactory transactionFactory = new TransactionFactory(); + + for (int i = 0; i < 10; i++) { + final Transaction tx = transactionFactory.newInstance(); + + //Runnable task = new Log4JRunnable(tx); + //Runnable task = new Log4J2Runnable(tx); + Runnable task = new Slf4jRunnable(tx); + + executor.submit(task); + } + + executor.shutdown(); + + } } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java index 26039ba1d4..2ae0b3d3f5 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java @@ -8,9 +8,10 @@ import java.util.UUID; public class TransactionFactory { private static final String[] NAMES = {"John", "Susan", "Marc", "Samantha"}; + private static long nextId = 1; public Transaction newInstance() { - String transactionId = UUID.randomUUID().toString(); + String transactionId = String.valueOf( nextId++ ); String owner = NAMES[ (int) floor(random()*NAMES.length) ]; long amount = (long) (random()*1500 + 500); Transaction tx = new Transaction(transactionId, owner, amount); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java index c7d5c6904a..26633e229e 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java @@ -1,22 +1,21 @@ package com.baeldung.mdc.log4j; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import org.apache.log4j.Logger; import com.baeldung.mdc.BusinessService; -class Log4JBusinessService extends BusinessService { - - private static final Logger logger = LogManager.getLogger(); +public class Log4JBusinessService extends BusinessService { - @Override - protected void beforeTransfer(long amount) { - logger.info("Preparing to transfer {}$."); - } + private Logger logger = Logger.getLogger(Log4JBusinessService.class); + + @Override + protected void beforeTransfer(long amount) { + logger.info("Preparing to transfer " + amount + "$."); + } + + @Override + protected void afterTransfer(long amount, boolean outcome) { + logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); + } - @Override - protected void afterTransfer(long amount, boolean outcome) { - logger.info("Has transfer of {}$ completed successfully ? {}."); - } - } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java index 2aeb75f95a..ce5d97eddf 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java @@ -1,25 +1,29 @@ package com.baeldung.mdc.log4j; import org.apache.log4j.MDC; +import org.apache.logging.log4j.ThreadContext; import com.baeldung.mdc.Transaction; +import com.baeldung.mdc.log4j2.Log4J2BusinessService; public class Log4JRunnable implements Runnable { - private final Transaction tx; - public Log4JRunnable(Transaction tx) { - this.tx = tx; - } + private Transaction tx; + private static Log4JBusinessService log4jBusinessService = new Log4JBusinessService(); - public void run() { + public Log4JRunnable(Transaction tx) { + this.tx = tx; + } - MDC.put("transaction.id", tx.getTransactionId()); - MDC.put("transaction.owner", tx.getOwner()); - MDC.put("transaction.createdAt", tx.getCreatedAt()); + public void run() { - new Log4JBusinessService().transfer(tx.getAmount()); + MDC.put("transaction.id", tx.getTransactionId()); + MDC.put("transaction.owner", tx.getOwner()); + MDC.put("transaction.createdAt", tx.getCreatedAt()); - MDC.clear(); + log4jBusinessService.transfer(tx.getAmount()); - } + MDC.clear(); + + } } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java index 1000b7edc2..cbfbc5b8a5 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java @@ -1,21 +1,22 @@ package com.baeldung.mdc.log4j2; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import com.baeldung.mdc.BusinessService; -final class Log4J2BusinessService extends BusinessService { - - private Logger logger = Logger.getLogger(Log4J2BusinessService.class); +public class Log4J2BusinessService extends BusinessService { - @Override - protected void beforeTransfer(long amount) { - logger .info("Preparing to transfer " + amount + "$."); - } + private static final Logger logger = LogManager.getLogger(); + + @Override + protected void beforeTransfer(long amount) { + logger.info("Preparing to transfer {}$.", amount); + } + + @Override + protected void afterTransfer(long amount, boolean outcome) { + logger.info("Has transfer of {}$ completed successfully ? {}.", amount, outcome); + } - @Override - protected void afterTransfer(long amount, boolean outcome) { - logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); - } - } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java index 32f2161af8..6a3f39ba5b 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java @@ -4,22 +4,24 @@ import org.apache.logging.log4j.ThreadContext; import com.baeldung.mdc.Transaction; -final class Log4J2Runnable implements Runnable { - private final Transaction tx; +public class Log4J2Runnable implements Runnable { + private final Transaction tx; + private Log4J2BusinessService log4j2BusinessService = new Log4J2BusinessService(); - Log4J2Runnable(Transaction tx) { - this.tx = tx; - } + public Log4J2Runnable(Transaction tx) { + this.tx = tx; + } - public void run() { - - ThreadContext.put("transaction.id", tx.getTransactionId()); - ThreadContext.put("transaction.owner", tx.getOwner()); - ThreadContext.put("transaction.createdAt", tx.getCreatedAt().toString()); - - new Log4J2BusinessService().transfer(tx.getAmount()); - - ThreadContext.clearAll(); - - } + public void run() { + + ThreadContext.put("transaction.id", tx.getTransactionId()); + ThreadContext.put("transaction.id", tx.getTransactionId()); + ThreadContext.put("transaction.owner", tx.getOwner()); + ThreadContext.put("transaction.createdAt", tx.getCreatedAt().toString()); + + log4j2BusinessService.transfer(tx.getAmount()); + + ThreadContext.clearAll(); + + } } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java index b241ec4b77..d525965ed5 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java @@ -6,17 +6,17 @@ import org.slf4j.LoggerFactory; import com.baeldung.mdc.BusinessService; final class Slf4jBusinessService extends BusinessService { - - private static final Logger logger = LoggerFactory.getLogger(Slf4jBusinessService.class); - @Override - protected void beforeTransfer(long amount) { - logger.info("Preparing to transfer " + amount + "$."); - } + private static final Logger logger = LoggerFactory.getLogger(Slf4jBusinessService.class); + + @Override + protected void beforeTransfer(long amount) { + logger.info("Preparing to transfer {}$.", amount); + } + + @Override + protected void afterTransfer(long amount, boolean outcome) { + logger.info("Has transfer of {}$ completed successfully ? {}.", amount, outcome); + } - @Override - protected void afterTransfer(long amount, boolean outcome) { - logger.info("Has transfer of " + amount + "$ completed successfully ? " + outcome + "."); - } - } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java index 938b18c257..2ef170721c 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java @@ -4,22 +4,22 @@ import org.slf4j.MDC; import com.baeldung.mdc.Transaction; -final class Slf4jRunnable implements Runnable { - private final Transaction tx; +public class Slf4jRunnable implements Runnable { + private final Transaction tx; - Slf4jRunnable(Transaction tx) { - this.tx = tx; - } + public Slf4jRunnable(Transaction tx) { + this.tx = tx; + } - public void run() { - - MDC.put("transaction.id", tx.getTransactionId()); - MDC.put("transaction.owner", tx.getOwner()); - MDC.put("transaction.createdAt", tx.getCreatedAt().toString()); - - new Slf4jBusinessService().transfer(tx.getAmount()); - - MDC.clear(); - - } + public void run() { + + MDC.put("transaction.id", tx.getTransactionId()); + MDC.put("transaction.owner", tx.getOwner()); + MDC.put("transaction.createdAt", tx.getCreatedAt().toString()); + + new Slf4jBusinessService().transfer(tx.getAmount()); + + MDC.clear(); + + } } \ No newline at end of file diff --git a/log-mdc-ndc/src/main/resources/log4j.properties b/log-mdc-ndc/src/main/resources/log4j.properties index 03ae9a0c02..39be027f3f 100644 --- a/log-mdc-ndc/src/main/resources/log4j.properties +++ b/log-mdc-ndc/src/main/resources/log4j.properties @@ -1,14 +1,8 @@ log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout -log4j.appender.file=org.apache.log4j.FileAppender -log4j.appender.file.File=/tmp/baeldung.log -log4j.appender.file.layout=org.apache.log4j.PatternLayout - #note the %X{userName} - this is how you fetch data from Mapped Diagnostic Context (MDC) -#log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n -#log4j.appender.file.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n -log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m%n -log4j.appender.file.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m%n +#log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c{1} %x - %m%n +log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c{1} %x - %m - tx.id=%X{transaction.id} tx.owner=%X{transaction.owner}%n -log4j.rootLogger = TRACE, consoleAppender, file \ No newline at end of file +log4j.rootLogger = TRACE, consoleAppender \ No newline at end of file diff --git a/log-mdc-ndc/src/main/resources/log4j2.xml b/log-mdc-ndc/src/main/resources/log4j2.xml index f9a2bdcf1a..800cfacafe 100644 --- a/log-mdc-ndc/src/main/resources/log4j2.xml +++ b/log-mdc-ndc/src/main/resources/log4j2.xml @@ -1,32 +1,17 @@ - - # Console appender - - # Pattern of log message for console appender - - + + + + + - # File appender - - + + - - # Override log level for specified package - - - - - - - + + + + \ No newline at end of file diff --git a/log-mdc-ndc/src/main/resources/logback.xml b/log-mdc-ndc/src/main/resources/logback.xml index 7bea9976e7..44d247c87e 100644 --- a/log-mdc-ndc/src/main/resources/logback.xml +++ b/log-mdc-ndc/src/main/resources/logback.xml @@ -1,9 +1,8 @@ - # Console appender - logback %d{yyyy-MM-dd HH:mm:ss} %p %m %X{transaction.owner} %X{transaction.createdAt} %n + %-4r [%t] %5p %c{1} - %m - tx.id=%X{transaction.id} tx.owner=%X{transaction.owner}%n From 8daa90f3ded15b96d92f6b0b491e47d63d6b9425 Mon Sep 17 00:00:00 2001 From: tschiman Date: Sat, 5 Nov 2016 16:57:39 +0100 Subject: [PATCH 067/115] BAEL-89 Adding spring session tutorial code. --- spring-session/jetty-ex/pom.xml | 71 +++++++++++++++++++ .../session/tomcatex/JettyWebApplication.java | 19 +++++ .../session/tomcatex/SecurityConfig.java | 22 ++++++ .../session/tomcatex/SessionConfig.java | 17 +++++ .../src/main/resources/application.properties | 4 ++ spring-session/pom.xml | 20 ++++++ spring-session/tomcat-ex/pom.xml | 71 +++++++++++++++++++ .../session/tomcatex/SecurityConfig.java | 32 +++++++++ .../session/tomcatex/SessionConfig.java | 10 +++ .../tomcatex/TomcatWebApplication.java | 29 ++++++++ .../src/main/resources/application.properties | 2 + 11 files changed, 297 insertions(+) create mode 100644 spring-session/jetty-ex/pom.xml create mode 100644 spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java create mode 100644 spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java create mode 100644 spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java create mode 100644 spring-session/jetty-ex/src/main/resources/application.properties create mode 100644 spring-session/pom.xml create mode 100644 spring-session/tomcat-ex/pom.xml create mode 100644 spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java create mode 100644 spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java create mode 100644 spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java create mode 100644 spring-session/tomcat-ex/src/main/resources/application.properties diff --git a/spring-session/jetty-ex/pom.xml b/spring-session/jetty-ex/pom.xml new file mode 100644 index 0000000000..339821b5fe --- /dev/null +++ b/spring-session/jetty-ex/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + com.baeldung + jetty-ex + 1.0.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.4.0.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-jetty + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.session + spring-session + 1.2.1.RELEASE + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.RELEASE + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java new file mode 100644 index 0000000000..0da6316560 --- /dev/null +++ b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.session.tomcatex; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class JettyWebApplication { + public static void main(String[] args) { + SpringApplication.run(JettyWebApplication.class, args); + } + + @RequestMapping + public String helloJetty() { + return "hello Jetty"; + } +} diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java new file mode 100644 index 0000000000..3cd2e5e3ca --- /dev/null +++ b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.session.tomcatex; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; + +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.NEVER) + .and() + .authorizeRequests().anyRequest().hasRole("ADMIN").and() + .httpBasic().disable(); + } +} diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java new file mode 100644 index 0000000000..59fdefe30b --- /dev/null +++ b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.session.tomcatex; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; +import org.springframework.session.web.http.HeaderHttpSessionStrategy; +import org.springframework.session.web.http.HttpSessionStrategy; + +@Configuration +@EnableRedisHttpSession +public class SessionConfig extends AbstractHttpSessionApplicationInitializer { + @Bean + public HttpSessionStrategy httpSessionStrategy() { + return new HeaderHttpSessionStrategy(); + } +} diff --git a/spring-session/jetty-ex/src/main/resources/application.properties b/spring-session/jetty-ex/src/main/resources/application.properties new file mode 100644 index 0000000000..902de4e45f --- /dev/null +++ b/spring-session/jetty-ex/src/main/resources/application.properties @@ -0,0 +1,4 @@ +server.port=8081 + +spring.redis.host=localhost +spring.redis.port=6379 \ No newline at end of file diff --git a/spring-session/pom.xml b/spring-session/pom.xml new file mode 100644 index 0000000000..1e4bec0014 --- /dev/null +++ b/spring-session/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + spring-session + 1.0.0-SNAPSHOT + + + jetty-ex + tomcat-ex + + \ No newline at end of file diff --git a/spring-session/tomcat-ex/pom.xml b/spring-session/tomcat-ex/pom.xml new file mode 100644 index 0000000000..aed49df5e3 --- /dev/null +++ b/spring-session/tomcat-ex/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + com.baeldung + tomcat-ex + 1.0.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.4.0.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.cloud + spring-cloud-starter-zuul + + + org.springframework.session + spring-session + 1.2.1.RELEASE + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.RELEASE + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java new file mode 100644 index 0000000000..2af111fe08 --- /dev/null +++ b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.session.tomcatex; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("user").password("password").roles("USER").and() + .withUser("admin").password("password").roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .httpBasic().and() +// .csrf().disable() + .authorizeRequests() + .antMatchers("/").permitAll() + .antMatchers("/tomcat").hasRole("USER") + .antMatchers("/tomcat/admin").hasRole("ADMIN") + .anyRequest().authenticated(); + } +} diff --git a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java new file mode 100644 index 0000000000..5afac6cb6b --- /dev/null +++ b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.spring.session.tomcatex; + +import org.springframework.context.annotation.Configuration; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; + +@Configuration +@EnableRedisHttpSession +public class SessionConfig extends AbstractHttpSessionApplicationInitializer { +} diff --git a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java new file mode 100644 index 0000000000..417aaddf29 --- /dev/null +++ b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.session.tomcatex; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class TomcatWebApplication { + public static void main(String[] args) { + SpringApplication.run(TomcatWebApplication.class, args); + } + + @RequestMapping + public String helloDefault() { + return "hello default"; + } + + @RequestMapping("/tomcat") + public String helloTomcat() { + return "hello tomcat"; + } + + @RequestMapping("/tomcat/admin") + public String helloTomcatAdmin() { + return "hello tomcat admin"; + } +} diff --git a/spring-session/tomcat-ex/src/main/resources/application.properties b/spring-session/tomcat-ex/src/main/resources/application.properties new file mode 100644 index 0000000000..49886b3b70 --- /dev/null +++ b/spring-session/tomcat-ex/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.redis.host=localhost +spring.redis.port=6379 \ No newline at end of file From 9938a1a0c7c27c66b52c6db2d4cc675e2c2c9af7 Mon Sep 17 00:00:00 2001 From: tschiman Date: Sat, 5 Nov 2016 17:35:46 +0100 Subject: [PATCH 068/115] BAEL-89 remove csrf disable --- .../com/baeldung/spring/session/tomcatex/SecurityConfig.java | 3 +-- .../com/baeldung/spring/session/tomcatex/SecurityConfig.java | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java index 3cd2e5e3ca..ef779718cd 100644 --- a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java +++ b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java @@ -16,7 +16,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.NEVER) .and() - .authorizeRequests().anyRequest().hasRole("ADMIN").and() - .httpBasic().disable(); + .authorizeRequests().anyRequest().hasRole("ADMIN").and(); } } diff --git a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java index 2af111fe08..91cd749c4c 100644 --- a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java +++ b/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java @@ -22,7 +22,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { http .httpBasic().and() -// .csrf().disable() .authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/tomcat").hasRole("USER") From f821eca9b424164e7909aeff48e76aa69773ec7e Mon Sep 17 00:00:00 2001 From: tschiman Date: Sat, 5 Nov 2016 17:52:45 +0100 Subject: [PATCH 069/115] BAEL-89 remove csrf disable --- .../com/baeldung/spring/session/tomcatex/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java index ef779718cd..202cad27e6 100644 --- a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java +++ b/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java @@ -16,6 +16,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.NEVER) .and() - .authorizeRequests().anyRequest().hasRole("ADMIN").and(); + .authorizeRequests().anyRequest().hasRole("ADMIN"); } } From 8d699c1b5d0e4655869982dcfc8a3f5091a92049 Mon Sep 17 00:00:00 2001 From: tschiman Date: Sun, 6 Nov 2016 03:35:52 +0100 Subject: [PATCH 070/115] BAEL-89 modifying the module names and changing the dependencies to be in line with what we would get from start.spring.io --- spring-session/{jetty-ex => jetty-session-demo}/pom.xml | 6 +++--- .../spring/session/tomcatex/JettyWebApplication.java | 5 +++++ .../baeldung/spring/session/tomcatex/SecurityConfig.java | 0 .../baeldung/spring/session/tomcatex/SessionConfig.java | 0 .../src/main/resources/application.properties | 0 spring-session/pom.xml | 4 ++-- .../{tomcat-ex => tomcat-session-demo}/pom.xml | 9 ++------- .../baeldung/spring/session/tomcatex/SecurityConfig.java | 0 .../baeldung/spring/session/tomcatex/SessionConfig.java | 0 .../spring/session/tomcatex/TomcatWebApplication.java | 0 .../src/main/resources/application.properties | 0 11 files changed, 12 insertions(+), 12 deletions(-) rename spring-session/{jetty-ex => jetty-session-demo}/pom.xml (98%) rename spring-session/{jetty-ex => jetty-session-demo}/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java (85%) rename spring-session/{jetty-ex => jetty-session-demo}/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java (100%) rename spring-session/{jetty-ex => jetty-session-demo}/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java (100%) rename spring-session/{jetty-ex => jetty-session-demo}/src/main/resources/application.properties (100%) rename spring-session/{tomcat-ex => tomcat-session-demo}/pom.xml (91%) rename spring-session/{tomcat-ex => tomcat-session-demo}/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java (100%) rename spring-session/{tomcat-ex => tomcat-session-demo}/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java (100%) rename spring-session/{tomcat-ex => tomcat-session-demo}/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java (100%) rename spring-session/{tomcat-ex => tomcat-session-demo}/src/main/resources/application.properties (100%) diff --git a/spring-session/jetty-ex/pom.xml b/spring-session/jetty-session-demo/pom.xml similarity index 98% rename from spring-session/jetty-ex/pom.xml rename to spring-session/jetty-session-demo/pom.xml index 339821b5fe..717506fbce 100644 --- a/spring-session/jetty-ex/pom.xml +++ b/spring-session/jetty-session-demo/pom.xml @@ -20,9 +20,10 @@ org.springframework.boot spring-boot-starter-jetty + org.springframework.boot - spring-boot-starter-web + spring-boot-starter-data-redis org.springframework.boot @@ -31,11 +32,10 @@ org.springframework.session spring-session - 1.2.1.RELEASE org.springframework.boot - spring-boot-starter-data-redis + spring-boot-starter-web diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java similarity index 85% rename from spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java rename to spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java index 0da6316560..2cdc5f99af 100644 --- a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java @@ -16,4 +16,9 @@ public class JettyWebApplication { public String helloJetty() { return "hello Jetty"; } + + @RequestMapping("/test") + public String lksjdf() { + return ""; + } } diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java similarity index 100% rename from spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java rename to spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java diff --git a/spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java similarity index 100% rename from spring-session/jetty-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java rename to spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java diff --git a/spring-session/jetty-ex/src/main/resources/application.properties b/spring-session/jetty-session-demo/src/main/resources/application.properties similarity index 100% rename from spring-session/jetty-ex/src/main/resources/application.properties rename to spring-session/jetty-session-demo/src/main/resources/application.properties diff --git a/spring-session/pom.xml b/spring-session/pom.xml index 1e4bec0014..74561edc59 100644 --- a/spring-session/pom.xml +++ b/spring-session/pom.xml @@ -14,7 +14,7 @@ 1.0.0-SNAPSHOT - jetty-ex - tomcat-ex + jetty-session-demo + tomcat-session-demo \ No newline at end of file diff --git a/spring-session/tomcat-ex/pom.xml b/spring-session/tomcat-session-demo/pom.xml similarity index 91% rename from spring-session/tomcat-ex/pom.xml rename to spring-session/tomcat-session-demo/pom.xml index aed49df5e3..cade029ac8 100644 --- a/spring-session/tomcat-ex/pom.xml +++ b/spring-session/tomcat-session-demo/pom.xml @@ -18,24 +18,19 @@ org.springframework.boot - spring-boot-starter-web + spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-security - - org.springframework.cloud - spring-cloud-starter-zuul - org.springframework.session spring-session - 1.2.1.RELEASE org.springframework.boot - spring-boot-starter-data-redis + spring-boot-starter-web diff --git a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java similarity index 100% rename from spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java rename to spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java diff --git a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java similarity index 100% rename from spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java rename to spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java diff --git a/spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java similarity index 100% rename from spring-session/tomcat-ex/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java rename to spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java diff --git a/spring-session/tomcat-ex/src/main/resources/application.properties b/spring-session/tomcat-session-demo/src/main/resources/application.properties similarity index 100% rename from spring-session/tomcat-ex/src/main/resources/application.properties rename to spring-session/tomcat-session-demo/src/main/resources/application.properties From 9bf8fee21098336bd35f979b17910715e918f2e6 Mon Sep 17 00:00:00 2001 From: tschiman Date: Sun, 6 Nov 2016 03:38:21 +0100 Subject: [PATCH 071/115] BAEL-89 modifying the maven sub project names --- spring-session/jetty-session-demo/pom.xml | 2 +- spring-session/tomcat-session-demo/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-session/jetty-session-demo/pom.xml b/spring-session/jetty-session-demo/pom.xml index 717506fbce..86a8596862 100644 --- a/spring-session/jetty-session-demo/pom.xml +++ b/spring-session/jetty-session-demo/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.baeldung - jetty-ex + jetty-session-demo 1.0.0-SNAPSHOT diff --git a/spring-session/tomcat-session-demo/pom.xml b/spring-session/tomcat-session-demo/pom.xml index cade029ac8..805d7bec25 100644 --- a/spring-session/tomcat-session-demo/pom.xml +++ b/spring-session/tomcat-session-demo/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.baeldung - tomcat-ex + tomcat-session-demo 1.0.0-SNAPSHOT From ef090079322df1f128013dfd29b78a57162dee1e Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sun, 6 Nov 2016 22:28:05 +0100 Subject: [PATCH 072/115] BAEL-89 - reformatting source - adding packaging to pom to parent spring-session module --- .../session/tomcatex/JettyWebApplication.java | 22 ++++++------- .../session/tomcatex/SecurityConfig.java | 16 +++++----- .../session/tomcatex/SessionConfig.java | 8 ++--- .../src/main/resources/application.properties | 1 - spring-session/pom.xml | 2 ++ .../session/tomcatex/SecurityConfig.java | 32 +++++++++---------- .../tomcatex/TomcatWebApplication.java | 30 ++++++++--------- 7 files changed, 56 insertions(+), 55 deletions(-) diff --git a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java index 2cdc5f99af..7bbc776eaa 100644 --- a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java @@ -8,17 +8,17 @@ import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class JettyWebApplication { - public static void main(String[] args) { - SpringApplication.run(JettyWebApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(JettyWebApplication.class, args); + } - @RequestMapping - public String helloJetty() { - return "hello Jetty"; - } + @RequestMapping + public String helloJetty() { + return "hello Jetty"; + } - @RequestMapping("/test") - public String lksjdf() { - return ""; - } + @RequestMapping("/test") + public String lksjdf() { + return ""; + } } diff --git a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java index 202cad27e6..6ed7df9218 100644 --- a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java @@ -10,12 +10,12 @@ import org.springframework.security.config.http.SessionCreationPolicy; @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.NEVER) - .and() - .authorizeRequests().anyRequest().hasRole("ADMIN"); - } + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.NEVER) + .and() + .authorizeRequests().anyRequest().hasRole("ADMIN"); + } } diff --git a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java index 59fdefe30b..f261f66f9d 100644 --- a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java @@ -10,8 +10,8 @@ import org.springframework.session.web.http.HttpSessionStrategy; @Configuration @EnableRedisHttpSession public class SessionConfig extends AbstractHttpSessionApplicationInitializer { - @Bean - public HttpSessionStrategy httpSessionStrategy() { - return new HeaderHttpSessionStrategy(); - } + @Bean + public HttpSessionStrategy httpSessionStrategy() { + return new HeaderHttpSessionStrategy(); + } } diff --git a/spring-session/jetty-session-demo/src/main/resources/application.properties b/spring-session/jetty-session-demo/src/main/resources/application.properties index 902de4e45f..7f81672eda 100644 --- a/spring-session/jetty-session-demo/src/main/resources/application.properties +++ b/spring-session/jetty-session-demo/src/main/resources/application.properties @@ -1,4 +1,3 @@ server.port=8081 - spring.redis.host=localhost spring.redis.port=6379 \ No newline at end of file diff --git a/spring-session/pom.xml b/spring-session/pom.xml index 74561edc59..fec6a46af2 100644 --- a/spring-session/pom.xml +++ b/spring-session/pom.xml @@ -4,6 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + com.baeldung parent-modules @@ -12,6 +13,7 @@ spring-session 1.0.0-SNAPSHOT + pom jetty-session-demo diff --git a/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java index 91cd749c4c..3e419b27a2 100644 --- a/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java +++ b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java @@ -11,21 +11,21 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("user").password("password").roles("USER").and() - .withUser("admin").password("password").roles("ADMIN"); - } + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("user").password("password").roles("USER").and() + .withUser("admin").password("password").roles("ADMIN"); + } - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .httpBasic().and() - .authorizeRequests() - .antMatchers("/").permitAll() - .antMatchers("/tomcat").hasRole("USER") - .antMatchers("/tomcat/admin").hasRole("ADMIN") - .anyRequest().authenticated(); - } + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .httpBasic().and() + .authorizeRequests() + .antMatchers("/").permitAll() + .antMatchers("/tomcat").hasRole("USER") + .antMatchers("/tomcat/admin").hasRole("ADMIN") + .anyRequest().authenticated(); + } } diff --git a/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java index 417aaddf29..58c6b807ec 100644 --- a/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java +++ b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java @@ -8,22 +8,22 @@ import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class TomcatWebApplication { - public static void main(String[] args) { - SpringApplication.run(TomcatWebApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(TomcatWebApplication.class, args); + } - @RequestMapping - public String helloDefault() { - return "hello default"; - } + @RequestMapping + public String helloDefault() { + return "hello default"; + } - @RequestMapping("/tomcat") - public String helloTomcat() { - return "hello tomcat"; - } + @RequestMapping("/tomcat") + public String helloTomcat() { + return "hello tomcat"; + } - @RequestMapping("/tomcat/admin") - public String helloTomcatAdmin() { - return "hello tomcat admin"; - } + @RequestMapping("/tomcat/admin") + public String helloTomcatAdmin() { + return "hello tomcat admin"; + } } From 9ea65a801e925873b011dccf50f335ad6531c013 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sun, 6 Nov 2016 22:55:22 +0100 Subject: [PATCH 073/115] BAEL-89 - adding spring-session to main pom --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index d8830e2a59..857922310f 100644 --- a/pom.xml +++ b/pom.xml @@ -132,6 +132,7 @@ spring-security-rest-full spring-security-rest spring-security-x509 + spring-session spring-spel spring-thymeleaf spring-userservice From 979b6787bad38f9e820e70dce69639f02b40a74f Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Sun, 6 Nov 2016 23:08:05 +0100 Subject: [PATCH 074/115] adding missing dependency for PDF to X conversion article --- pdf/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pdf/pom.xml b/pdf/pom.xml index be1e9822e2..311265880d 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -54,6 +54,11 @@ batik-transcoder 1.8
+ + org.apache.poi + poi-ooxml + 3.15 +
From b9c3710c56544da328655b27ead3b6e6df02bac8 Mon Sep 17 00:00:00 2001 From: Kiran Date: Sun, 6 Nov 2016 21:38:08 -0500 Subject: [PATCH 075/115] Added code for new module --- .../spring-cloud-ribbon-client/pom.xml | 79 +++++++++++++++++++ .../ribbon/client/RibbonConfiguration.java | 28 +++++++ .../ribbon/client/ServerLocationApp.java | 36 +++++++++ .../src/main/resources/application.yml | 13 +++ .../ribbon/client/ServerLocationAppTests.java | 54 +++++++++++++ .../cloud/ribbon/client/TestConfig.java | 17 ++++ 6 files changed, 227 insertions(+) create mode 100644 spring-cloud/spring-cloud-ribbon-client/pom.xml create mode 100644 spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/RibbonConfiguration.java create mode 100644 spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationApp.java create mode 100644 spring-cloud/spring-cloud-ribbon-client/src/main/resources/application.yml create mode 100644 spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppTests.java create mode 100644 spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/TestConfig.java diff --git a/spring-cloud/spring-cloud-ribbon-client/pom.xml b/spring-cloud/spring-cloud-ribbon-client/pom.xml new file mode 100644 index 0000000000..c597c5ab8e --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/pom.xml @@ -0,0 +1,79 @@ + + 4.0.0 + com.baeldung + spring-cloud-ribbon + 0.0.1-SNAPSHOT + jar + spring-cloud-ribbon-client + Introduction to Spring Cloud Rest Client with Netflix Ribbon + + + org.springframework.boot + spring-boot-starter-parent + 1.4.1.RELEASE + + + + + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-starter-ribbon + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR1 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/RibbonConfiguration.java b/spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/RibbonConfiguration.java new file mode 100644 index 0000000000..59998432ad --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/RibbonConfiguration.java @@ -0,0 +1,28 @@ +package com.baeldung.spring.cloud.ribbon.client; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; + +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.IPing; +import com.netflix.loadbalancer.IRule; +import com.netflix.loadbalancer.PingUrl; +import com.netflix.loadbalancer.WeightedResponseTimeRule; +import com.netflix.loadbalancer.AvailabilityFilteringRule; + +public class RibbonConfiguration { + + @Autowired + IClientConfig ribbonClientConfig; + + @Bean + public IPing ribbonPing(IClientConfig config) { + return new PingUrl(); + } + + @Bean + public IRule ribbonRule(IClientConfig config) { + return new WeightedResponseTimeRule(); + } + +} diff --git a/spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationApp.java b/spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationApp.java new file mode 100644 index 0000000000..6105e2c489 --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/src/main/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationApp.java @@ -0,0 +1,36 @@ +package com.baeldung.spring.cloud.ribbon.client; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.netflix.ribbon.RibbonClient; +import org.springframework.context.annotation.Bean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +@RestController +@RibbonClient(name = "ping-a-server", configuration = RibbonConfiguration.class) +public class ServerLocationApp { + + @LoadBalanced + @Bean + RestTemplate getRestTemplate() { + return new RestTemplate(); + } + + @Autowired + RestTemplate restTemplate; + + @RequestMapping("/server-location") + public String serverLocation() { + String servLoc = this.restTemplate.getForObject("http://ping-server/locaus", String.class); + return servLoc; + } + + public static void main(String[] args) { + SpringApplication.run(ServerLocationApp.class, args); + } +} diff --git a/spring-cloud/spring-cloud-ribbon-client/src/main/resources/application.yml b/spring-cloud/spring-cloud-ribbon-client/src/main/resources/application.yml new file mode 100644 index 0000000000..189a923c6c --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: spring-cloud-ribbon + +server: + port: 8888 + +ping-server: + ribbon: + eureka: + enabled: false + listOfServers: localhost:9092,localhost:9999 + ServerListRefreshInterval: 15000 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppTests.java b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppTests.java new file mode 100644 index 0000000000..b3606537a2 --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/ServerLocationAppTests.java @@ -0,0 +1,54 @@ +package com.baeldung.spring.cloud.ribbon.client; + +import static org.assertj.core.api.BDDAssertions.then; +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +@SuppressWarnings("unused") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ServerLocationApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class ServerLocationAppTests { + ConfigurableApplicationContext application2; + ConfigurableApplicationContext application3; + + @Before + public void startApps() { + this.application2 = startApp(9092); + this.application3 = startApp(9999); + } + + @After + public void closeApps() { + this.application2.close(); + this.application3.close(); + } + + @LocalServerPort + private int port; + + @Autowired + private TestRestTemplate testRestTemplate; + + @Test + public void loadBalancingServersTest() throws InterruptedException { + ResponseEntity response = this.testRestTemplate.getForEntity("http://localhost:" + this.port + "/server-location", String.class); + assertEquals(response.getBody(), "Australia"); + } + + private ConfigurableApplicationContext startApp(int port) { + return SpringApplication.run(TestConfig.class, "--server.port=" + port, "--spring.jmx.enabled=false"); + } +} diff --git a/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/TestConfig.java b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/TestConfig.java new file mode 100644 index 0000000000..886b28a32e --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/spring/cloud/ribbon/client/TestConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.cloud.ribbon.client; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Configuration +@EnableAutoConfiguration +@RestController +public class TestConfig { + + @RequestMapping(value = "/locaus") + public String locationAUSDetails() { + return "Australia"; + } +} From b7de8a08f453bd676a4f9acefe65add54837291e Mon Sep 17 00:00:00 2001 From: Kiran Date: Sun, 6 Nov 2016 21:39:24 -0500 Subject: [PATCH 076/115] Updated pom.xml added new module "spring-cloud-ribbon-client" --- spring-cloud/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 2349613def..455a5b876b 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -11,6 +11,7 @@ spring-cloud-eureka spring-cloud-hystrix spring-cloud-bootstrap + spring-cloud-ribbon-client pom From d07908f71b2572dfd49c3bafe51440f08992aeb4 Mon Sep 17 00:00:00 2001 From: DOHA Date: Mon, 7 Nov 2016 21:07:06 +0200 Subject: [PATCH 077/115] add source code for Facebook login --- spring-social-login/pom.xml | 169 ++++++++++++++++++ .../java/org/baeldung/config/Application.java | 18 ++ .../org/baeldung/config/SecurityConfig.java | 61 +++++++ .../java/org/baeldung/config/WebConfig.java | 39 ++++ .../persistence/dao/UserRepository.java | 10 ++ .../org/baeldung/persistence/model/User.java | 55 ++++++ .../security/FacebookConnectionSignup.java | 28 +++ .../security/FacebookSignInAdapter.java | 21 +++ .../security/MyUserDetailsService.java | 34 ++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/data.sql | 1 + .../src/main/resources/templates/index.html | 27 +++ .../src/main/resources/templates/login.html | 44 +++++ .../test/ApplicationIntegrationTest.java | 18 ++ 14 files changed, 528 insertions(+) create mode 100644 spring-social-login/pom.xml create mode 100644 spring-social-login/src/main/java/org/baeldung/config/Application.java create mode 100644 spring-social-login/src/main/java/org/baeldung/config/SecurityConfig.java create mode 100644 spring-social-login/src/main/java/org/baeldung/config/WebConfig.java create mode 100644 spring-social-login/src/main/java/org/baeldung/persistence/dao/UserRepository.java create mode 100644 spring-social-login/src/main/java/org/baeldung/persistence/model/User.java create mode 100644 spring-social-login/src/main/java/org/baeldung/security/FacebookConnectionSignup.java create mode 100644 spring-social-login/src/main/java/org/baeldung/security/FacebookSignInAdapter.java create mode 100644 spring-social-login/src/main/java/org/baeldung/security/MyUserDetailsService.java create mode 100644 spring-social-login/src/main/resources/application.properties create mode 100644 spring-social-login/src/main/resources/data.sql create mode 100644 spring-social-login/src/main/resources/templates/index.html create mode 100644 spring-social-login/src/main/resources/templates/login.html create mode 100644 spring-social-login/src/test/java/org/baeldung/test/ApplicationIntegrationTest.java diff --git a/spring-social-login/pom.xml b/spring-social-login/pom.xml new file mode 100644 index 0000000000..6e74b1c3d1 --- /dev/null +++ b/spring-social-login/pom.xml @@ -0,0 +1,169 @@ + + 4.0.0 + spring-social-login + + spring-social-login + war + + + org.springframework.boot + spring-boot-starter-parent + 1.4.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + org.springframework.security + spring-security-web + + + + org.springframework.security + spring-security-config + + + + org.springframework.security + spring-security-taglibs + + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity4 + + + + + org.springframework.social + spring-social-facebook + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.springframework + spring-test + test + + + + junit + junit + test + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + + + spring-social-login + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-war-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + 1.8 + 3.3.2 + + + \ No newline at end of file diff --git a/spring-social-login/src/main/java/org/baeldung/config/Application.java b/spring-social-login/src/main/java/org/baeldung/config/Application.java new file mode 100644 index 0000000000..cf6251a51e --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/config/Application.java @@ -0,0 +1,18 @@ +package org.baeldung.config; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@EnableJpaRepositories("org.baeldung.persistence.dao") +@EntityScan("org.baeldung.persistence.model") +public class Application extends SpringBootServletInitializer { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} \ No newline at end of file diff --git a/spring-social-login/src/main/java/org/baeldung/config/SecurityConfig.java b/spring-social-login/src/main/java/org/baeldung/config/SecurityConfig.java new file mode 100644 index 0000000000..8e439653a9 --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/config/SecurityConfig.java @@ -0,0 +1,61 @@ +package org.baeldung.config; + +import org.baeldung.security.FacebookSignInAdapter; +import org.baeldung.security.FacebookConnectionSignup; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.social.connect.ConnectionFactoryLocator; +import org.springframework.social.connect.UsersConnectionRepository; +import org.springframework.social.connect.mem.InMemoryUsersConnectionRepository; +import org.springframework.social.connect.web.ProviderSignInController; + +@Configuration +@EnableWebSecurity +@ComponentScan(basePackages = { "org.baeldung.security" }) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private UserDetailsService userDetailsService; + + @Autowired + private ConnectionFactoryLocator connectionFactoryLocator; + + @Autowired + private UsersConnectionRepository usersConnectionRepository; + + @Autowired + private FacebookConnectionSignup facebookConnectionSignup; + + @Override + protected void configure(final AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService); + } + + @Override + protected void configure(final HttpSecurity http) throws Exception { + // @formatter:off + http + .csrf().disable() + .authorizeRequests() + .antMatchers("/login*","/signin/**","/signup/**").permitAll() + .anyRequest().authenticated() + .and() + .formLogin().loginPage("/login").permitAll() + .and() + .logout(); + } // @formatter:on + + @Bean + // @Primary + public ProviderSignInController providerSignInController() { + ((InMemoryUsersConnectionRepository) usersConnectionRepository).setConnectionSignUp(facebookConnectionSignup); + return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter()); + } +} \ No newline at end of file diff --git a/spring-social-login/src/main/java/org/baeldung/config/WebConfig.java b/spring-social-login/src/main/java/org/baeldung/config/WebConfig.java new file mode 100644 index 0000000000..8cfcd6cb41 --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/config/WebConfig.java @@ -0,0 +1,39 @@ +package org.baeldung.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +@EnableWebMvc +public class WebConfig extends WebMvcConfigurerAdapter { + + @Bean + public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } + + @Override + public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + super.addViewControllers(registry); + registry.addViewController("/").setViewName("forward:/index"); + registry.addViewController("/index"); + registry.addViewController("/login"); + } + + @Override + public void addResourceHandlers(final ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); + } + +} \ No newline at end of file diff --git a/spring-social-login/src/main/java/org/baeldung/persistence/dao/UserRepository.java b/spring-social-login/src/main/java/org/baeldung/persistence/dao/UserRepository.java new file mode 100644 index 0000000000..679dd6c363 --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/persistence/dao/UserRepository.java @@ -0,0 +1,10 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + + User findByUsername(final String username); + +} diff --git a/spring-social-login/src/main/java/org/baeldung/persistence/model/User.java b/spring-social-login/src/main/java/org/baeldung/persistence/model/User.java new file mode 100644 index 0000000000..a4cffc27d0 --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/persistence/model/User.java @@ -0,0 +1,55 @@ +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 User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false, unique = true) + private String username; + + private String password; + + public User() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("User [id=").append(id).append(", username=").append(username).append(", password=").append(password).append("]"); + return builder.toString(); + } + +} diff --git a/spring-social-login/src/main/java/org/baeldung/security/FacebookConnectionSignup.java b/spring-social-login/src/main/java/org/baeldung/security/FacebookConnectionSignup.java new file mode 100644 index 0000000000..6a9e30d7d8 --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/security/FacebookConnectionSignup.java @@ -0,0 +1,28 @@ +package org.baeldung.security; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import org.baeldung.persistence.dao.UserRepository; +import org.baeldung.persistence.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.social.connect.Connection; +import org.springframework.social.connect.ConnectionSignUp; +import org.springframework.stereotype.Service; + +@Service +public class FacebookConnectionSignup implements ConnectionSignUp { + + @Autowired + private UserRepository userRepository; + + @Override + public String execute(Connection connection) { + System.out.println("signup === "); + final User user = new User(); + user.setUsername(connection.getDisplayName()); + user.setPassword(randomAlphabetic(8)); + userRepository.save(user); + return user.getUsername(); + } + +} diff --git a/spring-social-login/src/main/java/org/baeldung/security/FacebookSignInAdapter.java b/spring-social-login/src/main/java/org/baeldung/security/FacebookSignInAdapter.java new file mode 100644 index 0000000000..b861609a01 --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/security/FacebookSignInAdapter.java @@ -0,0 +1,21 @@ +package org.baeldung.security; + +import java.util.Arrays; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.social.connect.Connection; +import org.springframework.social.connect.web.SignInAdapter; +import org.springframework.stereotype.Service; +import org.springframework.web.context.request.NativeWebRequest; + +@Service +public class FacebookSignInAdapter implements SignInAdapter { + @Override + public String signIn(String localUserId, Connection connection, NativeWebRequest request) { + System.out.println(" ====== Sign In adapter"); + SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(connection.getDisplayName(), null, Arrays.asList(new SimpleGrantedAuthority("FACEBOOK_USER")))); + return null; + } +} diff --git a/spring-social-login/src/main/java/org/baeldung/security/MyUserDetailsService.java b/spring-social-login/src/main/java/org/baeldung/security/MyUserDetailsService.java new file mode 100644 index 0000000000..5d0d5d793a --- /dev/null +++ b/spring-social-login/src/main/java/org/baeldung/security/MyUserDetailsService.java @@ -0,0 +1,34 @@ +package org.baeldung.security; + +import java.util.Arrays; + +import org.baeldung.persistence.dao.UserRepository; +import org.baeldung.persistence.model.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class MyUserDetailsService implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + public MyUserDetailsService() { + super(); + } + + // API + + @Override + public UserDetails loadUserByUsername(final String username) { + final User user = userRepository.findByUsername(username); + if (user == null) { + throw new UsernameNotFoundException(username); + } + return new org.springframework.security.core.userdetails.User(username, user.getPassword(), true, true, true, true, Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))); + } +} diff --git a/spring-social-login/src/main/resources/application.properties b/spring-social-login/src/main/resources/application.properties new file mode 100644 index 0000000000..2bd99d8239 --- /dev/null +++ b/spring-social-login/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.social.facebook.appId=1715784745414888 +spring.social.facebook.appSecret=abefd6497e9cc01ad03be28509617bf0 +spring.thymeleaf.cache=false \ No newline at end of file diff --git a/spring-social-login/src/main/resources/data.sql b/spring-social-login/src/main/resources/data.sql new file mode 100644 index 0000000000..3b26afef32 --- /dev/null +++ b/spring-social-login/src/main/resources/data.sql @@ -0,0 +1 @@ +insert into User (id, username, password) values (1,'john', '123'); \ No newline at end of file diff --git a/spring-social-login/src/main/resources/templates/index.html b/spring-social-login/src/main/resources/templates/index.html new file mode 100644 index 0000000000..8e1a8da60f --- /dev/null +++ b/spring-social-login/src/main/resources/templates/index.html @@ -0,0 +1,27 @@ + + + + +Spring Social Login + + + + + + +
+

Welcome, Username

+

User authorities

+
+ + \ No newline at end of file diff --git a/spring-social-login/src/main/resources/templates/login.html b/spring-social-login/src/main/resources/templates/login.html new file mode 100644 index 0000000000..41ad39332c --- /dev/null +++ b/spring-social-login/src/main/resources/templates/login.html @@ -0,0 +1,44 @@ + + + + +Spring Social Login + + + +
+
You have been logged out
+
There was an error, please try again
+ +

Login

+
+
+
+ + +
+
+
+ + +
+ +
+ +
+
+
+
+
+
+
+
+ + +
+
+ + +
+ + \ No newline at end of file diff --git a/spring-social-login/src/test/java/org/baeldung/test/ApplicationIntegrationTest.java b/spring-social-login/src/test/java/org/baeldung/test/ApplicationIntegrationTest.java new file mode 100644 index 0000000000..43aaea18b1 --- /dev/null +++ b/spring-social-login/src/test/java/org/baeldung/test/ApplicationIntegrationTest.java @@ -0,0 +1,18 @@ +package org.baeldung.test; + +import org.baeldung.config.Application; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT) +public class ApplicationIntegrationTest { + + @Test + public void whenLoadApplication_thenSuccess() { + + } +} From 48f5fdb8e99bcca2e60abb9138073478f9f2c781 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 7 Nov 2016 21:12:50 +0100 Subject: [PATCH 078/115] Cleanup OkHttpGetLiveTest --- .../baeldung/okhttp/OkHttpGetLiveTest.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java index 632d7577a4..9bf57c41b2 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java @@ -1,23 +1,14 @@ package org.baeldung.okhttp; +import okhttp3.*; +import org.junit.Test; + +import java.io.IOException; + import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; -import java.io.IOException; - -import org.junit.Test; - -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - -//@RunWith(SpringJUnit4ClassRunner.class) -//@WebAppConfiguration -//@ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/api-servlet.xml") public class OkHttpGetLiveTest { private static final String BASE_URL = "http://localhost:8080/spring-rest"; From 9ae723f5ab04cfe9826c6524e10a0d4165c4b409 Mon Sep 17 00:00:00 2001 From: danidemi Date: Mon, 7 Nov 2016 21:21:28 +0100 Subject: [PATCH 079/115] Removed redundant interface --- .../com/baeldung/mdc/IBusinessService.java | 9 ---- .../java/com/baeldung/mdc/Transaction.java | 50 ++++++++----------- ...inessService.java => TransferService.java} | 4 +- .../mdc/log4j/Log4JBusinessService.java | 4 +- .../com/baeldung/mdc/log4j/Log4JRunnable.java | 3 -- .../mdc/log4j2/Log4J2BusinessService.java | 4 +- .../baeldung/mdc/log4j2/Log4J2Runnable.java | 2 - .../mdc/slf4j/Slf4jBusinessService.java | 4 +- .../com/baeldung/mdc/slf4j/Slf4jRunnable.java | 1 - 9 files changed, 30 insertions(+), 51 deletions(-) delete mode 100644 log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java rename log-mdc-ndc/src/main/java/com/baeldung/mdc/{BusinessService.java => TransferService.java} (80%) diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java deleted file mode 100644 index a2f2fbfdb3..0000000000 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/IBusinessService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.mdc; - -public interface IBusinessService { - - /** Sample service transferring a given amount of money. - * @return {@code true} when the transfer complete successfully, {@code false} otherwise. */ - boolean transfer(long amount); - -} diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java index ac0fe75ac5..1a038512c0 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java @@ -1,35 +1,27 @@ package com.baeldung.mdc; -import java.util.Date; - public class Transaction { - - private String transactionId; - private String owner; - private Date createdAt; - private Long amount; - - public Transaction(String transactionId, String owner, long amount) { - this.transactionId = transactionId; - this.owner = owner; - this.createdAt = new Date(); - this.amount = amount; - } - public String getOwner() { - return owner; - } + private String transactionId; + private String owner; + private Long amount; + + public Transaction(String transactionId, String owner, long amount) { + this.transactionId = transactionId; + this.owner = owner; + this.amount = amount; + } + + public String getOwner() { + return owner; + } + + public String getTransactionId() { + return transactionId; + } + + public Long getAmount() { + return amount; + } - public String getTransactionId() { - return transactionId; - } - - public Date getCreatedAt() { - return createdAt; - } - - public Long getAmount() { - return amount; - } - } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java similarity index 80% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java rename to log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java index a5fa940a42..7ab53043d3 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java @@ -3,8 +3,10 @@ package com.baeldung.mdc; /** * A fake {@link IBusinessService} simulating an actual one. */ -public abstract class BusinessService implements IBusinessService { +public abstract class TransferService { + /** Sample service transferring a given amount of money. + * @return {@code true} when the transfer complete successfully, {@code false} otherwise. */ public boolean transfer(long amount) { beforeTransfer(amount); // exchange messages with a remote system to transfer the money diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java index 26633e229e..d8b3a15cc2 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java @@ -2,9 +2,9 @@ package com.baeldung.mdc.log4j; import org.apache.log4j.Logger; -import com.baeldung.mdc.BusinessService; +import com.baeldung.mdc.TransferService; -public class Log4JBusinessService extends BusinessService { +public class Log4JBusinessService extends TransferService { private Logger logger = Logger.getLogger(Log4JBusinessService.class); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java index ce5d97eddf..817eee1e3c 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java @@ -1,10 +1,8 @@ package com.baeldung.mdc.log4j; import org.apache.log4j.MDC; -import org.apache.logging.log4j.ThreadContext; import com.baeldung.mdc.Transaction; -import com.baeldung.mdc.log4j2.Log4J2BusinessService; public class Log4JRunnable implements Runnable { @@ -19,7 +17,6 @@ public class Log4JRunnable implements Runnable { MDC.put("transaction.id", tx.getTransactionId()); MDC.put("transaction.owner", tx.getOwner()); - MDC.put("transaction.createdAt", tx.getCreatedAt()); log4jBusinessService.transfer(tx.getAmount()); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java index cbfbc5b8a5..66a554ff65 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java @@ -3,9 +3,9 @@ package com.baeldung.mdc.log4j2; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.baeldung.mdc.BusinessService; +import com.baeldung.mdc.TransferService; -public class Log4J2BusinessService extends BusinessService { +public class Log4J2BusinessService extends TransferService { private static final Logger logger = LogManager.getLogger(); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java index 6a3f39ba5b..d76f1346e2 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java @@ -14,10 +14,8 @@ public class Log4J2Runnable implements Runnable { public void run() { - ThreadContext.put("transaction.id", tx.getTransactionId()); ThreadContext.put("transaction.id", tx.getTransactionId()); ThreadContext.put("transaction.owner", tx.getOwner()); - ThreadContext.put("transaction.createdAt", tx.getCreatedAt().toString()); log4j2BusinessService.transfer(tx.getAmount()); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java index d525965ed5..6cd2df6b46 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java @@ -3,9 +3,9 @@ package com.baeldung.mdc.slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.baeldung.mdc.BusinessService; +import com.baeldung.mdc.TransferService; -final class Slf4jBusinessService extends BusinessService { +final class Slf4jBusinessService extends TransferService { private static final Logger logger = LoggerFactory.getLogger(Slf4jBusinessService.class); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java index 2ef170721c..61bf2c0743 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java @@ -15,7 +15,6 @@ public class Slf4jRunnable implements Runnable { MDC.put("transaction.id", tx.getTransactionId()); MDC.put("transaction.owner", tx.getOwner()); - MDC.put("transaction.createdAt", tx.getCreatedAt().toString()); new Slf4jBusinessService().transfer(tx.getAmount()); From b27a8cff06b5298022f5b3a991ec87d78af1594a Mon Sep 17 00:00:00 2001 From: danidemi Date: Mon, 7 Nov 2016 22:44:09 +0100 Subject: [PATCH 080/115] Renaming following article review --- .../java/com/baeldung/mdc/TransactionFactory.java | 4 ++-- .../baeldung/mdc/{Transaction.java => Transfer.java} | 12 ++++++------ .../mdc/{GenericApp.java => TransferDemo.java} | 4 ++-- .../main/java/com/baeldung/mdc/TransferService.java | 2 +- .../java/com/baeldung/mdc/log4j/Log4JRunnable.java | 10 +++++----- ...usinessService.java => Log4JTransferService.java} | 4 ++-- .../java/com/baeldung/mdc/log4j2/Log4J2Runnable.java | 10 +++++----- ...sinessService.java => Log4J2TransferService.java} | 2 +- ...BusinessService.java => Slf4TransferService.java} | 4 ++-- .../java/com/baeldung/mdc/slf4j/Slf4jRunnable.java | 10 +++++----- 10 files changed, 31 insertions(+), 31 deletions(-) rename log-mdc-ndc/src/main/java/com/baeldung/mdc/{Transaction.java => Transfer.java} (60%) rename log-mdc-ndc/src/main/java/com/baeldung/mdc/{GenericApp.java => TransferDemo.java} (89%) rename log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/{Log4JBusinessService.java => Log4JTransferService.java} (77%) rename log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/{Log4J2BusinessService.java => Log4J2TransferService.java} (89%) rename log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/{Slf4jBusinessService.java => Slf4TransferService.java} (85%) diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java index 2ae0b3d3f5..ec1887eea6 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java @@ -10,11 +10,11 @@ public class TransactionFactory { private static final String[] NAMES = {"John", "Susan", "Marc", "Samantha"}; private static long nextId = 1; - public Transaction newInstance() { + public Transfer newInstance() { String transactionId = String.valueOf( nextId++ ); String owner = NAMES[ (int) floor(random()*NAMES.length) ]; long amount = (long) (random()*1500 + 500); - Transaction tx = new Transaction(transactionId, owner, amount); + Transfer tx = new Transfer(transactionId, owner, amount); return tx; } diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transfer.java similarity index 60% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java rename to log-mdc-ndc/src/main/java/com/baeldung/mdc/Transfer.java index 1a038512c0..1a27fe4eec 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transaction.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transfer.java @@ -1,19 +1,19 @@ package com.baeldung.mdc; -public class Transaction { +public class Transfer { private String transactionId; - private String owner; + private String sender; private Long amount; - public Transaction(String transactionId, String owner, long amount) { + public Transfer(String transactionId, String sender, long amount) { this.transactionId = transactionId; - this.owner = owner; + this.sender = sender; this.amount = amount; } - public String getOwner() { - return owner; + public String getSender() { + return sender; } public String getTransactionId() { diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferDemo.java similarity index 89% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java rename to log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferDemo.java index 9f08e33455..daf256007c 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/GenericApp.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferDemo.java @@ -9,7 +9,7 @@ import com.baeldung.mdc.log4j.Log4JRunnable; import com.baeldung.mdc.log4j2.Log4J2Runnable; import com.baeldung.mdc.slf4j.Slf4jRunnable; -public class GenericApp { +public class TransferDemo { public static void main(String[] args) { @@ -17,7 +17,7 @@ public class GenericApp { TransactionFactory transactionFactory = new TransactionFactory(); for (int i = 0; i < 10; i++) { - final Transaction tx = transactionFactory.newInstance(); + Transfer tx = transactionFactory.newInstance(); //Runnable task = new Log4JRunnable(tx); //Runnable task = new Log4J2Runnable(tx); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java index 7ab53043d3..95e7d38630 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java @@ -1,7 +1,7 @@ package com.baeldung.mdc; /** - * A fake {@link IBusinessService} simulating an actual one. + * A fake transfer service simulating an actual one. */ public abstract class TransferService { diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java index 817eee1e3c..7711795a59 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java @@ -2,21 +2,21 @@ package com.baeldung.mdc.log4j; import org.apache.log4j.MDC; -import com.baeldung.mdc.Transaction; +import com.baeldung.mdc.Transfer; public class Log4JRunnable implements Runnable { - private Transaction tx; - private static Log4JBusinessService log4jBusinessService = new Log4JBusinessService(); + private Transfer tx; + private static Log4JTransferService log4jBusinessService = new Log4JTransferService(); - public Log4JRunnable(Transaction tx) { + public Log4JRunnable(Transfer tx) { this.tx = tx; } public void run() { MDC.put("transaction.id", tx.getTransactionId()); - MDC.put("transaction.owner", tx.getOwner()); + MDC.put("transaction.owner", tx.getSender()); log4jBusinessService.transfer(tx.getAmount()); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java similarity index 77% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java rename to log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java index d8b3a15cc2..a8bfe7957a 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java @@ -4,9 +4,9 @@ import org.apache.log4j.Logger; import com.baeldung.mdc.TransferService; -public class Log4JBusinessService extends TransferService { +public class Log4JTransferService extends TransferService { - private Logger logger = Logger.getLogger(Log4JBusinessService.class); + private Logger logger = Logger.getLogger(Log4JTransferService.class); @Override protected void beforeTransfer(long amount) { diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java index d76f1346e2..0b7f516bd1 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java @@ -2,20 +2,20 @@ package com.baeldung.mdc.log4j2; import org.apache.logging.log4j.ThreadContext; -import com.baeldung.mdc.Transaction; +import com.baeldung.mdc.Transfer; public class Log4J2Runnable implements Runnable { - private final Transaction tx; - private Log4J2BusinessService log4j2BusinessService = new Log4J2BusinessService(); + private final Transfer tx; + private Log4J2TransferService log4j2BusinessService = new Log4J2TransferService(); - public Log4J2Runnable(Transaction tx) { + public Log4J2Runnable(Transfer tx) { this.tx = tx; } public void run() { ThreadContext.put("transaction.id", tx.getTransactionId()); - ThreadContext.put("transaction.owner", tx.getOwner()); + ThreadContext.put("transaction.owner", tx.getSender()); log4j2BusinessService.transfer(tx.getAmount()); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java similarity index 89% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java rename to log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java index 66a554ff65..fb6eeccc9e 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2BusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; import com.baeldung.mdc.TransferService; -public class Log4J2BusinessService extends TransferService { +public class Log4J2TransferService extends TransferService { private static final Logger logger = LogManager.getLogger(); diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java similarity index 85% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java rename to log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java index 6cd2df6b46..f4df150a6a 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jBusinessService.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java @@ -5,9 +5,9 @@ import org.slf4j.LoggerFactory; import com.baeldung.mdc.TransferService; -final class Slf4jBusinessService extends TransferService { +final class Slf4TransferService extends TransferService { - private static final Logger logger = LoggerFactory.getLogger(Slf4jBusinessService.class); + private static final Logger logger = LoggerFactory.getLogger(Slf4TransferService.class); @Override protected void beforeTransfer(long amount) { diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java index 61bf2c0743..e30a28a3c7 100644 --- a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java +++ b/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java @@ -2,21 +2,21 @@ package com.baeldung.mdc.slf4j; import org.slf4j.MDC; -import com.baeldung.mdc.Transaction; +import com.baeldung.mdc.Transfer; public class Slf4jRunnable implements Runnable { - private final Transaction tx; + private final Transfer tx; - public Slf4jRunnable(Transaction tx) { + public Slf4jRunnable(Transfer tx) { this.tx = tx; } public void run() { MDC.put("transaction.id", tx.getTransactionId()); - MDC.put("transaction.owner", tx.getOwner()); + MDC.put("transaction.owner", tx.getSender()); - new Slf4jBusinessService().transfer(tx.getAmount()); + new Slf4TransferService().transfer(tx.getAmount()); MDC.clear(); From 4e3f9fa626839f6b1f50abc9c147cad0a1e84757 Mon Sep 17 00:00:00 2001 From: danidemi Date: Mon, 7 Nov 2016 23:06:36 +0100 Subject: [PATCH 081/115] Demos are run with JUnit --- {log-mdc-ndc => log-mdc}/README.md | 0 {log-mdc-ndc => log-mdc}/pom.xml | 8 +++++ .../com/baeldung/mdc/TransactionFactory.java | 0 .../main/java/com/baeldung/mdc/Transfer.java | 0 .../java/com/baeldung/mdc/TransferDemo.java | 0 .../com/baeldung/mdc/TransferService.java | 0 .../com/baeldung/mdc/log4j/Log4JRunnable.java | 0 .../mdc/log4j/Log4JTransferService.java | 0 .../baeldung/mdc/log4j2/Log4J2Runnable.java | 0 .../mdc/log4j2/Log4J2TransferService.java | 0 .../mdc/slf4j/Slf4TransferService.java | 0 .../com/baeldung/mdc/slf4j/Slf4jRunnable.java | 0 .../src/main/resources/log4j.properties | 0 .../src/main/resources/log4j2.xml | 0 .../src/main/resources/logback.xml | 0 .../java/com/baeldung/mdc/log4j/Demo.java | 26 ++++++++++++++++ .../java/com/baeldung/mdc/log4j2/Demo.java | 30 +++++++++++++++++++ .../java/com/baeldung/mdc/slf4j/Demo.java | 30 +++++++++++++++++++ 18 files changed, 94 insertions(+) rename {log-mdc-ndc => log-mdc}/README.md (100%) rename {log-mdc-ndc => log-mdc}/pom.xml (90%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/TransactionFactory.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/Transfer.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/TransferDemo.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/TransferService.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java (100%) rename {log-mdc-ndc => log-mdc}/src/main/resources/log4j.properties (100%) rename {log-mdc-ndc => log-mdc}/src/main/resources/log4j2.xml (100%) rename {log-mdc-ndc => log-mdc}/src/main/resources/logback.xml (100%) create mode 100644 log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java create mode 100644 log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java create mode 100644 log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java diff --git a/log-mdc-ndc/README.md b/log-mdc/README.md similarity index 100% rename from log-mdc-ndc/README.md rename to log-mdc/README.md diff --git a/log-mdc-ndc/pom.xml b/log-mdc/pom.xml similarity index 90% rename from log-mdc-ndc/pom.xml rename to log-mdc/pom.xml index 927473ad4e..a6e9414dc5 100644 --- a/log-mdc-ndc/pom.xml +++ b/log-mdc/pom.xml @@ -52,6 +52,14 @@ logback-classic 1.1.7 + + + junit + junit + 4.12 + test + + diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/TransactionFactory.java rename to log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/Transfer.java b/log-mdc/src/main/java/com/baeldung/mdc/Transfer.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/Transfer.java rename to log-mdc/src/main/java/com/baeldung/mdc/Transfer.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferDemo.java b/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferDemo.java rename to log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java b/log-mdc/src/main/java/com/baeldung/mdc/TransferService.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/TransferService.java rename to log-mdc/src/main/java/com/baeldung/mdc/TransferService.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java b/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java rename to log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java b/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java rename to log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java b/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java rename to log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java b/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java rename to log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java b/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java rename to log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java diff --git a/log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java b/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java similarity index 100% rename from log-mdc-ndc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java rename to log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java diff --git a/log-mdc-ndc/src/main/resources/log4j.properties b/log-mdc/src/main/resources/log4j.properties similarity index 100% rename from log-mdc-ndc/src/main/resources/log4j.properties rename to log-mdc/src/main/resources/log4j.properties diff --git a/log-mdc-ndc/src/main/resources/log4j2.xml b/log-mdc/src/main/resources/log4j2.xml similarity index 100% rename from log-mdc-ndc/src/main/resources/log4j2.xml rename to log-mdc/src/main/resources/log4j2.xml diff --git a/log-mdc-ndc/src/main/resources/logback.xml b/log-mdc/src/main/resources/logback.xml similarity index 100% rename from log-mdc-ndc/src/main/resources/logback.xml rename to log-mdc/src/main/resources/logback.xml diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java b/log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java new file mode 100644 index 0000000000..f9a210606f --- /dev/null +++ b/log-mdc/src/test/java/com/baeldung/mdc/log4j/Demo.java @@ -0,0 +1,26 @@ +package com.baeldung.mdc.log4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.baeldung.mdc.TransactionFactory; +import com.baeldung.mdc.Transfer; + +public class Demo { + + @Test + public void main() throws InterruptedException { + ExecutorService executor = Executors.newFixedThreadPool(3); + TransactionFactory transactionFactory = new TransactionFactory(); + for (int i = 0; i < 10; i++) { + Transfer tx = transactionFactory.newInstance(); + Runnable task = new Log4JRunnable(tx); + executor.submit(task); + } + executor.shutdown(); + executor.awaitTermination(60, TimeUnit.SECONDS); + } +} diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java b/log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java new file mode 100644 index 0000000000..3f7c1d37d5 --- /dev/null +++ b/log-mdc/src/test/java/com/baeldung/mdc/log4j2/Demo.java @@ -0,0 +1,30 @@ +package com.baeldung.mdc.log4j2; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.junit.Test; + +import com.baeldung.mdc.TransactionFactory; +import com.baeldung.mdc.Transfer; +import com.baeldung.mdc.log4j.Log4JRunnable; +import com.baeldung.mdc.log4j2.Log4J2Runnable; +import com.baeldung.mdc.slf4j.Slf4jRunnable; + +public class Demo { + + @Test + public void main() throws InterruptedException { + ExecutorService executor = Executors.newFixedThreadPool(3); + TransactionFactory transactionFactory = new TransactionFactory(); + for (int i = 0; i < 10; i++) { + Transfer tx = transactionFactory.newInstance(); + Runnable task = new Log4J2Runnable(tx); + executor.submit(task); + } + executor.shutdown(); + executor.awaitTermination(60, TimeUnit.SECONDS); + } +} diff --git a/log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java b/log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java new file mode 100644 index 0000000000..98db698f47 --- /dev/null +++ b/log-mdc/src/test/java/com/baeldung/mdc/slf4j/Demo.java @@ -0,0 +1,30 @@ +package com.baeldung.mdc.slf4j; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.junit.Test; + +import com.baeldung.mdc.TransactionFactory; +import com.baeldung.mdc.Transfer; +import com.baeldung.mdc.log4j.Log4JRunnable; +import com.baeldung.mdc.log4j2.Log4J2Runnable; +import com.baeldung.mdc.slf4j.Slf4jRunnable; + +public class Demo { + + @Test + public void main() throws InterruptedException { + ExecutorService executor = Executors.newFixedThreadPool(3); + TransactionFactory transactionFactory = new TransactionFactory(); + for (int i = 0; i < 10; i++) { + Transfer tx = transactionFactory.newInstance(); + Runnable task = new Slf4jRunnable(tx); + executor.submit(task); + } + executor.shutdown(); + executor.awaitTermination(60, TimeUnit.SECONDS); + } +} From 23db51fbd75d5dacb95db6acf44c3730c0d89861 Mon Sep 17 00:00:00 2001 From: danidemi Date: Mon, 7 Nov 2016 23:08:51 +0100 Subject: [PATCH 082/115] Minor typos --- log-mdc/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/log-mdc/pom.xml b/log-mdc/pom.xml index a6e9414dc5..7d68049cde 100644 --- a/log-mdc/pom.xml +++ b/log-mdc/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - com.baeldug - logmdcndc + com.baeldung + logmdc 0.0.1-SNAPSHOT - logmdcndc - tutorial on logging with MDC and NDC + logmdc + tutorial on logging with MDC From e26d9ff8e492bdd05e89b9d774c2e7f0a773a0a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Wed, 9 Nov 2016 06:57:16 +0100 Subject: [PATCH 083/115] BAEL-41: Some minor format changes. --- .../tests/AsyncFileAppenderUsingJsonLayoutTest.java | 7 ++++--- .../tests/ConsoleAppenderUsingDefaultLayoutTest.java | 11 +++++++---- ...nsoleAppenderUsingPatternLayoutWithColorsTest.java | 10 ++++++---- .../tests/RollingFileAppenderUsingXMLLayoutTest.java | 6 +++--- .../log4j2-rolling-file-appender_xml-layout.xml | 2 +- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java index db3a4d2458..0472c2219e 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/AsyncFileAppenderUsingJsonLayoutTest.java @@ -14,12 +14,13 @@ import static org.junit.Assert.assertTrue; @RunWith(JUnit4.class) public class AsyncFileAppenderUsingJsonLayoutTest { - @Rule - public LoggerContextRule contextRule = new LoggerContextRule("log4j2-async-file-appender_json-layout.xml"); + public LoggerContextRule contextRule = + new LoggerContextRule("log4j2-async-file-appender_json-layout.xml"); @Test - public void givenLoggerWithAsyncConfig_shouldLogToJsonFile() throws Exception { + public void givenLoggerWithAsyncConfig_shouldLogToJsonFile() + throws Exception { Logger logger = contextRule.getLogger(getClass().getSimpleName()); final int count = 88; for (int i = 0; i < count; i++) { diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java index 9d8b2ae81b..9831030d02 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingDefaultLayoutTest.java @@ -8,11 +8,14 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ConsoleAppenderUsingDefaultLayoutTest { - @Test - public void givenLoggerWithDefaultConfig_shouldLogToConsole() throws Exception { - Logger logger = LogManager.getLogger(ConsoleAppenderUsingDefaultLayoutTest.class); + public void givenLoggerWithDefaultConfig_shouldLogToConsole() + throws Exception { + Logger logger = LogManager.getLogger(getClass()); Exception e = new RuntimeException("This is only a test!"); - logger.error("This is a simple message at ERROR level. This is the minimum visible level.", e); + logger.info("This is a simple message at INFO level. " + + "It will be hidden."); + logger.error("This is a simple message at ERROR level. " + + "This is the minimum visible level.", e); } } diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java index 1e16ba7d0b..86b005538f 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/ConsoleAppenderUsingPatternLayoutWithColorsTest.java @@ -12,15 +12,17 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ConsoleAppenderUsingPatternLayoutWithColorsTest { - @Rule - public LoggerContextRule contextRule = new LoggerContextRule("log4j2-console-appender_pattern-layout.xml"); + public LoggerContextRule contextRule = + new LoggerContextRule("log4j2-console-appender_pattern-layout.xml"); @Test - public void givenLoggerWithConsoleConfig_shouldLogToConsoleInColors() throws Exception { + public void givenLoggerWithConsoleConfig_shouldLogToConsoleInColors() + throws Exception { Logger logger = contextRule.getLogger(getClass().getSimpleName()); logger.trace("This is a colored message at TRACE level."); - logger.debug("This is a colored message at DEBUG level. This is the minimum visible level."); + logger.debug("This is a colored message at DEBUG level. " + + "This is the minimum visible level."); logger.info("This is a colored message at INFO level."); logger.warn("This is a colored message at WARN level."); Exception e = new RuntimeException("This is only a test!"); diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java index 2ebdccfc75..3ab69d263c 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/RollingFileAppenderUsingXMLLayoutTest.java @@ -15,9 +15,9 @@ import static org.junit.Assert.assertTrue; @RunWith(JUnit4.class) public class RollingFileAppenderUsingXMLLayoutTest { - @Rule - public LoggerContextRule contextRule = new LoggerContextRule("log4j2-rolling-file-appender_xml-layout.xml"); + public LoggerContextRule contextRule = + new LoggerContextRule("log4j2-rolling-file-appender_xml-layout.xml"); @Test public void givenLoggerWithRollingFileConfig_shouldLogToXMLFile() throws Exception { @@ -29,6 +29,6 @@ public class RollingFileAppenderUsingXMLLayoutTest { String[] logEvents = Files.readAllLines(Paths.get("target/logfile.xml")).stream() .collect(Collectors.joining(System.lineSeparator())) .split("\\n\\n+"); - assertTrue(logEvents.length == count); + assertTrue(logEvents.length == 39); } } diff --git a/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml b/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml index 059007f660..9de1a29186 100644 --- a/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml +++ b/log4j2/src/test/resources/log4j2-rolling-file-appender_xml-layout.xml @@ -6,7 +6,7 @@ filePattern="target/logfile-%d{yyyy-MM-dd}-%i.log.gz"> - + From d1ea5e8394d9296228e1276334b0febda8b060ff Mon Sep 17 00:00:00 2001 From: Ante Pocedulic Date: Wed, 9 Nov 2016 08:00:50 +0100 Subject: [PATCH 084/115] - added new camel example (#812) - added new camel context for junit test --- .../baeldung/camel/file/FileProcessor.java | 20 ++++++ .../com/baeldung/camel/file/FileRouter.java | 15 ++++ .../src/main/resources/camel-context-test.xml | 14 ++++ .../src/main/resources/camel-context.xml | 48 ++++++------- .../file/processor/FileProcessorTest.java | 68 +++++++++++++++++++ 5 files changed, 141 insertions(+), 24 deletions(-) create mode 100644 spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java create mode 100644 spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java create mode 100644 spring-apache-camel/src/main/resources/camel-context-test.xml create mode 100644 spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorTest.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java b/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java new file mode 100644 index 0000000000..1ea2cad188 --- /dev/null +++ b/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java @@ -0,0 +1,20 @@ +package com.baeldung.camel.file; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; + +public class FileProcessor implements Processor { + + public void process(Exchange exchange) throws Exception { + String originalFileName = (String) exchange.getIn().getHeader(Exchange.FILE_NAME, String.class); + + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); + String changedFileName = dateFormat.format(date) + originalFileName; + exchange.getIn().setHeader(Exchange.FILE_NAME, changedFileName); + } + +} diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java b/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java new file mode 100644 index 0000000000..5216c9a595 --- /dev/null +++ b/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java @@ -0,0 +1,15 @@ +package com.baeldung.camel.file; + +import org.apache.camel.builder.RouteBuilder; + +public class FileRouter extends RouteBuilder { + + private static final String SOURCE_FOLDER = "src/test/source-folder"; + private static final String DESTINATION_FOLDER = "src/test/destination-folder"; + + @Override + public void configure() throws Exception { + from("file://" + SOURCE_FOLDER + "?delete=true").process(new FileProcessor()).to("file://" + DESTINATION_FOLDER); + } + +} diff --git a/spring-apache-camel/src/main/resources/camel-context-test.xml b/spring-apache-camel/src/main/resources/camel-context-test.xml new file mode 100644 index 0000000000..e6435db9e5 --- /dev/null +++ b/spring-apache-camel/src/main/resources/camel-context-test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/spring-apache-camel/src/main/resources/camel-context.xml b/spring-apache-camel/src/main/resources/camel-context.xml index 0c10e0ecef..63ef406fdf 100644 --- a/spring-apache-camel/src/main/resources/camel-context.xml +++ b/spring-apache-camel/src/main/resources/camel-context.xml @@ -1,39 +1,39 @@ - + - + - - + + - - + + - - + + - - - ${body.toLowerCase()} - + + + ${body.toLowerCase()} + - - + + - - - .......... File content conversion completed .......... - - + + + .......... File content conversion completed .......... + + - + - + - + \ No newline at end of file diff --git a/spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorTest.java b/spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorTest.java new file mode 100644 index 0000000000..3d63f614e0 --- /dev/null +++ b/spring-apache-camel/src/test/java/org/apache/camel/file/processor/FileProcessorTest.java @@ -0,0 +1,68 @@ +package org.apache.camel.file.processor; + +import java.io.File; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.DefaultCamelContext; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.camel.file.FileProcessor; + + +public class FileProcessorTest { + + private static final long DURATION_MILIS = 10000; + private static final String SOURCE_FOLDER = "src/test/source-folder"; + private static final String DESTINATION_FOLDER = "src/test/destination-folder"; + + @Before + public void setUp() throws Exception { + File sourceFolder = new File(SOURCE_FOLDER); + File destinationFolder = new File(DESTINATION_FOLDER); + + cleanFolder(sourceFolder); + cleanFolder(destinationFolder); + + sourceFolder.mkdirs(); + File file1 = new File(SOURCE_FOLDER + "/File1.txt"); + File file2 = new File(SOURCE_FOLDER + "/File2.txt"); + file1.createNewFile(); + file2.createNewFile(); + } + + private void cleanFolder(File folder) { + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + file.delete(); + } + } + } + } + + @Test + public void moveFolderContentJavaDSLTest() throws Exception { + final CamelContext camelContext = new DefaultCamelContext(); + camelContext.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("file://" + SOURCE_FOLDER + "?delete=true").process(new FileProcessor()).to("file://" + DESTINATION_FOLDER); + } + }); + camelContext.start(); + Thread.sleep(DURATION_MILIS); + camelContext.stop(); + } + + @Test + public void moveFolderContentSpringDSLTest() throws InterruptedException { + ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("camel-context-test.xml"); + Thread.sleep(DURATION_MILIS); + applicationContext.close(); + + } +} \ No newline at end of file From c50338720f553c29fc5ceaae248474bb9e991969 Mon Sep 17 00:00:00 2001 From: mujah Date: Wed, 9 Nov 2016 18:28:01 +0800 Subject: [PATCH 085/115] test cases and model fixes --- .../spring/data/solr/model/Product.java | 22 +++-- .../ProductRepositoryIntegrationTest.java | 92 ++++++++++++------- 2 files changed, 73 insertions(+), 41 deletions(-) diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java index d08640123a..54962b7e51 100644 --- a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java +++ b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java @@ -1,31 +1,33 @@ package com.baeldung.spring.data.solr.model; -import org.apache.solr.client.solrj.beans.Field; import org.springframework.data.annotation.Id; +import org.springframework.data.solr.core.mapping.Indexed; import org.springframework.data.solr.core.mapping.SolrDocument; @SolrDocument(solrCoreName = "product") public class Product { @Id - @Field("id") + @Indexed(name="id",type = "string") private String id; - @Field("name") + + @Indexed(name="name",type = "string") private String name; - @Field("category") + + @Indexed(name="category",type = "string") private String category; - @Field("description") + + @Indexed(name="description",type = "string") private String description; - - public Product(String id, String name, String category) { - this.id = id; - this.name = name; - this.category = category; + + public Product(){ + } + public String getId() { return id; } diff --git a/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java b/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java index b55e65e04a..74d94ef91c 100644 --- a/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java +++ b/spring-data-solr/src/test/java/com/baeldung/spring/data/solr/repo/ProductRepositoryIntegrationTest.java @@ -21,94 +21,124 @@ import com.baeldung.spring.data.solr.repository.ProductRepository; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SolrConfig.class) public class ProductRepositoryIntegrationTest { - + @Autowired private ProductRepository productRepository; - + @Before public void clearSolrData() { productRepository.deleteAll(); } - + @Test public void whenSavingProduct_thenAvailableOnRetrieval() throws Exception { - final Product product = new Product("P00001", "Desk", "Furniture"); + final Product product = new Product(); + product.setId("P000089998"); + product.setName("Desk"); + product.setCategory("Furniture"); product.setDescription("New Desk"); productRepository.save(product); final Product retrievedProduct = productRepository.findOne(product.getId()); assertEquals(product.getId(), retrievedProduct.getId()); } - + @Test public void whenUpdatingProduct_thenChangeAvailableOnRetrieval() throws Exception { - final Product product = new Product("P0001", "T-Shirt", "Kitchen"); + final Product product = new Product(); + product.setId("P0001"); + product.setName("T-Shirt"); + product.setCategory("Kitchen"); product.setDescription("New T-Shirt"); productRepository.save(product); - + product.setCategory("Clothes"); productRepository.save(product); - + final Product retrievedProduct = productRepository.findOne(product.getId()); assertEquals(product.getCategory(), retrievedProduct.getCategory()); } - + @Test public void whenDeletingProduct_thenNotAvailableOnRetrieval() throws Exception { - final Product product = new Product("P0001", "Desk", "Furniture"); + final Product product = new Product(); + product.setId("P0001"); + product.setName("Desk"); + product.setCategory("Furniture"); product.setDescription("New Desk"); productRepository.save(product); - + productRepository.delete(product); - + Product retrievedProduct = productRepository.findOne(product.getId()); assertNull(retrievedProduct); - + } - + @Test public void whenFindByName_thenAvailableOnRetrieval() throws Exception { - Product phone = new Product("P0001", "Phone", "Electronics"); + Product phone = new Product(); + phone.setId("P0001"); + phone.setName("Phone"); + phone.setCategory("Electronics"); phone.setDescription("New Phone"); productRepository.save(phone); - + List retrievedProducts = productRepository.findByName("Phone"); assertEquals(phone.getId(), retrievedProducts.get(0).getId()); } - + @Test public void whenSearchingProductsByQuery_thenAllMatchingProductsShouldAvialble() throws Exception { - final Product phone = new Product("P0001", "Smart Phone", "Electronics"); + final Product phone = new Product(); + phone.setId("P0001"); + phone.setName("Smart Phone"); + phone.setCategory("Electronics"); phone.setDescription("New Item"); productRepository.save(phone); - - final Product phoneCover = new Product("P0002", "Cover", "Phone"); + + final Product phoneCover = new Product(); + phoneCover.setId("P0002"); + phoneCover.setName("Cover"); + phoneCover.setCategory("Phone"); phoneCover.setDescription("New Product"); productRepository.save(phoneCover); - - final Product wirelessCharger = new Product("P0003", "Charging Cable", "Cable"); + + final Product wirelessCharger = new Product(); + wirelessCharger.setId("P0003"); + wirelessCharger.setName("Charging Cable"); + wirelessCharger.setCategory("Cable"); wirelessCharger.setDescription("Wireless Charger for Phone"); productRepository.save(wirelessCharger); - + Page result = productRepository.findByCustomQuery("Phone", new PageRequest(0, 10)); assertEquals(3, result.getNumberOfElements()); } - + @Test public void whenSearchingProductsByNamedQuery_thenAllMatchingProductsShouldAvialble() throws Exception { - final Product phone = new Product("P0001", "Smart Phone", "Electronics"); + final Product phone = new Product(); + phone.setId("P0001"); + phone.setName("Smart Phone"); + phone.setCategory("Electronics"); phone.setDescription("New Item"); productRepository.save(phone); - - final Product phoneCover = new Product("P0002", "Cover", "Phone"); + + final Product phoneCover = new Product(); + phoneCover.setId("P0002"); + phoneCover.setName("Cover"); + phoneCover.setCategory("Phone"); phoneCover.setDescription("New Product"); productRepository.save(phoneCover); - - final Product wirelessCharger = new Product("P0003", "Charging Cable", "Cable"); + + final Product wirelessCharger = new Product(); + wirelessCharger.setId("P0003"); + wirelessCharger.setName("Charging Cable"); + wirelessCharger.setCategory("Cable"); wirelessCharger.setDescription("Wireless Charger for Phone"); productRepository.save(wirelessCharger); - + Page result = productRepository.findByNamedQuery("one", new PageRequest(0, 10)); assertEquals(3, result.getNumberOfElements()); } - + } From 2ab1eeb036e0d5344eef5751c2602927a2040c93 Mon Sep 17 00:00:00 2001 From: mujah Date: Wed, 9 Nov 2016 18:36:32 +0800 Subject: [PATCH 086/115] refactoring model --- .../spring/data/solr/model/Product.java | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java index 54962b7e51..7cd0890718 100644 --- a/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java +++ b/spring-data-solr/src/main/java/com/baeldung/spring/data/solr/model/Product.java @@ -6,58 +6,50 @@ import org.springframework.data.solr.core.mapping.SolrDocument; @SolrDocument(solrCoreName = "product") public class Product { - + @Id - @Indexed(name="id",type = "string") + @Indexed(name = "id", type = "string") private String id; - - @Indexed(name="name",type = "string") + @Indexed(name = "name", type = "string") private String name; - - @Indexed(name="category",type = "string") + @Indexed(name = "category", type = "string") private String category; - - @Indexed(name="description",type = "string") + @Indexed(name = "description", type = "string") private String description; - public Product(){ - - } - - public String getId() { return id; } - + public void setId(String id) { this.id = id; } - + public String getName() { return name; } - + public void setName(String name) { this.name = name; } - + public String getCategory() { return category; } - + public void setCategory(String category) { this.category = category; } - + public String getDescription() { return description; } - + public void setDescription(String description) { this.description = description; } - + } From f966f277c026dd53c32aa96e738b82cdb30330aa Mon Sep 17 00:00:00 2001 From: mujah Date: Wed, 9 Nov 2016 22:10:30 +0800 Subject: [PATCH 087/115] removed solr --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 182b2d5147..95182ab63c 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,6 @@ spring-data-mongodb spring-data-redis spring-data-rest - spring-data-solr spring-exceptions spring-freemarker From 6d1fbd5603b8215f06d9f85c2eaff626aa82264c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Wed, 9 Nov 2016 15:21:23 +0100 Subject: [PATCH 088/115] BAEL-41: Fixed small formatting issues. --- .../logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java | 1 - .../java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java | 1 - 2 files changed, 2 deletions(-) diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java index 72d32d76fb..0653394e5a 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/FailoverSyslogConsoleAppenderTest.java @@ -9,7 +9,6 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class FailoverSyslogConsoleAppenderTest { - @Rule public LoggerContextRule contextRule = new LoggerContextRule("log4j2-failover-syslog-console-appender_pattern-layout.xml"); diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java index 2ceda2083b..1b8d33e2bf 100644 --- a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java +++ b/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JDBCAppenderTest.java @@ -16,7 +16,6 @@ import static org.junit.Assert.assertTrue; @RunWith(JUnit4.class) public class JDBCAppenderTest { - @Rule public LoggerContextRule contextRule = new LoggerContextRule("log4j2-jdbc-appender.xml"); From 1f0e30b81ca7f87c7f0674ba5bdb83bdff0ba982 Mon Sep 17 00:00:00 2001 From: mujah Date: Wed, 9 Nov 2016 22:26:18 +0800 Subject: [PATCH 089/115] pom changes + merge upstream --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 857922310f..bd626b3ad0 100644 --- a/pom.xml +++ b/pom.xml @@ -95,6 +95,7 @@ spring-data-neo4j spring-data-redis spring-data-rest + spring-data-solr spring-dispatcher-servlet spring-exceptions spring-freemarker From 6708feb70c6f0cb39532b19ae94fec5d81e81868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Wed, 9 Nov 2016 08:52:45 +0100 Subject: [PATCH 090/115] BAEL-86: Added diagram picture and sources. --- .../src/main/resources/README.md | 3 + .../src/main/resources/diagram.graphml | 372 ++++++++++++++++++ .../src/main/resources/diagram.png | Bin 0 -> 60385 bytes 3 files changed, 375 insertions(+) create mode 100644 spring-dispatcher-servlet/src/main/resources/README.md create mode 100644 spring-dispatcher-servlet/src/main/resources/diagram.graphml create mode 100644 spring-dispatcher-servlet/src/main/resources/diagram.png diff --git a/spring-dispatcher-servlet/src/main/resources/README.md b/spring-dispatcher-servlet/src/main/resources/README.md new file mode 100644 index 0000000000..7c97e75a2c --- /dev/null +++ b/spring-dispatcher-servlet/src/main/resources/README.md @@ -0,0 +1,3 @@ +## Info ## + +- The diagram is created with [yed](http://www.yworks.com/products/yed) diff --git a/spring-dispatcher-servlet/src/main/resources/diagram.graphml b/spring-dispatcher-servlet/src/main/resources/diagram.graphml new file mode 100644 index 0000000000..1806ab7719 --- /dev/null +++ b/spring-dispatcher-servlet/src/main/resources/diagram.graphml @@ -0,0 +1,372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Servlet Engine (e.g. Tomcat) + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + Controller + + + + + + + + + + + + + + + + + + + Model + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Model + + + + + + + + + + + + + + + + + + + + DispatcherServlet + + + + + + + + + + + + + + + + + + + View Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Return Control + + + + + + + + + + + + Render Response + + + + + + + + + + + + Delegate Request + + + + + + + + + + + + Delegate Rendering of Response + + + + + + + + + + + + + + + + + + + + + + + + + Incoming Request + + + + + + + + + + + + Return Response + + + + + + + + + + + + + + Handle Request + + + + + + + + + + + + + + Create Model + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> +<g> + + <radialGradient id="neck_x5F_white_1_" cx="28.0298" cy="-751.9429" r="11.4464" fx="25.7969" fy="-753.1596" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#B38E5D"/> + <stop offset="1" style="stop-color:#805126"/> + </radialGradient> + <path id="neck_x5F_white_2_" fill="url(#neck_x5F_white_1_)" stroke="#5B453B" stroke-miterlimit="10" d="M19.278,37.799h18.188 + v13.23c-1.313,0.371-17.173,0.436-18.188,0.172V37.799z"/> + + <radialGradient id="SVGID_1_" cx="27.481" cy="-760.3003" r="31.0533" fx="21.4231" fy="-763.6011" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#B38E5D"/> + <stop offset="1" style="stop-color:#805126"/> + </radialGradient> + <path fill="url(#SVGID_1_)" stroke="#5B453B" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="face_x5F_white_1_" cx="27.7827" cy="-732.2632" r="23.424" fx="23.2131" fy="-734.753" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#B38E5D"/> + <stop offset="1" style="stop-color:#805126"/> + </radialGradient> + <path id="face_x5F_white_2_" fill="url(#face_x5F_white_1_)" stroke="#5B453B" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.199-6.738,18.52-15.246,18.586c-8.503,0.068-15.467-8.146-15.553-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="2941.4297" y1="5674.7988" x2="2965.0596" y2="5768.2505" gradientTransform="matrix(0.275 0 0 0.2733 -783.3976 -1542.678)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.42"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.12"/> + </linearGradient> + <path id="face_highlight_2_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.183-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="path9833_2_" fill="#4B4B4B" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 + C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 + c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 + s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.654,22.781 + c15.665-0.703,12.289-10.48,9.658-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> + + <radialGradient id="collar_x5F_body_2_" cx="15.1587" cy="-763.7056" r="32.4004" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#B0E8FF"/> + <stop offset="1" style="stop-color:#74AEEE"/> + </radialGradient> + <path id="collar_x5F_body_1_" fill="url(#collar_x5F_body_2_)" stroke="#5491CF" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494 + h48.51c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,2.802-10.063,2.802c-4.453,0-8.292-1.146-10.063-2.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + + <radialGradient id="collar_x5F_r_2_" cx="31.5" cy="-753.832" r="9.2834" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#80CCFF"/> + <stop offset="1" style="stop-color:#74AEEE"/> + </radialGradient> + <path id="collar_x5F_r_1_" fill="url(#collar_x5F_r_2_)" stroke="#5491CF" d="M38.159,41.381c0,0-0.574,2.369-3.013,4.441 + c-2.108,1.795-5.783,2.072-5.783,2.072l3.974,6.217c0,0,2.957-1.637,5.009-3.848c1.922-2.072,1.37-5.479,1.37-5.479L38.159,41.381z + "/> + + <radialGradient id="collar_x5F_l_2_" cx="19.1377" cy="-753.873" r="9.2837" gradientTransform="matrix(1 0 0 -1 0.1201 -706.5371)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#80CCFF"/> + <stop offset="1" style="stop-color:#74AEEE"/> + </radialGradient> + <path id="collar_x5F_l_1_" fill="url(#collar_x5F_l_2_)" stroke="#5491CF" d="M18.63,41.422c0,0,0.576,2.369,3.012,4.441 + c2.109,1.793,5.785,2.072,5.785,2.072l-3.974,6.217c0,0-2.957-1.637-5.007-3.85c-1.922-2.072-1.37-5.48-1.37-5.48L18.63,41.422z"/> + + <radialGradient id="Knob2_2_" cx="27.8872" cy="9.9414" r="0.9669" gradientTransform="matrix(1 0 0 -1 0.04 66.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#80CCFF"/> + <stop offset="1" style="stop-color:#74AEEE"/> + </radialGradient> + <circle id="Knob2_1_" fill="url(#Knob2_2_)" stroke="#5491CF" cx="28.258" cy="56.254" r="0.584"/> + + <radialGradient id="Knob1_2_" cx="27.9253" cy="3.6973" r="0.9669" gradientTransform="matrix(1 0 0 -1 0.04 66.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#80CCFF"/> + <stop offset="1" style="stop-color:#74AEEE"/> + </radialGradient> + <circle id="Knob1_1_" fill="url(#Knob1_2_)" stroke="#5491CF" cx="28.296" cy="62.499" r="0.584"/> +</g> +</svg> + + + + diff --git a/spring-dispatcher-servlet/src/main/resources/diagram.png b/spring-dispatcher-servlet/src/main/resources/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c545d680d344da47592a4180b9061fd1615a59 GIT binary patch literal 60385 zcmc$`cRbZ^{65|=j+G-TBb;PruSm$T_XtU{$|fs&6-U|Gglrj+5rvG%sAPo*nb}*} z>-#*7_viD+@A3FO9^Zey{nO&S?$>=k$Mw9f>lUJ^u0TRaOL*eM2@)kmS?v=ia7s^{ zIAw`A1^U2;=u_eS!o@Qp`|)^eVuQ~t5W_4E1#cLyMGaL>HPd`zE>h5pS{>^ z*nUBz!v0FD9vx*%aB)@!`#CKg3OPAG<^aL~vrhKVtR%|e2ZUJ{XfksY10JZ4Z^sL- zSl-g5(AC7HtWSUZIB&4>TftYO)xACg?>hhWG$a~vLS~If~l?QBBeDD*bYRO8<4;BiT^&{PN6Y^N3S~q+j zzR*bslPKh(5N~O4%=22NxFy)CUWO4D?o(eUpuLmF?l4kdB!1X7KXv3h)4Z-OV|X6_ zlYi-&yI^Yp7rlrdd&2SCu-H!!%VJ^deCb2%bcboiu zN(2jL@7^;cdeG=1W(|)G6V*DQ=2X@&e36+j^Vb1!eP?BF;3i4yy@ng{|^Gdo&eORLObtUgob@#_N9$>tFE zl@aR$8BT8Q@7vK*$Gcr5WKC}z#_;g)(yn@zGaP$wEq&t^?#YzFpL({R#DAye{(P1W zXG*DJt@rl5zI-iqJY8K~3xmS0bg5(W<#0xa(8k+|)p4HNf}qh8vIpN!+j=pf6h)27aLUC47_~y>ebKpk4bf3TRS*NIZZYz zJYi6KDlolR((t;htWkb+;6D0j?LDc4*DuYRQha>KxAngJuZ__8hkSmAn>Qlf@D=akUH9#x?$`)y|VIhN?s=NumIo@tk!psBVecf>X8A5olG?(>wURYQCq z8Cm<<976665A)izN&WC<%x`~VT15$A8d5dnc(wN4SiP^NW_N{k@0!8AsVI4_MukB1 znV`kKg6m;a+$-PTvW@yeh>SK7@EBGhy&Fv{?1#5f9O}uu3lwfr=DoW2{mSn&c!b=b zL8F5=5h(ozKZ&8_XX5ViZ$&sblzgXu{P4CiwY3$8 zv{;|*e{rMiR5;oIHuWUFamumP)v+tvS^KyJ@RVDPSZNYckfqpJ@TZJlN0R|g|_n0Nqi?)H@D{y5eRJN5OZO&>LhLY*ejgmEQ3Co zXc-$Db2T_mhZ;t8S1ANCblj{)Zb9(9mZ+(&HpR8})zHv5xH;S$LW`@^_MR^oS;#yV zq$wQl^!oN&x5M=|#ui&fM#jyaQqeIlL}o(WoS*c<-J^ru!M??T65;ycwe$1d(&20v zQMJso4 zJ5nx}`RVAyS>fC<=jAOK()-G;c!lASG{zC?GPRVPA0Mr5u|~S2)WKSyhlJ~bPEkgT zd=nFzeJpH+I!E2m&~VMTl7#NwPUNpTrdIMMqdG6wg+3+oOk}ON`^p?UM$odeIem9` z*Wkd9u1o$Tm6D2zRu|#gz~nkP zKOdq-NkL)d^JYT)%XYvy4TS&ReBKadZEJb>(b=Y=BCdRs6cKy9VguKMopq?xvI+{9 zH4$&`&kK00nP69f_!7f-9ovIWphck+K0J-D`~*$V9QWw0+wxg|NEl7u2dP(F2~9mb zsysC9f6etY5pSM__�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 literal 0 HcmV?d00001 From 997b3cabbe8b51f63fb47303faf96d45c52ee6a0 Mon Sep 17 00:00:00 2001 From: James Kerak Date: Thu, 10 Nov 2016 09:02:46 -0500 Subject: [PATCH 091/115] changing anonymous subclass to lambda --- .../org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java index d1cc67b99a..2c88408017 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java @@ -56,13 +56,10 @@ public class OkHttpFileUploadingLiveTest { .build(); - ProgressRequestWrapper.ProgressListener listener = new ProgressRequestWrapper.ProgressListener() { + ProgressRequestWrapper.ProgressListener listener = (bytesWritten, contentLength) -> { - public void onRequestProgress(long bytesWritten, long contentLength) { - - float percentage = 100f * bytesWritten / contentLength; - assertFalse(Float.compare(percentage, 100) > 0); - } + float percentage = 100f * bytesWritten / contentLength; + assertFalse(Float.compare(percentage, 100) > 0); }; ProgressRequestWrapper countingBody = new ProgressRequestWrapper(requestBody, listener); From 9703ea7f1a295bda11d5387d60c5205f2d9c33d6 Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Thu, 10 Nov 2016 16:11:53 +0100 Subject: [PATCH 092/115] Add BAEL-396 (Netflix Ribbon intro) to README.md --- spring-cloud/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud/README.md b/spring-cloud/README.md index 3e8cd21b82..60acdaeed5 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -14,5 +14,6 @@ - [Intro to Spring Cloud Netflix - Hystrix](http://www.baeldung.com/spring-cloud-netflix-hystrix) - [Dockerizing a Spring Boot Application](http://www.baeldung.com/dockerizing-spring-boot-application) +- [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) From 3d5227adbbc95b3b880df6c32092971b688daafd Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Thu, 10 Nov 2016 16:13:42 +0100 Subject: [PATCH 093/115] Added BAEL-387 --- core-java/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java/README.md b/core-java/README.md index 48f0677461..49317bf369 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -35,4 +35,5 @@ - [Java 8 Streams Advanced](http://www.baeldung.com/java-8-streams) - [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava) - [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction) -- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) \ No newline at end of file +- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) +- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) From 63a47897f34130a107cb07719363e5542055b1f6 Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Thu, 10 Nov 2016 16:16:12 +0100 Subject: [PATCH 094/115] Added Java 9 New Features --- core-java-9/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-9/README.md b/core-java-9/README.md index b5d4dbef95..78f235046f 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -2,4 +2,4 @@ ## Core Java 9 Examples -http://inprogress.baeldung.com/java-9-new-features/ \ No newline at end of file +(Java 9 New Features)[http://www.baeldung.com/new-java-9] From b384c48bd384aeecbd4610b967d7f0e8c61084df Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Thu, 10 Nov 2016 16:16:48 +0100 Subject: [PATCH 095/115] Fix link --- core-java-9/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-9/README.md b/core-java-9/README.md index 78f235046f..fbe5f908aa 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -2,4 +2,4 @@ ## Core Java 9 Examples -(Java 9 New Features)[http://www.baeldung.com/new-java-9] +[Java 9 New Features](http://www.baeldung.com/new-java-9) From ec132346c7322de25e3a93882070b49d0a46e575 Mon Sep 17 00:00:00 2001 From: Nancy Bosecker Date: Thu, 10 Nov 2016 18:50:16 -0800 Subject: [PATCH 096/115] fixed imports for sslcontext for apache 4.4 (#815) The new test passes, and the maven build succeeded. --- .../java/org/baeldung/httpclient/HttpsClientSslLiveTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java index fb272b0a33..e9a16f18ad 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java @@ -19,8 +19,6 @@ import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLContextBuilder; -import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.conn.ssl.TrustStrategy; @@ -29,6 +27,8 @@ import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingClientConnectionManager; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.SSLContexts; import org.junit.Test; /** From fcd6ff2891917e3b2cf4c49ae9a5e84ba4a798f2 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 11 Nov 2016 09:03:53 +0530 Subject: [PATCH 097/115] Making changes in Maven Profile for Test Case Failure --- selenium-junit-testng/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selenium-junit-testng/pom.xml b/selenium-junit-testng/pom.xml index cc96ea8529..754bf679b5 100644 --- a/selenium-junit-testng/pom.xml +++ b/selenium-junit-testng/pom.xml @@ -25,6 +25,7 @@ **/*UnitTest.java + false @@ -42,6 +43,7 @@ **/*LiveTest.java + false From 3daf23ae222b796fc9a2f3d1526d2bd831869188 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 11 Nov 2016 15:02:37 +0100 Subject: [PATCH 098/115] Refactor OkHttp examples --- .../org/baeldung/okhttp/OkHttpGetLiveTest.java | 3 +-- .../org/baeldung/okhttp/OkHttpMiscLiveTest.java | 15 +++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java index 9bf57c41b2..3f773bf35e 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java @@ -60,9 +60,8 @@ public class OkHttpGetLiveTest { Call call = client.newCall(request); call.enqueue(new Callback() { - public void onResponse(Call call, Response response) throws IOException { - assertThat(response.code(), equalTo(200)); + System.out.println("OK"); } public void onFailure(Call call, IOException e) { diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java index dcdb4e328c..9c38c8da51 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java @@ -1,21 +1,16 @@ package org.baeldung.okhttp; +import okhttp3.*; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.File; import java.io.IOException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import okhttp3.Cache; -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - public class OkHttpMiscLiveTest { private static final String BASE_URL = "http://localhost:8080/spring-rest"; From 584ae4167f43d10e2552676728e6b3111dd45447 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Fri, 11 Nov 2016 18:59:49 +0100 Subject: [PATCH 099/115] Refactor HttpsClientSSLLiveTest --- .../httpclient/HttpsClientSslLiveTest.java | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java index e9a16f18ad..278cdb3556 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java @@ -1,27 +1,11 @@ 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 java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLException; - 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.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.conn.ssl.*; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClientBuilder; @@ -31,6 +15,14 @@ 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 @@ -101,17 +93,9 @@ public class HttpsClientSslLiveTest { } @Test - public final void givenIgnoringCertificates_whenHttpsUrlIsConsumed_thenCorrect() throws IOException { - - final TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true; - - SSLContext sslContext = null; - try { - sslContext = new SSLContextBuilder().loadTrustMaterial(null, acceptingTrustStrategy).build(); - - } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) { - e.printStackTrace(); - } + public final void givenIgnoringCertificates_whenHttpsUrlIsConsumed_thenCorrect() throws Exception { + SSLContext sslContext = new SSLContextBuilder() + .loadTrustMaterial(null, (certificate, authType) -> true).build(); final CloseableHttpClient client = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); final HttpGet httpGet = new HttpGet(HOST_WITH_SSL); From c30bd6caa75287552bfb424d07ac717c90c9ca13 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Sat, 12 Nov 2016 13:42:01 +0530 Subject: [PATCH 100/115] BAEL-29 Refactored Code to comeup with Unit Test --- .../java/conversion/StringConversion.java | 60 ---------- .../java/conversion/StringConversionTest.java | 104 ++++++++++++++++++ 2 files changed, 104 insertions(+), 60 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java create mode 100644 core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java diff --git a/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java b/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java deleted file mode 100644 index 0a0f79566e..0000000000 --- a/core-java/src/main/java/com/baeldung/java/conversion/StringConversion.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.java.conversion; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.util.Date; - -import com.baeldung.datetime.UseLocalDateTime; - -public class StringConversion { - - public static int getInt(String str) { - return Integer.parseInt(str); - } - - public static int getInteger(String str) { - return Integer.valueOf(str); - } - - public static long getLongPrimitive(String str) { - return Long.parseLong(str); - } - - public static Long getLong(String str) { - return Long.valueOf(str); - } - - public static double getDouble(String str) { - return Double.parseDouble(str); - } - - public static double getDoublePrimitive(String str) { - return Double.valueOf(str); - } - - public static byte[] getByteArray(String str) { - return str.getBytes(); - } - - public static char[] getCharArray(String str) { - return str.toCharArray(); - } - - public static boolean getBooleanPrimitive(String str) { - return Boolean.parseBoolean(str); - } - - public static boolean getBoolean(String str) { - return Boolean.valueOf(str); - } - - public static Date getJava6Date(String str, String format) throws ParseException { - SimpleDateFormat formatter = new SimpleDateFormat(format); - return formatter.parse(str); - } - - public static LocalDateTime getJava8Date(String str) throws ParseException { - return new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); - } -} diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java new file mode 100644 index 0000000000..731f9a2a6e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java @@ -0,0 +1,104 @@ +package com.baeldung.java.conversion; + +import static org.junit.Assert.assertEquals; + +import java.io.UnsupportedEncodingException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.Month; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.junit.Test; + +import com.baeldung.datetime.UseLocalDateTime; + +public class StringConversionTest { + + @Test + public void givenString_whenConvertedToint_thenCorrect() { + String str = "1"; + assertEquals(Integer.parseInt(str), 1); + } + + @Test + public void givenString_whenConvertedToInteger_thenCorrect() { + String str = "12"; + Integer number = Integer.valueOf(str); + assertEquals(number.intValue(), 12); + } + + @Test + public void givenString_whenConvertedTolong_thenCorrect() { + String str = "12345"; + assertEquals(Long.parseLong(str), 12345); + } + + @Test + public void givenString_whenConvertedToLong_thenCorrect() { + String str = "14567"; + Long number = Long.valueOf(str); + assertEquals(number.longValue(), 14567); + } + + @Test + public void givenString_whenConvertedTodouble_thenCorrect() { + String str = "1.4"; + assertEquals(Double.parseDouble(str), 1.4, 0.0); + } + + @Test + public void givenString_whenConvertedToDouble_thenCorrect() { + String str = "145.67"; + Double number = Double.valueOf(str); + assertEquals(number.doubleValue(), 145.67, 0.0); + } + + @Test + public void givenString_whenConvertedToByteArray_thenCorrect() throws UnsupportedEncodingException { + byte[] byteArray1 = new byte[] { 'a', 'b', 'c' }; + String str = new String(byteArray1, "UTF-8"); + assertEquals(Arrays.equals(str.getBytes(), byteArray1), true); + } + + @Test + public void givenString_whenConvertedToboolean_thenCorrect() { + String str = "true"; + assertEquals(Boolean.parseBoolean(str), true); + } + + @Test + public void givenString_whenConvertedToBoolean_thenCorrect() { + String str = "true"; + assertEquals(Boolean.valueOf(str), true); + } + + @Test + public void givenString_whenConvertedToCharArray_thenCorrect() { + String str = "hello"; + char[] charArray = { 'h', 'e', 'l', 'l', 'o' }; + assertEquals(Arrays.equals(charArray, str.toCharArray()), true); + } + + @Test + public void givenString_whenConvertedToJava6Date_thenCorrect() throws ParseException { + String str = "15/10/2013"; + SimpleDateFormat formatter = new SimpleDateFormat("dd/M/yyyy"); + Date date1 = formatter.parse(str); + Calendar calendar = new GregorianCalendar(2013, 9, 15); + Date date2 = calendar.getTime(); + assertEquals(date1.compareTo(date2), 0); + } + + @Test + public void givenString_whenConvertedToJava8Date_thenCorrect() throws ParseException { + String str = "2007-12-03T10:15:30"; + LocalDateTime localDateTime = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); + assertEquals(localDateTime.getDayOfMonth(), 3); + assertEquals(localDateTime.getMonth(), Month.DECEMBER); + assertEquals(localDateTime.getYear(), 2007); + } +} From 19eb8bd90d286e5d3337cf520c71d3feebe07cd0 Mon Sep 17 00:00:00 2001 From: "nguyenminhtuanfit@gmail.com" Date: Sat, 12 Nov 2016 15:53:40 +0700 Subject: [PATCH 101/115] An introduction to JAXB --- jaxb/pom.xml | 170 ++++++++++++++++++ .../src/main/java/com/baeldung/jaxb/Book.java | 58 ++++++ .../java/com/baeldung/jaxb/DateAdapter.java | 28 +++ .../src/main/java/com/baeldung/jaxb/Main.java | 39 ++++ jaxb/src/main/resources/global.xjb | 13 ++ jaxb/src/main/resources/logback.xml | 18 ++ jaxb/src/main/resources/user.xsd | 23 +++ 7 files changed, 349 insertions(+) create mode 100644 jaxb/pom.xml create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/Book.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/Main.java create mode 100644 jaxb/src/main/resources/global.xjb create mode 100644 jaxb/src/main/resources/logback.xml create mode 100644 jaxb/src/main/resources/user.xsd diff --git a/jaxb/pom.xml b/jaxb/pom.xml new file mode 100644 index 0000000000..cce40c55d4 --- /dev/null +++ b/jaxb/pom.xml @@ -0,0 +1,170 @@ + + 4.0.0 + com.baeldung + jaxb + 0.0.1-SNAPSHOT + jaxb + + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb.version} + + + + org.glassfish.jaxb + jaxb-core + ${jaxb.version} + + + + + com.sun.istack + istack-commons-runtime + 3.0.2 + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + ch.qos.logback + logback-core + ${logback.version} + + + + + + jaxb + + + src/main/resources + true + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.codehaus.mojo + jaxb2-maven-plugin + [${jaxb2-maven-plugin.version},) + + schemagen + xjc + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + org.codehaus.mojo + jaxb2-maven-plugin + ${jaxb2-maven-plugin.version} + + + xjc + + xjc + + + + + + src/main/resources/global.xjb + + + src/main/resources/user.xsd + + ${basedir}/src/main/java + false + + + + + + + + + + + 2.2.11 + + + 1.7.21 + 1.1.7 + + + 3.5.1 + 2.3 + + + \ No newline at end of file diff --git a/jaxb/src/main/java/com/baeldung/jaxb/Book.java b/jaxb/src/main/java/com/baeldung/jaxb/Book.java new file mode 100644 index 0000000000..8455d3e6df --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/Book.java @@ -0,0 +1,58 @@ +package com.baeldung.jaxb; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; + +@XmlRootElement(name = "book") +@XmlType(propOrder = { "id", "name", "date" }) +public class Book { + private Long id; + private String name; + private String author; + private Date date; + + @XmlAttribute + public void setId(Long id) { + this.id = id; + } + + @XmlElement(name = "title") + public void setName(String name) { + this.name = name; + } + + @XmlTransient + public void setAuthor(String author) { + this.author = author; + } + + public String getName() { + return name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public Long getId() { + return id; + } + + public String getAuthor() { + return author; + } + + @Override + public String toString() { + return "Book [id=" + id + ", name=" + name + ", author=" + author + ", date=" + date + "]"; + } +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java new file mode 100644 index 0000000000..6631525619 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java @@ -0,0 +1,28 @@ +package com.baeldung.jaxb; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.xml.bind.annotation.adapters.XmlAdapter; + +public class DateAdapter extends XmlAdapter { + + private static final ThreadLocal dateFormat = new ThreadLocal() { + + @Override + protected DateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + + @Override + public Date unmarshal(String v) throws Exception { + return dateFormat.get().parse(v); + } + + @Override + public String marshal(Date v) throws Exception { + return dateFormat.get().format(v); + } +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/Main.java b/jaxb/src/main/java/com/baeldung/jaxb/Main.java new file mode 100644 index 0000000000..aaf062dd4e --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/Main.java @@ -0,0 +1,39 @@ +package com.baeldung.jaxb; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Date; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; + +public class Main { + public static void marshal() throws JAXBException, IOException { + Book book = new Book(); + book.setId(1L); + book.setName("Book1"); + book.setAuthor("Author1"); + book.setDate(new Date()); + + JAXBContext context = JAXBContext.newInstance(Book.class); + Marshaller marshaller = context.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + marshaller.marshal(book, new File("./book.xml")); + } + + public static Book unMashal() throws JAXBException, IOException { + JAXBContext context = JAXBContext.newInstance(Book.class); + Unmarshaller unmarshaller = context.createUnmarshaller(); + Book book = (Book) unmarshaller.unmarshal(new FileReader("./book.xml")); + return book; + } + + public static void main(String[] args) throws JAXBException, IOException { + marshal(); + Book book = unMashal(); + System.out.println(book.toString()); + } +} diff --git a/jaxb/src/main/resources/global.xjb b/jaxb/src/main/resources/global.xjb new file mode 100644 index 0000000000..de9dcf1577 --- /dev/null +++ b/jaxb/src/main/resources/global.xjb @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/jaxb/src/main/resources/logback.xml b/jaxb/src/main/resources/logback.xml new file mode 100644 index 0000000000..8b566286b8 --- /dev/null +++ b/jaxb/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n + + + + + + + + + + + + \ No newline at end of file diff --git a/jaxb/src/main/resources/user.xsd b/jaxb/src/main/resources/user.xsd new file mode 100644 index 0000000000..18d2b95d10 --- /dev/null +++ b/jaxb/src/main/resources/user.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 633162a04bc5317dbe949085eae62e337e677320 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Sat, 12 Nov 2016 15:03:07 +0530 Subject: [PATCH 102/115] Refactoring Code - short and simple --- .../java/conversion/StringConversionTest.java | 59 ++++++++----------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java index 731f9a2a6e..60daf21091 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java @@ -19,84 +19,77 @@ import com.baeldung.datetime.UseLocalDateTime; public class StringConversionTest { @Test - public void givenString_whenConvertedToint_thenCorrect() { - String str = "1"; - assertEquals(Integer.parseInt(str), 1); + public void whenConvertedToint_thenCorrect() { + assertEquals(Integer.parseInt("1"), 1); } @Test - public void givenString_whenConvertedToInteger_thenCorrect() { - String str = "12"; - Integer number = Integer.valueOf(str); - assertEquals(number.intValue(), 12); + public void whenConvertedToInteger_thenCorrect() { + assertEquals(Integer.valueOf("12").equals(12), true); } @Test - public void givenString_whenConvertedTolong_thenCorrect() { - String str = "12345"; - assertEquals(Long.parseLong(str), 12345); + public void whenConvertedTolong_thenCorrect() { + assertEquals(Long.parseLong("12345"), 12345); } @Test - public void givenString_whenConvertedToLong_thenCorrect() { - String str = "14567"; - Long number = Long.valueOf(str); - assertEquals(number.longValue(), 14567); + public void whenConvertedToLong_thenCorrect() { + assertEquals(Long.valueOf("14567").equals(14567L), true); } @Test - public void givenString_whenConvertedTodouble_thenCorrect() { - String str = "1.4"; - assertEquals(Double.parseDouble(str), 1.4, 0.0); + public void whenConvertedTodouble_thenCorrect() { + assertEquals(Double.parseDouble("1.4"), 1.4, 0.0); } @Test - public void givenString_whenConvertedToDouble_thenCorrect() { - String str = "145.67"; - Double number = Double.valueOf(str); - assertEquals(number.doubleValue(), 145.67, 0.0); + public void whenConvertedToDouble_thenCorrect() { + assertEquals(Double.valueOf("145.67").equals(145.67d), true); } @Test - public void givenString_whenConvertedToByteArray_thenCorrect() throws UnsupportedEncodingException { + public void whenConvertedToByteArray_thenCorrect() throws UnsupportedEncodingException { byte[] byteArray1 = new byte[] { 'a', 'b', 'c' }; - String str = new String(byteArray1, "UTF-8"); - assertEquals(Arrays.equals(str.getBytes(), byteArray1), true); + String string = new String(byteArray1, "UTF-8"); + + assertEquals(Arrays.equals(string.getBytes(), byteArray1), true); } @Test - public void givenString_whenConvertedToboolean_thenCorrect() { - String str = "true"; - assertEquals(Boolean.parseBoolean(str), true); + public void whenConvertedToboolean_thenCorrect() { + assertEquals(Boolean.parseBoolean("true"), true); } @Test - public void givenString_whenConvertedToBoolean_thenCorrect() { - String str = "true"; - assertEquals(Boolean.valueOf(str), true); + public void whenConvertedToBoolean_thenCorrect() { + assertEquals(Boolean.valueOf("true"), true); } @Test - public void givenString_whenConvertedToCharArray_thenCorrect() { + public void whenConvertedToCharArray_thenCorrect() { String str = "hello"; char[] charArray = { 'h', 'e', 'l', 'l', 'o' }; + assertEquals(Arrays.equals(charArray, str.toCharArray()), true); } @Test - public void givenString_whenConvertedToJava6Date_thenCorrect() throws ParseException { + public void whenConvertedToJava6Date_thenCorrect() throws ParseException { String str = "15/10/2013"; SimpleDateFormat formatter = new SimpleDateFormat("dd/M/yyyy"); Date date1 = formatter.parse(str); Calendar calendar = new GregorianCalendar(2013, 9, 15); Date date2 = calendar.getTime(); + assertEquals(date1.compareTo(date2), 0); } @Test - public void givenString_whenConvertedToJava8Date_thenCorrect() throws ParseException { + public void whenConvertedToJava8Date_thenCorrect() throws ParseException { String str = "2007-12-03T10:15:30"; LocalDateTime localDateTime = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); + assertEquals(localDateTime.getDayOfMonth(), 3); assertEquals(localDateTime.getMonth(), Month.DECEMBER); assertEquals(localDateTime.getYear(), 2007); From b58c2341da2c216cedacab8003797e29f544ea8d Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Sat, 12 Nov 2016 16:01:53 +0530 Subject: [PATCH 103/115] Refactoring Code - Naming corrections --- .../com/baeldung/java/conversion/StringConversionTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java index 60daf21091..d4786f54ac 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java @@ -19,7 +19,7 @@ import com.baeldung.datetime.UseLocalDateTime; public class StringConversionTest { @Test - public void whenConvertedToint_thenCorrect() { + public void whenConvertedToInt_thenCorrect() { assertEquals(Integer.parseInt("1"), 1); } @@ -75,7 +75,7 @@ public class StringConversionTest { } @Test - public void whenConvertedToJava6Date_thenCorrect() throws ParseException { + public void whenConvertedToDate_thenCorrect() throws ParseException { String str = "15/10/2013"; SimpleDateFormat formatter = new SimpleDateFormat("dd/M/yyyy"); Date date1 = formatter.parse(str); @@ -86,7 +86,7 @@ public class StringConversionTest { } @Test - public void whenConvertedToJava8Date_thenCorrect() throws ParseException { + public void whenConvertedToLocalDateTime_thenCorrect() throws ParseException { String str = "2007-12-03T10:15:30"; LocalDateTime localDateTime = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); From 87ed454d64740687ffe96c3b20899a877ee57e73 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Sun, 13 Nov 2016 13:10:28 +0530 Subject: [PATCH 104/115] Added entry for BAEL-29 - Java String Conversions --- core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/README.md b/core-java/README.md index 49317bf369..92f124d14b 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -37,3 +37,4 @@ - [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction) - [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) +- [How to Convert String to different data types in Java](http://www.baeldung.com/java-string-conversions) From aeb8f7595c03f534af4ccaa49ffbc6e7cafd34a5 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sun, 13 Nov 2016 19:09:47 +0200 Subject: [PATCH 105/115] adding new module to the parent --- core-java/0.12457740242410742 | 0 pom.xml | 1 + 2 files changed, 1 insertion(+) delete mode 100644 core-java/0.12457740242410742 diff --git a/core-java/0.12457740242410742 b/core-java/0.12457740242410742 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pom.xml b/pom.xml index bd626b3ad0..9dfb0fdaaf 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,7 @@ junit5 log4j + log-mdc lombok mapstruct From de16f2601193132badb1a4ea2738ff29e125b964 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 11 Nov 2016 09:03:53 +0530 Subject: [PATCH 106/115] Making changes in Maven Profile for Test Case Failure --- selenium-junit-testng/pom.xml | 2 ++ .../src/main/java/com/baeldung/selenium/SeleniumExample.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/selenium-junit-testng/pom.xml b/selenium-junit-testng/pom.xml index cc96ea8529..754bf679b5 100644 --- a/selenium-junit-testng/pom.xml +++ b/selenium-junit-testng/pom.xml @@ -25,6 +25,7 @@ **/*UnitTest.java + false @@ -42,6 +43,7 @@ **/*LiveTest.java + false diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java b/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java index 58d47c0162..dd309cec79 100644 --- a/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java +++ b/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java @@ -56,6 +56,6 @@ public class SeleniumExample { } public boolean isAuthorInformationAvailable() { - return webDriver.findElement(By.xpath("//*[contains(text(), 'Eugen – an engineer')]")).isDisplayed(); + return webDriver.findElement(By.xpath("//*[contains(text(), 'an engineer with a passion for teaching and building stuff on the web')]")).isDisplayed(); } } From 2d34971fcc35dbad2bdbe2bdda586c709a19fa81 Mon Sep 17 00:00:00 2001 From: maibin Date: Mon, 14 Nov 2016 09:45:01 +0100 Subject: [PATCH 107/115] Junit5 (latest two commits) (#825) * PDF to X * PDF to X * Remove created doc * Code fixes and cleanup for PDF module * Fix web.xml in spring-mvc-web-vs-initializer project * Rollback web.xml * Fixes to PDF article * Merge with main eugen branch * Junit 5 * Fix name of test and modifier --- .../com/baeldung/hexToAscii/HexToAscii.java | 46 +++++ .../equalshashcode/entities/ComplexClass.java | 63 ++++++ .../entities/PrimitiveClass.java | 54 +++++ .../equalshashcode/entities/Rectangle.java | 58 ++++++ .../equalshashcode/entities/Shape.java | 7 + .../equalshashcode/entities/Square.java | 58 ++++++ .../executable/ExecutableMavenJar.java | 11 + .../interfaces/NetworkInterfaceTest.java | 122 +++++++++++ .../java/com/baeldung/java/nio2/PathTest.java | 195 ++++++++++++++++++ .../front/controller/filters/AuditFilter.java | 25 +++ .../filters/VisitorCounterFilter.java | 23 +++ enterprise-patterns/pom.xml | 35 ++++ junit5/{REDAME.md => README.md} | 0 junit5/pom.xml | 120 ++++------- .../test/java/com/baeldung/AssertionTest.java | 29 +++ .../java/com/baeldung/AssumptionTest.java | 8 +- .../test/java/com/baeldung/ExceptionTest.java | 30 ++- .../src/test/java/com/baeldung/FirstTest.java | 6 +- .../com/baeldung/JUnit5NewFeaturesTest.java | 50 +++++ .../src/test/java/com/baeldung/LiveTest.java | 38 ++++ .../test/java/com/baeldung/NestedTest.java | 8 +- .../test/java/com/baeldung/StringUtils.java | 11 + .../test/java/com/baeldung/TaggedTest.java | 6 +- .../java/com/baeldung/suites/AllTests.java | 8 + 24 files changed, 914 insertions(+), 97 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java create mode 100644 core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java create mode 100644 core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java create mode 100644 core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java create mode 100644 core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java create mode 100644 core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java create mode 100644 core-java/src/main/java/org/baeldung/executable/ExecutableMavenJar.java create mode 100644 core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceTest.java create mode 100644 core-java/src/test/java/com/baeldung/java/nio2/PathTest.java create mode 100644 enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java create mode 100644 enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java create mode 100644 enterprise-patterns/pom.xml rename junit5/{REDAME.md => README.md} (100%) create mode 100644 junit5/src/test/java/com/baeldung/AssertionTest.java create mode 100644 junit5/src/test/java/com/baeldung/JUnit5NewFeaturesTest.java create mode 100644 junit5/src/test/java/com/baeldung/LiveTest.java create mode 100644 junit5/src/test/java/com/baeldung/StringUtils.java create mode 100644 junit5/src/test/java/com/baeldung/suites/AllTests.java diff --git a/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java b/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java new file mode 100644 index 0000000000..2a3c4b109e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java @@ -0,0 +1,46 @@ +package com.baeldung.hexToAscii; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class HexToAscii { + + @Test + public static void whenHexToAscii() { + String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; + String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; + + assertEquals(asciiString, hexToAscii(hexEquivalent)); + } + + @Test + public static void whenAsciiToHex() { + String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; + String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; + + assertEquals(hexEquivalent, asciiToHex(asciiString)); + } + + // + + private static String asciiToHex(String asciiStr) { + char[] chars = asciiStr.toCharArray(); + StringBuilder hex = new StringBuilder(); + for (char ch : chars) { + hex.append(Integer.toHexString((int) ch)); + } + + return hex.toString(); + } + + private static String hexToAscii(String hexStr) { + StringBuilder output = new StringBuilder(""); + for (int i = 0; i < hexStr.length(); i += 2) { + String str = hexStr.substring(i, i + 2); + output.append((char) Integer.parseInt(str, 16)); + } + return output.toString(); + } + +} diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java new file mode 100644 index 0000000000..6329f41252 --- /dev/null +++ b/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java @@ -0,0 +1,63 @@ +package org.baeldung.equalshashcode.entities; + +import java.util.List; +import java.util.Set; + +public class ComplexClass { + + private List genericList; + private Set integerSet; + + public ComplexClass(List genericArrayList, Set integerHashSet) { + super(); + this.genericList = genericArrayList; + this.integerSet = integerHashSet; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((genericList == null) ? 0 : genericList.hashCode()); + result = prime * result + ((integerSet == null) ? 0 : integerSet.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof ComplexClass)) + return false; + ComplexClass other = (ComplexClass) obj; + if (genericList == null) { + if (other.genericList != null) + return false; + } else if (!genericList.equals(other.genericList)) + return false; + if (integerSet == null) { + if (other.integerSet != null) + return false; + } else if (!integerSet.equals(other.integerSet)) + return false; + return true; + } + + protected List getGenericList() { + return genericList; + } + + protected void setGenericArrayList(List genericList) { + this.genericList = genericList; + } + + protected Set getIntegerSet() { + return integerSet; + } + + protected void setIntegerSet(Set integerSet) { + this.integerSet = integerSet; + } +} diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java new file mode 100644 index 0000000000..ebe005688c --- /dev/null +++ b/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java @@ -0,0 +1,54 @@ +package org.baeldung.equalshashcode.entities; + +public class PrimitiveClass { + + private boolean primitiveBoolean; + private int primitiveInt; + + public PrimitiveClass(boolean primitiveBoolean, int primitiveInt) { + super(); + this.primitiveBoolean = primitiveBoolean; + this.primitiveInt = primitiveInt; + } + + protected boolean isPrimitiveBoolean() { + return primitiveBoolean; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (primitiveBoolean ? 1231 : 1237); + result = prime * result + primitiveInt; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + PrimitiveClass other = (PrimitiveClass) obj; + if (primitiveBoolean != other.primitiveBoolean) + return false; + if (primitiveInt != other.primitiveInt) + return false; + return true; + } + + protected void setPrimitiveBoolean(boolean primitiveBoolean) { + this.primitiveBoolean = primitiveBoolean; + } + + protected int getPrimitiveInt() { + return primitiveInt; + } + + protected void setPrimitiveInt(int primitiveInt) { + this.primitiveInt = primitiveInt; + } +} diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java new file mode 100644 index 0000000000..1e1423f0b3 --- /dev/null +++ b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java @@ -0,0 +1,58 @@ +package org.baeldung.equalshashcode.entities; + +public class Rectangle extends Shape { + private double width; + private double length; + + public Rectangle(double width, double length) { + this.width = width; + this.length = length; + } + + @Override + public double area() { + return width * length; + } + + @Override + public double perimeter() { + return 2 * (width + length); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + long temp; + temp = Double.doubleToLongBits(length); + result = prime * result + (int) (temp ^ (temp >>> 32)); + temp = Double.doubleToLongBits(width); + result = prime * result + (int) (temp ^ (temp >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Rectangle other = (Rectangle) obj; + if (Double.doubleToLongBits(length) != Double.doubleToLongBits(other.length)) + return false; + if (Double.doubleToLongBits(width) != Double.doubleToLongBits(other.width)) + return false; + return true; + } + + protected double getWidth() { + return width; + } + + protected double getLength() { + return length; + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java new file mode 100644 index 0000000000..3bfc81da8f --- /dev/null +++ b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java @@ -0,0 +1,7 @@ +package org.baeldung.equalshashcode.entities; + +public abstract class Shape { + public abstract double area(); + + public abstract double perimeter(); +} diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java new file mode 100644 index 0000000000..f11e34f0ba --- /dev/null +++ b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java @@ -0,0 +1,58 @@ +package org.baeldung.equalshashcode.entities; + +import java.awt.Color; + +public class Square extends Rectangle { + + Color color; + + public Square(double width, Color color) { + super(width, width); + this.color = color; + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((color == null) ? 0 : color.hashCode()); + return result; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (!(obj instanceof Square)) { + return false; + } + Square other = (Square) obj; + if (color == null) { + if (other.color != null) { + return false; + } + } else if (!color.equals(other.color)) { + return false; + } + return true; + } + + protected Color getColor() { + return color; + } + + protected void setColor(Color color) { + this.color = color; + } + +} diff --git a/core-java/src/main/java/org/baeldung/executable/ExecutableMavenJar.java b/core-java/src/main/java/org/baeldung/executable/ExecutableMavenJar.java new file mode 100644 index 0000000000..09344902b7 --- /dev/null +++ b/core-java/src/main/java/org/baeldung/executable/ExecutableMavenJar.java @@ -0,0 +1,11 @@ +package org.baeldung.executable; + +import javax.swing.JOptionPane; + +public class ExecutableMavenJar { + + public static void main(String[] args) { + JOptionPane.showMessageDialog(null, "It worked!", "Executable Jar with Maven", 1); + } + +} diff --git a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceTest.java b/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceTest.java new file mode 100644 index 0000000000..4a8ef57b8f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceTest.java @@ -0,0 +1,122 @@ +package com.baeldung.java.networking.interfaces; + +import static org.junit.Assert.*; + +import java.net.InetAddress; +import java.net.InterfaceAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Enumeration; +import java.util.List; + +import org.junit.Test; + +public class NetworkInterfaceTest { + @Test + public void givenName_whenReturnsNetworkInterface_thenCorrect() throws SocketException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + assertNotNull(nif); + } + + @Test + public void givenInExistentName_whenReturnsNull_thenCorrect() throws SocketException { + NetworkInterface nif = NetworkInterface.getByName("inexistent_name"); + assertNull(nif); + } + + @Test + public void givenIP_whenReturnsNetworkInterface_thenCorrect() throws SocketException, UnknownHostException { + byte[] ip = new byte[] { 127, 0, 0, 1 }; + NetworkInterface nif = NetworkInterface.getByInetAddress(InetAddress.getByAddress(ip)); + assertNotNull(nif); + } + + @Test + public void givenHostName_whenReturnsNetworkInterface_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByInetAddress(InetAddress.getByName("localhost")); + assertNotNull(nif); + } + + @Test + public void givenLocalHost_whenReturnsNetworkInterface_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()); + assertNotNull(nif); + } + + @Test + public void givenLoopBack_whenReturnsNetworkInterface_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByInetAddress(InetAddress.getLoopbackAddress()); + assertNotNull(nif); + } + + @Test + public void givenIndex_whenReturnsNetworkInterface_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByIndex(0); + assertNotNull(nif); + } + + @Test + public void givenInterface_whenReturnsInetAddresses_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + Enumeration addressEnum = nif.getInetAddresses(); + InetAddress address = addressEnum.nextElement(); + assertEquals("127.0.0.1", address.getHostAddress()); + } + + @Test + public void givenInterface_whenReturnsInterfaceAddresses_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + + List addressEnum = nif.getInterfaceAddresses(); + InterfaceAddress address = addressEnum.get(0); + InetAddress localAddress = address.getAddress(); + InetAddress broadCastAddress = address.getBroadcast(); + assertEquals("127.0.0.1", localAddress.getHostAddress()); + assertEquals("127.255.255.255", broadCastAddress.getHostAddress()); + } + + @Test + public void givenInterface_whenChecksIfLoopback_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + assertTrue(nif.isLoopback()); + } + + @Test + public void givenInterface_whenChecksIfUp_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + assertTrue(nif.isUp()); + } + + @Test + public void givenInterface_whenChecksIfPointToPoint_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + assertFalse(nif.isPointToPoint()); + } + + @Test + public void givenInterface_whenChecksIfVirtual_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + assertFalse(nif.isVirtual()); + } + + @Test + public void givenInterface_whenChecksMulticastSupport_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + assertTrue(nif.supportsMulticast()); + } + + @Test + public void givenInterface_whenGetsMacAddress_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("lo"); + byte[] bytes = nif.getHardwareAddress(); + assertNotNull(bytes); + } + + @Test + public void givenInterface_whenGetsMTU_thenCorrect() throws SocketException, UnknownHostException { + NetworkInterface nif = NetworkInterface.getByName("net0"); + int mtu = nif.getMTU(); + assertEquals(1500, mtu); + } +} diff --git a/core-java/src/test/java/com/baeldung/java/nio2/PathTest.java b/core-java/src/test/java/com/baeldung/java/nio2/PathTest.java new file mode 100644 index 0000000000..004aeb3deb --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/nio2/PathTest.java @@ -0,0 +1,195 @@ +package com.baeldung.java.nio2; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Date; + +import org.junit.Test; + +public class PathTest { + + private static final String HOME = System.getProperty("user.home"); + + // creating a path + @Test + public void givenPathString_whenCreatesPathObject_thenCorrect() { + Path p = Paths.get("/articles/baeldung"); + assertEquals("\\articles\\baeldung", p.toString()); + + } + + @Test + public void givenPathParts_whenCreatesPathObject_thenCorrect() { + Path p = Paths.get("/articles", "baeldung"); + assertEquals("\\articles\\baeldung", p.toString()); + + } + + // retrieving path info + @Test + public void givenPath_whenRetrievesFileName_thenCorrect() { + Path p = Paths.get("/articles/baeldung/logs"); + assertEquals("logs", p.getFileName().toString()); + } + + @Test + public void givenPath_whenRetrievesNameByIndex_thenCorrect() { + Path p = Paths.get("/articles/baeldung/logs"); + assertEquals("articles", p.getName(0).toString()); + assertEquals("baeldung", p.getName(1).toString()); + assertEquals("logs", p.getName(2).toString()); + } + + @Test + public void givenPath_whenCountsParts_thenCorrect() { + Path p = Paths.get("/articles/baeldung/logs"); + assertEquals(3, p.getNameCount()); + } + + @Test + public void givenPath_whenCanRetrieveSubsequenceByIndex_thenCorrect() { + Path p = Paths.get("/articles/baeldung/logs"); + assertEquals("articles", p.subpath(0, 1).toString()); + assertEquals("articles\\baeldung", p.subpath(0, 2).toString()); + assertEquals("articles\\baeldung\\logs", p.subpath(0, 3).toString()); + assertEquals("baeldung", p.subpath(1, 2).toString()); + assertEquals("baeldung\\logs", p.subpath(1, 3).toString()); + assertEquals("logs", p.subpath(2, 3).toString()); + } + + @Test + public void givenPath_whenRetrievesParent_thenCorrect() { + Path p1 = Paths.get("/articles/baeldung/logs"); + Path p2 = Paths.get("/articles/baeldung"); + Path p3 = Paths.get("/articles"); + Path p4 = Paths.get("/"); + + assertEquals("\\articles\\baeldung", p1.getParent().toString()); + assertEquals("\\articles", p2.getParent().toString()); + assertEquals("\\", p3.getParent().toString()); + assertEquals(null, p4.getParent()); + } + + @Test + public void givenPath_whenRetrievesRoot_thenCorrect() { + Path p1 = Paths.get("/articles/baeldung/logs"); + Path p2 = Paths.get("c:/articles/baeldung/logs"); + + assertEquals("\\", p1.getRoot().toString()); + assertEquals("c:\\", p2.getRoot().toString()); + } + + // removing redundancies from path + @Test + public void givenPath_whenRemovesRedundancies_thenCorrect1() { + Path p = Paths.get("/home/./baeldung/articles"); + p = p.normalize(); + assertEquals("\\home\\baeldung\\articles", p.toString()); + } + + @Test + public void givenPath_whenRemovesRedundancies_thenCorrect2() { + Path p = Paths.get("/home/baeldung/../articles"); + p = p.normalize(); + assertEquals("\\home\\articles", p.toString()); + } + + // converting a path + @Test + public void givenPath_whenConvertsToBrowseablePath_thenCorrect() { + Path p = Paths.get("/home/baeldung/articles.html"); + URI uri = p.toUri(); + assertEquals("file:///E:/home/baeldung/articles.html", uri.toString()); + } + + @Test + public void givenPath_whenConvertsToAbsolutePath_thenCorrect() { + Path p = Paths.get("/home/baeldung/articles.html"); + assertEquals("E:\\home\\baeldung\\articles.html", p.toAbsolutePath().toString()); + } + + @Test + public void givenAbsolutePath_whenRetainsAsAbsolute_thenCorrect() { + Path p = Paths.get("E:\\home\\baeldung\\articles.html"); + assertEquals("E:\\home\\baeldung\\articles.html", p.toAbsolutePath().toString()); + } + + @Test + public void givenExistingPath_whenGetsRealPathToFile_thenCorrect() throws IOException { + Path p = Paths.get(HOME); + assertEquals(HOME, p.toRealPath().toString()); + } + + @Test(expected = NoSuchFileException.class) + public void givenInExistentPath_whenFailsToConvert_thenCorrect() throws IOException { + Path p = Paths.get("E:\\home\\baeldung\\articles.html"); + + p.toRealPath(); + } + + // joining paths + @Test + public void givenTwoPaths_whenJoinsAndResolves_thenCorrect() throws IOException { + Path p = Paths.get("/baeldung/articles"); + assertEquals("\\baeldung\\articles\\java", p.resolve("java").toString()); + } + + @Test + public void givenAbsolutePath_whenResolutionRetainsIt_thenCorrect() throws IOException { + Path p = Paths.get("/baeldung/articles"); + assertEquals("C:\\baeldung\\articles\\java", p.resolve("C:\\baeldung\\articles\\java").toString()); + } + + @Test + public void givenPathWithRoot_whenResolutionRetainsIt_thenCorrect2() throws IOException { + Path p = Paths.get("/baeldung/articles"); + assertEquals("\\java", p.resolve("/java").toString()); + } + + // creating a path between 2 paths + @Test + public void givenSiblingPaths_whenCreatesPathToOther_thenCorrect() throws IOException { + Path p1 = Paths.get("articles"); + Path p2 = Paths.get("authors"); + assertEquals("..\\authors", p1.relativize(p2).toString()); + assertEquals("..\\articles", p2.relativize(p1).toString()); + } + + @Test + public void givenNonSiblingPaths_whenCreatesPathToOther_thenCorrect() throws IOException { + Path p1 = Paths.get("/baeldung"); + Path p2 = Paths.get("/baeldung/authors/articles"); + assertEquals("authors\\articles", p1.relativize(p2).toString()); + assertEquals("..\\..", p2.relativize(p1).toString()); + } + + // comparing 2 paths + @Test + public void givenTwoPaths_whenTestsEquality_thenCorrect() throws IOException { + Path p1 = Paths.get("/baeldung/articles"); + Path p2 = Paths.get("/baeldung/articles"); + Path p3 = Paths.get("/baeldung/authors"); + + assertTrue(p1.equals(p2)); + assertFalse(p1.equals(p3)); + } + + @Test + public void givenPath_whenInspectsStart_thenCorrect() { + Path p1 = Paths.get("/baeldung/articles"); + assertTrue(p1.startsWith("/baeldung")); + } + + @Test + public void givenPath_whenInspectsEnd_thenCorrect() { + Path p1 = Paths.get("/baeldung/articles"); + assertTrue(p1.endsWith("articles")); + } +} diff --git a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java new file mode 100644 index 0000000000..d24c0a94b3 --- /dev/null +++ b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java @@ -0,0 +1,25 @@ +package com.baeldung.enterprise.patterns.front.controller.filters; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +public class AuditFilter extends BaseFilter { + @Override + public void doFilter( + ServletRequest request, + ServletResponse response, + FilterChain chain + ) throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpSession session = httpServletRequest.getSession(false); + if (session != null && session.getAttribute("username") != null) { + request.setAttribute("username", session.getAttribute("username")); + } + chain.doFilter(request, response); + } +} diff --git a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java new file mode 100644 index 0000000000..0ae7cd73fd --- /dev/null +++ b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java @@ -0,0 +1,23 @@ +package com.baeldung.enterprise.patterns.front.controller.filters; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import java.io.IOException; + +@WebFilter(servletNames = "front-controller") +public class VisitorCounterFilter extends BaseFilter { + private int counter; + + @Override + public void doFilter( + ServletRequest request, + ServletResponse response, + FilterChain chain + ) throws IOException, ServletException { + request.setAttribute("counter", ++counter); + chain.doFilter(request, response); + } +} diff --git a/enterprise-patterns/pom.xml b/enterprise-patterns/pom.xml new file mode 100644 index 0000000000..036a61c44a --- /dev/null +++ b/enterprise-patterns/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + com.baeldung.enterprise.patterns + enterprise-patterns-parent + pom + + spring-dispatcher-servlet + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + diff --git a/junit5/REDAME.md b/junit5/README.md similarity index 100% rename from junit5/REDAME.md rename to junit5/README.md diff --git a/junit5/pom.xml b/junit5/pom.xml index 5a2ea61668..84d64e7b42 100644 --- a/junit5/pom.xml +++ b/junit5/pom.xml @@ -1,83 +1,53 @@ - - 4.0.0 + + 4.0.0 - com.baeldung - junit5 - 1.0-SNAPSHOT + com.baeldung + junit5 + 1.0-SNAPSHOT - junit5 - Intro to JUnit 5 + junit5 + Intro to JUnit 5 - - UTF-8 - 1.8 - - 5.0.0-SNAPSHOT - + + UTF-8 + 1.8 + 5.0.0-M2 + 1.0.0-M2 + - - - snapshots-repo - https://oss.sonatype.org/content/repositories/snapshots - - false - - - - always - true - - - + + + + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + + + + maven-surefire-plugin + 2.19 + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + + + + - - - snapshots-repo - https://oss.sonatype.org/content/repositories/snapshots - - false - - - - always - true - - - + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + - - - - maven-compiler-plugin - 3.1 - - ${java.version} - ${java.version} - - - - maven-surefire-plugin - 2.19 - - - org.junit - surefire-junit5 - ${junit.gen5.version} - - - - - - - - - org.junit - junit5-api - ${junit.gen5.version} - test - - + \ No newline at end of file diff --git a/junit5/src/test/java/com/baeldung/AssertionTest.java b/junit5/src/test/java/com/baeldung/AssertionTest.java new file mode 100644 index 0000000000..70297b9073 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/AssertionTest.java @@ -0,0 +1,29 @@ +package com.baeldung; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.expectThrows; + +import org.junit.jupiter.api.Test; + +public class AssertionTest { + + @Test + public void testConvertToDoubleThrowException() { + String age = "eighteen"; + expectThrows(NumberFormatException.class, () -> { + convertToInt(age); + }); + + assertThrows(NumberFormatException.class, () -> { + convertToInt(age); + }); + } + + private static Integer convertToInt(String str) { + if (str == null) { + return null; + } + return Integer.valueOf(str); + } + +} diff --git a/junit5/src/test/java/com/baeldung/AssumptionTest.java b/junit5/src/test/java/com/baeldung/AssumptionTest.java index e4c2b56124..f6f288e8a7 100644 --- a/junit5/src/test/java/com/baeldung/AssumptionTest.java +++ b/junit5/src/test/java/com/baeldung/AssumptionTest.java @@ -1,9 +1,11 @@ package com.baeldung; -import org.junit.gen5.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assumptions.assumeFalse; +import static org.junit.jupiter.api.Assumptions.assumeTrue; +import static org.junit.jupiter.api.Assumptions.assumingThat; -import static org.junit.gen5.api.Assertions.assertEquals; -import static org.junit.gen5.api.Assumptions.*; +import org.junit.jupiter.api.Test; public class AssumptionTest { diff --git a/junit5/src/test/java/com/baeldung/ExceptionTest.java b/junit5/src/test/java/com/baeldung/ExceptionTest.java index 5c30ad5b44..31a6dff657 100644 --- a/junit5/src/test/java/com/baeldung/ExceptionTest.java +++ b/junit5/src/test/java/com/baeldung/ExceptionTest.java @@ -1,18 +1,26 @@ package com.baeldung; -import org.junit.gen5.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.expectThrows; -import static org.junit.gen5.api.Assertions.assertEquals; -import static org.junit.gen5.api.Assertions.expectThrows; +import org.junit.jupiter.api.Test; public class ExceptionTest { - @Test - void shouldThrowException() { - Throwable exception = expectThrows(UnsupportedOperationException.class, - () -> { - throw new UnsupportedOperationException("Not supported"); - }); - assertEquals(exception.getMessage(), "Not supported"); - } + @Test + void shouldThrowException() { + Throwable exception = expectThrows(UnsupportedOperationException.class, () -> { + throw new UnsupportedOperationException("Not supported"); + }); + assertEquals(exception.getMessage(), "Not supported"); + } + + @Test + void assertThrowsException() { + String str = null; + assertThrows(IllegalArgumentException.class, () -> { + Integer.valueOf(str); + }); + } } diff --git a/junit5/src/test/java/com/baeldung/FirstTest.java b/junit5/src/test/java/com/baeldung/FirstTest.java index 3306dc01f9..817d8b36de 100644 --- a/junit5/src/test/java/com/baeldung/FirstTest.java +++ b/junit5/src/test/java/com/baeldung/FirstTest.java @@ -1,12 +1,12 @@ package com.baeldung; -import org.junit.gen5.api.Disabled; -import org.junit.gen5.api.Test; +import static org.junit.jupiter.api.Assertions.*; import java.util.Arrays; import java.util.List; -import static org.junit.gen5.api.Assertions.*; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; class FirstTest { diff --git a/junit5/src/test/java/com/baeldung/JUnit5NewFeaturesTest.java b/junit5/src/test/java/com/baeldung/JUnit5NewFeaturesTest.java new file mode 100644 index 0000000000..6c790a7c8e --- /dev/null +++ b/junit5/src/test/java/com/baeldung/JUnit5NewFeaturesTest.java @@ -0,0 +1,50 @@ +package com.baeldung; + +import java.util.logging.Logger; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +//@RunWith(JUnitPlatform.class) +public class JUnit5NewFeaturesTest { + + private static final Logger log = Logger.getLogger(JUnit5NewFeaturesTest.class.getName()); + + @BeforeAll + static void setup() { + log.info("@BeforeAll - executes once before all test methods in this class"); + } + + @BeforeEach + void init() { + log.info("@BeforeEach - executes before each test method in this class"); + } + + @DisplayName("Single test successful") + @Test + void testSingleSuccessTest() { + log.info("Success"); + + } + + @Test + @Disabled("Not implemented yet.") + void testShowSomething() { + } + + @AfterEach + void tearDown() { + log.info("@AfterEach - executed after each test method."); + } + + @AfterAll + static void done() { + log.info("@AfterAll - executed after all test methods."); + } + +} diff --git a/junit5/src/test/java/com/baeldung/LiveTest.java b/junit5/src/test/java/com/baeldung/LiveTest.java new file mode 100644 index 0000000000..e0e267da0b --- /dev/null +++ b/junit5/src/test/java/com/baeldung/LiveTest.java @@ -0,0 +1,38 @@ +package com.baeldung; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; + +public class LiveTest { + + private List in = new ArrayList<>(Arrays.asList("Hello", "Yes", "No")); + private List out = new ArrayList<>(Arrays.asList("Cześć", "Tak", "Nie")); + + @TestFactory + public Stream translateDynamicTestsFromStream() { + + return in.stream().map(word -> DynamicTest.dynamicTest("Test translate " + word, () -> { + int id = in.indexOf(word); + assertEquals(out.get(id), translate(word)); + })); + } + + private String translate(String word) { + if ("Hello".equalsIgnoreCase(word)) { + return "Cześć"; + } else if ("Yes".equalsIgnoreCase(word)) { + return "Tak"; + } else if ("No".equalsIgnoreCase(word)) { + return "Nie"; + } + return "Error"; + } + +} diff --git a/junit5/src/test/java/com/baeldung/NestedTest.java b/junit5/src/test/java/com/baeldung/NestedTest.java index 3fbe4f8644..b1c873e258 100644 --- a/junit5/src/test/java/com/baeldung/NestedTest.java +++ b/junit5/src/test/java/com/baeldung/NestedTest.java @@ -1,10 +1,14 @@ package com.baeldung; -import org.junit.gen5.api.*; - import java.util.EmptyStackException; import java.util.Stack; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + public class NestedTest { Stack stack; boolean isRun = false; diff --git a/junit5/src/test/java/com/baeldung/StringUtils.java b/junit5/src/test/java/com/baeldung/StringUtils.java new file mode 100644 index 0000000000..c1852113bc --- /dev/null +++ b/junit5/src/test/java/com/baeldung/StringUtils.java @@ -0,0 +1,11 @@ +package com.baeldung; + +public final class StringUtils { + + public static Double convertToDouble(String str) { + if (str == null) { + return null; + } + return Double.valueOf(str); + } +} diff --git a/junit5/src/test/java/com/baeldung/TaggedTest.java b/junit5/src/test/java/com/baeldung/TaggedTest.java index dbc82f4022..fa3a500240 100644 --- a/junit5/src/test/java/com/baeldung/TaggedTest.java +++ b/junit5/src/test/java/com/baeldung/TaggedTest.java @@ -1,9 +1,9 @@ package com.baeldung; -import org.junit.gen5.api.Tag; -import org.junit.gen5.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.gen5.api.Assertions.assertEquals; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; @Tag("Test case") public class TaggedTest { diff --git a/junit5/src/test/java/com/baeldung/suites/AllTests.java b/junit5/src/test/java/com/baeldung/suites/AllTests.java new file mode 100644 index 0000000000..24af1e733b --- /dev/null +++ b/junit5/src/test/java/com/baeldung/suites/AllTests.java @@ -0,0 +1,8 @@ +package com.baeldung.suites; + +//@RunWith(JUnitPlatform.class) +//@SelectPackages("com.baeldung") +//@SelectClasses({AssertionTest.class, AssumptionTest.class, ExceptionTest.class}) +public class AllTests { + +} From 2ffc247f9a3b2a06a1253406d60e2868131ed009 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Mon, 14 Nov 2016 18:32:42 +0530 Subject: [PATCH 108/115] BAEL-29 Review Comment - Remove Inlining Variables --- .../java/conversion/StringConversionTest.java | 103 ++++++++++++------ 1 file changed, 67 insertions(+), 36 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java index d4786f54ac..613b7b9522 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java @@ -2,7 +2,6 @@ package com.baeldung.java.conversion; import static org.junit.Assert.assertEquals; -import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; @@ -19,79 +18,111 @@ import com.baeldung.datetime.UseLocalDateTime; public class StringConversionTest { @Test - public void whenConvertedToInt_thenCorrect() { - assertEquals(Integer.parseInt("1"), 1); + public void whenConvedToInt_thenCorrect() { + String beforeConvStr = "1"; + int afterConvInt = 1; + + assertEquals(Integer.parseInt(beforeConvStr), afterConvInt); } @Test - public void whenConvertedToInteger_thenCorrect() { - assertEquals(Integer.valueOf("12").equals(12), true); + public void whenConvedToInteger_thenCorrect() { + String beforeConvStr = "12"; + Integer afterConvInteger = 12; + + assertEquals(Integer.valueOf(beforeConvStr).equals(afterConvInteger), true); } @Test - public void whenConvertedTolong_thenCorrect() { - assertEquals(Long.parseLong("12345"), 12345); + public void whenConvedTolong_thenCorrect() { + String beforeConvStr = "12345"; + long afterConvLongPrimitive = 12345; + + assertEquals(Long.parseLong(beforeConvStr), afterConvLongPrimitive); } @Test - public void whenConvertedToLong_thenCorrect() { - assertEquals(Long.valueOf("14567").equals(14567L), true); + public void whenConvedToLong_thenCorrect() { + String beforeConvStr = "14567"; + Long afterConvLong = 14567l; + + assertEquals(Long.valueOf(beforeConvStr).equals(afterConvLong), true); } @Test - public void whenConvertedTodouble_thenCorrect() { - assertEquals(Double.parseDouble("1.4"), 1.4, 0.0); + public void whenConvedTodouble_thenCorrect() { + String beforeConvStr = "1.4"; + double afterConvDoublePrimitive = 1.4; + + assertEquals(Double.parseDouble(beforeConvStr), afterConvDoublePrimitive, 0.0); } @Test - public void whenConvertedToDouble_thenCorrect() { - assertEquals(Double.valueOf("145.67").equals(145.67d), true); + public void whenConvedToDouble_thenCorrect() { + String beforeConvStr = "145.67"; + double afterConvDouble = 145.67d; + + assertEquals(Double.valueOf(beforeConvStr).equals(afterConvDouble), true); } @Test - public void whenConvertedToByteArray_thenCorrect() throws UnsupportedEncodingException { - byte[] byteArray1 = new byte[] { 'a', 'b', 'c' }; - String string = new String(byteArray1, "UTF-8"); + public void whenConvedToByteArr_thenCorrect() { + String beforeConvStr = "abc"; + byte[] afterConvByteArr = new byte[] { 'a', 'b', 'c' }; - assertEquals(Arrays.equals(string.getBytes(), byteArray1), true); + assertEquals(Arrays.equals(beforeConvStr.getBytes(), afterConvByteArr), true); } @Test - public void whenConvertedToboolean_thenCorrect() { - assertEquals(Boolean.parseBoolean("true"), true); + public void whenConvedToboolean_thenCorrect() { + String beforeConvStr = "true"; + boolean afterConvBooleanPrimitive = true; + + assertEquals(Boolean.parseBoolean(beforeConvStr), afterConvBooleanPrimitive); } @Test - public void whenConvertedToBoolean_thenCorrect() { - assertEquals(Boolean.valueOf("true"), true); + public void whenConvedToBoolean_thenCorrect() { + String beforeConvStr = "true"; + Boolean afterConvBoolean = true; + + assertEquals(Boolean.valueOf(beforeConvStr), afterConvBoolean); } @Test - public void whenConvertedToCharArray_thenCorrect() { - String str = "hello"; - char[] charArray = { 'h', 'e', 'l', 'l', 'o' }; + public void whenConvedToCharArr_thenCorrect() { + String beforeConvStr = "hello"; + char[] afterConvCharArr = { 'h', 'e', 'l', 'l', 'o' }; - assertEquals(Arrays.equals(charArray, str.toCharArray()), true); + assertEquals(Arrays.equals(beforeConvStr.toCharArray(), afterConvCharArr), true); } @Test - public void whenConvertedToDate_thenCorrect() throws ParseException { - String str = "15/10/2013"; + public void whenConvedToDate_thenCorrect() throws ParseException { + String beforeConvStr = "15/10/2013"; + int afterConvCalendarDay = 15; + int afterConvCalendarMonth = 9; + int afterConvCalendarYear = 2013; SimpleDateFormat formatter = new SimpleDateFormat("dd/M/yyyy"); - Date date1 = formatter.parse(str); - Calendar calendar = new GregorianCalendar(2013, 9, 15); - Date date2 = calendar.getTime(); + Date afterConvDate = formatter.parse(beforeConvStr); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(afterConvDate); - assertEquals(date1.compareTo(date2), 0); + assertEquals(calendar.get(Calendar.DAY_OF_MONTH), afterConvCalendarDay); + assertEquals(calendar.get(Calendar.MONTH), afterConvCalendarMonth); + assertEquals(calendar.get(Calendar.YEAR), afterConvCalendarYear); } @Test - public void whenConvertedToLocalDateTime_thenCorrect() throws ParseException { + public void whenConvedToLocalDateTime_thenCorrect() { String str = "2007-12-03T10:15:30"; - LocalDateTime localDateTime = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); + int afterConvCalendarDay = 03; + Month afterConvCalendarMonth = Month.DECEMBER; + int afterConvCalendarYear = 2007; + LocalDateTime afterConvDate = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); - assertEquals(localDateTime.getDayOfMonth(), 3); - assertEquals(localDateTime.getMonth(), Month.DECEMBER); - assertEquals(localDateTime.getYear(), 2007); + assertEquals(afterConvDate.getDayOfMonth(), afterConvCalendarDay); + assertEquals(afterConvDate.getMonth(), afterConvCalendarMonth); + assertEquals(afterConvDate.getYear(), afterConvCalendarYear); } } From 710a932f268f9fd06d702f4262b2310a480e6481 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Mon, 14 Nov 2016 18:53:14 +0530 Subject: [PATCH 109/115] Refactoring Code --- .../java/conversion/StringConversionTest.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java index 613b7b9522..9a4ac053af 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java @@ -18,7 +18,7 @@ import com.baeldung.datetime.UseLocalDateTime; public class StringConversionTest { @Test - public void whenConvedToInt_thenCorrect() { + public void whenConvertedToInt_thenCorrect() { String beforeConvStr = "1"; int afterConvInt = 1; @@ -26,7 +26,7 @@ public class StringConversionTest { } @Test - public void whenConvedToInteger_thenCorrect() { + public void whenConvertedToInteger_thenCorrect() { String beforeConvStr = "12"; Integer afterConvInteger = 12; @@ -34,7 +34,7 @@ public class StringConversionTest { } @Test - public void whenConvedTolong_thenCorrect() { + public void whenConvertedTolong_thenCorrect() { String beforeConvStr = "12345"; long afterConvLongPrimitive = 12345; @@ -42,7 +42,7 @@ public class StringConversionTest { } @Test - public void whenConvedToLong_thenCorrect() { + public void whenConvertedToLong_thenCorrect() { String beforeConvStr = "14567"; Long afterConvLong = 14567l; @@ -50,7 +50,7 @@ public class StringConversionTest { } @Test - public void whenConvedTodouble_thenCorrect() { + public void whenConvertedTodouble_thenCorrect() { String beforeConvStr = "1.4"; double afterConvDoublePrimitive = 1.4; @@ -58,7 +58,7 @@ public class StringConversionTest { } @Test - public void whenConvedToDouble_thenCorrect() { + public void whenConvertedToDouble_thenCorrect() { String beforeConvStr = "145.67"; double afterConvDouble = 145.67d; @@ -66,7 +66,7 @@ public class StringConversionTest { } @Test - public void whenConvedToByteArr_thenCorrect() { + public void whenConvertedToByteArr_thenCorrect() { String beforeConvStr = "abc"; byte[] afterConvByteArr = new byte[] { 'a', 'b', 'c' }; @@ -74,7 +74,7 @@ public class StringConversionTest { } @Test - public void whenConvedToboolean_thenCorrect() { + public void whenConvertedToboolean_thenCorrect() { String beforeConvStr = "true"; boolean afterConvBooleanPrimitive = true; @@ -82,7 +82,7 @@ public class StringConversionTest { } @Test - public void whenConvedToBoolean_thenCorrect() { + public void whenConvertedToBoolean_thenCorrect() { String beforeConvStr = "true"; Boolean afterConvBoolean = true; @@ -90,7 +90,7 @@ public class StringConversionTest { } @Test - public void whenConvedToCharArr_thenCorrect() { + public void whenConvertedToCharArr_thenCorrect() { String beforeConvStr = "hello"; char[] afterConvCharArr = { 'h', 'e', 'l', 'l', 'o' }; @@ -98,7 +98,7 @@ public class StringConversionTest { } @Test - public void whenConvedToDate_thenCorrect() throws ParseException { + public void whenConvertedToDate_thenCorrect() throws ParseException { String beforeConvStr = "15/10/2013"; int afterConvCalendarDay = 15; int afterConvCalendarMonth = 9; @@ -114,7 +114,7 @@ public class StringConversionTest { } @Test - public void whenConvedToLocalDateTime_thenCorrect() { + public void whenConvertedToLocalDateTime_thenCorrect() { String str = "2007-12-03T10:15:30"; int afterConvCalendarDay = 03; Month afterConvCalendarMonth = Month.DECEMBER; From 2385fe04b182fbc36235cd58ab693b6327c41bc5 Mon Sep 17 00:00:00 2001 From: Nikhil Khatwani Date: Mon, 14 Nov 2016 19:06:29 +0530 Subject: [PATCH 110/115] Refactoring Code --- .../com/baeldung/java/conversion/StringConversionTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java index 9a4ac053af..09cacd0a29 100644 --- a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java +++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java @@ -119,7 +119,8 @@ public class StringConversionTest { int afterConvCalendarDay = 03; Month afterConvCalendarMonth = Month.DECEMBER; int afterConvCalendarYear = 2007; - LocalDateTime afterConvDate = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); + LocalDateTime afterConvDate + = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str); assertEquals(afterConvDate.getDayOfMonth(), afterConvCalendarDay); assertEquals(afterConvDate.getMonth(), afterConvCalendarMonth); From 0110a3f75e84541134118e36ac765115598be720 Mon Sep 17 00:00:00 2001 From: "nguyenminhtuanfit@gmail.com" Date: Mon, 14 Nov 2016 21:14:09 +0700 Subject: [PATCH 111/115] change pointcut name --- aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj index 3bdddd22a8..2ddf03192b 100644 --- a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj +++ b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj @@ -24,7 +24,7 @@ public aspect AccountAspect { } } - after(int amount, Account balance) : callAtWithDraw(amount, balance) { + after(int amount, Account balance) : callWithDraw(amount, balance) { logger.info("Balance after withdrawal : {}", balance.balance); } } From 315e1aa9cd6102dab222522f8d818a6d87668062 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 14 Nov 2016 16:26:41 +0100 Subject: [PATCH 112/115] Remove duplicate file --- .../com/baeldung/hexToAscii/HexToAscii.java | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java diff --git a/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java b/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java deleted file mode 100644 index 2a3c4b109e..0000000000 --- a/core-java/src/main/java/com/baeldung/hexToAscii/HexToAscii.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.hexToAscii; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class HexToAscii { - - @Test - public static void whenHexToAscii() { - String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; - String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; - - assertEquals(asciiString, hexToAscii(hexEquivalent)); - } - - @Test - public static void whenAsciiToHex() { - String asciiString = "http://www.baeldung.com/jackson-serialize-dates"; - String hexEquivalent = "687474703a2f2f7777772e6261656c64756e672e636f6d2f6a61636b736f6e2d73657269616c697a652d6461746573"; - - assertEquals(hexEquivalent, asciiToHex(asciiString)); - } - - // - - private static String asciiToHex(String asciiStr) { - char[] chars = asciiStr.toCharArray(); - StringBuilder hex = new StringBuilder(); - for (char ch : chars) { - hex.append(Integer.toHexString((int) ch)); - } - - return hex.toString(); - } - - private static String hexToAscii(String hexStr) { - StringBuilder output = new StringBuilder(""); - for (int i = 0; i < hexStr.length(); i += 2) { - String str = hexStr.substring(i, i + 2); - output.append((char) Integer.parseInt(str, 16)); - } - return output.toString(); - } - -} From 8e2ad9323311958a4e8161c011b6187980bdb104 Mon Sep 17 00:00:00 2001 From: Sameera Date: Mon, 14 Nov 2016 22:31:50 +0530 Subject: [PATCH 113/115] Adding SHA-256 hashing impl and test classes --- core-java/pom.xml | 5 ++ .../com/baeldung/hashing/SHA256Hashing.java | 51 +++++++++++++++++++ .../baeldung/hashing/SHA256HashingTest.java | 37 ++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java create mode 100644 core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java diff --git a/core-java/pom.xml b/core-java/pom.xml index 8b93e238eb..17d9c2ce64 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -46,6 +46,11 @@ 3.3 + + org.bouncycastle + bcprov-jdk15on + 1.55 + diff --git a/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java new file mode 100644 index 0000000000..9c8fc86e7a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java @@ -0,0 +1,51 @@ +package com.baeldung.hashing; + + +import com.google.common.hash.Hashing; +import org.apache.commons.codec.digest.DigestUtils; +import org.bouncycastle.util.encoders.Hex; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class SHA256Hashing { + + public static String HashWithJavaMessageDigest(final String originalString) + throws NoSuchAlgorithmException { + final MessageDigest digest = MessageDigest.getInstance("SHA-256"); + final byte[] encodedhash = digest.digest( + originalString.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(encodedhash); + } + + public static String HashWithGuava(final String originalString) { + final String sha256hex = Hashing.sha256().hashString( + originalString, StandardCharsets.UTF_8).toString(); + return sha256hex; + } + + public static String HashWithApacheCommons(final String originalString) { + final String sha256hex = DigestUtils.sha256Hex(originalString); + return sha256hex; + } + + public static String HashWithBouncyCastle(final String originalString) + throws NoSuchAlgorithmException { + final MessageDigest digest = MessageDigest.getInstance("SHA-256"); + final byte[] hash = digest.digest( + originalString.getBytes(StandardCharsets.UTF_8)); + final String sha256hex = new String(Hex.encode(hash)); + return sha256hex; + } + + private static String bytesToHex(byte[] hash) { + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < hash.length; i++) { + String hex = Integer.toHexString(0xff & hash[i]); + if(hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } +} diff --git a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java new file mode 100644 index 0000000000..dc496d589b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java @@ -0,0 +1,37 @@ +package com.baeldung.hashing; + +import org.junit.Test; + +import static org.junit.Assert.*; + + +public class SHA256HashingTest { + + private static String originalValue = "abc123"; + private static String hashedValue = + "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090"; + + @Test + public void testHashWithJavaMessageDigest() throws Exception { + final String currentHashedValue = SHA256Hashing.HashWithJavaMessageDigest(originalValue); + assertEquals(currentHashedValue, hashedValue); + } + + @Test + public void testHashWithGuava() throws Exception { + final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue); + assertEquals(currentHashedValue, hashedValue); + } + + @Test + public void testHashWithApacheCommans() throws Exception { + final String currentHashedValue = SHA256Hashing.HashWithGuava(originalValue); + assertEquals(currentHashedValue, hashedValue); + } + + @Test + public void testHashWithBouncyCastle() throws Exception { + final String currentHashedValue = SHA256Hashing.HashWithBouncyCastle(originalValue); + assertEquals(currentHashedValue, hashedValue); + } +} \ No newline at end of file From a323947704278a150ddd357969b8b95c61b7fcde Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Mon, 14 Nov 2016 23:43:37 +0100 Subject: [PATCH 114/115] BAEL-86 - rename main class --- ...cationInitializer.java => DispatcherServletApplication.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/{WebApplicationInitializer.java => DispatcherServletApplication.java} (92%) diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/WebApplicationInitializer.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/DispatcherServletApplication.java similarity index 92% rename from spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/WebApplicationInitializer.java rename to spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/DispatcherServletApplication.java index 016e4a8b4c..181fb3f405 100644 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/WebApplicationInitializer.java +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/spring/dispatcher/servlet/DispatcherServletApplication.java @@ -9,7 +9,7 @@ import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; -public class WebApplicationInitializer implements org.springframework.web.WebApplicationInitializer { +public class DispatcherServletApplication implements org.springframework.web.WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext rootContext = From 3914a5d41751a2ffac8f88c74bfd53f9ca0a3519 Mon Sep 17 00:00:00 2001 From: slavisa-baeldung Date: Tue, 15 Nov 2016 06:36:28 +0100 Subject: [PATCH 115/115] BAEL-89 - splitting controller and main application class --- .../src/main/resources/application.properties | 6 ++++- .../JettyWebApplication.java | 13 +---------- .../{tomcatex => jettyex}/SecurityConfig.java | 2 +- .../{tomcatex => jettyex}/SessionConfig.java | 2 +- .../session/jettyex/TestController.java | 12 ++++++++++ .../session/tomcatex/TestController.java | 23 +++++++++++++++++++ .../tomcatex/TomcatWebApplication.java | 15 ------------ 7 files changed, 43 insertions(+), 30 deletions(-) rename spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/{tomcatex => jettyex}/JettyWebApplication.java (57%) rename spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/{tomcatex => jettyex}/SecurityConfig.java (94%) rename spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/{tomcatex => jettyex}/SessionConfig.java (93%) create mode 100644 spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/TestController.java create mode 100644 spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TestController.java diff --git a/spring-cloud/spring-cloud-bootstrap/config/src/main/resources/application.properties b/spring-cloud/spring-cloud-bootstrap/config/src/main/resources/application.properties index 6c47d001f4..212586f0ea 100644 --- a/spring-cloud/spring-cloud-bootstrap/config/src/main/resources/application.properties +++ b/spring-cloud/spring-cloud-bootstrap/config/src/main/resources/application.properties @@ -5,4 +5,8 @@ spring.cloud.config.server.git.uri=file:///${user.home}/application-config eureka.client.region = default eureka.client.registryFetchIntervalSeconds = 5 -eureka.client.serviceUrl.defaultZone=http://discUser:discPassword@localhost:8082/eureka/ \ No newline at end of file +eureka.client.serviceUrl.defaultZone=http://discUser:discPassword@localhost:8082/eureka/ + +security.user.name=configUser +security.user.password=configPassword +security.user.role=SYSTEM \ No newline at end of file diff --git a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/JettyWebApplication.java similarity index 57% rename from spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java rename to spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/JettyWebApplication.java index 7bbc776eaa..41503c3d9e 100644 --- a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/JettyWebApplication.java +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/JettyWebApplication.java @@ -1,8 +1,7 @@ -package com.baeldung.spring.session.tomcatex; +package com.baeldung.spring.session.jettyex; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @@ -11,14 +10,4 @@ public class JettyWebApplication { public static void main(String[] args) { SpringApplication.run(JettyWebApplication.class, args); } - - @RequestMapping - public String helloJetty() { - return "hello Jetty"; - } - - @RequestMapping("/test") - public String lksjdf() { - return ""; - } } diff --git a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/SecurityConfig.java similarity index 94% rename from spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java rename to spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/SecurityConfig.java index 6ed7df9218..28cdb3cc08 100644 --- a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SecurityConfig.java +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.session.tomcatex; +package com.baeldung.spring.session.jettyex; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; diff --git a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/SessionConfig.java similarity index 93% rename from spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java rename to spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/SessionConfig.java index f261f66f9d..735ae7fb43 100644 --- a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/SessionConfig.java +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/SessionConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.session.tomcatex; +package com.baeldung.spring.session.jettyex; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/TestController.java b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/TestController.java new file mode 100644 index 0000000000..f5c82f2260 --- /dev/null +++ b/spring-session/jetty-session-demo/src/main/java/com/baeldung/spring/session/jettyex/TestController.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.session.jettyex; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TestController { + @RequestMapping + public String helloJetty() { + return "hello Jetty"; + } +} \ No newline at end of file diff --git a/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TestController.java b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TestController.java new file mode 100644 index 0000000000..877f29e1d3 --- /dev/null +++ b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TestController.java @@ -0,0 +1,23 @@ +package com.baeldung.spring.session.tomcatex; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TestController { + + @RequestMapping + public String helloDefault() { + return "hello default"; + } + + @RequestMapping("/tomcat") + public String helloTomcat() { + return "hello tomcat"; + } + + @RequestMapping("/tomcat/admin") + public String helloTomcatAdmin() { + return "hello tomcat admin"; + } +} diff --git a/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java index 58c6b807ec..683a4a1f15 100644 --- a/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java +++ b/spring-session/tomcat-session-demo/src/main/java/com/baeldung/spring/session/tomcatex/TomcatWebApplication.java @@ -11,19 +11,4 @@ public class TomcatWebApplication { public static void main(String[] args) { SpringApplication.run(TomcatWebApplication.class, args); } - - @RequestMapping - public String helloDefault() { - return "hello default"; - } - - @RequestMapping("/tomcat") - public String helloTomcat() { - return "hello tomcat"; - } - - @RequestMapping("/tomcat/admin") - public String helloTomcatAdmin() { - return "hello tomcat admin"; - } }