View Javadoc
1   /*
2    * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  
27  
28  package com.sun.org.glassfish.gmbal;
29  
30  import java.io.IOException;
31  import java.util.HashMap;
32  import java.util.Map;
33  import javax.management.Attribute;
34  import javax.management.AttributeList;
35  import javax.management.AttributeNotFoundException;
36  import javax.management.Descriptor;
37  import javax.management.InstanceNotFoundException;
38  import javax.management.IntrospectionException;
39  import javax.management.InvalidAttributeValueException;
40  import javax.management.JMException;
41  import javax.management.MBeanException;
42  import javax.management.MBeanInfo;
43  import javax.management.MBeanServerConnection;
44  import javax.management.MalformedObjectNameException;
45  import javax.management.ObjectName;
46  import javax.management.ReflectionException;
47  import javax.management.RuntimeOperationsException;
48  import javax.management.modelmbean.ModelMBeanInfo;
49  
50  
51  /** This class implements a generic AMXMBeanInterface MBean which is connected to a possibly
52   * remote MBeanServerConnection (note that MBeanServer isA MBeanServerConnection,
53   * so we can actually create an AMXClientImpl simply by using the MBeanServer
54   * from the mom: this is useful for testing).
55   * <P>
56   * Note that this version of the AMXMBeanInterface API provides a generic get/set API that
57   * is identical to DynamicMBean, except that it only throws unchecked exceptions.
58   * This is far more convenient in practice than the JMX-standard checked exceptions.
59   *
60   * @author ken
61   */
62  public class AMXClient implements AMXMBeanInterface {
63      private static ObjectName makeObjectName( String str ) {
64          try {
65              return new ObjectName(str);
66          } catch (MalformedObjectNameException ex) {
67              return null ;
68          }
69      }
70  
71      /** Special object name used to represent a NULL objectName result.
72       */
73      public static final ObjectName NULL_OBJECTNAME = makeObjectName(
74          "null:type=Null,name=Null" ) ;
75  
76      private MBeanServerConnection server ;
77      private ObjectName oname ;
78  
79      @Override
80      public boolean equals( Object obj ) {
81          if (this == obj) {
82              return true ;
83          }
84  
85          if (!(obj instanceof AMXClient)) {
86              return false ;
87          }
88  
89          AMXClient other = (AMXClient)obj ;
90  
91          return oname.equals( other.oname ) ;
92      }
93  
94      @Override
95      public int hashCode() {
96          int hash = 5;
97          hash = 47 * hash + (this.oname != null ? this.oname.hashCode() : 0);
98          return hash;
99      }
100 
101     @Override
102     public String toString() {
103         return "AMXClient[" + oname + "]" ;
104     }
105 
106     private <T> T fetchAttribute( String name, Class<T> type ) {
107         try {
108             Object obj = server.getAttribute( oname, name ) ;
109             if (NULL_OBJECTNAME.equals( obj )) {
110                 return null ;
111             } else {
112                 return type.cast( obj ) ;
113             }
114         } catch (JMException exc) {
115             throw new GmbalException( "Exception in fetchAttribute", exc ) ;
116         } catch (IOException exc) {
117             throw new GmbalException( "Exception in fetchAttribute", exc ) ;
118         }
119     }
120 
121     public AMXClient( MBeanServerConnection server,
122         ObjectName oname ) {
123         this.server = server ;
124         this.oname = oname ;
125     }
126 
127     private AMXClient makeAMX( ObjectName on ) {
128         if (on == null) {
129             return null ;
130         }
131         return new AMXClient( this.server, on ) ;
132     }
133 
134     public String getName() {
135         return fetchAttribute( "Name", String.class )  ;
136     }
137 
138     public Map<String,?> getMeta() {
139         try {
140             ModelMBeanInfo mbi = (ModelMBeanInfo) server.getMBeanInfo( oname );
141             Descriptor desc = mbi.getMBeanDescriptor() ;
142             Map<String,Object> result = new HashMap<String,Object>() ;
143             for (String str : desc.getFieldNames()) {
144                 result.put( str, desc.getFieldValue( str )) ;
145             }
146             return result ;
147         } catch (MBeanException ex) {
148             throw new GmbalException( "Exception in getMeta", ex ) ;
149         } catch (RuntimeOperationsException ex) {
150             throw new GmbalException( "Exception in getMeta", ex ) ;
151         } catch (InstanceNotFoundException ex) {
152             throw new GmbalException( "Exception in getMeta", ex ) ;
153         } catch (IntrospectionException ex) {
154             throw new GmbalException( "Exception in getMeta", ex ) ;
155         } catch (ReflectionException ex) {
156             throw new GmbalException( "Exception in getMeta", ex ) ;
157         } catch (IOException ex) {
158             throw new GmbalException( "Exception in getMeta", ex ) ;
159         }
160     }
161 
162     public AMXClient getParent() {
163         ObjectName res  = fetchAttribute( "Parent", ObjectName.class ) ;
164         return makeAMX( res ) ;
165     }
166 
167     public AMXClient[] getChildren() {
168         ObjectName[] onames = fetchAttribute( "Children",
169             ObjectName[].class ) ;
170         return makeAMXArray( onames ) ;
171     }
172 
173     private AMXClient[] makeAMXArray( ObjectName[] onames ) {
174         AMXClient[] result = new AMXClient[onames.length] ;
175         int ctr=0 ;
176         for (ObjectName on : onames ) {
177             result[ctr++] = makeAMX( on ) ;
178         }
179 
180         return result ;
181     }
182 
183     public Object getAttribute(String attribute) {
184         try {
185             return server.getAttribute(oname, attribute);
186         } catch (MBeanException ex) {
187             throw new GmbalException( "Exception in getAttribute", ex ) ;
188         } catch (AttributeNotFoundException ex) {
189             throw new GmbalException( "Exception in getAttribute", ex ) ;
190         } catch (ReflectionException ex) {
191             throw new GmbalException( "Exception in getAttribute", ex ) ;
192         } catch (InstanceNotFoundException ex) {
193             throw new GmbalException( "Exception in getAttribute", ex ) ;
194         } catch (IOException ex) {
195             throw new GmbalException( "Exception in getAttribute", ex ) ;
196         }
197     }
198 
199     public void setAttribute(String name, Object value ) {
200         Attribute attr = new Attribute( name, value ) ;
201         setAttribute( attr ) ;
202     }
203 
204     public void setAttribute(Attribute attribute) {
205         try {
206             server.setAttribute(oname, attribute);
207         } catch (InstanceNotFoundException ex) {
208             throw new GmbalException( "Exception in setAttribute", ex ) ;
209         } catch (AttributeNotFoundException ex) {
210             throw new GmbalException( "Exception in setAttribute", ex ) ;
211         } catch (InvalidAttributeValueException ex) {
212             throw new GmbalException( "Exception in setAttribute", ex ) ;
213         } catch (MBeanException ex) {
214             throw new GmbalException( "Exception in setAttribute", ex ) ;
215         } catch (ReflectionException ex) {
216             throw new GmbalException( "Exception in setAttribute", ex ) ;
217         } catch (IOException ex) {
218             throw new GmbalException( "Exception in setAttribute", ex ) ;
219         }
220     }
221 
222     public AttributeList getAttributes(String[] attributes) {
223         try {
224             return server.getAttributes(oname, attributes);
225         } catch (InstanceNotFoundException ex) {
226             throw new GmbalException( "Exception in getAttributes", ex ) ;
227         } catch (ReflectionException ex) {
228             throw new GmbalException( "Exception in getAttributes", ex ) ;
229         } catch (IOException ex) {
230             throw new GmbalException( "Exception in getAttributes", ex ) ;
231         }
232     }
233 
234     public AttributeList setAttributes(AttributeList attributes) {
235         try {
236             return server.setAttributes(oname, attributes);
237         } catch (InstanceNotFoundException ex) {
238             throw new GmbalException( "Exception in setAttributes", ex ) ;
239         } catch (ReflectionException ex) {
240             throw new GmbalException( "Exception in setAttributes", ex ) ;
241         } catch (IOException ex) {
242             throw new GmbalException( "Exception in setAttributes", ex ) ;
243         }
244     }
245 
246     public Object invoke(String actionName, Object[] params, String[] signature)
247         throws MBeanException, ReflectionException {
248         try {
249             return server.invoke(oname, actionName, params, signature);
250         } catch (InstanceNotFoundException ex) {
251             throw new GmbalException( "Exception in invoke", ex ) ;
252         } catch (IOException ex) {
253             throw new GmbalException( "Exception in invoke", ex ) ;
254         }
255     }
256 
257     public MBeanInfo getMBeanInfo() {
258         try {
259             return server.getMBeanInfo(oname);
260         } catch (InstanceNotFoundException ex) {
261             throw new GmbalException( "Exception in invoke", ex ) ;
262         } catch (IntrospectionException ex) {
263             throw new GmbalException( "Exception in invoke", ex ) ;
264         } catch (ReflectionException ex) {
265             throw new GmbalException( "Exception in invoke", ex ) ;
266         } catch (IOException ex) {
267             throw new GmbalException( "Exception in invoke", ex ) ;
268         }
269     }
270 
271     public ObjectName objectName() {
272         return oname ;
273     }
274 }