This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new d652b3d  ISIS-2340: vaa: fix unidirectional binding
d652b3d is described below

commit d652b3d51d0b21ba927545c6bec80d2eb9b6ec59
Author: Andi Huber <[email protected]>
AuthorDate: Fri Aug 28 08:09:19 2020 +0200

    ISIS-2340: vaa: fix unidirectional binding
---
 .../viewer/vaadin/ui/binding/BindingsVaa.java      | 98 ++++++++++++++--------
 .../vaadin/ui/pages/main/UiActionHandlerVaa.java   |  2 +-
 2 files changed, 65 insertions(+), 35 deletions(-)

diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
index 951494e..5e58354 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
@@ -19,6 +19,7 @@
 package org.apache.isis.incubator.viewer.vaadin.ui.binding;
 
 import java.time.LocalDate;
+import java.util.Objects;
 import java.util.function.Function;
 
 import com.vaadin.flow.component.HasValidation;
@@ -50,10 +51,8 @@ import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.experimental.UtilityClass;
-import lombok.extern.log4j.Log4j2;
 
 @UtilityClass
-@Log4j2
 public final class BindingsVaa {
 
     /**
@@ -67,37 +66,23 @@ public final class BindingsVaa {
             final @NonNull Observable<ManagedObject> value) {
 
         uiField.setReadOnly(true);
+        val binder = new Binder<Observable<ManagedObject>>();
+        val internalBinding = InternalUnidirBinding.<V>of();
+
+        binder.forField(uiField)
+        .bind(
+                internalBinding, 
+                null
+                );
+        
+        binder.setBean(value);
+        
+        //TODO supposed to account for changes originating from backend side
+        //need to check whether this is possible with Vaadin
         value.addListener((e, oldValue, newValue)->{
             uiField.setValue(_Casts.uncheckedCast(newValue.getPojo()));
         });
-    }
-
-    @RequiredArgsConstructor(staticName = "of")
-    private static class InternalBidirBinding<V> 
-    implements 
-        ValueProvider<Bindable<ManagedObject>, V>, 
-        Setter<Bindable<ManagedObject>, V> 
-    {
-
-        private static final long serialVersionUID = 1L;
-        private final @NonNull ObjectSpecification valueSpec;
-
-        //GETTER
-        @Override
-        public V apply(Bindable<ManagedObject> source) {
-            val newFieldValue = 
_Casts.<V>uncheckedCast(source.getValue().getPojo());
-            log.debug("InternalBidirBinding <<< {}", newFieldValue);
-            return newFieldValue;
-        }
-
-        //SETTER
-        @Override
-        public void accept(Bindable<ManagedObject> target, V fieldValue) {
-            log.debug("InternalBidirBinding {} >>>", fieldValue);
-            target.setValue(ManagedObject.of(valueSpec, fieldValue));
-        }
-
-
+        
     }
 
     /**
@@ -115,8 +100,6 @@ public final class BindingsVaa {
         val binder = new Binder<Bindable<ManagedObject>>();
         val internalBinding = InternalBidirBinding.<V>of(valueSpec);
 
-        //TODO does not account for changes originating from backend side
-        //need to check whether true bi-dir binding is possible with Vaadin
         binder.forField(uiField)
         .bind(
                 internalBinding::apply, 
@@ -124,6 +107,13 @@ public final class BindingsVaa {
                 );
         
         binder.setBean(value);
+        
+        //TODO supposed to account for changes originating from backend side
+        //need to check whether this is possible with Vaadin
+        value.addListener((e, oldValue, newValue)->{
+            uiField.setValue(_Casts.uncheckedCast(newValue.getPojo()));
+        });
+
     }
 
     /**
@@ -151,7 +141,7 @@ public final class BindingsVaa {
         if(managedFeature instanceof ManagedParameter) {
 
             val managedParameter = (ManagedParameter)managedFeature;
-            val isReadOnly = false;
+            val isReadOnly = false; // TODO also handle case when parameters 
are readonly 
             uiField.setReadOnly(isReadOnly);
 
             // r/w binding
@@ -265,7 +255,7 @@ public final class BindingsVaa {
 
             return validationMessage==null
                     ? Result.ok(newValue)
-                            : Result.error(validationMessage);
+                    : Result.error(validationMessage);
         }
 
         @Override
@@ -311,11 +301,51 @@ public final class BindingsVaa {
 
     }
 
+    // -- HELPER
 
+    @RequiredArgsConstructor(staticName = "of")
+    private static class InternalUnidirBinding<V> 
+    implements ValueProvider<Observable<ManagedObject>, V> {
 
+        private static final long serialVersionUID = 1L;
 
+        //GETTER
+        @Override
+        public V apply(@NonNull Observable<ManagedObject> source) {
+            val newFieldValue = source.getValue() == null 
+                    ? null
+                    : _Casts.<V>uncheckedCast(source.getValue().getPojo());
+            return newFieldValue;
+        }
 
+    }
+    
+    @RequiredArgsConstructor(staticName = "of")
+    private static class InternalBidirBinding<V> 
+    implements 
+        ValueProvider<Bindable<ManagedObject>, V>, 
+        Setter<Bindable<ManagedObject>, V> 
+    {
 
+        private static final long serialVersionUID = 1L;
+        private final @NonNull ObjectSpecification valueSpec;
+
+        //GETTER
+        @Override
+        public V apply(@NonNull Bindable<ManagedObject> source) {
+            val newFieldValue = 
_Casts.<V>uncheckedCast(source.getValue().getPojo());
+            return newFieldValue;
+        }
+
+        //SETTER
+        @Override
+        public void accept(@NonNull Bindable<ManagedObject> target, V 
fieldValue) {
+            target.setValue(ManagedObject.of(valueSpec, fieldValue));
+        }
+
+
+    }
+    
 
 
 }
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
index 391930a..6dd2972 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
@@ -58,7 +58,7 @@ public class UiActionHandlerVaa {
                     uiComponentFactory, 
                     managedAction,
                     params->{
-                        log.info("param negotiation done {}", params);
+                        log.info("param negotiation done");
                         invoke(managedAction, params);
                         return true; //TODO handle vetoes
                     });

Reply via email to