You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2016/04/24 21:57:25 UTC

[01/10] wicket git commit: Add filter/map/flatMap/orElse/orElseGet methods to IModel

Repository: wicket
Updated Branches:
  refs/heads/master eaa3bfa0f -> bbe1ab607


Add filter/map/flatMap/orElse/orElseGet methods to IModel

discussion-at: http://markmail.org/message/i34iulxttjc7umij


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/484132a8
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/484132a8
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/484132a8

Branch: refs/heads/master
Commit: 484132a85c81fe96878d1c93e19940fb71d6f10f
Parents: f2f0ba0
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Sun Apr 24 17:11:53 2016 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Sun Apr 24 17:11:53 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    | 185 +++++++++++++++++++
 .../apache/wicket/model/LambdaModelTest.java    |  18 +-
 .../org/apache/wicket/model/lambda/Person.java  |  40 ++++
 3 files changed, 242 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/484132a8/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index 53994ae..789d27a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -17,6 +17,10 @@
 package org.apache.wicket.model;
 
 
+import org.apache.wicket.lambda.WicketBiFunction;
+import org.apache.wicket.lambda.WicketFunction;
+import org.apache.wicket.lambda.WicketSupplier;
+
 /**
  * A IModel wraps the actual model Object used by a Component. IModel implementations are used as a
  * facade for the real model so that users have control over the actual persistence strategy. Note
@@ -78,4 +82,185 @@ public interface IModel<T> extends IDetachable
 
 	@Override
 	default void detach() {}
+
+	/**
+	 * Returns a IModel checking whether the predicate holds for the
+	 * contained object, if it is not null. If the predicate doesn't evaluate
+	 * to true, the contained object will be null.
+	 *
+	 * @param predicate a predicate to be used for testing the contained object
+	 * @return a new IModel
+	 */
+	default IModel<T> filter(WicketFunction<T, Boolean> predicate) {
+		return (IModel<T>) () -> {
+			T object = IModel.this.getObject();
+			if (object != null && predicate.apply(object)) {
+				return object;
+			}
+			else {
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * Returns a IModel applying the given mapper to
+	 * the contained object, if it is not NULL.
+	 *
+	 * @param <R> the new type of the contained object
+	 * @param mapper a mapper, to be applied to the contained object
+	 * @return a new IModel
+	 */
+	default <R> IModel<R> map(WicketFunction<T, R> mapper) {
+		return (IModel<R>) () -> {
+			T object = IModel.this.getObject();
+			if (object == null) {
+				return null;
+			}
+			else {
+				return mapper.apply(object);
+			}
+		};
+	}
+
+	/**
+	 * Returns a IModel applying the given combining function to
+	 * the contained object of this and the given other model, if they are not null.
+	 *
+	 * @param <R> the resulting type
+	 * @param <U> the other models type
+	 * @param combine a function combining this and the others object to
+	 * a result.
+	 * @param other another model to be combined with this one
+	 * @return a new IModel
+	 */
+	default <R, U> IModel<R> mapWith(WicketBiFunction<T, U, R> combine, IModel<U> other) {
+		return (IModel<R>) () -> {
+			T t = IModel.this.getObject();
+			U u = other.getObject();
+			if (t != null && u != null) {
+				return combine.apply(t, u);
+			}
+			else {
+				return null;
+			}
+		};
+	}
+
+	/**
+	 * Returns a IModel applying the given mapper to the contained
+	 * object, if it is not NULL.
+	 *
+	 * @param <R> the new type of the contained object
+	 * @param mapper a mapper, to be applied to the contained object
+	 * @return a new IModel
+	 */
+	default <R> IModel<R> flatMap(WicketFunction<T, IModel<R>> mapper) {
+		return (IModel<R>) () -> {
+			T object = IModel.this.getObject();
+			if (object == null) {
+				return null;
+			}
+			else {
+				return mapper.apply(object).getObject();
+			}
+		};
+	}
+
+	/**
+	 * Returns a IModel applying the {@link WicketFunction} contained
+	 * inside the given model to the object contained inside this model.
+	 *
+	 * @param <R> the type of the new contained object
+	 * @param mapper an {@link IModel} containing a function to be applied
+	 * to the contained model object.
+	 * @return a new IModel
+	 */
+	default <R> IModel<R> apply(IModel<WicketFunction<T, R>> mapper) {
+		return (IModel<R>) () -> {
+			T object = IModel.this.getObject();
+			WicketFunction<T, R> f = mapper.getObject();
+			if (object == null || f == null) {
+				return null;
+			}
+			else {
+				return f.apply(object);
+			}
+		};
+	}
+
+	/**
+	 * Returns a IModel, returning either the contained object
+	 * or the given default value, depending on the nullness of the
+	 * contained object.
+	 *
+	 * @param other a default value
+	 * @return a new IModel
+	 */
+	default IModel<T> orElse(T other) {
+		return (IModel<T>) () -> {
+			T object = IModel.this.getObject();
+			if (object == null) {
+				return other;
+			}
+			else {
+				return object;
+			}
+		};
+	}
+
+	/**
+	 * Returns a IModel, returning either the contained object
+	 * or invoking the given supplier to get a default value.
+	 *
+	 * @param other a supplier to be used as a default
+	 * @return a new IModel
+	 */
+	default IModel<T> orElseGet(WicketSupplier<T> other) {
+		return (IModel<T>) () -> {
+			T object = IModel.this.getObject();
+			if (object == null) {
+				return other.get();
+			}
+			else {
+				return object;
+			}
+		};
+	}
+
+	/**
+	 * Returns a IModel lifting the given object into the
+	 * Model.
+	 *
+	 * @param <T> the type of the given object
+	 * @param object an object to be lifted into a IModel
+	 * @return a new IModel
+	 */
+	static <T> IModel<T> of(T object) {
+		return of((WicketSupplier<T>) () -> object);
+	}
+
+	/**
+	 * Returns a IModel applying the given supplier to
+	 * get the object.
+	 *
+	 * @param <T> the type of the given object
+	 * @param supplier a supplier, to be used to get a value
+	 * @return a new IModel
+	 */
+	static <T> IModel<T> of(WicketSupplier<T> supplier) {
+		return (IModel<T>) () -> supplier.get();
+	}
+
+	/**
+	 * Returns a IModel using the getObject() method
+	 * of the given model.
+	 *
+	 * @param <T> the type of the contained object
+	 * @param model a model,
+	 * @return a new IModel
+	 */
+	static <T> IModel<T> of(IModel<T> model) {
+		return (IModel<T>) () -> model.getObject();
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/484132a8/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java b/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
index 8bb31ff..597ed16 100644
--- a/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
@@ -38,8 +38,24 @@ public class LambdaModelTest
 	public void methodReference()
 	{
 		Person person = new Person();
+		person.setName("john");
+		Person.Address address = new Person.Address();
+		person.setAddress(address);
+//		address.setStreet("Street");
+		address.setNumber(123);
+
 		IModel<String> personNameModel = new LambdaModel<>(person::getName, person::setName);
-		check(personNameModel);
+//		check(personNameModel);
+
+		IModel<Person.Address> addressModel = Model.<Person>of(Model.of(person))
+					.filter((p) -> p.getName().equals("john"))
+					.map(Person::getAddress);
+
+		System.err.println("addressModel= " + addressModel
+					.flatMap(address1 -> Model.loadableDetachable(() -> address1))
+					.map(Person.Address::getStreet)
+					.orElse("N/A")
+					.getObject());
 	}
 
 	@Test

http://git-wip-us.apache.org/repos/asf/wicket/blob/484132a8/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java b/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
index 4e4e74a..0134c46 100644
--- a/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
+++ b/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
@@ -25,6 +25,8 @@ public class Person implements Serializable
 {
 	private String name;
 
+	private Address address;
+
 	public String getName()
 	{
 		return name;
@@ -34,4 +36,42 @@ public class Person implements Serializable
 	{
 		this.name = name;
 	}
+
+	public Address getAddress()
+	{
+		return address;
+	}
+
+	public void setAddress(Address address)
+	{
+		this.address = address;
+	}
+
+	public static class Address implements Serializable
+	{
+		private String street;
+
+		private int number;
+
+		public String getStreet()
+		{
+			return street;
+		}
+
+		public void setStreet(String street)
+		{
+			this.street = street;
+		}
+
+		public int getNumber()
+		{
+			return number;
+		}
+
+		public void setNumber(int number)
+		{
+			this.number = number;
+		}
+	}
+
 }


[06/10] wicket git commit: check mapper result in #flatMap in get- and setObject

Posted by mg...@apache.org.
check mapper result in #flatMap in get- and setObject


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a68dc57a
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a68dc57a
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a68dc57a

Branch: refs/heads/master
Commit: a68dc57a801628c455d0aa4efc61a0b474f3bdf2
Parents: 3719da9
Author: Matthias Metzger <no...@yahoo.de>
Authored: Sun Apr 24 21:22:35 2016 +0200
Committer: Matthias Metzger <no...@yahoo.de>
Committed: Sun Apr 24 21:22:35 2016 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/wicket/model/IModel.java   | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a68dc57a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index a85365c..8f86030 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -185,7 +185,15 @@ public interface IModel<T> extends IDetachable
 				T object = IModel.this.getObject();
 				if (object != null)
 				{
-					return mapper.apply(object).getObject();
+					IModel<R> model = mapper.apply(object);
+					if (model != null) 
+					{
+						return model.getObject();
+					}
+					else 
+					{
+						return null;
+					}
 				}
 				else
 				{
@@ -199,7 +207,11 @@ public interface IModel<T> extends IDetachable
 				T modelObject = IModel.this.getObject();
 				if (modelObject != null)
 				{
-					mapper.apply(modelObject).setObject(object);
+					IModel<R> model = mapper.apply(modelObject);
+					if (model != null)
+					{
+						model.setObject(object);
+					}
 				}
 			}
 


[05/10] wicket git commit: fix wrong formatting

Posted by mg...@apache.org.
fix wrong formatting


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/3719da91
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/3719da91
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/3719da91

Branch: refs/heads/master
Commit: 3719da912cea48e2a9f8ec4de4672379a93954de
Parents: 4348962
Author: Matthias Metzger <no...@yahoo.de>
Authored: Sun Apr 24 20:58:58 2016 +0200
Committer: Matthias Metzger <no...@yahoo.de>
Committed: Sun Apr 24 20:58:58 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    | 295 ++++++++++---------
 1 file changed, 153 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/3719da91/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index d260360..a85365c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -73,253 +73,264 @@ public interface IModel<T> extends IDetachable
 	 *
 	 * @param object
 	 *            The model object
-     * @throws UnsupportedOperationException unless overridden
+	 * @throws UnsupportedOperationException
+	 *             unless overridden
 	 */
 	default void setObject(final T object)
 	{
-		throw new UnsupportedOperationException("Override this method to support setObject(Object)");
+		throw new UnsupportedOperationException(
+			"Override this method to support setObject(Object)");
 	}
 
 	@Override
-	default void detach() {}
+	default void detach()
+	{
+	}
 
 	/**
-	 * Returns a IModel checking whether the predicate holds for the
-	 * contained object, if it is not null. If the predicate doesn't evaluate
-	 * to true, the contained object will be null.
+	 * Returns a IModel checking whether the predicate holds for the contained object, if it is not
+	 * null. If the predicate doesn't evaluate to true, the contained object will be null.
 	 *
-	 * @param predicate a predicate to be used for testing the contained object
+	 * @param predicate
+	 *            a predicate to be used for testing the contained object
 	 * @return a new IModel
 	 */
-	default IModel<T> filter(WicketFunction<? super T, Boolean> predicate) 
-    {
-		return (IModel<T>) () -> 
-        {
+	default IModel<T> filter(WicketFunction<? super T, Boolean> predicate)
+	{
+		return (IModel<T>)() -> {
 			T object = IModel.this.getObject();
-			if (object != null && predicate.apply(object)) 
-            {
+			if (object != null && predicate.apply(object))
+			{
 				return object;
 			}
-			else 
-            {
+			else
+			{
 				return null;
 			}
 		};
 	}
 
 	/**
-	 * Returns a IModel applying the given mapper to
-	 * the contained object, if it is not NULL.
+	 * Returns a IModel applying the given mapper to the contained object, if it is not NULL.
 	 *
-	 * @param <R> the new type of the contained object
-	 * @param mapper a mapper, to be applied to the contained object
+	 * @param <R>
+	 *            the new type of the contained object
+	 * @param mapper
+	 *            a mapper, to be applied to the contained object
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> map(WicketFunction<? super T, R> mapper) 
-    {
-		return (IModel<R>) () -> 
-        {
+	default <R> IModel<R> map(WicketFunction<? super T, R> mapper)
+	{
+		return (IModel<R>)() -> {
 			T object = IModel.this.getObject();
-			if (object == null) 
-            {
+			if (object == null)
+			{
 				return null;
 			}
-			else 
-            {
+			else
+			{
 				return mapper.apply(object);
 			}
 		};
 	}
 
 	/**
-	 * Returns a IModel applying the given combining function to
-	 * the contained object of this and the given other model, if they are not null.
+	 * Returns a IModel applying the given combining function to the contained object of this and
+	 * the given other model, if they are not null.
 	 *
-	 * @param <R> the resulting type
-	 * @param <U> the other models type
-	 * @param combine a function combining this and the others object to
-	 * a result.
-	 * @param other another model to be combined with this one
+	 * @param <R>
+	 *            the resulting type
+	 * @param <U>
+	 *            the other models type
+	 * @param combine
+	 *            a function combining this and the others object to a result.
+	 * @param other
+	 *            another model to be combined with this one
 	 * @return a new IModel
 	 */
-	default <R, U> IModel<R> mapWith(WicketBiFunction<? super T, ? super U, R> combine, IModel<U> other) 
-    {
-		return (IModel<R>) () -> 
-        {
+	default <R, U> IModel<R> mapWith(WicketBiFunction<? super T, ? super U, R> combine,
+		IModel<U> other)
+	{
+		return (IModel<R>)() -> {
 			T t = IModel.this.getObject();
 			U u = other.getObject();
-			if (t != null && u != null) 
-            {
+			if (t != null && u != null)
+			{
 				return combine.apply(t, u);
 			}
-			else 
-            {
+			else
+			{
 				return null;
 			}
 		};
 	}
 
 	/**
-	 * Returns a IModel applying the given mapper to the contained
-	 * object, if it is not NULL.
+	 * Returns a IModel applying the given mapper to the contained object, if it is not NULL.
 	 *
-	 * @param <R> the new type of the contained object
-	 * @param mapper a mapper, to be applied to the contained object
+	 * @param <R>
+	 *            the new type of the contained object
+	 * @param mapper
+	 *            a mapper, to be applied to the contained object
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> flatMap(WicketFunction<? super T, IModel<R>> mapper) 
-    {
-        return new IModel<R>() 
-        {
+	default <R> IModel<R> flatMap(WicketFunction<? super T, IModel<R>> mapper)
+	{
+		return new IModel<R>()
+		{
 
-            @Override
-            public R getObject() 
-            {
-                T object = IModel.this.getObject();
-                if (object != null)
-                {
-                    return mapper.apply(object).getObject();
-                }
-                else
-                {
-                    return null;
-                }
-            }
+			@Override
+			public R getObject()
+			{
+				T object = IModel.this.getObject();
+				if (object != null)
+				{
+					return mapper.apply(object).getObject();
+				}
+				else
+				{
+					return null;
+				}
+			}
 
-            @Override
-            public void setObject(R object) 
-            {
-                T modelObject = IModel.this.getObject();
-                if (modelObject != null)
-                {
-                    mapper.apply(modelObject).setObject(object);
-                }
-            }
+			@Override
+			public void setObject(R object)
+			{
+				T modelObject = IModel.this.getObject();
+				if (modelObject != null)
+				{
+					mapper.apply(modelObject).setObject(object);
+				}
+			}
 
-            @Override
-            public void detach() 
-            {
-                T object = IModel.this.getObject();
-                if (object != null)
-                {
-                    IModel<R> model = mapper.apply(object);
-                    if (model != null)
-                    {
-                        model.detach();
-                    }
-                }
-            }
-        };
+			@Override
+			public void detach()
+			{
+				T object = IModel.this.getObject();
+				if (object != null)
+				{
+					IModel<R> model = mapper.apply(object);
+					if (model != null)
+					{
+						model.detach();
+					}
+				}
+			}
+		};
 	}
 
 	/**
-	 * Returns a IModel applying the {@link WicketFunction} contained
-	 * inside the given model to the object contained inside this model.
+	 * Returns a IModel applying the {@link WicketFunction} contained inside the given model to the
+	 * object contained inside this model.
 	 *
-	 * @param <R> the type of the new contained object
-	 * @param mapper an {@link IModel} containing a function to be applied
-	 * to the contained model object.
+	 * @param <R>
+	 *            the type of the new contained object
+	 * @param mapper
+	 *            an {@link IModel} containing a function to be applied to the contained model
+	 *            object.
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> apply(IModel<WicketFunction<? super T, R>> mapper) 
-    {
-		return (IModel<R>) () -> 
-        {
+	default <R> IModel<R> apply(IModel<WicketFunction<? super T, R>> mapper)
+	{
+		return (IModel<R>)() -> {
 			T object = IModel.this.getObject();
 			WicketFunction<? super T, R> f = mapper.getObject();
-			if (object == null || f == null) 
-            {
+			if (object == null || f == null)
+			{
 				return null;
 			}
-			else 
-            {
+			else
+			{
 				return f.apply(object);
 			}
 		};
 	}
 
 	/**
-	 * Returns a IModel, returning either the contained object
-	 * or the given default value, depending on the nullness of the
-	 * contained object.
+	 * Returns a IModel, returning either the contained object or the given default value, depending
+	 * on the nullness of the contained object.
 	 *
-	 * @param other a default value
+	 * @param other
+	 *            a default value
 	 * @return a new IModel
 	 */
-	default IModel<T> orElse(T other) 
-    {
-		return (IModel<T>) () -> 
-        {
+	default IModel<T> orElse(T other)
+	{
+		return (IModel<T>)() -> {
 			T object = IModel.this.getObject();
-			if (object == null) 
-            {
+			if (object == null)
+			{
 				return other;
 			}
-			else 
-            {
+			else
+			{
 				return object;
 			}
 		};
 	}
 
 	/**
-	 * Returns a IModel, returning either the contained object
-	 * or invoking the given supplier to get a default value.
+	 * Returns a IModel, returning either the contained object or invoking the given supplier to get
+	 * a default value.
 	 *
-	 * @param other a supplier to be used as a default
+	 * @param other
+	 *            a supplier to be used as a default
 	 * @return a new IModel
 	 */
-	default IModel<T> orElseGet(WicketSupplier<? extends T> other) {
-		return (IModel<T>) () -> 
-        {
+	default IModel<T> orElseGet(WicketSupplier<? extends T> other)
+	{
+		return (IModel<T>)() -> {
 			T object = IModel.this.getObject();
-			if (object == null) 
-            {
+			if (object == null)
+			{
 				return other.get();
 			}
-			else 
-            {
+			else
+			{
 				return object;
 			}
 		};
 	}
 
 	/**
-	 * Returns a IModel lifting the given object into the
-	 * Model.
+	 * Returns a IModel lifting the given object into the Model.
 	 *
-	 * @param <T> the type of the given object
-	 * @param object an object to be lifted into a IModel
+	 * @param <T>
+	 *            the type of the given object
+	 * @param object
+	 *            an object to be lifted into a IModel
 	 * @return a new IModel
 	 */
-	static <T> IModel<T> of(T object) 
-    {
-		return of((WicketSupplier<T>) () -> object);
+	static <T> IModel<T> of(T object)
+	{
+		return of((WicketSupplier<T>)() -> object);
 	}
 
 	/**
-	 * Returns a IModel applying the given supplier to
-	 * get the object.
+	 * Returns a IModel applying the given supplier to get the object.
 	 *
-	 * @param <T> the type of the given object
-	 * @param supplier a supplier, to be used to get a value
+	 * @param <T>
+	 *            the type of the given object
+	 * @param supplier
+	 *            a supplier, to be used to get a value
 	 * @return a new IModel
 	 */
-	static <T> IModel<T> of(WicketSupplier<T> supplier) 
-    {
-		return (IModel<T>) () -> supplier.get();
+	static <T> IModel<T> of(WicketSupplier<T> supplier)
+	{
+		return (IModel<T>)() -> supplier.get();
 	}
 
 	/**
-	 * Returns a IModel using the getObject() method
-	 * of the given model.
+	 * Returns a IModel using the getObject() method of the given model.
 	 *
-	 * @param <T> the type of the contained object
-	 * @param model a model,
+	 * @param <T>
+	 *            the type of the contained object
+	 * @param model
+	 *            a model,
 	 * @return a new IModel
 	 */
-	static <T> IModel<T> of(IModel<T> model) 
-    {
-		return (IModel<T>) () -> model.getObject();
+	static <T> IModel<T> of(IModel<T> model)
+	{
+		return (IModel<T>)() -> model.getObject();
 	}
 }


[03/10] wicket git commit: fix formatting in IModel

Posted by mg...@apache.org.
fix formatting in IModel


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/095cb327
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/095cb327
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/095cb327

Branch: refs/heads/master
Commit: 095cb327c0b952bb734e1ce1bfa1da41abc69426
Parents: 70fa013
Author: Matthias Metzger <no...@yahoo.de>
Authored: Sun Apr 24 20:37:44 2016 +0200
Committer: Matthias Metzger <no...@yahoo.de>
Committed: Sun Apr 24 20:37:44 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    | 83 +++++++++++++-------
 1 file changed, 55 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/095cb327/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index eef15e1..fe17b26 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -91,13 +91,17 @@ public interface IModel<T> extends IDetachable
 	 * @param predicate a predicate to be used for testing the contained object
 	 * @return a new IModel
 	 */
-	default IModel<T> filter(WicketFunction<? super T, Boolean> predicate) {
-		return (IModel<T>) () -> {
+	default IModel<T> filter(WicketFunction<? super T, Boolean> predicate) 
+    {
+		return (IModel<T>) () -> 
+        {
 			T object = IModel.this.getObject();
-			if (object != null && predicate.apply(object)) {
+			if (object != null && predicate.apply(object)) 
+            {
 				return object;
 			}
-			else {
+			else 
+            {
 				return null;
 			}
 		};
@@ -111,13 +115,17 @@ public interface IModel<T> extends IDetachable
 	 * @param mapper a mapper, to be applied to the contained object
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> map(WicketFunction<? super T, R> mapper) {
-		return (IModel<R>) () -> {
+	default <R> IModel<R> map(WicketFunction<? super T, R> mapper) 
+    {
+		return (IModel<R>) () -> 
+        {
 			T object = IModel.this.getObject();
-			if (object == null) {
+			if (object == null) 
+            {
 				return null;
 			}
-			else {
+			else 
+            {
 				return mapper.apply(object);
 			}
 		};
@@ -134,14 +142,18 @@ public interface IModel<T> extends IDetachable
 	 * @param other another model to be combined with this one
 	 * @return a new IModel
 	 */
-	default <R, U> IModel<R> mapWith(WicketBiFunction<? super T, ? super U, R> combine, IModel<U> other) {
-		return (IModel<R>) () -> {
+	default <R, U> IModel<R> mapWith(WicketBiFunction<? super T, ? super U, R> combine, IModel<U> other) 
+    {
+		return (IModel<R>) () -> 
+        {
 			T t = IModel.this.getObject();
 			U u = other.getObject();
-			if (t != null && u != null) {
+			if (t != null && u != null) 
+            {
 				return combine.apply(t, u);
 			}
-			else {
+			else 
+            {
 				return null;
 			}
 		};
@@ -155,8 +167,9 @@ public interface IModel<T> extends IDetachable
 	 * @param mapper a mapper, to be applied to the contained object
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> flatMap(WicketFunction<? super T, IModel<R>> mapper) {
-		T object = IModel.this.getObject();
+	default <R> IModel<R> flatMap(WicketFunction<? super T, IModel<R>> mapper) 
+    {
+        T object = IModel.this.getObject();
 		return mapper.apply(object);
 	}
 
@@ -169,14 +182,18 @@ public interface IModel<T> extends IDetachable
 	 * to the contained model object.
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> apply(IModel<WicketFunction<? super T, R>> mapper) {
-		return (IModel<R>) () -> {
+	default <R> IModel<R> apply(IModel<WicketFunction<? super T, R>> mapper) 
+    {
+		return (IModel<R>) () -> 
+        {
 			T object = IModel.this.getObject();
 			WicketFunction<? super T, R> f = mapper.getObject();
-			if (object == null || f == null) {
+			if (object == null || f == null) 
+            {
 				return null;
 			}
-			else {
+			else 
+            {
 				return f.apply(object);
 			}
 		};
@@ -190,13 +207,17 @@ public interface IModel<T> extends IDetachable
 	 * @param other a default value
 	 * @return a new IModel
 	 */
-	default IModel<T> orElse(T other) {
-		return (IModel<T>) () -> {
+	default IModel<T> orElse(T other) 
+    {
+		return (IModel<T>) () -> 
+        {
 			T object = IModel.this.getObject();
-			if (object == null) {
+			if (object == null) 
+            {
 				return other;
 			}
-			else {
+			else 
+            {
 				return object;
 			}
 		};
@@ -210,12 +231,15 @@ public interface IModel<T> extends IDetachable
 	 * @return a new IModel
 	 */
 	default IModel<T> orElseGet(WicketSupplier<? extends T> other) {
-		return (IModel<T>) () -> {
+		return (IModel<T>) () -> 
+        {
 			T object = IModel.this.getObject();
-			if (object == null) {
+			if (object == null) 
+            {
 				return other.get();
 			}
-			else {
+			else 
+            {
 				return object;
 			}
 		};
@@ -229,7 +253,8 @@ public interface IModel<T> extends IDetachable
 	 * @param object an object to be lifted into a IModel
 	 * @return a new IModel
 	 */
-	static <T> IModel<T> of(T object) {
+	static <T> IModel<T> of(T object) 
+    {
 		return of((WicketSupplier<T>) () -> object);
 	}
 
@@ -241,7 +266,8 @@ public interface IModel<T> extends IDetachable
 	 * @param supplier a supplier, to be used to get a value
 	 * @return a new IModel
 	 */
-	static <T> IModel<T> of(WicketSupplier<T> supplier) {
+	static <T> IModel<T> of(WicketSupplier<T> supplier) 
+    {
 		return (IModel<T>) () -> supplier.get();
 	}
 
@@ -253,7 +279,8 @@ public interface IModel<T> extends IDetachable
 	 * @param model a model,
 	 * @return a new IModel
 	 */
-	static <T> IModel<T> of(IModel<T> model) {
+	static <T> IModel<T> of(IModel<T> model) 
+    {
 		return (IModel<T>) () -> model.getObject();
 	}
 }


[09/10] wicket git commit: Add tests for IModel#filter()

Posted by mg...@apache.org.
Add tests for IModel#filter()


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a1af5f9a
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a1af5f9a
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a1af5f9a

Branch: refs/heads/master
Commit: a1af5f9a34ad8d9c291ae279194898357a8612cc
Parents: 4cbaccd
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Sun Apr 24 21:49:22 2016 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Sun Apr 24 21:49:22 2016 +0200

----------------------------------------------------------------------
 .../org/apache/wicket/model/IModelTest.java     | 41 ++++++++++++++++++++
 .../apache/wicket/model/LambdaModelTest.java    | 18 +--------
 2 files changed, 42 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a1af5f9a/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java b/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java
new file mode 100644
index 0000000..ab342a9
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java
@@ -0,0 +1,41 @@
+package org.apache.wicket.model;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+
+import org.apache.wicket.model.lambda.Person;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for {@link IModel}'s methods
+ */
+public class IModelTest extends Assert
+{
+	@Test
+	public void filterMatch()
+	{
+		Person person = new Person();
+		String name = "john";
+		person.setName(name);
+
+		IModel<Person> johnModel = IModel.of(person)
+				.filter((p) -> p.getName().equals(name));
+
+		assertThat(johnModel.getObject(), is(person));
+	}
+
+	@Test
+	public void filterNoMatch()
+	{
+		Person person = new Person();
+		String name = "john";
+		person.setName(name);
+
+		IModel<Person> johnModel = IModel.of(person)
+				.filter((p) -> p.getName().equals("jane"));
+
+		assertThat(johnModel.getObject(), is(nullValue()));
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/a1af5f9a/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java b/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
index 597ed16..8bb31ff 100644
--- a/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/model/LambdaModelTest.java
@@ -38,24 +38,8 @@ public class LambdaModelTest
 	public void methodReference()
 	{
 		Person person = new Person();
-		person.setName("john");
-		Person.Address address = new Person.Address();
-		person.setAddress(address);
-//		address.setStreet("Street");
-		address.setNumber(123);
-
 		IModel<String> personNameModel = new LambdaModel<>(person::getName, person::setName);
-//		check(personNameModel);
-
-		IModel<Person.Address> addressModel = Model.<Person>of(Model.of(person))
-					.filter((p) -> p.getName().equals("john"))
-					.map(Person::getAddress);
-
-		System.err.println("addressModel= " + addressModel
-					.flatMap(address1 -> Model.loadableDetachable(() -> address1))
-					.map(Person.Address::getStreet)
-					.orElse("N/A")
-					.getObject());
+		check(personNameModel);
 	}
 
 	@Test


[04/10] wicket git commit: implement idea for lazy flatMap in IModel

Posted by mg...@apache.org.
implement idea for lazy flatMap in IModel

This approach has two problems though:

1. For every call of getObject, setObject and detach the whole
   model chain will be evaluated again.
2. It's the same problem like with the implementation before.
   When the setObject is called and any value in the retrieval
   has been null, no object will be set, which is unlike the
   PropertyModel, which would initialize any values being null.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/43489624
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/43489624
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/43489624

Branch: refs/heads/master
Commit: 4348962480949f61574a5172ca6b7f7749ddc5ff
Parents: 095cb32
Author: Matthias Metzger <no...@yahoo.de>
Authored: Sun Apr 24 20:42:40 2016 +0200
Committer: Matthias Metzger <no...@yahoo.de>
Committed: Sun Apr 24 20:42:40 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    | 43 +++++++++++++++++++-
 1 file changed, 41 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/43489624/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index fe17b26..d260360 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -169,8 +169,47 @@ public interface IModel<T> extends IDetachable
 	 */
 	default <R> IModel<R> flatMap(WicketFunction<? super T, IModel<R>> mapper) 
     {
-        T object = IModel.this.getObject();
-		return mapper.apply(object);
+        return new IModel<R>() 
+        {
+
+            @Override
+            public R getObject() 
+            {
+                T object = IModel.this.getObject();
+                if (object != null)
+                {
+                    return mapper.apply(object).getObject();
+                }
+                else
+                {
+                    return null;
+                }
+            }
+
+            @Override
+            public void setObject(R object) 
+            {
+                T modelObject = IModel.this.getObject();
+                if (modelObject != null)
+                {
+                    mapper.apply(modelObject).setObject(object);
+                }
+            }
+
+            @Override
+            public void detach() 
+            {
+                T object = IModel.this.getObject();
+                if (object != null)
+                {
+                    IModel<R> model = mapper.apply(object);
+                    if (model != null)
+                    {
+                        model.detach();
+                    }
+                }
+            }
+        };
 	}
 
 	/**


[10/10] wicket git commit: Add tests for IModel's default methods

Posted by mg...@apache.org.
Add tests for IModel's default methods


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bbe1ab60
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bbe1ab60
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bbe1ab60

Branch: refs/heads/master
Commit: bbe1ab60708e5c66a583ff43928dc04dcf34daba
Parents: a1af5f9
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Sun Apr 24 21:56:59 2016 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Sun Apr 24 21:56:59 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    |  4 +-
 .../org/apache/wicket/model/IModelTest.java     | 42 +++++++++++++++-----
 .../org/apache/wicket/model/lambda/Address.java | 33 +++++++++++++++
 .../org/apache/wicket/model/lambda/Person.java  | 27 -------------
 4 files changed, 68 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/bbe1ab60/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index 111ca62..b3c5c69 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -111,7 +111,7 @@ public interface IModel<T> extends IDetachable
 	}
 
 	/**
-	 * Returns a IModel applying the given mapper to the contained object, if it is not NULL.
+	 * Returns a IModel applying the given mapper to the contained object, if it is not {@code null}.
 	 *
 	 * @param <R>
 	 *            the new type of the contained object
@@ -259,7 +259,7 @@ public interface IModel<T> extends IDetachable
 
 	/**
 	 * Returns a IModel, returning either the contained object or the given default value, depending
-	 * on the nullness of the contained object.
+	 * on the {@code null}ness of the contained object.
 	 *
 	 * @param other
 	 *            a default value

http://git-wip-us.apache.org/repos/asf/wicket/blob/bbe1ab60/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java b/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java
index ab342a9..bc86e6f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/model/IModelTest.java
@@ -4,8 +4,10 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.nullValue;
 
+import org.apache.wicket.model.lambda.Address;
 import org.apache.wicket.model.lambda.Person;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -13,13 +15,25 @@ import org.junit.Test;
  */
 public class IModelTest extends Assert
 {
-	@Test
-	public void filterMatch()
+	private Person person;
+	private final String name = "John";
+	private final String street = "Strasse";
+
+	@Before
+	public void before()
 	{
-		Person person = new Person();
-		String name = "john";
+		person = new Person();
 		person.setName(name);
 
+		Address address = new Address();
+		person.setAddress(address);
+		address.setStreet(street);
+		address.setNumber(123);
+	}
+
+	@Test
+	public void filterMatch()
+	{
 		IModel<Person> johnModel = IModel.of(person)
 				.filter((p) -> p.getName().equals(name));
 
@@ -29,13 +43,23 @@ public class IModelTest extends Assert
 	@Test
 	public void filterNoMatch()
 	{
-		Person person = new Person();
-		String name = "john";
-		person.setName(name);
-
 		IModel<Person> johnModel = IModel.of(person)
-				.filter((p) -> p.getName().equals("jane"));
+				.filter((p) -> p.getName().equals("Jane"));
 
 		assertThat(johnModel.getObject(), is(nullValue()));
 	}
+
+	@Test
+	public void map()
+	{
+		IModel<String> personNameModel = IModel.of(person).map(Person::getName);
+		assertThat(personNameModel.getObject(), is(equalTo(name)));
+	}
+
+	@Test
+	public void map2()
+	{
+		IModel<String> streetModel = IModel.of(person).map(Person::getAddress).map(Address::getStreet);
+		assertThat(streetModel.getObject(), is(equalTo(street)));
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/bbe1ab60/wicket-core/src/test/java/org/apache/wicket/model/lambda/Address.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/lambda/Address.java b/wicket-core/src/test/java/org/apache/wicket/model/lambda/Address.java
new file mode 100644
index 0000000..b5385b5
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/model/lambda/Address.java
@@ -0,0 +1,33 @@
+package org.apache.wicket.model.lambda;
+
+import java.io.Serializable;
+
+/**
+ * A test object for lambda related tests
+ */
+public class Address implements Serializable
+{
+	private String street;
+
+	private int number;
+
+	public String getStreet()
+	{
+		return street;
+	}
+
+	public void setStreet(String street)
+	{
+		this.street = street;
+	}
+
+	public int getNumber()
+	{
+		return number;
+	}
+
+	public void setNumber(int number)
+	{
+		this.number = number;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/bbe1ab60/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java b/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
index 0134c46..175ac09 100644
--- a/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
+++ b/wicket-core/src/test/java/org/apache/wicket/model/lambda/Person.java
@@ -47,31 +47,4 @@ public class Person implements Serializable
 		this.address = address;
 	}
 
-	public static class Address implements Serializable
-	{
-		private String street;
-
-		private int number;
-
-		public String getStreet()
-		{
-			return street;
-		}
-
-		public void setStreet(String street)
-		{
-			this.street = street;
-		}
-
-		public int getNumber()
-		{
-			return number;
-		}
-
-		public void setNumber(int number)
-		{
-			this.number = number;
-		}
-	}
-
 }


[07/10] wicket git commit: Remove some unneeded factory methods

Posted by mg...@apache.org.
Remove some unneeded factory methods


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/274a3160
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/274a3160
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/274a3160

Branch: refs/heads/master
Commit: 274a3160588b98fcf6dbf16f618137693e88377e
Parents: a68dc57
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Sun Apr 24 21:43:57 2016 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Sun Apr 24 21:43:57 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    | 30 +-------------------
 1 file changed, 1 insertion(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/274a3160/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index 8f86030..111ca62 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -178,7 +178,6 @@ public interface IModel<T> extends IDetachable
 	{
 		return new IModel<R>()
 		{
-
 			@Override
 			public R getObject()
 			{
@@ -315,34 +314,7 @@ public interface IModel<T> extends IDetachable
 	 */
 	static <T> IModel<T> of(T object)
 	{
-		return of((WicketSupplier<T>)() -> object);
+		return () -> object;
 	}
 
-	/**
-	 * Returns a IModel applying the given supplier to get the object.
-	 *
-	 * @param <T>
-	 *            the type of the given object
-	 * @param supplier
-	 *            a supplier, to be used to get a value
-	 * @return a new IModel
-	 */
-	static <T> IModel<T> of(WicketSupplier<T> supplier)
-	{
-		return (IModel<T>)() -> supplier.get();
-	}
-
-	/**
-	 * Returns a IModel using the getObject() method of the given model.
-	 *
-	 * @param <T>
-	 *            the type of the contained object
-	 * @param model
-	 *            a model,
-	 * @return a new IModel
-	 */
-	static <T> IModel<T> of(IModel<T> model)
-	{
-		return (IModel<T>)() -> model.getObject();
-	}
 }


[02/10] wicket git commit: Use better bounds for the parameter types.

Posted by mg...@apache.org.
Use better bounds for the parameter types.

Rework #flatMap() to actually return the new model, so the developer can return writeable model. The drawback is that now it is not lazy. It would be lazy if the signature is: #flatMap(WicketFunction<IModel<T>, IModel<R>> mapper)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/70fa0136
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/70fa0136
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/70fa0136

Branch: refs/heads/master
Commit: 70fa0136ad6d58f1f8168b2e5937f7d1423381f7
Parents: 484132a
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Sun Apr 24 20:08:41 2016 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Sun Apr 24 20:08:41 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    | 25 +++++++-------------
 1 file changed, 9 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/70fa0136/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
index 789d27a..eef15e1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/IModel.java
@@ -91,7 +91,7 @@ public interface IModel<T> extends IDetachable
 	 * @param predicate a predicate to be used for testing the contained object
 	 * @return a new IModel
 	 */
-	default IModel<T> filter(WicketFunction<T, Boolean> predicate) {
+	default IModel<T> filter(WicketFunction<? super T, Boolean> predicate) {
 		return (IModel<T>) () -> {
 			T object = IModel.this.getObject();
 			if (object != null && predicate.apply(object)) {
@@ -111,7 +111,7 @@ public interface IModel<T> extends IDetachable
 	 * @param mapper a mapper, to be applied to the contained object
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> map(WicketFunction<T, R> mapper) {
+	default <R> IModel<R> map(WicketFunction<? super T, R> mapper) {
 		return (IModel<R>) () -> {
 			T object = IModel.this.getObject();
 			if (object == null) {
@@ -134,7 +134,7 @@ public interface IModel<T> extends IDetachable
 	 * @param other another model to be combined with this one
 	 * @return a new IModel
 	 */
-	default <R, U> IModel<R> mapWith(WicketBiFunction<T, U, R> combine, IModel<U> other) {
+	default <R, U> IModel<R> mapWith(WicketBiFunction<? super T, ? super U, R> combine, IModel<U> other) {
 		return (IModel<R>) () -> {
 			T t = IModel.this.getObject();
 			U u = other.getObject();
@@ -155,16 +155,9 @@ public interface IModel<T> extends IDetachable
 	 * @param mapper a mapper, to be applied to the contained object
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> flatMap(WicketFunction<T, IModel<R>> mapper) {
-		return (IModel<R>) () -> {
-			T object = IModel.this.getObject();
-			if (object == null) {
-				return null;
-			}
-			else {
-				return mapper.apply(object).getObject();
-			}
-		};
+	default <R> IModel<R> flatMap(WicketFunction<? super T, IModel<R>> mapper) {
+		T object = IModel.this.getObject();
+		return mapper.apply(object);
 	}
 
 	/**
@@ -176,10 +169,10 @@ public interface IModel<T> extends IDetachable
 	 * to the contained model object.
 	 * @return a new IModel
 	 */
-	default <R> IModel<R> apply(IModel<WicketFunction<T, R>> mapper) {
+	default <R> IModel<R> apply(IModel<WicketFunction<? super T, R>> mapper) {
 		return (IModel<R>) () -> {
 			T object = IModel.this.getObject();
-			WicketFunction<T, R> f = mapper.getObject();
+			WicketFunction<? super T, R> f = mapper.getObject();
 			if (object == null || f == null) {
 				return null;
 			}
@@ -216,7 +209,7 @@ public interface IModel<T> extends IDetachable
 	 * @param other a supplier to be used as a default
 	 * @return a new IModel
 	 */
-	default IModel<T> orElseGet(WicketSupplier<T> other) {
+	default IModel<T> orElseGet(WicketSupplier<? extends T> other) {
 		return (IModel<T>) () -> {
 			T object = IModel.this.getObject();
 			if (object == null) {


[08/10] wicket git commit: Merge branch 'monad-model'

Posted by mg...@apache.org.
Merge branch 'monad-model'


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/4cbaccde
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/4cbaccde
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/4cbaccde

Branch: refs/heads/master
Commit: 4cbaccde03cfef0d49d73ac1f2fe7c96fcf7568c
Parents: eaa3bfa 274a316
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Sun Apr 24 21:44:19 2016 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Sun Apr 24 21:44:19 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/model/IModel.java    | 245 ++++++++++++++++++-
 .../apache/wicket/model/LambdaModelTest.java    |  18 +-
 .../org/apache/wicket/model/lambda/Person.java  |  40 +++
 3 files changed, 299 insertions(+), 4 deletions(-)
----------------------------------------------------------------------