http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java b/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java index db52048..975e7e2 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/structure/TypeLookup.java @@ -22,37 +22,32 @@ package org.apache.zest.runtime.structure; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.WildcardType; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.zest.api.composite.AmbiguousTypeException; import org.apache.zest.api.composite.ModelDescriptor; import org.apache.zest.api.service.NoSuchServiceException; import org.apache.zest.api.service.ServiceReference; -import org.apache.zest.functional.Specifications; +import org.apache.zest.runtime.legacy.Specifications; import org.apache.zest.runtime.composite.TransientModel; import org.apache.zest.runtime.entity.EntityModel; import org.apache.zest.runtime.object.ObjectModel; import org.apache.zest.runtime.value.ValueModel; import org.apache.zest.spi.module.ModelModule; +import static java.util.stream.Stream.concat; import static org.apache.zest.api.common.Visibility.application; import static org.apache.zest.api.common.Visibility.layer; import static org.apache.zest.api.common.Visibility.module; import static org.apache.zest.api.util.Classes.RAW_CLASS; import static org.apache.zest.api.util.Classes.interfacesOf; import static org.apache.zest.functional.Iterables.cast; -import static org.apache.zest.functional.Iterables.filter; import static org.apache.zest.functional.Iterables.first; -import static org.apache.zest.functional.Iterables.flatten; -import static org.apache.zest.functional.Iterables.flattenIterables; -import static org.apache.zest.functional.Iterables.iterable; -import static org.apache.zest.functional.Iterables.toList; -import static org.apache.zest.functional.Iterables.unique; /** * Central place for Composite Type lookups. @@ -66,7 +61,7 @@ public class TypeLookup private final Map<Class<?>, ModelModule<ObjectModel>> objectModels; private final Map<Class<?>, ModelModule<TransientModel>> transientModels; private final Map<Class<?>, ModelModule<ValueModel>> valueModels; - private final Map<Class<?>, Iterable<ModelModule<EntityModel>>> allEntityModels; + private final Map<Class<?>, List<ModelModule<EntityModel>>> allEntityModels; private final Map<Class<?>, ModelModule<EntityModel>> unambiguousEntityModels; private final Map<Type, ServiceReference<?>> serviceReferences; private final Map<Type, Iterable<ServiceReference<?>>> servicesReferences; @@ -114,7 +109,7 @@ public class TypeLookup if( model == null ) { // Unambiguously and lazily resolve ObjectModel - Iterable<ModelModule<ObjectModel>> flatten = flatten( + Stream<ModelModule<? extends ModelDescriptor>> models = concat( ambiguousTypeCheck( type, findModels( new ExactTypeLookupSpecification( type ), moduleInstance.visibleObjects( module ), @@ -123,16 +118,19 @@ public class TypeLookup moduleInstance.layerInstance() .usedLayersInstance() .visibleObjects() ) ), + ambiguousTypeCheck( type, findModels( new AssignableTypeLookupSpecification( type ), moduleInstance.visibleObjects( module ), - moduleInstance.layerInstance().visibleObjects( layer ), - moduleInstance.layerInstance().visibleObjects( application ), + moduleInstance.layerInstance() + .visibleObjects( layer ), + moduleInstance.layerInstance() + .visibleObjects( application ), moduleInstance.layerInstance() .usedLayersInstance() .visibleObjects() ) ) ); - model = first( flatten ); + model = (ModelModule<ObjectModel>) models.findFirst().orElse( null ); if( model != null ) { @@ -165,34 +163,35 @@ public class TypeLookup if( model == null ) { - // Unambiguously and lazily resolve TransientModel - Iterable<ModelModule<TransientModel>> allModels = flatten( + // Unambiguously and lazily resolve ObjectModel + Stream<ModelModule<? extends ModelDescriptor>> models = concat( ambiguousTypeCheck( type, findModels( new ExactTypeLookupSpecification( type ), moduleInstance.visibleTransients( module ), moduleInstance.layerInstance().visibleTransients( layer ), moduleInstance.layerInstance().visibleTransients( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleTransients() - ) - ), + moduleInstance.layerInstance() + .usedLayersInstance() + .visibleTransients() ) ), ambiguousTypeCheck( type, findModels( new AssignableTypeLookupSpecification( type ), moduleInstance.visibleTransients( module ), - moduleInstance.layerInstance().visibleTransients( layer ), - moduleInstance.layerInstance().visibleTransients( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleTransients() - ) - ) - ); - model = first( allModels ); + moduleInstance.layerInstance() + .visibleTransients( layer ), + moduleInstance.layerInstance() + .visibleTransients( application ), + moduleInstance.layerInstance() + .usedLayersInstance() + .visibleTransients() ) ) ); + + model = (ModelModule<TransientModel>) models.findFirst().orElse( null ); if( model != null ) { transientModels.put( type, model ); } } - return model; } @@ -218,25 +217,29 @@ public class TypeLookup if( model == null ) { - // Unambiguously and lazily resolve ValueModel - Iterable<ModelModule<ValueModel>> flatten = flatten( + // Unambiguously and lazily resolve ObjectModel + Stream<ModelModule<? extends ModelDescriptor>> models = concat( ambiguousTypeCheck( type, findModels( new ExactTypeLookupSpecification( type ), moduleInstance.visibleValues( module ), moduleInstance.layerInstance().visibleValues( layer ), moduleInstance.layerInstance().visibleValues( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleValues() ) ), + moduleInstance.layerInstance() + .usedLayersInstance() + .visibleValues() ) ), + ambiguousTypeCheck( type, findModels( new AssignableTypeLookupSpecification( type ), moduleInstance.visibleValues( module ), - moduleInstance.layerInstance().visibleValues( layer ), - moduleInstance.layerInstance().visibleValues( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleValues() - ) - ) - ); + moduleInstance.layerInstance() + .visibleValues( layer ), + moduleInstance.layerInstance() + .visibleValues( application ), + moduleInstance.layerInstance() + .usedLayersInstance() + .visibleValues() ) ) ); - model = first( flatten ); + model = (ModelModule<ValueModel>) models.findFirst().orElse( null ); if( model != null ) { @@ -272,8 +275,8 @@ public class TypeLookup if( model == null ) { - // Unambiguously and lazily resolve EntityModels - Iterable<ModelModule<EntityModel>> allModels = flatten( + // Unambiguously and lazily resolve ObjectModel + Stream<ModelModule<? extends ModelDescriptor>> models = concat( ambiguousTypeCheck( type, findModels( new ExactTypeLookupSpecification( type ), moduleInstance.visibleEntities( module ), @@ -282,17 +285,19 @@ public class TypeLookup moduleInstance.layerInstance() .usedLayersInstance() .visibleEntities() ) ), + ambiguousTypeCheck( type, findModels( new AssignableTypeLookupSpecification( type ), moduleInstance.visibleEntities( module ), - moduleInstance.layerInstance().visibleEntities( layer ), - moduleInstance.layerInstance().visibleEntities( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleEntities() - ) - ) - ); + moduleInstance.layerInstance() + .visibleEntities( layer ), + moduleInstance.layerInstance() + .visibleEntities( application ), + moduleInstance.layerInstance() + .usedLayersInstance() + .visibleEntities() ) ) ); - model = first( allModels ); + model = (ModelModule<EntityModel>) models.findFirst().orElse( null ); if( model != null ) { @@ -325,35 +330,33 @@ public class TypeLookup * * @return All matching Entity Models */ - @SuppressWarnings( { "raw", "unchecked" } ) /* package */ Iterable<ModelModule<EntityModel>> lookupEntityModels( final Class type ) { - Iterable<ModelModule<EntityModel>> models = allEntityModels.get( type ); - if( models == null ) + List<ModelModule<EntityModel>> result = allEntityModels.get( type ); + if( result == null ) { - // Ambiguously and lasily resolve EntityModels - Iterable<ModelModule<EntityModel>> matchingEntityModels = flatten( + // Unambiguously and lazily resolve ObjectModel + Stream<ModelModule<? extends ModelDescriptor>> models = concat( ambiguousTypeCheck( type, findModels( new ExactTypeLookupSpecification( type ), moduleInstance.visibleEntities( module ), moduleInstance.layerInstance().visibleEntities( layer ), moduleInstance.layerInstance().visibleEntities( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleEntities() - ) - ), + moduleInstance.layerInstance() + .usedLayersInstance() + .visibleEntities() ) ), + findModels( new AssignableTypeLookupSpecification( type ), moduleInstance.visibleEntities( module ), moduleInstance.layerInstance().visibleEntities( layer ), moduleInstance.layerInstance().visibleEntities( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) ); + moduleInstance.layerInstance().usedLayersInstance().visibleEntities() ) + ).distinct(); - // Don't return the same EntityModel multiple times - matchingEntityModels = unique( matchingEntityModels ); - - models = toList( matchingEntityModels ); - allEntityModels.put( type, models ); + result = models.map( m -> (ModelModule<EntityModel>) m ).collect( Collectors.toList() ); + allEntityModels.put( type, result ); } - return models; + return result; } /** @@ -418,7 +421,7 @@ public class TypeLookup if( serviceRefs == null ) { // Lazily resolve ServicesReferences - Iterable<ServiceReference<?>> matchingServices = flatten( + Stream<ServiceReference<?>> matchingServices = concat( findServiceReferences( new ExactTypeLookupSpecification( serviceType ), moduleInstance.visibleServices( module ), moduleInstance.layerInstance().visibleServices( layer ), @@ -428,122 +431,88 @@ public class TypeLookup moduleInstance.visibleServices( module ), moduleInstance.layerInstance().visibleServices( layer ), moduleInstance.layerInstance().visibleServices( application ), - moduleInstance.layerInstance().usedLayersInstance().visibleServices() ) ); - - // Don't return the same ServiceReference multiple times - matchingServices = unique( matchingServices ); - - serviceRefs = toList( matchingServices ); + moduleInstance.layerInstance().usedLayersInstance().visibleServices() ) + ).distinct(); + serviceRefs = matchingServices.collect( Collectors.toList() ); servicesReferences.put( serviceType, serviceRefs ); } return cast( serviceRefs ); } - @SuppressWarnings( { "raw", "unchecked" } ) - private static <T extends ModelDescriptor> Iterable<ModelModule<T>> findModels( Predicate<Iterable<Class<?>>> specification, - Iterable<ModelModule<T>>... models + @SafeVarargs + private static Stream<ModelModule<? extends ModelDescriptor>> findModels( Predicate<Stream<Class<?>>> specification, + Stream<ModelModule<? extends ModelDescriptor>>... models ) { - Predicate<ModelModule<T>> spec = Specifications.translate( new ModelModuleTypesFunction(), specification ); - Iterable<ModelModule<T>> flattened = flattenIterables( iterable( models ) ); - return filter( spec, flattened ); + Function<ModelModule<? extends ModelDescriptor>, Stream<Class<?>>> function = new ModelModuleTypesFunction(); + Predicate<ModelModule<? extends ModelDescriptor>> spec = Specifications.translate( function, specification ); + Stream<ModelModule<? extends ModelDescriptor>> stream = Stream.of( models ).flatMap( flatten -> flatten ); + return stream.filter( spec ); } - @SuppressWarnings( { "raw", "unchecked" } ) - private static Iterable<ServiceReference<?>> findServiceReferences( Predicate<Iterable<Class<?>>> specification, - Iterable<ServiceReference<?>>... references + @SafeVarargs + private static Stream<ServiceReference<?>> findServiceReferences( Predicate<Stream<Class<?>>> specification, + Stream<ServiceReference<?>>... references ) { Predicate<ServiceReference<?>> spec = Specifications.translate( new ServiceReferenceTypesFunction(), specification ); - Iterable<ServiceReference<?>> flattened = flattenIterables( iterable( references ) ); - return filter( spec, flattened ); + return Stream.of( references ).flatMap( flatten -> flatten ).filter( spec ); } /** * Check if the list of models contains several ones with the same visibility. If yes, then * throw an AmbiguousTypeException */ - @SuppressWarnings( "raw" ) - private static <T extends ModelDescriptor> Iterable<ModelModule<T>> ambiguousTypeCheck( final Class type, - final Iterable<ModelModule<T>> models + private static Stream<ModelModule<? extends ModelDescriptor>> ambiguousTypeCheck( final Class<?> type, + Stream<ModelModule<? extends ModelDescriptor>> models ) { - return new Iterable<ModelModule<T>>() - { - - @Override - public Iterator<ModelModule<T>> iterator() - { - ModelModule<T> current = null; - List<ModelModule<T>> ambiguous = null; - List<ModelModule<T>> results = new ArrayList<>(); - for( ModelModule<T> model : models ) - { - if( current != null && !model.equals( current ) ) - { - if( model.model().visibility() == current.model().visibility() ) - { - if( ambiguous == null ) - { - ambiguous = new ArrayList<>(); - } - ambiguous.add( model ); - } - } - else - { - current = model; - } - results.add( model ); - } - if( ambiguous != null ) - { - // Check if we had any ambiguities - ambiguous.add( current ); - throw new AmbiguousTypeException( "More than one type matches " + type.getName() + ":" + ambiguous ); - } - // Ambiguity check done, and no ambiguities found. Return results - return results.iterator(); - } - }; + // TODO: Figure out why AmbiguityFinder doesn't implement Function<ModelModule<T>, ModelModule<T>>, when it clearly says it does. Absurd. + Function<ModelModule<? extends ModelDescriptor>, ModelModule<? extends ModelDescriptor>> ambiguityFinder = new AmbiguityFinder( type ); + return models.map( ambiguityFinder ); } private static class ModelModuleTypesFunction<T extends ModelDescriptor> - implements Function<ModelModule<T>, Iterable<Class<?>>> + implements Function<ModelModule<T>, Stream<Class<?>>> { @Override - public Iterable<Class<?>> apply( ModelModule<T> modelModule ) + public Stream<Class<?>> apply( ModelModule<T> modelModule ) { return modelModule.model().types(); } } private static class ServiceReferenceTypesFunction - implements Function<ServiceReference<?>, Iterable<Class<?>>> + implements Function<ServiceReference<?>, Stream<Class<?>>> { @Override - public Iterable<Class<?>> apply( ServiceReference<?> serviceReference ) + public Stream<Class<?>> apply( ServiceReference<?> serviceReference ) { return serviceReference.types(); } } - private static abstract class AbstractTypeLookupSpecification - implements Predicate<Iterable<Class<?>>> + private static final class ExactTypeLookupSpecification + implements Predicate<Stream<Class<?>>> { protected final Type lookedUpType; - private AbstractTypeLookupSpecification( Type lookedUpType ) + private ExactTypeLookupSpecification( Type lookedUpType ) { this.lookedUpType = lookedUpType; } + protected boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType ) + { + return candidate.equals( lookedUpType ); + } + @Override - public final boolean test( Iterable<Class<?>> types ) + public final boolean test( Stream<Class<?>> types ) { if( lookedUpType instanceof Class ) { @@ -562,15 +531,7 @@ public class TypeLookup return false; } // Then check Bar - for( Type intf : interfacesOf( types ) ) - { - if( intf.equals( lookedUpType ) ) - { - // All parameters are the same - ok! - return true; - } - } - return false; + return interfacesOf( types ).anyMatch( intf -> intf.equals( lookedUpType ) ); } else if( lookedUpType instanceof WildcardType ) { @@ -580,50 +541,90 @@ public class TypeLookup } } - private boolean checkClassMatch( Iterable<Class<?>> candidates, Class<?> lookedUpType ) + private boolean checkClassMatch( Stream<Class<?>> candidates, Class<?> lookedUpType ) { - for( Class<?> candidate : candidates ) - { - if( checkClassMatch( candidate, lookedUpType ) ) - { - return true; - } - } - return false; + return candidates.anyMatch( candidate -> checkClassMatch( candidate, lookedUpType ) ); } - - protected abstract boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType ); } - private static final class ExactTypeLookupSpecification - extends AbstractTypeLookupSpecification + private static final class AssignableTypeLookupSpecification + implements Predicate<Stream<Class<?>>> { - private ExactTypeLookupSpecification( Type lookedupType ) + protected final Type lookedUpType; + + private AssignableTypeLookupSpecification( Type lookedUpType ) { - super( lookedupType ); + this.lookedUpType = lookedUpType; } - @Override protected boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType ) { - return candidate.equals( lookedUpType ); + return !candidate.equals( lookedUpType ) && lookedUpType.isAssignableFrom( candidate ); + } + + @Override + public final boolean test( Stream<Class<?>> types ) + { + if( lookedUpType instanceof Class ) + { + // Straight class assignability check + return checkClassMatch( types, (Class) lookedUpType ); + } + else + { + if( lookedUpType instanceof ParameterizedType ) + { + // Foo<Bar> check + // First check Foo + ParameterizedType parameterizedType = (ParameterizedType) lookedUpType; + if( !checkClassMatch( types, (Class) parameterizedType.getRawType() ) ) + { + return false; + } + // Then check Bar + interfacesOf( types ).anyMatch( intf -> intf.equals( lookedUpType ) ); + } + else if( lookedUpType instanceof WildcardType ) + { + return true; + } + return false; + } + } + + private boolean checkClassMatch( Stream<Class<?>> candidates, Class<?> lookedUpType ) + { + return candidates.anyMatch( candidate -> checkClassMatch( candidate, lookedUpType ) ); } } - private static final class AssignableTypeLookupSpecification - extends AbstractTypeLookupSpecification + private static class AmbiguityFinder<T extends ModelDescriptor> + implements Function<ModelModule<T>, ModelModule<T>> { + private ModelModule<T> current = null; + private final Class<?> type; - private AssignableTypeLookupSpecification( Type lookedupType ) + private AmbiguityFinder( Class<?> type ) { - super( lookedupType ); + this.type = type; } @Override - protected boolean checkClassMatch( Class<?> candidate, Class<?> lookedUpType ) + public ModelModule<T> apply( ModelModule<T> model ) { - return !candidate.equals( lookedUpType ) && lookedUpType.isAssignableFrom( candidate ); + if( current != null && !model.equals( current ) ) + { + if( model.model().visibility() == current.model().visibility() ) + { + throw new AmbiguousTypeException( "More than one type matches " + type.getName() + ": " + current + ", " + model + "]" ); + } + } + else + { + current = model; + } + return current; } } }
http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java index 22f2996..3ebe0d8 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/structure/UsedLayersInstance.java @@ -15,8 +15,9 @@ package org.apache.zest.runtime.structure; import java.util.List; -import java.util.function.Function; +import java.util.stream.Stream; import org.apache.zest.api.common.Visibility; +import org.apache.zest.api.composite.ModelDescriptor; import org.apache.zest.api.composite.TransientDescriptor; import org.apache.zest.api.entity.EntityDescriptor; import org.apache.zest.api.object.ObjectDescriptor; @@ -24,8 +25,6 @@ import org.apache.zest.api.service.ServiceReference; import org.apache.zest.api.value.ValueDescriptor; import org.apache.zest.spi.module.ModelModule; -import static org.apache.zest.functional.Iterables.*; - /** * JAVADOC */ @@ -38,63 +37,33 @@ public final class UsedLayersInstance this.usedLayerInstances = usedLayerInstances; } - /* package */ Iterable<ModelModule<ObjectDescriptor>> visibleObjects() + /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleObjects() { - return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ObjectDescriptor>>>() - { - @Override - public Iterable<ModelModule<ObjectDescriptor>> apply( LayerInstance layerInstance ) - { - return layerInstance.visibleObjects( Visibility.application ); - } - }, usedLayerInstances ) ); + return usedLayerInstances.stream() + .flatMap( layerInstance -> layerInstance.visibleObjects( Visibility.application ) ); } - /* package */ Iterable<ModelModule<TransientDescriptor>> visibleTransients() + /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleTransients() { - return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<TransientDescriptor>>>() - { - @Override - public Iterable<ModelModule<TransientDescriptor>> apply( LayerInstance layerInstance ) - { - return layerInstance.visibleTransients( Visibility.application ); - } - }, usedLayerInstances ) ); + return usedLayerInstances.stream() + .flatMap( layerInstance -> layerInstance.visibleTransients( Visibility.application ) ); } - /* package */ Iterable<ModelModule<EntityDescriptor>> visibleEntities() + /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleEntities() { - return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<EntityDescriptor>>>() - { - @Override - public Iterable<ModelModule<EntityDescriptor>> apply( LayerInstance layerInstance ) - { - return layerInstance.visibleEntities( Visibility.application ); - } - }, usedLayerInstances ) ); + return usedLayerInstances.stream() + .flatMap( layerInstance -> layerInstance.visibleEntities( Visibility.application ) ); } - /* package */ Iterable<ModelModule<ValueDescriptor>> visibleValues() + /* package */ Stream<ModelModule<? extends ModelDescriptor>> visibleValues() { - return flattenIterables( map( new Function<LayerInstance, Iterable<ModelModule<ValueDescriptor>>>() - { - @Override - public Iterable<ModelModule<ValueDescriptor>> apply( LayerInstance layerInstance ) - { - return layerInstance.visibleValues( Visibility.application ); - } - }, usedLayerInstances ) ); + return usedLayerInstances.stream() + .flatMap( layerInstance -> layerInstance.visibleValues( Visibility.application ) ); } - /* package */ Iterable<ServiceReference<?>> visibleServices() + /* package */ Stream<ServiceReference<?>> visibleServices() { - return flattenIterables( map( new Function<LayerInstance, Iterable<ServiceReference<?>>>() - { - @Override - public Iterable<ServiceReference<?>> apply( LayerInstance layerInstance ) - { - return layerInstance.visibleServices( Visibility.application ); - } - }, usedLayerInstances ) ); + return usedLayerInstances.stream() + .flatMap( layerInstance -> layerInstance.visibleServices( Visibility.application ) ); } } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java b/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java index 4626105..6836d34 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java @@ -21,6 +21,8 @@ package org.apache.zest.runtime.types; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; +import java.util.ArrayList; +import java.util.List; import org.apache.zest.api.common.InvalidApplicationException; import org.apache.zest.api.common.MetaInfo; import org.apache.zest.api.common.Visibility; @@ -33,8 +35,6 @@ import org.apache.zest.api.type.ValueType; import org.apache.zest.api.util.Classes; import org.apache.zest.api.value.ValueComposite; import org.apache.zest.functional.HierarchicalVisitorAdapter; -import org.apache.zest.functional.Iterables; -import org.apache.zest.functional.Specifications; import org.apache.zest.runtime.association.AssociationsModel; import org.apache.zest.runtime.association.ManyAssociationsModel; import org.apache.zest.runtime.association.NamedAssociationsModel; @@ -57,7 +57,7 @@ public class ValueTypeFactory return instance; } - @SuppressWarnings( {"raw", "unchecked"} ) + @SuppressWarnings( { "raw", "unchecked" } ) public ValueType newValueType( Type type, Class declaringClass, Class compositeType, @@ -126,7 +126,8 @@ public class ValueTypeFactory { // Create default model MixinsModel mixinsModel = new MixinsModel(); - Iterable valueComposite = (Iterable) Iterables.iterable( ValueComposite.class ); + List<Class<?>> valueComposite = new ArrayList<>(); + valueComposite.add( ValueComposite.class ); ValueStateModel valueStateModel = new ValueStateModel( new PropertiesModel(), new AssociationsModel(), new ManyAssociationsModel(), @@ -158,7 +159,7 @@ public class ValueTypeFactory private static class ValueFinder extends HierarchicalVisitorAdapter<Object, Object, RuntimeException> { - private Class type; + private Class<?> type; private ValueModel foundModel; private Visibility visibility; @@ -199,18 +200,18 @@ public class ValueTypeFactory { return true; } - else if (visited instanceof LayerModel ) + else if( visited instanceof LayerModel ) { return true; } - else if (visited instanceof UsedLayersModel ) + else if( visited instanceof UsedLayersModel ) { return true; } else if( visited instanceof ValueModel ) { ValueModel valueModel = (ValueModel) visited; - boolean typeEquality = Specifications.in( valueModel.types() ).test( type ); + boolean typeEquality = valueModel.types().anyMatch( t -> t.equals( type ) ); if( typeEquality && valueModel.visibility().ordinal() >= visibility.ordinal() ) { foundModel = valueModel; http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java index 2136528..f80f544 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/UnitOfWorkInstance.java @@ -55,7 +55,6 @@ import org.apache.zest.spi.module.ModuleSpi; import static org.apache.zest.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.COMPLETED; import static org.apache.zest.api.unitofwork.UnitOfWorkCallback.UnitOfWorkStatus.DISCARDED; -import static org.apache.zest.functional.Iterables.map; public final class UnitOfWorkInstance { @@ -168,9 +167,9 @@ public final class UnitOfWorkInstance { throw new EntityTypeNotFoundException( mixinType.getName(), module.name(), - map( ModelModule.toStringFunction, - module.findVisibleEntityTypes() - ) ); + module.findVisibleEntityTypes() + .map( ModelModule.toStringFunction ) + ); } } @@ -237,10 +236,7 @@ public final class UnitOfWorkInstance } if( prunedInstances != null ) { - for( EntityReference prunedInstance : prunedInstances ) - { - instanceCache.remove( prunedInstance ); - } + prunedInstances.forEach( instanceCache::remove ); } } } @@ -279,10 +275,7 @@ public final class UnitOfWorkInstance notifyBeforeCompletion( currentCallbacks ); // Commit all changes - for( StateCommitter committer : committers ) - { - committer.commit(); - } + committers.forEach( StateCommitter::commit ); close(); @@ -305,12 +298,7 @@ public final class UnitOfWorkInstance // Call callbacks notifyAfterCompletion( currentCallbacks, DISCARDED ); - - for( EntityStoreUnitOfWork entityStoreUnitOfWork : storeUnitOfWork.values() ) - { - entityStoreUnitOfWork.discard(); - } - + storeUnitOfWork.values().forEach( EntityStoreUnitOfWork::discard ); callbacks = currentCallbacks; } @@ -368,10 +356,7 @@ public final class UnitOfWorkInstance catch( Exception e ) { // Cancel all previously prepared stores - for( StateCommitter committer : committers ) - { - committer.cancel(); - } + committers.forEach( StateCommitter::cancel ); if( e instanceof ConcurrentEntityStateModificationException ) { @@ -381,14 +366,9 @@ public final class UnitOfWorkInstance Collection<EntityComposite> modifiedEntities = new ArrayList<>(); for( EntityReference modifiedEntityIdentity : modifiedEntityIdentities ) { - Collection<EntityInstance> instances = instanceCache.values(); - for( EntityInstance instance : instances ) - { - if( instance.identity().equals( modifiedEntityIdentity ) ) - { - modifiedEntities.add( instance.<EntityComposite>proxy() ); - } - } + instanceCache.values().stream() + .filter( instance -> instance.identity().equals( modifiedEntityIdentity ) ) + .forEach( instance -> modifiedEntities.add( instance.<EntityComposite>proxy() ) ); } throw new ConcurrentEntityModificationException( modifiedEntities ); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java index ceeeb10..9375b50 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderInstance.java @@ -19,10 +19,8 @@ import org.apache.zest.api.composite.Composite; import org.apache.zest.api.value.NoSuchValueException; import org.apache.zest.api.value.ValueBuilder; import org.apache.zest.runtime.composite.StateResolver; -import org.apache.zest.spi.module.ModelModule; import org.apache.zest.runtime.structure.ModuleInstance; - -import static org.apache.zest.functional.Iterables.first; +import org.apache.zest.spi.module.ModelModule; /** * Implementation of ValueBuilder @@ -34,7 +32,10 @@ public final class ValueBuilderInstance<T> private final ModuleInstance currentModule; private final ValueInstance prototypeInstance; - public ValueBuilderInstance( ModelModule<ValueModel> compositeModelModule, ModuleInstance currentModule, StateResolver stateResolver ) + public ValueBuilderInstance( ModelModule<ValueModel> compositeModelModule, + ModuleInstance currentModule, + StateResolver stateResolver + ) { ValueStateInstance state = new ValueStateInstance( compositeModelModule, currentModule, stateResolver ); prototypeInstance = compositeModelModule.model().newValueInstance( compositeModelModule.module(), state ); @@ -65,7 +66,7 @@ public final class ValueBuilderInstance<T> public T newInstance() throws ConstructionException { - Class<Composite> valueType = (Class<Composite>) first( prototypeInstance.types() ); + Class<Composite> valueType = (Class<Composite>) prototypeInstance.types().findFirst().orElse( null ); ModelModule<ValueModel> valueModel = currentModule.typeLookup().lookupValueModel( valueType ); @@ -75,5 +76,4 @@ public final class ValueBuilderInstance<T> } return new ValueBuilderWithPrototype<>( valueModel, currentModule, prototype() ).newInstance(); } - } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java index 3141ac1..c22890e 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueInstance.java @@ -106,31 +106,27 @@ public final class ValueInstance */ public void prepareToBuild() { - for( PropertyModel propertyDescriptor : descriptor().state().properties() ) - { + descriptor().state().properties().forEach( propertyDescriptor -> { PropertyInstance<Object> propertyInstance = (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() ); propertyInstance.prepareToBuild( propertyDescriptor ); - } + } ); - for( AssociationModel associationDescriptor : descriptor().state().associations() ) - { + descriptor().state().associations().forEach( associationDescriptor -> { state().associationFor( associationDescriptor.accessor() ) .setAssociationInfo( associationDescriptor.getBuilderInfo() ); - } + } ); - for( ManyAssociationModel associationDescriptor : descriptor().state().manyAssociations() ) - { + descriptor().state().manyAssociations().forEach( associationDescriptor -> { state().manyAssociationFor( associationDescriptor.accessor() ) .setAssociationInfo( associationDescriptor.getBuilderInfo() ); - } + } ); - for( NamedAssociationModel associationDescriptor : descriptor().state().namedAssociations() ) - { + descriptor().state().namedAssociations().forEach( associationDescriptor -> { state().namedAssociationFor( associationDescriptor.accessor() ) .setAssociationInfo( associationDescriptor.getBuilderInfo() ); - } + } ); } /** @@ -139,27 +135,23 @@ public final class ValueInstance */ public void prepareBuilderState() { - for( PropertyModel propertyDescriptor : descriptor().state().properties() ) - { + descriptor().state().properties().forEach( propertyDescriptor -> { PropertyInstance<Object> propertyInstance = (PropertyInstance<Object>) state.propertyFor( propertyDescriptor.accessor() ); propertyInstance.prepareBuilderState( propertyDescriptor ); - } + } ); - for( AssociationModel associationDescriptor : descriptor().state().associations() ) - { + descriptor().state().associations().forEach( associationDescriptor -> { state().associationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor ); - } + } ); - for( ManyAssociationModel associationDescriptor : descriptor().state().manyAssociations() ) - { + descriptor().state().manyAssociations().forEach( associationDescriptor -> { state().manyAssociationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor ); - } + } ); - for( NamedAssociationModel associationDescriptor : descriptor().state().namedAssociations() ) - { + descriptor().state().namedAssociations().forEach( associationDescriptor -> { state().namedAssociationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor ); - } + } ); } /** http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java index aa8c9b4..5b23765 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueModel.java @@ -14,33 +14,30 @@ package org.apache.zest.runtime.value; +import java.util.List; import org.apache.zest.api.common.MetaInfo; import org.apache.zest.api.common.Visibility; import org.apache.zest.api.constraint.ConstraintViolationException; import org.apache.zest.api.type.ValueCompositeType; import org.apache.zest.api.value.ValueDescriptor; -import org.apache.zest.runtime.association.AssociationModel; -import org.apache.zest.runtime.association.ManyAssociationModel; import org.apache.zest.runtime.composite.CompositeMethodsModel; import org.apache.zest.runtime.composite.CompositeModel; import org.apache.zest.runtime.composite.MixinModel; import org.apache.zest.runtime.composite.MixinsModel; import org.apache.zest.runtime.composite.UsesInstance; import org.apache.zest.runtime.injection.InjectionContext; -import org.apache.zest.runtime.property.PropertyModel; import org.apache.zest.runtime.unitofwork.UnitOfWorkInstance; import org.apache.zest.spi.module.ModuleSpi; /** * Model for ValueComposites */ -public final class ValueModel - extends CompositeModel +public final class ValueModel extends CompositeModel implements ValueDescriptor { private ValueCompositeType valueType; - public ValueModel( final Iterable<Class<?>> types, + public ValueModel( final List<Class<?>> types, final Visibility visibility, final MetaInfo metaInfo, final MixinsModel mixinsModel, @@ -69,25 +66,26 @@ public final class ValueModel void checkConstraints( ValueStateInstance state ) throws ConstraintViolationException { - for( PropertyModel propertyModel : stateModel.properties() ) - { - propertyModel.checkConstraints( state.propertyFor( propertyModel.accessor() ).get() ); - } + stateModel.properties().forEach( propertyModel -> + propertyModel.checkConstraints( state.propertyFor( propertyModel.accessor() ).get() ) + ); // IF no UnitOfWork is active, then the Association checks shouldn't be done. if( UnitOfWorkInstance.getCurrent().empty() ) { return; } - for( AssociationModel associationModel : ( (ValueStateModel) stateModel ).associations() ) - { - associationModel.checkConstraints( state.associationFor( associationModel.accessor() ).get() ); - } + ( (ValueStateModel) stateModel ).associations().forEach( associationModel -> + associationModel.checkConstraints( state.associationFor( associationModel.accessor() ).get() ) + ); - for( ManyAssociationModel associationModel : ( (ValueStateModel) stateModel ).manyAssociations() ) - { - associationModel.checkAssociationConstraints( state.manyAssociationFor( associationModel.accessor() ) ); - } + ( (ValueStateModel) stateModel ).manyAssociations().forEach( associationModel -> + associationModel.checkAssociationConstraints( state.manyAssociationFor( associationModel.accessor() ) ) + ); + + ( (ValueStateModel) stateModel ).namedAssociations().forEach( associationModel -> + associationModel.checkAssociationConstraints( state.namedAssociationFor( associationModel.accessor() ) ) + ); } public ValueInstance newValueInstance( ModuleSpi moduleInstance, http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java index 84a2719..ef0c20b 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java @@ -23,23 +23,18 @@ import java.lang.reflect.AccessibleObject; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.apache.zest.api.association.AssociationDescriptor; +import java.util.stream.Stream; import org.apache.zest.api.association.AssociationStateHolder; import org.apache.zest.api.entity.EntityReference; -import org.apache.zest.api.property.PropertyDescriptor; import org.apache.zest.runtime.association.AssociationInfo; import org.apache.zest.runtime.association.AssociationInstance; -import org.apache.zest.runtime.association.AssociationModel; import org.apache.zest.runtime.association.ManyAssociationInstance; -import org.apache.zest.runtime.association.ManyAssociationModel; import org.apache.zest.runtime.association.NamedAssociationInstance; -import org.apache.zest.runtime.association.NamedAssociationModel; import org.apache.zest.runtime.composite.StateResolver; import org.apache.zest.runtime.property.PropertyInfo; import org.apache.zest.runtime.property.PropertyInstance; -import org.apache.zest.runtime.property.PropertyModel; -import org.apache.zest.spi.module.ModelModule; import org.apache.zest.runtime.structure.ModuleInstance; +import org.apache.zest.spi.module.ModelModule; /** * TODO @@ -66,34 +61,33 @@ public final class ValueStateInstance public ValueStateInstance( ModelModule<ValueModel> compositeModelModule, ModuleInstance currentModule, - StateResolver stateResolver ) + StateResolver stateResolver + ) { ValueModel valueModel = compositeModelModule.model(); this.properties = new LinkedHashMap<>(); - for( PropertyDescriptor propertyDescriptor : valueModel.state().properties() ) - { - PropertyInfo builderInfo = ( (PropertyModel) propertyDescriptor ).getBuilderInfo(); + valueModel.state().properties().forEach( propertyDescriptor -> { + PropertyInfo builderInfo = propertyDescriptor.getBuilderInfo(); Object value = stateResolver.getPropertyState( propertyDescriptor ); PropertyInstance<Object> propertyInstance = new PropertyInstance<>( builderInfo, value ); properties.put( propertyDescriptor.accessor(), propertyInstance ); - } + } ); this.associations = new LinkedHashMap<>(); - for( AssociationDescriptor associationDescriptor : valueModel.state().associations() ) - { - AssociationInfo builderInfo = ( (AssociationModel) associationDescriptor ).getBuilderInfo(); + valueModel.state().associations().forEach( associationDescriptor -> { + AssociationInfo builderInfo = associationDescriptor.getBuilderInfo(); EntityReference value = stateResolver.getAssociationState( associationDescriptor ); AssociationInstance<Object> associationInstance1 = new AssociationInstance<>( builderInfo, currentModule.getEntityFunction(), new ReferenceProperty( value ) ); associations.put( associationDescriptor.accessor(), associationInstance1 ); - } + } ); this.manyAssociations = new LinkedHashMap<>(); - for( AssociationDescriptor associationDescriptor : valueModel.state().manyAssociations() ) - { - AssociationInfo builderInfo = ( (ManyAssociationModel) associationDescriptor ).getBuilderInfo(); + valueModel.state().manyAssociations().forEach( associationDescriptor -> { + AssociationInfo builderInfo = associationDescriptor + .getBuilderInfo(); List<EntityReference> value = stateResolver.getManyAssociationState( associationDescriptor ); ManyAssociationValueState manyAssociationState = new ManyAssociationValueState( value ); ManyAssociationInstance<Object> associationInstance = new ManyAssociationInstance<>( @@ -101,12 +95,12 @@ public final class ValueStateInstance currentModule.getEntityFunction(), manyAssociationState ); manyAssociations.put( associationDescriptor.accessor(), associationInstance ); - } + } ); this.namedAssociations = new LinkedHashMap<>(); - for( AssociationDescriptor associationDescriptor : valueModel.state().namedAssociations() ) - { - AssociationInfo builderInfo = ( (NamedAssociationModel) associationDescriptor ).getBuilderInfo(); + valueModel.state().namedAssociations().forEach( associationDescriptor -> { + AssociationInfo builderInfo = associationDescriptor + .getBuilderInfo(); Map<String, EntityReference> value = stateResolver.getNamedAssociationState( associationDescriptor ); NamedAssociationValueState namedAssociationState = new NamedAssociationValueState( value ); NamedAssociationInstance<Object> associationInstance = new NamedAssociationInstance<>( @@ -114,7 +108,7 @@ public final class ValueStateInstance currentModule.getEntityFunction(), namedAssociationState ); namedAssociations.put( associationDescriptor.accessor(), associationInstance ); - } + } ); } @Override @@ -133,9 +127,9 @@ public final class ValueStateInstance } @Override - public Iterable<PropertyInstance<?>> properties() + public Stream<PropertyInstance<?>> properties() { - return properties.values(); + return properties.values().stream(); } @Override @@ -153,9 +147,9 @@ public final class ValueStateInstance } @Override - public Iterable<AssociationInstance<?>> allAssociations() + public Stream<AssociationInstance<?>> allAssociations() { - return associations.values(); + return associations.values().stream(); } @Override @@ -173,9 +167,9 @@ public final class ValueStateInstance } @Override - public Iterable<ManyAssociationInstance<?>> allManyAssociations() + public Stream<ManyAssociationInstance<?>> allManyAssociations() { - return manyAssociations.values(); + return manyAssociations.values().stream(); } @Override @@ -193,11 +187,12 @@ public final class ValueStateInstance } @Override - public Iterable<? extends NamedAssociationInstance<?>> allNamedAssociations() + public Stream<? extends NamedAssociationInstance<?>> allNamedAssociations() { - return namedAssociations.values(); + return namedAssociations.values().stream(); } + @SuppressWarnings( "SimplifiableIfStatement" ) @Override public boolean equals( Object obj ) { http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java index e34398f..636664a 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateModel.java @@ -19,6 +19,7 @@ */ package org.apache.zest.runtime.value; +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; @@ -93,19 +94,19 @@ public final class ValueStateModel } @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/value/ValuesModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java index 08f91e1..7fcadac 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValuesModel.java @@ -15,6 +15,8 @@ package org.apache.zest.runtime.value; import java.util.List; +import java.util.stream.Stream; +import org.apache.zest.api.value.ValueDescriptor; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.VisitableHierarchy; @@ -31,9 +33,9 @@ public final class ValuesModel this.valueModels = valueModels; } - public Iterable<ValueModel> models() + public Stream<ValueModel> models() { - return valueModels; + return valueModels.stream(); } @Override @@ -52,4 +54,9 @@ public final class ValuesModel } return visitor.visitLeave( this ); } + + public Stream<? extends ValueDescriptor> stream() + { + return valueModels.stream(); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java b/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java index 9bbe4ec..e92d97f 100644 --- a/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java +++ b/core/runtime/src/test/java/org/apache/zest/api/common/PluginTest.java @@ -19,8 +19,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Collections; import java.util.List; -import org.junit.Ignore; -import org.junit.Test; import org.apache.zest.api.injection.scope.Service; import org.apache.zest.api.injection.scope.Structure; import org.apache.zest.api.mixin.Mixins; @@ -42,10 +40,8 @@ import org.apache.zest.bootstrap.LayerAssembly; import org.apache.zest.bootstrap.LayerName; import org.apache.zest.bootstrap.ModuleAssembly; import org.apache.zest.bootstrap.ModuleName; -import org.apache.zest.functional.Iterables; - -import static org.apache.zest.functional.Iterables.first; -import static org.apache.zest.functional.Iterables.toArray; +import org.junit.Ignore; +import org.junit.Test; /** * Sample of how a plugin architecture could work. @@ -73,19 +69,19 @@ public class PluginTest throws AssemblyException { return applicationFactory.newApplicationAssembly( new Assembler[][][] - { { { - new PluginAssembler(), - new UIAssembler(), - } - }, - { + { + new PluginAssembler(), + new UIAssembler(), + } + }, { - new ServiceAssembler() + { + new ServiceAssembler() + } } - } - } ); + } ); } } @@ -294,26 +290,21 @@ public class PluginTest public Object importService( final ImportedServiceDescriptor serviceDescriptor ) throws ServiceImporterException { - final Class<?> mainType = first( serviceDescriptor.types() ); - - Class[] interfaces = toArray( Class.class, Iterables.<Class>cast( serviceDescriptor.types() ) ); + final Class<?> mainType = serviceDescriptor.types().findFirst().orElse(null); + + Class[] interfaces = serviceDescriptor.types().toArray( Class[]::new ); return Proxy.newProxyInstance( mainType.getClassLoader(), interfaces, - new InvocationHandler() - { - public Object invoke( Object proxy, Method method, Object[] args ) - throws Throwable + ( proxy, method, args ) -> { + ServiceFinder finder = serviceDescriptor.metaInfo( ServiceFinder.class ); + if( finder == null ) { - ServiceFinder finder = serviceDescriptor.metaInfo( ServiceFinder.class ); - if( finder == null ) - { - throw new ServiceImporterException( "No ServiceFinder specified for imported service " + serviceDescriptor - .identity() ); - } - Object service = finder.findService( mainType ).get(); - return method.invoke( service, args ); + throw new ServiceImporterException( "No ServiceFinder specified for imported service " + serviceDescriptor + .identity() ); } + Object service = finder.findService( mainType ).get(); + return method.invoke( service, args ); } ); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java b/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java index 4252415..aafc3cc 100644 --- a/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java +++ b/core/runtime/src/test/java/org/apache/zest/bootstrap/ApplicationAssemblerTest.java @@ -27,7 +27,6 @@ import org.apache.zest.api.service.ServiceComposite; import org.apache.zest.api.service.ServiceDescriptor; import org.apache.zest.api.structure.ApplicationDescriptor; import org.apache.zest.functional.HierarchicalVisitorAdapter; -import org.apache.zest.functional.Specifications; /** * TODO @@ -56,11 +55,11 @@ public class ApplicationAssemblerTest module.entities( TestEntity.class ); - layer1.services( AssemblySpecifications.types( TestService.class ) ).instantiateOnStartup(); + layer1.services( AssemblySpecifications.ofAnyType( TestService.class ) ).instantiateOnStartup(); - layer1.services( Specifications.<Object>TRUE() ).visibleIn( Visibility.layer ); + layer1.services( s -> true ).visibleIn( Visibility.layer ); - layer1.entities( Specifications.<Object>TRUE() ).visibleIn( Visibility.application ); + layer1.entities( s -> true ).visibleIn( Visibility.application ); return assembly; } http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java b/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java index 9c4e205..d171396 100644 --- a/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java +++ b/core/runtime/src/test/java/org/apache/zest/runtime/ZestSPITest.java @@ -87,18 +87,16 @@ public class ZestSPITest private void validateState( AssociationStateHolder state, EntityDescriptor entityDescriptor ) { - for( PropertyDescriptor propertyDescriptor : entityDescriptor.state().properties() ) - { + entityDescriptor.state().properties().forEach( propertyDescriptor -> { Property<?> prop = state.propertyFor( propertyDescriptor.accessor() ); assertThat( "Properties could be listed", prop, CoreMatchers.notNullValue() ); - } + } ); AssociationStateDescriptor descriptor = entityDescriptor.state(); - for( AssociationDescriptor associationDescriptor : descriptor.associations() ) - { + descriptor.associations().forEach( associationDescriptor -> { AbstractAssociation assoc = state.associationFor( associationDescriptor.accessor() ); assertThat( "Assocs could be listed", assoc, CoreMatchers.notNullValue() ); - } + } ); } public interface TestEntity http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java index 58a42d4..4cc78cc 100644 --- a/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java +++ b/core/runtime/src/test/java/org/apache/zest/runtime/structure/CompositeDescriptorTest.java @@ -40,7 +40,7 @@ public class CompositeDescriptorTest TransientDescriptor addressDescriptor = spi.transientDescriptorFor( address ); assertNotNull( addressDescriptor ); - assertEquals( AddressComposite.class, first( addressDescriptor.types() ) ); + assertEquals( AddressComposite.class, addressDescriptor.types().findFirst().orElse( null ) ); assertTrue( TransientDescriptor.class.isAssignableFrom( addressDescriptor.getClass() ) ); } @@ -51,7 +51,7 @@ public class CompositeDescriptorTest TransientDescriptor addressDesc = module.transientDescriptor( AddressComposite.class.getName() ); assertNotNull( addressDesc ); - assertEquals( AddressComposite.class, first( addressDesc.types() ) ); + assertEquals( AddressComposite.class, addressDesc.types().findFirst().orElse( null ) ); } public final void assemble( ModuleAssembly aModule ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java b/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java index 04088a2..f604e98 100644 --- a/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java +++ b/core/spi/src/main/java/org/apache/zest/spi/entity/QualifiedIdentity.java @@ -61,9 +61,9 @@ public final class QualifiedIdentity public QualifiedIdentity( EntityComposite entityComposite ) { - this( entityComposite.identity().get(), first( ZestAPI.FUNCTION_DESCRIPTOR_FOR + this( entityComposite.identity().get(), ZestAPI.FUNCTION_DESCRIPTOR_FOR .apply( entityComposite ) - .types() ).getName() ); + .types().findFirst().get().getName() ); } public QualifiedIdentity( String identity, Class<?> clazz ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/bd6fbad9/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java b/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java index 8c9bf68..72f7a99 100644 --- a/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java +++ b/core/spi/src/main/java/org/apache/zest/spi/entitystore/helpers/JSONMapEntityStoreMixin.java @@ -164,7 +164,7 @@ public class JSONMapEntityStoreMixin JSONObject state = new JSONObject(); state.put( JSONKeys.IDENTITY, identity.identity() ); state.put( JSONKeys.APPLICATION_VERSION, application.version() ); - state.put( JSONKeys.TYPE, first( entityDescriptor.types() ).getName() ); + state.put( JSONKeys.TYPE, entityDescriptor.types().findFirst().get().getName() ); state.put( JSONKeys.VERSION, unitOfWork.identity() ); state.put( JSONKeys.MODIFIED, unitOfWork.currentTime() ); state.put( JSONKeys.PROPERTIES, new JSONObject() ); @@ -435,9 +435,9 @@ public class JSONMapEntityStoreMixin { throw new EntityTypeNotFoundException( type, module.name(), - map( ModelModule.toStringFunction, - module.findVisibleEntityTypes() - ) ); + module.findVisibleEntityTypes() + .map( ModelModule.toStringFunction ) + ); } return new JSONEntityState( valueSerialization,
