View Javadoc

1   package cz.cuni.amis.pogamut.base.utils.logging.jmx;
2   
3   import javax.management.AttributeNotFoundException;
4   import javax.management.MBeanException;
5   import javax.management.MBeanServer;
6   import javax.management.MBeanServerConnection;
7   import javax.management.ObjectName;
8   import javax.management.ReflectionException;
9   
10  import cz.cuni.amis.introspection.jmx.DynamicProxy;
11  import cz.cuni.amis.pogamut.base.agent.IAgentId;
12  import cz.cuni.amis.pogamut.base.agent.exceptions.CantStartJMXException;
13  import cz.cuni.amis.pogamut.base.agent.exceptions.JMXAlreadyEnabledException;
14  import cz.cuni.amis.pogamut.base.utils.logging.AbstractAgentLogger;
15  import cz.cuni.amis.pogamut.base.utils.logging.AgentLogger;
16  import cz.cuni.amis.pogamut.base.utils.logging.IAgentLogger;
17  import cz.cuni.amis.pogamut.base.utils.logging.IJMXAgentLogger;
18  import cz.cuni.amis.pogamut.base.utils.logging.ILogCategories;
19  import cz.cuni.amis.utils.Lazy;
20  import cz.cuni.amis.utils.exception.PogamutException;
21  
22  /**
23   * Makes remote AgentLogger look like local logger. The communication is handled
24   * through JMX interface.
25   * <p><p>
26   * {@link IJMXAgentLogger} interface is fully proxied (executes JMX remote calls).
27   * 
28   * @author ik
29   */
30  public class AgentLoggerJMXProxy extends AbstractAgentLogger {
31  
32      Lazy<ILogCategories> logCategories = new Lazy<ILogCategories>() {
33          @Override
34          protected ILogCategories create() {
35              return new LogCategoriesJMXProxy(mbsc, parentName);
36          }
37      };
38      MBeanServerConnection mbsc = null;
39      ObjectName parentName = null;
40      
41      DynamicProxy agentLoggerProxy;
42  
43      public AgentLoggerJMXProxy(IAgentId agentName, MBeanServerConnection mbsc, ObjectName parentName) {
44          super(agentName);
45          this.mbsc = mbsc;
46          this.parentName = parentName;
47          ObjectName objectName = AgentLogger.getJMXAgentLoggerName(parentName);        
48          this.agentLoggerProxy = new DynamicProxy(objectName, mbsc); 
49      }
50      ILogCategories cats = null;
51  
52      @Override
53      protected ILogCategories getLogCategories() {
54          return logCategories.getVal();
55      }
56  
57      @Override
58      public void enableJMX(MBeanServer mBeanServer, ObjectName parent) throws JMXAlreadyEnabledException, CantStartJMXException {
59          throw new UnsupportedOperationException(
60                  "This logger is already a proxy to some remote logger. Making two proxies isn't the best practice, however it can be done, "
61                  + "just implement this method based on DefaultAgentLogger's implementation of JMX.");
62      }
63      
64      /**
65       * Executes JMX remote call to the proxied {@link IAgentLogger#getNetworkLoggerHost()} method.
66       * 
67       * @see IAgentLogger#getNetworkLoggerHost()
68       */
69      @Override
70      public String getNetworkLoggerHost() {
71      	try {
72  			return (String) agentLoggerProxy.getAttribute("NetworkLoggerHost");
73  		} catch (Exception e) {
74  			// TODO: [Jimmy/Ruda/Honza] Create specific JMX exceptions
75  			throw new PogamutException("Could not invoke agentLoggerProxy.getAttribute(\"NetworkLoggerHost\").", e, this); 
76  		}
77      }
78      
79      /**
80       * Executes JMX remote call to the proxied {@link IAgentLogger#getNetworkLoggerPort()} method.
81       * 
82       * @see IAgentLogger#getNetworkLoggerPort()
83       */
84      @Override
85      public Integer getNetworkLoggerPort() {
86      	try {
87  			return (Integer) agentLoggerProxy.getAttribute("NetworkLoggerPort");
88  		} catch (Exception e) {
89  			// TODO: [Jimmy/Ruda/Honza] Create specific JMX exceptions
90  			throw new PogamutException("Could not invoke agentLoggerProxy.getAttribute(\"NetworkLoggerPort\").", e, this); 
91  		}
92      }
93      
94      /**
95       * Executes JMX remote call to the proxied {@link IAgentLogger#addDefaultNetworkHandler()} method.
96       * 
97       * @see IAgentLogger#addDefaultNetworkHandler()
98       */
99      @Override
100     public synchronized void addDefaultNetworkHandler() {
101     	try {
102 			agentLoggerProxy.invoke("addDefaultNetworkHandler", null, null);
103 		} catch (Exception e) {
104 			// TODO: [Jimmy/Ruda/Honza] Create specific JMX exceptions
105 			throw new PogamutException("Could not invoke agentLoggerProxy.invoke(\"addDefaultNetworkHandler\").", e, this); 
106 		}
107     }
108     
109     /**
110      * Executes JMX remote call to the proxied {@link IAgentLogger#removeDefaultNetworkHandler()} method.
111      * 
112      * @see IAgentLogger#removeDefaultNetworkHandler()
113      */
114     public synchronized void removeDefaultNetworkHandler() {
115     	try {
116 			agentLoggerProxy.invoke("removeDefaultNetworkHandler", null, null);
117 		} catch (Exception e) {
118 			// TODO: [Jimmy/Ruda/Honza] Create specific JMX exceptions
119 			throw new PogamutException("Could not invoke agentLoggerProxy.invoke(\"removeDefaultNetworkHandler\").", e, this); 
120 		}
121     }
122     
123     /**
124      * Executes JMX remote call to the proxied {@link IAgentLogger#isDefaultNetworkHandler()} method.
125      * 
126      * @see IAgentLogger#isDefaultNetworkHandler()
127      */
128     @Override
129 	public boolean isDefaultNetworkHandler() {
130     	try {
131 			return (Boolean) agentLoggerProxy.getAttribute("DefaultNetworkHandler");
132 		} catch (Exception e) {
133 			// TODO: [Jimmy/Ruda/Honza] Create specific JMX exceptions
134 			throw new PogamutException("Could not invoke agentLoggerProxy.getAttribute(\"DefaultNetworkHandler\").", e, this);
135 		}
136     }
137     
138 }