View Javadoc

1   package fr.in2p3.jsaga.impl.resource.task;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   import java.util.Set;
6   import java.util.Map.Entry;
7   
8   import org.apache.log4j.Logger;
9   import fr.in2p3.jsaga.adaptor.resource.ResourceAdaptor;
10  import fr.in2p3.jsaga.adaptor.resource.ResourceStatus;
11  
12  public class IndividualResourceStatusPoller implements Runnable {
13  
14      private static Logger s_logger = Logger.getLogger(IndividualResourceStatusPoller.class);
15      private ResourceAdaptor m_adaptor;
16      private ResourceStatusPollerTask m_pollerTask;
17      // a map but only one entry is used???
18      protected final Map<String,ResourceMonitorCallback> m_subscribedResources;
19      
20      public IndividualResourceStatusPoller(ResourceAdaptor adaptor) {
21          m_adaptor = adaptor;
22          m_subscribedResources = new HashMap<String,ResourceMonitorCallback>();
23      }
24  
25      public void subscribeResource(String nativeResourceId, ResourceMonitorCallback callback) {
26          synchronized(m_subscribedResources) {
27              boolean toBeStarted = m_subscribedResources.isEmpty();
28  
29              // subscribe job
30              m_subscribedResources.put(nativeResourceId, callback);
31  
32              // may start timer
33              if (toBeStarted) {
34                  m_pollerTask = new ResourceStatusPollerTask(this);
35                  m_pollerTask.start();
36              }
37          }
38      }
39  
40      public void unsubscribeResource(String nativeResourceId) {
41          synchronized(m_subscribedResources) {
42              // unsubscribe job
43              m_subscribedResources.remove(nativeResourceId);
44  
45              // may stop timer
46              if (m_subscribedResources.isEmpty() && m_pollerTask!=null) {
47                  m_pollerTask.stop();
48                  m_pollerTask = null;
49              }
50          }
51      }
52  
53      @Override
54      public void run() {
55          //TODO: should be multi-threaded
56          Set<Entry<String, ResourceMonitorCallback>> entries;
57          synchronized(m_subscribedResources) {
58              entries = m_subscribedResources.entrySet();
59          }
60          for (Entry<String, ResourceMonitorCallback> entry : entries) {
61              String nativeResourceId = (String) entry.getKey();
62              ResourceMonitorCallback callback = (ResourceMonitorCallback) entry.getValue();
63              try {
64                  ResourceStatus status = m_adaptor.getResourceStatus(nativeResourceId);
65                  callback.setState(status.getSagaState(), status.getStateDetail());
66              } catch (Exception e) {
67                  s_logger.warn("Failed to get status for resource: "+ nativeResourceId, e);
68              }
69          }
70      }
71  }