package ru.vyarus.dropwizard.guice.bundle.lookup;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import ru.vyarus.dropwizard.guice.bundle.GuiceyBundleLookup;
import ru.vyarus.dropwizard.guice.module.installer.bundle.GuiceyBundle;
import java.util.Collections;
import java.util.List;
/**
* Use 'guicey.bundles' system property to lookup bundles. Property value must contain comma-separated list of
* complete bundle class names. Each bundle in list must have default no-args constructor.
* <p>
* Example: {@code -Dguicey.bundles=com.foo.MyBundle1,com.foo.MyBundle2}.
* <p>
* Static shortcut method may be used to set property value from code (for example, in unit tests to enable
* specific debug bundle): {@code PropertyBundleLookup.enableBundles(MyBundle1.class, MyBundle2.class)}.
* <p>
* For example, last approach is used in guicey tests to enable
* {@link ru.vyarus.dropwizard.guice.module.jersey.debug.HK2DebugBundle} to check beans boundaries during tests.
*
* @author Vyacheslav Rusakov
* @since 16.01.2016
*/
public class PropertyBundleLookup implements GuiceyBundleLookup {
public static final String BUNDLES_PROPERTY = "guicey.bundles";
public List<GuiceyBundle> lookup() {
final String prop = System.getProperty(BUNDLES_PROPERTY);
List<GuiceyBundle> res = Collections.emptyList();
if (prop != null) {
final Iterable<String> classes = Splitter.on(',').omitEmptyStrings().trimResults().split(prop);
try {
res = toInstances(toClasses(classes));
} catch (Exception e) {
throw new IllegalStateException(String.format(
"Failed to parse bundles system property '%s' value: '%s'",
BUNDLES_PROPERTY, prop), e);
}
}
return res;
}
/**
* Sets system property value to provided classes. Shortcut is useful to set property from code, for example,
* in unit tests.
*
* @param bundles bundles to enable
*/
@SafeVarargs
public static void enableBundles(final Class<? extends GuiceyBundle>... bundles) {
final String prop = Joiner.on(',').join(toStrings(Lists.newArrayList(bundles)));
System.setProperty(BUNDLES_PROPERTY, prop);
}
private static List<String> toStrings(final Iterable<Class<? extends GuiceyBundle>> list) {
final List<String> res = Lists.newArrayList();
for (Class cls : list) {
res.add(cls.getName());
}
return res;
}
@SuppressWarnings("unchecked")
private List<Class<GuiceyBundle>> toClasses(final Iterable<String> list) throws Exception {
final List<Class<GuiceyBundle>> res = Lists.newArrayList();
for (String cls : list) {
res.add((Class<GuiceyBundle>) Class.forName(cls));
}
return res;
}
private List<GuiceyBundle> toInstances(final Iterable<Class<GuiceyBundle>> list) throws Exception {
final List<GuiceyBundle> res = Lists.newArrayList();
for (Class<GuiceyBundle> cls : list) {
res.add(cls.newInstance());
}
return res;
}
}