Repository: wicket
Updated Branches:
  refs/heads/master 822dfd05f -> b3155edbc


WICKET-5991 allow LambdaModel to be used read-only with functionr too


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

Branch: refs/heads/master
Commit: 0ac5c90f274e9496ecac8dd5705d64987000282b
Parents: 822dfd0
Author: Sven Meier <[email protected]>
Authored: Tue Mar 15 11:32:48 2016 +0100
Committer: Sven Meier <[email protected]>
Committed: Tue Mar 15 11:32:48 2016 +0100

----------------------------------------------------------------------
 .../org/apache/wicket/model/LambdaModel.java    | 40 ++++++++++++++++++++
 .../apache/wicket/model/LambdaModelTest.java    | 14 +++++--
 2 files changed, 51 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0ac5c90f/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java 
b/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java
index 2dfa17c..643d4a9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java
@@ -116,6 +116,46 @@ public class LambdaModel<T> implements IModel<T>
         * Create a {@link LambdaModel} for a given target. Usage:
         * <pre>
         * {@code
+        *      LambdaModel.of(personModel, Person::getName)
+        * }
+        * </pre>
+        * The target model will be detached automatically.
+        *
+        * @param targe target for getter and setter
+        * @param getter used to get a value
+        * @return model
+        *
+        * @param <X> target model object type
+        * @param <T> model object type
+        */
+       public static <X, T> IModel<T> of(IModel<X> target, WicketFunction<X, 
T> getter)
+       {
+               return new LambdaModel<T>(
+                       () ->
+                       {
+                               X x = target.getObject();
+                               if (x == null) {
+                                       return null;
+                               }
+                               return getter.apply(x);
+                       },
+
+                       (t) ->
+                       {
+                               throw new 
UnsupportedOperationException("setObject(Object) not supported");
+                       }
+               ) {
+                       @Override
+                       public void detach() {
+                               target.detach();
+                       }
+               };
+       }
+
+       /**
+        * Create a {@link LambdaModel} for a given target. Usage:
+        * <pre>
+        * {@code
         *      LambdaModel.of(personModel, Person::getName, Person::setName)
         * }
         * </pre>

http://git-wip-us.apache.org/repos/asf/wicket/blob/0ac5c90f/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 e1f5713..b5e0eaa 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
@@ -19,13 +19,12 @@ package org.apache.wicket.model;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.nullValue;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 
 import org.apache.wicket.core.util.lang.WicketObjects;
 import org.apache.wicket.lambda.WicketConsumer;
 import org.apache.wicket.lambda.WicketSupplier;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LambdaModel;
 import org.apache.wicket.model.lambda.Person;
 import org.junit.Test;
 
@@ -61,6 +60,15 @@ public class LambdaModelTest
                check(personNameModel);
        }
 
+       @Test(expected=UnsupportedOperationException.class)
+       public void targetReadOnly()
+       {
+               IModel<Person> target = Model.of(new Person());
+
+               IModel<String> personNameModel = LambdaModel.of(target, 
Person::getName);
+               check(personNameModel);
+       }
+
        @Test
        public void equality()
        {

Reply via email to