Search in sources :

Example 1 with CompositeMethodModel

use of org.qi4j.runtime.composite.CompositeMethodModel in project qi4j-sdk by Qi4j.

the class CompositeAssemblyImpl method implementMixinType.

protected void implementMixinType(Iterable<? extends Class<?>> types, Iterable<Class<? extends Constraint<?, ?>>> constraintClasses, Iterable<Class<?>> concernClasses, Iterable<Class<?>> sideEffectClasses, Iterable<Class<?>> mixinClasses) {
    Set<Class<?>> thisDependencies = new HashSet<>();
    for (Class<?> mixinType : types) {
        for (Method method : mixinType.getMethods()) {
            if (!compositeMethodsModel.isImplemented(method) && !Proxy.class.equals(method.getDeclaringClass().getSuperclass()) && !Proxy.class.equals(method.getDeclaringClass()) && !Modifier.isStatic(method.getModifiers())) {
                MixinModel mixinModel = implementMethod(method, mixinClasses);
                ConcernsModel concernsModel = concernsFor(method, mixinModel.mixinClass(), Iterables.<Class<?>>flatten(concernDeclarations(mixinModel.mixinClass()), concernClasses));
                SideEffectsModel sideEffectsModel = sideEffectsFor(method, mixinModel.mixinClass(), Iterables.<Class<?>>flatten(sideEffectDeclarations(mixinModel.mixinClass()), sideEffectClasses));
                method.setAccessible(true);
                ConstraintsModel constraints = constraintsFor(method, Iterables.<Class<? extends Constraint<?, ?>>>flatten(constraintDeclarations(mixinModel.mixinClass()), constraintClasses));
                CompositeMethodModel methodComposite = new CompositeMethodModel(method, constraints, concernsModel, sideEffectsModel, mixinsModel);
                // Implement @This references
                Iterable<Class<?>> map = map(new DependencyModel.InjectionTypeFunction(), filter(new DependencyModel.ScopeSpecification(This.class), methodComposite.dependencies()));
                Iterable<Class<?>> map1 = map(new DependencyModel.InjectionTypeFunction(), filter(new DependencyModel.ScopeSpecification(This.class), mixinModel.dependencies()));
                @SuppressWarnings("unchecked") Iterable<Class<?>> filter = filter(not(in(Initializable.class, Lifecycle.class, InvocationHandler.class)), map(Classes.RAW_CLASS, interfacesOf(mixinModel.mixinClass())));
                Iterable<? extends Class<?>> flatten = flatten(map, map1, filter);
                addAll(thisDependencies, flatten);
                compositeMethodsModel.addMethod(methodComposite);
            }
        }
        // Add type to set of mixin types
        mixinsModel.addMixinType(mixinType);
    }
    // Implement all @This dependencies that were found
    for (Class<?> thisDependency : thisDependencies) {
        // Add additional declarations from the @This type
        Iterable<Class<? extends Constraint<?, ?>>> typeConstraintClasses = flatten(constraintClasses, constraintDeclarations(thisDependency));
        Iterable<Class<?>> typeConcernClasses = flatten(concernClasses, concernDeclarations(thisDependency));
        Iterable<Class<?>> typeSideEffectClasses = flatten(sideEffectClasses, sideEffectDeclarations(thisDependency));
        Iterable<Class<?>> typeMixinClasses = flatten(mixinClasses, mixinDeclarations(thisDependency));
        @SuppressWarnings("unchecked") Iterable<? extends Class<?>> singleton = iterable(thisDependency);
        implementMixinType(singleton, typeConstraintClasses, typeConcernClasses, typeSideEffectClasses, typeMixinClasses);
    }
}
Also used : MixinModel(org.qi4j.runtime.composite.MixinModel) DependencyModel(org.qi4j.runtime.injection.DependencyModel) ValueConstraintsModel(org.qi4j.runtime.composite.ValueConstraintsModel) ConstraintsModel(org.qi4j.runtime.composite.ConstraintsModel) Constraint(org.qi4j.api.constraint.Constraint) ConcernsModel(org.qi4j.runtime.composite.ConcernsModel) SideEffectsModel(org.qi4j.runtime.composite.SideEffectsModel) Method(java.lang.reflect.Method) CompositeMethodModel(org.qi4j.runtime.composite.CompositeMethodModel) Proxy(java.lang.reflect.Proxy) Classes.wrapperClass(org.qi4j.api.util.Classes.wrapperClass) HashSet(java.util.HashSet)

Aggregations

Method (java.lang.reflect.Method)1 Proxy (java.lang.reflect.Proxy)1 HashSet (java.util.HashSet)1 Constraint (org.qi4j.api.constraint.Constraint)1 Classes.wrapperClass (org.qi4j.api.util.Classes.wrapperClass)1 CompositeMethodModel (org.qi4j.runtime.composite.CompositeMethodModel)1 ConcernsModel (org.qi4j.runtime.composite.ConcernsModel)1 ConstraintsModel (org.qi4j.runtime.composite.ConstraintsModel)1 MixinModel (org.qi4j.runtime.composite.MixinModel)1 SideEffectsModel (org.qi4j.runtime.composite.SideEffectsModel)1 ValueConstraintsModel (org.qi4j.runtime.composite.ValueConstraintsModel)1 DependencyModel (org.qi4j.runtime.injection.DependencyModel)1