/** * Adds a configuration option for intended classes loaded by {@link ServiceLoader}s * * <p>Restricts the {@link #validOptions} to the class names of the {@link ServiceLoader} implementations of the * provided service loader interface.</p> * * <p> Note that the implementations have to be registered in {@code META-INF/services/{serviceLoaderInterface.getName()}}</p> */ public static <T> ConfigurationOptionBuilder<T> serviceLoaderStrategyOption(Class<T> serviceLoaderInterface) { final ConfigurationOptionBuilder<T> optionBuilder = new ConfigurationOptionBuilder<T>(ClassInstanceValueConverter.of(serviceLoaderInterface), serviceLoaderInterface); for (T impl : ServiceLoader.load(serviceLoaderInterface, ConfigurationOption.class.getClassLoader())) { optionBuilder.addValidOption(impl); } optionBuilder.sealValidOptions(); return optionBuilder; }
@Test public void testValidOptions_list() throws Exception { assertThatThrownBy(() -> ConfigurationOption.integersOption() .key("test.list") .dynamic(true) .addValidOption(Arrays.asList(1, 2)) .buildWithDefault(Collections.singleton(1))) .isInstanceOf(UnsupportedOperationException.class); }
/** * Constructs a {@link ConfigurationOptionBuilder} whose value is an {@link Enum} * * @return a {@link ConfigurationOptionBuilder} whose value is an {@link Enum} */ public static <T extends Enum<T>> ConfigurationOptionBuilder<T> enumOption(Class<T> clazz) { final ConfigurationOptionBuilder<T> optionBuilder = new ConfigurationOptionBuilder<T>(new EnumValueConverter<T>(clazz), clazz); for (T enumConstant : clazz.getEnumConstants()) { optionBuilder.addValidOption(enumConstant); } optionBuilder.sealValidOptions(); return optionBuilder; }
public ConfigurationOptionBuilder<T> validOptions(List<T> options) { for (T option : options) { addValidOption(option); } return this; }
@Test public void testWithOptions_sealedOptions() { assertThatThrownBy(() -> ConfigurationOption.stringOption() .key("test.options") .addValidOptions("foo", "bar") .sealValidOptions() .addValidOption("baz") .buildWithDefault("baz")) .isInstanceOf(IllegalStateException.class) .hasMessage("Options are sealed, you can't add any new ones"); }
public ConfigurationOptionBuilder<T> addValidOptions(T... options) { for (T option : options) { addValidOption(option); } return this; }