Skip to content

Commit 1eff7bd

Browse files
committed
Restore UaaWebApplicationInitializer
UaaWebApplicationInitializer was removed, and tomcat is not able to start the uaa app
1 parent 10d737e commit 1eff7bd

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package org.cloudfoundry.identity.uaa;
2+
3+
import jakarta.servlet.DispatcherType;
4+
import jakarta.servlet.FilterRegistration;
5+
import jakarta.servlet.ServletContext;
6+
import jakarta.servlet.ServletRegistration;
7+
import org.apache.catalina.core.ApplicationContext;
8+
import org.apache.catalina.core.ApplicationContextFacade;
9+
import org.apache.catalina.core.StandardContext;
10+
import org.apache.tomcat.util.descriptor.web.ErrorPage;
11+
import org.cloudfoundry.identity.uaa.impl.config.YamlServletProfileInitializer;
12+
import org.springframework.security.web.session.HttpSessionEventPublisher;
13+
import org.springframework.web.WebApplicationInitializer;
14+
import org.springframework.web.context.ContextLoaderListener;
15+
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
16+
import org.springframework.web.filter.DelegatingFilterProxy;
17+
import org.springframework.web.servlet.DispatcherServlet;
18+
19+
import java.lang.reflect.Field;
20+
import java.util.EnumSet;
21+
22+
import static org.springframework.util.ReflectionUtils.findField;
23+
import static org.springframework.util.ReflectionUtils.getField;
24+
25+
public class UaaWebApplicationInitializer implements WebApplicationInitializer {
26+
@Override
27+
public void onStartup(ServletContext servletContext) {
28+
HttpSessionEventPublisher publisher = new HttpSessionEventPublisher();
29+
servletContext.addListener(publisher);
30+
31+
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
32+
context.register(UaaApplicationConfiguration.class);
33+
context.setServletContext(servletContext);
34+
ContextLoaderListener contextLoaderListener = new ContextLoaderListener(context);
35+
contextLoaderListener.setContextInitializers(new YamlServletProfileInitializer());
36+
servletContext.addListener(contextLoaderListener);
37+
38+
//<filter-name>springSessionRepositoryFilter</filter-name>
39+
DelegatingFilterProxy springSessionRepositoryFilter = new DelegatingFilterProxy("springSessionRepositoryFilter", context);
40+
FilterRegistration.Dynamic springSessionRepositoryFilterRegistration = servletContext.addFilter(
41+
"springSessionRepositoryFilter", springSessionRepositoryFilter
42+
);
43+
springSessionRepositoryFilterRegistration.addMappingForUrlPatterns(
44+
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false, "/*"
45+
);
46+
47+
//<filter-name>aggregateSpringSecurityFilterChain</filter-name>
48+
DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy("springSecurityFilterChain", context);
49+
FilterRegistration.Dynamic springSecurityFilterChainRegistration = servletContext.addFilter(
50+
"springSecurityFilterChain", springSecurityFilterChain
51+
);
52+
springSecurityFilterChainRegistration.setInitParameter(
53+
"contextAttribute", "org.springframework.web.servlet.FrameworkServlet.CONTEXT.spring"
54+
);
55+
springSecurityFilterChainRegistration.addMappingForUrlPatterns(null, false, "/*");
56+
57+
//<servlet-name>spring</servlet-name>
58+
DispatcherServlet spring = new DispatcherServlet(context);
59+
spring.setDispatchTraceRequest(false);
60+
ServletRegistration.Dynamic springRegistration = servletContext.addServlet("spring", spring);
61+
springRegistration.setLoadOnStartup(1);
62+
springRegistration.addMapping("/");
63+
64+
//<error-page> from web.xml
65+
if (servletContext instanceof ApplicationContextFacade) {
66+
Field field = findField(ApplicationContextFacade.class, "context", ApplicationContext.class);
67+
field.setAccessible(true);
68+
ApplicationContext applicationContext = (ApplicationContext) getField(field, servletContext);
69+
70+
field = findField(ApplicationContext.class, "context", StandardContext.class);
71+
field.setAccessible(true);
72+
StandardContext standardContext = (StandardContext) getField(field, applicationContext);
73+
74+
ErrorPage error500 = new ErrorPage();
75+
error500.setErrorCode(500);
76+
error500.setLocation("/error500");
77+
standardContext.addErrorPage(error500);
78+
79+
ErrorPage error404 = new ErrorPage();
80+
error404.setErrorCode(404);
81+
error404.setLocation("/error404");
82+
standardContext.addErrorPage(error404);
83+
84+
ErrorPage error429 = new ErrorPage();
85+
error429.setErrorCode(429);
86+
error429.setLocation("/error429");
87+
standardContext.addErrorPage(error429);
88+
89+
ErrorPage error = new ErrorPage();
90+
error.setLocation("/error");
91+
standardContext.addErrorPage(error);
92+
}
93+
}
94+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.cloudfoundry.identity.uaa;
2+
3+
import jakarta.servlet.FilterRegistration;
4+
import jakarta.servlet.ServletContext;
5+
import jakarta.servlet.ServletException;
6+
import jakarta.servlet.ServletRegistration;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
import org.mockito.ArgumentCaptor;
10+
import org.mockito.ArgumentMatchers;
11+
import org.mockito.Mockito;
12+
import org.mockito.stubbing.Answer;
13+
import org.springframework.security.web.session.HttpSessionEventPublisher;
14+
import org.springframework.web.context.ConfigurableWebApplicationContext;
15+
import org.springframework.web.context.ContextLoaderListener;
16+
import org.springframework.web.context.support.StandardServletEnvironment;
17+
18+
import java.util.EventListener;
19+
import java.util.List;
20+
21+
import static org.assertj.core.api.Assertions.assertThat;
22+
import static org.mockito.ArgumentMatchers.anyString;
23+
import static org.mockito.Mockito.atLeastOnce;
24+
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.verify;
26+
import static org.mockito.Mockito.when;
27+
28+
class UaaWebApplicationInitializerTest {
29+
private UaaWebApplicationInitializer initializer;
30+
private ServletContext servletContext;
31+
32+
@BeforeEach
33+
void setup() {
34+
initializer = new UaaWebApplicationInitializer();
35+
ConfigurableWebApplicationContext context = mock(ConfigurableWebApplicationContext.class);
36+
StandardServletEnvironment environment = new StandardServletEnvironment();
37+
servletContext = mock(ServletContext.class);
38+
39+
when(context.getServletContext()).thenReturn(servletContext);
40+
when(context.getEnvironment()).thenReturn(environment);
41+
Mockito.doAnswer((Answer<Void>) invocation -> {
42+
System.err.println(invocation.getArguments()[0]);
43+
return null;
44+
}).when(servletContext).log(anyString());
45+
when(servletContext.getContextPath()).thenReturn("/context");
46+
47+
FilterRegistration.Dynamic filterRegistration = mock(FilterRegistration.Dynamic.class);
48+
when(servletContext.addFilter(anyString(), ArgumentMatchers.any(jakarta.servlet.Filter.class)))
49+
.thenReturn(filterRegistration);
50+
51+
ServletRegistration.Dynamic servletRegistration = mock(ServletRegistration.Dynamic.class);
52+
when(servletContext.addServlet(anyString(), ArgumentMatchers.any(jakarta.servlet.Servlet.class)))
53+
.thenReturn(servletRegistration);
54+
}
55+
56+
@Test
57+
void testServletContextListeners() throws ServletException {
58+
initializer.onStartup(servletContext);
59+
60+
ArgumentCaptor<EventListener> listenerArgumentCaptor = ArgumentCaptor.forClass(EventListener.class);
61+
verify(servletContext, atLeastOnce()).addListener(listenerArgumentCaptor.capture());
62+
List<EventListener> listeners = listenerArgumentCaptor.getAllValues();
63+
assertThat(listeners).hasSize(2);
64+
assertThat(listeners.getFirst()).isInstanceOf(HttpSessionEventPublisher.class);
65+
assertThat(listeners.get(1)).isInstanceOf(ContextLoaderListener.class);
66+
}
67+
}

0 commit comments

Comments
 (0)