home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / javax / management / MBeanServerInvocationHandler.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  6.8 KB  |  212 lines

  1. package javax.management;
  2.  
  3. import com.sun.jmx.mbeanserver.MXBeanProxy;
  4. import java.lang.reflect.InvocationHandler;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Proxy;
  7. import java.util.Arrays;
  8. import java.util.WeakHashMap;
  9.  
  10. public class MBeanServerInvocationHandler implements InvocationHandler {
  11.    private static final WeakHashMap<Class<?>, MXBeanProxy> mxbeanProxies = new WeakHashMap();
  12.    private final MBeanServerConnection connection;
  13.    private final ObjectName objectName;
  14.    private final boolean isMXBean;
  15.  
  16.    public MBeanServerInvocationHandler(MBeanServerConnection var1, ObjectName var2) {
  17.       this(var1, var2, false);
  18.    }
  19.  
  20.    public MBeanServerInvocationHandler(MBeanServerConnection var1, ObjectName var2, boolean var3) {
  21.       if (var1 == null) {
  22.          throw new IllegalArgumentException("Null connection");
  23.       } else if (var2 == null) {
  24.          throw new IllegalArgumentException("Null object name");
  25.       } else {
  26.          this.connection = var1;
  27.          this.objectName = var2;
  28.          this.isMXBean = var3;
  29.       }
  30.    }
  31.  
  32.    public MBeanServerConnection getMBeanServerConnection() {
  33.       return this.connection;
  34.    }
  35.  
  36.    public ObjectName getObjectName() {
  37.       return this.objectName;
  38.    }
  39.  
  40.    public boolean isMXBean() {
  41.       return this.isMXBean;
  42.    }
  43.  
  44.    public static <T> T newProxyInstance(MBeanServerConnection var0, ObjectName var1, Class<T> var2, boolean var3) {
  45.       MBeanServerInvocationHandler var4 = new MBeanServerInvocationHandler(var0, var1);
  46.       Class[] var5;
  47.       if (var3) {
  48.          var5 = new Class[]{var2, NotificationEmitter.class};
  49.       } else {
  50.          var5 = new Class[]{var2};
  51.       }
  52.  
  53.       Object var6 = Proxy.newProxyInstance(var2.getClassLoader(), var5, var4);
  54.       return (T)var2.cast(var6);
  55.    }
  56.  
  57.    public Object invoke(Object var1, Method var2, Object[] var3) throws Throwable {
  58.       Class var4 = var2.getDeclaringClass();
  59.       if (!var4.equals(NotificationBroadcaster.class) && !var4.equals(NotificationEmitter.class)) {
  60.          if (this.shouldDoLocally(var1, var2)) {
  61.             return this.doLocally(var1, var2, var3);
  62.          } else {
  63.             try {
  64.                if (this.isMXBean) {
  65.                   MXBeanProxy var14 = findMXBeanProxy(var4);
  66.                   return var14.invoke(this.connection, this.objectName, var2, var3);
  67.                } else {
  68.                   String var5 = var2.getName();
  69.                   Class[] var6 = var2.getParameterTypes();
  70.                   Class var7 = var2.getReturnType();
  71.                   int var8 = var3 == null ? 0 : var3.length;
  72.                   if (var5.startsWith("get") && var5.length() > 3 && var8 == 0 && !var7.equals(Void.TYPE)) {
  73.                      return this.connection.getAttribute(this.objectName, var5.substring(3));
  74.                   } else if (!var5.startsWith("is") || var5.length() <= 2 || var8 != 0 || !var7.equals(Boolean.TYPE) && !var7.equals(Boolean.class)) {
  75.                      if (var5.startsWith("set") && var5.length() > 3 && var8 == 1 && var7.equals(Void.TYPE)) {
  76.                         Attribute var15 = new Attribute(var5.substring(3), var3[0]);
  77.                         this.connection.setAttribute(this.objectName, var15);
  78.                         return null;
  79.                      } else {
  80.                         String[] var9 = new String[var6.length];
  81.  
  82.                         for(int var10 = 0; var10 < var6.length; ++var10) {
  83.                            var9[var10] = var6[var10].getName();
  84.                         }
  85.  
  86.                         return this.connection.invoke(this.objectName, var5, var3, var9);
  87.                      }
  88.                   } else {
  89.                      return this.connection.getAttribute(this.objectName, var5.substring(2));
  90.                   }
  91.                }
  92.             } catch (MBeanException var11) {
  93.                throw var11.getTargetException();
  94.             } catch (RuntimeMBeanException var12) {
  95.                throw var12.getTargetException();
  96.             } catch (RuntimeErrorException var13) {
  97.                throw var13.getTargetError();
  98.             }
  99.          }
  100.       } else {
  101.          return this.invokeBroadcasterMethod(var1, var2, var3);
  102.       }
  103.    }
  104.  
  105.    private static MXBeanProxy findMXBeanProxy(Class<?> var0) {
  106.       synchronized(mxbeanProxies) {
  107.          MXBeanProxy var2 = (MXBeanProxy)mxbeanProxies.get(var0);
  108.          if (var2 == null) {
  109.             var2 = new MXBeanProxy(var0);
  110.             mxbeanProxies.put(var0, var2);
  111.          }
  112.  
  113.          return var2;
  114.       }
  115.    }
  116.  
  117.    private Object invokeBroadcasterMethod(Object var1, Method var2, Object[] var3) throws Exception {
  118.       String var4 = var2.getName();
  119.       int var5 = var3 == null ? 0 : var3.length;
  120.       if (var4.equals("addNotificationListener")) {
  121.          if (var5 != 3) {
  122.             String var12 = "Bad arg count to addNotificationListener: " + var5;
  123.             throw new IllegalArgumentException(var12);
  124.          } else {
  125.             NotificationListener var11 = (NotificationListener)var3[0];
  126.             NotificationFilter var13 = (NotificationFilter)var3[1];
  127.             Object var14 = var3[2];
  128.             this.connection.addNotificationListener(this.objectName, var11, var13, var14);
  129.             return null;
  130.          }
  131.       } else if (var4.equals("removeNotificationListener")) {
  132.          NotificationListener var10 = (NotificationListener)var3[0];
  133.          switch (var5) {
  134.             case 1:
  135.                this.connection.removeNotificationListener(this.objectName, var10);
  136.                return null;
  137.             case 3:
  138.                NotificationFilter var7 = (NotificationFilter)var3[1];
  139.                Object var8 = var3[2];
  140.                this.connection.removeNotificationListener(this.objectName, var10, var7, var8);
  141.                return null;
  142.             default:
  143.                String var9 = "Bad arg count to removeNotificationListener: " + var5;
  144.                throw new IllegalArgumentException(var9);
  145.          }
  146.       } else if (var4.equals("getNotificationInfo")) {
  147.          if (var3 != null) {
  148.             throw new IllegalArgumentException("getNotificationInfo has args");
  149.          } else {
  150.             MBeanInfo var6 = this.connection.getMBeanInfo(this.objectName);
  151.             return var6.getNotifications();
  152.          }
  153.       } else {
  154.          throw new IllegalArgumentException("Bad method name: " + var4);
  155.       }
  156.    }
  157.  
  158.    private boolean shouldDoLocally(Object var1, Method var2) {
  159.       String var3 = var2.getName();
  160.       if ((var3.equals("hashCode") || var3.equals("toString")) && var2.getParameterTypes().length == 0 && isLocal(var1, var2)) {
  161.          return true;
  162.       } else {
  163.          return var3.equals("equals") && Arrays.equals(var2.getParameterTypes(), new Class[]{Object.class}) && isLocal(var1, var2);
  164.       }
  165.    }
  166.  
  167.    private Object doLocally(Object var1, Method var2, Object[] var3) {
  168.       String var4 = var2.getName();
  169.       if (!var4.equals("equals")) {
  170.          if (var4.equals("toString")) {
  171.             return (this.isMXBean ? "MX" : "M") + "BeanProxy(" + this.connection + "[" + this.objectName + "])";
  172.          } else if (var4.equals("hashCode")) {
  173.             return this.objectName.hashCode() + this.connection.hashCode();
  174.          } else {
  175.             throw new RuntimeException("Unexpected method name: " + var4);
  176.          }
  177.       } else if (this == var3[0]) {
  178.          return true;
  179.       } else if (!(var3[0] instanceof Proxy)) {
  180.          return false;
  181.       } else {
  182.          InvocationHandler var5 = Proxy.getInvocationHandler(var3[0]);
  183.          if (var5 != null && var5 instanceof MBeanServerInvocationHandler) {
  184.             MBeanServerInvocationHandler var6 = (MBeanServerInvocationHandler)var5;
  185.             return this.connection.equals(var6.connection) && this.objectName.equals(var6.objectName) && var1.getClass().equals(var3[0].getClass());
  186.          } else {
  187.             return false;
  188.          }
  189.       }
  190.    }
  191.  
  192.    private static boolean isLocal(Object var0, Method var1) {
  193.       Class[] var2 = var0.getClass().getInterfaces();
  194.       if (var2 == null) {
  195.          return true;
  196.       } else {
  197.          String var3 = var1.getName();
  198.          Class[] var4 = var1.getParameterTypes();
  199.  
  200.          for(Class var8 : var2) {
  201.             try {
  202.                var8.getMethod(var3, var4);
  203.                return false;
  204.             } catch (NoSuchMethodException var10) {
  205.             }
  206.          }
  207.  
  208.          return true;
  209.       }
  210.    }
  211. }
  212.