com.github.dxee.dject.metrics.ProvisionMetricsModule Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dject-core Show documentation
Show all versions of dject-core Show documentation
A collection of guice extensions, help to improve the developer experience of guice.
package com.github.dxee.dject.metrics;
import com.github.dxee.dject.lifecycle.LifecycleListener;
import com.google.inject.AbstractModule;
import com.google.inject.Key;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.matcher.Matchers;
import com.google.inject.spi.ProvisionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
public final class ProvisionMetricsModule extends AbstractModule {
private static final Logger LOGGER = LoggerFactory.getLogger(ProvisionMetricsModule.class);
@Singleton
private static class MetricsProvisionListener implements ProvisionListener, LifecycleListener {
private ProvisionMetrics metrics;
private boolean doneLoading = false;
@Inject
public static void initialize(MetricsProvisionListener listener, ProvisionMetrics metrics) {
listener.metrics = metrics;
}
@Override
public void onProvision(ProvisionInvocation provision) {
final Key key = provision.getBinding().getKey();
if (metrics == null) {
LOGGER.debug("LifecycleProvisionListener not initialized yet : {} source={}",
key, provision.getBinding().getSource());
return;
}
if (doneLoading) {
return;
}
// Instantiate the type and pass to the metrics. This time captured will
// include invoking any lifecycle events.
metrics.push(key);
try {
provision.provision();
} finally {
metrics.pop();
}
}
@Override
public void onStarted() {
doneLoading = true;
}
@Override
public void onStopped(Throwable error) {
doneLoading = true;
}
}
private MetricsProvisionListener listener = new MetricsProvisionListener();
@Override
protected void configure() {
bindListener(Matchers.any(), listener);
requestStaticInjection(MetricsProvisionListener.class);
}
@Provides
@Singleton
MetricsProvisionListener getMetricsProvisionListener() {
return listener;
}
@Override
public int hashCode() {
return getClass().hashCode();
}
@Override
public boolean equals(Object obj) {
return getClass().equals(obj.getClass());
}
@Override
public String toString() {
return "ProvisionMetricsModule[]";
}
}