001    package org.hackystat.tickertape.ticker;
002    
003    import java.util.HashSet;
004    import java.util.Set;
005    import java.util.logging.Logger;
006    
007    import org.hackystat.sensorbase.client.SensorBaseClient;
008    import org.hackystat.tickertape.notifier.nabaztag.NabaztagNotifier;
009    import org.hackystat.tickertape.ticker.data.MultiProjectSensorDataLog;
010    import org.hackystat.tickertape.ticker.data.ProjectSensorDataLog;
011    import org.hackystat.tickertape.tickerlingua.HackystatProject;
012    import org.hackystat.tickertape.tickerlingua.HackystatUser;
013    import org.hackystat.tickertape.tickerlingua.NotificationService;
014    import org.hackystat.tickertape.tickerlingua.TickerLingua;
015    import org.hackystat.tickertape.tickerlingua.Tickertape;
016    
017    /**
018     * Provides a ticker that monitors a set of Hackystat Projects and creates a "News Bulletin" 
019     * once an hour on the hour that summarizes activity that is read by the Nabaztag Rabbit.  
020     * @author Philip Johnson
021     */
022    public class NabaztagNewsTicker implements Ticker {
023      
024      private Tickertape tickertape;
025      private Logger logger;
026      private MultiProjectSensorDataLog multiLog = new MultiProjectSensorDataLog();
027      private NabaztagNotifier nabaztagNotifier;
028      
029    
030      /**
031       * The run method for this ticker. 
032       * @param tickertape The Tickertape instance indicating what to do. 
033       * @param tickerLingua The TickerLingua instance with global data info.
034       * @param logger The logger to be used to communicate status. 
035       */
036      public void run(Tickertape tickertape, TickerLingua tickerLingua, Logger logger) {
037        logger.info("Running NabaztagNewsTicker");
038        this.tickertape = tickertape;
039        this.logger = logger;
040        notify(null); // Send a message to the rabbit indicating we're starting up. 
041        
042        // Update the MultiProjectSensorDataLog for every project we're interested in. 
043        for (HackystatProject project : tickertape.getHackystatProjects()) {
044          this.logger.info("\n\nChecking status of project " + project.getName());
045          
046          // Find or create the ProjectSensorDataLog.
047          String projectName = project.getName();
048          String projectOwner = project.getHackystatOwner().getHackystatUserAccount();
049          HackystatUser authUser = project.getHackystatAuthUser();
050          SensorBaseClient client = authUser.getSensorBaseClient();
051          ProjectSensorDataLog log = multiLog.get(client, 1.0, projectOwner, projectName, logger);
052          // Now get any new data.
053          log.update();
054        }
055        
056        // If there's any sensor data from the time interval, then make a report. 
057        if (multiLog.hasSensorData()) {
058          // Initially, simply report on who was working on what.
059          StringBuffer buff = new StringBuffer();
060          for (ProjectSensorDataLog log : multiLog) {
061            if (log.hasSensorData()) {
062              Set<String> workers = new HashSet<String>();
063              for (String owner : log.getOwners()) {
064                String fullName = tickerLingua.findFullName(owner);
065                workers.add((fullName == null) ? owner : fullName);
066              }
067              
068              for (String worker : workers) {
069                buff.append(worker).append(" and ");
070              }
071              buff.append(" were working on project").append(log.getProjectName()).append(". ");
072            }
073          }
074          
075          // Now send the notification to the rabbit.
076          notify(buff.toString());
077        }
078      }
079      
080      /**
081       * Sends a message to the Rabbit associated with this ticker.
082       * Sends a "startup" message to the rabbit the first time it is invoked. 
083       * @param message The message to be sent. 
084       */
085      private void notify(String message) {
086        if (this.nabaztagNotifier == null) {
087          NotificationService notifier = tickertape.getNotificationServices().get(0);
088          this.nabaztagNotifier = 
089            new NabaztagNotifier(notifier.getId(), notifier.getPassword(), logger);
090          this.nabaztagNotifier.notify("Starting up a new Nabaztag News Ticker.");
091        }
092        if (message != null) {
093          this.nabaztagNotifier.notify(message);
094        }
095      }
096    }