package ru.vyarus.dropwizard.guice.module;
import com.google.common.collect.Sets;
import com.google.inject.Module;
import io.dropwizard.cli.Command;
import ru.vyarus.dropwizard.guice.module.context.ConfigItem;
import ru.vyarus.dropwizard.guice.module.context.ConfigurationInfo;
import ru.vyarus.dropwizard.guice.module.context.Filters;
import ru.vyarus.dropwizard.guice.module.context.info.ItemInfo;
import ru.vyarus.dropwizard.guice.module.context.info.impl.ExtensionItemInfoImpl;
import ru.vyarus.dropwizard.guice.module.context.option.OptionsInfo;
import ru.vyarus.dropwizard.guice.module.context.stat.StatsInfo;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.bundle.GuiceyBundle;
import ru.vyarus.dropwizard.guice.module.installer.internal.ExtensionsHolder;
import javax.inject.Inject;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* Public api for internal guicey configuration info ans startup statistics. Provides information about time spent
* for configurations and configuration details like registered bundle types,
* installers, extensions, disabled installers etc. Registered as guice bean and could be directly injected.
* <p>
* Could be used for configuration diagnostics or unit test checks.
*
* @author Vyacheslav Rusakov
* @since 21.06.2016
*/
public class GuiceyConfigurationInfo {
private final ConfigurationInfo context;
private final StatsInfo stats;
private final OptionsInfo options;
private final ExtensionsHolder holder;
@Inject
public GuiceyConfigurationInfo(final ConfigurationInfo context, final StatsInfo stats,
final OptionsInfo options, final ExtensionsHolder holder) {
this.context = context;
this.stats = stats;
this.options = options;
this.holder = holder;
}
/**
* Use to perform custom configuration items data lookups (e.g. for additional logging,
* diagnostics or consistency checks).
*
* @return raw configuration info object
*/
public ConfigurationInfo getData() {
return context;
}
/**
* Timers and counters collected at startup.
*
* @return startup statistics object
* @see ru.vyarus.dropwizard.guice.module.context.stat.Stat for available stats
*/
public StatsInfo getStats() {
return stats;
}
/**
* @return configuration options
* @see ru.vyarus.dropwizard.guice.module.context.option.Option for more info
* @see ru.vyarus.dropwizard.guice.GuiceyOptions for options example
*/
public OptionsInfo getOptions() {
return options;
}
/**
* NOTE: single item may be registered from multiple scopes! This method will return entity by all it's registered
* scopes and not just but by first registration. It makes it usable, for example, for configuration tree building.
* If you need exact registration scope use {@link Filters#registrationScope(Class)} filter.
*
* @param scope required scope
* @return all enabled items registered in specified scope or empty list
* @see ItemInfo#getRegisteredBy() for more info about scopes
*/
public List<Class<Object>> getItemsByScope(final Class<?> scope) {
return context.getItems(Filters.enabled().and(Filters.registeredBy(scope)));
}
/**
* @return all active scopes or empty collection
* @see ItemInfo#getRegisteredBy() for more info about scopes
*/
public Set<Class<?>> getActiveScopes() {
final Set<Class<?>> res = Sets.newHashSet();
context.getItems((it) -> {
res.addAll(it.getRegisteredBy());
return true;
});
return res;
}
// --------------------------------------------------------------------------- COMMANDS
/**
* @return types of all installed commands or empty list
* @see ru.vyarus.dropwizard.guice.GuiceBundle.Builder#searchCommands()
*/
public List<Class<Command>> getCommands() {
return context.getItems(ConfigItem.Command);
}
// --------------------------------------------------------------------------- BUNDLES
/**
* @return types of all installed bundles (including lookup bundles) or empty list
*/
public List<Class<GuiceyBundle>> getBundles() {
return context.getItems(ConfigItem.Bundle);
}
/**
* @return types of bundles resolved by bundle lookup mechanism or empty list
* @see ru.vyarus.dropwizard.guice.bundle.GuiceyBundleLookup
*/
public List<Class<GuiceyBundle>> getBundlesFromLookup() {
return context.getItems(ConfigItem.Bundle, Filters.lookupBundles());
}
/**
* @return types of bundles resolved from dropwizard bundles or empty list
* @see ru.vyarus.dropwizard.guice.GuiceBundle.Builder#configureFromDropwizardBundles()
*/
public List<Class<GuiceyBundle>> getBundlesFromDw() {
return context.getItems(ConfigItem.Bundle, Filters.dwBundles());
}
// --------------------------------------------------------------------------- MODULES
/**
* @return types of all registered guice modules or empty list
*/
public List<Class<Module>> getModules() {
return context.getItems(ConfigItem.Module);
}
// --------------------------------------------------------------------------- INSTALLERS
/**
* @return types of all registered installers (without disabled) or empty list
*/
public List<Class<FeatureInstaller>> getInstallers() {
return context.getItems(ConfigItem.Installer, Filters.enabled());
}
/**
* @return installer types, resolved by classpath scan (without disabled) or empty list
*/
public List<Class<FeatureInstaller>> getInstallersFromScan() {
return context.getItems(ConfigItem.Installer, Filters.enabled().and(Filters.fromScan()));
}
/**
* @return types of manually disabled installers or empty list
*/
public List<Class<FeatureInstaller>> getInstallersDisabled() {
return context.getItems(ConfigItem.Installer, Filters.enabled().negate());
}
/**
* Returned installers are ordered not by execution order
* (according to {@link ru.vyarus.dropwizard.guice.module.installer.order.Order} annotations).
*
* @return ordered list of installers or empty list
*/
@SuppressWarnings("unchecked")
public List<Class<FeatureInstaller>> getInstallersOrdered() {
return (List) holder.getInstallerTypes();
}
// --------------------------------------------------------------------------- EXTENSIONS
/**
* @return all registered extension types (including resolved with classpath scan) or empty list
*/
public List<Class<Object>> getExtensions() {
return context.getItems(ConfigItem.Extension);
}
/**
* @param installer installer type
* @return list of extensions installed by provided installer or empty list
*/
public List<Class<Object>> getExtensions(final Class<? extends FeatureInstaller> installer) {
return context.getItems(ConfigItem.Extension, Filters.installedBy(installer));
}
/**
* @return extension types, resolved by classpath scan or empty list
*/
public List<Class<Object>> getExtensionsFromScan() {
return context.getItems(ConfigItem.Extension, Filters.<ExtensionItemInfoImpl>fromScan());
}
/**
* Returned installers are ordered by execution order according to
* {@link ru.vyarus.dropwizard.guice.module.installer.order.Order} annotation.
* Note: not all installers supports ordering (in any case returned order is the same order as
* extensions were processed by installer).
*
* @param installer installer type
* @return ordered list of extensions installed by provided installer or empty list
*/
@SuppressWarnings("unchecked")
public List<Class<Object>> getExtensionsOrdered(final Class<? extends FeatureInstaller> installer) {
final List<Class<?>> extensions = holder.getExtensions(installer);
return extensions == null ? Collections.emptyList() : (List) extensions;
}
}