All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertx.up.uca.di.DiGuiceField Maven / Gradle / Ivy

The newest version!
package io.vertx.up.uca.di;

import com.google.inject.AbstractModule;
import io.vertx.up.util.Ut;

import javax.inject.Inject;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;

/**
 * @author Lang
 */
public class DiGuiceField implements DiGuice {
    private final transient Set> pointers = new HashSet<>();

    @Override
    public boolean success(final Class clazz) {
        // Get all fields
        final Field[] fields = clazz.getDeclaredFields();
        final Set> extract = new HashSet<>();
        Arrays.stream(fields)
            .filter(field -> !Modifier.isStatic(field.getModifiers()))          // Ko Static
            // .filter(field -> !Modifier.isPublic(field.getModifiers()))          // Ko Non-Public
            .filter(field -> field.isAnnotationPresent(Inject.class))           // JSR 330
            .forEach(field -> extract.add(field.getType()));
        if (!extract.isEmpty()) {
            this.pointers.addAll(extract);
        }
        return !extract.isEmpty();
    }

    @Override
    @SuppressWarnings("all")
    public AbstractModule module(final ConcurrentMap, Set>> tree,
                                 final Set> flat) {
        final Set> classes = this.pointers;
        return new DiGuiceModule() {
            @Override
            protected void configure() {
                if (!classes.isEmpty()) {
                    logger().info("[ DI ] Field Scanner booting...");
                    final Set ignoreSet = new HashSet<>();
                    classes.forEach(clazz -> {
                        if (flat.contains(clazz)) {
                            // Standalone, Non-Constructor
                            final String bindCls = this.bindConstructor((Class) clazz);
                            if (Objects.nonNull(bindCls)) {
                                ignoreSet.add(bindCls);
                            }
                        } else {
                            // Interface Part
                            if (clazz.isInterface()) {
                                final Set> implCls = tree.get(clazz);
                                final Set ignored = this.bindInterface((Class) clazz, implCls);
                                if (Objects.nonNull(ignored)) {
                                    ignoreSet.addAll(ignored);
                                }
                            }
                        }
                    });
                    if (ignoreSet.isEmpty()) {
                        logger().info("[ DI ] Field Scanned Successfully !!!");
                    } else {
                        logger().info("[ DI ] Field Scanned Successfully with ignored: {0} !!!", Ut.fromJoin(ignoreSet));
                    }
                }
            }
        };
    }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy