From f8034a7df752191442a2d0c07a641299704625a5 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Tue, 9 Dec 2025 15:37:48 +0100 Subject: [PATCH] Add generatedNameOf accepting package name and class name This is useful for scenarios when class was renamed and we want to use a fixed string for backward compatibility. Added tests for ObjectNameGenerator usage --- .../org/weakref/jmx/ObjectNameGenerator.java | 29 +++++++++++- .../weakref/jmx/guice/TestMBeanModule.java | 44 ++++++++++++++++++- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/weakref/jmx/ObjectNameGenerator.java b/src/main/java/org/weakref/jmx/ObjectNameGenerator.java index aa951ea..2a80987 100644 --- a/src/main/java/org/weakref/jmx/ObjectNameGenerator.java +++ b/src/main/java/org/weakref/jmx/ObjectNameGenerator.java @@ -8,7 +8,7 @@ public interface ObjectNameGenerator { static ObjectNameGenerator defaultObjectNameGenerator() { - return (type, properties) -> new ObjectNameBuilder(type.getPackage().getName()) + return (domain, properties) -> new ObjectNameBuilder(domain) .withProperties(properties) .build(); } @@ -26,5 +26,30 @@ default String generatedNameOf(Class type, String name) .build()); } - String generatedNameOf(Class type, Map properties); + default String generatedNameOf(String packageName, String className) + { + return generatedNameOf(packageName, ImmutableMap.of("name", className)); + } + + default String generatedNameOf(String packageName, String className, String name) + { + return generatedNameOf(packageName, ImmutableMap.of("name", className, "type", name)); + } + + default String generatedNameOf(Package pkg, String className, String name) + { + return generatedNameOf(pkg.getName(), ImmutableMap.of("name", className, "type", name)); + } + + default String generatedNameOf(Package pkg, String className) + { + return generatedNameOf(pkg.getName(), ImmutableMap.of("name", className)); + } + + default String generatedNameOf(Class type, Map properties) + { + return generatedNameOf(type.getPackage().getName(), properties); + } + + String generatedNameOf(String domain, Map properties); } diff --git a/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java b/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java index 2d6b9cf..9abba45 100644 --- a/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java +++ b/src/test/java/org/weakref/jmx/guice/TestMBeanModule.java @@ -291,6 +291,48 @@ public void testCustomSet() binder -> binder.bind(ObjectNameGenerator.class).to(TestObjectNameGenerator.class)); } + @Test + public void testCustomNaming() + throws Exception + { + Injector injector = Guice.createInjector(PRODUCTION, new MBeanModule(), new AbstractModule() + { + @Override + protected void configure() + { + binder().requireExplicitBindings(); + binder().disableCircularProxies(); + + bind(SimpleObject.class).annotatedWith(named("1")).toInstance(new SimpleObject()); + bind(SimpleObject.class).annotatedWith(named("2")).toInstance(new SimpleObject()); + bind(SimpleObject.class).annotatedWith(named("3")).toInstance(new SimpleObject()); + + bind(MBeanServer.class).toInstance(ManagementFactory.getPlatformMBeanServer()); + ExportBinder.newExporter(binder()).export(Key.get(SimpleObject.class, named("1"))) + .as(generator -> generator.generatedNameOf("org.example", "LegacyObject")); + + ExportBinder.newExporter(binder()).export(Key.get(SimpleObject.class, named("2"))) + .as(generator -> generator.generatedNameOf(SimpleObject.class)); + + ExportBinder.newExporter(binder()).export(Key.get(SimpleObject.class, named("3"))) + .as(generator -> generator.generatedNameOf(TestMBeanModule.class.getPackage(), "AnotherObject")); + } + }); + + ObjectName name1 = new ObjectName("org.example", "name", "LegacyObject"); + ObjectName name2 = new ObjectName(generatedNameOf(SimpleObject.class)); + ObjectName name3 = new ObjectName("org.weakref.jmx.guice", "name", "AnotherObject"); + + MBeanServer server = injector.getInstance(MBeanServer.class); + Assert.assertNotNull(server.getMBeanInfo(name1)); + Assert.assertNotNull(server.getMBeanInfo(name2)); + Assert.assertNotNull(server.getMBeanInfo(name3)); + + server.unregisterMBean(name1); + server.unregisterMBean(name2); + server.unregisterMBean(name3); + } + private static void assertSet(ObjectName name1, ObjectName name2, Module additionalBindings) throws InstanceNotFoundException, IntrospectionException, ReflectionException, MBeanRegistrationException { @@ -330,7 +372,7 @@ public static final class TestObjectNameGenerator implements ObjectNameGenerator { @Override - public String generatedNameOf(Class type, Map properties) + public String generatedNameOf(String packageName, Map properties) { return new ObjectNameBuilder("test") .withProperties(properties)