From 24ab6f61de0a3ae77dfc6cc278b73457516b7f01 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 25 Jul 2024 15:46:05 +0100 Subject: [PATCH] Add FilterRegistration to spring-web textFixtures See gh-33252 --- .../servlet/MockFilterRegistration.java | 129 ++++++++++++++++++ .../servlet/MockServletContext.java | 43 +++--- 2 files changed, 153 insertions(+), 19 deletions(-) create mode 100644 spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockFilterRegistration.java diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockFilterRegistration.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockFilterRegistration.java new file mode 100644 index 0000000000..ee2521f53c --- /dev/null +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockFilterRegistration.java @@ -0,0 +1,129 @@ +/* + * Copyright 2002-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.web.testfixture.servlet; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; + +import org.springframework.lang.Nullable; + +/** + * Mock implementation of {@link FilterRegistration}. + * + * @author Rossen Stoyanchev + * @since 6.2 + */ +public class MockFilterRegistration implements FilterRegistration { + + private final String name; + + private final String className; + + private final Map initParameters = new LinkedHashMap<>(); + + private final List servletNames = new ArrayList<>(); + + private final List urlPatterns = new ArrayList<>(); + + + public MockFilterRegistration(String className) { + this(className, ""); + } + + public MockFilterRegistration(String className, String name) { + this.name = name; + this.className = className; + } + + + @Override + public String getName() { + return this.name; + } + + @Nullable + @Override + public String getClassName() { + return this.className; + } + + @Override + public boolean setInitParameter(String name, String value) { + return (this.initParameters.putIfAbsent(name, value) != null); + } + + @Nullable + @Override + public String getInitParameter(String name) { + return this.initParameters.get(name); + } + + @Override + public Set setInitParameters(Map initParameters) { + Set existingParameterNames = new LinkedHashSet<>(); + for (Map.Entry entry : initParameters.entrySet()) { + if (this.initParameters.get(entry.getKey()) != null) { + existingParameterNames.add(entry.getKey()); + } + } + if (existingParameterNames.isEmpty()) { + this.initParameters.putAll(initParameters); + } + return existingParameterNames; + } + + @Override + public Map getInitParameters() { + return Collections.unmodifiableMap(this.initParameters); + } + + @Override + public void addMappingForServletNames( + EnumSet dispatcherTypes, boolean isMatchAfter, String... servletNames) { + + this.servletNames.addAll(Arrays.asList(servletNames)); + } + + @Override + public Collection getServletNameMappings() { + return Collections.unmodifiableCollection(this.servletNames); + } + + @Override + public void addMappingForUrlPatterns( + EnumSet dispatcherTypes, boolean isMatchAfter, String... urlPatterns) { + + this.urlPatterns.addAll(Arrays.asList(urlPatterns)); + } + + @Override + public Collection getUrlPatternMappings() { + return Collections.unmodifiableCollection(this.urlPatterns); + } + +} diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockServletContext.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockServletContext.java index c0018eb48f..c7f6f28149 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockServletContext.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockServletContext.java @@ -145,6 +145,8 @@ public class MockServletContext implements ServletContext { @Nullable private String responseCharacterEncoding; + private final Map filterRegistrations = new LinkedHashMap<>(); + private final Map mimeTypes = new LinkedHashMap<>(); @@ -224,6 +226,7 @@ public class MockServletContext implements ServletContext { } @Override + @Nullable public ServletContext getContext(String contextPath) { if (this.contextPath.equals(contextPath)) { return this; @@ -376,6 +379,7 @@ public class MockServletContext implements ServletContext { } @Override + @Nullable public RequestDispatcher getNamedDispatcher(String path) { return this.namedRequestDispatchers.get(path); } @@ -465,6 +469,7 @@ public class MockServletContext implements ServletContext { } @Override + @Nullable public String getInitParameter(String name) { Assert.notNull(name, "Parameter name must not be null"); return this.initParameters.get(name); @@ -601,6 +606,25 @@ public class MockServletContext implements ServletContext { return this.responseCharacterEncoding; } + /** + * Add a {@link FilterRegistration}. + * @since 6.2 + */ + public void addFilterRegistration(FilterRegistration registration) { + this.filterRegistrations.put(registration.getName(), registration); + } + + @Override + @Nullable + public FilterRegistration getFilterRegistration(String filterName) { + return this.filterRegistrations.get(filterName); + } + + @Override + public Map getFilterRegistrations() { + return Collections.unmodifiableMap(this.filterRegistrations); + } + //--------------------------------------------------------------------- // Unsupported Servlet 3.0 registration methods @@ -675,25 +699,6 @@ public class MockServletContext implements ServletContext { throw new UnsupportedOperationException(); } - /** - * This method always returns {@code null}. - * @see jakarta.servlet.ServletContext#getFilterRegistration(java.lang.String) - */ - @Override - @Nullable - public FilterRegistration getFilterRegistration(String filterName) { - return null; - } - - /** - * This method always returns an {@linkplain Collections#emptyMap empty map}. - * @see jakarta.servlet.ServletContext#getFilterRegistrations() - */ - @Override - public Map getFilterRegistrations() { - return Collections.emptyMap(); - } - @Override public void addListener(Class listenerClass) { throw new UnsupportedOperationException();