diff --git a/.gitignore b/.gitignore index f5df7bb..cbd7a6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /.project .idea *.iml -.DS_Store +.DS_Store \ No newline at end of file diff --git a/quartz-manager-parent/.gitignore b/quartz-manager-parent/.gitignore index a080dd8..29e1e7f 100644 --- a/quartz-manager-parent/.gitignore +++ b/quartz-manager-parent/.gitignore @@ -4,3 +4,4 @@ .classpath .project .idea +*.iml diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml index aaf0b03..a9e3bea 100644 --- a/quartz-manager-parent/pom.xml +++ b/quartz-manager-parent/pom.xml @@ -10,7 +10,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.8 + 4.0.9-SNAPSHOT pom @@ -78,27 +78,27 @@ it.fabioformosa.quartz-manager quartz-manager-common - 4.0.8 + 4.0.9-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-api - 4.0.8 + 4.0.9-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-security - 4.0.8 + 4.0.9-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-persistence - 4.0.8 + 4.0.9-SNAPSHOT it.fabioformosa.quartz-manager quartz-manager-starter-ui - 4.0.8 + 4.0.9-SNAPSHOT diff --git a/quartz-manager-parent/quartz-manager-common/pom.xml b/quartz-manager-parent/quartz-manager-common/pom.xml index 7d20009..8a82658 100644 --- a/quartz-manager-parent/quartz-manager-common/pom.xml +++ b/quartz-manager-parent/quartz-manager-common/pom.xml @@ -3,7 +3,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.8 + 4.0.9-SNAPSHOT quartz-manager-common diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml index 1baaff5..60b66f7 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml @@ -5,7 +5,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.8 + 4.0.9-SNAPSHOT quartz-manager-starter-api diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/WebsocketConfig.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/WebsocketConfig.java index 67b07d3..2580bfe 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/WebsocketConfig.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/WebsocketConfig.java @@ -1,5 +1,6 @@ package it.fabioformosa.quartzmanager.api.configuration; +import it.fabioformosa.quartzmanager.api.common.config.QuartzManagerPaths; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; @@ -14,14 +15,16 @@ public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { - config.enableSimpleBroker("/topic"); - config.setApplicationDestinationPrefixes("/job"); + config.enableSimpleBroker("/topic"); //enable a simple memory-based message broker + // on destinations prefixed with /topic + config.setApplicationDestinationPrefixes("/job"); // it designates the prefix for messages + // that are bound for methods annotated with @MessageMapping } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { - registry.addEndpoint("/quartz-manager/logs").setAllowedOrigins("/**").withSockJS(); - registry.addEndpoint("/quartz-manager/progress").setAllowedOrigins("/**").withSockJS(); + registry.addEndpoint(QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/logs").setAllowedOrigins("/**").withSockJS(); + registry.addEndpoint(QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/progress").setAllowedOrigins("/**").withSockJS(); } } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/WebsocketController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/WebsocketController.java index 8afe860..3baf7af 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/WebsocketController.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/WebsocketController.java @@ -8,7 +8,10 @@ import org.springframework.stereotype.Controller; @Controller public class WebsocketController { - @MessageMapping({ QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/logs", QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/progress" }) + @MessageMapping({ + QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/logs", + QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/progress" + }) @SendTo("/topic/logs") public String subscribe() { return "subscribed"; diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerCommandDTOToSimpleTrigger.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerCommandDTOToSimpleTrigger.java index 08cf37c..bea3bcf 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerCommandDTOToSimpleTrigger.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerCommandDTOToSimpleTrigger.java @@ -2,6 +2,7 @@ package it.fabioformosa.quartzmanager.api.converters; import it.fabioformosa.quartzmanager.api.dto.SimpleTriggerCommandDTO; +import org.quartz.JobDataMap; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.Trigger; @@ -19,6 +20,8 @@ public class SimpleTriggerCommandDTOToSimpleTrigger implements Converter jobDataMap; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerDTO.java index f6182c2..0e1d772 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerDTO.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerDTO.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import org.quartz.JobDataMap; import java.util.Date; @@ -23,4 +24,5 @@ public class TriggerDTO { private JobKeyDTO jobKeyDTO; private JobDetailDTO jobDetailDTO; private boolean mayFireAgain; + private JobDataMap jobDataMap; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java index e5f93de..9ced563 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/websockets/WebSocketLogsNotifier.java @@ -14,7 +14,7 @@ public class WebSocketLogsNotifier implements WebhookSender { private SimpMessageSendingOperations messagingTemplate; @Override - public void send(LogRecord logRecord) { + public void send(LogRecord logRecord) { messagingTemplate.convertAndSend(TOPIC_LOGS, logRecord); } } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerTest.java index a981950..01472e4 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerTest.java @@ -21,7 +21,8 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import java.util.Date; - +import java.util.Map; +import static java.util.Map.entry; import static org.mockito.ArgumentMatchers.any; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -68,6 +69,10 @@ class SimpleTriggerControllerTest { } private SimpleTriggerInputDTO buildACompleteSimpleTriggerCommandDTO() { + Map triggerJobDataMap = Map.ofEntries( + entry("customTriggerData1", "value1"), + entry("customTriggerData2", "value2") + ); return SimpleTriggerInputDTO.builder() .jobClass("it.fabioformosa.quartzmanager.api.jobs.SampleJob") .startDate(new Date()) @@ -75,6 +80,7 @@ class SimpleTriggerControllerTest { .misfireInstruction(MisfireInstruction.MISFIRE_INSTRUCTION_FIRE_NOW) .repeatCount(5) .repeatInterval(1000L * 60 * 60) + .jobDataMap(triggerJobDataMap) .build(); } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TriggerUtils.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TriggerUtils.java index caea6f0..4add372 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TriggerUtils.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TriggerUtils.java @@ -2,12 +2,23 @@ package it.fabioformosa.quartzmanager.api.controllers.utils; import it.fabioformosa.quartzmanager.api.common.utils.DateUtils; import it.fabioformosa.quartzmanager.api.dto.*; +import org.quartz.JobDataMap; +import org.quartz.SimpleScheduleBuilder; +import org.quartz.SimpleTrigger; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.util.Date; +import java.util.Map; + +import static java.util.Map.entry; public class TriggerUtils { - static public TriggerDTO getTriggerInstance(String triggerName){ + static public TriggerDTO getTriggerInstance(String triggerName) { return TriggerDTO.builder() .description("sample trigger") .endTime(DateUtils.addHoursToNow(2L)) @@ -28,7 +39,7 @@ public class TriggerUtils { .build(); } - static public SimpleTriggerDTO getSimpleTriggerInstance(String triggerName, SimpleTriggerInputDTO simpleTriggerInputDTO){ + static public SimpleTriggerDTO getSimpleTriggerInstance(String triggerName, SimpleTriggerInputDTO simpleTriggerInputDTO) { return SimpleTriggerDTO.builder() .description("simple trigger") .repeatCount(simpleTriggerInputDTO.getRepeatCount()) @@ -48,10 +59,11 @@ public class TriggerUtils { .nextFireTime(DateUtils.addHoursToNow(1L)) .priority(1) .startTime(DateUtils.fromLocalDateTimeToDate(LocalDateTime.now())) + .jobDataMap(new JobDataMap(simpleTriggerInputDTO.getJobDataMap())) .build(); } - static public SimpleTriggerDTO getSimpleTriggerInstance(String triggerName){ + static public SimpleTriggerDTO getSimpleTriggerInstance(String triggerName) { return SimpleTriggerDTO.builder() .description("simple trigger") .repeatCount(2) @@ -71,6 +83,44 @@ public class TriggerUtils { .nextFireTime(DateUtils.addHoursToNow(1L)) .priority(1) .startTime(DateUtils.fromLocalDateTimeToDate(LocalDateTime.now())) + .jobDataMap(new JobDataMap(Map.ofEntries(entry("customTriggerData1", "value1")))) + .build(); + } + + static public SimpleTrigger buildSimpleTrigger() { + TriggerBuilder triggerTriggerBuilder = TriggerBuilder.newTrigger(); + triggerTriggerBuilder.startAt(new Date()); + triggerTriggerBuilder.endAt(DateUtils.addHoursToNow(1)); + triggerTriggerBuilder.usingJobData(new JobDataMap(Map.ofEntries(entry("data", "value")))); + + SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule(); + scheduleBuilder.withIntervalInMilliseconds(1000); + scheduleBuilder.withRepeatCount(1); + scheduleBuilder.withMisfireHandlingInstructionFireNow(); + + return triggerTriggerBuilder.withSchedule( + scheduleBuilder + ) + .withIdentity("simpleTrigger").build(); + } + + static public SimpleTriggerCommandDTO buildSimpleTriggerCommandDTO(String triggerName) throws ParseException { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = dateFormat.parse("2024-02-02"); + Date endDate = dateFormat.parse("2024-03-02"); + + SimpleTriggerInputDTO triggerInputDTO = SimpleTriggerInputDTO.builder() + .misfireInstruction(MisfireInstruction.MISFIRE_INSTRUCTION_FIRE_NOW) + .jobClass("sample.jobClass") + .repeatCount(1) + .repeatInterval(1000L) + .startDate(startDate) + .endDate(endDate) + .jobDataMap(Map.ofEntries(entry("data", "value"))) + .build(); + return SimpleTriggerCommandDTO.builder() + .triggerName(triggerName) + .simpleTriggerInputDTO(triggerInputDTO) .build(); } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerCommandDTOToSimpleTriggerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerCommandDTOToSimpleTriggerTest.java new file mode 100644 index 0000000..63ba0cf --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerCommandDTOToSimpleTriggerTest.java @@ -0,0 +1,41 @@ +package it.fabioformosa.quartzmanager.api.converters; + +import it.fabioformosa.quartzmanager.api.controllers.utils.TriggerUtils; +import it.fabioformosa.quartzmanager.api.dto.SimpleTriggerCommandDTO; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.quartz.SimpleTrigger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.convert.ConversionService; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@SpringBootTest +class SimpleTriggerCommandDTOToSimpleTriggerTest { + + @Autowired + private ConversionService conversionService; + + @Order(1) + @Test + void givenSimpleTriggerCommandDTO_whenItIsConverted_thenASimpleTriggerIsReturned() throws ParseException { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = dateFormat.parse("2024-02-02"); + Date endDate = dateFormat.parse("2024-03-02"); + SimpleTriggerCommandDTO simpleTriggerCommandDTO = TriggerUtils.buildSimpleTriggerCommandDTO("mytrigger"); + SimpleTrigger simpleTrigger = conversionService.convert(simpleTriggerCommandDTO, SimpleTrigger.class); + Assertions.assertThat(simpleTrigger).isNotNull(); + Assertions.assertThat(simpleTrigger.getRepeatCount()).isEqualTo(simpleTriggerCommandDTO.getSimpleTriggerInputDTO().getRepeatCount()); + Assertions.assertThat(simpleTrigger.getRepeatInterval()).isEqualTo(simpleTriggerCommandDTO.getSimpleTriggerInputDTO().getRepeatInterval()); + Assertions.assertThat(simpleTrigger.getJobDataMap()).containsEntry("data", "value"); + Assertions.assertThat(simpleTrigger.getStartTime()).isEqualTo(startDate); + Assertions.assertThat(simpleTrigger.getEndTime()).isEqualTo(endDate); + } +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerToSimpleTriggerDTOTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerToSimpleTriggerDTOTest.java new file mode 100644 index 0000000..fa63edd --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/converters/SimpleTriggerToSimpleTriggerDTOTest.java @@ -0,0 +1,36 @@ +package it.fabioformosa.quartzmanager.api.converters; + +import it.fabioformosa.quartzmanager.api.controllers.utils.TriggerUtils; +import it.fabioformosa.quartzmanager.api.dto.SimpleTriggerDTO; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.quartz.SimpleTrigger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.convert.ConversionService; + + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@SpringBootTest +class SimpleTriggerToSimpleTriggerDTOTest { + + @Autowired + private ConversionService conversionService; + + @Order(1) + @Test + void givenSimpleTrigger_whenItIsConverted_thenADtoIsReturned() { + SimpleTrigger simpleTrigger = TriggerUtils.buildSimpleTrigger(); + SimpleTriggerDTO simpleTriggerDTO = conversionService.convert(simpleTrigger, SimpleTriggerDTO.class); + Assertions.assertThat(simpleTriggerDTO).isNotNull(); + Assertions.assertThat(simpleTriggerDTO.getRepeatCount()).isEqualTo(simpleTrigger.getRepeatCount()); + Assertions.assertThat(simpleTriggerDTO.getRepeatInterval()).isEqualTo(simpleTrigger.getRepeatInterval()); + Assertions.assertThat(simpleTriggerDTO.getJobDataMap()).containsEntry("data", "value"); + Assertions.assertThat(simpleTriggerDTO.getStartTime()).isEqualTo(simpleTrigger.getStartTime()); + Assertions.assertThat(simpleTriggerDTO.getEndTime()).isEqualTo(simpleTrigger.getEndTime()); + } +} + diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml index e9b5f37..20c5b59 100644 --- a/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml @@ -3,7 +3,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.8 + 4.0.9-SNAPSHOT quartz-manager-starter-persistence diff --git a/quartz-manager-parent/quartz-manager-starter-security/pom.xml b/quartz-manager-parent/quartz-manager-starter-security/pom.xml index 8529f26..fbcc5c6 100644 --- a/quartz-manager-parent/quartz-manager-starter-security/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-security/pom.xml @@ -4,7 +4,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.8 + 4.0.9-SNAPSHOT quartz-manager-starter-security diff --git a/quartz-manager-parent/quartz-manager-starter-ui/pom.xml b/quartz-manager-parent/quartz-manager-starter-ui/pom.xml index 5dc66c7..9575968 100644 --- a/quartz-manager-parent/quartz-manager-starter-ui/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-ui/pom.xml @@ -4,7 +4,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.8 + 4.0.9-SNAPSHOT quartz-manager-starter-ui diff --git a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml index f4d4000..d2d1ce0 100644 --- a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml +++ b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml @@ -5,7 +5,7 @@ it.fabioformosa.quartz-manager quartz-manager-parent - 4.0.8 + 4.0.9-SNAPSHOT quartz-manager-web-showcase