-
Notifications
You must be signed in to change notification settings - Fork 221
/
PluginSet.java
77 lines (64 loc) · 2 KB
/
PluginSet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package io.digdag.core.plugin;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.inject.Injector;
import io.digdag.spi.Plugin;
import java.util.List;
public class PluginSet
{
public static PluginSet empty()
{
return new PluginSet(ImmutableList.of());
}
public class WithInjector
{
private final Injector injector;
private WithInjector(Injector injector)
{
this.injector = injector;
}
public <T> List<T> getServiceProviders(Class<T> type)
{
ImmutableList.Builder<T> builder = ImmutableList.builder();
for (Plugin plugin : plugins) {
Class<? extends T> providerClass = plugin.getServiceProvider(type);
if (providerClass != null) {
builder.add(getServiceProvider(providerClass, type, plugin));
}
}
return builder.build();
}
private <T, E extends T> E getServiceProvider(Class<E> providerClass, Class<T> type, Plugin plugin)
{
return injector.createChildInjector((binder) -> {
plugin.configureBinder(providerClass, binder);
binder.bind(providerClass);
})
.getInstance(providerClass);
}
}
private final List<Plugin> plugins;
public PluginSet(List<Plugin> plugins)
{
this.plugins = plugins;
}
public PluginSet withPlugins(Plugin... plugins)
{
return withPlugins(ImmutableList.copyOf(plugins));
}
public PluginSet withPlugins(List<Plugin> plugins)
{
return new PluginSet(FluentIterable
.from(this.plugins)
.append(plugins)
.toList());
}
public PluginSet withPlugins(PluginSet another)
{
return withPlugins(another.plugins);
}
public WithInjector withInjector(Injector injector)
{
return new WithInjector(injector);
}
}