diff --git a/.github/workflows/ci-boot.yml b/.github/workflows/ci-boot.yml index ad90dad21..a5cf90eea 100644 --- a/.github/workflows/ci-boot.yml +++ b/.github/workflows/ci-boot.yml @@ -11,8 +11,8 @@ jobs: strategy: matrix: os: [ubuntu-latest] - java: [1.8] - boot: [2.7.0, 2.7.12] + java: [ 17 ] + boot: [ 3.1.0, 3.1.3 ] fail-fast: false steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe2c1f5a6..08d052682 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - java: [1.8, 11] + java: [ 17 ] fail-fast: false steps: @@ -52,7 +52,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 17 - uses: jfrog/setup-jfrog-cli@v3 with: version: 2.39.1 diff --git a/.github/workflows/mongodb.yml b/.github/workflows/mongodb.yml index 068e2fd1b..88377678c 100644 --- a/.github/workflows/mongodb.yml +++ b/.github/workflows/mongodb.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - java: [1.8, 11] + java: [ 17 ] fail-fast: false steps: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 36519a31a..2d5180257 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - java: [1.8, 11] + java: [ 17 ] fail-fast: false steps: diff --git a/.github/workflows/redis.yml b/.github/workflows/redis.yml index ad921af26..ca46b9137 100644 --- a/.github/workflows/redis.yml +++ b/.github/workflows/redis.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - java: [1.8, 11] + java: [ 17 ] fail-fast: false steps: diff --git a/.github/workflows/release-ga.yml b/.github/workflows/release-ga.yml index 61dc65996..ffea00b21 100644 --- a/.github/workflows/release-ga.yml +++ b/.github/workflows/release-ga.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 17 - uses: jfrog/setup-jfrog-cli@v3 with: version: 2.39.1 diff --git a/.github/workflows/release-milestone.yml b/.github/workflows/release-milestone.yml index e9982ddba..92f83f912 100644 --- a/.github/workflows/release-milestone.yml +++ b/.github/workflows/release-milestone.yml @@ -25,7 +25,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 17 - uses: jfrog/setup-jfrog-cli@v3 with: version: 2.39.1 diff --git a/.github/workflows/smoke.yml b/.github/workflows/smoke.yml index 2c0d7c419..46b6f9650 100644 --- a/.github/workflows/smoke.yml +++ b/.github/workflows/smoke.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - java: [1.8, 11] + java: [ 17 ] fail-fast: false steps: diff --git a/build.gradle b/build.gradle index 6bb177e03..8df2b53f8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ buildscript { ext { log4jVersion = '1.2.17' - springBootVersion = '2.7.0' - eclipsePersistenceVersion = '2.1.1' + springBootVersion = '3.1.3' + jakartaPersistenceVersion = '3.1.0' kryoVersion = '4.0.2' springCloudClusterVersion = '1.0.2.RELEASE' springShellVersion = '1.1.0.RELEASE' @@ -67,13 +67,13 @@ configure(javaProjectsAndRoot) { } compileJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = 17 + targetCompatibility = 17 } compileTestJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = 17 + targetCompatibility = 17 } group = 'org.springframework.statemachine' @@ -218,7 +218,7 @@ project('spring-statemachine-core') { testFixturesImplementation 'org.assertj:assertj-core' testImplementation 'org.springframework.security:spring-security-config' testImplementation 'org.springframework.security:spring-security-test' - testImplementation 'javax.servlet:javax.servlet-api' + testImplementation 'jakarta.servlet:jakarta.servlet-api' testImplementation 'org.awaitility:awaitility' testRuntimeOnly 'org.apache.logging.log4j:log4j-core' } @@ -237,7 +237,7 @@ project('spring-statemachine-autoconfigure') { optional project(':spring-statemachine-data-common:spring-statemachine-data-mongodb') optional 'org.springframework.boot:spring-boot-autoconfigure-processor' optional 'io.micrometer:micrometer-core' - optional 'org.eclipse.persistence:javax.persistence' + optional 'jakarta.persistence:jakarta.persistence-api' optional 'org.springframework.boot:spring-boot-starter-data-jpa' optional 'org.springframework.boot:spring-boot-starter-data-redis' optional 'org.springframework.boot:spring-boot-starter-data-mongodb' @@ -486,8 +486,8 @@ project('spring-statemachine-starter') { configure(sampleProjects()) { apply plugin: 'org.springframework.boot' compileJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = 17 + targetCompatibility = 17 } dependencies { api project(':spring-statemachine-core') diff --git a/gradle.properties b/gradle.properties index 5cc1ae15b..86f2f11ac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ #Thu May 05 13:05:04 UTC 2022 -version=3.3.0-SNAPSHOT +version=4.0.0-SNAPSHOT diff --git a/gradle/java-test-fixtures.gradle b/gradle/java-test-fixtures.gradle index 89e4e5a42..06cfafd16 100644 --- a/gradle/java-test-fixtures.gradle +++ b/gradle/java-test-fixtures.gradle @@ -1,8 +1,8 @@ apply plugin: 'java-test-fixtures' compileTestFixturesJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = 17 + targetCompatibility = 17 } eclipse.classpath { diff --git a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineAutoConfiguration.java b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineAutoConfiguration.java index de0d6f9ec..6dd6c04dc 100644 --- a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineAutoConfiguration.java +++ b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,10 @@ */ package org.springframework.statemachine.boot.autoconfigure; +import io.micrometer.core.instrument.MeterRegistry; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -30,54 +32,52 @@ import org.springframework.statemachine.boot.actuate.StateMachineTraceRepository; import org.springframework.statemachine.boot.support.BootStateMachineMonitor; -import io.micrometer.core.instrument.MeterRegistry; - /** * {@link EnableAutoConfiguration Auto-configuration} for Spring Statemachine. * * @author Janne Valkealahti - * */ -@Configuration -@EnableConfigurationProperties({ StateMachineProperties.class }) +@AutoConfiguration +@EnableConfigurationProperties({StateMachineProperties.class}) @ConditionalOnClass(MeterRegistry.class) @ConditionalOnProperty(prefix = "spring.statemachine.monitor", name = "enabled", havingValue = "true", matchIfMissing = true) public class StateMachineAutoConfiguration { - @ManagementContextConfiguration - public static class StateMachineTraceEndpointConfiguration { + @ManagementContextConfiguration + public static class StateMachineTraceEndpointConfiguration { - @Bean - public StateMachineTraceEndpoint stateMachineTraceEndpoint(StateMachineTraceRepository stateMachineTraceRepository) { - return new StateMachineTraceEndpoint(stateMachineTraceRepository); - } - } + @Bean + public StateMachineTraceEndpoint stateMachineTraceEndpoint(StateMachineTraceRepository stateMachineTraceRepository) { + return new StateMachineTraceEndpoint(stateMachineTraceRepository); + } + } - @Configuration - public static class StateMachineTraceRepositoryConfiguration { + @Configuration + public static class StateMachineTraceRepositoryConfiguration { - @ConditionalOnMissingBean(StateMachineTraceRepository.class) - @Bean - public InMemoryStateMachineTraceRepository stateMachineTraceRepository() { - return new InMemoryStateMachineTraceRepository(); - } - } + @ConditionalOnMissingBean(StateMachineTraceRepository.class) + @Bean + public InMemoryStateMachineTraceRepository stateMachineTraceRepository() { + return new InMemoryStateMachineTraceRepository(); + } + } - @Configuration - public static class StateMachineMonitoringConfiguration { + @Configuration + public static class StateMachineMonitoringConfiguration { - private final MeterRegistry meterRegistry; - private final StateMachineTraceRepository stateMachineTraceRepository; + private final MeterRegistry meterRegistry; + private final StateMachineTraceRepository stateMachineTraceRepository; - public StateMachineMonitoringConfiguration(ObjectProvider meterRegistryProvider, - ObjectProvider traceRepositoryProvider) { - this.meterRegistry = meterRegistryProvider.getIfAvailable(); - this.stateMachineTraceRepository = traceRepositoryProvider.getIfAvailable(); - } + public StateMachineMonitoringConfiguration( + ObjectProvider meterRegistryProvider, + ObjectProvider traceRepositoryProvider) { + this.meterRegistry = meterRegistryProvider.getIfAvailable(); + this.stateMachineTraceRepository = traceRepositoryProvider.getIfAvailable(); + } - @Bean - public BootStateMachineMonitor bootStateMachineMonitor() { - return new BootStateMachineMonitor<>(meterRegistry, stateMachineTraceRepository); - } - } + @Bean + public BootStateMachineMonitor bootStateMachineMonitor() { + return new BootStateMachineMonitor<>(meterRegistry, stateMachineTraceRepository); + } + } } diff --git a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineJpaRepositoriesAutoConfiguration.java b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineJpaRepositoriesAutoConfiguration.java index 15a23ca8d..d46efe570 100644 --- a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineJpaRepositoriesAutoConfiguration.java +++ b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineJpaRepositoriesAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,27 +15,24 @@ */ package org.springframework.statemachine.boot.autoconfigure; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration; import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.statemachine.data.jpa.JpaRepositoryState; import org.springframework.statemachine.data.jpa.JpaStateRepository; /** - * {@link EnableAutoConfiguration Auto-configuration} for JPA repositories - * and Entity classes. + * {@link EnableAutoConfiguration Auto-configuration} for JPA repositories and Entity classes. */ -@Configuration +@AutoConfiguration(after = JpaRepositoriesAutoConfiguration.class) @ConditionalOnClass(JpaStateRepository.class) @ConditionalOnProperty(prefix = "spring.statemachine.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true) -@AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class) -@EntityScan(basePackageClasses = { JpaRepositoryState.class }) -@EnableJpaRepositories(basePackageClasses = { JpaStateRepository.class }) +@EntityScan(basePackageClasses = {JpaRepositoryState.class}) +@EnableJpaRepositories(basePackageClasses = {JpaStateRepository.class}) public class StateMachineJpaRepositoriesAutoConfiguration { } diff --git a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineMongoDbRepositoriesAutoConfiguration.java b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineMongoDbRepositoriesAutoConfiguration.java index 84b36f705..ad1ae1e39 100644 --- a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineMongoDbRepositoriesAutoConfiguration.java +++ b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineMongoDbRepositoriesAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,27 +15,24 @@ */ package org.springframework.statemachine.boot.autoconfigure; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.statemachine.data.mongodb.MongoDbRepositoryState; import org.springframework.statemachine.data.mongodb.MongoDbStateRepository; /** - * {@link EnableAutoConfiguration Auto-configuration} for MongoDb repositories - * and Entity classes. + * {@link EnableAutoConfiguration Auto-configuration} for MongoDb repositories and Entity classes. */ -@Configuration +@AutoConfiguration(after = MongoRepositoriesAutoConfiguration.class) @ConditionalOnClass(MongoDbStateRepository.class) @ConditionalOnProperty(prefix = "spring.statemachine.data.mongo.repositories", name = "enabled", havingValue = "true", matchIfMissing = true) -@AutoConfigureAfter(MongoRepositoriesAutoConfiguration.class) -@EntityScan(basePackageClasses = { MongoDbRepositoryState.class }) -@EnableMongoRepositories(basePackageClasses = { MongoDbStateRepository.class }) +@EntityScan(basePackageClasses = {MongoDbRepositoryState.class}) +@EnableMongoRepositories(basePackageClasses = {MongoDbStateRepository.class}) public class StateMachineMongoDbRepositoriesAutoConfiguration { } diff --git a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineRedisRepositoriesAutoConfiguration.java b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineRedisRepositoriesAutoConfiguration.java index 43e3f97b9..6817b930c 100644 --- a/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineRedisRepositoriesAutoConfiguration.java +++ b/spring-statemachine-autoconfigure/src/main/java/org/springframework/statemachine/boot/autoconfigure/StateMachineRedisRepositoriesAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,27 +15,24 @@ */ package org.springframework.statemachine.boot.autoconfigure; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration; import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; import org.springframework.statemachine.data.redis.RedisRepositoryState; import org.springframework.statemachine.data.redis.RedisStateRepository; /** - * {@link EnableAutoConfiguration Auto-configuration} for Redis repositories - * and Entity classes. + * {@link EnableAutoConfiguration Auto-configuration} for Redis repositories and Entity classes. */ -@Configuration +@AutoConfiguration(after = RedisRepositoriesAutoConfiguration.class) @ConditionalOnClass(RedisStateRepository.class) @ConditionalOnProperty(prefix = "spring.statemachine.data.redis.repositories", name = "enabled", havingValue = "true", matchIfMissing = true) -@AutoConfigureAfter(RedisRepositoriesAutoConfiguration.class) -@EntityScan(basePackageClasses = { RedisRepositoryState.class }) -@EnableRedisRepositories(basePackageClasses = { RedisStateRepository.class }) +@EntityScan(basePackageClasses = {RedisRepositoryState.class}) +@EnableRedisRepositories(basePackageClasses = {RedisStateRepository.class}) public class StateMachineRedisRepositoriesAutoConfiguration { } diff --git a/spring-statemachine-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-statemachine-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports similarity index 54% rename from spring-statemachine-autoconfigure/src/main/resources/META-INF/spring.factories rename to spring-statemachine-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 66e58aaa1..518faf08a 100644 --- a/spring-statemachine-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-statemachine-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,7 +1,4 @@ -# Auto Configure -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.statemachine.boot.autoconfigure.StateMachineAutoConfiguration,\ -org.springframework.statemachine.boot.autoconfigure.StateMachineJpaRepositoriesAutoConfiguration,\ -org.springframework.statemachine.boot.autoconfigure.StateMachineRedisRepositoriesAutoConfiguration,\ -org.springframework.statemachine.boot.autoconfigure.StateMachineMongoDbRepositoriesAutoConfiguration - +org.springframework.statemachine.boot.autoconfigure.StateMachineAutoConfiguration +org.springframework.statemachine.boot.autoconfigure.StateMachineJpaRepositoriesAutoConfiguration +org.springframework.statemachine.boot.autoconfigure.StateMachineRedisRepositoriesAutoConfiguration +org.springframework.statemachine.boot.autoconfigure.StateMachineMongoDbRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-statemachine-build-tests/src/test/java/org/springframework/statemachine/buildtests/tck/mongodb/EnabledOnMongoDbCondition.java b/spring-statemachine-build-tests/src/test/java/org/springframework/statemachine/buildtests/tck/mongodb/EnabledOnMongoDbCondition.java index 1192b2d80..52b00f204 100644 --- a/spring-statemachine-build-tests/src/test/java/org/springframework/statemachine/buildtests/tck/mongodb/EnabledOnMongoDbCondition.java +++ b/spring-statemachine-build-tests/src/test/java/org/springframework/statemachine/buildtests/tck/mongodb/EnabledOnMongoDbCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 the original author or authors. + * Copyright 2019-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,24 +18,24 @@ import static org.junit.jupiter.api.extension.ConditionEvaluationResult.disabled; import static org.junit.jupiter.api.extension.ConditionEvaluationResult.enabled; +import java.net.Socket; import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; import org.junit.jupiter.api.extension.ExtensionContext; -import org.springframework.util.SocketUtils; public class EnabledOnMongoDbCondition implements ExecutionCondition { - static final ConditionEvaluationResult ENABLED_ON_MONGO = enabled("Mongo DB found"); + static final ConditionEvaluationResult ENABLED_ON_MONGO = enabled("Mongo DB found"); - static final ConditionEvaluationResult DISABLED_ON_MONGO = disabled("Mongo DB not found"); + static final ConditionEvaluationResult DISABLED_ON_MONGO = disabled("Mongo DB not found"); - @Override - public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { - try { - SocketUtils.findAvailableTcpPort(27017, 27017); - return DISABLED_ON_MONGO; - } catch (Exception e) { - } - return ENABLED_ON_MONGO; - } + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + try { + new Socket("localhost", 27017); + return ENABLED_ON_MONGO; + } catch (Exception e) { + return DISABLED_ON_MONGO; + } + } } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationErrorTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationErrorTests.java index 823928943..2a70da8c0 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationErrorTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationErrorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; - import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; @@ -138,7 +137,7 @@ public void testPseudostateNoTransition() throws Exception { builder.build(); }).satisfies(e -> { assertThat(e.getCause()).isInstanceOf(MalformedConfigurationException.class); - assertThat(e.getLocalizedMessage()).contains("No transitions for state S2"); + assertThat(e.getCause().getLocalizedMessage()).contains("No transitions for state S2"); }); } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests12.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests12.java index aafefb308..527a76a4c 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests12.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests12.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 the original author or authors. + * Copyright 2020-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,6 @@ import org.springframework.statemachine.config.StateMachineConfigurerAdapter; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; - import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -74,7 +73,7 @@ public void testActionEntryErrorWithEvent() throws Exception { StepVerifier.create(machine.sendEvent(Mono.just(MessageBuilder.withPayload("E1").build()))) .consumeNextWith(result -> { StepVerifier.create(result.complete()).consumeErrorWith(e -> { - assertThat(e).isInstanceOf(StateMachineException.class).hasMessageContaining("example error"); + assertThat(e).isInstanceOf(StateMachineException.class).cause().hasMessageContaining("example error"); }).verify(); }) .verifyComplete(); diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests3.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests3.java index a47ce6caa..807c5d5aa 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests3.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests3.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2015-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,15 +15,14 @@ */ package org.springframework.statemachine.docs; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.security.access.annotation.Secured; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.statemachine.StateContext; import org.springframework.statemachine.action.Action; import org.springframework.statemachine.config.EnableStateMachine; @@ -139,14 +138,16 @@ public void configure(StateMachineConfigurationConfigurer config // tag::snippetE[] @Configuration - @EnableGlobalMethodSecurity(securedEnabled = true) - public static class Config5 extends WebSecurityConfigurerAdapter { - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth - .inMemoryAuthentication() - .withUser("user").password("password").roles("USER"); + public static class Config5 { + + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withDefaultPasswordEncoder() + .username("user") + .password("password") + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user); } } // end::snippetE[] diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/security/ActionSecurityTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/security/ActionSecurityTests.java index ec43181e2..d620370f0 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/security/ActionSecurityTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/security/ActionSecurityTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2015-2020 the original author or authors. + * Copyright 2015-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; - import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -30,9 +29,9 @@ import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.security.access.annotation.Secured; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.statemachine.AbstractStateMachineTests; import org.springframework.statemachine.StateContext; @@ -103,16 +102,17 @@ public void testActionExecutionAllowed() throws Exception { } @Configuration - @EnableGlobalMethodSecurity(securedEnabled = true) - public static class Config1 extends WebSecurityConfigurerAdapter { - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth - .inMemoryAuthentication() - .withUser("user").password("password").roles("USER"); - } + public static class Config1 { + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withDefaultPasswordEncoder() + .username("user") + .password("password") + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user); + } } @Configuration diff --git a/spring-statemachine-data/build.gradle b/spring-statemachine-data/build.gradle index 929dad5cd..f49f1fc4e 100644 --- a/spring-statemachine-data/build.gradle +++ b/spring-statemachine-data/build.gradle @@ -11,7 +11,7 @@ project('spring-statemachine-data-jpa') { testImplementation(testFixtures(project(":spring-statemachine-data-common"))) testImplementation(testFixtures(project(":spring-statemachine-core"))) testImplementation 'io.projectreactor:reactor-test' - optional 'org.eclipse.persistence:javax.persistence' + optional 'jakarta.persistence:jakarta.persistence-api' testImplementation 'org.hsqldb:hsqldb' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.springframework.boot:spring-boot-starter-data-jpa' @@ -27,7 +27,7 @@ project('spring-statemachine-data-redis') { api project(':spring-statemachine-data-common') api 'org.springframework.data:spring-data-redis' testImplementation project(':spring-statemachine-test') - optional 'org.eclipse.persistence:javax.persistence' + optional 'jakarta.persistence:jakarta.persistence-api' testImplementation(testFixtures(project(":spring-statemachine-data-common"))) testImplementation(testFixtures(project(":spring-statemachine-core"))) testImplementation 'io.projectreactor:reactor-test' @@ -47,7 +47,7 @@ project('spring-statemachine-data-mongodb') { api project(':spring-statemachine-data-common') api 'org.springframework.data:spring-data-mongodb' testImplementation project(':spring-statemachine-test') - optional 'org.eclipse.persistence:javax.persistence' + optional 'jakarta.persistence:jakarta.persistence-api' testImplementation(testFixtures(project(":spring-statemachine-data-common"))) testImplementation(testFixtures(project(":spring-statemachine-core"))) testImplementation 'io.projectreactor:reactor-test' diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryAction.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryAction.java index 01ec24ac6..2ab3c976b 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryAction.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,17 +15,15 @@ */ package org.springframework.statemachine.data.jpa; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Column; - -import org.springframework.statemachine.data.RepositoryAction; - import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import org.springframework.statemachine.data.RepositoryAction; /** * JPA entity for actions. diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryGuard.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryGuard.java index 5b5cf047d..d29c174b0 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryGuard.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryGuard.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,17 +15,15 @@ */ package org.springframework.statemachine.data.jpa; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Column; - -import org.springframework.statemachine.data.RepositoryGuard; - import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import org.springframework.statemachine.data.RepositoryGuard; /** * JPA entity for actions. diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java index 946d21617..2b6fe4a09 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,30 +15,28 @@ */ package org.springframework.statemachine.data.jpa; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import java.util.Set; - -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.ForeignKey; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.OneToOne; -import javax.persistence.Table; - import org.springframework.statemachine.data.RepositoryAction; import org.springframework.statemachine.data.RepositoryState; import org.springframework.statemachine.state.PseudoStateKind; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - /** * JPA entity for states. * @@ -76,7 +74,7 @@ public class JpaRepositoryState extends RepositoryState { @JoinColumn(foreignKey = @ForeignKey(name = "fk_state_initial_action")) private JpaRepositoryAction initialAction; - @OneToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(foreignKey = @ForeignKey(name = "fk_state_parent_state")) private JpaRepositoryState parentState; diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryStateMachine.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryStateMachine.java index 7a63d8b6a..4dcb6d776 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryStateMachine.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryStateMachine.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2020 the original author or authors. + * Copyright 2017-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,16 +15,14 @@ */ package org.springframework.statemachine.data.jpa; -import javax.persistence.Entity; -import javax.persistence.Lob; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Column; - -import org.springframework.statemachine.data.RepositoryStateMachine; - import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import org.springframework.statemachine.data.RepositoryStateMachine; /** * A {@link RepositoryStateMachine} interface for JPA used for states machines. diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java index f152674b0..907473dc3 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,27 +15,24 @@ */ package org.springframework.statemachine.data.jpa; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import java.util.Set; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.Column; -import javax.persistence.OneToOne; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ForeignKey; -import javax.persistence.ManyToMany; -import javax.persistence.JoinTable; - import org.springframework.statemachine.data.RepositoryTransition; import org.springframework.statemachine.transition.TransitionKind; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - /** * JPA entity for transitions. * @@ -55,11 +52,11 @@ public class JpaRepositoryTransition extends RepositoryTransition { @Column(name = "machine_id") private String machineId; - @OneToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(foreignKey = @ForeignKey(name = "fk_transition_source")) private JpaRepositoryState source; - @OneToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(foreignKey = @ForeignKey(name = "fk_transition_target")) private JpaRepositoryState target; @@ -73,7 +70,7 @@ public class JpaRepositoryTransition extends RepositoryTransition { @JoinTable(foreignKey = @ForeignKey(name = "fk_transition_actions_t"), inverseForeignKey = @ForeignKey(name = "fk_transition_actions_a")) private Set actions; - @OneToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(foreignKey = @ForeignKey(name = "fk_transition_guard")) private JpaRepositoryGuard guard; diff --git a/spring-statemachine-data/mongodb/src/test/java/org/springframework/statemachine/data/mongodb/EnabledOnMongoDbCondition.java b/spring-statemachine-data/mongodb/src/test/java/org/springframework/statemachine/data/mongodb/EnabledOnMongoDbCondition.java index 76512d2fa..cf7e6944a 100644 --- a/spring-statemachine-data/mongodb/src/test/java/org/springframework/statemachine/data/mongodb/EnabledOnMongoDbCondition.java +++ b/spring-statemachine-data/mongodb/src/test/java/org/springframework/statemachine/data/mongodb/EnabledOnMongoDbCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 the original author or authors. + * Copyright 2019-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,24 +18,24 @@ import static org.junit.jupiter.api.extension.ConditionEvaluationResult.disabled; import static org.junit.jupiter.api.extension.ConditionEvaluationResult.enabled; +import java.net.Socket; import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; import org.junit.jupiter.api.extension.ExtensionContext; -import org.springframework.util.SocketUtils; public class EnabledOnMongoDbCondition implements ExecutionCondition { - static final ConditionEvaluationResult ENABLED_ON_MONGO = enabled("Mongo DB found"); + static final ConditionEvaluationResult ENABLED_ON_MONGO = enabled("Mongo DB found"); - static final ConditionEvaluationResult DISABLED_ON_MONGO = disabled("Mongo DB not found"); + static final ConditionEvaluationResult DISABLED_ON_MONGO = disabled("Mongo DB not found"); - @Override - public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { - try { - SocketUtils.findAvailableTcpPort(27017, 27017); - return DISABLED_ON_MONGO; - } catch (Exception e) { - } - return ENABLED_ON_MONGO; - } + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + try { + new Socket("localhost", 27017); + return ENABLED_ON_MONGO; + } catch (Exception e) { + return DISABLED_ON_MONGO; + } + } } diff --git a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryAction.java b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryAction.java index 8962fd7c8..c35afa67d 100644 --- a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryAction.java +++ b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,18 +15,12 @@ */ package org.springframework.statemachine.data.redis; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.springframework.data.annotation.Id; - -//import javax.persistence.GeneratedValue; -//import javax.persistence.GenerationType; -//import javax.persistence.Id; - import org.springframework.data.redis.core.RedisHash; import org.springframework.statemachine.data.RepositoryAction; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - /** * Redis entity for actions. * diff --git a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryGuard.java b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryGuard.java index bb067cf9c..be56d4965 100644 --- a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryGuard.java +++ b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryGuard.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,18 +15,12 @@ */ package org.springframework.statemachine.data.redis; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.springframework.data.annotation.Id; - -//import javax.persistence.GeneratedValue; -//import javax.persistence.GenerationType; -//import javax.persistence.Id; - import org.springframework.data.redis.core.RedisHash; import org.springframework.statemachine.data.RepositoryGuard; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - /** * Redis entity for actions. * diff --git a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryState.java b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryState.java index 91699b28b..6a7512bda 100644 --- a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryState.java +++ b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryState.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,16 +15,9 @@ */ package org.springframework.statemachine.data.redis; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import java.util.Set; - -//import javax.persistence.ElementCollection; -//import javax.persistence.FetchType; -//import javax.persistence.GeneratedValue; -//import javax.persistence.GenerationType; -//import javax.persistence.Id; -//import javax.persistence.OneToMany; -//import javax.persistence.OneToOne; - import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Reference; import org.springframework.data.redis.core.RedisHash; @@ -33,9 +26,6 @@ import org.springframework.statemachine.data.RepositoryState; import org.springframework.statemachine.state.PseudoStateKind; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - /** * Redis entity for states. * diff --git a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryTransition.java b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryTransition.java index dfe2aec53..abc45bf77 100644 --- a/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryTransition.java +++ b/spring-statemachine-data/redis/src/main/java/org/springframework/statemachine/data/redis/RedisRepositoryTransition.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,26 +15,16 @@ */ package org.springframework.statemachine.data.redis; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import java.util.Set; - import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Reference; - -//import javax.persistence.FetchType; -//import javax.persistence.GeneratedValue; -//import javax.persistence.GenerationType; -//import javax.persistence.Id; -//import javax.persistence.OneToMany; -//import javax.persistence.OneToOne; - import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.index.Indexed; import org.springframework.statemachine.data.RepositoryTransition; import org.springframework.statemachine.transition.TransitionKind; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - /** * Redis entity for transitions. * diff --git a/spring-statemachine-platform/build.gradle b/spring-statemachine-platform/build.gradle index 90d74ad4f..7cf6b95bb 100644 --- a/spring-statemachine-platform/build.gradle +++ b/spring-statemachine-platform/build.gradle @@ -10,7 +10,7 @@ dependencies { api platform("org.springframework.boot:spring-boot-dependencies:$springBootVersion") constraints { api "log4j:log4j:$log4jVersion" - api "org.eclipse.persistence:javax.persistence:$eclipsePersistenceVersion" + api "jakarta.persistence:jakarta.persistence-api:$jakartaPersistenceVersion" api "com.esotericsoftware:kryo-shaded:$kryoVersion" api "org.springframework.shell:spring-shell:$springShellVersion" api "org.eclipse.uml2:uml:$eclipseUml2UmlVersion" diff --git a/spring-statemachine-samples/datapersist/src/main/java/demo/datapersist/StateMachineConfig.java b/spring-statemachine-samples/datapersist/src/main/java/demo/datapersist/StateMachineConfig.java index 0975c6569..06d58659f 100644 --- a/spring-statemachine-samples/datapersist/src/main/java/demo/datapersist/StateMachineConfig.java +++ b/spring-statemachine-samples/datapersist/src/main/java/demo/datapersist/StateMachineConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018 the original author or authors. + * Copyright 2017-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package demo.datapersist; import java.util.EnumSet; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-statemachine-samples/datapersist/src/main/resources/application.yml b/spring-statemachine-samples/datapersist/src/main/resources/application.yml index 5c16dccfa..243f1fc8f 100644 --- a/spring-statemachine-samples/datapersist/src/main/resources/application.yml +++ b/spring-statemachine-samples/datapersist/src/main/resources/application.yml @@ -13,7 +13,9 @@ security: --- spring: - profiles: jpa + config: + activate: + on-profile: jpa statemachine: data: mongo: @@ -24,7 +26,9 @@ spring: enabled: false --- spring: - profiles: mongo + config: + activate: + on-profile: mongo statemachine: data: jpa: @@ -35,7 +39,9 @@ spring: enabled: false --- spring: - profiles: redis + config: + activate: + on-profile: redis statemachine: data: jpa: diff --git a/spring-statemachine-samples/security/src/main/java/demo/security/StateMachineConfig.java b/spring-statemachine-samples/security/src/main/java/demo/security/StateMachineConfig.java index 71565c5fd..ced12d56e 100644 --- a/spring-statemachine-samples/security/src/main/java/demo/security/StateMachineConfig.java +++ b/spring-statemachine-samples/security/src/main/java/demo/security/StateMachineConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2015-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,20 +19,17 @@ import java.io.InputStream; import java.util.EnumSet; import java.util.Scanner; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.core.io.ClassPathResource; import org.springframework.security.access.annotation.Secured; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.statemachine.StateContext; import org.springframework.statemachine.action.Action; import org.springframework.statemachine.config.EnableStateMachine; @@ -45,133 +42,133 @@ @Configuration public class StateMachineConfig { - private static final Log log = LogFactory.getLog(StateMachineConfig.class); - -//tag::snippetE[] - @EnableWebSecurity - @EnableGlobalMethodSecurity(securedEnabled = true) - static class SecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth - .inMemoryAuthentication() - .withUser("user") - .password("password") - .roles("USER") - .and() - .withUser("admin") - .password("password") - .roles("USER", "ADMIN"); - } - } + private static final Log log = LogFactory.getLog(StateMachineConfig.class); + + //tag::snippetE[] + static class SecurityConfig { + + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withDefaultPasswordEncoder() + .username("user") + .password("password") + .roles("USER") + .build(); + UserDetails admin = User.withDefaultPasswordEncoder() + .username("admin") + .password("password") + .roles("USER", "ADMIN") + .build(); + return new InMemoryUserDetailsManager(user, admin); + } + } //end::snippetE[] - @Configuration - @EnableStateMachine - static class Config - extends EnumStateMachineConfigurerAdapter { - -//tag::snippetA[] - @Override - public void configure(StateMachineConfigurationConfigurer config) - throws Exception { - config - .withConfiguration() - .autoStartup(true) - .and() - .withSecurity() - .enabled(true) - .event("hasRole('USER')"); - } + @Configuration + @EnableStateMachine + static class Config + extends EnumStateMachineConfigurerAdapter { + + //tag::snippetA[] + @Override + public void configure(StateMachineConfigurationConfigurer config) + throws Exception { + config + .withConfiguration() + .autoStartup(true) + .and() + .withSecurity() + .enabled(true) + .event("hasRole('USER')"); + } //end::snippetA[] - @Override - public void configure(StateMachineStateConfigurer states) - throws Exception { - states - .withStates() - .initial(States.S0) - .states(EnumSet.allOf(States.class)); - } - -//tag::snippetB[] - @Override - public void configure(StateMachineTransitionConfigurer transitions) - throws Exception { - transitions - .withExternal() - .source(States.S0).target(States.S1).event(Events.A) - .and() - .withExternal() - .source(States.S1).target(States.S2).event(Events.B) - .and() - .withExternal() - .source(States.S2).target(States.S0).event(Events.C) - .and() - .withExternal() - .source(States.S2).target(States.S3).event(Events.E) - .secured("ROLE_ADMIN", ComparisonType.ANY) - .and() - .withExternal() - .source(States.S3).target(States.S0).event(Events.C) - .and() - .withInternal() - .source(States.S0).event(Events.D) - .action(adminAction()) - .and() - .withInternal() - .source(States.S1).event(Events.F) - .action(transitionAction()) - .secured("ROLE_ADMIN", ComparisonType.ANY); - } + @Override + public void configure(StateMachineStateConfigurer states) + throws Exception { + states + .withStates() + .initial(States.S0) + .states(EnumSet.allOf(States.class)); + } + + //tag::snippetB[] + @Override + public void configure(StateMachineTransitionConfigurer transitions) + throws Exception { + transitions + .withExternal() + .source(States.S0).target(States.S1).event(Events.A) + .and() + .withExternal() + .source(States.S1).target(States.S2).event(Events.B) + .and() + .withExternal() + .source(States.S2).target(States.S0).event(Events.C) + .and() + .withExternal() + .source(States.S2).target(States.S3).event(Events.E) + .secured("ROLE_ADMIN", ComparisonType.ANY) + .and() + .withExternal() + .source(States.S3).target(States.S0).event(Events.C) + .and() + .withInternal() + .source(States.S0).event(Events.D) + .action(adminAction()) + .and() + .withInternal() + .source(States.S1).event(Events.F) + .action(transitionAction()) + .secured("ROLE_ADMIN", ComparisonType.ANY); + } //end::snippetB[] -//tag::snippetC[] - @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) - @Bean - public Action adminAction() { - return new Action() { - - @Secured("ROLE_ADMIN") - @Override - public void execute(StateContext context) { - log.info("Executed only for admin role"); - } - }; - } + //tag::snippetC[] + @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) + @Bean + public Action adminAction() { + return new Action() { + + @Secured("ROLE_ADMIN") + @Override + public void execute(StateContext context) { + log.info("Executed only for admin role"); + } + }; + } //end::snippetC[] -//tag::snippetD[] - @Bean - public Action transitionAction() { - return new Action() { - - @Override - public void execute(StateContext context) { - log.info("Executed only for admin role"); - } - }; - } + //tag::snippetD[] + @Bean + public Action transitionAction() { + return new Action() { + + @Override + public void execute(StateContext context) { + log.info("Executed only for admin role"); + } + }; + } //end::snippetD[] - } - - @Bean - public String stateChartModel() throws IOException { - ClassPathResource model = new ClassPathResource("statechartmodel.txt"); - InputStream inputStream = model.getInputStream(); - Scanner scanner = new Scanner(inputStream); - String content = scanner.useDelimiter("\\Z").next(); - scanner.close(); - return content; - } - - public enum States { - S0, S1, S2, S3; - } - - public enum Events { - A, B, C, D, E, F; - } + } + + @Bean + public String stateChartModel() throws IOException { + ClassPathResource model = new ClassPathResource("statechartmodel.txt"); + InputStream inputStream = model.getInputStream(); + Scanner scanner = new Scanner(inputStream); + String content = scanner.useDelimiter("\\Z").next(); + scanner.close(); + return content; + } + + public enum States { + S0, S1, S2, S3; + } + + public enum Events { + A, B, C, D, E, F; + } } diff --git a/spring-statemachine-samples/web/src/main/java/demo/web/StateMachineController.java b/spring-statemachine-samples/web/src/main/java/demo/web/StateMachineController.java index cacf99f46..3cec99523 100644 --- a/spring-statemachine-samples/web/src/main/java/demo/web/StateMachineController.java +++ b/spring-statemachine-samples/web/src/main/java/demo/web/StateMachineController.java @@ -1,5 +1,5 @@ /* - * Copyright 2015-2019 the original author or authors. + * Copyright 2015-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,13 +15,13 @@ */ package demo.web; +import demo.web.StateMachineConfig.Events; +import demo.web.StateMachineConfig.States; +import jakarta.annotation.PostConstruct; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; - -import javax.annotation.PostConstruct; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -46,9 +46,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; - -import demo.web.StateMachineConfig.Events; -import demo.web.StateMachineConfig.States; import reactor.core.publisher.Mono; @Controller