From def52e49bbe42647ed49f87c98b8186196f9ad43 Mon Sep 17 00:00:00 2001 From: Piotr Findeisen Date: Tue, 30 Dec 2025 16:46:49 +0100 Subject: [PATCH 1/3] Remove unused unreachable MBeanExporter constructor --- src/main/java/org/weakref/jmx/MBeanExporter.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/weakref/jmx/MBeanExporter.java b/src/main/java/org/weakref/jmx/MBeanExporter.java index 7ef0aad..b213ee6 100644 --- a/src/main/java/org/weakref/jmx/MBeanExporter.java +++ b/src/main/java/org/weakref/jmx/MBeanExporter.java @@ -47,11 +47,6 @@ public class MBeanExporter private final ObjectNameGenerator objectNameGenerator; private final Map exportedManagedClasses = new ConcurrentHashMap<>(); - MBeanExporter() - { - this(ManagementFactory.getPlatformMBeanServer()); - } - public MBeanExporter(MBeanServer server) { this(server, Optional.empty()); From 9cdbb3ae247f3fa7295f07f3960c0d6123081af5 Mon Sep 17 00:00:00 2001 From: Piotr Findeisen Date: Tue, 30 Dec 2025 16:44:50 +0100 Subject: [PATCH 2/3] Disallow MBeanModule subclassing It was deprecated since bd231bf9e4f33a94d329e9a500430097432015bf commit, i.e. for over decade. --- .../jmx/guice/AnnotatedExportBuilder.java | 41 --------- .../org/weakref/jmx/guice/ExportBuilder.java | 25 ----- .../org/weakref/jmx/guice/MBeanModule.java | 61 +------------ .../jmx/guice/NamedBindingBuilder.java | 67 -------------- .../jmx/guice/TestModuleSubclassing.java | 91 ------------------- 5 files changed, 2 insertions(+), 283 deletions(-) delete mode 100644 src/main/java/org/weakref/jmx/guice/AnnotatedExportBuilder.java delete mode 100644 src/main/java/org/weakref/jmx/guice/ExportBuilder.java delete mode 100644 src/main/java/org/weakref/jmx/guice/NamedBindingBuilder.java delete mode 100644 src/test/java/org/weakref/jmx/guice/TestModuleSubclassing.java diff --git a/src/main/java/org/weakref/jmx/guice/AnnotatedExportBuilder.java b/src/main/java/org/weakref/jmx/guice/AnnotatedExportBuilder.java deleted file mode 100644 index cd3a507..0000000 --- a/src/main/java/org/weakref/jmx/guice/AnnotatedExportBuilder.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright 2009 Martin Traverso - * - * Licensed 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.weakref.jmx.guice; - -import com.google.inject.Key; -import com.google.inject.multibindings.Multibinder; - -import java.lang.annotation.Annotation; - -@Deprecated -public class AnnotatedExportBuilder - extends NamedBindingBuilder -{ - AnnotatedExportBuilder(Multibinder binder, Key key) - { - super(binder, key); - } - - public NamedBindingBuilder annotatedWith(Annotation annotation) - { - return new NamedBindingBuilder(binder, Key.get(key.getTypeLiteral(), annotation)); - } - - public NamedBindingBuilder annotatedWith(Class annotationClass) - { - return new NamedBindingBuilder(binder, Key.get(key.getTypeLiteral(), annotationClass)); - } -} diff --git a/src/main/java/org/weakref/jmx/guice/ExportBuilder.java b/src/main/java/org/weakref/jmx/guice/ExportBuilder.java deleted file mode 100644 index 0efbed7..0000000 --- a/src/main/java/org/weakref/jmx/guice/ExportBuilder.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.weakref.jmx.guice; - -import com.google.inject.Key; -import com.google.inject.multibindings.Multibinder; - -@Deprecated -public class ExportBuilder -{ - private final Multibinder binder; - - ExportBuilder(Multibinder binder) - { - this.binder = binder; - } - - public AnnotatedExportBuilder export(Class clazz) - { - return new AnnotatedExportBuilder(binder, Key.get(clazz)); - } - - public NamedBindingBuilder export(Key key) - { - return new NamedBindingBuilder(binder, key); - } -} diff --git a/src/main/java/org/weakref/jmx/guice/MBeanModule.java b/src/main/java/org/weakref/jmx/guice/MBeanModule.java index ddb0c48..8e6f1df 100644 --- a/src/main/java/org/weakref/jmx/guice/MBeanModule.java +++ b/src/main/java/org/weakref/jmx/guice/MBeanModule.java @@ -16,8 +16,6 @@ package org.weakref.jmx.guice; import com.google.inject.AbstractModule; -import com.google.inject.Binder; -import com.google.inject.Key; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; import org.weakref.jmx.MBeanExporter; @@ -26,72 +24,17 @@ import static com.google.inject.multibindings.Multibinder.newSetBinder; import static com.google.inject.multibindings.OptionalBinder.newOptionalBinder; -public class MBeanModule +public final class MBeanModule extends AbstractModule { - private ExportBuilder builder; - @Override - protected final void configure() + protected void configure() { - builder = newExporter(binder()); - bind(GuiceMBeanExporter.class).asEagerSingleton(); bind(MBeanExporter.class).in(Scopes.SINGLETON); newOptionalBinder(binder(), ObjectNameGenerator.class); newSetBinder(binder(), new TypeLiteral>() {}); newSetBinder(binder(), new TypeLiteral>() {}); - - configureMBeans(); - } - - /** - * To be overridden by subclasses. E.g., - * - * protected void configureMBeans() { - * export(ManagedObject.class).as("test:name=X"); - * export(ManagedObject.class).annotatedWith(SomeAnnotation.class).as("test:name=Y"); - * } - * - * When ExportBuilder is used, a raw MBeanModule can be imported to trigger the - * registration of exported mbeans: - * - *
-     * {@code
-     * Injector injector = Guice.createInjector(new MBeanModule(),
-     *      new AbstractModule() {
-     *          @Override
-     *          protected void configure() {
-     *              ExportBuilder builder = MBeanModule.newExporter();
-     *              builder.export(AnotherManagedObject.class).as("test:name="Z");
-     *          }
-     *      });
-     * }
-     * 
- * - * @deprecated subclassing no longer supported. Use ExportBinder instead - */ - @Deprecated - protected void configureMBeans() { - } - - @Deprecated - protected NamedBindingBuilder export(Key key) - { - return builder.export(key); } - - @Deprecated - protected AnnotatedExportBuilder export(Class clazz) - { - return builder.export(clazz); - } - - @Deprecated - public static ExportBuilder newExporter(Binder binder) - { - return new ExportBuilder(newSetBinder(binder, Mapping.class)); - } - } diff --git a/src/main/java/org/weakref/jmx/guice/NamedBindingBuilder.java b/src/main/java/org/weakref/jmx/guice/NamedBindingBuilder.java deleted file mode 100644 index 1eed531..0000000 --- a/src/main/java/org/weakref/jmx/guice/NamedBindingBuilder.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright 2009 Martin Traverso - * - * Licensed 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.weakref.jmx.guice; - -import com.google.inject.Key; -import com.google.inject.multibindings.Multibinder; -import com.google.inject.name.Named; -import org.weakref.jmx.ObjectNameGenerator; - -import java.util.function.Function; - -@Deprecated -public class NamedBindingBuilder -{ - protected final Multibinder binder; - protected final Key key; - - NamedBindingBuilder(Multibinder binder, Key key) - { - this.binder = binder; - this.key = key; - } - - /** - * Names the MBean according to {@link org.weakref.jmx.ObjectNames} name generator methods. - */ - public void withGeneratedName() - { - if (key.getAnnotation() != null) { - if (key.getAnnotation() instanceof Named annotation) { - as(factory -> factory.generatedNameOf(key.getTypeLiteral().getRawType(), annotation.value())); - } - else { - as(factory -> factory.generatedNameOf(key.getTypeLiteral().getRawType(), key.getAnnotation().annotationType().getSimpleName())); - } - } - else if (key.getAnnotationType() != null) { - as(factory -> factory.generatedNameOf(key.getTypeLiteral().getRawType(), key.getAnnotationType().getSimpleName())); - } - else { - as(factory -> factory.generatedNameOf(key.getTypeLiteral().getRawType())); - } - } - - public void as(String name) - { - as(factory -> name); - } - - private void as(Function mappingNameFactory) - { - binder.addBinding().toInstance(new Mapping(mappingNameFactory, key)); - } -} diff --git a/src/test/java/org/weakref/jmx/guice/TestModuleSubclassing.java b/src/test/java/org/weakref/jmx/guice/TestModuleSubclassing.java deleted file mode 100644 index ec2e168..0000000 --- a/src/test/java/org/weakref/jmx/guice/TestModuleSubclassing.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright 2009 Martin Traverso - * - * Licensed 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.weakref.jmx.guice; - -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Key; -import com.google.inject.Module; -import com.google.inject.Stage; -import com.google.inject.name.Named; -import com.google.inject.name.Names; -import org.testng.Assert; -import org.testng.annotations.Test; -import org.weakref.jmx.Managed; -import org.weakref.jmx.testing.TestingMBeanServer; - -import javax.management.MBeanServer; -import javax.management.ObjectName; - -public class TestModuleSubclassing -{ - @Test - public void testSubclassing() - throws Exception - { - final Named name1 = Names.named("bean1"); - final Named name2 = Names.named("bean2"); - - final TestingMBeanServer tms = new TestingMBeanServer(); - - final Module m1 = new MBeanModule() { - @Override - protected void configureMBeans() { - export(Key.get(Bean.class, name1)).as("bean1:name=bean1"); - } - }; - - final Module m2 = new MBeanModule() { - @Override - protected void configureMBeans() { - export(Key.get(Bean.class, name2)).as("bean2:name=bean2"); - } - }; - - Guice.createInjector(Stage.PRODUCTION, - m1, - m2, - new AbstractModule() { - @Override - public void configure() { - bind(MBeanServer.class).toInstance(tms); - bind(Bean.class).annotatedWith(name1).toInstance(new Bean("name1")); - bind(Bean.class).annotatedWith(name2).toInstance(new Bean("name2")); - } - }); - - Assert.assertEquals(2, tms.getMBeanCount().intValue()); - Assert.assertNotNull(tms.getMBeanInfo(new ObjectName("bean1:name=bean1"))); - Assert.assertNotNull(tms.getMBeanInfo(new ObjectName("bean2:name=bean2"))); - } - - public static final class Bean - { - private final String name; - - Bean(final String name) - { - this.name = name; - } - - @Managed - public String getName() - { - return name; - } - } -} - From 987ca6f914997a4bd19834e80ee701306385c48f Mon Sep 17 00:00:00 2001 From: Piotr Findeisen Date: Tue, 30 Dec 2025 17:25:30 +0100 Subject: [PATCH 3/3] Fix MBeanModule init when nothing exported --- .../java/org/weakref/jmx/guice/MBeanModule.java | 1 + .../org/weakref/jmx/guice/TestMBeanModule.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/org/weakref/jmx/guice/MBeanModule.java b/src/main/java/org/weakref/jmx/guice/MBeanModule.java index 8e6f1df..d60fc04 100644 --- a/src/main/java/org/weakref/jmx/guice/MBeanModule.java +++ b/src/main/java/org/weakref/jmx/guice/MBeanModule.java @@ -34,6 +34,7 @@ protected void configure() bind(MBeanExporter.class).in(Scopes.SINGLETON); newOptionalBinder(binder(), ObjectNameGenerator.class); + newSetBinder(binder(), new TypeLiteral() {}); newSetBinder(binder(), new TypeLiteral>() {}); newSetBinder(binder(), new TypeLiteral>() {}); } diff --git a/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java b/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java index 2d6b9cf..0ee8bfe 100644 --- a/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java +++ b/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java @@ -23,6 +23,7 @@ import com.google.inject.multibindings.Multibinder; import org.testng.Assert; import org.testng.annotations.Test; +import org.weakref.jmx.MBeanExporter; import org.weakref.jmx.ObjectNameBuilder; import org.weakref.jmx.ObjectNameGenerator; import org.weakref.jmx.SimpleObject; @@ -268,6 +269,19 @@ protected void configure() server.unregisterMBean(objectName2); } + @Test + public void testNothingExported() + { + Injector injector = Guice.createInjector( + new MBeanModule(), + binder -> { + binder.requireExplicitBindings(); + binder.disableCircularProxies(); + binder.bind(MBeanServer.class).toInstance(ManagementFactory.getPlatformMBeanServer()); + }); + injector.getInstance(MBeanExporter.class); + } + @Test public void testSet() throws Exception