1 4 package org.oddjob.jmx.server; 5 6 import java.util.ArrayList ; 7 import java.util.Arrays ; 8 import java.util.HashMap ; 9 import java.util.List ; 10 import java.util.Map ; 11 12 import javax.management.MBeanAttributeInfo ; 13 import javax.management.MBeanConstructorInfo ; 14 import javax.management.MBeanException ; 15 import javax.management.MBeanInfo ; 16 import javax.management.MBeanNotificationInfo ; 17 import javax.management.MBeanOperationInfo ; 18 import javax.management.Notification ; 19 import javax.management.ReflectionException ; 20 21 public class InterfaceManagerImpl implements InterfaceManager { 22 23 private final MBeanInfo mBeanInfo; 24 25 private final Class [] interfaces; 26 27 private final InterfaceHandler[] handlers; 28 29 private final Map operations = new HashMap (); 30 31 public InterfaceManagerImpl(Object target, 32 OddjobMBean ojmb, 33 InterfaceInfo[] definitions) { 34 35 List attributeInfo = new ArrayList (); 36 List operationInfo = new ArrayList (); 37 List notificationInfo = new ArrayList (); 38 39 interfaces = new Class [definitions.length]; 40 handlers = new InterfaceHandler[definitions.length]; 41 42 for (int i = 0; i < definitions.length; ++i) { 43 InterfaceInfo definition = definitions[i]; 44 45 interfaces[i] = definition.interfaceClass(); 46 InterfaceHandler ihInstance 47 = definition.attach(target, ojmb); 48 handlers[i] = ihInstance; 49 50 attributeInfo.addAll(Arrays.asList(definition.getMBeanAttributeInfo())); 51 MBeanOperationInfo [] oInfo = definition.getMBeanOperationInfo(); 52 for (int j = 0; j < oInfo.length; ++j) { 53 operationInfo.add(oInfo[j]); 54 operations.put(oInfo[j].getName(), ihInstance); 55 } 56 notificationInfo.addAll(Arrays.asList(definition.getMBeanNotificationInfo())); 57 } 58 59 mBeanInfo = new MBeanInfo (target.toString(), 60 "Description of " + target.toString(), 61 (MBeanAttributeInfo []) attributeInfo.toArray(new MBeanAttributeInfo [0]), 62 new MBeanConstructorInfo [0], 63 (MBeanOperationInfo []) operationInfo.toArray(new MBeanOperationInfo [0]), 64 (MBeanNotificationInfo []) notificationInfo.toArray(new MBeanNotificationInfo [0])); 65 } 66 67 public Class [] interfaces() { 68 return interfaces; 69 } 70 71 public MBeanInfo getMBeanInfo() { 72 return mBeanInfo; 73 } 74 75 public Object invoke(String actionName, Object [] params, String [] signature) 76 throws MBeanException , ReflectionException { 77 InterfaceHandler ihInstance = (InterfaceHandler) operations.get(actionName); 78 if (ihInstance == null) { 79 throw new IllegalArgumentException ("No interface supports method [" + actionName + "]"); 80 } 81 return ihInstance.invoke(actionName, params, signature); 82 } 83 84 public Notification [] getLastNotifications() { 85 List notifications = new ArrayList (); 86 for (int i = 0; i < handlers.length; ++i) { 87 Notification [] last = handlers[i].getLastNotifications(); 88 if (last == null) { 89 continue; 90 } 91 notifications.addAll( 92 Arrays.asList(last)); 93 } 94 return (Notification []) notifications.toArray(new Notification [0]); 95 } 96 97 public void destroy() { 98 for (int i = 0; i < handlers.length; ++i) { 99 handlers[i].destroy(); 100 handlers[i] = null; 101 } 102 } 103 } | Popular Tags |