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

com.wizzardo.http.framework.di.DependencyForge Maven / Gradle / Ivy

The newest version!
package com.wizzardo.http.framework.di;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.function.Supplier;

/**
 * Created by wizzardo on 27/03/17.
 */
public interface DependencyForge {
    default  Dependency forge(Class clazz, DependencyScope scope) {
        return forge(clazz, createSupplier(clazz), scope);
    }

    default  Dependency forge(Class clazz, Supplier supplier, DependencyScope scope) {
        if (supplier == null)
            return null;

        return scope.forge(clazz, supplier, scope);
    }

    default  Supplier createSupplier(Class clazz) {
        Constructor[] constructors = clazz.getConstructors();
        if (constructors.length == 0)
            return () -> newInstance(clazz);

        for (Constructor constructor : constructors) {
            if (constructor.getParameterCount() == 0)
                return () -> newInstance((Constructor) constructor);
        }

        Constructor constructor = (Constructor) constructors[0];
        Parameter[] parameters = constructor.getParameters();
        return () -> {
            Object[] args = new Object[parameters.length];
            for (int i = 0; i < args.length; i++) {
                Parameter parameter = parameters[i];
                try {
                    args[i] = DependencyFactory.get(parameter.getType(), parameter.getAnnotations());
                } catch (Exception e) {
                    throw new IllegalStateException("Cannot resolve " + i + "th (" +
                            parameter.getType().getName() + (parameter.isNamePresent() ? " " + parameter.getName() : "") +
                            ") argument of " + clazz.getName() + "'s constructors", e);
                }
            }
            return newInstance(constructor, args);
        };
    }

    static  T newInstance(Class clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new IllegalStateException("can't create instance of class " + clazz, e);
        }
    }

    static  T newInstance(Constructor constructor) {
        try {
            return constructor.newInstance();
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
            throw new IllegalStateException("can't create instance of class " + constructor.getDeclaringClass(), e);
        }
    }

    static  T newInstance(Constructor constructor, Object[] args) {
        try {
            return constructor.newInstance(args);
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | IllegalArgumentException e) {
            throw new IllegalStateException("can't create instance of class " + constructor.getDeclaringClass() + " with args: " + Arrays.toString(args), e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy