You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/04/17 18:08:58 UTC
[46/50] [abbrv] zest-qi4j git commit: Start experiment with Sream and
Function on our own classes.
Start experiment with Sream and Function on our own classes.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/caa62018
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/caa62018
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/caa62018
Branch: refs/heads/3.0
Commit: caa62018a19bee3673d2607c3f49664ac99e5316
Parents: 1dfbffc
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Sat Oct 4 17:15:27 2014 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Sat Oct 4 17:15:27 2014 +0800
----------------------------------------------------------------------
.../qi4j/api/association/ManyAssociation.java | 3 ++
.../api/association/ManyAssociationWrapper.java | 7 +++
.../qi4j/api/association/NamedAssociation.java | 2 +
.../association/NamedAssociationWrapper.java | 7 +++
.../property/InvalidPropertyTypeException.java | 6 ++-
.../java/org/qi4j/api/property/Numbers.java | 21 +++++++-
.../java/org/qi4j/api/property/Property.java | 13 +++++
.../runtime/association/GenericSpliterator.java | 40 ++++++++++++++
.../association/ManyAssociationInstance.java | 14 +++++
.../association/NamedAssociationInstance.java | 56 ++++++++++++++++++--
.../qi4j/spi/entity/NamedAssociationState.java | 1 +
.../samples/forum/context/view/ViewBoard.java | 3 +-
.../samples/forum/context/view/ViewPost.java | 3 +-
.../binding/internal/BoundManyAssociation.java | 9 +++-
.../binding/internal/BoundNamedAssociation.java | 8 +++
15 files changed, 182 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java b/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
index 707d53a..0e1134d 100644
--- a/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
+++ b/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
@@ -16,6 +16,7 @@ package org.qi4j.api.association;
import java.util.List;
import java.util.Set;
+import java.util.stream.Stream;
/**
* Association to a collection of entities.
@@ -37,4 +38,6 @@ public interface ManyAssociation<T> extends Iterable<T>, AbstractAssociation
List<T> toList();
Set<T> toSet();
+
+ Stream<T> stream();
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
index 748af83..85e7bce 100644
--- a/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
@@ -3,6 +3,7 @@ package org.qi4j.api.association;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import java.util.stream.Stream;
/**
* If you want to catch calls to ManyAssociations, then create a GenericConcern
@@ -73,6 +74,12 @@ public class ManyAssociationWrapper
}
@Override
+ public Stream<Object> stream()
+ {
+ return next.stream();
+ }
+
+ @Override
public Iterator<Object> iterator()
{
return next.iterator();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
index e8abe32..86a61a6 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
@@ -19,6 +19,7 @@
package org.qi4j.api.association;
import java.util.Map;
+import java.util.stream.Stream;
/**
* Association to named Entities.
@@ -75,4 +76,5 @@ public interface NamedAssociation<T>
*/
Map<String, T> toMap();
+ Stream<Map.Entry<String,T>> stream();
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
index 581948e..a033cae 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
@@ -20,6 +20,7 @@ package org.qi4j.api.association;
import java.util.Iterator;
import java.util.Map;
+import java.util.stream.Stream;
/**
* If you want to catch calls to NamedAssociations, then create a GenericConcern
@@ -90,6 +91,12 @@ public class NamedAssociationWrapper
}
@Override
+ public Stream<Map.Entry<String, Object>> stream()
+ {
+ return next.stream();
+ }
+
+ @Override
public int hashCode()
{
return next.hashCode();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java b/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java
index c98007e..6c81509 100644
--- a/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java
+++ b/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java
@@ -16,7 +16,11 @@ public class InvalidPropertyTypeException extends ConstructionException
private static String createMessage( AccessibleObject accessor )
{
StringBuilder builder = new StringBuilder();
- builder.append( "Not allowed to subclass " + Property.class.getName() + ". Property accessor " + accessor + " is returning a Property subclass." );
+ builder.append( "Not allowed to subclass " )
+ .append( Property.class.getName() )
+ .append( ". Property accessor " )
+ .append( accessor )
+ .append( " is returning a Property subclass." );
return builder.toString();
}
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/api/src/main/java/org/qi4j/api/property/Numbers.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/property/Numbers.java b/core/api/src/main/java/org/qi4j/api/property/Numbers.java
index 00c0e5f..070dff0 100644
--- a/core/api/src/main/java/org/qi4j/api/property/Numbers.java
+++ b/core/api/src/main/java/org/qi4j/api/property/Numbers.java
@@ -15,6 +15,7 @@
package org.qi4j.api.property;
import java.math.BigDecimal;
+import java.util.function.Function;
/**
* Convenience class for mathematical operations on numerical properties.
@@ -24,8 +25,14 @@ import java.math.BigDecimal;
*/
public final class Numbers
{
- // Integer operations
+ public static <T> Property<T> f( Property<T> property, Function<T,T> function )
+ {
+ property.set( function.apply( property.get() ));
+ return property;
+ }
+
+ // Integer operations
public static Property<Integer> add( Property<Integer> property, int amount )
{
property.set( property.get() + amount );
@@ -50,6 +57,18 @@ public final class Numbers
return property;
}
+ public static Property<Integer> inc( Property<Integer> property )
+ {
+ property.set( property.get() + 1 );
+ return property;
+ }
+
+ public static Property<Integer> dec( Property<Integer> property )
+ {
+ property.set( property.get() - 1 );
+ return property;
+ }
+
// Long operations
public static Property<Long> add( Property<Long> property, long amount )
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/api/src/main/java/org/qi4j/api/property/Property.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/property/Property.java b/core/api/src/main/java/org/qi4j/api/property/Property.java
index 9c9cfa8..a40a126 100644
--- a/core/api/src/main/java/org/qi4j/api/property/Property.java
+++ b/core/api/src/main/java/org/qi4j/api/property/Property.java
@@ -17,6 +17,8 @@
*/
package org.qi4j.api.property;
+import java.util.function.UnaryOperator;
+
/**
* Properties are declared in Composite interfaces by using this interface.
* <p>
@@ -58,4 +60,15 @@ public interface Property<T>
*/
void set( T newValue )
throws IllegalArgumentException, IllegalStateException;
+
+ /**
+ * Applies the function to the property.
+ *
+ * @param function The input to the function is the current value, and the return value is the value to be set
+ * to the property.
+ */
+ default void f( UnaryOperator<T> function )
+ {
+ set( function.apply( get() ) );
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/runtime/src/main/java/org/qi4j/runtime/association/GenericSpliterator.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/GenericSpliterator.java b/core/runtime/src/main/java/org/qi4j/runtime/association/GenericSpliterator.java
new file mode 100644
index 0000000..c51ee57
--- /dev/null
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/GenericSpliterator.java
@@ -0,0 +1,40 @@
+package org.qi4j.runtime.association;
+
+import java.util.Iterator;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+public class GenericSpliterator<T, R> extends Spliterators.AbstractSpliterator<R>
+{
+ private final Iterator<T> it;
+ private final Function<T, R> mapping;
+
+ public GenericSpliterator( Iterator<T> it, Function<T, R> mapping )
+ {
+ super( 0L, Spliterator.IMMUTABLE );
+ this.it = it;
+ if( mapping == null )
+ {
+ //noinspection unchecked
+ this.mapping = t -> (R) t;
+ }
+ else
+ {
+ this.mapping = mapping;
+ }
+ }
+
+ @Override
+ public boolean tryAdvance( Consumer<? super R> action )
+ {
+ if( it.hasNext() )
+ {
+ T value = it.next();
+ action.accept( mapping.apply( value ) );
+ return true;
+ }
+ return false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
index b28b7cb..09eac1a 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
@@ -5,8 +5,14 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.Spliterator;
+import java.util.Spliterators;
import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.association.ManyAssociation;
import org.qi4j.api.association.ManyAssociationWrapper;
@@ -111,6 +117,14 @@ public class ManyAssociationInstance<T>
}
@Override
+ public Stream<T> stream()
+ {
+ final Iterator<T> it = iterator();
+ Spliterator<T> entrySpliterator = new GenericSpliterator<>( it, null );
+ return StreamSupport.stream( entrySpliterator, false );
+ }
+
+ @Override
public boolean equals( Object o )
{
if( this == o )
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
index f606f79..d22be74 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
@@ -23,9 +23,10 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.function.BiFunction;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
import org.qi4j.api.association.NamedAssociation;
import org.qi4j.api.entity.EntityReference;
-import org.qi4j.runtime.composite.ConstraintsCheck;
import org.qi4j.spi.entity.NamedAssociationState;
public class NamedAssociationInstance<T>
@@ -37,7 +38,8 @@ public class NamedAssociationInstance<T>
public NamedAssociationInstance( AssociationInfo associationInfo,
BiFunction<EntityReference, Type, Object> associationFunction,
- NamedAssociationState namedAssociationState )
+ NamedAssociationState namedAssociationState
+ )
{
super( associationInfo, associationFunction );
this.namedAssociationState = namedAssociationState;
@@ -66,7 +68,7 @@ public class NamedAssociationInstance<T>
{
checkImmutable();
checkType( entity );
- ( (ConstraintsCheck) associationInfo ).checkConstraints( entity );
+ associationInfo.checkConstraints( entity );
return namedAssociationState.put( name, getEntityReference( entity ) );
}
@@ -80,7 +82,7 @@ public class NamedAssociationInstance<T>
@Override
public T get( String name )
{
- return getEntity( namedAssociationState.get( name ) );
+ return getEntityByName( name );
}
@Override
@@ -95,9 +97,53 @@ public class NamedAssociationInstance<T>
Map<String, T> map = new HashMap<>();
for( String name : namedAssociationState )
{
- map.put( name, getEntity( namedAssociationState.get( name ) ) );
+ map.put( name, getEntityByName( name ) );
}
return map;
}
+ @Override
+ public Stream<Map.Entry<String, T>> stream()
+ {
+ final Iterator<String> it = namedAssociationState.iterator();
+ return StreamSupport.stream( new GenericSpliterator<>( it, key -> new Entry<>( key, getEntityByName( key ) ) ),
+ false );
+ }
+
+ private T getEntityByName( String name )
+ {
+ return getEntity( namedAssociationState.get( name ) );
+ }
+
+ private static final class Entry<K, V>
+ implements Map.Entry<K, V>
+ {
+
+ private final K key;
+ private final V value;
+
+ private Entry( K key, V value )
+ {
+ this.key = key;
+ this.value = value;
+ }
+
+ @Override
+ public K getKey()
+ {
+ return key;
+ }
+
+ @Override
+ public V getValue()
+ {
+ return value;
+ }
+
+ @Override
+ public V setValue( V value )
+ {
+ throw new UnsupportedOperationException();
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java b/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
index 5cf3257..90790a2 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
@@ -18,6 +18,7 @@
*/
package org.qi4j.spi.entity;
+import java.util.Spliterators;
import org.qi4j.api.entity.EntityReference;
/**
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewBoard.java
----------------------------------------------------------------------
diff --git a/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewBoard.java b/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewBoard.java
index 120dcea..cc8829a 100644
--- a/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewBoard.java
+++ b/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewBoard.java
@@ -13,6 +13,7 @@ import org.qi4j.samples.forum.data.entity.Topic;
import org.qi4j.samples.forum.data.entity.User;
import static org.qi4j.api.property.Numbers.add;
+import static org.qi4j.api.property.Numbers.f;
/**
* TODO
@@ -94,7 +95,7 @@ public class ViewBoard
self.lastPost().set( post );
add( self.topicCount(), 1 );
- add( self.postCount(), 1 );
+ f( self.postCount(), c -> c + 1 );
return topic;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewPost.java
----------------------------------------------------------------------
diff --git a/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewPost.java b/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewPost.java
index 45d4802..b060b29 100644
--- a/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewPost.java
+++ b/samples/forum/src/main/java/org/qi4j/samples/forum/context/view/ViewPost.java
@@ -3,7 +3,6 @@ package org.qi4j.samples.forum.context.view;
import java.time.ZoneId;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
-import org.qi4j.api.property.Numbers;
import org.qi4j.api.structure.Module;
import org.qi4j.library.rest.server.api.ResourceIndex;
import org.qi4j.library.rest.server.api.dci.Role;
@@ -55,7 +54,7 @@ public class ViewPost
post.replyTo().set( viewPost.self() );
self().lastPost().set( post );
- Numbers.add( self().postCount(), 1 );
+ self().postCount().f( c -> c + 1 );
return post;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
index a7dcb0f..a71cb4b 100644
--- a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
+++ b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
@@ -4,6 +4,7 @@ import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import java.util.stream.Stream;
import org.qi4j.api.association.ManyAssociation;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
@@ -78,6 +79,12 @@ public class BoundManyAssociation<T> extends AbstractBinding<T>
@Override
public Iterator<T> iterator()
{
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ return actualAssociations.iterator();
+ }
+
+ @Override
+ public Stream<T> stream()
+ {
+ return actualAssociations.stream();
}
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/caa62018/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
index 8e9f187..c5d6292 100644
--- a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
+++ b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
@@ -3,6 +3,7 @@ package org.qi4j.lib.swing.binding.internal;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;
+import java.util.stream.Stream;
import org.qi4j.api.association.NamedAssociation;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
@@ -80,4 +81,11 @@ public class BoundNamedAssociation<T>
return actualAssociations.iterator();
}
+ @Override
+ public Stream<Map.Entry<String, T>> stream()
+ {
+ return actualAssociations.stream();
+ }
+
+
}