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