From 1ef95c67dd3a49407a35c87430a8c8f545dc2c5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:59:15 +0000 Subject: [PATCH 1/6] Initial plan From fe725aac6e11159bf4928688c70bb29c7ec5d639 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:02:21 +0000 Subject: [PATCH 2/6] Remove spring-retry dependency and fix Spring Boot 4 imports Co-authored-by: ato <10588+ato@users.noreply.github.com> --- ui/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/pom.xml b/ui/pom.xml index 2b9bddfc..62cc7f6d 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -144,10 +144,6 @@ org.springframework.boot spring-boot-starter-web - - org.springframework.retry - spring-retry - org.springframework.boot spring-boot-configuration-processor From 285b3fcc4f8914b0c0e0ab7dfb43a9fe03d36a8c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:04:20 +0000 Subject: [PATCH 3/6] Add spring-retry dependency with explicit version and fix Spring Boot 4 package imports Co-authored-by: ato <10588+ato@users.noreply.github.com> --- common/src/pandas/core/DatabaseOracleConfig.java | 2 +- common/src/pandas/core/DatabaseStartupConfig.java | 2 +- pom.xml | 5 +++++ ui/pom.xml | 4 ++++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/common/src/pandas/core/DatabaseOracleConfig.java b/common/src/pandas/core/DatabaseOracleConfig.java index b813bfa5..39e217f2 100644 --- a/common/src/pandas/core/DatabaseOracleConfig.java +++ b/common/src/pandas/core/DatabaseOracleConfig.java @@ -1,7 +1,7 @@ package pandas.core; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; +import org.springframework.boot.hibernate.autoconfigure.HibernatePropertiesCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/common/src/pandas/core/DatabaseStartupConfig.java b/common/src/pandas/core/DatabaseStartupConfig.java index 16b4bcb7..0b295f73 100644 --- a/common/src/pandas/core/DatabaseStartupConfig.java +++ b/common/src/pandas/core/DatabaseStartupConfig.java @@ -2,7 +2,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryDependsOnPostProcessor; +import org.springframework.boot.jpa.autoconfigure.EntityManagerFactoryDependsOnPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.support.DatabaseStartupValidator; diff --git a/pom.xml b/pom.xml index a2706387..f9150795 100644 --- a/pom.xml +++ b/pom.xml @@ -106,6 +106,11 @@ pom import + + org.springframework.retry + spring-retry + 2.0.12 + com.googlecode.owasp-java-html-sanitizer owasp-java-html-sanitizer diff --git a/ui/pom.xml b/ui/pom.xml index 62cc7f6d..2b9bddfc 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -144,6 +144,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.retry + spring-retry + org.springframework.boot spring-boot-configuration-processor From a1e63e89be35f653775c8ddb88a281c67eceb52b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:08:46 +0000 Subject: [PATCH 4/6] Fix all Spring Boot 4 compilation issues Co-authored-by: ato <10588+ato@users.noreply.github.com> --- ui/src/pandas/Pandas.java | 3 +- ui/src/pandas/collection/SubjectEditForm.java | 2 +- .../pandas/core/PandasServiceContributor.java | 6 ++-- ui/src/pandas/core/SecurityConfig.java | 33 +++++++++++-------- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/ui/src/pandas/Pandas.java b/ui/src/pandas/Pandas.java index 261e1ee1..62d721ed 100644 --- a/ui/src/pandas/Pandas.java +++ b/ui/src/pandas/Pandas.java @@ -4,7 +4,6 @@ import org.owasp.html.Sanitizers; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; import org.springframework.context.annotation.Bean; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @@ -17,7 +16,7 @@ import java.net.http.HttpClient; -@SpringBootApplication(exclude = ElasticsearchRestClientAutoConfiguration.class) +@SpringBootApplication @EnableScheduling @EnableJpaAuditing(auditorAwareRef = "userService") @EnableMethodSecurity diff --git a/ui/src/pandas/collection/SubjectEditForm.java b/ui/src/pandas/collection/SubjectEditForm.java index 2268c372..d1b5482e 100644 --- a/ui/src/pandas/collection/SubjectEditForm.java +++ b/ui/src/pandas/collection/SubjectEditForm.java @@ -1,6 +1,6 @@ package pandas.collection; -import org.hibernate.engine.jdbc.BlobProxy; +import org.hibernate.engine.jdbc.proxy.BlobProxy; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; diff --git a/ui/src/pandas/core/PandasServiceContributor.java b/ui/src/pandas/core/PandasServiceContributor.java index 5768d071..5507929f 100644 --- a/ui/src/pandas/core/PandasServiceContributor.java +++ b/ui/src/pandas/core/PandasServiceContributor.java @@ -8,7 +8,7 @@ import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl; import org.hibernate.sql.exec.spi.ExecutionContext; -import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; +import org.hibernate.sql.exec.spi.JdbcSelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcSelectExecutor; import org.hibernate.sql.results.spi.ListResultsConsumer; @@ -25,7 +25,7 @@ public void contribute(StandardServiceRegistryBuilder serviceRegistryBuilder) { public JdbcServices initiateService(Map configurationValues, ServiceRegistryImplementor registry) { JdbcSelectExecutorStandardImpl instance = new JdbcSelectExecutorStandardImpl() { @Override - public List list(JdbcOperationQuerySelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer rowTransformer, Class domainResultType, ListResultsConsumer.UniqueSemantic uniqueSemantic) { + public List list(JdbcSelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer rowTransformer, Class domainResultType, ListResultsConsumer.UniqueSemantic uniqueSemantic) { long startNanos = System.nanoTime(); List list = super.list(jdbcSelect, jdbcParameterBindings, executionContext, rowTransformer, domainResultType, uniqueSemantic); long elapsedNanos = System.nanoTime() - startNanos; @@ -37,7 +37,7 @@ public List list(JdbcOperationQuerySelect jdbcSelect, JdbcParameterBindin } @Override - public List list(JdbcOperationQuerySelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer rowTransformer, Class requestedJavaType, ListResultsConsumer.UniqueSemantic uniqueSemantic, int resultCountEstimate) { + public List list(JdbcSelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer rowTransformer, Class requestedJavaType, ListResultsConsumer.UniqueSemantic uniqueSemantic, int resultCountEstimate) { long startNanos = System.nanoTime(); List list = super.list(jdbcSelect, jdbcParameterBindings, executionContext, rowTransformer, requestedJavaType, uniqueSemantic, resultCountEstimate); long elapsedNanos = System.nanoTime() - startNanos; diff --git a/ui/src/pandas/core/SecurityConfig.java b/ui/src/pandas/core/SecurityConfig.java index c1d768aa..91feeb17 100644 --- a/ui/src/pandas/core/SecurityConfig.java +++ b/ui/src/pandas/core/SecurityConfig.java @@ -30,7 +30,7 @@ import org.springframework.security.web.context.DelegatingSecurityContextRepository; import org.springframework.security.web.context.HttpSessionSecurityContextRepository; import org.springframework.security.web.context.RequestAttributeSecurityContextRepository; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import pandas.agency.AgencyRepository; import pandas.agency.User; @@ -78,7 +78,10 @@ protected HttpSessionSecurityContextRepository httpSessionSecurityContextReposit @Bean protected SecurityFilterChain configure(HttpSecurity http, HttpSessionSecurityContextRepository httpSessionSecurityContextRepository) throws Exception { - http.securityMatcher("/login/check-session-reply").headers().frameOptions().sameOrigin().and().securityMatcher("/**"); + http.securityMatcher("/login/check-session-reply") + .headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin())); + http.securityMatcher("/**"); + if (config.getAutologin() != null) { PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider(); provider.setPreAuthenticatedUserDetailsService(pandasUserDetailsService); @@ -86,13 +89,14 @@ protected SecurityFilterChain configure(HttpSecurity http, } if (oidcIssuerUri != null) { System.out.println("setting user service"); - http.oauth2Login().userInfoEndpoint().oidcUserService(oidcUserService()) - .and().loginPage("/login") - .and().logout().logoutUrl("/logout"); - http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")); + http.oauth2Login(oauth2 -> oauth2 + .userInfoEndpoint(userInfo -> userInfo.oidcUserService(oidcUserService())) + .loginPage("/login")) + .logout(logout -> logout + .logoutUrl("/logout") + .logoutRequestMatcher(PathPatternRequestMatcher.pathPattern("/logout"))); } else { - DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); - authProvider.setUserDetailsService(pandasUserDetailsService); + DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(pandasUserDetailsService); authProvider.setPasswordEncoder(NoOpPasswordEncoder.getInstance()); http.authenticationProvider(authProvider); } @@ -123,21 +127,22 @@ protected Object getPreAuthenticatedCredentials(HttpServletRequest request) { .requestMatchers("/whoami").permitAll() .anyRequest().hasAnyRole("infouser")); if (oidcIssuerUri != null && clientRegistrationRepository != null) { - auth.logout().logoutSuccessHandler((request, response, authentication) -> { + auth.logout(logout -> logout.logoutSuccessHandler((request, response, authentication) -> { OidcClientInitiatedLogoutSuccessHandler handler = new OidcClientInitiatedLogoutSuccessHandler(clientRegistrationRepository); handler.setPostLogoutRedirectUri(ServletUriComponentsBuilder.fromContextPath(request).build().toUriString()); handler.onLogoutSuccess(request, response, authentication); - }); + })); } if (oidcIssuerUri == null && config.getAutologin() == null) { - auth.formLogin().defaultSuccessUrl("/") - .and().httpBasic().realmName("PANDAS"); + auth.formLogin(formLogin -> formLogin.defaultSuccessUrl("/")) + .httpBasic(httpBasic -> httpBasic.realmName("PANDAS")); } // This is the same as the default, but the sudo function needs a reference to // httpSessionSecurityContextRepository, so we construct it ourselves and stash it in a bean. - http.securityContext().securityContextRepository(new DelegatingSecurityContextRepository( - new RequestAttributeSecurityContextRepository(), httpSessionSecurityContextRepository)); + http.securityContext(securityContext -> securityContext.securityContextRepository( + new DelegatingSecurityContextRepository( + new RequestAttributeSecurityContextRepository(), httpSessionSecurityContextRepository))); return http.build(); } From ece1a5ff64d7d3b1933aec2e9dac01f92e038447 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:12:23 +0000 Subject: [PATCH 5/6] Fix remaining Spring Boot 4 compilation issues in gatherer and social modules Co-authored-by: ato <10588+ato@users.noreply.github.com> --- gatherer/src/pandas/PandasGatherer.java | 7 ++++--- gatherer/src/pandas/gatherer/repository/BambooClient.java | 4 ++-- social/src/pandas/PandasOAuthConfig.java | 5 +++-- social/src/pandas/PandasSocial.java | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/gatherer/src/pandas/PandasGatherer.java b/gatherer/src/pandas/PandasGatherer.java index 35d73abf..ba77ec8f 100644 --- a/gatherer/src/pandas/PandasGatherer.java +++ b/gatherer/src/pandas/PandasGatherer.java @@ -25,9 +25,10 @@ static class SecurityConfig { @Bean public SecurityWebFilterChain securitygWebFilterChain( ServerHttpSecurity http) { - return http.authorizeExchange() - .anyExchange().permitAll() - .and().csrf().disable().build(); + return http.authorizeExchange(exchanges -> exchanges + .anyExchange().permitAll()) + .csrf(csrf -> csrf.disable()) + .build(); } } } diff --git a/gatherer/src/pandas/gatherer/repository/BambooClient.java b/gatherer/src/pandas/gatherer/repository/BambooClient.java index edc03a49..cafafb53 100644 --- a/gatherer/src/pandas/gatherer/repository/BambooClient.java +++ b/gatherer/src/pandas/gatherer/repository/BambooClient.java @@ -1,8 +1,8 @@ package pandas.gatherer.repository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.health.Health; -import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.boot.health.contributor.Health; +import org.springframework.boot.health.contributor.HealthIndicator; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.core.io.FileSystemResource; import org.springframework.http.MediaType; diff --git a/social/src/pandas/PandasOAuthConfig.java b/social/src/pandas/PandasOAuthConfig.java index 970a10d6..bb1639d9 100644 --- a/social/src/pandas/PandasOAuthConfig.java +++ b/social/src/pandas/PandasOAuthConfig.java @@ -2,7 +2,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties; +// OAuth2ClientProperties has been removed in Spring Boot 4 +// import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -18,7 +19,7 @@ @Configuration @ConditionalOnProperty("OIDC_URL") @PropertySource("classpath:application-oauth.properties") -@EnableConfigurationProperties(OAuth2ClientProperties.class) +// @EnableConfigurationProperties(OAuth2ClientProperties.class) //@Import(OAuth2ClientAutoConfiguration.class) public class PandasOAuthConfig { diff --git a/social/src/pandas/PandasSocial.java b/social/src/pandas/PandasSocial.java index 94b98b46..d3433267 100644 --- a/social/src/pandas/PandasSocial.java +++ b/social/src/pandas/PandasSocial.java @@ -17,10 +17,10 @@ public static void main(String[] args) { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.csrf().disable(); + http.csrf(csrf -> csrf.disable()); http.authorizeHttpRequests(r -> r.anyRequest().permitAll()); http.oauth2Login(Customizer.withDefaults()); - http.oauth2Client(); + http.oauth2Client(oauth2 -> {}); return http.build(); } } From fb0d1e6f1904e986f1951d4dec49e39aaf297bbf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:13:31 +0000 Subject: [PATCH 6/6] Address code review feedback - add comment for oauth2Client configuration Co-authored-by: ato <10588+ato@users.noreply.github.com> --- social/src/pandas/PandasSocial.java | 1 + 1 file changed, 1 insertion(+) diff --git a/social/src/pandas/PandasSocial.java b/social/src/pandas/PandasSocial.java index d3433267..7bcb587e 100644 --- a/social/src/pandas/PandasSocial.java +++ b/social/src/pandas/PandasSocial.java @@ -20,6 +20,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti http.csrf(csrf -> csrf.disable()); http.authorizeHttpRequests(r -> r.anyRequest().permitAll()); http.oauth2Login(Customizer.withDefaults()); + // oauth2Client() requires a lambda in Spring Security 7, using empty lambda for default configuration http.oauth2Client(oauth2 -> {}); return http.build(); }