001    package org.hackystat.tickertape.ticker.data;
002    
003    import java.util.HashMap;
004    import java.util.Iterator;
005    import java.util.Map;
006    import java.util.logging.Logger;
007    
008    import org.hackystat.sensorbase.client.SensorBaseClient;
009    
010    /**
011     * Provides an abstract data type for managing a set of ProjectSensorDataLogs. 
012     * @author Philip Johnson
013     *
014     */
015    public class MultiProjectSensorDataLog implements Iterable<ProjectSensorDataLog> {
016      
017      /** A map of projects to the associated SensorDataLog.  The key is {project}:{owner} */
018      private Map<String, ProjectSensorDataLog> project2log = 
019        new HashMap<String, ProjectSensorDataLog>();
020      
021      /**
022       * Constructs a new MultiProjectSensorDataLog.
023       */
024      public MultiProjectSensorDataLog() {
025        // nothing needed yet. 
026      }
027      
028      /**
029       * Return the ProjectSensorDataLog for this project, creating it if it does not yet exist. 
030       * @param client The SensorBaseClient.
031       * @param maxLife The maxLife for sensor data entries in this log.
032       * @param projectOwner The owner.
033       * @param projectName The name.
034       * @param logger The logger to be used if things go wrong. 
035       * @return The ProjectSensorDataLog.
036       */
037      public ProjectSensorDataLog get(SensorBaseClient client, double maxLife,
038          String projectOwner, String projectName, Logger logger) {
039        String key = projectName + ":" + projectOwner;
040        // If we can't find it, create it.
041        if (!this.project2log.containsKey(key)) {
042          ProjectSensorDataLog log = new ProjectSensorDataLog(client, maxLife, projectOwner,
043              projectName, logger);
044          this.project2log.put(key, log);
045        }
046        return this.project2log.get(key);    
047      }
048     
049      /**
050       * Returns true if any of the ProjectSensorDataLogs have data. 
051       * @return True if there is data. 
052       */
053      public boolean hasSensorData() {
054        for (ProjectSensorDataLog log : this.project2log.values()) {
055          if (log.hasSensorData()) {
056            return true;
057          }
058        }
059        return false;
060      }
061    
062      /**
063       * Returns an iterator over the ProjectSensorDataLogs in this collection.
064       * @return An iterator.
065       */
066      public Iterator<ProjectSensorDataLog> iterator() {
067        return this.project2log.values().iterator();
068      }
069      
070      
071    
072    }