All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dxee.dject.metrics.ProvisionMetricsModule Maven / Gradle / Ivy

Go to download

A collection of guice extensions, help to improve the developer experience of guice.

There is a newer version: 1.5.1
Show newest version
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[]";
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy