Skip to content

Commit 2a01f62

Browse files
mcollovatitltv
andauthored
fix: provide default MenuAccessControl instance (#460)
A MenuAccessControl instance is required when operating with MenuConfiguration. This change provides a default implementation if the user project does not define a specialized bean. Co-authored-by: Tomi Virtanen <tltv@vaadin.com>
1 parent 5f9e2e7 commit 2a01f62

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

vaadin-cdi/src/main/java/com/vaadin/cdi/AbstractCdiInstantiator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.vaadin.flow.di.Instantiator;
2828
import com.vaadin.flow.i18n.I18NProvider;
2929
import com.vaadin.flow.server.VaadinServiceInitListener;
30+
import com.vaadin.flow.server.auth.MenuAccessControl;
3031

3132
abstract public class AbstractCdiInstantiator implements Instantiator {
3233

@@ -78,6 +79,13 @@ public I18NProvider getI18NProvider() {
7879
return lookup.lookupOrElseGet(getDelegate()::getI18NProvider);
7980
}
8081

82+
@Override
83+
public MenuAccessControl getMenuAccessControl() {
84+
final BeanLookup<MenuAccessControl> lookup = new BeanLookup<>(
85+
getBeanManager(), MenuAccessControl.class, BeanLookup.SERVICE);
86+
return lookup.lookupOrElseGet(getDelegate()::getMenuAccessControl);
87+
}
88+
8189
private static Logger getLogger() {
8290
return LoggerFactory.getLogger(CdiInstantiator.class);
8391
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.vaadin.cdi;
2+
3+
import jakarta.enterprise.inject.spi.BeanManager;
4+
import jakarta.inject.Inject;
5+
6+
import org.jboss.weld.junit5.EnableWeld;
7+
import org.jboss.weld.junit5.WeldInitiator;
8+
import org.jboss.weld.junit5.WeldSetup;
9+
import org.junit.jupiter.api.AfterEach;
10+
import org.junit.jupiter.api.Assertions;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
14+
import com.vaadin.cdi.annotation.VaadinServiceEnabled;
15+
import com.vaadin.cdi.annotation.VaadinServiceScoped;
16+
import com.vaadin.cdi.context.ServiceUnderTestContext;
17+
import com.vaadin.cdi.context.VaadinServiceScopedContext;
18+
import com.vaadin.flow.di.Instantiator;
19+
import com.vaadin.flow.server.VaadinService;
20+
import com.vaadin.flow.server.auth.DefaultMenuAccessControl;
21+
import com.vaadin.flow.server.auth.MenuAccessControl;
22+
23+
@EnableWeld
24+
public class CdiInstantiatorDefaultsTest {
25+
26+
@WeldSetup
27+
public WeldInitiator weld = WeldInitiator.from(
28+
CdiInstantiatorFactory.class, CdiInstantiator.class,
29+
VaadinServiceScopedContext.ContextualStorageManager.class
30+
).activate(VaadinServiceScoped.class).build();
31+
32+
@Inject
33+
private BeanManager beanManager;
34+
35+
@Inject
36+
@VaadinServiceEnabled
37+
private CdiInstantiatorFactory instantiatorFactory;
38+
39+
private Instantiator instantiator;
40+
41+
private ServiceUnderTestContext serviceUnderTestContext;
42+
43+
@BeforeEach
44+
public void setUp() {
45+
serviceUnderTestContext = new ServiceUnderTestContext(beanManager);
46+
serviceUnderTestContext.activate();
47+
instantiator = instantiatorFactory.createInstantitor(VaadinService.getCurrent());
48+
}
49+
50+
@AfterEach
51+
public void tearDown() {
52+
serviceUnderTestContext.tearDownAll();
53+
}
54+
55+
@Test
56+
public void getMenuAccessControl_beanNotProvided_instanceReturned() {
57+
MenuAccessControl menuAccessControl = instantiator
58+
.getMenuAccessControl();
59+
Assertions.assertNotNull(menuAccessControl);
60+
Assertions.assertInstanceOf(DefaultMenuAccessControl.class, menuAccessControl);
61+
}
62+
}

vaadin-cdi/src/test/java/com/vaadin/cdi/CdiInstantiatorTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import com.vaadin.flow.internal.UsageStatistics;
3939
import com.vaadin.flow.server.ServiceInitEvent;
4040
import com.vaadin.flow.server.VaadinService;
41+
import com.vaadin.flow.server.auth.MenuAccessControl;
42+
4143
import org.junit.jupiter.api.AfterEach;
4244
import org.junit.jupiter.api.Assertions;
4345
import org.junit.jupiter.api.BeforeEach;
@@ -111,6 +113,21 @@ public String getTranslation(String key, Locale locale,
111113

112114
}
113115

116+
@VaadinServiceEnabled
117+
public static class TestMenuAccessControl implements MenuAccessControl {
118+
119+
@Override
120+
public void setPopulateClientSideMenu(
121+
PopulateClientMenu populateClientSideMenu) {
122+
123+
}
124+
125+
@Override
126+
public PopulateClientMenu getPopulateClientSideMenu() {
127+
return null;
128+
}
129+
}
130+
114131
@Singleton
115132
public static class ServiceInitObserver {
116133

@@ -162,6 +179,14 @@ public void getI18NProvider_beanEnabled_instanceReturned() {
162179
Assertions.assertTrue((i18NProvider instanceof I18NTestProvider));
163180
}
164181

182+
@Test
183+
public void getMenuAccessControl_beanEnabled_instanceReturned() {
184+
MenuAccessControl menuAccessControl = instantiator
185+
.getMenuAccessControl();
186+
Assertions.assertNotNull(menuAccessControl);
187+
Assertions.assertInstanceOf(TestMenuAccessControl.class, menuAccessControl);
188+
}
189+
165190
@Test
166191
public void getServiceInitListeners_javaSPIListenerExists_containsJavaSPIListener() {
167192
Assertions.assertTrue(instantiator.getServiceInitListeners().anyMatch(

0 commit comments

Comments
 (0)