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 6dd6c04d..a5ebee97 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 @@ -15,7 +15,6 @@ */ 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; @@ -32,6 +31,8 @@ import org.springframework.statemachine.boot.actuate.StateMachineTraceEndpoint; 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. * @@ -43,41 +44,41 @@ import org.springframework.statemachine.boot.support.BootStateMachineMonitor; @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-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 52b00f20..f1f17555 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 @@ -18,7 +18,11 @@ package org.springframework.statemachine.buildtests.tck.mongodb; import static org.junit.jupiter.api.extension.ConditionEvaluationResult.disabled; import static org.junit.jupiter.api.extension.ConditionEvaluationResult.enabled; -import java.net.Socket; +import java.net.InetAddress; +import java.net.ServerSocket; + +import javax.net.ServerSocketFactory; + import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; import org.junit.jupiter.api.extension.ExtensionContext; @@ -31,11 +35,19 @@ public class EnabledOnMongoDbCondition implements ExecutionCondition { @Override public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { - try { - new Socket("localhost", 27017); - return ENABLED_ON_MONGO; - } catch (Exception e) { - return DISABLED_ON_MONGO; - } + return isPortAvailable(27017) ? DISABLED_ON_MONGO : ENABLED_ON_MONGO; } + + private static boolean isPortAvailable(int port) { + try { + ServerSocket serverSocket = ServerSocketFactory.getDefault() + .createServerSocket(port, 1, InetAddress.getByName("localhost")); + serverSocket.close(); + return true; + } + catch (Exception ex) { + return false; + } + } + } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/action/StateDoActivityActionTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/action/StateDoActivityActionTests.java index 8cb78d7e..bee848af 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/action/StateDoActivityActionTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/action/StateDoActivityActionTests.java @@ -21,6 +21,7 @@ import static org.springframework.statemachine.TestUtils.doStartAndAssert; import static org.springframework.statemachine.TestUtils.resolveMachine; import java.util.concurrent.TimeUnit; + import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; 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 2a70da8c..0e545376 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 @@ -20,6 +20,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; 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; 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 527a76a4..e469132b 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 @@ -28,6 +28,7 @@ import org.springframework.statemachine.config.EnableStateMachine; 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; @@ -73,7 +74,7 @@ public class DocsConfigurationSampleTests12 { StepVerifier.create(machine.sendEvent(Mono.just(MessageBuilder.withPayload("E1").build()))) .consumeNextWith(result -> { StepVerifier.create(result.complete()).consumeErrorWith(e -> { - assertThat(e).isInstanceOf(StateMachineException.class).cause().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 807c5d5a..f86ef9a1 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 @@ -138,16 +138,16 @@ public class DocsConfigurationSampleTests3 { // tag::snippetE[] @Configuration - public static class Config5 { + public static class Config5 { - @Bean - public InMemoryUserDetailsManager userDetailsService() { - UserDetails user = User.withDefaultPasswordEncoder() - .username("user") - .password("password") - .roles("USER") - .build(); - return new InMemoryUserDetailsManager(user); + @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 d620370f..9745ad5d 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 @@ -20,6 +20,7 @@ import static org.springframework.statemachine.TestUtils.doSendEventAndConsumeAl 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; 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 2ab3c976..8f7d2f40 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 @@ -15,15 +15,17 @@ */ package org.springframework.statemachine.data.jpa; +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 d29c174b..5ca39b12 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 @@ -15,15 +15,17 @@ */ package org.springframework.statemachine.data.jpa; +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 448b530a..fabcd022 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 @@ -15,8 +15,15 @@ */ package org.springframework.statemachine.data.jpa; +import java.util.Set; + +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; + import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; @@ -32,10 +39,6 @@ import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import java.util.Set; -import org.springframework.statemachine.data.RepositoryAction; -import org.springframework.statemachine.data.RepositoryState; -import org.springframework.statemachine.state.PseudoStateKind; /** * JPA entity for states. 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 4dcb6d77..8a045c40 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 @@ -15,14 +15,16 @@ */ package org.springframework.statemachine.data.jpa; +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 141726c3..ffb92e40 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 @@ -15,8 +15,14 @@ */ package org.springframework.statemachine.data.jpa; +import java.util.Set; + +import org.springframework.statemachine.data.RepositoryTransition; +import org.springframework.statemachine.transition.TransitionKind; + import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -29,9 +35,6 @@ import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; -import java.util.Set; -import org.springframework.statemachine.data.RepositoryTransition; -import org.springframework.statemachine.transition.TransitionKind; /** * JPA entity for transitions. 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 cf7e6944..014553a8 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 @@ -18,24 +18,36 @@ package org.springframework.statemachine.data.mongodb; import static org.junit.jupiter.api.extension.ConditionEvaluationResult.disabled; import static org.junit.jupiter.api.extension.ConditionEvaluationResult.enabled; -import java.net.Socket; +import java.net.InetAddress; +import java.net.ServerSocket; + +import javax.net.ServerSocketFactory; + import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; import org.junit.jupiter.api.extension.ExtensionContext; 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) { + return isPortAvailable(27017) ? DISABLED_ON_MONGO : ENABLED_ON_MONGO; + } + + private static boolean isPortAvailable(int port) { + try { + ServerSocket serverSocket = ServerSocketFactory.getDefault() + .createServerSocket(port, 1, InetAddress.getByName("localhost")); + serverSocket.close(); + return true; + } + catch (Exception ex) { + return false; + } + } - @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 c35afa67..832a3e0b 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 @@ -15,12 +15,13 @@ */ 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 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 be56d496..6bcf99a7 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 @@ -15,12 +15,13 @@ */ 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 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 6a7512bd..cb8a053e 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 @@ -15,9 +15,8 @@ */ 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 org.springframework.data.redis.core.RedisHash; @@ -26,6 +25,9 @@ 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; + /** * 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 abc45bf7..e827837d 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 @@ -15,9 +15,8 @@ */ 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 org.springframework.data.redis.core.RedisHash; @@ -25,6 +24,9 @@ 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-samples/datapersist/src/main/java/demo/datapersist/StateMachineConfig.java b/spring-statemachine-samples/datapersist/src/main/java/demo/datapersist/StateMachineConfig.java index 06d58659..1bb1fc16 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 @@ -16,6 +16,7 @@ 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/security/src/main/java/demo/security/StateMachineConfig.java b/spring-statemachine-samples/security/src/main/java/demo/security/StateMachineConfig.java index ced12d56..a47b59a4 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 @@ -19,6 +19,7 @@ import java.io.IOException; 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.context.annotation.Bean; @@ -42,133 +43,133 @@ import org.springframework.statemachine.security.SecurityRule.ComparisonType; @Configuration public class StateMachineConfig { - private static final Log log = LogFactory.getLog(StateMachineConfig.class); + private static final Log log = LogFactory.getLog(StateMachineConfig.class); - //tag::snippetE[] - static class SecurityConfig { + //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); - } - } + @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 { + @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')"); - } + //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)); - } + @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); - } + //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() { + //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"); - } - }; - } + @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() { + //tag::snippetD[] + @Bean + public Action transitionAction() { + return new Action() { - @Override - public void execute(StateContext context) { - log.info("Executed only for admin role"); - } - }; - } + @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; - } + @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 States { + S0, S1, S2, S3; + } - public enum Events { - A, B, C, D, E, F; - } + 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 3cec9952..139b0682 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 @@ -15,13 +15,11 @@ */ 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 org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -46,6 +44,10 @@ import org.springframework.web.bind.annotation.RequestMethod; 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 jakarta.annotation.PostConstruct; import reactor.core.publisher.Mono; @Controller