You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by jo...@apache.org on 2016/07/22 11:05:05 UTC
deltaspike git commit: DELTASPIKE-1185 Allow customization (name,
description) of JMX managed methods' parameters
Repository: deltaspike
Updated Branches:
refs/heads/master 234ab7370 -> 40d24ab50
DELTASPIKE-1185 Allow customization (name, description) of JMX managed
methods' parameters
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/40d24ab5
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/40d24ab5
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/40d24ab5
Branch: refs/heads/master
Commit: 40d24ab50ad1660390d9b06bc5c6ac5cabd84329
Parents: 234ab73
Author: Xavier Dury <ka...@hotmail.com>
Authored: Wed Jul 20 15:49:27 2016 +0200
Committer: Xavier Dury <ka...@hotmail.com>
Committed: Fri Jul 22 10:04:07 2016 +0200
----------------------------------------------------------------------
.../deltaspike/core/api/jmx/JmxParameter.java | 45 ++++++++++
.../deltaspike/core/util/ParameterUtil.java | 76 +++++++++++++++++
.../deltaspike/core/util/ParameterUtilTest.java | 46 +++++++++++
.../core/impl/jmx/DynamicMBeanWrapper.java | 86 +++++++++++++++-----
.../deltaspike/test/core/impl/jmx/MyMBean.java | 3 +-
.../core/impl/jmx/SimpleRegistrationTest.java | 4 +
6 files changed, 237 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/40d24ab5/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/jmx/JmxParameter.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/jmx/JmxParameter.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/jmx/JmxParameter.java
new file mode 100644
index 0000000..83fc30c
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/jmx/JmxParameter.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.deltaspike.core.api.jmx;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * Describes a parameter of a JMX operation.
+ */
+@Retention(RUNTIME)
+@Target(PARAMETER)
+@Documented
+public @interface JmxParameter
+{
+ /**
+ * @return the description of the parameter.
+ */
+ String description() default "";
+
+ /**
+ * @return the name of the parameter.
+ */
+ String name() default "";
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/40d24ab5/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ParameterUtil.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ParameterUtil.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ParameterUtil.java
new file mode 100644
index 0000000..2346cc5
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ParameterUtil.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.core.util;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import javax.enterprise.inject.Typed;
+
+@Typed()
+public abstract class ParameterUtil
+{
+ private static boolean parameterSupported = true;
+ private static Class<?> parameterClass;
+ private static Method getNameMethod;
+ private static Method getParametersMethod;
+
+ static
+ {
+ try
+ {
+ parameterClass = Class.forName("java.lang.reflect.Parameter");
+ getNameMethod = parameterClass.getMethod("getName");
+ getParametersMethod = Method.class.getMethod("getParameters");
+ }
+ catch (Exception e)
+ {
+ parameterSupported = false;
+ parameterClass = null;
+ getNameMethod = null;
+ getParametersMethod = null;
+ }
+ }
+
+ public static boolean isParameterSupported()
+ {
+ return parameterSupported;
+ }
+
+ public static String getName(Method method, int parameterIndex)
+ {
+ if (!isParameterSupported() || method == null)
+ {
+ return null;
+ }
+ try
+ {
+ Object[] parameters = (Object[]) getParametersMethod.invoke(method);
+ return (String) getNameMethod.invoke(parameters[parameterIndex]);
+ }
+ catch (IllegalAccessException e)
+ {
+ }
+ catch (InvocationTargetException e)
+ {
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/40d24ab5/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ParameterUtilTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ParameterUtilTest.java b/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ParameterUtilTest.java
new file mode 100644
index 0000000..b0d55c6
--- /dev/null
+++ b/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ParameterUtilTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.core.util;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+
+public class ParameterUtilTest
+{
+ @Before
+ public void isEnabled()
+ {
+ Assume.assumeTrue(ParameterUtil.isParameterSupported());
+ }
+
+ @Test
+ public void shouldReturnNameOrNull() throws Exception
+ {
+ Method method = getClass().getDeclaredMethod("someMethod", String.class);
+ String parameterName = ParameterUtil.getName(method, 0);
+ Assert.assertTrue(parameterName.equals("arg0") || parameterName.equals("firstParameter"));
+ }
+
+ public void someMethod(String firstParameter) {}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/40d24ab5/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/jmx/DynamicMBeanWrapper.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/jmx/DynamicMBeanWrapper.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/jmx/DynamicMBeanWrapper.java
index 1ff1365..09166d5 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/jmx/DynamicMBeanWrapper.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/jmx/DynamicMBeanWrapper.java
@@ -18,14 +18,19 @@
*/
package org.apache.deltaspike.core.impl.jmx;
-import org.apache.deltaspike.core.api.config.ConfigResolver;
-import org.apache.deltaspike.core.api.jmx.JmxBroadcaster;
-import org.apache.deltaspike.core.api.jmx.JmxManaged;
-import org.apache.deltaspike.core.api.jmx.MBean;
-import org.apache.deltaspike.core.api.jmx.NotificationInfo;
-import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
-import org.apache.deltaspike.core.api.provider.BeanProvider;
-import org.apache.deltaspike.core.util.ExceptionUtils;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
@@ -41,22 +46,21 @@ import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
+import javax.management.MBeanParameterInfo;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
import javax.management.ReflectionException;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.deltaspike.core.api.config.ConfigResolver;
+import org.apache.deltaspike.core.api.jmx.JmxBroadcaster;
+import org.apache.deltaspike.core.api.jmx.JmxManaged;
+import org.apache.deltaspike.core.api.jmx.JmxParameter;
+import org.apache.deltaspike.core.api.jmx.MBean;
+import org.apache.deltaspike.core.api.jmx.NotificationInfo;
+import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
+import org.apache.deltaspike.core.api.provider.BeanProvider;
+import org.apache.deltaspike.core.util.ExceptionUtils;
+import org.apache.deltaspike.core.util.ParameterUtil;
/**
* This class is the MBean implementation of a CDI bean.
@@ -134,8 +138,46 @@ public class DynamicMBeanWrapper extends NotificationBroadcasterSupport implemen
operations.put(method.getName(), method);
String operationDescr = getDescription(annotation.description(), method.getName());
+
+ Annotation[][] parametersAnnotations = method.getParameterAnnotations();
+ Class<?>[] parameterTypes = method.getParameterTypes();
+ MBeanParameterInfo[] parameterInfos = new MBeanParameterInfo[parameterTypes.length];
+ for (int i = 0; i < parametersAnnotations.length; i++)
+ {
+ String parameterDescription = null;
+ String parameterName = "p" + (i + 1);
+ String java8ParameterName = ParameterUtil.getName(method, i);
+ if (java8ParameterName != null)
+ {
+ parameterName = java8ParameterName;
+ }
+ for (int j = 0; j < parametersAnnotations[i].length; j++)
+ {
+ if (parametersAnnotations[i][j] instanceof JmxParameter)
+ {
+ JmxParameter jmxParameter = (JmxParameter) parametersAnnotations[i][j];
+ if (!"".equals(jmxParameter.name()))
+ {
+ parameterName = jmxParameter.name();
+ }
+ if (!"".equals(jmxParameter.description()))
+ {
+ parameterDescription = jmxParameter.description();
+ }
+ }
+ }
+ parameterInfos[i] = new MBeanParameterInfo(parameterName,
+ parameterTypes[i].getName(),
+ parameterDescription
+ );
+ }
- operationInfos.add(new MBeanOperationInfo(operationDescr, method));
+ operationInfos.add(new MBeanOperationInfo(method.getName(),
+ operationDescr,
+ parameterInfos,
+ method.getReturnType().getName(),
+ MBeanOperationInfo.UNKNOWN
+ ));
}
Class<?> clazz = annotatedMBean;
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/40d24ab5/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/MyMBean.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/MyMBean.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/MyMBean.java
index 7bf2112..a48f858 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/MyMBean.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/MyMBean.java
@@ -20,6 +20,7 @@ package org.apache.deltaspike.test.core.impl.jmx;
import org.apache.deltaspike.core.api.jmx.JmxBroadcaster;
import org.apache.deltaspike.core.api.jmx.JmxManaged;
+import org.apache.deltaspike.core.api.jmx.JmxParameter;
import org.apache.deltaspike.core.api.jmx.MBean;
import javax.enterprise.context.ApplicationScoped;
@@ -52,7 +53,7 @@ public class MyMBean
}
@JmxManaged(description = "multiply counter")
- public int multiply(final int n)
+ public int multiply(@JmxParameter(name = "multiplier", description = "the multiplier") final int n)
{
return counter * n;
}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/40d24ab5/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java
index db4005a..c999d4f 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/jmx/SimpleRegistrationTest.java
@@ -63,5 +63,9 @@ public abstract class SimpleRegistrationTest {
myMBean.broadcast();
assertEquals(1, notifications.size());
assertEquals(10L, notifications.iterator().next().getSequenceNumber());
+
+ MBeanParameterInfo parameterInfo = server.getMBeanInfo(on).getOperations()[0].getSignature()[0];
+ assertEquals("multiplier", parameterInfo.getName());
+ assertEquals("the multiplier", parameterInfo.getDescription());
}
}