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:28 UTC

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

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();
+                    }
+                }
+            }
+        };
 	}
 
 	/**