Skip to content

Commit

Permalink
fix: avoid NPE in SpringApplicationConfigurationFactory (#850)
Browse files Browse the repository at this point in the history
fixes #844
  • Loading branch information
Denis authored Jun 23, 2021
1 parent b774bdb commit fe70cd9
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,8 @@

import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.vaadin.flow.server.VaadinContext;
import com.vaadin.flow.server.VaadinServletContext;
import com.vaadin.flow.server.frontend.FallbackChunk;
import com.vaadin.flow.server.startup.DefaultApplicationConfigurationFactory;

Expand All @@ -39,9 +37,8 @@ public class SpringApplicationConfigurationFactory
@Override
protected ApplicationConfigurationImpl doCreate(VaadinContext context,
FallbackChunk chunk, Map<String, String> properties) {
VaadinServletContext servletContext = (VaadinServletContext) context;
ApplicationContext appContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext.getContext());
ApplicationContext appContext = SpringLookupInitializer
.getApplicationContext(context);
Environment env = appContext.getBean(Environment.class);
// Collect any vaadin.XZY properties from application.properties
SpringServlet.PROPERTY_NAMES.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,14 @@ private void doInitialize(VaadinContext context,
super.initialize(context, services, bootstrap);
}

private WebApplicationContext getApplicationContext(VaadinContext context) {
/**
* Gets a {@link WebApplicationContext} instance for the {@code context}.
*
* @param context
* a Vaadin context
* @return a {@link WebApplicationContext} instance for the {@code context}
*/
static WebApplicationContext getApplicationContext(VaadinContext context) {
VaadinServletContext servletContext = (VaadinServletContext) context;
WebApplicationContext appContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext.getContext());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,22 +29,36 @@

import com.vaadin.flow.server.VaadinServletContext;
import com.vaadin.flow.server.startup.ApplicationConfiguration;
import com.vaadin.flow.spring.SpringLookupInitializer.SpringApplicationContextInit;

public class SpringApplicationConfigurationFactoryTest {

private WebApplicationContext webAppContext = Mockito
.mock(WebApplicationContext.class);

private VaadinServletContext context = Mockito
.mock(VaadinServletContext.class);

private ServletContext servletContext = Mockito.mock(ServletContext.class);

private VaadinServletContext context = new VaadinServletContext(
servletContext);

private Environment env = Mockito.mock(Environment.class);

private SpringApplicationConfigurationFactory factory = new SpringApplicationConfigurationFactory();

private Map<String, Object> map = new HashMap<>();

@Before
public void setUp() {
Mockito.when(context.getContext()).thenReturn(servletContext);
Mockito.doAnswer(invocation -> {
map.put(invocation.getArgument(0), invocation.getArgument(1));
return null;
}).when(servletContext).setAttribute(Mockito.anyString(),
Mockito.any());

Mockito.doAnswer(invocation -> {
return map.get(invocation.getArgument(0));
}).when(servletContext).getAttribute(Mockito.anyString());

Mockito.when(servletContext.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE))
.thenReturn(webAppContext);
Expand All @@ -54,8 +68,6 @@ public void setUp() {

@Test
public void doCreate_vaadinApplicationConfigurationHasSpringPropertiesPrefixedByVaadin() {
SpringApplicationConfigurationFactory factory = new SpringApplicationConfigurationFactory();

String prefix = "foo_";
SpringServlet.PROPERTY_NAMES.stream()
.forEach(name -> Mockito.when(env.getProperty("vaadin." + name))
Expand All @@ -77,4 +89,17 @@ public void doCreate_vaadinApplicationConfigurationHasSpringPropertiesPrefixedBy

Assert.assertEquals(SpringServlet.PROPERTY_NAMES.size(), props.size());
}

@Test
public void doCreate__servletContextIsNotYetAvailableViaSrpingUtils_vaadinApplicationConfigurationHasSpringPropertiesPrefixedByVaadin() {
Mockito.when(webAppContext.getServletContext())
.thenReturn(servletContext);
Mockito.when(servletContext.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE))
.thenReturn(null);

new SpringApplicationContextInit().setApplicationContext(webAppContext);

doCreate_vaadinApplicationConfigurationHasSpringPropertiesPrefixedByVaadin();
}
}

0 comments on commit fe70cd9

Please sign in to comment.