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
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
30 m_subscribedResources.put(nativeResourceId, callback);
31
32
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
43 m_subscribedResources.remove(nativeResourceId);
44
45
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
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 }