From 2d678d6b3255ad9ff9c7fa013ba39f5124ff5279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20R=C3=A4del?= Date: Sun, 2 Oct 2016 10:53:24 +0200 Subject: [PATCH] BAEL-325: Added UML sources. Applied some small improvements. --- .../filters/AuthenticationFilter.java | 15 +++++--- .../patterns/filters/EncodingFilter.java | 6 ++- .../patterns/filters/FilterChainImpl.java | 7 +--- .../patterns/filters/TemplateFilter.java | 35 ++++++++++++++++++ .../filters/VisitorCounterFilter.java | 19 ++++++---- ...nt controller.png => front_controller.png} | Bin ... controller.puml => front_controller.puml} | 0 .../main/resources/intercepting_filter.png | Bin 0 -> 17297 bytes .../main/resources/intercepting_filter.puml | 17 +++++++++ 9 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 patterns/src/main/java/com/baeldung/patterns/filters/TemplateFilter.java rename patterns/src/main/resources/{front controller.png => front_controller.png} (100%) rename patterns/src/main/resources/{front controller.puml => front_controller.puml} (100%) create mode 100644 patterns/src/main/resources/intercepting_filter.png create mode 100644 patterns/src/main/resources/intercepting_filter.puml diff --git a/patterns/src/main/java/com/baeldung/patterns/filters/AuthenticationFilter.java b/patterns/src/main/java/com/baeldung/patterns/filters/AuthenticationFilter.java index fa7655434e..f5e03878ca 100644 --- a/patterns/src/main/java/com/baeldung/patterns/filters/AuthenticationFilter.java +++ b/patterns/src/main/java/com/baeldung/patterns/filters/AuthenticationFilter.java @@ -3,22 +3,23 @@ package com.baeldung.patterns.filters; import com.baeldung.patterns.commands.FrontCommand; import com.baeldung.patterns.commands.LoginCommand; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; -public class AuthenticationFilter extends BaseFilter { +public class AuthenticationFilter implements Filter { private OnIntercept callback; public AuthenticationFilter(OnIntercept callback) { this.callback = callback; } + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + @Override public void doFilter( ServletRequest request, @@ -37,4 +38,8 @@ public class AuthenticationFilter extends BaseFilter { chain.doFilter(request, response); } } + + @Override + public void destroy() { + } } diff --git a/patterns/src/main/java/com/baeldung/patterns/filters/EncodingFilter.java b/patterns/src/main/java/com/baeldung/patterns/filters/EncodingFilter.java index 1277ca726d..2856bb1112 100644 --- a/patterns/src/main/java/com/baeldung/patterns/filters/EncodingFilter.java +++ b/patterns/src/main/java/com/baeldung/patterns/filters/EncodingFilter.java @@ -2,9 +2,13 @@ package com.baeldung.patterns.filters; import javax.servlet.*; import javax.servlet.annotation.WebFilter; +import javax.servlet.annotation.WebInitParam; import java.io.IOException; -@WebFilter(servletNames = "front-controller") +@WebFilter( + servletNames = {"front-controller"}, + initParams = {@WebInitParam(name = "encoding", value = "UTF-8")} +) public class EncodingFilter extends BaseFilter { private String encoding; diff --git a/patterns/src/main/java/com/baeldung/patterns/filters/FilterChainImpl.java b/patterns/src/main/java/com/baeldung/patterns/filters/FilterChainImpl.java index d2b64c7d06..789fc003a0 100644 --- a/patterns/src/main/java/com/baeldung/patterns/filters/FilterChainImpl.java +++ b/patterns/src/main/java/com/baeldung/patterns/filters/FilterChainImpl.java @@ -1,14 +1,11 @@ package com.baeldung.patterns.filters; -import javax.servlet.Filter; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; import java.io.IOException; import java.util.Arrays; import java.util.Iterator; -public class FilterChainImpl implements javax.servlet.FilterChain { +public class FilterChainImpl implements FilterChain { private Iterator filters; public FilterChainImpl(Filter... filters) { diff --git a/patterns/src/main/java/com/baeldung/patterns/filters/TemplateFilter.java b/patterns/src/main/java/com/baeldung/patterns/filters/TemplateFilter.java new file mode 100644 index 0000000000..939d9ad84d --- /dev/null +++ b/patterns/src/main/java/com/baeldung/patterns/filters/TemplateFilter.java @@ -0,0 +1,35 @@ +package com.baeldung.patterns.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.HttpServletResponse; +import java.io.IOException; + +public abstract class TemplateFilter extends BaseFilter { + + protected abstract void preFilter( + HttpServletRequest request, + HttpServletResponse response + ) throws IOException, ServletException; + + protected abstract void postFilter( + HttpServletRequest request, + HttpServletResponse response + ) throws IOException, ServletException; + + @Override + public void doFilter( + ServletRequest request, + ServletResponse response, + FilterChain chain + ) throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + preFilter(httpServletRequest, httpServletResponse); + chain.doFilter(request, response); + postFilter(httpServletRequest, httpServletResponse); + } +} diff --git a/patterns/src/main/java/com/baeldung/patterns/filters/VisitorCounterFilter.java b/patterns/src/main/java/com/baeldung/patterns/filters/VisitorCounterFilter.java index 0abfac7cd6..5c2358686b 100644 --- a/patterns/src/main/java/com/baeldung/patterns/filters/VisitorCounterFilter.java +++ b/patterns/src/main/java/com/baeldung/patterns/filters/VisitorCounterFilter.java @@ -1,18 +1,19 @@ package com.baeldung.patterns.filters; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.HashSet; import java.util.Set; -public class VisitorCounterFilter extends BaseFilter { +public class VisitorCounterFilter implements Filter { private static Set users = new HashSet<>(); + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + @Override public void doFilter( ServletRequest request, @@ -21,10 +22,12 @@ public class VisitorCounterFilter extends BaseFilter { ) throws IOException, ServletException { HttpSession session = ((HttpServletRequest) request).getSession(false); String username = (String) session.getAttribute("username"); - if (!users.contains(username)) { - users.add(username); - } + users.add(username); request.setAttribute("counter", users.size()); chain.doFilter(request, response); } + + @Override + public void destroy() { + } } diff --git a/patterns/src/main/resources/front controller.png b/patterns/src/main/resources/front_controller.png similarity index 100% rename from patterns/src/main/resources/front controller.png rename to patterns/src/main/resources/front_controller.png diff --git a/patterns/src/main/resources/front controller.puml b/patterns/src/main/resources/front_controller.puml similarity index 100% rename from patterns/src/main/resources/front controller.puml rename to patterns/src/main/resources/front_controller.puml diff --git a/patterns/src/main/resources/intercepting_filter.png b/patterns/src/main/resources/intercepting_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccacc80812c9d857475472fbf82751aafc6b01e GIT binary patch literal 17297 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