Search in sources :

Example 1 with ParameterizedTypeInstance

use of org.qi4j.runtime.injection.ParameterizedTypeInstance in project qi4j-sdk by Qi4j.

the class ConstructorsModel method newConstructorModel.

@SuppressWarnings("raw")
private ConstructorModel newConstructorModel(Class fragmentClass, Constructor realConstructor, Constructor injectedConstructor) {
    int idx = 0;
    InjectedParametersModel parameters = new InjectedParametersModel();
    Annotation[][] parameterAnnotations = injectedConstructor.getParameterAnnotations();
    for (Type type : injectedConstructor.getGenericParameterTypes()) {
        Annotation injectionAnnotation = first(filter(Specifications.translate(Annotations.type(), Annotations.hasAnnotation(InjectionScope.class)), iterable(parameterAnnotations[idx])));
        if (injectionAnnotation == null) {
            if (fragmentClass.getSuperclass().isMemberClass()) {
                injectionAnnotation = new Uses() {

                    @Override
                    public Class<? extends Annotation> annotationType() {
                        return Uses.class;
                    }
                };
            } else {
                // invalid constructor parameter
                return null;
            }
        }
        boolean optional = DependencyModel.isOptional(injectionAnnotation, parameterAnnotations[idx]);
        Type genericType = type;
        if (genericType instanceof ParameterizedType) {
            genericType = new ParameterizedTypeInstance(((ParameterizedType) genericType).getActualTypeArguments(), ((ParameterizedType) genericType).getRawType(), ((ParameterizedType) genericType).getOwnerType());
            for (int i = 0; i < ((ParameterizedType) genericType).getActualTypeArguments().length; i++) {
                Type typeArg = ((ParameterizedType) genericType).getActualTypeArguments()[i];
                if (typeArg instanceof TypeVariable) {
                    typeArg = Classes.resolveTypeVariable((TypeVariable) typeArg, realConstructor.getDeclaringClass(), fragmentClass);
                    ((ParameterizedType) genericType).getActualTypeArguments()[i] = typeArg;
                }
            }
        }
        DependencyModel dependencyModel = new DependencyModel(injectionAnnotation, genericType, fragmentClass, optional, parameterAnnotations[idx]);
        parameters.addDependency(dependencyModel);
        idx++;
    }
    return new ConstructorModel(realConstructor, parameters);
}
Also used : DependencyModel(org.qi4j.runtime.injection.DependencyModel) Uses(org.qi4j.api.injection.scope.Uses) Annotation(java.lang.annotation.Annotation) ParameterizedType(java.lang.reflect.ParameterizedType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) ParameterizedTypeInstance(org.qi4j.runtime.injection.ParameterizedTypeInstance) TypeVariable(java.lang.reflect.TypeVariable) InjectionScope(org.qi4j.api.injection.InjectionScope) InjectedParametersModel(org.qi4j.runtime.injection.InjectedParametersModel)

Aggregations

Annotation (java.lang.annotation.Annotation)1 ParameterizedType (java.lang.reflect.ParameterizedType)1 Type (java.lang.reflect.Type)1 TypeVariable (java.lang.reflect.TypeVariable)1 InjectionScope (org.qi4j.api.injection.InjectionScope)1 Uses (org.qi4j.api.injection.scope.Uses)1 DependencyModel (org.qi4j.runtime.injection.DependencyModel)1 InjectedParametersModel (org.qi4j.runtime.injection.InjectedParametersModel)1 ParameterizedTypeInstance (org.qi4j.runtime.injection.ParameterizedTypeInstance)1