You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/11/26 06:26:11 UTC

svn commit: r598132 - in /mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx: DefaultModelMBean.java Foo.java

Author: trustin
Date: Sun Nov 25 21:26:03 2007
New Revision: 598132

URL: http://svn.apache.org/viewvc?rev=598132&view=rev
Log:
Added findSessions and findAndRegisterSessions operation to DefaultModelMBean

Modified:
    mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/DefaultModelMBean.java
    mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java

Modified: mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/DefaultModelMBean.java
URL: http://svn.apache.org/viewvc/mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/DefaultModelMBean.java?rev=598132&r1=598131&r2=598132&view=diff
==============================================================================
--- mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/DefaultModelMBean.java (original)
+++ mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/DefaultModelMBean.java Sun Nov 25 21:26:03 2007
@@ -27,6 +27,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -76,6 +77,7 @@
 import org.apache.mina.common.TransportMetadata;
 import org.apache.mina.integration.beans.PropertyEditorFactory;
 import org.apache.mina.integration.ognl.IoServicePropertyAccessor;
+import org.apache.mina.integration.ognl.IoSessionFinder;
 import org.apache.mina.integration.ognl.IoSessionPropertyAccessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -94,7 +96,7 @@
 
     public DefaultModelMBean(Object source) {
         OgnlRuntime.setPropertyAccessor(IoSession.class, new IoSessionPropertyAccessor());
-        OgnlRuntime.setPropertyAccessor(IoSession.class, new IoServicePropertyAccessor());
+        OgnlRuntime.setPropertyAccessor(IoService.class, new IoServicePropertyAccessor());
         
         if (source == null) {
             throw new NullPointerException("source");
@@ -145,11 +147,16 @@
 
     private void throwMBeanException(OgnlException e) throws MBeanException {
         Throwable reason = e.getReason();
+        if (reason == null) {
+            throw new MBeanException(new IllegalArgumentException(e.getClass().getName() + ": " + e.getMessage()));
+        }
+        if (reason instanceof OgnlException) {
+            throw new MBeanException(new IllegalArgumentException(reason.getClass().getName() + ": " + reason.getMessage()));
+        }
         if (reason instanceof Exception) {
             throw new MBeanException((Exception) reason);
-        } else {
-            throw new MBeanException(new Exception("Unexpected exception.", reason));
         }
+        throw new MBeanException(new IllegalArgumentException(reason.getClass().getName() + ": " + reason.getMessage()));
     }
 
     public AttributeList getAttributes(String names[]) {
@@ -186,6 +193,45 @@
             throws MBeanException, ReflectionException {
 
         // Handle synthetic operations first.
+        if (source instanceof IoService) {
+            if (name.equals("findSessions")) {
+                try {
+                    IoSessionFinder finder = new IoSessionFinder((String) params[0]);
+                    return convertReturnValue(finder.find(
+                            ((IoService) source).getManagedSessions()));
+                } catch (OgnlException e) {
+                    throwMBeanException(e);
+                    throw new InternalError();
+                }
+            }
+            
+            if (name.equals("findAndRegisterSessions")) {
+                try {
+                    IoSessionFinder finder = new IoSessionFinder((String) params[0]);
+                    Set<IoSession> registeredSessions = new LinkedHashSet<IoSession>();
+                    for (IoSession s: finder.find(
+                            ((IoService) source).getManagedSessions())) {
+                        try {
+                            server.registerMBean(
+                                    new DefaultModelMBean(s),
+                                    new ObjectName(
+                                            this.name.getDomain() + 
+                                            ":type=session,name=" + 
+                                            getIdAsString(s.getId())));
+                            registeredSessions.add(s);
+                        } catch (Exception e) {
+                            logger.warn("Failed to register a session as a MBean: " + s, e);
+                        }
+                    }
+                    
+                    return convertReturnValue(registeredSessions);
+                } catch (OgnlException e) {
+                    throwMBeanException(e);
+                    throw new InternalError();
+                }
+            }
+        }
+        
         if (name.equals("unregisterMBean")) {
             try {
                 server.unregisterMBean(this.name);
@@ -201,8 +247,8 @@
             for (int i = 0; i < paramTypes.length; i ++) {
                 paramTypes[i] = getAttributeClass(signature[i]);
             }
-            return convertAttributeValue(
-                    "", MethodUtils.invokeMethod(source, name, params, paramTypes));
+            return convertReturnValue(
+                    MethodUtils.invokeMethod(source, name, params, paramTypes));
         } catch (ClassNotFoundException e) {
             throw new ReflectionException(e);
         } catch (NoSuchMethodException e) {
@@ -500,16 +546,31 @@
             for (Class<?> ptype: m.getParameterTypes()) {
                 String pname = "p" + (i ++);
                 signature.add(new MBeanParameterInfo(
-                        pname, convertAttributeType("", ptype).getName(), pname));
+                        pname, convertAttributeType(pname, ptype).getName(), pname));
             }
 
             operations.add(new ModelMBeanOperationInfo(
                     m.getName(), m.getName(),
                     signature.toArray(new MBeanParameterInfo[signature.size()]),
-                    convertOperationReturnType(m.getReturnType()).getName(),
+                    convertReturnType(m.getReturnType()).getName(),
                     ModelMBeanOperationInfo.ACTION));
         }
         
+        if (object instanceof IoService) {
+            operations.add(new ModelMBeanOperationInfo(
+                    "findSessions", "findSessions",
+                    new MBeanParameterInfo[] {
+                            new MBeanParameterInfo(
+                                    "ognlQuery", String.class.getName(), "a boolean OGNL expression")
+                    }, Set.class.getName(), ModelMBeanOperationInfo.INFO));
+            operations.add(new ModelMBeanOperationInfo(
+                    "findAndRegisterSessions", "findAndRegisterSessions",
+                    new MBeanParameterInfo[] {
+                            new MBeanParameterInfo(
+                                    "ognlQuery", String.class.getName(), "a boolean OGNL expression")
+                    }, Set.class.getName(), ModelMBeanOperationInfo.INFO));
+        }
+        
         operations.add(new ModelMBeanOperationInfo(
                 "unregisterMBean", "unregisterMBean",
                 new MBeanParameterInfo[0], void.class.getName(), 
@@ -573,17 +634,6 @@
         return PropertyEditorFactory.getInstance(propType);
     }
     
-    protected Class<?> convertOperationReturnType(Class<?> opReturnType) {
-        if (IoFuture.class.isAssignableFrom(opReturnType)) {
-            return void.class;
-        }
-        if (opReturnType == void.class || opReturnType == Void.class) {
-            return void.class;
-        }
-
-        return convertAttributeType("", opReturnType);
-    }
-
     protected Class<?> convertAttributeType(
             String attrName, Class<?> attrType) {
 
@@ -661,16 +711,10 @@
                 }
                 return new Date(l);
             }
-            
             if (attrName.equals("id")) {
-                // ID in MINA is a unsigned 32-bit integer.
-                String id = Long.toHexString(l).toUpperCase();
-                while (id.length() < 8) {
-                    id = '0' + id; // padding
-                }
-                id = "0x" + id;
-                return id;
+                return getIdAsString(l);
             }
+
         }
         
         if (v instanceof Set) {
@@ -729,6 +773,31 @@
         }
         
         return v.toString();
+    }
+    
+    protected Class<?> convertReturnType(Class<?> opReturnType) {
+        if (IoFuture.class.isAssignableFrom(opReturnType)) {
+            return void.class;
+        }
+        if (opReturnType == void.class || opReturnType == Void.class) {
+            return void.class;
+        }
+    
+        return convertAttributeType("", opReturnType);
+    }
+
+    protected Object convertReturnValue(Object value) {
+        return convertAttributeValue("", value);
+    }
+
+    private String getIdAsString(long l) {
+        // ID in MINA is a unsigned 32-bit integer.
+        String id = Long.toHexString(l).toUpperCase();
+        while (id.length() < 8) {
+            id = '0' + id; // padding
+        }
+        id = "0x" + id;
+        return id;
     }
     
     private Object convertCollection(Object src, Collection<Object> dst) {

Modified: mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java
URL: http://svn.apache.org/viewvc/mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java?rev=598132&r1=598131&r2=598132&view=diff
==============================================================================
--- mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java (original)
+++ mina/trunk/integration-jmx/src/main/java/org/apache/mina/integration/jmx/Foo.java Sun Nov 25 21:26:03 2007
@@ -8,27 +8,13 @@
 
 import org.apache.mina.common.IoAcceptor;
 import org.apache.mina.common.IoHandlerAdapter;
-import org.apache.mina.common.IoSession;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 
 public class Foo {
     public static void main(String[] args) throws Exception {
         final MBeanServer server = MBeanServerFactory.findMBeanServer(null).get(0);
         IoAcceptor service = new NioSocketAcceptor();
-        service.setHandler(new IoHandlerAdapter() {
-            @Override
-            public void sessionOpened(IoSession session) throws Exception {
-                server.registerMBean(
-                        new DefaultModelMBean(session),
-                        new ObjectName("org.apache.mina:type=session,name=" + session.getId()));
-            }
-            
-            @Override
-            public void sessionClosed(IoSession session) throws Exception {
-                server.unregisterMBean(new ObjectName(
-                        "org.apache.mina:type=session,name=" + session.getId()));
-            }
-        });
+        service.setHandler(new IoHandlerAdapter());
         service.setLocalAddress(new InetSocketAddress(8080));
         service.bind();