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();
}