Scarab commit: svn commit: r11361 - branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab: notification om tools
[email protected] Tue, 11 Apr 2017 11:34:45 -0700 (PDT)
| Newsgroups | gmane.comp.java.scarab.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: dabbous
Date: 2017-04-11 11:34:45-0700
New Revision: 11361
Modified:
branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManager.java
branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManagerJob.java
branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java
branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/AttributeValuePeer.java
branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/ScarabModule.java
branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/tools/Environment.java
Log:
Add autoclose feature
Modified: branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManager.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManager.java?view=diff&pathrev=11361&r1=11360&r2=11361
==============================================================================
--- branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManager.java (original)
+++ branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManager.java 2017-04-11 11:34:45-0700
@@ -100,6 +100,13 @@
* the NM should sends out "wakeup notifications" to all observers and assignees.
*/
public void wakeupOnHoldTimeouts();
+
+ /**
+ * Implementations of this method should the means to change the Issue state of issues
+ * according to a use case specific algorithm. The NM Should perform a state switch
+ * according to the use case specific rules.
+ */
+ public void autocloseNotifications();
/**
* Create a new onHoldNotification. This notification will only be sent out AFTER
Modified: branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManagerJob.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManagerJob.java?view=diff&pathrev=11361&r1=11360&r2=11361
==============================================================================
--- branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManagerJob.java (original)
+++ branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/NotificationManagerJob.java 2017-04-11 11:34:45-0700
@@ -76,6 +76,7 @@
log.info("Skipping call to NotificationManager.sendPendingNotifications because there's already once call waiting.");
else
{
+ NotificationManagerFactory.getInstance().autocloseNotifications();
NotificationManagerFactory.getInstance().sendPendingNotifications();
NotificationManagerFactory.getInstance().wakeupOnHoldTimeouts();
}
Modified: branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java?view=diff&pathrev=11361&r1=11360&r2=11361
==============================================================================
--- branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java (original)
+++ branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/notification/ScarabNotificationManager.java 2017-04-11 11:34:45-0700
@@ -76,14 +76,17 @@
import org.tigris.scarab.om.Attribute;
import org.tigris.scarab.om.AttributePeer;
import org.tigris.scarab.om.AttributeValue;
+import org.tigris.scarab.om.AttributeValuePeer;
import org.tigris.scarab.om.Issue;
import org.tigris.scarab.om.IssueManager;
+import org.tigris.scarab.om.IssuePeer;
import org.tigris.scarab.om.Module;
import org.tigris.scarab.om.NotificationRuleManager;
import org.tigris.scarab.om.NotificationStatus;
import org.tigris.scarab.om.NotificationStatusPeer;
import org.tigris.scarab.om.ScarabUser;
import org.tigris.scarab.om.ScarabUserManager;
+import org.tigris.scarab.om.Transition;
import org.tigris.scarab.services.cache.ScarabCache;
import org.tigris.scarab.tools.Environment;
import org.tigris.scarab.tools.localization.L10NKey;
@@ -92,8 +95,10 @@
import org.tigris.scarab.util.Email;
import org.tigris.scarab.util.EmailContext;
import org.tigris.scarab.util.Log;
+import org.tigris.scarab.util.ScarabConstants;
import org.tigris.scarab.util.ScarabException;
import org.tigris.scarab.util.ScarabLink;
+import org.tigris.scarab.workflow.IssueState;
/**
* This class provides the default implementation for the Notification Manager.
@@ -246,6 +251,52 @@
}
}
+ public void autocloseNotifications()
+ {
+ ScarabCache.clear();
+ log.debug("sendPendingNotifications(): Collect pending notifications ...");
+ // It is now guaranteed, that the notifications arrive in order of CreationDate!
+ try
+ {
+ List<AttributeValue> candidates = AttributeValuePeer.getAutocloseCandidates();
+ Iterator<AttributeValue> iter = candidates.iterator();
+ while(iter.hasNext())
+ {
+ AttributeValue av = iter.next();
+ Issue issue = av.getIssue();
+ @SuppressWarnings("unchecked")
+ List<Activity> activities = issue.getActivity(false);
+
+ Iterator<Activity> itera = activities.iterator();
+ Date mostRecentDate = null;
+ while (itera.hasNext()) {
+ Activity activity = itera.next();
+ Date date = activity.getEndDate();
+ if (mostRecentDate == null)
+ mostRecentDate = date;
+ else
+ {
+ if (date != null && date.after(mostRecentDate))
+ {
+ mostRecentDate = date;
+ }
+ }
+ }
+
+ if (mostRecentDate != null)
+ {
+ Date now = new Date();
+ Long issueTime = now.getTime() - mostRecentDate.getTime();
+ checkAutoclose(av, issueTime);
+ }
+ }
+ }
+ catch (TorqueException te)
+ {
+ log.error("autocloseNotifications(): ...Could not retrieve autoclose candidates from Database. Try again later.");
+ }
+
+ }
/**
* This method process the pending notifications and send them
@@ -346,11 +397,12 @@
/*
* Now we got all notifications for current issue sorted by receivers
- * and collected in issueActivities. We now can iterate throug the
+ * and collected in issueActivities. We now can iterate through the
* issueActivities and send one E-Mail per receiver for this issue:
*/
Long issueTime = lastNotification.getCreationDate().getTime();
+
if (isOldEnough(issueTime))
{
processedIssueCount += 1;
@@ -1098,7 +1150,66 @@
return issueMap;
}
+ private void checkAutoclose(AttributeValue aval, long issueTime)
+ {
+
+ List<Object> autocloseInitialStates = Environment.getConfigurationValues("scarab.common.autoclose.states", null);
+ List<Object> autoclosePeriods = Environment.getConfigurationValues("scarab.common.autoclose.periods", null);
+
+ long period = 0;
+ for (int index=0; index < autocloseInitialStates.size(); index++)
+ {
+ String state = (String)autocloseInitialStates.get(index);
+ if (state.equalsIgnoreCase(aval.getValue()))
+ {
+ int periods_index = (index < autoclosePeriods.size()) ? index: autoclosePeriods.size() - 1;
+ String periods = (String)autoclosePeriods.get(periods_index);
+ period = 1000*1000*60*24*Long.parseLong(periods);
+ if (issueTime > period)
+ {
+ String finalState = Environment.getConfigurationProperty("scarab.common.autoclose.finalstate", null);
+ if(finalState == null)
+ {
+ log.error("checkAutoclose(): config attribute 'scarab.common.autoclose.finalstate' not defined");
+ return;
+ }
+ AttributeValue aval2;
+ try {
+ Issue issue = aval.getIssue();
+
+ String username = Environment.getConfigurationProperty("scarab.common.autoclose.user", null);
+ ScarabUser user = null;
+ if (username != null)
+ {
+ user = ScarabUserManager.getInstance(username);
+ }
+ if (user == null)
+ {
+ user = issue.getCreatedBy();
+ }
+
+ aval2 = AttributeValue.getNewInstance(aval.getAttributeId(), issue);
+ aval2.setValue(finalState);
+
+ HashMap<Integer,AttributeValue> newAttVals = new HashMap<Integer,AttributeValue>();
+ newAttVals.put(aval.getAttributeId(), aval2);
+ issue.setAttributeValues(null, newAttVals, null, user);
+ }
+ catch (TorqueException e) {
+ log.error("checkAutoclose(): Could not change State value", e);
+ return;
+ } catch (ScarabException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ return;
+ }
+ }
+ return;
+ }
+
/**
* Will return 'true' if the time since the passed timestamp is at least
* the minimal quiet time configured for issues.
Modified: branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/AttributeValuePeer.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/AttributeValuePeer.java?view=diff&pathrev=11361&r1=11360&r2=11361
==============================================================================
--- branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/AttributeValuePeer.java (original)
+++ branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/AttributeValuePeer.java 2017-04-11 11:34:45-0700
@@ -47,7 +47,10 @@
*/
import java.util.Map;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
// Village
import com.workingdogs.village.Record;
@@ -56,6 +59,7 @@
// Turbine classes
import org.apache.torque.TorqueException;
import org.apache.torque.util.Criteria;
+import org.tigris.scarab.tools.Environment;
/**
* The Peer class for an AttributeValue
@@ -143,5 +147,63 @@
return c;
}
+
+ public static List<AttributeValue> getAutocloseCandidates() throws TorqueException
+ {
+ // Find all issues having + one of the defined autoclose states
+ List<Object> autocloseInitialStates = Environment.getConfigurationValues("scarab.common.autoclose.states", null);
+ String statusAttributeName = Environment.getConfigurationProperty("scarab.common.status.id", null);
+ Attribute statusAttribute = Attribute.getInstance(statusAttributeName);
+
+ if (statusAttribute == null)
+ {
+ log.error("getAutocloseCandidates(): No attribute with name '"+statusAttributeName+"' found");
+ log.error("Please check config attribute 'scarab.common.status.id' for validity");
+ return null;
+ }
+
+ Criteria crit = new Criteria();
+ Iterator<Object> stateiter = autocloseInitialStates.iterator();
+ while(stateiter.hasNext())
+ {
+ crit.or(AttributeValuePeer.VALUE, stateiter.next());
+ }
+
+ List avs = statusAttribute.getAttributeValues(crit);
+ List<AttributeValue> candidates = new ArrayList<AttributeValue>();
+
+ List<Object> moduleCodes = Environment.getConfigurationValues("scarab.common.autoclose.modules", null);
+ if (moduleCodes == null)
+ {
+ log.error("getAutocloseCandidates(): config attribute 'scarab.common.autoclose.modules' not defined");
+ return null;
+ }
+
+ Iterator<AttributeValue> iterav = avs.iterator();
+ while(iterav.hasNext())
+ {
+ AttributeValue av = iterav.next();
+ Issue issue = av.getIssue();
+ Module module = issue.getModule();
+ String code = module.getCode();
+ Iterator<Object> iterm = moduleCodes.iterator();
+ boolean isCandidate = false;
+ while (iterm.hasNext())
+ {
+ String modid = (String)iterm.next();
+ if(modid.equalsIgnoreCase(code))
+ {
+ isCandidate = true;
+ break;
+ }
+ }
+
+ if (isCandidate)
+ {
+ candidates.add(av);
+ }
+ }
+ return candidates;
+ }
}
Modified: branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/ScarabModule.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/ScarabModule.java?view=diff&pathrev=11361&r1=11360&r2=11361
==============================================================================
--- branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/ScarabModule.java (original)
+++ branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/om/ScarabModule.java 2017-04-11 11:34:45-0700
@@ -951,12 +951,23 @@
return name2.compareTo(name1);
}
+ /**
+ * All emails related to this module will have a copy sent to
+ * this address. A system-wide default email address can be specified in
+ * Scarab.properties with the key: scarab.email.autoclose.fromAddress
+ */
+ public String getAutocloseEmail()
+ {
+ String email = Turbine.getConfiguration()
+ .getString(ScarabConstants.AUTOCLOSE_EMAIL_ADDRESS, null);
+ return email;
+ }
/**
- * All emails related to this module will have a copy sent to
- * this address. A system-wide default email address can be specified in
- * Scarab.properties with the key: scarab.email.archive.toAddress
- */
+ * All emails related to this module will have a copy sent to
+ * this address. A system-wide default email address can be specified in
+ * Scarab.properties with the key: scarab.email.archive.toAddress
+ */
public String getArchiveEmail()
{
String email = super.getArchiveEmail();
@@ -965,10 +976,9 @@
email = Turbine.getConfiguration()
.getString(ScarabConstants.ARCHIVE_EMAIL_ADDRESS, null);
}
-
return email;
}
-
+
/**
* Examines the modules archiveEmail string (which may contain multiple
* email targets) and returns only those entries, which are recognized as
Modified: branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/tools/Environment.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/tools/Environment.java?view=diff&pathrev=11361&r1=11360&r2=11361
==============================================================================
--- branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/tools/Environment.java (original)
+++ branches/scarab_11079_legacy_with_ant_maven1/src/java/org/tigris/scarab/tools/Environment.java 2017-04-11 11:34:45-0700
@@ -1,5 +1,7 @@
package org.tigris.scarab.tools;
+import java.util.List;
+
/* ================================================================
* Copyright (c) 2010 CollabNet. All rights reserved.
*
@@ -70,4 +72,10 @@
return result;
}
+ @SuppressWarnings("unchecked")
+ public static List<Object> getConfigurationValues(String prop, List<Object> def)
+ {
+ return Turbine.getConfiguration().getList(prop, def);
+ }
+
}
------------------------------------------------------
http://scarab.tigris.org/ds/viewMessage.do?dsForumId=3577&dsMessageId=3228465