package ru.vyarus.dropwizard.guice.module.installer.internal; import com.google.common.base.Stopwatch; import com.google.inject.Inject; import com.google.inject.Injector; import io.dropwizard.setup.Environment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller; import ru.vyarus.dropwizard.guice.module.installer.install.InstanceInstaller; import ru.vyarus.dropwizard.guice.module.installer.install.JerseyInstaller; import ru.vyarus.dropwizard.guice.module.installer.install.TypeInstaller; import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils; import java.util.List; import static ru.vyarus.dropwizard.guice.module.context.stat.Stat.ExtensionsInstallationTime; /** * Installs all extensions found during classpath scanning. * * @author Vyacheslav Rusakov * @since 01.09.2014 */ public class FeatureInstallerExecutor { private final Logger logger = LoggerFactory.getLogger(FeatureInstallerExecutor.class); private final ExtensionsHolder holder; private final Environment environment; private final Injector injector; @Inject public FeatureInstallerExecutor( final ExtensionsHolder holder, final Environment environment, final Injector injector) { this.holder = holder; this.environment = environment; this.injector = injector; installFeatures(); } @SuppressWarnings("unchecked") private void installFeatures() { final Stopwatch timer = holder.stat().timer(ExtensionsInstallationTime); holder.order(); for (FeatureInstaller installer : holder.getInstallers()) { final List<Class<?>> res = holder.getExtensions(installer.getClass()); if (res != null) { for (Class inst : res) { if (installer instanceof TypeInstaller) { ((TypeInstaller) installer).install(environment, inst); } if (installer instanceof InstanceInstaller) { ((InstanceInstaller) installer).install(environment, injector.getInstance(inst)); } logger.trace("{} extension installed: {}", FeatureUtils.getInstallerExtName(installer.getClass()), inst.getName()); } } if (!(installer instanceof JerseyInstaller)) { // jersey installers reporting occurs after jersey context start installer.report(); } } timer.stop(); } }