View Javadoc

1   package cz.cuni.amis.pogamut.base.utils.jmx.flag;
2   
3   import javax.management.MBeanServerConnection;
4   import javax.management.MalformedObjectNameException;
5   import javax.management.Notification;
6   import javax.management.NotificationListener;
7   import javax.management.ObjectName;
8   
9   import cz.cuni.amis.pogamut.base.utils.jmx.PogamutJMX;
10  import cz.cuni.amis.utils.flag.Flag;
11  
12  /**
13   * Proxy exposing remote JMX MBean Flag as local flag.
14   * @author ik
15   */
16  public class FlagJMXProxy<T> extends Flag<T> {
17  
18      NotificationListener listener = null;
19  
20      public FlagJMXProxy(final ObjectName source, final MBeanServerConnection mbsc, final String flagName) throws MalformedObjectNameException {
21          ObjectName name = PogamutJMX.getObjectName(source, flagName, PogamutJMX.FLAGS_SUBTYPE);
22          try {
23              listener = new NotificationListener() {
24  
25                  @Override
26                  public void handleNotification(Notification notification, Object handback) {
27                      if (notification.getSource().equals(source) && notification.getType().equals(flagName)) {
28                          setFlag((T) notification.getUserData());
29                      }
30                  }
31              };
32              // get current value of the flag
33              T val = (T) mbsc.getAttribute(name, "Flag");
34              setFlag(val);
35  
36              /* NOTE filters are send over RMI to the server !!! it is better to
37               handle filtering in the listener itself.
38               
39              NotificationFilter nf = new NotificationFilter() {
40  
41              @Override
42              public boolean isNotificationEnabled(Notification notification) {
43              return notification.getSource().equals(source) && notification.getType().equals(flagName);
44              }
45              };
46               */
47              mbsc.addNotificationListener(name, listener, null, mbsc);
48          } catch (Exception ex) {
49              ex.printStackTrace();
50              throw new RuntimeException(ex);
51          }
52      }
53  }