From 474ba33bdf3c9d384d93f9a54dbe9e388f9e787d Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:55:51 +0000 Subject: [PATCH 1/8] test: specify Keycloak realm and client role mapping Captures the intended contract for porting the SSO Kit Keycloak role mapper into vaadin-spring: realm and client roles become prefixed role authorities, other clients' roles are ignored, the role prefix is configurable, and an access token that is not a decodable JWT degrades to a user without role authorities instead of failing the login. The test does not compile yet - KeycloakOidcUserMapper is added once the opt-in mechanism is agreed on. --- .../security/KeycloakOidcUserMapperTest.java | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java new file mode 100644 index 00000000000..6ebe6658cfa --- /dev/null +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java @@ -0,0 +1,197 @@ +/* + * Copyright 2000-2026 Vaadin Ltd. + * + * 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 + * + * http://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 com.vaadin.flow.spring.security; + +import java.time.Instant; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserSource; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.ClientRegistration.ProviderDetails; +import org.springframework.security.oauth2.client.registration.ClientRegistration.ProviderDetails.UserInfoEndpoint; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.oidc.OidcIdToken; +import org.springframework.security.oauth2.core.oidc.OidcUserInfo; +import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority; +import org.springframework.security.oauth2.jwt.BadJwtException; +import org.springframework.security.oauth2.jwt.Jwt; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +/** + * Specification of the opt-in mapping of Keycloak realm and client roles to + * Spring Security granted authorities. + */ +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class KeycloakOidcUserMapperTest { + + private static final String CLIENT_ID = "test-client"; + + private static final String ISSUER_URI = "http://localhost:8080/realms/test"; + + @Mock + private OidcUserSource userSource; + + @Mock + private OidcUserRequest userRequest; + + @Mock + private OidcUserInfo userInfo; + + @Mock + private OidcIdToken idToken; + + @Mock + private ClientRegistration clientRegistration; + + @Mock + private ProviderDetails providerDetails; + + @Mock + private UserInfoEndpoint userInfoEndpoint; + + @Mock + private OAuth2AccessToken accessToken; + + private final Map accessTokenClaims = new HashMap<>(); + + private final AtomicInteger decoderFactoryCalls = new AtomicInteger(); + + private KeycloakOidcUserMapper mapper; + + @BeforeEach + void setup() { + mapper = new KeycloakOidcUserMapper(null, registration -> { + decoderFactoryCalls.incrementAndGet(); + return this::decode; + }); + + when(userSource.getUserRequest()).thenReturn(userRequest); + when(userSource.getUserInfo()).thenReturn(userInfo); + when(userRequest.getClientRegistration()) + .thenReturn(clientRegistration); + when(userRequest.getAccessToken()).thenReturn(accessToken); + when(userRequest.getIdToken()).thenReturn(idToken); + when(clientRegistration.getRegistrationId()).thenReturn("keycloak"); + when(clientRegistration.getClientId()).thenReturn(CLIENT_ID); + when(clientRegistration.getProviderDetails()) + .thenReturn(providerDetails); + when(providerDetails.getUserInfoEndpoint()) + .thenReturn(userInfoEndpoint); + when(accessToken.getTokenValue()).thenReturn("token"); + when(accessToken.getScopes()).thenReturn(Set.of("openid", "profile")); + when(idToken.getClaims()) + .thenReturn(Map.of("sub", "user-123", "iss", ISSUER_URI)); + } + + @Test + void convert_realmAndClientRolesAndScopesMapped() { + accessTokenClaims.put("realm_access", + Map.of("roles", List.of("admin", "user"))); + accessTokenClaims.put("resource_access", + Map.of(CLIENT_ID, Map.of("roles", List.of("manage-account")))); + + var authorities = authorities(); + + assertThat(authorities).contains("ROLE_admin", "ROLE_user", + "ROLE_manage-account", "SCOPE_openid", "SCOPE_profile"); + assertThat(mapper.convert(userSource).getAuthorities()) + .hasAtLeastOneElementOfType(OidcUserAuthority.class); + } + + @Test + void convert_otherClientRolesAndMissingClaimsIgnored() { + accessTokenClaims.put("resource_access", + Map.of("other-client", Map.of("roles", List.of("other-role")))); + + assertThat(authorities()).noneMatch(a -> a.startsWith("ROLE_")); + } + + @Test + void convert_customRolePrefixAppliedToRolesOnly() { + mapper = new KeycloakOidcUserMapper("AUTHORITY_", + registration -> this::decode); + accessTokenClaims.put("realm_access", + Map.of("roles", List.of("admin"))); + + assertThat(authorities()).contains("AUTHORITY_admin", "SCOPE_openid") + .doesNotContain("ROLE_admin"); + } + + @Test + void convert_accessTokenNotAJwt_mappedWithoutRoles() { + mapper = new KeycloakOidcUserMapper(null, registration -> token -> { + throw new BadJwtException("not a JWT"); + }); + + var authorities = authorities(); + + assertThat(authorities).noneMatch(a -> a.startsWith("ROLE_")); + assertThat(authorities).contains("SCOPE_openid"); + } + + @Test + void convert_userNameAttributeUsedAsName() { + when(userInfoEndpoint.getUserNameAttributeName()) + .thenReturn("preferred_username"); + when(idToken.getClaims()).thenReturn(Map.of("sub", "user-123", "iss", + ISSUER_URI, "preferred_username", "john")); + + assertThat(mapper.convert(userSource).getName()).isEqualTo("john"); + } + + @Test + void convert_decoderCreatedOncePerClientRegistration() { + mapper.convert(userSource); + mapper.convert(userSource); + + assertThat(decoderFactoryCalls).hasValue(1); + } + + private List authorities() { + return mapper.convert(userSource).getAuthorities().stream() + .map(GrantedAuthority::getAuthority).toList(); + } + + private Jwt decode(String tokenValue) { + var issuedAt = Instant.parse("2026-01-01T00:00:00Z"); + // @formatter:off + return Jwt.withTokenValue(tokenValue) + .header("alg", "RS256") + .issuer(ISSUER_URI) + .issuedAt(issuedAt) + .expiresAt(issuedAt.plusSeconds(60)) + .subject("user-123") + .claims(claims -> claims.putAll(accessTokenClaims)) + .build(); + // @formatter:on + } +} From b858fd088d15f945bdafeacddf84ae559851d40c Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:07:39 +0000 Subject: [PATCH 2/8] feat(spring): add opt-in Keycloak role mapping to VaadinSecurityConfigurer Keycloak carries realm and client roles in the access token, so they are not part of the OidcUser that OidcUserService builds and role-based access control does not see them. KeycloakOidcUserMapper, ported from SSO Kit, decodes the access token and maps those roles, and VaadinSecurityConfigurer.keycloakRoleMapping() opts in to it for a single security filter chain. Compared to the SSO Kit version, the mapper reuses the JWT decoder of a client registration instead of building one per login, takes the role prefix from VaadinRolePrefixHolder instead of hardcoding ROLE_, and maps a user without roles rather than failing the login when the access token is not a decodable JWT. --- .../security/KeycloakOidcUserMapper.java | 216 ++++++++++++++++++ .../security/VaadinSecurityConfigurer.java | 60 +++++ .../VaadinSecurityConfigurerTest.java | 31 +++ 3 files changed, 307 insertions(+) create mode 100644 vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java new file mode 100644 index 00000000000..12304cbd283 --- /dev/null +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java @@ -0,0 +1,216 @@ +/* + * Copyright 2000-2026 Vaadin Ltd. + * + * 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 + * + * http://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 com.vaadin.flow.spring.security; + +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.convert.converter.Converter; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserSource; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.jwt.JwtDecoderFactory; +import org.springframework.security.oauth2.jwt.JwtException; +import org.springframework.security.oauth2.jwt.JwtValidators; +import org.springframework.security.oauth2.jwt.NimbusJwtDecoder; +import org.springframework.util.StringUtils; + +/** + * Maps Keycloak realm and client roles to Spring Security granted authorities. + *

+ * Keycloak puts the roles of a user into the access token rather than into the + * ID token, so they are not part of the {@link OidcUser} that + * {@link OidcUserService} builds by default. This converter decodes the access + * token and adds + *

+ * Realm and client roles both become role authorities, using the role prefix of + * the application ({@code ROLE_} unless a + * {@link org.springframework.security.config.core.GrantedAuthorityDefaults} + * bean says otherwise), so that {@code @RolesAllowed("admin")} and + * {@code hasRole("admin")} match a Keycloak role named {@code admin}. Roles + * that {@code resource_access} grants for other clients are ignored. + *

+ * An access token that is not a JWT, or that this application is not allowed to + * decode, is not an error: the user is mapped without any role authorities, as + * the default {@link OidcUserService} would do. + *

+ * The recommended way to use this converter is + * {@link VaadinSecurityConfigurer#keycloakRoleMapping()}, which installs it for + * a single security filter chain. Applications that build their own + * {@link OidcUserService} can install it directly: + * + *

+ * 
+ * var oidcUserService = new OidcUserService();
+ * oidcUserService.setOidcUserConverter(new KeycloakOidcUserMapper());
+ * 
+ * 
+ * + * @author Vaadin Ltd + * @since 25.4 + */ +public class KeycloakOidcUserMapper + implements Converter { + + private static final Logger LOGGER = LoggerFactory + .getLogger(KeycloakOidcUserMapper.class); + + static final String REALM_ACCESS_CLAIM = "realm_access"; + + static final String RESOURCE_ACCESS_CLAIM = "resource_access"; + + static final String ROLES_CLAIM = "roles"; + + static final String DEFAULT_ROLE_PREFIX = "ROLE_"; + + static final String SCOPE_PREFIX = "SCOPE_"; + + private final String rolePrefix; + + private final JwtDecoderFactory decoderFactory; + + private final Map decoders = new ConcurrentHashMap<>(); + + /** + * Creates a mapper that prefixes roles with {@code ROLE_}. + */ + public KeycloakOidcUserMapper() { + this(null); + } + + /** + * Creates a mapper that prefixes roles with the given prefix. + * + * @param rolePrefix + * the prefix to add to a Keycloak role name, or {@code null} to + * use {@code ROLE_} + */ + public KeycloakOidcUserMapper(String rolePrefix) { + this(rolePrefix, KeycloakOidcUserMapper::createDecoder); + } + + KeycloakOidcUserMapper(String rolePrefix, + JwtDecoderFactory decoderFactory) { + this.rolePrefix = rolePrefix != null ? rolePrefix : DEFAULT_ROLE_PREFIX; + this.decoderFactory = decoderFactory; + } + + @Override + public OidcUser convert(OidcUserSource userSource) { + var userRequest = userSource.getUserRequest(); + var userInfo = userSource.getUserInfo(); + var idToken = userRequest.getIdToken(); + var accessToken = userRequest.getAccessToken(); + var clientRegistration = userRequest.getClientRegistration(); + var authorities = new LinkedHashSet(); + accessToken.getScopes().stream() + .map(scope -> new SimpleGrantedAuthority(SCOPE_PREFIX + scope)) + .forEach(authorities::add); + decodeAccessToken(clientRegistration, accessToken.getTokenValue()) + .ifPresent(jwt -> collectRoles(jwt, + clientRegistration.getClientId(), authorities)); + var userNameAttributeName = clientRegistration.getProviderDetails() + .getUserInfoEndpoint().getUserNameAttributeName(); + if (StringUtils.hasText(userNameAttributeName)) { + authorities.add(new OidcUserAuthority(idToken, userInfo, + userNameAttributeName)); + return new DefaultOidcUser(authorities, idToken, + userNameAttributeName); + } + authorities.add(new OidcUserAuthority(idToken, userInfo)); + return new DefaultOidcUser(authorities, idToken, userInfo); + } + + private void collectRoles(Jwt accessToken, String clientId, + Set authorities) { + if (accessToken.hasClaim(REALM_ACCESS_CLAIM)) { + extractRoles(accessToken.getClaimAsMap(REALM_ACCESS_CLAIM)) + .forEach(role -> authorities.add(toRoleAuthority(role))); + } + if (accessToken.hasClaim(RESOURCE_ACCESS_CLAIM)) { + var resourceAccess = accessToken + .getClaimAsMap(RESOURCE_ACCESS_CLAIM); + var clientAccess = asMap(resourceAccess.get(clientId)); + extractRoles(clientAccess) + .forEach(role -> authorities.add(toRoleAuthority(role))); + } + } + + /** + * Decodes the access token with the decoder of the given client + * registration, which is created on first use and then reused. + */ + private Optional decodeAccessToken(ClientRegistration registration, + String tokenValue) { + try { + var decoder = decoders.computeIfAbsent( + registration.getRegistrationId(), + id -> decoderFactory.createDecoder(registration)); + return Optional.of(decoder.decode(tokenValue)); + } catch (JwtException e) { + LOGGER.debug( + "The access token of client registration '{}' could not be " + + "decoded as a JWT, so no Keycloak roles are " + + "mapped for it", + registration.getRegistrationId(), e); + return Optional.empty(); + } + } + + private GrantedAuthority toRoleAuthority(String role) { + return new SimpleGrantedAuthority(rolePrefix + role); + } + + @SuppressWarnings("unchecked") + private static List extractRoles(Map access) { + var roles = access.get(ROLES_CLAIM); + return roles instanceof List ? (List) roles : List.of(); + } + + @SuppressWarnings("unchecked") + private static Map asMap(Object value) { + return value instanceof Map map ? (Map) map + : Collections.emptyMap(); + } + + private static JwtDecoder createDecoder(ClientRegistration registration) { + var providerDetails = registration.getProviderDetails(); + var decoder = NimbusJwtDecoder + .withJwkSetUri(providerDetails.getJwkSetUri()).build(); + decoder.setJwtValidator(JwtValidators + .createDefaultWithIssuer(providerDetails.getIssuerUri())); + return decoder; + } +} diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java index 1bd85fe255d..183c7e92496 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java @@ -42,6 +42,7 @@ import org.springframework.security.config.annotation.web.configurers.LogoutConfigurer; import org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer; import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.web.access.AccessDeniedHandler; @@ -133,6 +134,8 @@ *
  • {@link VaadinDefaultRequestCache}
  • *
  • {@link VaadinSavedRequestAwareAuthenticationSuccessHandler}
  • *
  • {@link ClientRegistrationRepository}
  • + *
  • {@link OidcUserService}, when Keycloak role mapping is enabled with + * {@link #keycloakRoleMapping()}
  • * * * @since 24.8 @@ -159,6 +162,8 @@ public final class VaadinSecurityConfigurer private String postLogoutRedirectUri; + private boolean keycloakRoleMapping = false; + private boolean enableCsrfConfiguration = true; private boolean enableLogoutConfiguration = true; @@ -316,6 +321,33 @@ public VaadinSecurityConfigurer oauth2LoginPage(String oauth2LoginPage, return this; } + /** + * Enables mapping of Keycloak realm and client roles to Spring Security + * granted authorities (disabled by default). + *

    + * Keycloak puts the roles of a user into the access token, so they are not + * part of the authenticated user by default. This opts in to decoding the + * access token and mapping its roles, which makes + * {@code @RolesAllowed("admin")} and {@code hasRole("admin")} match a + * Keycloak role named {@code admin}. See {@link KeycloakOidcUserMapper} for + * what exactly is mapped. + *

    + * Works only together with {@link #oauth2LoginPage(String)} and its + * overloads, and replaces the {@link OidcUserService} that this security + * filter chain uses to load the authenticated user. An application that + * needs to customize that service can share its own instance with + * {@code HttpSecurity.setSharedObject(OidcUserService.class, service)}, + * which is then used instead of a new one. + * + * @return the current configurer instance for method chaining + * @see KeycloakOidcUserMapper + * @since 25.4 + */ + public VaadinSecurityConfigurer keycloakRoleMapping() { + this.keycloakRoleMapping = true; + return this; + } + /** * Sets the default success URL after authentication. Redirected only when * no protected page was previously accessed. Works only together with @@ -553,7 +585,18 @@ public void init(HttpSecurity http) { http.oauth2Login(configurer -> { configurer.loginPage(oauth2LoginPage).permitAll(); configurer.successHandler(getAuthenticationSuccessHandler()); + if (keycloakRoleMapping) { + var oidcUserService = getKeycloakOidcUserService(); + configurer.userInfoEndpoint(userInfoEndpoint -> { + userInfoEndpoint.oidcUserService(oidcUserService); + }); + } }); + } else if (keycloakRoleMapping) { + LOGGER.warn( + "Keycloak role mapping is enabled but no OAuth2 login page " + + "is configured, so it has no effect. Configure " + + "one with VaadinSecurityConfigurer.oauth2LoginPage()."); } if (enableCsrfConfiguration) { http.csrf(this::customizeCsrf); @@ -742,6 +785,23 @@ private VaadinDefaultRequestCache getVaadinDefaultRequestCache() { return getSharedObjectOrBean(VaadinDefaultRequestCache.class); } + private OidcUserService getKeycloakOidcUserService() { + var oidcUserService = getSharedObject(OidcUserService.class) + .orElseGet(OidcUserService::new); + oidcUserService.setOidcUserConverter( + new KeycloakOidcUserMapper(getRolePrefix())); + setSharedObject(OidcUserService.class, oidcUserService); + return oidcUserService; + } + + private String getRolePrefix() { + var rolePrefixHolder = getVaadinRolePrefixHolder(); + if (rolePrefixHolder != null && rolePrefixHolder.isSet()) { + return rolePrefixHolder.getRolePrefix(); + } + return null; + } + private VaadinSavedRequestAwareAuthenticationSuccessHandler getAuthenticationSuccessHandler() { return getSharedObject( VaadinSavedRequestAwareAuthenticationSuccessHandler.class) diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java index a7d0b8a7b77..40e35807b26 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java @@ -54,6 +54,7 @@ import org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter; import org.springframework.security.web.access.ExceptionTranslationFilter; @@ -181,6 +182,29 @@ void oauth2LoginPage_chainHasAuthenticationFilter() { OAuth2LoginAuthenticationFilter.class); } + @Test + void keycloakRoleMapping_withOAuth2LoginPage_oidcUserServiceMapsRoles() + throws Exception { + http.with(configurer, + c -> c.oauth2LoginPage("/oauth2/authorization/keycloak") + .keycloakRoleMapping()) + .build(); + + var oidcUserService = http.getSharedObject(OidcUserService.class); + + assertThat(oidcUserService).isNotNull(); + assertThat(getOidcUserConverter(oidcUserService)) + .isInstanceOf(KeycloakOidcUserMapper.class); + } + + @Test + void keycloakRoleMapping_withoutOAuth2LoginPage_notConfigured() { + http.with(configurer, VaadinSecurityConfigurer::keycloakRoleMapping) + .build(); + + assertNull(http.getSharedObject(OidcUserService.class)); + } + @Test void logoutSuccessHandler_handlerIsConfigured( @Mock LogoutSuccessHandler handler) { @@ -482,6 +506,13 @@ void defaultSuccessUrl_notSet_usesRootPath() throws Exception { } // Helper methods to access protected fields using reflection + private Object getOidcUserConverter(OidcUserService oidcUserService) + throws Exception { + var field = OidcUserService.class.getDeclaredField("oidcUserConverter"); + field.setAccessible(true); + return field.get(oidcUserService); + } + private String getDefaultTargetUrl( VaadinSavedRequestAwareAuthenticationSuccessHandler handler) throws Exception { From 1bd52c7149249a8a3b1d0ec01facb61bc6cc6095 Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:16:20 +0000 Subject: [PATCH 3/8] fix(spring): keep the userinfo claims when mapping Keycloak roles The mapper built DefaultOidcUser without the OidcUserInfo when the client registration configures a user-name attribute, which is the normal Keycloak setup. That dropped every userinfo claim from the authenticated user, and failed the login outright when the name attribute is only in the userinfo response and not in the ID token. Also resolve the role prefix when a user is mapped rather than while the filter chain is being built, since a prefix that comes from the chain itself is only known to VaadinRolePrefixHolder after configure() has run. --- flow-client/package-lock.json | 69 ------------------- .../security/KeycloakOidcUserMapper.java | 64 ++++++++++------- .../security/VaadinSecurityConfigurer.java | 19 +++-- .../spring/SpringClassesSerializableTest.java | 3 + .../security/KeycloakOidcUserMapperTest.java | 16 +++-- .../VaadinSecurityConfigurerTest.java | 39 +++++++++++ 6 files changed, 103 insertions(+), 107 deletions(-) diff --git a/flow-client/package-lock.json b/flow-client/package-lock.json index 8d4a5d408f7..509bc1be634 100644 --- a/flow-client/package-lock.json +++ b/flow-client/package-lock.json @@ -1512,9 +1512,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1529,9 +1526,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1546,9 +1540,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1563,9 +1554,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1580,9 +1568,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1597,9 +1582,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1614,9 +1596,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1631,9 +1610,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1648,9 +1624,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1665,9 +1638,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1682,9 +1652,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1699,9 +1666,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1716,9 +1680,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3227,9 +3188,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3244,9 +3202,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3261,9 +3216,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3278,9 +3230,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3295,9 +3244,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3312,9 +3258,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3329,9 +3272,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3346,9 +3286,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3363,9 +3300,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3380,9 +3314,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java index 12304cbd283..0365752fc20 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java @@ -22,6 +22,8 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; +import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,17 +89,17 @@ public class KeycloakOidcUserMapper private static final Logger LOGGER = LoggerFactory .getLogger(KeycloakOidcUserMapper.class); - static final String REALM_ACCESS_CLAIM = "realm_access"; + private static final String REALM_ACCESS_CLAIM = "realm_access"; - static final String RESOURCE_ACCESS_CLAIM = "resource_access"; + private static final String RESOURCE_ACCESS_CLAIM = "resource_access"; - static final String ROLES_CLAIM = "roles"; + private static final String ROLES_CLAIM = "roles"; - static final String DEFAULT_ROLE_PREFIX = "ROLE_"; + private static final String DEFAULT_ROLE_PREFIX = "ROLE_"; - static final String SCOPE_PREFIX = "SCOPE_"; + private static final String SCOPE_PREFIX = "SCOPE_"; - private final String rolePrefix; + private final Supplier rolePrefix; private final JwtDecoderFactory decoderFactory; @@ -107,7 +109,7 @@ public class KeycloakOidcUserMapper * Creates a mapper that prefixes roles with {@code ROLE_}. */ public KeycloakOidcUserMapper() { - this(null); + this((String) null); } /** @@ -118,12 +120,23 @@ public KeycloakOidcUserMapper() { * use {@code ROLE_} */ public KeycloakOidcUserMapper(String rolePrefix) { - this(rolePrefix, KeycloakOidcUserMapper::createDecoder); + this(() -> rolePrefix, KeycloakOidcUserMapper::createDecoder); } - KeycloakOidcUserMapper(String rolePrefix, + /** + * Creates a mapper that looks up the role prefix when it maps a user, for a + * caller that only knows the prefix after the security filter chain has + * been configured. + */ + static KeycloakOidcUserMapper withRolePrefixSupplier( + Supplier rolePrefix) { + return new KeycloakOidcUserMapper(rolePrefix, + KeycloakOidcUserMapper::createDecoder); + } + + KeycloakOidcUserMapper(Supplier rolePrefix, JwtDecoderFactory decoderFactory) { - this.rolePrefix = rolePrefix != null ? rolePrefix : DEFAULT_ROLE_PREFIX; + this.rolePrefix = rolePrefix != null ? rolePrefix : () -> null; this.decoderFactory = decoderFactory; } @@ -146,7 +159,7 @@ public OidcUser convert(OidcUserSource userSource) { if (StringUtils.hasText(userNameAttributeName)) { authorities.add(new OidcUserAuthority(idToken, userInfo, userNameAttributeName)); - return new DefaultOidcUser(authorities, idToken, + return new DefaultOidcUser(authorities, idToken, userInfo, userNameAttributeName); } authorities.add(new OidcUserAuthority(idToken, userInfo)); @@ -155,17 +168,12 @@ public OidcUser convert(OidcUserSource userSource) { private void collectRoles(Jwt accessToken, String clientId, Set authorities) { - if (accessToken.hasClaim(REALM_ACCESS_CLAIM)) { - extractRoles(accessToken.getClaimAsMap(REALM_ACCESS_CLAIM)) - .forEach(role -> authorities.add(toRoleAuthority(role))); - } - if (accessToken.hasClaim(RESOURCE_ACCESS_CLAIM)) { - var resourceAccess = accessToken - .getClaimAsMap(RESOURCE_ACCESS_CLAIM); - var clientAccess = asMap(resourceAccess.get(clientId)); - extractRoles(clientAccess) - .forEach(role -> authorities.add(toRoleAuthority(role))); - } + var claims = accessToken.getClaims(); + var resourceAccess = asMap(claims.get(RESOURCE_ACCESS_CLAIM)); + Stream.of(asMap(claims.get(REALM_ACCESS_CLAIM)), + asMap(resourceAccess.get(clientId))) + .flatMap(access -> extractRoles(access).stream()) + .map(this::toRoleAuthority).forEach(authorities::add); } /** @@ -190,7 +198,17 @@ private Optional decodeAccessToken(ClientRegistration registration, } private GrantedAuthority toRoleAuthority(String role) { - return new SimpleGrantedAuthority(rolePrefix + role); + return new SimpleGrantedAuthority(rolePrefix() + role); + } + + /** + * Returns the role prefix in use, resolved on every call so that a prefix + * that is only known once the security filter chain is fully configured is + * picked up. + */ + String rolePrefix() { + var prefix = rolePrefix.get(); + return prefix != null ? prefix : DEFAULT_ROLE_PREFIX; } @SuppressWarnings("unchecked") diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java index 183c7e92496..7aff92a76d4 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java @@ -788,20 +788,19 @@ private VaadinDefaultRequestCache getVaadinDefaultRequestCache() { private OidcUserService getKeycloakOidcUserService() { var oidcUserService = getSharedObject(OidcUserService.class) .orElseGet(OidcUserService::new); - oidcUserService.setOidcUserConverter( - new KeycloakOidcUserMapper(getRolePrefix())); + // The role prefix holder is only populated with the prefix of the + // filter chain in configure(), which runs after this, so the mapper + // reads it when it maps a user rather than now. + var rolePrefixHolder = getVaadinRolePrefixHolder(); + oidcUserService.setOidcUserConverter(KeycloakOidcUserMapper + .withRolePrefixSupplier(() -> rolePrefixHolder != null + && rolePrefixHolder.isSet() + ? rolePrefixHolder.getRolePrefix() + : null)); setSharedObject(OidcUserService.class, oidcUserService); return oidcUserService; } - private String getRolePrefix() { - var rolePrefixHolder = getVaadinRolePrefixHolder(); - if (rolePrefixHolder != null && rolePrefixHolder.isSet()) { - return rolePrefixHolder.getRolePrefix(); - } - return null; - } - private VaadinSavedRequestAwareAuthenticationSuccessHandler getAuthenticationSuccessHandler() { return getSharedObject( VaadinSavedRequestAwareAuthenticationSuccessHandler.class) diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java index d3681b4ba31..1ad860fd6a2 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java @@ -105,6 +105,9 @@ protected Stream getExcludedPatterns() { "com\\.vaadin\\.flow\\.spring\\.scopes\\.AbstractScope", "com\\.vaadin\\.flow\\.spring\\.scopes\\.VaadinUIScope", "com\\.vaadin\\.flow\\.spring\\.security\\.AuthenticationContext", + // Part of the security filter chain, not of session state, + // like the OidcUserService that holds it + "com\\.vaadin\\.flow\\.spring\\.security\\.KeycloakOidcUserMapper", "com\\.vaadin\\.flow\\.spring\\.security\\.NavigationAccessControlConfigurer", "com\\.vaadin\\.flow\\.spring\\.security\\.VaadinAwareSecurityContextHolderStrategy", "com\\.vaadin\\.flow\\.spring\\.security\\.VaadinAwareSecurityContextHolderStrategyConfiguration", diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java index 6ebe6658cfa..2c2faeb6fff 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java @@ -137,7 +137,7 @@ void convert_otherClientRolesAndMissingClaimsIgnored() { @Test void convert_customRolePrefixAppliedToRolesOnly() { - mapper = new KeycloakOidcUserMapper("AUTHORITY_", + mapper = new KeycloakOidcUserMapper(() -> "AUTHORITY_", registration -> this::decode); accessTokenClaims.put("realm_access", Map.of("roles", List.of("admin"))); @@ -159,13 +159,19 @@ void convert_accessTokenNotAJwt_mappedWithoutRoles() { } @Test - void convert_userNameAttributeUsedAsName() { + void convert_userNameAttributeUsedAsName_userInfoRetained() { when(userInfoEndpoint.getUserNameAttributeName()) .thenReturn("preferred_username"); - when(idToken.getClaims()).thenReturn(Map.of("sub", "user-123", "iss", - ISSUER_URI, "preferred_username", "john")); + when(userInfo.getClaims()).thenReturn(Map.of("preferred_username", + "john", "email", "john@example.com")); - assertThat(mapper.convert(userSource).getName()).isEqualTo("john"); + var user = mapper.convert(userSource); + + // The name attribute is only in the userinfo response, so dropping it + // would both lose claims and fail the login + assertThat(user.getName()).isEqualTo("john"); + assertThat(user.getUserInfo()).isSameAs(userInfo); + assertThat(user.getClaims()).containsEntry("email", "john@example.com"); } @Test diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java index 40e35807b26..2fbc18c20f7 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java @@ -67,6 +67,7 @@ import org.springframework.security.web.csrf.CsrfFilter; import org.springframework.security.web.savedrequest.RequestCacheAwareFilter; import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher; +import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.bean.override.mockito.MockitoBean; @@ -205,6 +206,44 @@ void keycloakRoleMapping_withoutOAuth2LoginPage_notConfigured() { assertNull(http.getSharedObject(OidcUserService.class)); } + @Test + void keycloakRoleMapping_sharedOidcUserService_isReused() throws Exception { + var sharedService = new OidcUserService(); + http.setSharedObject(OidcUserService.class, sharedService); + + http.with(configurer, + c -> c.oauth2LoginPage("/oauth2/authorization/keycloak") + .keycloakRoleMapping()) + .build(); + + assertThat(http.getSharedObject(OidcUserService.class)) + .isSameAs(sharedService); + assertThat(getOidcUserConverter(sharedService)) + .isInstanceOf(KeycloakOidcUserMapper.class); + } + + @Test + void keycloakRoleMapping_rolePrefixOfChain_isUsedForRoles() + throws Exception { + var rolePrefixHolder = new VaadinRolePrefixHolder(null); + http.setSharedObject(VaadinRolePrefixHolder.class, rolePrefixHolder); + + http.with(configurer, + c -> c.oauth2LoginPage("/oauth2/authorization/keycloak") + .keycloakRoleMapping()) + .build(); + // The prefix of the filter chain is only known to the holder after the + // chain has been configured, so the mapper must pick it up afterwards + var securityContextFilter = new SecurityContextHolderAwareRequestFilter(); + securityContextFilter.setRolePrefix("AUTHORITY_"); + rolePrefixHolder.resetRolePrefix(securityContextFilter); + + var mapper = (KeycloakOidcUserMapper) getOidcUserConverter( + http.getSharedObject(OidcUserService.class)); + + assertThat(mapper.rolePrefix()).isEqualTo("AUTHORITY_"); + } + @Test void logoutSuccessHandler_handlerIsConfigured( @Mock LogoutSuccessHandler handler) { From a0d32a6ee00a6543cacb007c408fb16635fb08b6 Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:27:00 +0000 Subject: [PATCH 4/8] chore: restore the unrelated flow-client lockfile change --- flow-client/package-lock.json | 69 +++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/flow-client/package-lock.json b/flow-client/package-lock.json index 509bc1be634..8d4a5d408f7 100644 --- a/flow-client/package-lock.json +++ b/flow-client/package-lock.json @@ -1512,6 +1512,9 @@ "arm" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1526,6 +1529,9 @@ "arm" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1540,6 +1546,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1554,6 +1563,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1568,6 +1580,9 @@ "loong64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1582,6 +1597,9 @@ "loong64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1596,6 +1614,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1610,6 +1631,9 @@ "ppc64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1624,6 +1648,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1638,6 +1665,9 @@ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1652,6 +1682,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1666,6 +1699,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1680,6 +1716,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3188,6 +3227,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3202,6 +3244,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3216,6 +3261,9 @@ "loong64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3230,6 +3278,9 @@ "loong64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3244,6 +3295,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3258,6 +3312,9 @@ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3272,6 +3329,9 @@ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3286,6 +3346,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3300,6 +3363,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3314,6 +3380,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ From b948240ea266369204ef9a9df164896cd58c5b14 Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:58:09 +0000 Subject: [PATCH 5/8] fix(spring): keep VaadinSecurityConfigurer usable without oauth2-client Referring to OidcUserService from VaadinSecurityConfigurer broke every application that configures Vaadin security without the optional spring-security-oauth2-client dependency: a class is verified as a whole when it is loaded, and proving that an OidcUserService may be passed as an OAuth2UserService made the verifier load types that were not there, so building the filter chain failed with a NoClassDefFoundError. Move the wiring to KeycloakRoleMapping, which is only loaded once an application asks for Keycloak role mapping and therefore has the dependency. The new test loads the configurer through a class loader that hides the dependency, so the same mistake fails in the unit tests instead of in the Spring Security integration tests. --- .../spring/security/KeycloakRoleMapping.java | 69 +++++++++++++++++++ .../security/VaadinSecurityConfigurer.java | 34 +++------ .../spring/SpringClassesSerializableTest.java | 1 + .../VaadinSecurityConfigurerTest.java | 64 +++++++++++++++++ 4 files changed, 145 insertions(+), 23 deletions(-) create mode 100644 vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java new file mode 100644 index 00000000000..733ca64e4ed --- /dev/null +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2026 Vaadin Ltd. + * + * 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 + * + * http://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 com.vaadin.flow.spring.security; + +import java.util.function.Supplier; + +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; + +/** + * Installs {@link KeycloakOidcUserMapper} into the {@link OidcUserService} of a + * security filter chain. + *

    + * This lives apart from {@link VaadinSecurityConfigurer} on purpose. The + * {@code spring-security-oauth2-client} dependency that {@link OidcUserService} + * comes from is optional, and a class is verified as a whole when it is loaded, + * so a reference to a type of that dependency in + * {@code VaadinSecurityConfigurer} would break every application that + * configures Vaadin security without it. Keeping the reference here means the + * class is only loaded by an application that asks for Keycloak role mapping, + * which needs the dependency anyway. + */ +final class KeycloakRoleMapping { + + private KeycloakRoleMapping() { + // Only static utility methods + } + + /** + * Makes the given OAuth2 login use an {@link OidcUserService} that maps + * Keycloak roles. + * + * @param loginConfigurer + * the OAuth2 login configurer to customize + * @param http + * the security builder to take a shared {@link OidcUserService} + * from, and to share the configured one with + * @param rolePrefix + * supplies the role prefix to use, resolved when a user is + * mapped + */ + static void apply(OAuth2LoginConfigurer loginConfigurer, + HttpSecurity http, Supplier rolePrefix) { + var oidcUserService = http.getSharedObject(OidcUserService.class); + if (oidcUserService == null) { + oidcUserService = new OidcUserService(); + } + oidcUserService.setOidcUserConverter( + KeycloakOidcUserMapper.withRolePrefixSupplier(rolePrefix)); + http.setSharedObject(OidcUserService.class, oidcUserService); + var userService = oidcUserService; + loginConfigurer.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint + .oidcUserService(userService)); + } +} diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java index 7aff92a76d4..8bca69c141c 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java @@ -42,7 +42,6 @@ import org.springframework.security.config.annotation.web.configurers.LogoutConfigurer; import org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer; import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer; -import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.web.access.AccessDeniedHandler; @@ -134,7 +133,7 @@ *

  • {@link VaadinDefaultRequestCache}
  • *
  • {@link VaadinSavedRequestAwareAuthenticationSuccessHandler}
  • *
  • {@link ClientRegistrationRepository}
  • - *
  • {@link OidcUserService}, when Keycloak role mapping is enabled with + *
  • {@code OidcUserService}, when Keycloak role mapping is enabled with * {@link #keycloakRoleMapping()}
  • * * @@ -333,7 +332,7 @@ public VaadinSecurityConfigurer oauth2LoginPage(String oauth2LoginPage, * what exactly is mapped. *

    * Works only together with {@link #oauth2LoginPage(String)} and its - * overloads, and replaces the {@link OidcUserService} that this security + * overloads, and replaces the {@code OidcUserService} that this security * filter chain uses to load the authenticated user. An application that * needs to customize that service can share its own instance with * {@code HttpSecurity.setSharedObject(OidcUserService.class, service)}, @@ -586,10 +585,15 @@ public void init(HttpSecurity http) { configurer.loginPage(oauth2LoginPage).permitAll(); configurer.successHandler(getAuthenticationSuccessHandler()); if (keycloakRoleMapping) { - var oidcUserService = getKeycloakOidcUserService(); - configurer.userInfoEndpoint(userInfoEndpoint -> { - userInfoEndpoint.oidcUserService(oidcUserService); - }); + // The role prefix holder is only populated with the prefix + // of the filter chain in configure(), which runs after + // this, so the prefix is resolved when a user is mapped + var rolePrefixHolder = getVaadinRolePrefixHolder(); + KeycloakRoleMapping.apply(configurer, getBuilder(), + () -> rolePrefixHolder != null + && rolePrefixHolder.isSet() + ? rolePrefixHolder.getRolePrefix() + : null); } }); } else if (keycloakRoleMapping) { @@ -785,22 +789,6 @@ private VaadinDefaultRequestCache getVaadinDefaultRequestCache() { return getSharedObjectOrBean(VaadinDefaultRequestCache.class); } - private OidcUserService getKeycloakOidcUserService() { - var oidcUserService = getSharedObject(OidcUserService.class) - .orElseGet(OidcUserService::new); - // The role prefix holder is only populated with the prefix of the - // filter chain in configure(), which runs after this, so the mapper - // reads it when it maps a user rather than now. - var rolePrefixHolder = getVaadinRolePrefixHolder(); - oidcUserService.setOidcUserConverter(KeycloakOidcUserMapper - .withRolePrefixSupplier(() -> rolePrefixHolder != null - && rolePrefixHolder.isSet() - ? rolePrefixHolder.getRolePrefix() - : null)); - setSharedObject(OidcUserService.class, oidcUserService); - return oidcUserService; - } - private VaadinSavedRequestAwareAuthenticationSuccessHandler getAuthenticationSuccessHandler() { return getSharedObject( VaadinSavedRequestAwareAuthenticationSuccessHandler.class) diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java index 1ad860fd6a2..9c890493e89 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/SpringClassesSerializableTest.java @@ -108,6 +108,7 @@ protected Stream getExcludedPatterns() { // Part of the security filter chain, not of session state, // like the OidcUserService that holds it "com\\.vaadin\\.flow\\.spring\\.security\\.KeycloakOidcUserMapper", + "com\\.vaadin\\.flow\\.spring\\.security\\.KeycloakRoleMapping", "com\\.vaadin\\.flow\\.spring\\.security\\.NavigationAccessControlConfigurer", "com\\.vaadin\\.flow\\.spring\\.security\\.VaadinAwareSecurityContextHolderStrategy", "com\\.vaadin\\.flow\\.spring\\.security\\.VaadinAwareSecurityContextHolderStrategyConfiguration", diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java index 2fbc18c20f7..e00e58a1624 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java @@ -18,6 +18,7 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; import java.lang.reflect.Method; import java.util.List; import java.util.Map; @@ -544,6 +545,69 @@ void defaultSuccessUrl_notSet_usesRootPath() throws Exception { assertThat(isAlwaysUseDefaultTargetUrl(handler)).isFalse(); } + @Test + void withoutOAuth2ClientOnClasspath_configurerStillLinks() { + // spring-security-oauth2-client is an optional dependency, and a class + // is verified as a whole when it is loaded, so a reference to one of + // its types here would break every application that does not have it + assertThatCode( + () -> Class.forName(VaadinSecurityConfigurer.class.getName(), + true, new OAuth2ClientHidingClassLoader())) + .doesNotThrowAnyException(); + } + + /** + * Loads the Vaadin security classes itself, so that they are verified + * against a classpath without {@code spring-security-oauth2-client}. + */ + private static class OAuth2ClientHidingClassLoader extends ClassLoader { + + private static final String HIDDEN_PACKAGE = "org.springframework.security.oauth2.client."; + + private static final String RELOADED_PACKAGE = "com.vaadin.flow.spring.security."; + + OAuth2ClientHidingClassLoader() { + super(VaadinSecurityConfigurer.class.getClassLoader()); + } + + @Override + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + if (name.startsWith(HIDDEN_PACKAGE)) { + throw new ClassNotFoundException(name); + } + if (name.startsWith(RELOADED_PACKAGE)) { + synchronized (getClassLoadingLock(name)) { + var loaded = findLoadedClass(name); + if (loaded == null) { + loaded = defineClass(name, readBytes(name)); + } + if (resolve) { + resolveClass(loaded); + } + return loaded; + } + } + return super.loadClass(name, resolve); + } + + private Class defineClass(String name, byte[] bytes) { + return defineClass(name, bytes, 0, bytes.length); + } + + private byte[] readBytes(String name) throws ClassNotFoundException { + var resource = name.replace('.', '/') + ".class"; + try (var stream = getParent().getResourceAsStream(resource)) { + if (stream == null) { + throw new ClassNotFoundException(name); + } + return stream.readAllBytes(); + } catch (IOException e) { + throw new ClassNotFoundException(name, e); + } + } + } + // Helper methods to access protected fields using reflection private Object getOidcUserConverter(OidcUserService oidcUserService) throws Exception { From 93b3ec3cd56fa334884e1db7849153fac02479be Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Tue, 15 Sep 2026 06:06:34 +0000 Subject: [PATCH 6/8] refactor(spring): simplify the Keycloak role mapping wiring Stop reusing an OidcUserService shared with the security builder: Spring Security looks up a bean of that type rather than a shared object, so the contract was new here and nothing set it, and taking over a service the application owns is surprising. The mapping now always creates its own service and shares it as an output, and a custom service is pointed at setOidcUserConverter instead. Also stop failing the login for a client registration configured with explicit endpoints, where the JWK set URI and the issuer URI are null: building the decoder threw an IllegalArgumentException, which is not a JwtException and so escaped the catch that maps a user without roles. --- .../security/KeycloakOidcUserMapper.java | 47 +++++++++++++------ .../spring/security/KeycloakRoleMapping.java | 38 +++++++-------- .../security/VaadinSecurityConfigurer.java | 16 +++---- .../security/KeycloakOidcUserMapperTest.java | 12 +++++ .../VaadinSecurityConfigurerTest.java | 16 ------- 5 files changed, 70 insertions(+), 59 deletions(-) diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java index 0365752fc20..2c39be00d55 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java @@ -109,7 +109,7 @@ public class KeycloakOidcUserMapper * Creates a mapper that prefixes roles with {@code ROLE_}. */ public KeycloakOidcUserMapper() { - this((String) null); + this(() -> null, KeycloakOidcUserMapper::createDecoder); } /** @@ -125,13 +125,15 @@ public KeycloakOidcUserMapper(String rolePrefix) { /** * Creates a mapper that looks up the role prefix when it maps a user, for a - * caller that only knows the prefix after the security filter chain has - * been configured. + * caller that only knows the prefix once the security filter chain has been + * configured. + * + * @param rolePrefix + * supplies the prefix to add to a Keycloak role name, may supply + * {@code null} to use {@code ROLE_} */ - static KeycloakOidcUserMapper withRolePrefixSupplier( - Supplier rolePrefix) { - return new KeycloakOidcUserMapper(rolePrefix, - KeycloakOidcUserMapper::createDecoder); + KeycloakOidcUserMapper(Supplier rolePrefix) { + this(rolePrefix, KeycloakOidcUserMapper::createDecoder); } KeycloakOidcUserMapper(Supplier rolePrefix, @@ -182,10 +184,17 @@ private void collectRoles(Jwt accessToken, String clientId, */ private Optional decodeAccessToken(ClientRegistration registration, String tokenValue) { + var decoder = decoders.computeIfAbsent(registration.getRegistrationId(), + id -> decoderFactory.createDecoder(registration)); + if (decoder == null) { + LOGGER.debug( + "Client registration '{}' has no JWK set URI, so its access " + + "token cannot be decoded and no Keycloak roles " + + "are mapped for it", + registration.getRegistrationId()); + return Optional.empty(); + } try { - var decoder = decoders.computeIfAbsent( - registration.getRegistrationId(), - id -> decoderFactory.createDecoder(registration)); return Optional.of(decoder.decode(tokenValue)); } catch (JwtException e) { LOGGER.debug( @@ -223,12 +232,22 @@ private static Map asMap(Object value) { : Collections.emptyMap(); } + /** + * Creates a decoder for the access tokens of the given client registration, + * or {@code null} when the registration has no JWK set URI to verify them + * against. + */ private static JwtDecoder createDecoder(ClientRegistration registration) { var providerDetails = registration.getProviderDetails(); - var decoder = NimbusJwtDecoder - .withJwkSetUri(providerDetails.getJwkSetUri()).build(); - decoder.setJwtValidator(JwtValidators - .createDefaultWithIssuer(providerDetails.getIssuerUri())); + var jwkSetUri = providerDetails.getJwkSetUri(); + if (!StringUtils.hasText(jwkSetUri)) { + return null; + } + var issuerUri = providerDetails.getIssuerUri(); + var decoder = NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build(); + decoder.setJwtValidator(StringUtils.hasText(issuerUri) + ? JwtValidators.createDefaultWithIssuer(issuerUri) + : JwtValidators.createDefault()); return decoder; } } diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java index 733ca64e4ed..6291568de2f 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakRoleMapping.java @@ -22,17 +22,20 @@ import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; /** - * Installs {@link KeycloakOidcUserMapper} into the {@link OidcUserService} of a - * security filter chain. + * Makes an OAuth2 login use an {@link OidcUserService} that maps Keycloak roles + * with {@link KeycloakOidcUserMapper}. *

    * This lives apart from {@link VaadinSecurityConfigurer} on purpose. The * {@code spring-security-oauth2-client} dependency that {@link OidcUserService} - * comes from is optional, and a class is verified as a whole when it is loaded, - * so a reference to a type of that dependency in - * {@code VaadinSecurityConfigurer} would break every application that - * configures Vaadin security without it. Keeping the reference here means the - * class is only loaded by an application that asks for Keycloak role mapping, - * which needs the dependency anyway. + * comes from is optional, and passing an {@code OidcUserService} to a parameter + * of type {@code OAuth2UserService} makes the verifier load the latter to check + * assignability. Doing that from {@code VaadinSecurityConfigurer} would break + * every application that configures Vaadin security without the dependency, + * because a class is verified as a whole when it is loaded. Keeping it here + * means the class is only loaded by an application that asks for Keycloak role + * mapping, which has the dependency anyway. + * + * @see VaadinSecurityConfigurer#keycloakRoleMapping() */ final class KeycloakRoleMapping { @@ -41,29 +44,24 @@ private KeycloakRoleMapping() { } /** - * Makes the given OAuth2 login use an {@link OidcUserService} that maps - * Keycloak roles. + * Sets an {@link OidcUserService} that maps Keycloak roles on the given + * OAuth2 login, and shares it so that it can be inspected or replaced. * * @param loginConfigurer * the OAuth2 login configurer to customize * @param http - * the security builder to take a shared {@link OidcUserService} - * from, and to share the configured one with + * the security builder to share the service with * @param rolePrefix * supplies the role prefix to use, resolved when a user is * mapped */ static void apply(OAuth2LoginConfigurer loginConfigurer, HttpSecurity http, Supplier rolePrefix) { - var oidcUserService = http.getSharedObject(OidcUserService.class); - if (oidcUserService == null) { - oidcUserService = new OidcUserService(); - } - oidcUserService.setOidcUserConverter( - KeycloakOidcUserMapper.withRolePrefixSupplier(rolePrefix)); + var oidcUserService = new OidcUserService(); + oidcUserService + .setOidcUserConverter(new KeycloakOidcUserMapper(rolePrefix)); http.setSharedObject(OidcUserService.class, oidcUserService); - var userService = oidcUserService; loginConfigurer.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint - .oidcUserService(userService)); + .oidcUserService(oidcUserService)); } } diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java index 8bca69c141c..470b79a8c8e 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurer.java @@ -332,11 +332,10 @@ public VaadinSecurityConfigurer oauth2LoginPage(String oauth2LoginPage, * what exactly is mapped. *

    * Works only together with {@link #oauth2LoginPage(String)} and its - * overloads, and replaces the {@code OidcUserService} that this security - * filter chain uses to load the authenticated user. An application that - * needs to customize that service can share its own instance with - * {@code HttpSecurity.setSharedObject(OidcUserService.class, service)}, - * which is then used instead of a new one. + * overloads, and sets the {@code OidcUserService} that this security filter + * chain uses to load the authenticated user. An application that has its + * own {@code OidcUserService} should leave this off and install the mapper + * on that service instead, as {@link KeycloakOidcUserMapper} shows. * * @return the current configurer instance for method chaining * @see KeycloakOidcUserMapper @@ -590,10 +589,9 @@ public void init(HttpSecurity http) { // this, so the prefix is resolved when a user is mapped var rolePrefixHolder = getVaadinRolePrefixHolder(); KeycloakRoleMapping.apply(configurer, getBuilder(), - () -> rolePrefixHolder != null - && rolePrefixHolder.isSet() - ? rolePrefixHolder.getRolePrefix() - : null); + rolePrefixHolder != null + ? rolePrefixHolder::getRolePrefix + : () -> null); } }); } else if (keycloakRoleMapping) { diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java index 2c2faeb6fff..718fa1cf558 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java @@ -174,6 +174,18 @@ void convert_userNameAttributeUsedAsName_userInfoRetained() { assertThat(user.getClaims()).containsEntry("email", "john@example.com"); } + @Test + void convert_registrationWithoutJwkSetUri_mappedWithoutRoles() { + // A registration configured with explicit endpoints has no JWK set URI + // and no issuer URI, which the default decoder must not choke on + mapper = new KeycloakOidcUserMapper(); + + var authorities = authorities(); + + assertThat(authorities).noneMatch(a -> a.startsWith("ROLE_")); + assertThat(authorities).contains("SCOPE_openid"); + } + @Test void convert_decoderCreatedOncePerClientRegistration() { mapper.convert(userSource); diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java index e00e58a1624..8d90eefb75c 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinSecurityConfigurerTest.java @@ -207,22 +207,6 @@ void keycloakRoleMapping_withoutOAuth2LoginPage_notConfigured() { assertNull(http.getSharedObject(OidcUserService.class)); } - @Test - void keycloakRoleMapping_sharedOidcUserService_isReused() throws Exception { - var sharedService = new OidcUserService(); - http.setSharedObject(OidcUserService.class, sharedService); - - http.with(configurer, - c -> c.oauth2LoginPage("/oauth2/authorization/keycloak") - .keycloakRoleMapping()) - .build(); - - assertThat(http.getSharedObject(OidcUserService.class)) - .isSameAs(sharedService); - assertThat(getOidcUserConverter(sharedService)) - .isInstanceOf(KeycloakOidcUserMapper.class); - } - @Test void keycloakRoleMapping_rolePrefixOfChain_isUsedForRoles() throws Exception { From 8989a5d35824c35287862d2e653a2480badea6f0 Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Tue, 15 Sep 2026 06:11:13 +0000 Subject: [PATCH 7/8] fix(spring): cache the absence of a Keycloak access token decoder A client registration without a JWK set URI has no decoder, and computeIfAbsent stores no mapping for a null result, so one was built again on every login. Store an Optional so the lookup happens once, as the javadoc says it does. Also cover the client registration that has a JWK set URI but no issuer URI: building the default validator for a null issuer throws an IllegalArgumentException, which no test reached. --- .../security/KeycloakOidcUserMapper.java | 13 ++++++++---- .../security/KeycloakOidcUserMapperTest.java | 21 +++++++++++++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java index 2c39be00d55..a5bfcb5de61 100644 --- a/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java +++ b/vaadin-spring/src/main/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapper.java @@ -103,7 +103,11 @@ public class KeycloakOidcUserMapper private final JwtDecoderFactory decoderFactory; - private final Map decoders = new ConcurrentHashMap<>(); + /** + * Decoders by registration id, empty for a registration that has no + * decoder, so that one is not built again on every login. + */ + private final Map> decoders = new ConcurrentHashMap<>(); /** * Creates a mapper that prefixes roles with {@code ROLE_}. @@ -185,8 +189,9 @@ private void collectRoles(Jwt accessToken, String clientId, private Optional decodeAccessToken(ClientRegistration registration, String tokenValue) { var decoder = decoders.computeIfAbsent(registration.getRegistrationId(), - id -> decoderFactory.createDecoder(registration)); - if (decoder == null) { + id -> Optional.ofNullable( + decoderFactory.createDecoder(registration))); + if (decoder.isEmpty()) { LOGGER.debug( "Client registration '{}' has no JWK set URI, so its access " + "token cannot be decoded and no Keycloak roles " @@ -195,7 +200,7 @@ private Optional decodeAccessToken(ClientRegistration registration, return Optional.empty(); } try { - return Optional.of(decoder.decode(tokenValue)); + return Optional.of(decoder.get().decode(tokenValue)); } catch (JwtException e) { LOGGER.debug( "The access token of client registration '{}' could not be " diff --git a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java index 718fa1cf558..ced99d05c59 100644 --- a/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java +++ b/vaadin-spring/src/test/java/com/vaadin/flow/spring/security/KeycloakOidcUserMapperTest.java @@ -57,6 +57,9 @@ class KeycloakOidcUserMapperTest { private static final String ISSUER_URI = "http://localhost:8080/realms/test"; + private static final String JWK_SET_URI = ISSUER_URI + + "/protocol/openid-connect/certs"; + @Mock private OidcUserSource userSource; @@ -176,8 +179,22 @@ void convert_userNameAttributeUsedAsName_userInfoRetained() { @Test void convert_registrationWithoutJwkSetUri_mappedWithoutRoles() { - // A registration configured with explicit endpoints has no JWK set URI - // and no issuer URI, which the default decoder must not choke on + // There is nothing to verify the access token against, so it is left + // alone rather than failing the login + mapper = new KeycloakOidcUserMapper(); + + var authorities = authorities(); + + assertThat(authorities).noneMatch(a -> a.startsWith("ROLE_")); + assertThat(authorities).contains("SCOPE_openid"); + } + + @Test + void convert_registrationWithoutIssuerUri_mappedWithoutRoles() { + // A registration set up with explicit endpoints has no issuer URI, and + // building the default validator with a null issuer must not fail the + // login + when(providerDetails.getJwkSetUri()).thenReturn(JWK_SET_URI); mapper = new KeycloakOidcUserMapper(); var authorities = authorities(); From 451e58a2b4732606397395091b21cf68c86d583d Mon Sep 17 00:00:00 2001 From: "totally-not-ai[bot]" <290682512+totally-not-ai[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 07:58:58 +0000 Subject: [PATCH 8/8] chore: restore the copyright years of the unrelated CDI test sources --- .../src/main/java/com/vaadin/cdi/itest/Counter.java | 2 +- .../src/main/java/com/vaadin/cdi/itest/CounterFilter.java | 2 +- .../main/java/com/vaadin/cdi/itest/i18n/TranslationView.java | 2 +- .../itest/instantiatorcustomize/InstantiatorAlternative.java | 2 +- .../itest/instantiatorcustomize/InstantiatorCustomizeView.java | 2 +- .../instantiatorcustomize/InstantiatorFactoryAlternative.java | 2 +- .../instantiatorcustomize/InstantiatorFactoryDecorator.java | 2 +- .../com/vaadin/cdi/itest/invaliddeployment/DeploymentView.java | 2 +- .../vaadin/cdi/itest/invaliddeployment/NormalScopedLabel.java | 2 +- .../com/vaadin/cdi/itest/push/CustomSchedulerPushComponent.java | 2 +- .../com/vaadin/cdi/itest/push/ManagedExecutorPushComponent.java | 2 +- .../src/main/java/com/vaadin/cdi/itest/push/PushComponent.java | 2 +- .../main/java/com/vaadin/cdi/itest/push/WebsocketPushView.java | 2 +- .../java/com/vaadin/cdi/itest/push/WebsocketXhrPushView.java | 2 +- .../main/java/com/vaadin/cdi/itest/routecontext/ApartBean.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/AssignedBean.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/BeanNoOwner.java | 2 +- .../com/vaadin/cdi/itest/routecontext/ChildNoOwnerView.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/CountedPerUI.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/CustomException.java | 2 +- .../vaadin/cdi/itest/routecontext/CustomExceptionSubButton.java | 2 +- .../vaadin/cdi/itest/routecontext/CustomExceptionSubDiv.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/DetailApartView.java | 2 +- .../com/vaadin/cdi/itest/routecontext/DetailAssignedView.java | 2 +- .../com/vaadin/cdi/itest/routecontext/ErrorHandlerView.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/ErrorParentView.java | 2 +- .../main/java/com/vaadin/cdi/itest/routecontext/ErrorView.java | 2 +- .../com/vaadin/cdi/itest/routecontext/EventObserverLayout.java | 2 +- .../main/java/com/vaadin/cdi/itest/routecontext/EventView.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/InvalidView.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/LayoutEventView.java | 2 +- .../com/vaadin/cdi/itest/routecontext/LayoutEventView2.java | 2 +- .../vaadin/cdi/itest/routecontext/LayoutScopedPlainView.java | 2 +- .../cdi/itest/routecontext/LayoutScopedPreservedView.java | 2 +- .../main/java/com/vaadin/cdi/itest/routecontext/MainLayout.java | 2 +- .../main/java/com/vaadin/cdi/itest/routecontext/MasterView.java | 2 +- .../com/vaadin/cdi/itest/routecontext/ParentNoOwnerView.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/PostponeView.java | 2 +- .../vaadin/cdi/itest/routecontext/PreserveOnRefreshBean.java | 2 +- .../vaadin/cdi/itest/routecontext/PreserveOnRefreshView.java | 2 +- .../java/com/vaadin/cdi/itest/routecontext/RerouteView.java | 2 +- .../main/java/com/vaadin/cdi/itest/routecontext/RootView.java | 2 +- .../com/vaadin/cdi/itest/service/BootstrapCustomizeView.java | 2 +- .../java/com/vaadin/cdi/itest/service/BootstrapCustomizer.java | 2 +- .../main/java/com/vaadin/cdi/itest/service/EventObserver.java | 2 +- .../src/main/java/com/vaadin/cdi/itest/service/ServiceView.java | 2 +- .../java/com/vaadin/cdi/itest/service/TestErrorHandler.java | 2 +- .../vaadin/cdi/itest/service/TestSystemMessagesProvider.java | 2 +- .../com/vaadin/cdi/itest/sessioncontext/SessionContextView.java | 2 +- .../sessioncontextspecializes/LenientSessionContextManager.java | 2 +- .../SessionContextSpecializesView.java | 2 +- .../src/main/java/com/vaadin/cdi/itest/smoke/CdiView.java | 2 +- .../com/vaadin/cdi/itest/smoke/ProxiedNavigationTargetView.java | 2 +- .../main/java/com/vaadin/cdi/itest/template/TestTemplate.java | 2 +- .../java/com/vaadin/cdi/itest/uicontext/UIContextRootView.java | 2 +- .../com/vaadin/cdi/itest/uicontext/UINormalScopedBeanView.java | 2 +- .../main/java/com/vaadin/cdi/itest/uicontext/UIScopedLabel.java | 2 +- .../main/java/com/vaadin/cdi/itest/uicontext/UIScopedView.java | 2 +- .../java/com/vaadin/cdi/itest/uievents/NavigationObserver.java | 2 +- .../main/java/com/vaadin/cdi/itest/uievents/UIEventsView.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/AbstractCdiTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/ArchiveProvider.java | 2 +- .../com/vaadin/cdi/itest/InstantiatorFactoryCustomizeTest.java | 2 +- .../test/java/com/vaadin/cdi/itest/InvalidDeploymentTest.java | 2 +- .../java/com/vaadin/cdi/itest/NeedsCDICompliantContainer.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/PushTest.java | 2 +- .../com/vaadin/cdi/itest/PushWithoutManagedExecutorTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/RouteContextTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/ServiceTest.java | 2 +- .../com/vaadin/cdi/itest/SessionContextSpecializesTest.java | 2 +- .../java/com/vaadin/cdi/itest/SessionContextStrictTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/SessionContextTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/SlowTests.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/SmokeTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/TemplateTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/TranslationTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/UIContextTest.java | 2 +- .../src/test/java/com/vaadin/cdi/itest/UIEventsTest.java | 2 +- .../src/main/java/com/vaadin/cdi/AbstractCdiInstantiator.java | 2 +- vaadin-cdi/src/main/java/com/vaadin/cdi/BeanLookup.java | 2 +- vaadin-cdi/src/main/java/com/vaadin/cdi/CdiInstantiator.java | 2 +- vaadin-cdi/src/main/java/com/vaadin/cdi/CdiServletDeployer.java | 2 +- .../src/main/java/com/vaadin/cdi/CdiVaadinServletService.java | 2 +- .../src/main/java/com/vaadin/cdi/DeploymentValidator.java | 2 +- vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinExtension.java | 2 +- .../main/java/com/vaadin/cdi/VaadinTaskExecutorSelector.java | 2 +- .../src/main/java/com/vaadin/cdi/annotation/CdiComponent.java | 2 +- .../main/java/com/vaadin/cdi/annotation/NormalRouteScoped.java | 2 +- .../src/main/java/com/vaadin/cdi/annotation/NormalUIScoped.java | 2 +- .../main/java/com/vaadin/cdi/annotation/RouteScopeOwner.java | 2 +- .../src/main/java/com/vaadin/cdi/annotation/RouteScoped.java | 2 +- .../src/main/java/com/vaadin/cdi/annotation/UIScoped.java | 2 +- .../java/com/vaadin/cdi/annotation/VaadinServiceEnabled.java | 2 +- .../java/com/vaadin/cdi/annotation/VaadinServiceScoped.java | 2 +- .../java/com/vaadin/cdi/annotation/VaadinSessionScoped.java | 2 +- .../vaadin/cdi/context/AbstractContextualStorageManager.java | 2 +- .../src/main/java/com/vaadin/cdi/context/ContextWrapper.java | 2 +- .../src/main/java/com/vaadin/cdi/context/UIScopedContext.java | 2 +- .../java/com/vaadin/cdi/context/VaadinServiceScopedContext.java | 2 +- .../java/com/vaadin/cdi/context/VaadinSessionScopedContext.java | 2 +- .../src/test/java/com/vaadin/cdi/CdiInstantiatorTest.java | 2 +- .../com/vaadin/cdi/CdiVaadinServletServiceExecutorTest.java | 2 +- .../test/java/com/vaadin/cdi/CdiVaadinServletServiceTest.java | 2 +- .../src/test/java/com/vaadin/cdi/CdiVaadinServletTest.java | 2 +- .../src/test/java/com/vaadin/cdi/DeploymentValidatorTest.java | 2 +- .../java/com/vaadin/cdi/JavaSPIVaadinServiceInitListener.java | 2 +- vaadin-cdi/src/test/java/com/vaadin/cdi/PolymerTest.java | 2 +- vaadin-cdi/src/test/java/com/vaadin/cdi/SerializationUtils.java | 2 +- .../test/java/com/vaadin/cdi/TestCdiVaadinServletService.java | 2 +- .../src/test/java/com/vaadin/cdi/TestDeploymentValidator.java | 2 +- .../test/java/com/vaadin/cdi/context/AbstractContextTest.java | 2 +- .../java/com/vaadin/cdi/context/RouteContextNormalTest.java | 2 +- .../java/com/vaadin/cdi/context/RouteContextPseudoTest.java | 2 +- .../test/java/com/vaadin/cdi/context/ServiceContextTest.java | 2 +- .../java/com/vaadin/cdi/context/ServiceUnderTestContext.java | 2 +- .../test/java/com/vaadin/cdi/context/SessionContextTest.java | 2 +- .../java/com/vaadin/cdi/context/SessionUnderTestContext.java | 2 +- vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestBean.java | 2 +- .../test/java/com/vaadin/cdi/context/TestNavigationTarget.java | 2 +- .../test/java/com/vaadin/cdi/context/UIUnderTestContext.java | 2 +- .../test/java/com/vaadin/cdi/context/UiContextNormalTest.java | 2 +- .../test/java/com/vaadin/cdi/context/UiContextPseudoTest.java | 2 +- .../src/test/java/com/vaadin/cdi/context/UnderTestContext.java | 2 +- 123 files changed, 123 insertions(+), 123 deletions(-) diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/Counter.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/Counter.java index 60e00d9a964..ebfecb75d92 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/Counter.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/Counter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/CounterFilter.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/CounterFilter.java index b4403db8307..c8e636dbd54 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/CounterFilter.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/CounterFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/i18n/TranslationView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/i18n/TranslationView.java index f6a43bc36be..6cc25441c2f 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/i18n/TranslationView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/i18n/TranslationView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2024 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorAlternative.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorAlternative.java index 68442fee7d0..f41dccf6297 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorAlternative.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorAlternative.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorCustomizeView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorCustomizeView.java index fec814ef9fd..97933e01d3a 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorCustomizeView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorCustomizeView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryAlternative.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryAlternative.java index d36e74af3ab..4f02b519b39 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryAlternative.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryAlternative.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryDecorator.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryDecorator.java index bac56e1aa08..1274dcb2034 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryDecorator.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/instantiatorcustomize/InstantiatorFactoryDecorator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/DeploymentView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/DeploymentView.java index a3e4781e962..1e37d275c08 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/DeploymentView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/DeploymentView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/NormalScopedLabel.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/NormalScopedLabel.java index 1becd58fa27..475e03b3f39 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/NormalScopedLabel.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/invaliddeployment/NormalScopedLabel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/CustomSchedulerPushComponent.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/CustomSchedulerPushComponent.java index d47ffc5cc60..ef074b65bb4 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/CustomSchedulerPushComponent.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/CustomSchedulerPushComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/ManagedExecutorPushComponent.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/ManagedExecutorPushComponent.java index bd7c4c54ea0..5d8462d09a9 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/ManagedExecutorPushComponent.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/ManagedExecutorPushComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/PushComponent.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/PushComponent.java index 46037d901cb..633dd372663 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/PushComponent.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/PushComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2025 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketPushView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketPushView.java index 43ef508d047..95b57ca5f88 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketPushView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketPushView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketXhrPushView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketXhrPushView.java index a04de63c456..5dc6df97637 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketXhrPushView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/push/WebsocketXhrPushView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ApartBean.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ApartBean.java index b474e38294c..9f6ebad5065 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ApartBean.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ApartBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/AssignedBean.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/AssignedBean.java index c9fd8393f24..53c02c97304 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/AssignedBean.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/AssignedBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/BeanNoOwner.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/BeanNoOwner.java index 4be8d4e5699..15bb86666a3 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/BeanNoOwner.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/BeanNoOwner.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ChildNoOwnerView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ChildNoOwnerView.java index 8e9772bc4e4..3903b6717fd 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ChildNoOwnerView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ChildNoOwnerView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CountedPerUI.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CountedPerUI.java index 68dd9f958cc..fc8e12af693 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CountedPerUI.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CountedPerUI.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomException.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomException.java index d39d95ed2f2..88093b93d9e 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomException.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubButton.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubButton.java index 55816f816a7..da99b62a7f2 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubButton.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubButton.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubDiv.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubDiv.java index d1c45a314a3..046283af5b8 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubDiv.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/CustomExceptionSubDiv.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailApartView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailApartView.java index 4fa45092b62..ed08ae94d55 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailApartView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailApartView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailAssignedView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailAssignedView.java index 4c660c72362..16906d60e0f 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailAssignedView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/DetailAssignedView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorHandlerView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorHandlerView.java index 8792cc82954..90ba65cc39a 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorHandlerView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorHandlerView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorParentView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorParentView.java index f2f8b1aa57c..66c1a3e3aec 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorParentView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorParentView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorView.java index cfce3871806..afbf087d2b2 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ErrorView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventObserverLayout.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventObserverLayout.java index 9d91e1f972f..7632a33e3dc 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventObserverLayout.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventObserverLayout.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2023 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventView.java index 7ae3cfa9e0c..02f454a0656 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/EventView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/InvalidView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/InvalidView.java index ebf5e2557e9..2839fdffb8d 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/InvalidView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/InvalidView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView.java index 3310f766fcd..5a67ee3048a 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2023 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView2.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView2.java index 5b1c2254e0b..3c408cec5ff 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView2.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutEventView2.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2023 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPlainView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPlainView.java index d9d40e8e13c..aadaaee932e 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPlainView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPlainView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPreservedView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPreservedView.java index 2a0f5718069..b8a65edaa71 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPreservedView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/LayoutScopedPreservedView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MainLayout.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MainLayout.java index d142f013c82..946c7c0bf3d 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MainLayout.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MainLayout.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MasterView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MasterView.java index d2a1e6dc8e7..7384e3e836c 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MasterView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/MasterView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ParentNoOwnerView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ParentNoOwnerView.java index 5b947753749..3264dd9a064 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ParentNoOwnerView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/ParentNoOwnerView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PostponeView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PostponeView.java index ab3e23cc31d..15e6e385278 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PostponeView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PostponeView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshBean.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshBean.java index 28cf047ccc1..279420a9ca7 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshBean.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshView.java index 8da97ad232d..a3b1f168467 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/PreserveOnRefreshView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RerouteView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RerouteView.java index 1003ccfae7a..4b010275d03 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RerouteView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RerouteView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RootView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RootView.java index 96702c9a864..ede322cd43a 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RootView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/routecontext/RootView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizeView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizeView.java index 377b0578e90..d4b91a632e6 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizeView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizeView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizer.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizer.java index e15328fd3cc..7038d4938fc 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizer.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/BootstrapCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/EventObserver.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/EventObserver.java index b6dbff4e16d..1b9476cd98d 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/EventObserver.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/EventObserver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/ServiceView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/ServiceView.java index cb0b91a521c..44196649d18 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/ServiceView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/ServiceView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestErrorHandler.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestErrorHandler.java index 9d69f233197..6f38189dc28 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestErrorHandler.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestErrorHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestSystemMessagesProvider.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestSystemMessagesProvider.java index a6a14803dc8..e19a493c7aa 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestSystemMessagesProvider.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/service/TestSystemMessagesProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontext/SessionContextView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontext/SessionContextView.java index 1085d45558a..0b2ef8a7d34 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontext/SessionContextView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontext/SessionContextView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/LenientSessionContextManager.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/LenientSessionContextManager.java index b03596f03d8..ac14dd93134 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/LenientSessionContextManager.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/LenientSessionContextManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/SessionContextSpecializesView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/SessionContextSpecializesView.java index 7d13db854fc..7bdf8827e3e 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/SessionContextSpecializesView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/sessioncontextspecializes/SessionContextSpecializesView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/CdiView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/CdiView.java index abfc3eb6d47..d354b036cb9 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/CdiView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/CdiView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/ProxiedNavigationTargetView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/ProxiedNavigationTargetView.java index 1d735388cc5..07ae6b7ef80 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/ProxiedNavigationTargetView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/smoke/ProxiedNavigationTargetView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2024 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/template/TestTemplate.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/template/TestTemplate.java index 7e71c84604e..f7d2b1e9787 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/template/TestTemplate.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/template/TestTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIContextRootView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIContextRootView.java index d5c13135562..8096dfa16dc 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIContextRootView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIContextRootView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UINormalScopedBeanView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UINormalScopedBeanView.java index e8b5f7f4d15..967d4f3d059 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UINormalScopedBeanView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UINormalScopedBeanView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedLabel.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedLabel.java index 843391075ae..4e04ddb9572 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedLabel.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedLabel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedView.java index bf0434a079a..e7315768f15 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uicontext/UIScopedView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/NavigationObserver.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/NavigationObserver.java index 1018a0edc2b..5880c5acc43 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/NavigationObserver.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/NavigationObserver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/UIEventsView.java b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/UIEventsView.java index 8cc5fa34dfe..6d53869482c 100644 --- a/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/UIEventsView.java +++ b/flow-tests/vaadin-cdi-tests/src/main/java/com/vaadin/cdi/itest/uievents/UIEventsView.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/AbstractCdiTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/AbstractCdiTest.java index f239fecd038..43b997842fd 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/AbstractCdiTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/AbstractCdiTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ArchiveProvider.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ArchiveProvider.java index d90fba8d77c..394dd643c8b 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ArchiveProvider.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ArchiveProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InstantiatorFactoryCustomizeTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InstantiatorFactoryCustomizeTest.java index 333b77bd2b1..db94d9c8191 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InstantiatorFactoryCustomizeTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InstantiatorFactoryCustomizeTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InvalidDeploymentTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InvalidDeploymentTest.java index 187d4e60d9b..6993f8ce9a3 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InvalidDeploymentTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/InvalidDeploymentTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/NeedsCDICompliantContainer.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/NeedsCDICompliantContainer.java index 2960602f6d8..e4995c5f4e7 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/NeedsCDICompliantContainer.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/NeedsCDICompliantContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushTest.java index a407ce10959..0bd3938ac2f 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushWithoutManagedExecutorTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushWithoutManagedExecutorTest.java index 35d793a4670..415c1eccfb6 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushWithoutManagedExecutorTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/PushWithoutManagedExecutorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/RouteContextTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/RouteContextTest.java index 0983027c46a..57df6325819 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/RouteContextTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/RouteContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ServiceTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ServiceTest.java index 54517c19b6d..43ef11f9bb0 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ServiceTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/ServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextSpecializesTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextSpecializesTest.java index 3a504ac2638..1edc705367e 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextSpecializesTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextSpecializesTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextStrictTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextStrictTest.java index a35c36fa808..b672b626a6e 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextStrictTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextStrictTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextTest.java index 09f67593878..4640c1efa03 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SessionContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SlowTests.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SlowTests.java index b66aebac194..df2db24f5f1 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SlowTests.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SlowTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SmokeTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SmokeTest.java index bb90b4dd430..85b996d1905 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SmokeTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/SmokeTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TemplateTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TemplateTest.java index a8b6ac9c814..d8d543f5cf5 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TemplateTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TemplateTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TranslationTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TranslationTest.java index ba7242b03ac..f055d0f768d 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TranslationTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/TranslationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2024 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIContextTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIContextTest.java index 5a53250dc2a..c2d1434676c 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIContextTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIEventsTest.java b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIEventsTest.java index 53b26cf12e8..728ec53c588 100644 --- a/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIEventsTest.java +++ b/flow-tests/vaadin-cdi-tests/src/test/java/com/vaadin/cdi/itest/UIEventsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/AbstractCdiInstantiator.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/AbstractCdiInstantiator.java index 2ec4909a792..108e3cc93aa 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/AbstractCdiInstantiator.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/AbstractCdiInstantiator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2019 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/BeanLookup.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/BeanLookup.java index 119699ff273..0940e7c0529 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/BeanLookup.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/BeanLookup.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiInstantiator.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiInstantiator.java index 015839ebe49..19089f8f322 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiInstantiator.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiInstantiator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiServletDeployer.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiServletDeployer.java index 31458cb76ce..7d2a707ceb9 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiServletDeployer.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiServletDeployer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiVaadinServletService.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiVaadinServletService.java index 55630d6f0f3..5ef3f8913e1 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiVaadinServletService.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/CdiVaadinServletService.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/DeploymentValidator.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/DeploymentValidator.java index 7c0b812696e..f238fe1ae5b 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/DeploymentValidator.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/DeploymentValidator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinExtension.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinExtension.java index 12197701630..a9e591799ac 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinExtension.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinExtension.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinTaskExecutorSelector.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinTaskExecutorSelector.java index 3691acf7bae..43174ca39d8 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinTaskExecutorSelector.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/VaadinTaskExecutorSelector.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2025 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/CdiComponent.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/CdiComponent.java index f5b54f5ac42..c69316ffa54 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/CdiComponent.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/CdiComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2022 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalRouteScoped.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalRouteScoped.java index 156618ab7e1..2b3cc02adc0 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalRouteScoped.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalRouteScoped.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalUIScoped.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalUIScoped.java index 079866791c3..8c44e74792c 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalUIScoped.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/NormalUIScoped.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScopeOwner.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScopeOwner.java index 73ce6089ce9..aa753326641 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScopeOwner.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScopeOwner.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScoped.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScoped.java index 5efb7346c1b..0f97f3dddb3 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScoped.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/RouteScoped.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/UIScoped.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/UIScoped.java index 6f27ad5a1e8..a269816d24f 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/UIScoped.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/UIScoped.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceEnabled.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceEnabled.java index 077a8e2bb0b..85323385ea0 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceEnabled.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceEnabled.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceScoped.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceScoped.java index df44f5d8663..9e93ed72356 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceScoped.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinServiceScoped.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinSessionScoped.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinSessionScoped.java index 72c4a255b51..554505671c0 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinSessionScoped.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/annotation/VaadinSessionScoped.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/AbstractContextualStorageManager.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/AbstractContextualStorageManager.java index 351b7449230..8926a825b3c 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/AbstractContextualStorageManager.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/AbstractContextualStorageManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/ContextWrapper.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/ContextWrapper.java index e471c95d9b4..e8facddf9bb 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/ContextWrapper.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/ContextWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/UIScopedContext.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/UIScopedContext.java index 03a2022329f..db3cb66e7d1 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/UIScopedContext.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/UIScopedContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinServiceScopedContext.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinServiceScopedContext.java index b79e9f686df..2143108085c 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinServiceScopedContext.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinServiceScopedContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinSessionScopedContext.java b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinSessionScopedContext.java index 10bd919d779..ee154d3ab2e 100644 --- a/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinSessionScopedContext.java +++ b/vaadin-cdi/src/main/java/com/vaadin/cdi/context/VaadinSessionScopedContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiInstantiatorTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiInstantiatorTest.java index 44ffc090f5e..3bd3c808b87 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiInstantiatorTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiInstantiatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceExecutorTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceExecutorTest.java index c4b931c1e72..0d09101c898 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceExecutorTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceExecutorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2025 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceTest.java index 3da5994ff38..b8d2cd5661e 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletTest.java index 04752ac91df..1657aeca5be 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/CdiVaadinServletTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/DeploymentValidatorTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/DeploymentValidatorTest.java index 4cf110a032c..ad32d015b7a 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/DeploymentValidatorTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/DeploymentValidatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/JavaSPIVaadinServiceInitListener.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/JavaSPIVaadinServiceInitListener.java index ac79e915f30..d26b22b69d4 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/JavaSPIVaadinServiceInitListener.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/JavaSPIVaadinServiceInitListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/PolymerTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/PolymerTest.java index 376ef896354..d92dba5b449 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/PolymerTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/PolymerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/SerializationUtils.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/SerializationUtils.java index 3fa22377bf3..968ed5d1e42 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/SerializationUtils.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/SerializationUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2023 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/TestCdiVaadinServletService.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/TestCdiVaadinServletService.java index 8d776b02f78..dec1630171a 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/TestCdiVaadinServletService.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/TestCdiVaadinServletService.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/TestDeploymentValidator.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/TestDeploymentValidator.java index cb7fdf163c2..81ce9262ab1 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/TestDeploymentValidator.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/TestDeploymentValidator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/AbstractContextTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/AbstractContextTest.java index 6ca7767fcf5..24b59a327a9 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/AbstractContextTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/AbstractContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextNormalTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextNormalTest.java index 250b215e0b7..820922661df 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextNormalTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextNormalTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextPseudoTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextPseudoTest.java index be19e9f0088..473cea0f104 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextPseudoTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/RouteContextPseudoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceContextTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceContextTest.java index 7631d9e996f..470981cd6a7 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceContextTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceUnderTestContext.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceUnderTestContext.java index 5f71952cbf2..43b8fa1bcd7 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceUnderTestContext.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/ServiceUnderTestContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionContextTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionContextTest.java index ffa8361e71b..0ecf176ce59 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionContextTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionUnderTestContext.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionUnderTestContext.java index 6fb82e525b5..b0fb1d143cb 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionUnderTestContext.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/SessionUnderTestContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestBean.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestBean.java index 7dc35a41901..6aaffa4d83b 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestBean.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestNavigationTarget.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestNavigationTarget.java index b9ff13ac35d..28dc486e4bd 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestNavigationTarget.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/TestNavigationTarget.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2021 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UIUnderTestContext.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UIUnderTestContext.java index a2bbe94d9d6..68acf06e932 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UIUnderTestContext.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UIUnderTestContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextNormalTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextNormalTest.java index 5065b205428..3f310701387 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextNormalTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextNormalTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextPseudoTest.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextPseudoTest.java index 3012f1fe4d8..726ad171c53 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextPseudoTest.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UiContextPseudoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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 diff --git a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UnderTestContext.java b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UnderTestContext.java index 43527a53b7c..f0678acd1d3 100644 --- a/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UnderTestContext.java +++ b/vaadin-cdi/src/test/java/com/vaadin/cdi/context/UnderTestContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2026 Vaadin Ltd. + * Copyright 2000-2018 Vaadin Ltd. * * 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