From 323c662cbc97c4a783b9748e56ea865486beab25 Mon Sep 17 00:00:00 2001 From: Maximilian Walz Date: Thu, 8 May 2025 16:58:27 +0200 Subject: [PATCH] add db --- build.gradle | 4 +- .../trafficlight/StateRepository.java | 53 +++++++++++++++++++ .../TrafficLightPersistanceService.java | 18 +++++++ .../TrafficLightStateMachineConfig.java | 7 ++- src/main/resources/application.properties | 6 ++- 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/w665/pr/statemachine/trafficlight/StateRepository.java create mode 100644 src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightPersistanceService.java diff --git a/build.gradle b/build.gradle index 1df2367..2321ded 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ version = '0.0.1-SNAPSHOT' java { toolchain { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(22) } } @@ -31,6 +31,8 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // https://mvnrepository.com/artifact/org.springframework.statemachine/spring-statemachine-core implementation 'org.springframework.statemachine:spring-statemachine-core:4.0.0' + implementation 'org.jdbi:jdbi3-core:3.49.3' + implementation 'com.mysql:mysql-connector-j:9.3.0' } tasks.named('test') { diff --git a/src/main/java/de/w665/pr/statemachine/trafficlight/StateRepository.java b/src/main/java/de/w665/pr/statemachine/trafficlight/StateRepository.java new file mode 100644 index 0000000..1db5957 --- /dev/null +++ b/src/main/java/de/w665/pr/statemachine/trafficlight/StateRepository.java @@ -0,0 +1,53 @@ +package de.w665.pr.statemachine.trafficlight; + +import jakarta.annotation.PostConstruct; +import org.jdbi.v3.core.Jdbi; +import org.jdbi.v3.core.mapper.EnumMapper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; + +@Repository +public class StateRepository { + + @Value("${db.address}") + private String dbAddress; + + @Value("${db.username}") + private String dbUsername; + + @Value("${db.password}") + private String dbPassword; + + Jdbi jdbi; + + @PostConstruct + public void init() { + jdbi = Jdbi.create(dbAddress, dbUsername, dbPassword); + + // Register enum mapper for TrafficLightStates + jdbi.registerColumnMapper(TrafficLightStates.class, + EnumMapper.byName(TrafficLightStates.class)); + + // Create the table if it doesn't exist + jdbi.useHandle(handle -> { + handle.execute(""" + CREATE TABLE IF NOT EXISTS trafficlightstate ( + id SERIAL PRIMARY KEY, + state VARCHAR(10) NOT NULL, + timestamp TIMESTAMP NOT NULL + ) + """); + }); + } + + public void saveTrafficLightState(TrafficLightStates trafficLightState) { + jdbi.useHandle(handle -> { + handle.createUpdate("INSERT INTO trafficlightstate (state, timestamp) VALUES (:state, :timestamp)") + .bind("state", trafficLightState.name()) + .bind("timestamp", LocalDateTime.now()) + .execute(); + }); + } +} diff --git a/src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightPersistanceService.java b/src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightPersistanceService.java new file mode 100644 index 0000000..aa1248f --- /dev/null +++ b/src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightPersistanceService.java @@ -0,0 +1,18 @@ +package de.w665.pr.statemachine.trafficlight; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class TrafficLightPersistanceService { + + private StateRepository stateRepository; + + public TrafficLightPersistanceService(StateRepository stateRepository) { + this.stateRepository = stateRepository; + } + + public void persistTrafficLightState(TrafficLightStates trafficLightState) { + stateRepository.saveTrafficLightState(trafficLightState); + } +} diff --git a/src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightStateMachineConfig.java b/src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightStateMachineConfig.java index 8db2cb4..018c120 100644 --- a/src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightStateMachineConfig.java +++ b/src/main/java/de/w665/pr/statemachine/trafficlight/TrafficLightStateMachineConfig.java @@ -20,6 +20,7 @@ public class TrafficLightStateMachineConfig extends StateMachineConfigurerAdapte private final MinimumTimePassedGuard minimumTimePassedGuard; private final TimingContext timingContext; + private final TrafficLightPersistanceService trafficLightPersistanceService; @Override public void configure(StateMachineStateConfigurer states) throws Exception{ @@ -59,7 +60,11 @@ public class TrafficLightStateMachineConfig extends StateMachineConfigurerAdapte @Bean public Action recordTransitionAction() { - return context -> timingContext.recordTransition(); + return context -> { + TrafficLightStates targetState = context.getTarget().getId(); + trafficLightPersistanceService.persistTrafficLightState(targetState); + timingContext.recordTransition(); + }; } @Bean diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b8776d4..da96dab 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1,6 @@ spring.application.name=statemachine -server.port=80 \ No newline at end of file +server.port=80 + +db.address=jdbc:mysql://hymax.online:3306/jdbitest +db.username=rememcloud +db.password=WdtIhXPtNawGgq0gt340 \ No newline at end of file