package org.nuxeo.ecm.core.management.jtajca;
import java.util.Set;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.transaction.TransactionManager;
import org.nuxeo.ecm.core.storage.sql.DatabaseHelper;
import org.nuxeo.ecm.core.storage.sql.IgnoreNonPooledCondition;
import org.nuxeo.ecm.core.test.CoreFeature;
import org.nuxeo.ecm.core.test.TransactionalFeature;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.jtajca.NuxeoContainer;
import org.nuxeo.runtime.management.ServerLocator;
import org.nuxeo.runtime.test.runner.ConditionalIgnoreRule;
import org.nuxeo.runtime.test.runner.Deploy;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.LocalDeploy;
import org.nuxeo.runtime.test.runner.SimpleFeature;
import com.google.inject.Binder;
import com.google.inject.name.Names;
@Features({ TransactionalFeature.class, CoreFeature.class })
@Deploy({ "org.nuxeo.runtime.metrics", "org.nuxeo.runtime.datasource",
"org.nuxeo.ecm.core.management.jtajca" })
@LocalDeploy({"org.nuxeo.ecm.core.management.jtajca:login-config.xml","org.nuxeo.ecm.core.management.jtajca:ds-contrib.xml"})
@ConditionalIgnoreRule.Ignore(condition=IgnoreNonPooledCondition.class)
public class JtajcaManagementFeature extends SimpleFeature {
protected ObjectName nameOf(Class<?> itf) {
try {
return new ObjectName(Defaults.instance.name(itf, "*"));
} catch (MalformedObjectNameException cause) {
throw new AssertionError("Cannot name monitor", cause);
}
}
protected <T> void bind(Binder binder, MBeanServer mbs, Class<T> type) {
final Set<ObjectName> names = mbs.queryNames(nameOf(type), null);
for (ObjectName name : names) {
T instance = type.cast(JMX.newMXBeanProxy(mbs, name, type));
binder.bind(type).annotatedWith(
Names.named(name.getKeyProperty("name"))).toInstance(
instance);
}
}
@Override
public void configure(FeaturesRunner runner, Binder binder) {
// bind repository
NuxeoContainer.getConnectionManager(DatabaseHelper.DATABASE.repositoryName);
MBeanServer mbs = Framework.getLocalService(ServerLocator.class).lookupServer();
bind(binder, mbs, ConnectionPoolMonitor.class);
bind(binder, mbs, CoreSessionMonitor.class);
TransactionManager tm = NuxeoContainer.getTransactionManager();
if (tm != null) {
bind(binder, mbs, TransactionMonitor.class);
binder.bind(TransactionManager.class).toInstance(tm);
}
}
}