Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package io.datakernel.di.impl;
import io.datakernel.di.core.*;
import io.datakernel.di.module.UniqueNameImpl;
import io.datakernel.di.util.Trie;
import io.datakernel.di.util.Utils;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Stream;
import static io.datakernel.di.core.Scope.UNSCOPED;
import static io.datakernel.di.util.Utils.*;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyMap;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
/**
* This class contains a set of utils for working with binding graph trie.
*/
public final class Preprocessor {
private Preprocessor() {}
/**
* This method converts a trie of binding multimaps, that is provided from the modules,
* into a trie of binding maps on which the {@link Injector} would actually operate.
*
* While doing so it also recursively tries to generate missing dependency bindings
* using given {@link BindingGenerator generator} and apply given {@link BindingTransformer} to all of them.
*
* @see BindingGenerator#combinedGenerator
* @see BindingTransformer#combinedTransformer
*/
public static Trie, Binding>>> reduce(
Trie, Set>>> bindings,
Multibinder> multibinder,
BindingTransformer> transformer,
BindingGenerator> generator) {
Trie, Binding>>> reduced = Trie.leaf(new HashMap<>());
reduce(UNSCOPED, emptyMap(), bindings, reduced, multibinder, transformer, generator);
return reduced;
}
private static void reduce(
Scope[] scope, Map, Binding>> upper,
Trie, Set>>> bindings, Trie, Binding>>> reduced,
Multibinder> multibinder,
BindingTransformer> transformer,
BindingGenerator> generator) {
Map, Set>> localBindings = bindings.get();
localBindings.forEach((key, bindingSet) -> resolve(upper, localBindings, reduced.get(), scope, key, bindingSet, multibinder, transformer, generator));
Map, Binding>> nextUpper = override(upper, reduced.get());
bindings.getChildren().forEach((subScope, subLocalBindings) ->
reduce(next(scope, subScope), nextUpper, subLocalBindings, reduced.computeIfAbsent(subScope, $ -> new HashMap<>()), multibinder, transformer, generator));
}
@SuppressWarnings("unchecked")
@Nullable
private static Binding> resolve(
Map, Binding>> upper, Map, Set>> localBindings, Map, Binding>> resolved,
Scope[] scope, Key> key, @Nullable Set> bindingSet,
Multibinder> multibinder, BindingTransformer> transformer, BindingGenerator> generator) {
// shortest path - if it was already resolved, just return it (also serves as a visited set so graph loops dont cause infinite recursion)
Binding> reduced = resolved.get(key);
if (reduced != null) {
return reduced;
}
BindingLocator recursiveLocator = new BindingLocator() {
@Override
@Nullable
public Binding get(Key key) {
return (Binding) resolve(upper, localBindings, resolved, scope, key, localBindings.get(key), multibinder, transformer, generator);
}
};
// if it was explicitly bound
if (bindingSet != null) {
switch (bindingSet.size()) {
case 0:
// try to recursively generate a requested binding
reduced = ((BindingGenerator