diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressNotifier.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressNotifier.java new file mode 100644 index 0000000..117251e --- /dev/null +++ b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressNotifier.java @@ -0,0 +1,16 @@ +package it.fabioformosa.quartzmanager.aspects; + +import org.quartz.SchedulerException; + +/** + * + * Notify the progress of the trigger to all consumers + * + * @author Fabio Formosa + * + */ +public interface ProgressNotifier { + + void send() throws SchedulerException; + +} diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressUpdater.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressUpdater.java deleted file mode 100644 index cee2e98..0000000 --- a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressUpdater.java +++ /dev/null @@ -1,9 +0,0 @@ -package it.fabioformosa.quartzmanager.aspects; - -import org.quartz.SchedulerException; - -public interface ProgressUpdater { - - void update() throws SchedulerException; - -} diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressUpdaterImpl.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java similarity index 64% rename from quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressUpdaterImpl.java rename to quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java index 791d444..dcf0b20 100644 --- a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/ProgressUpdaterImpl.java +++ b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java @@ -11,12 +11,19 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessageSendingOperations; import org.springframework.stereotype.Component; -import it.fabioformosa.quartzmanager.dto.TriggerProgress; +import it.fabioformosa.quartzmanager.dto.TriggerStatus; import it.fabioformosa.quartzmanager.scheduler.TriggerMonitor; +/** + * + * Notify the progress of the trigger through websocket + * + * @author Fabio Formosa + * + */ //@Aspect @Component -public class ProgressUpdaterImpl implements ProgressUpdater { +public class WebSocketProgressNotifier implements ProgressNotifier { @Autowired private SimpMessageSendingOperations messagingTemplate; @@ -34,13 +41,13 @@ public class ProgressUpdaterImpl implements ProgressUpdater { // } @Override - public void update() throws SchedulerException { - TriggerProgress progress = new TriggerProgress(); + public void send() throws SchedulerException { + TriggerStatus currTriggerStatus = new TriggerStatus(); Trigger trigger = scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); - progress.setFinalFireTime(trigger.getFinalFireTime()); - progress.setNextFireTime(trigger.getNextFireTime()); - progress.setPreviousFireTime(trigger.getPreviousFireTime()); + currTriggerStatus.setFinalFireTime(trigger.getFinalFireTime()); + currTriggerStatus.setNextFireTime(trigger.getNextFireTime()); + currTriggerStatus.setPreviousFireTime(trigger.getPreviousFireTime()); int timesTriggered = 0; int repeatCount = 0; @@ -57,13 +64,13 @@ public class ProgressUpdaterImpl implements ProgressUpdater { Trigger jobTrigger = triggerMonitor.getTrigger(); if (jobTrigger != null && jobTrigger.getJobKey() != null) { - progress.setJobKey(jobTrigger.getJobKey().getName()); - progress.setJobClass(jobTrigger.getClass().getSimpleName()); - progress.setTimesTriggered(timesTriggered); - progress.setRepeatCount(repeatCount + 1); + currTriggerStatus.setJobKey(jobTrigger.getJobKey().getName()); + currTriggerStatus.setJobClass(jobTrigger.getClass().getSimpleName()); + currTriggerStatus.setTimesTriggered(timesTriggered); + currTriggerStatus.setRepeatCount(repeatCount + 1); } - messagingTemplate.convertAndSend("/topic/progress", progress); + messagingTemplate.convertAndSend("/topic/progress", currTriggerStatus); } } diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java index f7f7eed..f1a2ac0 100644 --- a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java +++ b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/QuartzManagerController.java @@ -15,11 +15,11 @@ import lombok.extern.slf4j.Slf4j; @Api(value = "Healthy Check") public class QuartzManagerController { - @ResponseStatus(code = HttpStatus.OK) - @GetMapping("/") - public void healthyCheck() { - log.debug("Healthy check called"); - } + @ResponseStatus(code = HttpStatus.OK) + @GetMapping("/") + public void healthyCheck() { + log.debug("Healthy check called"); + } } diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java index 13152ab..35242fc 100644 --- a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java +++ b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java @@ -24,7 +24,7 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.Api; import it.fabioformosa.quartzmanager.dto.SchedulerConfigParam; -import it.fabioformosa.quartzmanager.dto.TriggerProgress; +import it.fabioformosa.quartzmanager.dto.TriggerStatus; import it.fabioformosa.quartzmanager.enums.SchedulerStates; import it.fabioformosa.quartzmanager.scheduler.TriggerMonitor; @@ -63,9 +63,9 @@ public class SchedulerController { } @GetMapping("/progress") - public TriggerProgress getProgressInfo() throws SchedulerException { + public TriggerStatus getProgressInfo() throws SchedulerException { log.trace("SCHEDULER - GET PROGRESS INFO"); - TriggerProgress progress = new TriggerProgress(); + TriggerStatus progress = new TriggerStatus(); SimpleTriggerImpl jobTrigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); if (jobTrigger != null && jobTrigger.getJobKey() != null) { diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerProgress.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerStatus.java similarity index 97% rename from quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerProgress.java rename to quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerStatus.java index 3b663be..2e24a40 100644 --- a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerProgress.java +++ b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerStatus.java @@ -2,7 +2,7 @@ package it.fabioformosa.quartzmanager.dto; import java.util.Date; -public class TriggerProgress { +public class TriggerStatus { private int timesTriggered; diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/jobs/AbstractLoggingJob.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/jobs/AbstractLoggingJob.java index 0911526..a55378b 100644 --- a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/jobs/AbstractLoggingJob.java +++ b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/jobs/AbstractLoggingJob.java @@ -10,7 +10,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessageSendingOperations; -import it.fabioformosa.quartzmanager.aspects.ProgressUpdater; +import it.fabioformosa.quartzmanager.aspects.ProgressNotifier; import it.fabioformosa.quartzmanager.jobs.entities.LogRecord; /** @@ -28,7 +28,7 @@ public abstract class AbstractLoggingJob implements Job { private SimpMessageSendingOperations messagingTemplate; @Resource - private ProgressUpdater progressUpdater; + private ProgressNotifier progressNotifier; /** * @@ -42,7 +42,7 @@ public abstract class AbstractLoggingJob implements Job { try { LogRecord logMsg = doIt(jobExecutionContext); logAndSend(logMsg); - progressUpdater.update(); + progressNotifier.send(); } catch (SchedulerException e) { log.error("Error updating progress " + e.getMessage()); } diff --git a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/security/TokenHelper.java b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/security/TokenHelper.java index 692f1fa..6576838 100644 --- a/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/security/TokenHelper.java +++ b/quartz-manager-api/src/main/java/it/fabioformosa/quartzmanager/security/TokenHelper.java @@ -26,133 +26,133 @@ import lombok.extern.slf4j.Slf4j; @Component public class TokenHelper { - @Value("${app.name}") - private String APP_NAME; + @Value("${app.name}") + private String APP_NAME; - @Value("${jwt.secret}") - private String SECRET; + @Value("${jwt.secret}") + private String SECRET; - @Value("${jwt.expires_in_sec}") - private int EXPIRES_IN_SEC; + @Value("${jwt.expires_in_sec}") + private int EXPIRES_IN_SEC; - @Value("${jwt.header}") - private String AUTH_HEADER; + @Value("${jwt.header}") + private String AUTH_HEADER; - @Value("${jwt.cookie}") - private String AUTH_COOKIE; + @Value("${jwt.cookie}") + private String AUTH_COOKIE; - // @Autowired - // UserDetailsService userDetailsService; + // @Autowired + // UserDetailsService userDetailsService; - private SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS512; + private SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS512; - public Boolean canTokenBeRefreshed(String token) { - try { - final Date expirationDate = getClaimsFromToken(token).getExpiration(); - // String username = getUsernameFromToken(token); - // UserDetails userDetails = userDetailsService.loadUserByUsername(username); - return expirationDate.compareTo(generateCurrentDate()) > 0; - } catch (Exception e) { - return false; - } - } + public Boolean canTokenBeRefreshed(String token) { + try { + final Date expirationDate = getClaimsFromToken(token).getExpiration(); + // String username = getUsernameFromToken(token); + // UserDetails userDetails = userDetailsService.loadUserByUsername(username); + return expirationDate.compareTo(generateCurrentDate()) > 0; + } catch (Exception e) { + return false; + } + } - public String generateToken(String username) { - return Jwts.builder() - .setIssuer(APP_NAME) - .setSubject(username) - .setIssuedAt(generateCurrentDate()) - .setExpiration(generateExpirationDate()) - .signWith(SIGNATURE_ALGORITHM, SECRET) - .compact(); - } + private Date generateCurrentDate() { + return new Date(getCurrentTimeMillis()); + } - /** - * Find a specific HTTP cookie in a request. - * - * @param request - * The HTTP request object. - * @param name - * The cookie name to look for. - * @return The cookie, or null if not found. - */ - public Cookie getCookieValueByName(HttpServletRequest request, String name) { - if (request.getCookies() == null) - return null; - for (int i = 0; i < request.getCookies().length; i++) - if (request.getCookies()[i].getName().equals(name)) - return request.getCookies()[i]; - return null; - } + private Date generateExpirationDate() { + return new Date(getCurrentTimeMillis() + EXPIRES_IN_SEC * 1000); + } - public String getToken( HttpServletRequest request ) { - Cookie authCookie = getCookieValueByName( request, AUTH_COOKIE ); - if ( authCookie != null ) - return authCookie.getValue(); + String generateToken(Map claims) { + return Jwts.builder() + .setClaims(claims) + .setExpiration(generateExpirationDate()) + .signWith( SIGNATURE_ALGORITHM, SECRET ) + .compact(); + } - String authHeader = request.getHeader(AUTH_HEADER); - if ( authHeader != null && authHeader.startsWith("Bearer ")) - return authHeader.substring(7); + public String generateToken(String username) { + return Jwts.builder() + .setIssuer(APP_NAME) + .setSubject(username) + .setIssuedAt(generateCurrentDate()) + .setExpiration(generateExpirationDate()) + .signWith(SIGNATURE_ALGORITHM, SECRET) + .compact(); + } - return null; - } + private Claims getClaimsFromToken(String token) { + Claims claims; + try { + claims = Jwts.parser() + .setSigningKey(SECRET) + .parseClaimsJws(token) + .getBody(); + } catch (Exception e) { + claims = null; + log.error("Error getting claims from jwt token due to " + e.getMessage(), e); + } + return claims; + } - public String getUsernameFromToken(String token) { - String username; - try { - final Claims claims = getClaimsFromToken(token); - username = claims.getSubject(); - } catch (Exception e) { - username = null; - log.error("Error getting claims from jwt token due to " + e.getMessage(), e); - } - return username; - } + /** + * Find a specific HTTP cookie in a request. + * + * @param request + * The HTTP request object. + * @param name + * The cookie name to look for. + * @return The cookie, or null if not found. + */ + public Cookie getCookieValueByName(HttpServletRequest request, String name) { + if (request.getCookies() == null) + return null; + for (int i = 0; i < request.getCookies().length; i++) + if (request.getCookies()[i].getName().equals(name)) + return request.getCookies()[i]; + return null; + } - public String refreshToken(String token) { - String refreshedToken; - try { - final Claims claims = getClaimsFromToken(token); - claims.setIssuedAt(generateCurrentDate()); - refreshedToken = generateToken(claims); - } catch (Exception e) { - log.error("Error refreshing jwt token due to " + e.getMessage(), e); - refreshedToken = null; - } - return refreshedToken; - } + private long getCurrentTimeMillis() { + return DateTime.now().getMillis(); + } - private Date generateCurrentDate() { - return new Date(getCurrentTimeMillis()); - } + public String getToken( HttpServletRequest request ) { + Cookie authCookie = getCookieValueByName( request, AUTH_COOKIE ); + if ( authCookie != null ) + return authCookie.getValue(); - private Date generateExpirationDate() { - return new Date(getCurrentTimeMillis() + EXPIRES_IN_SEC * 1000); - } + String authHeader = request.getHeader(AUTH_HEADER); + if ( authHeader != null && authHeader.startsWith("Bearer ")) + return authHeader.substring(7); - private Claims getClaimsFromToken(String token) { - Claims claims; - try { - claims = Jwts.parser() - .setSigningKey(SECRET) - .parseClaimsJws(token) - .getBody(); - } catch (Exception e) { - claims = null; - log.error("Error getting claims from jwt token due to " + e.getMessage(), e); - } - return claims; - } + return null; + } - private long getCurrentTimeMillis() { - return DateTime.now().getMillis(); - } + public String getUsernameFromToken(String token) { + String username; + try { + final Claims claims = getClaimsFromToken(token); + username = claims.getSubject(); + } catch (Exception e) { + username = null; + log.error("Error getting claims from jwt token due to " + e.getMessage(), e); + } + return username; + } - String generateToken(Map claims) { - return Jwts.builder() - .setClaims(claims) - .setExpiration(generateExpirationDate()) - .signWith( SIGNATURE_ALGORITHM, SECRET ) - .compact(); - } + public String refreshToken(String token) { + String refreshedToken; + try { + final Claims claims = getClaimsFromToken(token); + claims.setIssuedAt(generateCurrentDate()); + refreshedToken = generateToken(claims); + } catch (Exception e) { + log.error("Error refreshing jwt token due to " + e.getMessage(), e); + refreshedToken = null; + } + return refreshedToken; + } } diff --git a/quartz-manager-api/src/main/resources/logback.xml b/quartz-manager-api/src/main/resources/logback.xml index dbcf85d..9977078 100644 --- a/quartz-manager-api/src/main/resources/logback.xml +++ b/quartz-manager-api/src/main/resources/logback.xml @@ -15,6 +15,9 @@ + + +