package ru.vyarus.dropwizard.guice.module.jersey.hk2;
import com.google.inject.Injector;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import ru.vyarus.dropwizard.guice.module.context.stat.StatsTracker;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.JerseyInstaller;
import ru.vyarus.dropwizard.guice.module.installer.internal.ExtensionsHolder;
import java.util.List;
import static ru.vyarus.dropwizard.guice.module.context.stat.Stat.JerseyInstallerTime;
/**
* Hk2 module, which must be registered before hk context start (to properly bind resources).
* Registers all juice extensions into hk2 context as factory, which delegates to guice provider.
* Such bridging is required to delegate objects creation to guice and properly use guice scopes.
* <p>If jersey extension is already a factory (like
* {@link org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory}), then factory will
* be registered directly.</p>
*
* @author Vyacheslav Rusakov
* @see ru.vyarus.dropwizard.guice.module.installer.install.JerseyInstaller
* @since 16.11.2014
*/
public class InstallerBinder extends AbstractBinder {
private final Injector injector;
private final StatsTracker tracker;
public InstallerBinder(final Injector injector, final StatsTracker tracker) {
this.injector = injector;
this.tracker = tracker;
}
@Override
@SuppressWarnings("unchecked")
protected void configure() {
tracker.startHkTimer(JerseyInstallerTime);
final ExtensionsHolder holder = injector.getInstance(ExtensionsHolder.class);
for (FeatureInstaller installer : holder.getInstallers()) {
if (installer instanceof JerseyInstaller) {
final List<Class<?>> features = holder.getExtensions(installer.getClass());
if (features != null) {
for (Class<?> type : features) {
((JerseyInstaller) installer).install(this, injector, type);
}
}
installer.report();
}
}
tracker.stopHkTimer(JerseyInstallerTime);
}
}