io.datakernel.di.impl.BindingInitializer Maven / Gradle / Ivy
package io.datakernel.di.impl;
import io.datakernel.di.core.Binding;
import io.datakernel.di.core.Dependency;
import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;
import static java.util.Arrays.asList;
import static java.util.Collections.emptySet;
/**
* This is a {@link Binding} binding modifying function, that can add extra dependencies to it
* and run initialization code for instance after it was created.
*/
public final class BindingInitializer {
private static final BindingInitializer> NOOP = new BindingInitializer<>(emptySet(),
compiledBindings -> (instance, instances, synchronizedScope) -> {});
private final Set dependencies;
private final BindingInitializerCompiler compiler;
private BindingInitializer(Set dependencies, BindingInitializerCompiler compiler) {
this.dependencies = dependencies;
this.compiler = compiler;
}
public Set getDependencies() {
return dependencies;
}
public BindingInitializerCompiler getCompiler() {
return compiler;
}
public static BindingInitializer of(Set dependencies, BindingInitializerCompiler bindingInitializerCompiler) {
return new BindingInitializer<>(dependencies, bindingInitializerCompiler);
}
@SafeVarargs
public static BindingInitializer combine(BindingInitializer... bindingInitializers) {
return combine(asList(bindingInitializers));
}
@SuppressWarnings("unchecked")
public static BindingInitializer combine(Collection> bindingInitializers) {
return new BindingInitializer<>(bindingInitializers.stream().map(BindingInitializer::getDependencies).flatMap(Collection::stream).collect(Collectors.toSet()),
compiledBindings -> {
CompiledBindingInitializer[] initializers = bindingInitializers.stream()
.filter(bindingInitializer -> bindingInitializer != NOOP)
.map(bindingInitializer -> bindingInitializer.compiler.compile(compiledBindings))
.toArray(CompiledBindingInitializer[]::new);
if (initializers.length == 0) return (instance, instances, synchronizedScope) -> {};
if (initializers.length == 1) return initializers[0];
if (initializers.length == 2) {
CompiledBindingInitializer initializer0 = initializers[0];
CompiledBindingInitializer initializer1 = initializers[1];
return (instance, instances, synchronizedScope) -> {
initializer0.initInstance(instance, instances, synchronizedScope);
initializer1.initInstance(instance, instances, synchronizedScope);
};
}
return (instance, instances, synchronizedScope) -> {
for (CompiledBindingInitializer initializer : initializers) {
initializer.initInstance(instance, instances, synchronizedScope);
}
};
});
}
@SuppressWarnings("unchecked")
public static BindingInitializer noop() {
return (BindingInitializer) NOOP;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy