http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/ConstructorsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/ConstructorsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/ConstructorsModel.java index 9bc075f..435a020 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/ConstructorsModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/ConstructorsModel.java @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.function.Function; +import java.util.stream.Stream; import org.apache.zest.api.common.ConstructionException; import org.apache.zest.api.composite.CompositeDescriptor; import org.apache.zest.api.composite.InvalidCompositeException; @@ -35,8 +35,7 @@ import org.apache.zest.api.util.Classes; import org.apache.zest.bootstrap.BindingException; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.HierarchicalVisitorAdapter; -import org.apache.zest.functional.Iterables; -import org.apache.zest.functional.Specifications; +import org.apache.zest.runtime.legacy.Specifications; import org.apache.zest.functional.VisitableHierarchy; import org.apache.zest.runtime.injection.Dependencies; import org.apache.zest.runtime.injection.DependencyModel; @@ -107,18 +106,24 @@ public final class ConstructorsModel } @Override - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { - Function<ConstructorModel, Iterable<DependencyModel>> constructorDependencies = new Function<ConstructorModel, Iterable<DependencyModel>>() + if( boundConstructors == null ) { - @Override - public Iterable<DependencyModel> apply( ConstructorModel constructorModel ) - { - return constructorModel.dependencies(); - } - }; + return constructorModels.stream().flatMap( ConstructorModel::dependencies ); + } + return boundConstructors.stream().flatMap( ConstructorModel::dependencies ); - return Iterables.flattenIterables( Iterables.map( constructorDependencies, boundConstructors == null ? constructorModels : boundConstructors ) ); +// Function<ConstructorModel, Iterable<DependencyModel>> constructorDependencies = new Function<ConstructorModel, Iterable<DependencyModel>>() +// { +// @Override +// public Iterable<DependencyModel> apply( ConstructorModel constructorModel ) +// { +// return constructorModel.dependencies(); +// } +// }; +// +// return Iterables.flattenIterables( Iterables.map( constructorDependencies, boundConstructors == null ? constructorModels : boundConstructors ) ); } @SuppressWarnings( "raw" )
http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/FragmentClassLoader.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FragmentClassLoader.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FragmentClassLoader.java index 91a782a..d83c9f0 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FragmentClassLoader.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FragmentClassLoader.java @@ -19,17 +19,17 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; +import org.apache.zest.api.entity.Lifecycle; +import org.apache.zest.api.mixin.Initializable; +import org.apache.zest.api.util.Classes; +import org.apache.zest.api.util.Methods; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; -import org.apache.zest.api.entity.Lifecycle; -import org.apache.zest.api.mixin.Initializable; -import org.apache.zest.api.util.Classes; -import org.apache.zest.api.util.Methods; -import org.apache.zest.functional.Iterables; +import static org.apache.zest.api.util.Classes.interfacesOf; import static org.objectweb.asm.Opcodes.AASTORE; import static org.objectweb.asm.Opcodes.ACC_PRIVATE; import static org.objectweb.asm.Opcodes.ACC_PUBLIC; @@ -69,7 +69,6 @@ import static org.objectweb.asm.Opcodes.POP; import static org.objectweb.asm.Opcodes.PUTSTATIC; import static org.objectweb.asm.Opcodes.RETURN; import static org.objectweb.asm.Type.getInternalName; -import static org.apache.zest.api.util.Classes.interfacesOf; /** * Generate subclasses of mixins/modifiers that implement all interfaces not in the class itself @@ -87,13 +86,13 @@ public class FragmentClassLoader String jdkString = System.getProperty( "java.specification.version" ); switch( jdkString ) { - case "1.8": - JDK_VERSION = Opcodes.V1_8; - break; - case "1.7": - default: - JDK_VERSION = Opcodes.V1_7; - break; + case "1.8": + JDK_VERSION = Opcodes.V1_8; + break; + case "1.7": + default: + JDK_VERSION = Opcodes.V1_7; + break; } } @@ -140,8 +139,10 @@ public class FragmentClassLoader } } // To Allow JDK classes to be composed. - if( name.startsWith( "java." )) + if( name.startsWith( "java." ) ) + { name = "zest." + name; + } byte[] b = generateClass( name, baseClass ); return defineClass( name, b, 0, b.length, baseClass.getProtectionDomain() ); @@ -164,7 +165,8 @@ public class FragmentClassLoader // Composite reference { - cw.visitField( ACC_PUBLIC, "_instance", "Lorg/apache/zest/api/composite/CompositeInvoker;", null, null ).visitEnd(); + cw.visitField( ACC_PUBLIC, "_instance", "Lorg/apache/zest/api/composite/CompositeInvoker;", null, null ) + .visitEnd(); } // Static Method references @@ -173,10 +175,10 @@ public class FragmentClassLoader int idx = 1; for( Method method : baseClass.getMethods() ) { - if( isOverridden(method, baseClass) ) + if( isOverridden( method, baseClass ) ) { cw.visitField( ACC_PRIVATE + ACC_STATIC, "m" + idx++, "Ljava/lang/reflect/Method;", null, - null ).visitEnd(); + null ).visitEnd(); hasProxyMethods = true; } } @@ -190,34 +192,42 @@ public class FragmentClassLoader String desc = org.objectweb.asm.commons.Method.getMethod( constructor ).getDescriptor(); MethodVisitor cmv = cw.visitMethod( ACC_PUBLIC, "<init>", desc, null, null ); cmv.visitCode(); - cmv.visitVarInsn(ALOAD, 0); + cmv.visitVarInsn( ALOAD, 0 ); int idx = 1; for( Class aClass : constructor.getParameterTypes() ) { final int opcode; - if (aClass.equals(Integer.TYPE)) { + if( aClass.equals( Integer.TYPE ) ) + { opcode = ILOAD; - } else if (aClass.equals(Long.TYPE)) { + } + else if( aClass.equals( Long.TYPE ) ) + { opcode = LLOAD; - } else if (aClass.equals(Float.TYPE)) { + } + else if( aClass.equals( Float.TYPE ) ) + { opcode = FLOAD; - } else if (aClass.equals(Double.TYPE)) { + } + else if( aClass.equals( Double.TYPE ) ) + { opcode = DLOAD; - } else { + } + else + { opcode = ALOAD; } - cmv.visitVarInsn(opcode, idx++); + cmv.visitVarInsn( opcode, idx++ ); } - cmv.visitMethodInsn(INVOKESPECIAL, baseClassSlash, "<init>", desc, false); - cmv.visitInsn(RETURN); - cmv.visitMaxs(idx, idx); + cmv.visitMethodInsn( INVOKESPECIAL, baseClassSlash, "<init>", desc, false ); + cmv.visitInsn( RETURN ); + cmv.visitMaxs( idx, idx ); cmv.visitEnd(); } } - // Overloaded and unimplemented methods if( hasProxyMethods ) { @@ -226,7 +236,7 @@ public class FragmentClassLoader List<Label> exceptionLabels = new ArrayList<>(); for( Method method : methods ) { - if( isOverridden(method, baseClass) ) + if( isOverridden( method, baseClass ) ) { idx++; String methodName = method.getName(); @@ -404,7 +414,7 @@ public class FragmentClassLoader int midx = 0; for( Method method : methods ) { - if( isOverridden(method, baseClass) ) + if( isOverridden( method, baseClass ) ) { method.setAccessible( true ); Class methodClass; @@ -466,7 +476,7 @@ public class FragmentClassLoader return cw.toByteArray(); } - private static boolean isOverridden(Method method, Class baseClass) + private static boolean isOverridden( Method method, Class baseClass ) { if( Modifier.isAbstract( method.getModifiers() ) ) { @@ -505,58 +515,39 @@ public class FragmentClassLoader private static boolean isDeclaredIn( Method method, Class<?> clazz, Class<?> baseClass ) { - if( !clazz.isAssignableFrom( baseClass ) ) - { - return false; - } - - try - { - clazz.getMethod( method.getName(), method.getParameterTypes() ); - return true; - } - catch( NoSuchMethodException e ) - { - return false; - } + return clazz.isAssignableFrom( baseClass ) && checkForMethod( method, clazz ); } private static Class getInterfaceMethodDeclaration( Method method, Class clazz ) throws NoSuchMethodException { - Iterable<Class<?>> interfaces = Iterables.map( Classes.RAW_CLASS, interfacesOf( clazz ) ); - for( Class<?> anInterface : interfaces ) - { - try - { - anInterface.getMethod( method.getName(), method.getParameterTypes() ); - return anInterface; - } - catch( NoSuchMethodException e ) - { - // Try next - } - } - - throw new NoSuchMethodException( method.getName() ); + return interfacesOf( clazz ) + .map( Classes.RAW_CLASS ) + .filter( intface -> checkForMethod( method, intface ) ) + .findFirst() + .orElseThrow( () -> new NoSuchMethodException( method.getName() ) ); } private static boolean isInterfaceMethod( Method method, Class<?> baseClass ) { - for( Class<?> aClass : Iterables.filter( Methods.HAS_METHODS, Iterables.map( Classes.RAW_CLASS, interfacesOf( baseClass ) ) ) ) + return interfacesOf( baseClass ) + .map( Classes.RAW_CLASS ) + .filter( Methods.HAS_METHODS ) + .anyMatch( intface -> checkForMethod( method, intface )); + } + + private static boolean checkForMethod( Method method, Class<?> intface ) + { + try { - try - { - Method m = aClass.getMethod( method.getName(), method.getParameterTypes() ); - m.setAccessible( true ); - return true; - } - catch( NoSuchMethodException e ) - { - // Ignore - } + Method m = intface.getMethod( method.getName(), method.getParameterTypes() ); + m.setAccessible( true ); + return true; + } + catch( NoSuchMethodException e ) + { + return false; } - return false; } private static void type( MethodVisitor mv, Class<?> aClass ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java index a0ade3d..ea4c5e4 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java @@ -77,18 +77,15 @@ public class FunctionStateResolver public void populateState( EntityModel model, EntityState state ) { - for( PropertyDescriptor propDesc : model.state().properties() ) - { + model.state().properties().forEach( propDesc -> { Object value = getPropertyState( propDesc ); state.setPropertyValue( propDesc.qualifiedName(), value ); - } - for( AssociationDescriptor assDesc : model.state().associations() ) - { + } ); + model.state().associations().forEach( assDesc -> { EntityReference ref = getAssociationState( assDesc ); state.setAssociationValue( assDesc.qualifiedName(), ref ); - } - for( ManyAssociationModel manyAssDesc : model.state().manyAssociations() ) - { + } ); + model.state().manyAssociations().forEach( manyAssDesc -> { ManyAssociationState associationState = state.manyAssociationValueOf( manyAssDesc.qualifiedName() ); // First clear existing ones for( EntityReference ref : associationState ) @@ -100,9 +97,8 @@ public class FunctionStateResolver { associationState.add( 0, ref ); } - } - for( NamedAssociationModel namedAssDesc : model.state().namedAssociations() ) - { + } ); + model.state().namedAssociations().forEach( namedAssDesc -> { NamedAssociationState associationState = state.namedAssociationValueOf( namedAssDesc.qualifiedName() ); // First clear existing ones for( String name : associationState ) @@ -114,6 +110,6 @@ public class FunctionStateResolver { associationState.put( entry.getKey(), entry.getValue() ); } - } + } ); } } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinModel.java index c0be60b..abbe7b0 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinModel.java @@ -17,6 +17,8 @@ package org.apache.zest.runtime.composite; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.zest.api.common.ConstructionException; import org.apache.zest.api.composite.CompositeInstance; import org.apache.zest.api.injection.scope.This; @@ -25,29 +27,25 @@ import org.apache.zest.api.mixin.InitializationException; import org.apache.zest.api.mixin.MixinDescriptor; import org.apache.zest.api.property.StateHolder; import org.apache.zest.functional.HierarchicalVisitor; -import org.apache.zest.functional.Iterables; import org.apache.zest.functional.VisitableHierarchy; +import org.apache.zest.runtime.injection.Dependencies; import org.apache.zest.runtime.injection.DependencyModel; import org.apache.zest.runtime.injection.InjectedFieldsModel; import org.apache.zest.runtime.injection.InjectedMethodsModel; import org.apache.zest.runtime.injection.InjectionContext; -import static org.apache.zest.functional.Iterables.map; -import static org.apache.zest.functional.Iterables.toList; -import static org.apache.zest.functional.Iterables.unique; - /** * JAVADOC */ public final class MixinModel - implements MixinDescriptor, VisitableHierarchy<Object, Object> + implements MixinDescriptor, VisitableHierarchy<Object, Object>, Dependencies { private final Class<?> mixinClass; private final Class<?> instantiationClass; private final ConstructorsModel constructorsModel; private final InjectedFieldsModel injectedFieldsModel; private final InjectedMethodsModel injectedMethodsModel; - private final Iterable<Class<?>> thisMixinTypes; + private final List<Class<?>> thisMixinTypes; public MixinModel( Class<?> declaredMixinClass, Class<?> instantiationClass ) { @@ -77,10 +75,12 @@ public final class MixinModel return InvocationHandler.class.isAssignableFrom( mixinClass ); } - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { - return Iterables.flatten( constructorsModel.dependencies(), injectedFieldsModel.dependencies(), injectedMethodsModel - .dependencies() ); + return Stream.of( constructorsModel, injectedFieldsModel, injectedMethodsModel ) + .flatMap( Dependencies::dependencies ); +// return Iterables.flatten( constructorsModel.dependencies(), injectedFieldsModel.dependencies(), injectedMethodsModel +// .dependencies() ); } @Override @@ -121,11 +121,7 @@ public final class MixinModel instantiationClass.getDeclaredField( "_instance" ).set( mixin, injectionContext.compositeInstance() ); } - catch( IllegalAccessException e ) - { - e.printStackTrace(); - } - catch( NoSuchFieldException e ) + catch( IllegalAccessException | NoSuchFieldException e ) { e.printStackTrace(); } @@ -141,7 +137,7 @@ public final class MixinModel } catch( InitializationException e ) { - List<Class<?>> compositeType = toList( compositeInstance.types() ); + List<Class<?>> compositeType = compositeInstance.types().collect( Collectors.toList() ); String message = "Unable to initialize " + mixinClass + " in composite " + compositeType; throw new ConstructionException( message, e ); } @@ -154,9 +150,14 @@ public final class MixinModel return thisMixinTypes; } - private Iterable<Class<?>> buildThisMixinTypes() + private List<Class<?>> buildThisMixinTypes() { - return map( new DependencyModel.InjectionTypeFunction(), unique( Iterables.filter( new DependencyModel.ScopeSpecification( This.class ), dependencies() ) ) ); + return dependencies() + .filter( new DependencyModel.ScopeSpecification( This.class ) ) + .distinct() + .map( new DependencyModel.InjectionTypeFunction() ) + .collect( Collectors.toList() ); +// return map( new DependencyModel.InjectionTypeFunction(), unique( Iterables.filter( new DependencyModel.ScopeSpecification( This.class ), dependencies() ) ) ); } protected FragmentInvocationHandler newInvocationHandler( Method method ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinsModel.java index 30fc6c0..c944c2b 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinsModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/MixinsModel.java @@ -25,11 +25,13 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Stream; import org.apache.zest.api.util.Classes; import org.apache.zest.bootstrap.BindingException; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.HierarchicalVisitorAdapter; import org.apache.zest.functional.VisitableHierarchy; +import org.apache.zest.runtime.injection.Dependencies; import org.apache.zest.runtime.injection.DependencyModel; import org.apache.zest.runtime.injection.InjectedFieldModel; import org.apache.zest.runtime.model.Binder; @@ -37,7 +39,6 @@ import org.apache.zest.runtime.model.Resolution; import static org.apache.zest.api.util.Classes.interfacesOf; import static org.apache.zest.functional.Iterables.filter; -import static org.apache.zest.functional.Iterables.flattenIterables; import static org.apache.zest.functional.Iterables.map; /** @@ -45,7 +46,7 @@ import static org.apache.zest.functional.Iterables.map; * and mixin implementations. */ public class MixinsModel - implements Binder, VisitableHierarchy<Object, Object> + implements Binder, VisitableHierarchy<Object, Object>, Dependencies { protected final Map<Method, MixinModel> methodImplementation = new HashMap<Method, MixinModel>(); protected final Map<Method, Integer> methodIndex = new HashMap<Method, Integer>(); @@ -54,9 +55,9 @@ public class MixinsModel private final Map<Class, Integer> mixinIndex = new HashMap<Class, Integer>(); private final Set<Class<?>> mixinTypes = new LinkedHashSet<Class<?>>(); - public Iterable<Class<?>> mixinTypes() + public Stream<Class<?>> mixinTypes() { - return mixinTypes; + return mixinTypes.stream(); } public <T> boolean isImplemented( Class<T> mixinType ) @@ -88,10 +89,9 @@ public class MixinsModel public void addMixinType( Class mixinType ) { - for( Type type : interfacesOf( mixinType ) ) - { - mixinTypes.add( Classes.RAW_CLASS.apply( type ) ); - } + Stream<? extends Type> stream = interfacesOf( mixinType ); + Stream<Class<?>> rawClass = stream.map( Classes.RAW_CLASS ); + rawClass.forEach( mixinTypes::add ); } public void addMixinModel( MixinModel mixinModel ) @@ -189,36 +189,33 @@ public class MixinsModel return mixinFor( method ).newInvocationHandler( method ); } - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { - return flattenIterables( map( new Function<MixinModel, Iterable<DependencyModel>>() - { - @Override - public Iterable<DependencyModel> apply( MixinModel mixinModel ) - { - return mixinModel.dependencies(); - } - }, mixinModels ) ); + return mixinModels.stream().flatMap( Dependencies::dependencies ); } - public Iterable<Method> invocationsFor( final Class<?> mixinClass ) + public Stream<Method> invocationsFor( final Class<?> mixinClass ) { - return map( new Function<Map.Entry<Method, MixinModel>, Method>() - { - @Override - public Method apply( Map.Entry<Method, MixinModel> entry ) - { - return entry.getKey(); - } - }, filter( new Predicate<Map.Entry<Method, MixinModel>>() - { - @Override - public boolean test( Map.Entry<Method, MixinModel> item ) - { - MixinModel model = item.getValue(); - return model.mixinClass().equals( mixinClass ); - } - }, methodImplementation.entrySet() ) ); + return methodImplementation.entrySet() + .stream().filter( entry -> entry.getValue().mixinClass().equals( mixinClass ) ) + .map( Map.Entry::getKey ); + +// return map( new Function<Map.Entry<Method, MixinModel>, Method>() +// { +// @Override +// public Method apply( Map.Entry<Method, MixinModel> entry ) +// { +// return entry.getKey(); +// } +// }, filter( new Predicate<Map.Entry<Method, MixinModel>>() +// { +// @Override +// public boolean test( Map.Entry<Method, MixinModel> item ) +// { +// MixinModel model = item.getValue(); +// return model.mixinClass().equals( mixinClass ); +// } +// }, methodImplementation.entrySet() ) ); } private class Uses http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/SideEffectsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/SideEffectsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/SideEffectsModel.java index 888ec22..26d2afa 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/SideEffectsModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/SideEffectsModel.java @@ -19,6 +19,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Stream; import org.apache.zest.api.sideeffect.SideEffectsDescriptor; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.Iterables; @@ -43,9 +44,10 @@ public final class SideEffectsModel } @Override - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { - return Iterables.flattenIterables( Iterables.map( Dependencies.DEPENDENCIES_FUNCTION, sideEffectModels ) ); + return sideEffectModels.stream().flatMap( Dependencies::dependencies ); +// return Iterables.flattenIterables( Iterables.map( Dependencies.DEPENDENCIES_FUNCTION, sideEffectModels ) ); } // Context http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateModel.java index a0b17cb..1ad5088 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateModel.java @@ -18,6 +18,7 @@ package org.apache.zest.runtime.composite; import java.lang.reflect.AccessibleObject; +import java.util.stream.Stream; import org.apache.zest.api.common.QualifiedName; import org.apache.zest.api.composite.StateDescriptor; import org.apache.zest.functional.HierarchicalVisitor; @@ -58,7 +59,7 @@ public class StateModel } @Override - public Iterable<PropertyModel> properties() + public Stream<PropertyModel> properties() { return propertiesModel.properties(); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java index e834262..6e84bf0 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientBuilderInstance.java @@ -84,10 +84,10 @@ public final class TransientBuilderInstance<T> throws ConstructionException { // Set correct info's (immutable) on the state - for( PropertyDescriptor propertyDescriptor : model.model().state().properties() ) + model.model().state().properties().forEach( propertyDescriptor -> { - ( (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() ) ).setPropertyInfo( (PropertyInfo) propertyDescriptor ); - } + ( (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() ) ).setPropertyInfo( propertyDescriptor ); + } ); model.model().checkConstraints( state ); http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java index 924ecb7..384f4fc 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientClassLoader.java @@ -19,6 +19,9 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; +import org.apache.zest.api.entity.Lifecycle; +import org.apache.zest.api.mixin.Initializable; +import org.apache.zest.api.util.Methods; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; @@ -26,12 +29,9 @@ import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; -import org.apache.zest.api.entity.Lifecycle; -import org.apache.zest.api.mixin.Initializable; -import org.apache.zest.api.util.Classes; -import org.apache.zest.api.util.Methods; -import org.apache.zest.functional.Iterables; +import static org.apache.zest.api.util.Classes.RAW_CLASS; +import static org.apache.zest.api.util.Classes.interfacesOf; import static org.objectweb.asm.Opcodes.AASTORE; import static org.objectweb.asm.Opcodes.ACC_PRIVATE; import static org.objectweb.asm.Opcodes.ACC_PUBLIC; @@ -71,7 +71,6 @@ import static org.objectweb.asm.Opcodes.POP; import static org.objectweb.asm.Opcodes.PUTSTATIC; import static org.objectweb.asm.Opcodes.RETURN; import static org.objectweb.asm.Type.getInternalName; -import static org.apache.zest.api.util.Classes.interfacesOf; /** * Generate subclasses of classes used for transients. All methods delegate to CompositeInvoker. @@ -88,13 +87,13 @@ import static org.apache.zest.api.util.Classes.interfacesOf; String jdkString = System.getProperty( "java.specification.version" ); switch( jdkString ) { - case "1.8": - JDK_VERSION = Opcodes.V1_8; - break; - case "1.7": - default: - JDK_VERSION = Opcodes.V1_7; - break; + case "1.8": + JDK_VERSION = Opcodes.V1_8; + break; + case "1.7": + default: + JDK_VERSION = Opcodes.V1_7; + break; } } @@ -439,14 +438,7 @@ import static org.apache.zest.api.util.Classes.interfacesOf; private static boolean isOverloaded( Method method, Class baseClass ) { - if( Modifier.isFinal( method.getModifiers() ) ) - { - return false; // Cannot override final methods - } - else - { - return true; - } + return !Modifier.isFinal( method.getModifiers() ); } private static boolean isInternalZestMethod( Method method, Class baseClass ) @@ -473,33 +465,29 @@ import static org.apache.zest.api.util.Classes.interfacesOf; } } - private static Class getInterfaceMethodDeclaration( Method method, Class clazz ) + private static Class<?> getInterfaceMethodDeclaration( Method method, Class clazz ) throws NoSuchMethodException { - Iterable<Class<?>> interfaces = Iterables.map( Classes.RAW_CLASS, interfacesOf( clazz ) ); - for( Class<?> anInterface : interfaces ) - { + return interfacesOf( clazz ).map( RAW_CLASS ).filter( intFace -> { try { - anInterface.getMethod( method.getName(), method.getParameterTypes() ); - return anInterface; + intFace.getMethod( method.getName(), method.getParameterTypes() ); + return true; } catch( NoSuchMethodException e ) { // Try next + return false; } - } - - throw new NoSuchMethodException( method.getName() ); + } ).findFirst().orElseThrow( () -> new NoSuchMethodException( method.getName() ) ); } private static boolean isInterfaceMethod( Method method, Class<?> baseClass ) { - for( Class<?> aClass : Iterables.filter( Methods.HAS_METHODS, Iterables.map( Classes.RAW_CLASS, interfacesOf( baseClass ) ) ) ) - { + return interfacesOf( baseClass ).map( RAW_CLASS ).filter( Methods.HAS_METHODS ).anyMatch( clazz -> { try { - Method m = aClass.getMethod( method.getName(), method.getParameterTypes() ); + Method m = clazz.getMethod( method.getName(), method.getParameterTypes() ); m.setAccessible( true ); return true; } @@ -507,8 +495,8 @@ import static org.apache.zest.api.util.Classes.interfacesOf; { // Ignore } - } - return false; + return false; + } ); } private static void type( MethodVisitor mv, Class<?> aClass ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java index df15d5c..5531d52 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientInstance.java @@ -20,6 +20,7 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; +import java.util.stream.Stream; import org.apache.zest.api.ZestAPI; import org.apache.zest.api.composite.Composite; import org.apache.zest.api.composite.CompositeInstance; @@ -102,7 +103,7 @@ public class TransientInstance } @Override - public Iterable<Class<?>> types() + public Stream<Class<?>> types() { return compositeModel.types(); } @@ -213,7 +214,7 @@ public class TransientInstance String modelTypeName = compositeModel.getClass().getSimpleName(); String metaTypeModel = modelTypeName.substring( 0, modelTypeName.length() - 5 ); return metaTypeModel + "Instance{" + - "mixins=" + ( mixins == null ? null : Arrays.asList( mixins ) ) + + "mixins=" + Arrays.asList( mixins ) + ", state=" + state + ", compositeModel=" + compositeModel + ", module=" + moduleInstance + http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java index 0d0ecac..cc3d343 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientModel.java @@ -14,22 +14,21 @@ package org.apache.zest.runtime.composite; +import java.util.List; import org.apache.zest.api.common.MetaInfo; import org.apache.zest.api.common.Visibility; import org.apache.zest.api.composite.TransientDescriptor; import org.apache.zest.api.constraint.ConstraintViolationException; import org.apache.zest.runtime.injection.InjectionContext; -import org.apache.zest.runtime.property.PropertyModel; import org.apache.zest.spi.module.ModuleSpi; /** * Model for Transient Composites */ -public class TransientModel - extends CompositeModel +public class TransientModel extends CompositeModel implements TransientDescriptor { - public TransientModel( Iterable<Class<?>> types, final Visibility visibility, + public TransientModel( List<Class<?>> types, final Visibility visibility, final MetaInfo metaInfo, final MixinsModel mixinsModel, final StateModel stateModel, @@ -62,9 +61,8 @@ public class TransientModel public void checkConstraints( TransientStateInstance instanceState ) throws ConstraintViolationException { - for( PropertyModel propertyModel : stateModel.properties() ) - { - propertyModel.checkConstraints( instanceState.<Object>propertyFor( propertyModel.accessor() ).get() ); - } + stateModel.properties().forEach( propertyModel -> + propertyModel.checkConstraints( instanceState.propertyFor( propertyModel.accessor() ).get() ) + ); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java index 14d0901..13f3853 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientStateInstance.java @@ -20,6 +20,7 @@ package org.apache.zest.runtime.composite; import java.lang.reflect.AccessibleObject; import java.util.Map; +import java.util.stream.Stream; import org.apache.zest.api.property.Property; import org.apache.zest.api.property.StateHolder; @@ -53,8 +54,8 @@ public final class TransientStateInstance } @Override - public Iterable<Property<?>> properties() + public Stream<Property<?>> properties() { - return properties.values(); + return properties.values().stream(); } } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java index 102719e..42a34cb 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/TransientsModel.java @@ -15,6 +15,8 @@ package org.apache.zest.runtime.composite; import java.util.List; +import java.util.stream.Stream; +import org.apache.zest.api.composite.TransientDescriptor; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.VisitableHierarchy; @@ -31,9 +33,9 @@ public class TransientsModel this.transientModels = transientModels; } - public Iterable<TransientModel> models() + public Stream<TransientModel> models() { - return transientModels; + return transientModels.stream(); } @Override @@ -52,4 +54,9 @@ public class TransientsModel } return modelVisitor.visitLeave( this ); } + + public Stream<? extends TransientDescriptor> stream() + { + return transientModels.stream(); + } } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java index 56deeb7..7106515 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntitiesModel.java @@ -15,6 +15,8 @@ package org.apache.zest.runtime.entity; import java.util.List; +import java.util.stream.Stream; +import org.apache.zest.api.entity.EntityDescriptor; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.VisitableHierarchy; @@ -31,9 +33,9 @@ public class EntitiesModel this.entityModels = entityModels; } - public Iterable<EntityModel> models() + public Stream<EntityModel> models() { - return entityModels; + return entityModels.stream(); } @Override @@ -52,4 +54,9 @@ public class EntitiesModel } return modelVisitor.visitLeave( this ); } + + public Stream<? extends EntityDescriptor> stream() + { + return entityModels.stream(); + } } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java index 8512a87..de3013e 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityInstance.java @@ -17,13 +17,11 @@ package org.apache.zest.runtime.entity; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.HashSet; -import java.util.Set; -import org.apache.zest.api.association.Association; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.zest.api.association.AssociationDescriptor; import org.apache.zest.api.association.AssociationStateDescriptor; -import org.apache.zest.api.association.ManyAssociation; -import org.apache.zest.api.association.NamedAssociation; import org.apache.zest.api.composite.CompositeDescriptor; import org.apache.zest.api.composite.CompositeInstance; import org.apache.zest.api.constraint.ConstraintViolationException; @@ -41,6 +39,8 @@ import org.apache.zest.spi.entity.EntityState; import org.apache.zest.spi.entity.EntityStatus; import org.apache.zest.spi.module.ModuleSpi; +import static java.util.stream.Collectors.toList; + /** * Entity instance */ @@ -128,7 +128,7 @@ public final class EntityInstance } @Override - public Iterable<Class<?>> types() + public Stream<Class<?>> types() { return entityModel.types(); } @@ -268,50 +268,27 @@ public final class EntityInstance { // Calculate aggregated Entities AssociationStateDescriptor stateDescriptor = entityModel.state(); - Set<Object> aggregatedEntities = new HashSet<>(); - Iterable<? extends AssociationDescriptor> associations = stateDescriptor.associations(); - for( AssociationDescriptor association : associations ) - { - if( association.isAggregated() ) - { - Association<?> assoc = state.associationFor( association.accessor() ); - Object aggregatedEntity = assoc.get(); - if( aggregatedEntity != null ) - { - aggregatedEntities.add( aggregatedEntity ); - } - } - } - Iterable<? extends AssociationDescriptor> manyAssociations = stateDescriptor.manyAssociations(); - for( AssociationDescriptor association : manyAssociations ) - { - if( association.isAggregated() ) - { - ManyAssociation<?> manyAssoc = state.manyAssociationFor( association.accessor() ); - for( Object entity : manyAssoc ) - { - aggregatedEntities.add( entity ); - } - } - } - Iterable<? extends AssociationDescriptor> namedAssociations = stateDescriptor.namedAssociations(); - for( AssociationDescriptor association : namedAssociations ) - { - if( association.isAggregated() ) - { - NamedAssociation<?> namedAssoc = state.namedAssociationFor( association.accessor() ); - for( String name : namedAssoc ) - { - aggregatedEntities.add( namedAssoc.get( name ) ); - } - } - } - - // Remove aggregated Entities - for( Object aggregatedEntity : aggregatedEntities ) - { - unitOfWork.remove( aggregatedEntity ); - } + Stream.concat( + stateDescriptor.associations() + .filter( AssociationDescriptor::isAggregated ) + .map( association -> state.associationFor( association.accessor() ).get() ) + .filter( entity -> entity != null ), + + Stream.concat( + stateDescriptor.manyAssociations() + .filter( AssociationDescriptor::isAggregated ) + .flatMap( association -> state.manyAssociationFor( association.accessor() ).toList().stream() ) + .filter( entity -> entity != null ), + + stateDescriptor.namedAssociations() + .filter( AssociationDescriptor::isAggregated ) + .flatMap( association -> state.namedAssociationFor( association.accessor() ) + .toMap() + .values() + .stream() ) + .filter( entity -> entity != null ) + ) + ).distinct().forEach( unitOfWork::remove ); } public void checkConstraints() @@ -322,8 +299,8 @@ public final class EntityInstance } catch( ConstraintViolationException e ) { - throw new ConstraintViolationException( identity.identity(), entityModel.types(), e.mixinTypeName(), e.methodName(), e - .constraintViolations() ); + List<Class<?>> entityModelList = entityModel.types().collect( toList() ); + throw new ConstraintViolationException( identity.identity(), entityModelList, e.mixinTypeName(), e.methodName(), e.constraintViolations() ); } } } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityModel.java index aa45b18..8079507 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityModel.java @@ -15,6 +15,7 @@ package org.apache.zest.runtime.entity; import java.lang.reflect.Method; +import java.util.List; import org.apache.zest.api.association.AssociationDescriptor; import org.apache.zest.api.common.ConstructionException; import org.apache.zest.api.common.MetaInfo; @@ -29,7 +30,6 @@ import org.apache.zest.api.property.PropertyDescriptor; import org.apache.zest.api.property.StateHolder; import org.apache.zest.api.unitofwork.EntityCompositeAlreadyExistsException; import org.apache.zest.api.util.Annotations; -import org.apache.zest.functional.Iterables; import org.apache.zest.runtime.composite.CompositeMethodsModel; import org.apache.zest.runtime.composite.CompositeModel; import org.apache.zest.runtime.property.PropertyModel; @@ -40,16 +40,10 @@ import org.apache.zest.spi.entitystore.EntityStoreException; import org.apache.zest.spi.entitystore.EntityStoreUnitOfWork; import org.apache.zest.spi.module.ModuleSpi; -import static org.apache.zest.functional.Iterables.filter; -import static org.apache.zest.functional.Iterables.first; -import static org.apache.zest.functional.Iterables.flattenIterables; -import static org.apache.zest.functional.Iterables.map; - /** * JAVADOC */ -public final class EntityModel - extends CompositeModel +public final class EntityModel extends CompositeModel implements EntityDescriptor { private static final Method IDENTITY_METHOD; @@ -68,7 +62,7 @@ public final class EntityModel private final boolean queryable; - public EntityModel( Iterable<Class<?>> types, + public EntityModel( List<Class<?>> types, Visibility visibility, MetaInfo info, EntityMixinsModel mixinsModel, @@ -78,10 +72,12 @@ public final class EntityModel { super( types, visibility, info, mixinsModel, stateModel, compositeMethodsModel ); - final Queryable queryable = first( Iterables.<Queryable>cast( - filter( Annotations.isType( Queryable.class ), - flattenIterables( map( Annotations.ANNOTATIONS_OF, types ) ) ) ) ); - this.queryable = queryable == null || queryable.value(); + this.queryable = types.stream() + .flatMap( Annotations.ANNOTATIONS_OF ) + .filter( Annotations.isType( Queryable.class ) ) + .map( annot -> ( (Queryable) annot ).value() ) + .findFirst() + .orElse( false ); } @Override @@ -98,8 +94,7 @@ public final class EntityModel public EntityInstance newInstance( ModuleUnitOfWork uow, ModuleSpi moduleInstance, EntityState state ) { - EntityInstance instance = new EntityInstance( uow, moduleInstance, this, state ); - return instance; + return new EntityInstance( uow, moduleInstance, this, state ); } public Object[] newMixinHolder() @@ -143,28 +138,24 @@ public final class EntityModel public void initState( ModuleSpi module, EntityState entityState ) { // Set new properties to default value - for( PropertyModel propertyDescriptor : state().properties() ) - { + state().properties().forEach( propertyDescriptor -> { entityState.setPropertyValue( propertyDescriptor.qualifiedName(), propertyDescriptor.initialValue( module ) ); - } + } ); // Set new associations to null - for( AssociationDescriptor associationDescriptor : state().associations() ) - { + state().associations().forEach( associationDescriptor -> { entityState.setAssociationValue( associationDescriptor.qualifiedName(), null ); - } + } ); // Set new many-associations to empty - for( AssociationDescriptor associationDescriptor : state().manyAssociations() ) - { + state().manyAssociations().forEach( associationDescriptor -> { entityState.manyAssociationValueOf( associationDescriptor.qualifiedName() ); - } + } ); // Set new named-associations to empty - for( AssociationDescriptor associationDescriptor : state().namedAssociations() ) - { + state().namedAssociations().forEach( associationDescriptor -> { entityState.namedAssociationValueOf( associationDescriptor.qualifiedName() ); - } + } ); } public void invokeLifecycle( boolean create, Object[] mixins, CompositeInstance instance, StateHolder state ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateInstance.java index 82a511b..9ab2326 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateInstance.java @@ -24,18 +24,15 @@ import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; -import java.util.function.Function; +import java.util.stream.Stream; import org.apache.zest.api.association.Association; -import org.apache.zest.api.association.AssociationDescriptor; import org.apache.zest.api.association.AssociationStateHolder; import org.apache.zest.api.association.ManyAssociation; import org.apache.zest.api.association.NamedAssociation; import org.apache.zest.api.entity.EntityReference; import org.apache.zest.api.property.Property; -import org.apache.zest.api.property.PropertyDescriptor; import org.apache.zest.api.unitofwork.UnitOfWork; import org.apache.zest.api.util.Classes; -import org.apache.zest.functional.Iterables; import org.apache.zest.runtime.association.AssociationInstance; import org.apache.zest.runtime.association.AssociationModel; import org.apache.zest.runtime.association.ManyAssociationInstance; @@ -98,16 +95,9 @@ public final class EntityStateInstance } @Override - public Iterable<Property<?>> properties() + public Stream<Property<?>> properties() { - return Iterables.map( new Function<PropertyDescriptor, Property<?>>() - { - @Override - public Property<?> apply( PropertyDescriptor propertyDescriptor ) - { - return propertyFor( propertyDescriptor.accessor() ); - } - }, stateModel.properties() ); + return stateModel.properties().map( descriptor -> propertyFor( descriptor.accessor() ) ); } @Override @@ -127,20 +117,20 @@ public final class EntityStateInstance : associationModel, entityFunction, new Property<EntityReference>() - { - @Override - public EntityReference get() - { - return entityState.associationValueOf( associationModel.qualifiedName() ); - } - - @Override - public void set( EntityReference newValue ) - throws IllegalArgumentException, IllegalStateException { - entityState.setAssociationValue( associationModel.qualifiedName(), newValue ); - } - } ); + @Override + public EntityReference get() + { + return entityState.associationValueOf( associationModel.qualifiedName() ); + } + + @Override + public void set( EntityReference newValue ) + throws IllegalArgumentException, IllegalStateException + { + entityState.setAssociationValue( associationModel.qualifiedName(), newValue ); + } + } ); state.put( accessor, association ); } @@ -148,16 +138,9 @@ public final class EntityStateInstance } @Override - public Iterable<Association<?>> allAssociations() + public Stream<? extends Association<?>> allAssociations() { - return Iterables.map( new Function<AssociationDescriptor, Association<?>>() - { - @Override - public Association<?> apply( AssociationDescriptor associationDescriptor ) - { - return associationFor( associationDescriptor.accessor() ); - } - }, stateModel.associations() ); + return stateModel.associations().map( descriptor -> associationFor( descriptor.accessor() ) ); } @Override @@ -184,16 +167,9 @@ public final class EntityStateInstance } @Override - public Iterable<ManyAssociation<?>> allManyAssociations() + public Stream<ManyAssociation<?>> allManyAssociations() { - return Iterables.map( new Function<AssociationDescriptor, ManyAssociation<?>>() - { - @Override - public ManyAssociation<?> apply( AssociationDescriptor associationDescriptor ) - { - return manyAssociationFor( associationDescriptor.accessor() ); - } - }, stateModel.manyAssociations() ); + return stateModel.manyAssociations().map( descriptor -> manyAssociationFor( descriptor.accessor() ) ); } @Override @@ -220,33 +196,22 @@ public final class EntityStateInstance } @Override - public Iterable<? extends NamedAssociation<?>> allNamedAssociations() + public Stream<? extends NamedAssociation<?>> allNamedAssociations() { - return Iterables.map( new Function<AssociationDescriptor, NamedAssociation<?>>() - { - @Override - public NamedAssociation<?> apply( AssociationDescriptor associationDescriptor ) - { - return namedAssociationFor( associationDescriptor.accessor() ); - } - }, stateModel.namedAssociations() ); + return stateModel.namedAssociations().map( descriptor -> namedAssociationFor( descriptor.accessor() ) ); } public void checkConstraints() { - for( PropertyDescriptor propertyDescriptor : stateModel.properties() ) - { - ConstraintsCheck constraints = (ConstraintsCheck) propertyDescriptor; + stateModel.properties().forEach( propertyDescriptor -> { Property<Object> property = this.propertyFor( propertyDescriptor.accessor() ); - constraints.checkConstraints( property.get() ); - } + propertyDescriptor.checkConstraints( property.get() ); + } ); - for( AssociationDescriptor associationDescriptor : stateModel.associations() ) - { - ConstraintsCheck constraints = (ConstraintsCheck) associationDescriptor; + stateModel.associations().forEach( associationDescriptor -> { Association<Object> association = this.associationFor( associationDescriptor.accessor() ); - constraints.checkConstraints( association.get() ); - } + associationDescriptor.checkConstraints( association.get() ); + } ); // TODO Should ManyAssociations and NamedAssociations be checked too? } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateModel.java index 8b9b56e..82952b5 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/entity/EntityStateModel.java @@ -20,6 +20,7 @@ package org.apache.zest.runtime.entity; import java.lang.reflect.AccessibleObject; +import java.util.stream.Stream; import org.apache.zest.api.association.AssociationDescriptor; import org.apache.zest.api.association.AssociationStateDescriptor; import org.apache.zest.api.common.QualifiedName; @@ -117,19 +118,19 @@ public final class EntityStateModel } @Override - public Iterable<AssociationModel> associations() + public Stream<AssociationModel> associations() { return associationsModel.associations(); } @Override - public Iterable<ManyAssociationModel> manyAssociations() + public Stream<ManyAssociationModel> manyAssociations() { return manyAssociationsModel.manyAssociations(); } @Override - public Iterable<NamedAssociationModel> namedAssociations() + public Stream<NamedAssociationModel> namedAssociations() { return namedAssociationsModel.namedAssociations(); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/Dependencies.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/Dependencies.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/Dependencies.java index 4d68cff..55ee4f9 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/Dependencies.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/Dependencies.java @@ -19,20 +19,14 @@ package org.apache.zest.runtime.injection; import java.util.function.Function; +import java.util.stream.Stream; /** * TODO */ public interface Dependencies { - public static Function<Dependencies, Iterable<DependencyModel>> DEPENDENCIES_FUNCTION = new Function<Dependencies, Iterable<DependencyModel>>() - { - @Override - public Iterable<DependencyModel> apply( Dependencies dependencies ) - { - return dependencies.dependencies(); - } - }; + Function<Dependencies, Stream<DependencyModel>> DEPENDENCIES_FUNCTION = Dependencies::dependencies; - Iterable<DependencyModel> dependencies(); + Stream<DependencyModel> dependencies(); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldModel.java index f521e11..349a750 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldModel.java @@ -20,6 +20,8 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.Collection; import java.util.function.Predicate; +import java.util.stream.Stream; +import org.apache.zest.api.composite.DependencyDescriptor; import org.apache.zest.api.composite.InjectedFieldDescriptor; import org.apache.zest.api.util.Classes; import org.apache.zest.bootstrap.BindingException; @@ -36,7 +38,7 @@ import static java.util.Collections.singleton; * JAVADOC */ public final class InjectedFieldModel - implements InjectedFieldDescriptor, VisitableHierarchy<InjectedFieldModel, DependencyModel> + implements InjectedFieldDescriptor, Dependencies, VisitableHierarchy<InjectedFieldModel, DependencyModel> { private DependencyModel dependencyModel; private Field injectedField; @@ -49,9 +51,9 @@ public final class InjectedFieldModel } @Override - public DependencyModel dependency() + public Stream<DependencyModel> dependencies() { - return dependencyModel; + return Stream.of( dependencyModel ); } @Override @@ -60,6 +62,12 @@ public final class InjectedFieldModel return injectedField; } + @Override + public DependencyDescriptor dependency() + { + return dependencyModel; + } + public void bind( Resolution resolution ) throws BindingException { @@ -80,7 +88,11 @@ public final class InjectedFieldModel catch( IllegalArgumentException e ) { String valueClassName; - if( Proxy.isProxyClass( value.getClass() ) ) + if( value == null ) + { + valueClassName = "<null>"; + } + else if( Proxy.isProxyClass( value.getClass() ) ) { InvocationHandler invocationHandler = Proxy.getInvocationHandler( value ); if( invocationHandler instanceof TransientInstance ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldsModel.java index 0767282..18126eb 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldsModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedFieldsModel.java @@ -20,21 +20,18 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -import java.util.function.Function; +import java.util.stream.Stream; import org.apache.zest.api.injection.InjectionScope; import org.apache.zest.api.util.Classes; import org.apache.zest.api.util.Fields; import org.apache.zest.functional.HierarchicalVisitor; -import org.apache.zest.functional.Iterables; import org.apache.zest.functional.VisitableHierarchy; import static org.apache.zest.api.util.Annotations.hasAnnotation; import static org.apache.zest.api.util.Annotations.type; -import static org.apache.zest.functional.Iterables.filter; -import static org.apache.zest.functional.Iterables.first; -import static org.apache.zest.functional.Iterables.iterable; -import static org.apache.zest.functional.Specifications.translate; +import static org.apache.zest.runtime.legacy.Specifications.translate; /** * JAVADOC @@ -42,20 +39,17 @@ import static org.apache.zest.functional.Specifications.translate; public final class InjectedFieldsModel implements Dependencies, VisitableHierarchy<Object, Object> { - private final List<InjectedFieldModel> fields = new ArrayList<InjectedFieldModel>(); + private final List<InjectedFieldModel> fields = new ArrayList<>(); public InjectedFieldsModel( Class fragmentClass ) { - Iterable<Field> mappedFields = Fields.FIELDS_OF.apply( fragmentClass ); - for( Field field : mappedFields ) - { - Annotation injectionAnnotation = first( filter( translate( type(), hasAnnotation( InjectionScope.class ) ), iterable( field - .getAnnotations() ) ) ); - if( injectionAnnotation != null ) - { - addModel( fragmentClass, field, injectionAnnotation ); - } - } + Fields.fieldsOf( fragmentClass ).forEach( field -> + Arrays.stream( field.getAnnotations() ) + .filter( translate( type(), hasAnnotation( InjectionScope.class ) ) ) + .filter( annot -> annot != null ) + .forEach( injectionAnnotation -> addModel( fragmentClass, field, injectionAnnotation ) + ) + ); } private void addModel( Class fragmentClass, Field field, Annotation injectionAnnotation ) @@ -85,16 +79,17 @@ public final class InjectedFieldsModel } @Override - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { - return Iterables.map( new Function<InjectedFieldModel, DependencyModel>() - { - @Override - public DependencyModel apply( InjectedFieldModel injectedFieldModel ) - { - return injectedFieldModel.dependency(); - } - }, fields ); + return fields.stream().flatMap( Dependencies::dependencies ); +// return Iterables.map( new Function<InjectedFieldModel, DependencyModel>() +// { +// @Override +// public DependencyModel apply( InjectedFieldModel injectedFieldModel ) +// { +// return injectedFieldModel.dependency(); +// } +// }, fields ); } @Override http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodModel.java index b0ec660..bdb8d22 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodModel.java @@ -16,6 +16,7 @@ package org.apache.zest.runtime.injection; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.stream.Stream; import org.apache.zest.api.composite.InjectedMethodDescriptor; import org.apache.zest.bootstrap.InjectionException; import org.apache.zest.functional.HierarchicalVisitor; @@ -45,7 +46,7 @@ public final class InjectedMethodModel } @Override - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { return parameters.dependencies(); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodsModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodsModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodsModel.java index 864143e..d4c5d06 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodsModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedMethodsModel.java @@ -15,26 +15,23 @@ package org.apache.zest.runtime.injection; import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; import org.apache.zest.api.injection.InjectionScope; import org.apache.zest.api.util.Annotations; import org.apache.zest.api.util.Classes; import org.apache.zest.api.util.Methods; import org.apache.zest.functional.HierarchicalVisitor; -import org.apache.zest.functional.Specifications; +import org.apache.zest.runtime.legacy.Specifications; import org.apache.zest.functional.VisitableHierarchy; import static org.apache.zest.api.util.Annotations.hasAnnotation; -import static org.apache.zest.functional.Iterables.filter; -import static org.apache.zest.functional.Iterables.first; -import static org.apache.zest.functional.Iterables.flattenIterables; -import static org.apache.zest.functional.Iterables.iterable; -import static org.apache.zest.functional.Iterables.map; /** * JAVADOC @@ -43,57 +40,70 @@ public final class InjectedMethodsModel implements Dependencies, VisitableHierarchy<Object, Object> { // Model - private final List<InjectedMethodModel> methodModels = new ArrayList<InjectedMethodModel>(); + private final List<InjectedMethodModel> methodModels = new ArrayList<>(); public InjectedMethodsModel( Class fragmentClass ) { - nextMethod: - for( Method method : Methods.METHODS_OF.apply( fragmentClass ) ) - { + Methods.methodsOf( fragmentClass ).forEach( method -> { Annotation[][] parameterAnnotations = method.getParameterAnnotations(); if( parameterAnnotations.length > 0 ) { InjectedParametersModel parametersModel = new InjectedParametersModel(); final Type[] genericParameterTypes = method.getGenericParameterTypes(); + boolean found = true; for( int i = 0; i < parameterAnnotations.length; i++ ) { - Annotation injectionAnnotation = first( filter( Specifications.translate( Annotations.type(), hasAnnotation( InjectionScope.class ) ), iterable( parameterAnnotations[ i ] ) ) ); - if( injectionAnnotation == null ) - { - continue nextMethod; - } - - Type genericType = genericParameterTypes[ i ]; - if( genericType instanceof ParameterizedType ) + Optional<Annotation> opt = Arrays.stream( parameterAnnotations[ i ] ) + .filter( Specifications.translate( Annotations.type(), hasAnnotation( InjectionScope.class ) ) ) + .findFirst(); + if( opt.isPresent() ) { - genericType = new ParameterizedTypeInstance( ( (ParameterizedType) genericType ).getActualTypeArguments(), ( (ParameterizedType) genericType ) - .getRawType(), ( (ParameterizedType) genericType ).getOwnerType() ); - - for( int j = 0; j < ( (ParameterizedType) genericType ).getActualTypeArguments().length; j++ ) + Annotation injectionAnnotation = opt.get(); + Type genericType = genericParameterTypes[ i ]; + if( genericType instanceof ParameterizedType ) { - Type type = ( (ParameterizedType) genericType ).getActualTypeArguments()[ j ]; - if( type instanceof TypeVariable ) + genericType = createParameterizedTypeInstance( (ParameterizedType) genericType ); + + for( int j = 0; j < ( (ParameterizedType) genericType ).getActualTypeArguments().length; j++ ) { - type = Classes.resolveTypeVariable( (TypeVariable) type, method.getDeclaringClass(), fragmentClass ); - ( (ParameterizedType) genericType ).getActualTypeArguments()[ j ] = type; + Type type = ( (ParameterizedType) genericType ).getActualTypeArguments()[ j ]; + if( type instanceof TypeVariable ) + { + type = Classes.resolveTypeVariable( (TypeVariable) type, method.getDeclaringClass(), fragmentClass ); + ( (ParameterizedType) genericType ).getActualTypeArguments()[ j ] = type; + } } } + boolean optional = DependencyModel.isOptional( injectionAnnotation, parameterAnnotations[ i ] ); + DependencyModel dependencyModel = new DependencyModel( injectionAnnotation, genericType, fragmentClass, optional, parameterAnnotations[ i ] ); + parametersModel.addDependency( dependencyModel ); } - - boolean optional = DependencyModel.isOptional( injectionAnnotation, parameterAnnotations[ i ] ); - DependencyModel dependencyModel = new DependencyModel( injectionAnnotation, genericType, fragmentClass, optional, parameterAnnotations[ i ] ); - parametersModel.addDependency( dependencyModel ); + else + { + found = false; + break; + } + } + if( found ) + { + methodModels.add( new InjectedMethodModel( method, parametersModel ) ); } - InjectedMethodModel methodModel = new InjectedMethodModel( method, parametersModel ); - methodModels.add( methodModel ); } - } + } ); + } + + private Type createParameterizedTypeInstance( ParameterizedType genericType ) + { + return new ParameterizedTypeInstance( + genericType.getActualTypeArguments(), genericType.getRawType(), genericType.getOwnerType() + ); } @Override - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { - return flattenIterables( map( Dependencies.DEPENDENCIES_FUNCTION, methodModels ) ); + return methodModels.stream().flatMap( InjectedMethodModel::dependencies ); +// return flattenIterables( map( Dependencies.DEPENDENCIES_FUNCTION, methodModels ) ); } // Context http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedParametersModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedParametersModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedParametersModel.java index 1a4c723..91aeeb7 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedParametersModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/InjectedParametersModel.java @@ -18,9 +18,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.function.Predicate; +import java.util.stream.Stream; import org.apache.zest.api.composite.InjectedParametersDescriptor; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.VisitableHierarchy; +import org.apache.zest.runtime.composite.ConstructorModel; /** * JAVADOC @@ -36,9 +38,9 @@ public final class InjectedParametersModel } @Override - public Iterable<DependencyModel> dependencies() + public Stream<DependencyModel> dependencies() { - return parameterDependencies; + return parameterDependencies.stream(); } // Context http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/InjectionProviderFactoryStrategy.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/InjectionProviderFactoryStrategy.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/InjectionProviderFactoryStrategy.java index 8d87bb9..05a5fa4 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/InjectionProviderFactoryStrategy.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/InjectionProviderFactoryStrategy.java @@ -35,16 +35,14 @@ import org.apache.zest.runtime.injection.InjectionProvider; import org.apache.zest.runtime.injection.InjectionProviderFactory; import org.apache.zest.runtime.model.Resolution; -import static org.apache.zest.functional.Iterables.first; - /** * JAVADOC */ public final class InjectionProviderFactoryStrategy implements InjectionProviderFactory { - private final Map<Class<? extends Annotation>, InjectionProviderFactory> generalProviderFactories = new HashMap<Class<? extends Annotation>, InjectionProviderFactory>(); - private final Map<Class<? extends Annotation>, InjectionProviderFactory> valuesProviderFactories = new HashMap<Class<? extends Annotation>, InjectionProviderFactory>(); + private final Map<Class<? extends Annotation>, InjectionProviderFactory> generalProviderFactories = new HashMap<>(); + private final Map<Class<? extends Annotation>, InjectionProviderFactory> valuesProviderFactories = new HashMap<>(); private MetaInfo metaInfo; public InjectionProviderFactoryStrategy( MetaInfo metaInfo ) @@ -82,7 +80,7 @@ public final class InjectionProviderFactoryStrategy } } ModelDescriptor composite = resolution.model(); - Class<?> compositeType = first( composite.types() ); + Class<?> compositeType = composite.types().findFirst().orElse( null ); if( factory1 != null && ValueComposite.class.isAssignableFrom( compositeType ) ) { throw new InvalidValueCompositeException( "@" + injectionAnnotationType.getSimpleName() + " is not allowed in ValueComposites: " + compositeType ); http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java index 764d227..9b65780 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java @@ -26,7 +26,7 @@ import org.apache.zest.api.util.Annotations; import org.apache.zest.api.util.Classes; import org.apache.zest.bootstrap.InvalidInjectionException; import org.apache.zest.functional.Iterables; -import org.apache.zest.functional.Specifications; +import org.apache.zest.runtime.legacy.Specifications; import org.apache.zest.runtime.injection.DependencyModel; import org.apache.zest.runtime.injection.InjectionContext; import org.apache.zest.runtime.injection.InjectionProvider; http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ThisInjectionProviderFactory.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ThisInjectionProviderFactory.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ThisInjectionProviderFactory.java index 70c8160..a3e2bf4 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ThisInjectionProviderFactory.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ThisInjectionProviderFactory.java @@ -21,6 +21,9 @@ package org.apache.zest.runtime.injection.provider; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.zest.api.composite.CompositeDescriptor; import org.apache.zest.api.util.Classes; import org.apache.zest.bootstrap.InvalidInjectionException; @@ -32,9 +35,6 @@ import org.apache.zest.runtime.injection.InjectionProvider; import org.apache.zest.runtime.injection.InjectionProviderFactory; import org.apache.zest.runtime.model.Resolution; -import static org.apache.zest.functional.Iterables.first; -import static org.apache.zest.functional.Iterables.iterable; - /** * JAVADOC */ @@ -51,7 +51,7 @@ public final class ThisInjectionProviderFactory // If Composite type then return real type, otherwise use the specified one final Class<?> thisType = dependencyModel.rawInjectionType(); - Iterable<Class<?>> injectionTypes = null; + Stream<Class<?>> injectionTypes; if( Classes.assignableTypeSpecification( thisType ).test( bindingContext.model() ) ) { injectionTypes = bindingContext.model().types(); @@ -59,25 +59,17 @@ public final class ThisInjectionProviderFactory else { CompositeDescriptor acd = ( (CompositeDescriptor) bindingContext.model() ); - for( Class<?> mixinType : acd.mixinTypes() ) - { - if( thisType.isAssignableFrom( mixinType ) ) - { - Iterable<? extends Class<?>> iterable = iterable( thisType ); - injectionTypes = (Iterable<Class<?>>) iterable; - break; - } - } - - if( injectionTypes == null ) - { - throw new InvalidInjectionException( "Composite " + bindingContext.model() - + " does not implement @This type " + thisType.getName() + " in fragment " - + dependencyModel.injectedClass().getName() ); - } + injectionTypes = acd.mixinTypes().filter( thisType::isAssignableFrom ); } - return new ThisInjectionProvider( injectionTypes ); + List<Class<?>> classes = injectionTypes.collect( Collectors.toList() ); + if( classes.size() == 0 ) + { + throw new InvalidInjectionException( "Composite " + bindingContext.model() + + " does not implement @This type " + thisType.getName() + " in fragment " + + dependencyModel.injectedClass().getName() ); + } + return new ThisInjectionProvider( classes ); } else { @@ -85,27 +77,27 @@ public final class ThisInjectionProviderFactory } } - @SuppressWarnings( {"raw", "unchecked"} ) + @SuppressWarnings( { "raw", "unchecked" } ) private static class ThisInjectionProvider implements InjectionProvider { Constructor proxyConstructor; private Class[] interfaces; - private ThisInjectionProvider( Iterable<Class<?>> types ) + private ThisInjectionProvider( List<Class<?>> types ) { try { Class proxyClass; - if( Proxy.class.isAssignableFrom( first( types ) ) ) + Class<?> mainType = types.get( 0 ); + if( Proxy.class.isAssignableFrom( mainType ) ) { - proxyClass = first( types ); + proxyClass = mainType; } else { - Class<?> mainType = first( types ); interfaces = Iterables.toArray( Class.class, Iterables.<Class>cast( types ) ); - proxyClass = ProxyGenerator.createProxyClass(mainType.getClassLoader(), interfaces); + proxyClass = ProxyGenerator.createProxyClass( mainType.getClassLoader(), interfaces ); } proxyConstructor = proxyClass.getConstructor( InvocationHandler.class );
