This commit is contained in:
fabio.formosa
2020-04-15 00:02:56 +02:00
parent 88c7408276
commit 4b7de03050
9 changed files with 160 additions and 143 deletions

View File

@@ -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;
}

View File

@@ -1,9 +0,0 @@
package it.fabioformosa.quartzmanager.aspects;
import org.quartz.SchedulerException;
public interface ProgressUpdater {
void update() throws SchedulerException;
}

View File

@@ -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);
}
}

View File

@@ -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");
}
}

View File

@@ -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) {

View File

@@ -2,7 +2,7 @@ package it.fabioformosa.quartzmanager.dto;
import java.util.Date;
public class TriggerProgress {
public class TriggerStatus {
private int timesTriggered;

View File

@@ -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());
}

View File

@@ -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 <code>null</code> 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<String, Object> 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 <code>null</code> 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<String, Object> 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;
}
}

View File

@@ -15,6 +15,9 @@
<logger name="org.springframework" level="WARN" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<logger name="org.quartz" level="WARN" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="WARN">
<appender-ref ref="STDOUT" />