ReminderNotification.java
- /*
- * This software was designed and created by Jason Carroll.
- * Copyright (c) 2002, 2003, 2004 Jason Carroll.
- * The author can be reached at jcarroll@cowsultants.com
- * ITracker website: http://www.cowsultants.com
- * ITracker forums: http://www.cowsultants.com/phpBB/index.php
- *
- * This program is free software; you can redistribute it and/or modify
- * it only under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
- package org.itracker.web.scheduler.tasks;
- import org.apache.log4j.Logger;
- import org.itracker.model.Issue;
- import org.itracker.model.Notification;
- import org.itracker.model.util.IssueUtilities;
- import org.itracker.services.ConfigurationService;
- import org.itracker.services.IssueService;
- import org.itracker.services.NotificationService;
- import org.itracker.web.util.ServletContextUtils;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.transaction.annotation.Transactional;
- import java.util.*;
- /**
- * This class can be used to send reminder emails to owners/admins
- * that issues need their attention.
- *
- */
- public class ReminderNotification extends BaseJob implements Runnable {
- public static final String DEFAULT_BASE_URL = "http://localhost:8080/itracker";
- public static final int DEFAULT_ISSUE_AGE = 30;
- private final Logger logger;
- public ReminderNotification() {
- this.logger = Logger.getLogger(getClass());
- }
- @Override
- @Transactional
- public void run() {
- this.performTask(new String[]{});
- }
- @Override
- public void execute(JobExecutionContext context) throws JobExecutionException {
- super.execute(context);
- this.performTask((String[]) context.get("args"));
- }
- /**
- * This method is called by the scheduler to send the reminder
- * notifications. The arguments can be used to configure which issues
- * and projects are included in the notifications. The args should
- * include as the first parameter the base url of the server including
- * the scheme, hostname, port, and context. For example:
- * <br>
- * http://localhost:8080/itracker
- * <br>
- * If no other arguments are supplied it sends reminders to all
- * owners/admins of unresolved issues in all projects that have not been
- * modified in 30 days. The second element of the array can be a number
- * that represents the number of days to use to check the last modified
- * date. The third optional element is a number that represents the project
- * id to limit the notifications to. A fourth optional argument is the severity
- * to send the notification for.
- *
- * @param args optional arguments to configure the notification messages
- */
- public void performTask(String[] args) {
- final List<Issue> issues;
- final ConfigurationService configurationService = ServletContextUtils.getItrackerServices().getConfigurationService();
- String baseURL = configurationService.getSystemBaseURL();
- int notificationDays = configurationService.getIntegerProperty("reminder_notification_days",
- DEFAULT_ISSUE_AGE);
- int projectId = -1;
- int severity = -1;
- // Process arguments.
- if (args != null) {
- if (args.length > 0 && args[0] != null) {
- baseURL = args[0];
- }
- if (null == baseURL) {
- baseURL = DEFAULT_BASE_URL;
- }
- if (args.length > 1) {
- try {
- notificationDays = Integer.parseInt(args[1]);
- } catch (NumberFormatException nfe) {
- logger.debug("Invalid issue age specified in ReminderNotification task.");
- }
- }
- if (args.length > 2) {
- try {
- projectId = Integer.parseInt(args[2]);
- } catch (NumberFormatException nfe) {
- logger.debug("Invalid projectId specified in ReminderNotification task.");
- }
- }
- if (args.length > 3) {
- try {
- severity = Integer.parseInt(args[3]);
- } catch (NumberFormatException nfe) {
- logger.debug("Invalid severity specified in ReminderNotification task.");
- }
- }
- }
- if (notificationDays < 1) {
- logger.info("Reminder notifications are disabled for project " + projectId );
- return;
- }
- logger.debug("Reminder notifications being sent for project " + projectId + " with issues over " + notificationDays + " days old with severity " + severity + ". Base URL = " + baseURL);
- try {
- IssueService issueService = ServletContextUtils.getItrackerServices().getIssueService();
- NotificationService notificationService = ServletContextUtils.getItrackerServices().getNotificationService();
- GregorianCalendar cal = new GregorianCalendar();
- cal.add(Calendar.DAY_OF_MONTH, 0 - notificationDays);
- Date threshold = cal.getTime();
- if (projectId > 0) {
- issues = issueService.getIssuesByProjectId(projectId, IssueUtilities.STATUS_RESOLVED);
- } else {
- issues = issueService.getIssuesWithStatusLessThan(IssueUtilities.STATUS_RESOLVED);
- }
- if (issues != null && issues.size() > 0) {
- for (Issue issue : issues) {
- if (severity >= 0 && issue.getSeverity() != severity) {
- continue;
- }
- if (issue.getLastModifiedDate() != null && issue.getLastModifiedDate().before(threshold)) {
- List<Notification> notifications = notificationService.getPrimaryIssueNotifications(issue);
- for (Notification notification : notifications) {
- if (notification.getUser().getEmail() != null
- && notification.getUser().getEmail().indexOf('@') >= 0) {
- if (logger.isDebugEnabled()) {
- logger.debug("Sending reminder notification for issue " + issue.getId() + " to " + notification.getUser() + " users.");
- }
- notificationService.sendReminder(issue, notification.getUser(), baseURL, notificationDays);
- }
- }
- }
- }
- }
- } catch (Exception e) {
- logger.error("Error sending reminder notifications. Message: ", e);
- throw new RuntimeException("failed to send reminder notifications.", e);
- }
- }
- }