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 }