package org.embulk.plugin; import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.multibindings.Multibinder; public class MockPluginSource implements PluginSource { private final Class<?> expectedIface; private final Object plugin; private PluginType typeConfig; public <T> MockPluginSource(Class<T> expectedIface, T plugin) { this.expectedIface = expectedIface; this.plugin = plugin; } public PluginType getTypeConfig() { return typeConfig; } @SuppressWarnings("unchecked") public <T> T newPlugin(Class<T> iface, PluginType typeConfig) throws PluginSourceNotMatchException { if (expectedIface.equals(iface)) { this.typeConfig = typeConfig; return (T) plugin; } else { throw new PluginSourceNotMatchException(); } } public static <T> Module newInjectModule(final Class<T> expectedIface, final T plugin) { return new InjectModule(expectedIface, plugin); } public static class InjectModule implements Module { private final PluginSource pluginSource; public <T> InjectModule(Class<T> expectedIface, T plugin) { this.pluginSource = new MockPluginSource(expectedIface, plugin); } @Override public void configure(Binder binder) { Multibinder<PluginSource> multibinder = Multibinder.newSetBinder(binder, PluginSource.class); multibinder.addBinding().toInstance(pluginSource); } } }