From aa08c11976766ecb752302d651d79deb599d971d Mon Sep 17 00:00:00 2001 From: Rob Harrop Date: Wed, 16 Sep 2009 09:25:48 +0000 Subject: [PATCH] [SPR-5859] @ManagedOperation can now be used on getters/setters --- .../export/annotation/AnnotationJmxAttributeSource.java | 5 ----- .../assembler/AbstractReflectiveMBeanInfoAssembler.java | 4 +++- .../jmx/export/assembler/MetadataMBeanInfoAssembler.java | 8 ++++---- .../annotation/AnnotationMetadataAssemblerTests.java | 8 +++++++- .../jmx/export/annotation/AnnotationTestBean.java | 2 ++ .../jmx/export/annotation/AnnotationTestSubBean.java | 4 ++++ .../jmx/export/annotation/IAnnotationTestBean.java | 3 +++ 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/org.springframework.context/src/main/java/org/springframework/jmx/export/annotation/AnnotationJmxAttributeSource.java b/org.springframework.context/src/main/java/org/springframework/jmx/export/annotation/AnnotationJmxAttributeSource.java index 37859ee783..5b5675f781 100644 --- a/org.springframework.context/src/main/java/org/springframework/jmx/export/annotation/AnnotationJmxAttributeSource.java +++ b/org.springframework.context/src/main/java/org/springframework/jmx/export/annotation/AnnotationJmxAttributeSource.java @@ -87,11 +87,6 @@ public class AnnotationJmxAttributeSource implements JmxAttributeSource { } public ManagedOperation getManagedOperation(Method method) throws InvalidMetadataException { - PropertyDescriptor pd = BeanUtils.findPropertyForMethod(method); - if (pd != null) { - throw new InvalidMetadataException( - "The ManagedOperation attribute is not valid for JavaBean properties. Use ManagedAttribute instead."); - } Annotation ann = AnnotationUtils.findAnnotation(method, org.springframework.jmx.export.annotation.ManagedOperation.class); if (ann == null) { return null; diff --git a/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java b/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java index 10a7178b18..c19fbc9f57 100644 --- a/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java +++ b/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java @@ -355,7 +355,9 @@ public abstract class AbstractReflectiveMBeanInfoAssembler extends AbstractMBean info.setDescriptor(desc); } } - else if (includeOperation(method, beanKey)) { + + // allow getters and setters to be marked as operations directly + if (info == null && includeOperation(method, beanKey)) { info = createModelMBeanOperationInfo(method, method.getName(), beanKey); Descriptor desc = info.getDescriptor(); desc.setField(FIELD_ROLE, ROLE_OPERATION); diff --git a/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/MetadataMBeanInfoAssembler.java b/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/MetadataMBeanInfoAssembler.java index 91573d90d2..e65c478b29 100644 --- a/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/MetadataMBeanInfoAssembler.java +++ b/org.springframework.context/src/main/java/org/springframework/jmx/export/assembler/MetadataMBeanInfoAssembler.java @@ -156,11 +156,11 @@ public class MetadataMBeanInfoAssembler extends AbstractReflectiveMBeanInfoAssem protected boolean includeOperation(Method method, String beanKey) { PropertyDescriptor pd = BeanUtils.findPropertyForMethod(method); if (pd != null) { - return hasManagedAttribute(method); - } - else { - return hasManagedOperation(method); + if(hasManagedAttribute(method)) { + return true; + } } + return hasManagedOperation(method); } /** diff --git a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationMetadataAssemblerTests.java b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationMetadataAssemblerTests.java index e410880e59..e605f2e790 100644 --- a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationMetadataAssemblerTests.java +++ b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationMetadataAssemblerTests.java @@ -42,6 +42,12 @@ public class AnnotationMetadataAssemblerTests extends AbstractMetadataAssemblerT assertNotNull(op); } + public void testOperationOnGetter() throws Exception { + ModelMBeanInfo inf = getMBeanInfoFromAssembler(); + ModelMBeanOperationInfo op = inf.getOperation("getExpensiveToCalculate"); + assertNotNull(op); + } + protected JmxAttributeSource getAttributeSource() { return new AnnotationJmxAttributeSource(); } @@ -65,6 +71,6 @@ public class AnnotationMetadataAssemblerTests extends AbstractMetadataAssemblerT @Override protected int getExpectedOperationCount() { - return super.getExpectedOperationCount() + 3; + return super.getExpectedOperationCount() + 4; } } diff --git a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestBean.java b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestBean.java index 0b93f17e3b..1971dddc57 100644 --- a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestBean.java +++ b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestBean.java @@ -110,4 +110,6 @@ public class AnnotationTestBean implements IJmxTestBean { return 3; } + + } diff --git a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestSubBean.java b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestSubBean.java index 0768a96da3..8bfbc77ac0 100644 --- a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestSubBean.java +++ b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/AnnotationTestSubBean.java @@ -48,4 +48,8 @@ public class AnnotationTestSubBean extends AnnotationTestBean implements IAnnota public void fromInterface() { } + + public int getExpensiveToCalculate() { + return Integer.MAX_VALUE; + } } diff --git a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/IAnnotationTestBean.java b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/IAnnotationTestBean.java index 9afa121cd6..1774b38210 100644 --- a/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/IAnnotationTestBean.java +++ b/org.springframework.context/src/test/java/org/springframework/jmx/export/annotation/IAnnotationTestBean.java @@ -29,4 +29,7 @@ public interface IAnnotationTestBean { @ManagedOperation void fromInterface(); + + @ManagedOperation + int getExpensiveToCalculate(); }