Skip to content

Commit

Permalink
MBeanModule.newExporter() to ease exporting inside other modules.
Browse files Browse the repository at this point in the history
Returns ExportBuilder() that wraps a Multibinder<Mapping>.

This is to avoid problems where you install() a 
MBeanModule inside another module that doesn't bind
MBeanServer; MBeanModule implicitly requires a bound
MBeanServer.
  • Loading branch information
arosien committed Dec 3, 2009
1 parent 09300e2 commit d18ef9a
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 12 deletions.
3 changes: 3 additions & 0 deletions .gitignore
@@ -1,3 +1,6 @@
/target
/*.iws
/test-output
.classpath
.project
.settings
28 changes: 20 additions & 8 deletions README.md
Expand Up @@ -28,14 +28,26 @@
# Guice support

Injector injector = Guice.createInjector(
new MBeanModule() {
@Override
protected void configureMBeans()
{
export(ManagedObject.class).as("test:name=X");
export(ManagedObject.class).annotatedWith(SomeAnnotation.class).as("test:name=Y");
}
}, ...);
new MBeanModule() {
@Override
protected void configureMBeans()
{
export(ManagedObject.class).as("test:name=X");
export(ManagedObject.class).annotatedWith(SomeAnnotation.class).as("test:name=Y");
}
}, new AbstractModule() {
@Override
protected void configure() {
/*
* You don't want to install() a MBeanModule in another module
* because you'll get binding errors; MBeanModule requires you
* to bind a MBeanServer outside of it. Use the ExportBuilder
* in this case.
*/
ExportBuilder builder = MBeanModule.newExporter();
builder.export(AnotherManagedObject.class).as("test:name="X");
}
}, ...);

# License

Expand Down
15 changes: 15 additions & 0 deletions src/main/java/org/weakref/jmx/guice/ExportBuilder.java
@@ -0,0 +1,15 @@
package org.weakref.jmx.guice;

import com.google.inject.multibindings.Multibinder;

public class ExportBuilder {
private final Multibinder<Mapping> binder;

ExportBuilder(Multibinder<Mapping> binder) {
this.binder = binder;
}

public AnnotatedExportBuilder export(Class<?> clazz) {
return new AnnotatedExportBuilder(binder, clazz);
}
}
15 changes: 11 additions & 4 deletions src/main/java/org/weakref/jmx/guice/MBeanModule.java
Expand Up @@ -15,18 +15,20 @@
*/
package org.weakref.jmx.guice;

import static com.google.inject.multibindings.Multibinder.newSetBinder;

import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.Binder;

public abstract class MBeanModule
extends AbstractModule
{
private Multibinder<Mapping> binder;
private ExportBuilder builder;

@Override
protected final void configure()
{
binder = Multibinder.newSetBinder(binder(), Mapping.class);
builder = newExporter(binder());

install(new InternalMBeanModule());
configureMBeans();
Expand All @@ -36,7 +38,12 @@ protected final void configure()

protected AnnotatedExportBuilder export(Class<?> clazz)
{
return new AnnotatedExportBuilder(binder, clazz);
return builder.export(clazz);
}

public static ExportBuilder newExporter(Binder binder)
{
return new ExportBuilder(newSetBinder(binder, Mapping.class));
}

}
41 changes: 41 additions & 0 deletions src/test/java/org/weakref/jmx/guice/TestMBeanModule.java
Expand Up @@ -20,7 +20,10 @@
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Stage;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
import org.weakref.jmx.SimpleObject;
import org.weakref.jmx.Util;
Expand Down Expand Up @@ -206,4 +209,42 @@ protected void configureMBeans()
server.unregisterMBean(objectName1);
server.unregisterMBean(objectName2);
}

@Test
public void testExportBuilder()
throws IntrospectionException, InstanceNotFoundException, ReflectionException, MBeanRegistrationException
{
final ObjectName objectName1 = Util.getUniqueObjectName();
final ObjectName objectName2 = Util.getUniqueObjectName();

Injector injector = Guice.createInjector(PRODUCTION, new MBeanModule() {
@Override
protected void configureMBeans() {

}}, new AbstractModule()
{
@Override
protected void configure() {
bind(MBeanServer.class).toInstance(ManagementFactory.getPlatformMBeanServer());
bind(SimpleObject.class).annotatedWith(Names.named("1")).toInstance(new SimpleObject());
bind(SimpleObject.class).annotatedWith(Names.named("2")).toInstance(new SimpleObject());

ExportBuilder exporter = MBeanModule.newExporter(binder());
exporter.export(SimpleObject.class)
.annotatedWith(Names.named("1"))
.as(objectName1.getCanonicalName());
exporter.export(SimpleObject.class)
.annotatedWith(Names.named("2"))
.as(objectName2.getCanonicalName());
}
});

MBeanServer server = injector.getInstance(MBeanServer.class);

Assert.assertNotNull(server.getMBeanInfo(objectName1));
Assert.assertNotNull(server.getMBeanInfo(objectName2));

server.unregisterMBean(objectName1);
server.unregisterMBean(objectName2);
}
}

0 comments on commit d18ef9a

Please sign in to comment.