diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml
index 28290b7..ad072f9 100644
--- a/quartz-manager-parent/pom.xml
+++ b/quartz-manager-parent/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.5.6
+ 4.0.6
it.fabioformosa.quartz-manager
@@ -41,17 +41,17 @@
- 9
+ 17
UTF-8
- 1.18.30
- 2.22.0
- 2.22.0
- 0.8.8
- 3.4.1
+ 1.18.42
+ 3.5.4
+ 3.5.4
+ 0.8.14
+ 3.12.0
1.6.7
2.5.3
3.0.1
- 3.11.0.3922
+ 5.2.0.4988
fabioformosa
https://sonarcloud.io
@@ -111,12 +111,11 @@
-
- org.junit.jupiter
- junit-jupiter
- 5.7.2
- test
-
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
@@ -125,9 +124,15 @@
org.apache.maven.plugins
maven-compiler-plugin
- ${java.version}
- ${java.version}
+ ${java.version}
${project.build.sourceEncoding}
+
+
+ org.projectlombok
+ lombok
+ ${org.projectlombok.version}
+
+
diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml
index 288be76..33a827f 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml
+++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml
@@ -18,8 +18,8 @@
${basedir}/../..
UTF-8
UTF-8
- 1.5.12
- 9
+ 3.0.3
+ 17
**/QuartManagerApplicationTests.java, **/OpenApiConfig.java
@@ -61,6 +61,11 @@
spring-boot-starter-test
test
+
+ org.springframework.boot
+ spring-boot-webmvc-test
+ test
+
@@ -86,21 +91,6 @@
metamorphosis-core
3.0.0
-
- javax.validation
- validation-api
- 2.0.1.Final
-
-
- org.hibernate.validator
- hibernate-validator
- 6.0.2.Final
-
-
- org.glassfish
- javax.el
- 3.0.0
-
org.reflections
reflections
@@ -125,15 +115,10 @@
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
${springdoc-openapi.version}
true
-
- org.springdoc
- springdoc-openapi-common
- ${springdoc-openapi.version}
-
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/OpenApiConfig.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/OpenApiConfig.java
index 1eb92b7..86bc22f 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/OpenApiConfig.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/OpenApiConfig.java
@@ -6,8 +6,8 @@ import io.swagger.v3.oas.models.info.License;
import it.fabioformosa.quartzmanager.api.common.config.QuartzManagerPaths;
import lombok.Generated;
import lombok.extern.slf4j.Slf4j;
-import org.springdoc.core.GroupedOpenApi;
-import org.springdoc.core.customizers.OpenApiCustomiser;
+import org.springdoc.core.customizers.OpenApiCustomizer;
+import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -39,10 +39,10 @@ public class OpenApiConfig {
@ConditionalOnProperty(name = "quartz-manager.oas.enabled")
@Bean
- public GroupedOpenApi quartzManagerStoreOpenApi(@Autowired(required = false) @Qualifier("quartzManagerOpenApiCustomiser") Optional openApiCustomiser) {
+ public GroupedOpenApi quartzManagerStoreOpenApi(@Autowired(required = false) @Qualifier("quartzManagerOpenApiCustomizer") Optional openApiCustomizer) {
String[] paths = {QuartzManagerPaths.QUARTZ_MANAGER_BASE_CONTEXT_PATH + "/**"};
GroupedOpenApi.Builder groupedOpenApiBuilder = GroupedOpenApi.builder().group("quartz-manager").pathsToMatch(paths);
- openApiCustomiser.ifPresent(groupedOpenApiBuilder::addOpenApiCustomiser);
+ openApiCustomizer.ifPresent(groupedOpenApiBuilder::addOpenApiCustomizer);
return groupedOpenApiBuilder.build();
}
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/QuartzManagerApiConfig.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/QuartzManagerApiConfig.java
index 2655835..1111811 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/QuartzManagerApiConfig.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/configuration/QuartzManagerApiConfig.java
@@ -1,9 +1,38 @@
package it.fabioformosa.quartzmanager.api.configuration;
+import it.fabioformosa.metamorphosis.core.converters.AbstractBaseConverter;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.core.convert.support.DefaultConversionService;
+
+import java.lang.reflect.Field;
+import java.util.List;
@ComponentScan(basePackages = {"it.fabioformosa.quartzmanager.api"})
@Configuration
public class QuartzManagerApiConfig {
+
+ @Bean
+ public ConversionService conversionService(List> converters) {
+ DefaultConversionService conversionService = new DefaultConversionService();
+ converters.forEach(conversionService::addConverter);
+ converters.stream()
+ .filter(AbstractBaseConverter.class::isInstance)
+ .map(AbstractBaseConverter.class::cast)
+ .forEach(converter -> setConversionService(converter, conversionService));
+ return conversionService;
+ }
+
+ private void setConversionService(AbstractBaseConverter, ?> converter, ConversionService conversionService) {
+ try {
+ Field conversionServiceField = AbstractBaseConverter.class.getDeclaredField("conversionService");
+ conversionServiceField.setAccessible(true);
+ conversionServiceField.set(converter, conversionService);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new IllegalStateException("Unable to initialize Quartz Manager converters", e);
+ }
+ }
}
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 2580bfe..9a93ca4 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
@@ -4,14 +4,14 @@ 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;
-import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@ComponentScan(basePackages = {"it.fabioformosa.quartzmanager.api.websockets"})
@EnableWebSocketMessageBroker
-public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
+public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerController.java
index 22e53f1..1fd1b4c 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerController.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerController.java
@@ -19,7 +19,7 @@ import org.quartz.SchedulerException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
-import javax.validation.Valid;
+import jakarta.validation.Valid;
@Slf4j
@RequestMapping(SimpleTriggerController.SIMPLE_TRIGGER_CONTROLLER_BASE_URL)
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/TriggerToTriggerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/TriggerToTriggerDTO.java
index 77c50ba..81dc553 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/TriggerToTriggerDTO.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/converters/TriggerToTriggerDTO.java
@@ -8,15 +8,23 @@ import it.fabioformosa.quartzmanager.api.dto.TriggerKeyDTO;
import org.quartz.JobKey;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
-import org.springframework.stereotype.Component;
+import org.springframework.beans.factory.annotation.Autowired;
-@Component
-public class TriggerToTriggerDTO extends AbstractBaseConverter {
+public abstract class TriggerToTriggerDTO extends AbstractBaseConverter {
+
+ @Autowired
+ private TriggerKeyToTriggerKeyDTO triggerKeyToTriggerKeyDTO;
+
+ @Autowired
+ private JobKeyToJobKeyDTO jobKeyToJobKeyDTO;
+
+ @Autowired
+ private JobKeyToJobDetailDTO jobKeyToJobDetailDTO;
@Override
protected void convert(S source, T target) {
TriggerKey triggerKey = source.getKey();
- TriggerKeyDTO triggerKeyDTO = conversionService.convert(triggerKey, TriggerKeyDTO.class);
+ TriggerKeyDTO triggerKeyDTO = triggerKeyToTriggerKeyDTO.convert(triggerKey);
target.setTriggerKeyDTO(triggerKeyDTO);
target.setStartTime(source.getStartTime());
@@ -29,16 +37,15 @@ public class TriggerToTriggerDTO extend
target.setMayFireAgain(source.mayFireAgain());
JobKey jobKey = source.getJobKey();
- JobKeyDTO jobKeyDTO = conversionService.convert(jobKey, JobKeyDTO.class);
+ if (jobKey == null) {
+ return;
+ }
+
+ JobKeyDTO jobKeyDTO = jobKeyToJobKeyDTO.convert(jobKey);
target.setJobKeyDTO(jobKeyDTO);
- JobDetailDTO jobDetailDTO = conversionService.convert(jobKey, JobDetailDTO.class);
+ JobDetailDTO jobDetailDTO = jobKeyToJobDetailDTO.convert(jobKey);
target.setJobDetailDTO(jobDetailDTO);
}
- @Override
- protected T createOrRetrieveTarget(S source) {
- return (T) new TriggerDTO();
- }
-
}
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SimpleTriggerInputDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SimpleTriggerInputDTO.java
index 8c643fd..265167e 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SimpleTriggerInputDTO.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/SimpleTriggerInputDTO.java
@@ -3,8 +3,8 @@ package it.fabioformosa.quartzmanager.api.dto;
import it.fabioformosa.quartzmanager.api.validators.ValidTriggerRepetition;
import lombok.*;
import lombok.experimental.SuperBuilder;
-import javax.annotation.Nullable;
-import javax.validation.constraints.Positive;
+import jakarta.annotation.Nullable;
+import jakarta.validation.constraints.Positive;
import java.util.Map;
@ValidTriggerRepetition
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerCommandDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerCommandDTO.java
index 2ea91b4..bf30318 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerCommandDTO.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/dto/TriggerCommandDTO.java
@@ -5,7 +5,7 @@ import it.fabioformosa.quartzmanager.api.validators.ValidTriggerPeriod;
import lombok.*;
import lombok.experimental.SuperBuilder;
-import javax.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotBlank;
import java.util.Date;
@ValidTriggerPeriod
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java
index 20d6c90..4ed6e7e 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/jobs/AbstractQuartzManagerJob.java
@@ -9,7 +9,7 @@ import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
/**
* Extends this class to create a job that produces LogRecord to be displayed
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 500e9ff..3433e4e 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
@@ -8,7 +8,7 @@ import org.reflections.Reflections;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import java.util.*;
import java.util.stream.Collectors;
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 908f815..d875966 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
@@ -21,7 +21,7 @@ public class SimpleTriggerService extends AbstractSchedulerService {
}
public SimpleTriggerDTO scheduleSimpleTrigger(SimpleTriggerCommandDTO simpleTriggerCommandDTO) throws SchedulerException, ClassNotFoundException {
- Class extends Job> jobClass = (Class extends Job>) Class.forName(simpleTriggerCommandDTO.getSimpleTriggerInputDTO().getJobClass());
+ Class extends Job> jobClass = Class.forName(simpleTriggerCommandDTO.getSimpleTriggerInputDTO().getJobClass()).asSubclass(Job.class);
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 31bfa9c..9a1a71a 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
@@ -7,7 +7,6 @@ import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.ConversionService;
-import org.springframework.core.convert.TypeDescriptor;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -26,9 +25,9 @@ public class TriggerService {
public List fetchTriggers() throws SchedulerException {
Set triggerKeys = scheduler.getTriggerKeys(GroupMatcher.anyTriggerGroup());
- return (List) conversionService.convert(triggerKeys,
- TypeDescriptor.collection(Set.class, TypeDescriptor.valueOf(TriggerKey.class)),
- TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(TriggerKeyDTO.class)));
+ return triggerKeys.stream()
+ .map(triggerKey -> conversionService.convert(triggerKey, TriggerKeyDTO.class))
+ .toList();
}
}
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidRepetitionValidator.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidRepetitionValidator.java
index ccc3580..1c91a13 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidRepetitionValidator.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidRepetitionValidator.java
@@ -2,8 +2,8 @@ package it.fabioformosa.quartzmanager.api.validators;
import it.fabioformosa.quartzmanager.api.dto.TriggerRepetitionDTO;
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
public class ValidRepetitionValidator implements ConstraintValidator {
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriod.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriod.java
index 9fb9c1e..0278945 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriod.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriod.java
@@ -1,7 +1,7 @@
package it.fabioformosa.quartzmanager.api.validators;
-import javax.validation.Constraint;
-import javax.validation.Payload;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriodValidator.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriodValidator.java
index 55856f2..11d8db9 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriodValidator.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerPeriodValidator.java
@@ -2,8 +2,8 @@ package it.fabioformosa.quartzmanager.api.validators;
import it.fabioformosa.quartzmanager.api.dto.TriggerPeriodDTO;
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
public class ValidTriggerPeriodValidator implements ConstraintValidator {
@Override
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerRepetition.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerRepetition.java
index 919420e..1f0711f 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerRepetition.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/api/validators/ValidTriggerRepetition.java
@@ -1,7 +1,7 @@
package it.fabioformosa.quartzmanager.api.validators;
-import javax.validation.Constraint;
-import javax.validation.Payload;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java
index 49838de..9d7780d 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/JobControllerTest.java
@@ -7,8 +7,8 @@ import it.fabioformosa.quartzmanager.api.services.JobService;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;
@@ -28,7 +28,7 @@ class JobControllerTest {
@Autowired
private MockMvc mockMvc;
- @MockBean
+ @MockitoBean
private JobService jobService;
@Test
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java
index 7df7b44..fecdab9 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/ResourceConflictControllerTest.java
@@ -3,7 +3,7 @@ package it.fabioformosa.quartzmanager.api.controllers;
import it.fabioformosa.quartzmanager.api.QuartManagerApplicationTests;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java
index 3e5ff80..fc59a54 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SchedulerControllerTest.java
@@ -8,8 +8,8 @@ import it.fabioformosa.quartzmanager.api.services.SchedulerService;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;
@@ -26,7 +26,7 @@ class SchedulerControllerTest {
@Autowired
private MockMvc mockMvc;
- @MockBean
+ @MockitoBean
private SchedulerService schedulerService;
@Test
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 01472e4..f4c396f 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
@@ -13,8 +13,8 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;
@@ -35,7 +35,7 @@ class SimpleTriggerControllerTest {
@Autowired
private MockMvc mockMvc;
- @MockBean
+ @MockitoBean
private SimpleTriggerService simpleTriggerService;
@AfterEach
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerValidationTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerValidationTest.java
index 36d20e3..9cb795e 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerValidationTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/SimpleTriggerControllerValidationTest.java
@@ -14,8 +14,8 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;
@@ -35,7 +35,7 @@ class SimpleTriggerControllerValidationTest {
@Autowired
private MockMvc mockMvc;
- @MockBean
+ @MockitoBean
private SimpleTriggerService simpleTriggerService;
@AfterEach
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TriggerControllerTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TriggerControllerTest.java
index fdc2e35..41322cc 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TriggerControllerTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/TriggerControllerTest.java
@@ -5,8 +5,8 @@ import it.fabioformosa.quartzmanager.api.services.TriggerService;
import org.junit.jupiter.api.AfterEach;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;
@@ -19,7 +19,7 @@ class TriggerControllerTest {
@Autowired
private MockMvc mockMvc;
- @MockBean
+ @MockitoBean
private TriggerService triggerService;
@AfterEach
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/InvalidSimpleTriggerCommandDTOProvider.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/InvalidSimpleTriggerCommandDTOProvider.java
index 4364f1c..52d3a2e 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/InvalidSimpleTriggerCommandDTOProvider.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/InvalidSimpleTriggerCommandDTOProvider.java
@@ -5,13 +5,14 @@ import it.fabioformosa.quartzmanager.api.dto.SimpleTriggerInputDTO;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
+import org.junit.jupiter.params.support.ParameterDeclarations;
import java.util.Date;
import java.util.stream.Stream;
public class InvalidSimpleTriggerCommandDTOProvider implements ArgumentsProvider {
@Override
- public Stream extends Arguments> provideArguments(ExtensionContext extensionContext) {
+ public Stream extends Arguments> provideArguments(ParameterDeclarations parameters, ExtensionContext extensionContext) {
return Stream.of(
Arguments.of(buildSimpleTriggerWithBlankMandatoryFields()),
Arguments.of(buildSimpleTriggerWithRepeatCountAndWithoutRepeatInterval()),
@@ -22,20 +23,28 @@ public class InvalidSimpleTriggerCommandDTOProvider implements ArgumentsProvider
}
private SimpleTriggerInputDTO buildSimpleTriggerWithNegativeRepeatInterval() {
- return minimalSimpleTriggerBuilder().repeatInterval(-2000L).repeatCount(10).build();
+ SimpleTriggerInputDTO simpleTriggerInputDTO = minimalSimpleTrigger();
+ simpleTriggerInputDTO.setRepeatInterval(-2000L);
+ simpleTriggerInputDTO.setRepeatCount(10);
+ return simpleTriggerInputDTO;
}
private static SimpleTriggerInputDTO buildSimpleTriggerWithRepeatIntervalAndWithoutRepeatCount() {
- return minimalSimpleTriggerBuilder().repeatInterval(1L).build();
+ SimpleTriggerInputDTO simpleTriggerInputDTO = minimalSimpleTrigger();
+ simpleTriggerInputDTO.setRepeatInterval(1L);
+ return simpleTriggerInputDTO;
}
- private static SimpleTriggerInputDTO.SimpleTriggerInputDTOBuilder, ?> minimalSimpleTriggerBuilder() {
- return SimpleTriggerInputDTO.builder()
- .jobClass("it.fabioformosa.quartzmanager.api.jobs.SampleJob");
+ private static SimpleTriggerInputDTO minimalSimpleTrigger() {
+ SimpleTriggerInputDTO simpleTriggerInputDTO = new SimpleTriggerInputDTO();
+ simpleTriggerInputDTO.setJobClass("it.fabioformosa.quartzmanager.api.jobs.SampleJob");
+ return simpleTriggerInputDTO;
}
private static SimpleTriggerInputDTO buildSimpleTriggerWithRepeatCountAndWithoutRepeatInterval() {
- return minimalSimpleTriggerBuilder().repeatCount(1).build();
+ SimpleTriggerInputDTO simpleTriggerInputDTO = minimalSimpleTrigger();
+ simpleTriggerInputDTO.setRepeatCount(1);
+ return simpleTriggerInputDTO;
}
private static SimpleTriggerInputDTO buildSimpleTriggerWithBlankMandatoryFields() {
@@ -43,7 +52,10 @@ public class InvalidSimpleTriggerCommandDTOProvider implements ArgumentsProvider
}
private static SimpleTriggerInputDTO buildSimpleTriggerWithInvalidTriggerPeriod() {
- return minimalSimpleTriggerBuilder().endDate(new Date()).startDate(DateUtils.addHoursToNow(1)).build();
+ SimpleTriggerInputDTO simpleTriggerInputDTO = minimalSimpleTrigger();
+ simpleTriggerInputDTO.setEndDate(new Date());
+ simpleTriggerInputDTO.setStartDate(DateUtils.addHoursToNow(1));
+ return simpleTriggerInputDTO;
}
}
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TestUtils.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TestUtils.java
index fb12b97..d7b3903 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TestUtils.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/controllers/utils/TestUtils.java
@@ -2,7 +2,6 @@ package it.fabioformosa.quartzmanager.api.controllers.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.util.StdDateFormat;
import lombok.SneakyThrows;
public class TestUtils {
@@ -10,12 +9,11 @@ public class TestUtils {
static public ObjectMapper objectMapper = new ObjectMapper();
static{
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
- objectMapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true)); // StdDateFormat is ISO8601 since jackson 2.9
}
@SneakyThrows
static public String toJson(Object object){
- return objectMapper.writeValueAsString(object);
+ return objectMapper.writeValueAsString(object).replace("+00:00", "Z");
};
}
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java
index 2ffde76..85df58c 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/test/java/it/fabioformosa/quartzmanager/api/jobs/SampleJobTest.java
@@ -45,7 +45,7 @@ class SampleJobTest {
JobExecutionContext jobExecutionContext = Mockito.mock(JobExecutionContext.class);
String triggerName = "test-trigger";
- ScheduleBuilder schedulerBuilder = SimpleScheduleBuilder.simpleSchedule()
+ ScheduleBuilder> schedulerBuilder = SimpleScheduleBuilder.simpleSchedule()
.withRepeatCount(5)
.withIntervalInMilliseconds(1000L);
JobDetail jobDetail = JobBuilder
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml
index e392c0b..24ff00e 100644
--- a/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml
@@ -16,7 +16,7 @@
${basedir}/../..
UTF-8
UTF-8
- 9
+ 17
diff --git a/quartz-manager-parent/quartz-manager-starter-security/pom.xml b/quartz-manager-parent/quartz-manager-starter-security/pom.xml
index f60bc6a..35e2784 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/pom.xml
+++ b/quartz-manager-parent/quartz-manager-starter-security/pom.xml
@@ -17,8 +17,8 @@
${basedir}/../..
UTF-8
UTF-8
- 9
- 1.5.12
+ 17
+ 3.0.3
**/SpringApplicationTest.java
@@ -44,12 +44,29 @@
org.springframework.boot
spring-boot-starter-validation
+
+ jakarta.servlet
+ jakarta.servlet-api
+ provided
+
io.jsonwebtoken
- jjwt
- 0.9.0
+ jjwt-api
+ 0.13.0
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ 0.13.0
+ runtime
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ 0.13.0
+ runtime
org.apache.commons
@@ -60,16 +77,11 @@
lombok
provided
-
- javax.servlet
- javax.servlet-api
- provided
-
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
${springdoc-openapi.version}
true
@@ -100,6 +112,11 @@
spring-boot-starter-test
test
+
+ org.springframework.boot
+ spring-boot-webmvc-test
+ test
+
org.springframework.boot
spring-boot-starter-web
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/QuartzManagerSecurityConfig.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/QuartzManagerSecurityConfig.java
index cdaedae..8c84905 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/QuartzManagerSecurityConfig.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/QuartzManagerSecurityConfig.java
@@ -7,6 +7,7 @@ import it.fabioformosa.quartzmanager.api.security.helpers.impl.*;
import it.fabioformosa.quartzmanager.api.security.properties.InMemoryAccountProperties;
import it.fabioformosa.quartzmanager.api.security.properties.JwtSecurityProperties;
import org.apache.commons.lang3.BooleanUtils;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
@@ -19,10 +20,11 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
-import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
@@ -48,7 +50,7 @@ import static it.fabioformosa.quartzmanager.api.common.config.QuartzManagerPaths
@ComponentScan(basePackages = {"it.fabioformosa.quartzmanager.api.security"})
@Configuration
@EnableWebSecurity
-@EnableGlobalMethodSecurity(prePostEnabled = true)
+@EnableMethodSecurity(prePostEnabled = true)
public class QuartzManagerSecurityConfig {
private static final String[] PATTERNS_SWAGGER_UI = {"/swagger-ui/**", "/swagger-ui.html", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**"};
@@ -72,6 +74,12 @@ public class QuartzManagerSecurityConfig {
@Autowired
private ObjectMapper objectMapper;
+ @Bean
+ @ConditionalOnMissingBean(ObjectMapper.class)
+ public static ObjectMapper objectMapper() {
+ return new ObjectMapper();
+ }
+
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
@@ -101,17 +109,17 @@ public class QuartzManagerSecurityConfig {
public SecurityFilterChain filterChain(HttpSecurity http,
@Qualifier("quartzManagerInMemoryAuthentication") InMemoryUserDetailsManager userDetailsService,
AuthenticationManager authenticationManager) throws Exception {
- http.antMatcher(QUARTZ_MANAGER_API_ANT_MATCHER).csrf().disable() //
- .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() //
- .exceptionHandling().authenticationEntryPoint(restAuthEntryPoint()).and() //
- .addFilterBefore(jwtAuthenticationTokenFilter(userDetailsService), BasicAuthenticationFilter.class) //
- .authorizeRequests();
+ http.securityMatcher(QUARTZ_MANAGER_API_ANT_MATCHER)
+ .csrf(AbstractHttpConfigurer::disable)
+ .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+ .exceptionHandling(exception -> exception.authenticationEntryPoint(restAuthEntryPoint()))
+ .addFilterBefore(jwtAuthenticationTokenFilter(userDetailsService), BasicAuthenticationFilter.class);
QuartzManagerHttpSecurity.from(http).withLoginConfigurer(loginConfigurer(), logoutConfigurer()) //
.login(QUARTZ_MANAGER_LOGIN_PATH, authenticationManager).logout(QUARTZ_MANAGER_LOGOUT_PATH);
- http.authorizeRequests()
- .antMatchers(QUARTZ_MANAGER_API_ANT_MATCHER).authenticated();
+ http.authorizeHttpRequests(authorize -> authorize
+ .requestMatchers(QUARTZ_MANAGER_API_ANT_MATCHER).authenticated());
return http.build();
}
@@ -119,11 +127,11 @@ public class QuartzManagerSecurityConfig {
@Bean(name = "quartzManagerWebSecurityCustomizer")
public WebSecurityCustomizer webSecurityCustomizer(@Value("${quartz-manager.oas.enabled:false}") Boolean oasEnabled) {
return web -> {
- web.ignoring()//
- .antMatchers(HttpMethod.GET, QUARTZ_MANAGER_UI_ANT_MATCHER);
+ web.ignoring()
+ .requestMatchers(QUARTZ_MANAGER_UI_ANT_MATCHER);
if(BooleanUtils.isNotFalse(oasEnabled))
web.ignoring()
- .antMatchers(HttpMethod.GET, PATTERNS_SWAGGER_UI);
+ .requestMatchers(PATTERNS_SWAGGER_UI);
};
}
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/config/SecurityOpenApiConfig.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/config/SecurityOpenApiConfig.java
index 87b6fa7..6569882 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/config/SecurityOpenApiConfig.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/config/SecurityOpenApiConfig.java
@@ -13,7 +13,7 @@ import it.fabioformosa.quartzmanager.api.common.config.QuartzManagerPaths;
import it.fabioformosa.quartzmanager.api.security.properties.JwtSecurityProperties;
import lombok.Generated;
import lombok.extern.slf4j.Slf4j;
-import org.springdoc.core.customizers.OpenApiCustomiser;
+import org.springdoc.core.customizers.OpenApiCustomizer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -29,23 +29,24 @@ import java.util.Arrays;
public class SecurityOpenApiConfig {
@Order(Ordered.HIGHEST_PRECEDENCE)
- @Bean("quartzManagerOpenApiCustomiser")
- public OpenApiCustomiser configureQuartzManagerOpenAPI(JwtSecurityProperties jwtSecurityProps) {
+ @Bean("quartzManagerOpenApiCustomizer")
+ public OpenApiCustomizer configureQuartzManagerOpenAPI(JwtSecurityProperties jwtSecurityProps) {
return openAPI -> {
if (!jwtSecurityProps.getCookieStrategy().isEnabled())
openAPI
.components(new Components().addSecuritySchemes(OpenAPIConfigConsts.QUARTZ_MANAGER_SEC_OAS_SCHEMA, buildBasicAuthScheme()));
+ ObjectSchema loginRequestSchema = new ObjectSchema();
+ loginRequestSchema.addProperty("username", new StringSchema());
+ loginRequestSchema.addProperty("password", new PasswordSchema());
+ loginRequestSchema.required(Arrays.asList("username", "password"));
+
openAPI.path(QuartzManagerPaths.QUARTZ_MANAGER_LOGIN_PATH,
new PathItem().post(new Operation()
.operationId("login")
.tags(Arrays.asList("auth"))
.requestBody(new RequestBody().content(
- new Content().addMediaType("application/x-www-form-urlencoded", new MediaType().schema(new Schema().type("object")
- .addProperties("username", new StringSchema())
- .addProperties("password", new PasswordSchema())
- .required(Arrays.asList("username", "password"))
- ))))
+ new Content().addMediaType("application/x-www-form-urlencoded", new MediaType().schema(loginRequestSchema))))
.responses(new ApiResponses().addApiResponse("200", new ApiResponse().description("JWT Token to authenticate the next requests")))
.responses(new ApiResponses().addApiResponse("401", new ApiResponse().description("Unauthorized - Username or password are incorrect!")))
));
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java
index 2ea1410..22386eb 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AnonAuthentication.java
@@ -3,12 +3,14 @@ package it.fabioformosa.quartzmanager.api.security.helpers.impl;
import lombok.EqualsAndHashCode;
import org.springframework.security.authentication.AbstractAuthenticationToken;
-@EqualsAndHashCode
+import java.util.Collections;
+
+@EqualsAndHashCode(callSuper = false)
public class AnonAuthentication extends AbstractAuthenticationToken {
private static final long serialVersionUID = 1L;
public AnonAuthentication() {
- super( null );
+ super(Collections.emptyList());
}
@Override
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AuthenticationSuccessHandler.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AuthenticationSuccessHandler.java
index ccde413..9737c47 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AuthenticationSuccessHandler.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/AuthenticationSuccessHandler.java
@@ -3,8 +3,8 @@ package it.fabioformosa.quartzmanager.api.security.helpers.impl;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class AuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/FormLoginConfig.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/FormLoginConfig.java
index d3b164f..da866e8 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/FormLoginConfig.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/FormLoginConfig.java
@@ -5,7 +5,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer;
/**
* It delegates the login to the @FormLoginConfigurer of the httpSecurity.
@@ -55,19 +54,17 @@ public class FormLoginConfig implements LoginConfigurer {
HttpSecurity http, AuthenticationManager authenticationManager) throws Exception {
log.debug("Configuring login through FormLoginConfigurer...");
- FormLoginConfigurer login = http.formLogin().loginPage(loginPath);
-
- if(authenticationSuccessHandler != null) {
- log.debug("Setting an authenticationSuccessHandler");
- login = login.successHandler(authenticationSuccessHandler);
- }
-
- if(authenticationFailureHandler != null) {
- log.debug("Setting an authenticationFailureHandler");
- login = login.failureHandler(authenticationFailureHandler);
- }
-
- return login.and();
+ return http.formLogin(login -> {
+ login.loginPage(loginPath);
+ if(authenticationSuccessHandler != null) {
+ log.debug("Setting an authenticationSuccessHandler");
+ login.successHandler(authenticationSuccessHandler);
+ }
+ if(authenticationFailureHandler != null) {
+ log.debug("Setting an authenticationFailureHandler");
+ login.failureHandler(authenticationFailureHandler);
+ }
+ });
}
}
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationFilter.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationFilter.java
index 217c2fc..f1498b3 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationFilter.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationFilter.java
@@ -1,8 +1,8 @@
package it.fabioformosa.quartzmanager.api.security.helpers.impl;
-import javax.servlet.FilterChain;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandler.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandler.java
index 2a8fdc8..51cf5e5 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandler.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandler.java
@@ -2,7 +2,7 @@ package it.fabioformosa.quartzmanager.api.security.helpers.impl;
import java.io.IOException;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java
index 4c9c111..5eb9b89 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtAuthenticationSuccessHandlerImpl.java
@@ -9,8 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.User;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenAuthenticationFilter.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenAuthenticationFilter.java
index 72562d0..4017f41 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenAuthenticationFilter.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenAuthenticationFilter.java
@@ -5,15 +5,15 @@ import org.slf4j.LoggerFactory;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
+import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -92,7 +92,8 @@ public class JwtTokenAuthenticationFilter extends OncePerRequestFilter {
private boolean skipPathRequest(HttpServletRequest request, List pathsToSkip ) {
if(pathsToSkip == null)
pathsToSkip = new ArrayList<>();
- List matchers = pathsToSkip.stream().map(AntPathRequestMatcher::new).collect(Collectors.toList());
+ PathPatternRequestMatcher.Builder matcherBuilder = PathPatternRequestMatcher.withDefaults();
+ List matchers = pathsToSkip.stream().map(matcherBuilder::matcher).collect(Collectors.toList());
OrRequestMatcher compositeMatchers = new OrRequestMatcher(matchers);
return compositeMatchers.matches(request);
}
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenHelper.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenHelper.java
index 428effe..516e6ce 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenHelper.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/JwtTokenHelper.java
@@ -2,18 +2,20 @@ package it.fabioformosa.quartzmanager.api.security.helpers.impl;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
import it.fabioformosa.quartzmanager.api.security.properties.JwtSecurityProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.ZoneId;
-import java.util.Base64;
import java.util.Date;
import java.util.Map;
@@ -25,16 +27,19 @@ public class JwtTokenHelper {
private static final Logger log = LoggerFactory.getLogger(JwtTokenHelper.class);
- private static String base64EncodeSecretKey(String secretKey) {
- return Base64.getEncoder().encodeToString(secretKey.getBytes(StandardCharsets.UTF_8));
+ private static SecretKey signingKey(String secretKey) {
+ try {
+ byte[] keyBytes = MessageDigest.getInstance("SHA-512").digest(secretKey.getBytes(StandardCharsets.UTF_8));
+ return new SecretKeySpec(keyBytes, "HmacSHA512");
+ } catch (NoSuchAlgorithmException e) {
+ throw new IllegalStateException("Unable to create JWT signing key", e);
+ }
}
private final String appName;
private final JwtSecurityProperties jwtSecurityProps;
- private static final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS512;
-
public JwtTokenHelper(String appName, JwtSecurityProperties jwtSecurityProps) {
super();
this.appName = appName;
@@ -60,20 +65,20 @@ public class JwtTokenHelper {
}
private String generateToken(Map claims) {
- return Jwts.builder().setClaims(claims).setExpiration(generateExpirationDate())
- .signWith(SIGNATURE_ALGORITHM, base64EncodeSecretKey(jwtSecurityProps.getSecret())).compact();
+ return Jwts.builder().claims(claims).expiration(generateExpirationDate())
+ .signWith(signingKey(jwtSecurityProps.getSecret()), Jwts.SIG.HS512).compact();
}
public String generateToken(String username) {
- return Jwts.builder().setIssuer(appName).setSubject(username).setIssuedAt(generateCurrentDate())
- .setExpiration(generateExpirationDate())
- .signWith(SIGNATURE_ALGORITHM, base64EncodeSecretKey(jwtSecurityProps.getSecret())).compact();
+ return Jwts.builder().issuer(appName).subject(username).issuedAt(generateCurrentDate())
+ .expiration(generateExpirationDate())
+ .signWith(signingKey(jwtSecurityProps.getSecret()), Jwts.SIG.HS512).compact();
}
private Claims verifyAndGetClaimsFromToken(String token) {
Claims claims;
- claims = Jwts.parser().setSigningKey(base64EncodeSecretKey(jwtSecurityProps.getSecret()))
- .parseClaimsJws(token).getBody();
+ claims = Jwts.parser().verifyWith(signingKey(jwtSecurityProps.getSecret())).build()
+ .parseSignedClaims(token).getPayload();
if (claims == null)
throw new IllegalStateException("Not found any claims into the JWT token!");
return claims;
@@ -108,8 +113,8 @@ public class JwtTokenHelper {
String refreshedToken;
try {
final Claims claims = verifyAndGetClaimsFromToken(token);
- claims.setIssuedAt(generateCurrentDate());
- refreshedToken = generateToken(claims);
+ refreshedToken = Jwts.builder().claims(claims).issuedAt(generateCurrentDate()).expiration(generateExpirationDate())
+ .signWith(signingKey(jwtSecurityProps.getSecret()), Jwts.SIG.HS512).compact();
} catch (Exception e) {
log.error("Error refreshing jwt token due to " + e.getMessage(), e);
refreshedToken = null;
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/LogoutSuccess.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/LogoutSuccess.java
index 446f9dd..3d8a5c9 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/LogoutSuccess.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/LogoutSuccess.java
@@ -4,9 +4,9 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/QuartzManagerHttpSecurity.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/QuartzManagerHttpSecurity.java
index c2979ec..ae1d147 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/QuartzManagerHttpSecurity.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/QuartzManagerHttpSecurity.java
@@ -1,11 +1,8 @@
package it.fabioformosa.quartzmanager.api.security.helpers.impl;
import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configurers.LogoutConfigurer;
-import org.springframework.security.web.DefaultSecurityFilterChain;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher;
import it.fabioformosa.quartzmanager.api.security.helpers.LoginConfigurer;
@@ -13,11 +10,10 @@ import it.fabioformosa.quartzmanager.api.security.helpers.LoginConfigurer;
* It wraps the httpSecurity to provide new function as login and logout
*
*/
-public class QuartzManagerHttpSecurity extends SecurityConfigurerAdapter {
+public class QuartzManagerHttpSecurity {
public static QuartzManagerHttpSecurity from(HttpSecurity httpSecurity){
QuartzManagerHttpSecurity newInstance = new QuartzManagerHttpSecurity(httpSecurity);
- newInstance.setBuilder(httpSecurity);
return newInstance;
}
@@ -39,13 +35,14 @@ public class QuartzManagerHttpSecurity extends SecurityConfigurerAdapter logout(String logoutPath) throws Exception {
- LogoutConfigurer logoutConfigurer = httpSecurity.logout().logoutRequestMatcher(new AntPathRequestMatcher(logoutPath))
- .logoutSuccessHandler(logoutSuccess);
+ public HttpSecurity logout(String logoutPath) throws Exception {
String cookie = loginConfigurer.cookieMustBeDeletedAtLogout();
- if(cookie != null)
- logoutConfigurer.deleteCookies(cookie);
- return logoutConfigurer;
+ return httpSecurity.logout(logout -> {
+ logout.logoutRequestMatcher(PathPatternRequestMatcher.withDefaults().matcher(logoutPath));
+ logout.logoutSuccessHandler(logoutSuccess);
+ if(cookie != null)
+ logout.deleteCookies(cookie);
+ });
}
public QuartzManagerHttpSecurity withLoginConfigurer(LoginConfigurer loginConfigurer, LogoutSuccess logoutSuccess) {
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/RestAuthenticationEntryPoint.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/RestAuthenticationEntryPoint.java
index f44307d..cd1a812 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/RestAuthenticationEntryPoint.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/helpers/impl/RestAuthenticationEntryPoint.java
@@ -3,8 +3,8 @@ package it.fabioformosa.quartzmanager.api.security.helpers.impl;
import java.io.IOException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
@@ -20,4 +20,3 @@ public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage());
}
}
-
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/properties/InMemoryAccountProperties.java b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/properties/InMemoryAccountProperties.java
index 326aaa9..ed862e3 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/properties/InMemoryAccountProperties.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/main/java/it/fabioformosa/quartzmanager/api/security/properties/InMemoryAccountProperties.java
@@ -6,10 +6,10 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.annotation.Validated;
-import javax.validation.Valid;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/AbstractSecurityLoginTest.java b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/AbstractSecurityLoginTest.java
index 7bffec9..46f85aa 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/AbstractSecurityLoginTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/AbstractSecurityLoginTest.java
@@ -1,29 +1,30 @@
package it.fabioformosa.quartzmanager.api.security;
import it.fabioformosa.quartzmanager.api.security.models.UserTokenState;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestClient;
import static it.fabioformosa.quartzmanager.api.common.config.QuartzManagerPaths.QUARTZ_MANAGER_LOGIN_PATH;
public abstract class AbstractSecurityLoginTest {
- @Autowired
- private TestRestTemplate testRestTemplate;
+
+ @LocalServerPort
+ private int port;
protected ResponseEntity doLogin() {
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
-
MultiValueMap map = new LinkedMultiValueMap<>();
map.add("username", "foo");
map.add("password", "bar");
- HttpEntity> entity = new HttpEntity<>(map, headers);
-
- ResponseEntity responseEntity = testRestTemplate.exchange(QUARTZ_MANAGER_LOGIN_PATH, HttpMethod.POST, entity, UserTokenState.class);
- return responseEntity;
+ return RestClient.create("http://localhost:" + port)
+ .post()
+ .uri(QUARTZ_MANAGER_LOGIN_PATH)
+ .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+ .body(map)
+ .retrieve()
+ .toEntity(UserTokenState.class);
}
}
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/SecurityControllerTest.java b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/SecurityControllerTest.java
index 93eb5e2..add42d4 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/SecurityControllerTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/SecurityControllerTest.java
@@ -9,13 +9,13 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@@ -60,9 +60,8 @@ class SecurityControllerTest {
}
@Test
- @WithMockUser("admin")
void givenAnUser_whenCalledATestScheduler_thenShouldReturn2xx() throws Exception {
- mockMvc.perform(MockMvcRequestBuilders.get(TestController.QUARTZ_MANAGER + "/scheduler"))
+ mockMvc.perform(MockMvcRequestBuilders.get(TestController.QUARTZ_MANAGER + "/scheduler").with(user("admin")))
.andExpect(status().isOk());
}
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/controllers/UserControllerTest.java b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/controllers/UserControllerTest.java
index 79c8a7e..9098a76 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/controllers/UserControllerTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/controllers/UserControllerTest.java
@@ -2,15 +2,15 @@ package it.fabioformosa.quartzmanager.api.security.controllers;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import static it.fabioformosa.quartzmanager.api.common.config.QuartzManagerPaths.QUARTZ_MANAGER_AUTH_PATH;
import static it.fabioformosa.quartzmanager.api.security.controllers.UserController.WHOAMI_URL;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@@ -27,9 +27,8 @@ class UserControllerTest {
private MockMvc mockMvc;
@Test
- @WithMockUser("admin")
void givenAnUser_whenCalledTheWhoamiEndpoint_thenShouldReturn2xx() throws Exception {
- mockMvc.perform(MockMvcRequestBuilders.get(QUARTZ_MANAGER_AUTH_PATH + WHOAMI_URL))
+ mockMvc.perform(MockMvcRequestBuilders.get(QUARTZ_MANAGER_AUTH_PATH + WHOAMI_URL).with(user("admin")))
.andExpect(status().isOk());
}
diff --git a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/properties/AbstractPropertyValidatorTest.java b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/properties/AbstractPropertyValidatorTest.java
index 8ec533b..e13358d 100644
--- a/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/properties/AbstractPropertyValidatorTest.java
+++ b/quartz-manager-parent/quartz-manager-starter-security/src/test/java/it/fabioformosa/quartzmanager/api/security/properties/AbstractPropertyValidatorTest.java
@@ -7,8 +7,8 @@ import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
-import javax.validation.Validation;
-import javax.validation.Validator;
+import jakarta.validation.Validation;
+import jakarta.validation.Validator;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
diff --git a/quartz-manager-parent/quartz-manager-starter-ui/pom.xml b/quartz-manager-parent/quartz-manager-starter-ui/pom.xml
index 6c925c3..96c38be 100644
--- a/quartz-manager-parent/quartz-manager-starter-ui/pom.xml
+++ b/quartz-manager-parent/quartz-manager-starter-ui/pom.xml
@@ -17,7 +17,7 @@
${basedir}/../..
UTF-8
UTF-8
- 9
+ 17
quartz-manager-frontend
v16.14.1
8.19.3
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml
index f44b5b9..1266512 100644
--- a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml
+++ b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml
@@ -18,8 +18,8 @@
UTF-8
UTF-8
- 1.5.12
- 9
+ 3.0.3
+ 17
@@ -59,18 +59,23 @@
spring-boot-starter-test
test
+
+ org.springframework.boot
+ spring-boot-webmvc-test
+ test
+
org.springdoc
- springdoc-openapi-ui
+ springdoc-openapi-starter-webmvc-ui
${springdoc-openapi.version}
true
io.jsonwebtoken
- jjwt
- 0.9.0
+ jjwt-api
+ 0.13.0
com.fasterxml.jackson.core
@@ -86,7 +91,7 @@
runtime
- org.codehaus.groovy
+ org.apache.groovy
groovy
@@ -96,6 +101,7 @@
io.rest-assured
spring-mock-mvc
+ 6.0.0
test
@@ -135,8 +141,7 @@
maven-compiler-plugin
3.8.0
- 9
- 9
+ ${java.version}
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/WebShowcaseOpenApiConfig.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/WebShowcaseOpenApiConfig.java
index 5ab7ad6..1feeba3 100644
--- a/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/WebShowcaseOpenApiConfig.java
+++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/WebShowcaseOpenApiConfig.java
@@ -4,7 +4,7 @@ import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import lombok.Generated;
-import org.springdoc.core.GroupedOpenApi;
+import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java
index 6d6957d..2d951dd 100644
--- a/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java
+++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/controllers/SessionController.java
@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
-import javax.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpSession;
@Controller
@RequestMapping("/session")