From 501ef6c062467424eec4f8a5b31279725cd395ae Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Thu, 14 May 2026 08:22:33 +0200 Subject: [PATCH] fixed sonar issues --- .../api/services/JobService.java | 9 +++++++- .../api/services/SimpleTriggerService.java | 7 +++++-- .../api/services/TriggerService.java | 21 +++++++++++-------- .../api/services/CalendarServiceTest.java | 1 - .../api/services/JobServiceTest.java | 3 ++- .../services/SimpleTriggerServiceTest.java | 11 +++++++--- .../api/services/TriggerServiceTest.java | 6 +++++- .../src/test/resources/application.yml | 2 +- 8 files changed, 41 insertions(+), 19 deletions(-) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/JobService.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/JobService.java index bbc7b74..0ec1f16 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/JobService.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/JobService.java @@ -115,6 +115,13 @@ public class JobService { scheduler.deleteJob(jobKey); } + public Class getEligibleJobClass(String jobClassName) throws ClassNotFoundException { + return jobClasses.stream() + .filter(jobClass -> jobClass.getName().equals(jobClassName)) + .findFirst() + .orElseThrow(() -> new ClassNotFoundException("Job class " + jobClassName + " is not eligible")); + } + private JobKey requireJob(String group, String name) throws SchedulerException, JobNotFoundException { JobKey jobKey = JobKey.jobKey(name, group); if (!scheduler.checkExists(jobKey)) @@ -123,7 +130,7 @@ public class JobService { } private JobDetail buildJobDetail(JobKey jobKey, ScheduledJobInputDTO scheduledJobInputDTO) throws ClassNotFoundException { - Class jobClass = Class.forName(scheduledJobInputDTO.getJobClass()).asSubclass(Job.class); + Class jobClass = getEligibleJobClass(scheduledJobInputDTO.getJobClass()); JobBuilder jobBuilder = JobBuilder.newJob(jobClass) .withIdentity(jobKey) .storeDurably(scheduledJobInputDTO.isDurable()) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java index 174db6a..77afbba 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerService.java @@ -13,8 +13,11 @@ import org.springframework.stereotype.Service; @Service public class SimpleTriggerService extends AbstractSchedulerService { - public SimpleTriggerService(@Qualifier("quartzManagerScheduler") Scheduler scheduler, ConversionService conversionService) { + private final JobService jobService; + + public SimpleTriggerService(@Qualifier("quartzManagerScheduler") Scheduler scheduler, ConversionService conversionService, JobService jobService) { super(scheduler, conversionService); + this.jobService = jobService; } public SimpleTriggerDTO getSimpleTriggerByName(String name) throws SchedulerException, TriggerNotFoundException { @@ -49,7 +52,7 @@ public class SimpleTriggerService extends AbstractSchedulerService { scheduler.scheduleJob(newSimpleTrigger); } else { - Class jobClass = Class.forName(simpleTriggerCommandDTO.getSimpleTriggerInputDTO().getJobClass()).asSubclass(Job.class); + Class jobClass = jobService.getEligibleJobClass(simpleTriggerCommandDTO.getSimpleTriggerInputDTO().getJobClass()); JobDetail jobDetail = JobBuilder.newJob() .ofType(jobClass) .storeDurably(false) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/TriggerService.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/TriggerService.java index b5400af..45c3750 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/TriggerService.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/services/TriggerService.java @@ -15,7 +15,6 @@ import org.quartz.CronTrigger; import org.quartz.DailyTimeIntervalScheduleBuilder; import org.quartz.DailyTimeIntervalTrigger; import org.quartz.DateBuilder; -import org.quartz.Job; import org.quartz.JobBuilder; import org.quartz.JobDataMap; import org.quartz.JobDetail; @@ -43,13 +42,17 @@ import java.util.TimeZone; public class TriggerService { private static final int DEFAULT_PRIORITY = Trigger.DEFAULT_PRIORITY; + private static final String MISFIRE_DO_NOTHING = "DO_NOTHING"; + private static final String MISFIRE_IGNORE_MISFIRES = "IGNORE_MISFIRES"; private final Scheduler scheduler; private final ConversionService conversionService; + private final JobService jobService; - public TriggerService(@Qualifier("quartzManagerScheduler") Scheduler scheduler, ConversionService conversionService) { + public TriggerService(@Qualifier("quartzManagerScheduler") Scheduler scheduler, ConversionService conversionService, JobService jobService) { this.scheduler = scheduler; this.conversionService = conversionService; + this.jobService = jobService; } public List fetchTriggers() throws SchedulerException { @@ -83,7 +86,7 @@ public class TriggerService { } else { JobDetail jobDetail = JobBuilder.newJob() - .ofType(Class.forName(triggerInputDTO.getJobClass()).asSubclass(Job.class)) + .ofType(jobService.getEligibleJobClass(triggerInputDTO.getJobClass())) .storeDurably(false) .build(); scheduler.scheduleJob(jobDetail, newTrigger); @@ -262,24 +265,24 @@ public class TriggerService { private CronScheduleBuilder applyCronMisfireInstruction(CronScheduleBuilder scheduleBuilder, String misfireInstruction) { return switch (normalizeMisfireInstruction(misfireInstruction)) { - case "DO_NOTHING" -> scheduleBuilder.withMisfireHandlingInstructionDoNothing(); - case "IGNORE_MISFIRES" -> scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); + case MISFIRE_DO_NOTHING -> scheduleBuilder.withMisfireHandlingInstructionDoNothing(); + case MISFIRE_IGNORE_MISFIRES -> scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); default -> scheduleBuilder.withMisfireHandlingInstructionFireAndProceed(); }; } private DailyTimeIntervalScheduleBuilder applyDailyMisfireInstruction(DailyTimeIntervalScheduleBuilder scheduleBuilder, String misfireInstruction) { return switch (normalizeMisfireInstruction(misfireInstruction)) { - case "DO_NOTHING" -> scheduleBuilder.withMisfireHandlingInstructionDoNothing(); - case "IGNORE_MISFIRES" -> scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); + case MISFIRE_DO_NOTHING -> scheduleBuilder.withMisfireHandlingInstructionDoNothing(); + case MISFIRE_IGNORE_MISFIRES -> scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); default -> scheduleBuilder.withMisfireHandlingInstructionFireAndProceed(); }; } private CalendarIntervalScheduleBuilder applyCalendarIntervalMisfireInstruction(CalendarIntervalScheduleBuilder scheduleBuilder, String misfireInstruction) { return switch (normalizeMisfireInstruction(misfireInstruction)) { - case "DO_NOTHING" -> scheduleBuilder.withMisfireHandlingInstructionDoNothing(); - case "IGNORE_MISFIRES" -> scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); + case MISFIRE_DO_NOTHING -> scheduleBuilder.withMisfireHandlingInstructionDoNothing(); + case MISFIRE_IGNORE_MISFIRES -> scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); default -> scheduleBuilder.withMisfireHandlingInstructionFireAndProceed(); }; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/CalendarServiceTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/CalendarServiceTest.java index bfd042b..ee18bc4 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/CalendarServiceTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/CalendarServiceTest.java @@ -20,7 +20,6 @@ import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.calendar.AnnualCalendar; import org.quartz.impl.calendar.CronCalendar; -import org.quartz.impl.calendar.DailyCalendar; import org.quartz.impl.calendar.HolidayCalendar; import org.quartz.impl.calendar.MonthlyCalendar; import org.quartz.impl.calendar.WeeklyCalendar; diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/JobServiceTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/JobServiceTest.java index 00a5d08..3378fde 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/JobServiceTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/JobServiceTest.java @@ -47,6 +47,7 @@ class JobServiceTest { void setUp() { MockitoAnnotations.openMocks(this); schedulerBackedJobService = new JobService("", scheduler, conversionService); + schedulerBackedJobService.getJobClasses().add(SampleJob.class); } @Test @@ -106,7 +107,7 @@ class JobServiceTest { Assertions.assertThat(scheduledJobs.get(0).getDescription()).isEqualTo("sample"); Assertions.assertThat(scheduledJobs.get(0).isDurable()).isTrue(); Assertions.assertThat(scheduledJobs.get(0).isRequestsRecovery()).isTrue(); - Assertions.assertThat(scheduledJobs.get(0).getJobDataMap().get("key")).isEqualTo("value"); + Assertions.assertThat((Map) scheduledJobs.get(0).getJobDataMap()).containsEntry("key", "value"); Assertions.assertThat(scheduledJobs.get(0).getTriggerKeys()).hasSize(1); } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java index 167d993..2c309e6 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/SimpleTriggerServiceTest.java @@ -3,6 +3,7 @@ package it.fabioformosa.quartzmanager.api.services; import it.fabioformosa.quartzmanager.api.common.utils.DateUtils; import it.fabioformosa.quartzmanager.api.dto.*; import it.fabioformosa.quartzmanager.api.exceptions.TriggerNotFoundException; +import it.fabioformosa.quartzmanager.api.jobs.SampleJob; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -29,9 +30,13 @@ class SimpleTriggerServiceTest { @Mock private ConversionService conversionService; + @Mock + private JobService jobService; + @BeforeEach - void setUp() { + void setUp() throws ClassNotFoundException { openMocks(this); + Mockito.doReturn(SampleJob.class).when(jobService).getEligibleJobClass(SampleJob.class.getName()); } @Test @@ -62,7 +67,7 @@ class SimpleTriggerServiceTest { @Test void givenASimpleTriggerCommandDTO_whenASimpleTriggerIsScheduled_thenATriggerDTOIsReturned() throws SchedulerException, ClassNotFoundException { SimpleTriggerInputDTO triggerInputDTO = SimpleTriggerInputDTO.builder() - .jobClass("it.fabioformosa.quartzmanager.api.jobs.SampleJob") + .jobClass(SampleJob.class.getName()) .startDate(new Date()) .repeatInterval(5000L).repeatCount(5) .endDate(DateUtils.addHoursToNow(1)) @@ -98,7 +103,7 @@ class SimpleTriggerServiceTest { } @Test - void givenASimpleTriggerCommandDTO_whenASimpleTriggerIsRecheduled_thenATriggerDTOIsReturned() throws SchedulerException, ClassNotFoundException, TriggerNotFoundException { + void givenASimpleTriggerCommandDTO_whenASimpleTriggerIsRecheduled_thenATriggerDTOIsReturned() throws SchedulerException, TriggerNotFoundException { SimpleTriggerInputDTO triggerInputDTO = SimpleTriggerInputDTO.builder() .jobClass("it.fabioformosa.quartzmanager.api.jobs.SampleJob") .startDate(new Date()) diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java index b2b862a..47e3a53 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/services/TriggerServiceTest.java @@ -50,9 +50,13 @@ class TriggerServiceTest { @Mock private ConversionService conversionService; + @Mock + private JobService jobService; + @BeforeEach - void setUp(){ + void setUp() throws ClassNotFoundException { MockitoAnnotations.openMocks(this); + Mockito.doReturn(SampleJob.class).when(jobService).getEligibleJobClass(SampleJob.class.getName()); } @Test diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/resources/application.yml b/quartz-manager-parent/quartz-manager-starter-api/src/test/resources/application.yml index 7378be2..9e37bd5 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/test/resources/application.yml +++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/resources/application.yml @@ -2,7 +2,7 @@ quartz: enabled: true quartz-manager: - jobClassPackages: it.fabioformosa.quartzmanager.api.jobs + jobClassPackages: it.fabioformosa.quartzmanager.api.jobs, it.fabioformosa.samplepackage logging: level: