You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2023/04/13 14:01:20 UTC

[myfaces] branch main updated: MYFACES-4600

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

tandraschko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/main by this push:
     new 1d093c337 MYFACES-4600
1d093c337 is described below

commit 1d093c337b85386906bb91b57f90a665a7e4af0e
Author: Thomas Andraschko <ta...@apache.org>
AuthorDate: Thu Apr 13 16:01:02 2023 +0200

    MYFACES-4600
---
 .../main/java/jakarta/faces/component/UIData.java  |  51 ++++-----
 .../core/api/shared/EditableValueHolderState.java  | 118 +++++++++++++++++++++
 .../myfaces/view/facelets/component/UIRepeat.java  | 117 ++++----------------
 3 files changed, 156 insertions(+), 130 deletions(-)

diff --git a/api/src/main/java/jakarta/faces/component/UIData.java b/api/src/main/java/jakarta/faces/component/UIData.java
index 72d7293c2..c5655f27d 100644
--- a/api/src/main/java/jakarta/faces/component/UIData.java
+++ b/api/src/main/java/jakarta/faces/component/UIData.java
@@ -59,6 +59,7 @@ import java.util.regex.Pattern;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFComponent;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFacet;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
+import org.apache.myfaces.core.api.shared.EditableValueHolderState;
 import org.apache.myfaces.core.api.shared.lang.Assert;
 
 /**
@@ -298,30 +299,6 @@ public class UIData extends UIComponentBase implements NamingContainer, UniqueId
         }
     };
 
-    private static class EditableValueHolderState implements Serializable
-    {
-        private final Object _value;
-        private final boolean _localValueSet;
-        private final boolean _valid;
-        private final Object _submittedValue;
-
-        public EditableValueHolderState(EditableValueHolder evh)
-        {
-            _value = evh.getLocalValue();
-            _localValueSet = evh.isLocalValueSet();
-            _valid = evh.isValid();
-            _submittedValue = evh.getSubmittedValue();
-        }
-
-        public void restoreState(EditableValueHolder evh)
-        {
-            evh.setValue(_value);
-            evh.setLocalValueSet(_localValueSet);
-            evh.setValid(_valid);
-            evh.setSubmittedValue(_submittedValue);
-        }
-    }
-
     /**
      * Construct an instance of the UIData.
      */
@@ -791,9 +768,14 @@ public class UIData extends UIComponentBase implements NamingContainer, UniqueId
                     if (descendantStateIndex != -1 && descendantStateIndex < stateCollection.size())
                     {
                         Object[] object = stateCollection.get(descendantStateIndex);
-                        if (object[0] != null && component instanceof EditableValueHolder)
+                        if (component instanceof EditableValueHolder)
                         {
-                            ((EditableValueHolderState) object[0]).restoreState((EditableValueHolder) component);
+                            EditableValueHolderState evhState = (EditableValueHolderState) object[0];
+                            if (evhState == null)
+                            {
+                                evhState = EditableValueHolderState.EMPTY;
+                            }
+                            evhState.restoreState((EditableValueHolder) component);
                         }
 
                         // If there is descendant state to restore, call it recursively, otherwise
@@ -835,9 +817,14 @@ public class UIData extends UIComponentBase implements NamingContainer, UniqueId
                     if (descendantStateIndex != -1 && descendantStateIndex < stateCollection.size())
                     {
                         Object[] object = stateCollection.get(descendantStateIndex);
-                        if (object[0] != null && component instanceof EditableValueHolder)
+                        if (component instanceof EditableValueHolder)
                         {
-                            ((EditableValueHolderState) object[0]).restoreState((EditableValueHolder) component);
+                            EditableValueHolderState evhState = (EditableValueHolderState) object[0];
+                            if (evhState == null)
+                            {
+                                evhState = EditableValueHolderState.EMPTY;
+                            }
+                            evhState.restoreState((EditableValueHolder) component);
                         }
 
                         // If there is descendant state to restore, call it recursively, otherwise
@@ -955,9 +942,9 @@ public class UIData extends UIComponentBase implements NamingContainer, UniqueId
                         }
                     
                         childStates.add(child.getChildCount() > 0
-                                ? new Object[]{ new EditableValueHolderState((EditableValueHolder) child),
+                                ? new Object[]{ EditableValueHolderState.create((EditableValueHolder) child),
                                     saveDescendantComponentStates(child, saveChildFacets, true) }
-                                : new Object[]{ new EditableValueHolderState((EditableValueHolder) child), null });
+                                : new Object[]{ EditableValueHolderState.create((EditableValueHolder) child), null });
                     }
                     else if (child.getChildCount() > 0 || (saveChildFacets && child.getFacetCount() > 0))
                     {
@@ -1035,9 +1022,9 @@ public class UIData extends UIComponentBase implements NamingContainer, UniqueId
                         }
                     
                         childStates.add(child.getChildCount() > 0
-                                ? new Object[]{ new EditableValueHolderState((EditableValueHolder) child),
+                                ? new Object[] { EditableValueHolderState.create((EditableValueHolder) child),
                                     saveDescendantComponentStates(child, saveChildFacets, true) }
-                                : new Object[]{ new EditableValueHolderState((EditableValueHolder) child), null });
+                                : new Object[] { EditableValueHolderState.create((EditableValueHolder) child), null });
                     }
                     else if (child.getChildCount() > 0 || (saveChildFacets && child.getFacetCount() > 0))
                     {
diff --git a/api/src/main/java/org/apache/myfaces/core/api/shared/EditableValueHolderState.java b/api/src/main/java/org/apache/myfaces/core/api/shared/EditableValueHolderState.java
new file mode 100644
index 000000000..bcb293079
--- /dev/null
+++ b/api/src/main/java/org/apache/myfaces/core/api/shared/EditableValueHolderState.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.core.api.shared;
+
+import jakarta.faces.component.EditableValueHolder;
+import java.io.Serializable;
+
+public class EditableValueHolderState implements Serializable
+{
+    public static final EditableValueHolderState EMPTY = new ImmutableEditableValueHolderState();
+
+    private static final long serialVersionUID = 2920252657338389849L;
+
+    private boolean localValueSet;
+    private Object submittedValue;
+    private boolean valid;
+    private Object localValue;
+
+    public EditableValueHolderState()
+    {
+        this.localValueSet = false;
+        this.valid = true;
+    }        
+
+    public EditableValueHolderState(EditableValueHolder evh)
+    {
+        this();
+        saveState(evh);
+    }        
+
+    public boolean isLocalValueSet() 
+    {
+        return localValueSet;
+    }
+
+    public Object getSubmittedValue()
+    {
+        return submittedValue;
+    }
+
+    public boolean isValid()
+    {
+        return valid;
+    }
+
+    public Object getLocalValue()
+    {
+        return localValue;
+    }
+
+    @Override
+    public String toString()
+    {
+        return "EditableValueHolderState{"
+                + "localValueSet=" + localValueSet
+                + ", submittedValue=" + submittedValue
+                + ", valid=" + valid
+                + ", localValue=" + localValue + '}';
+    }
+
+    public void saveState(EditableValueHolder evh)
+    {
+        this.localValue = evh.getLocalValue();
+        this.valid = evh.isValid();
+        this.submittedValue = evh.getSubmittedValue();
+        this.localValueSet = evh.isLocalValueSet();
+    }
+
+    public void restoreState(EditableValueHolder evh)
+    {
+        evh.setValue(localValue);
+        evh.setValid(valid);
+        evh.setSubmittedValue(submittedValue);
+        evh.setLocalValueSet(localValueSet);
+    }
+
+    public static EditableValueHolderState create(EditableValueHolder evh)
+    {
+        if (isEmpty(evh))
+        {
+            return null;
+        }
+
+        return new EditableValueHolderState(evh);
+    }
+
+    public static boolean isEmpty(EditableValueHolder evh)
+    {
+        return evh.getLocalValue() == null
+                && evh.isValid()
+                && evh.getSubmittedValue() == null;
+    }
+
+    public static class ImmutableEditableValueHolderState extends EditableValueHolderState
+    {
+        @Override
+        public void saveState(EditableValueHolder evh)
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java b/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java
index b0c55026c..f7af6bcb7 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java
@@ -19,7 +19,6 @@
 package org.apache.myfaces.view.facelets.component;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.sql.ResultSet;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -58,6 +57,7 @@ import jakarta.faces.render.Renderer;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFComponent;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
 import org.apache.myfaces.cdi.model.FacesDataModelManager;
+import org.apache.myfaces.core.api.shared.EditableValueHolderState;
 import org.apache.myfaces.core.api.shared.lang.Assert;
 import org.apache.myfaces.core.api.shared.lang.SharedStringBuilder;
 import org.apache.myfaces.util.ExternalSpecifications;
@@ -421,9 +421,14 @@ public class UIRepeat extends UIComponentBase implements NamingContainer
                     if (descendantStateIndex != -1 && descendantStateIndex < stateCollection.size())
                     {
                         Object[] object = stateCollection.get(descendantStateIndex);
-                        if (object[0] != null && component instanceof EditableValueHolder)
+                        if (component instanceof EditableValueHolder)
                         {
-                            ((SavedState) object[0]).restoreState((EditableValueHolder) component);
+                            EditableValueHolderState evhState = (EditableValueHolderState) object[0];
+                            if (evhState == null)
+                            {
+                                evhState = EditableValueHolderState.EMPTY;
+                            }
+                            evhState.restoreState((EditableValueHolder) component);
                         }
                         // If there is descendant state to restore, call it recursively, otherwise
                         // it is safe to skip iteration.
@@ -464,9 +469,14 @@ public class UIRepeat extends UIComponentBase implements NamingContainer
                     if (descendantStateIndex != -1 && descendantStateIndex < stateCollection.size())
                     {
                         Object[] object = stateCollection.get(descendantStateIndex);
-                        if (object[0] != null && component instanceof EditableValueHolder)
+                        if (component instanceof EditableValueHolder)
                         {
-                            ((SavedState) object[0]).restoreState((EditableValueHolder) component);
+                            EditableValueHolderState evhState = (EditableValueHolderState) object[0];
+                            if (evhState == null)
+                            {
+                                evhState = EditableValueHolderState.EMPTY;
+                            }
+                            evhState.restoreState((EditableValueHolder) component);
                         }
                         // If there is descendant state to restore, call it recursively, otherwise
                         // it is safe to skip iteration.
@@ -584,9 +594,9 @@ public class UIRepeat extends UIComponentBase implements NamingContainer
                         }
                     
                         childStates.add(child.getChildCount() > 0 ? 
-                                new Object[]{new SavedState((EditableValueHolder) child),
+                                new Object[] { EditableValueHolderState.create((EditableValueHolder) child),
                                     saveDescendantComponentStates(child, saveChildFacets, true)} :
-                                new Object[]{new SavedState((EditableValueHolder) child),
+                                new Object[] { EditableValueHolderState.create((EditableValueHolder) child),
                                     null});
                     }
                     else if (child.getChildCount() > 0 || (saveChildFacets && child.getFacetCount() > 0))
@@ -665,9 +675,9 @@ public class UIRepeat extends UIComponentBase implements NamingContainer
                         }
                     
                         childStates.add(child.getChildCount() > 0 ? 
-                                new Object[]{new SavedState((EditableValueHolder) child),
+                                new Object[] { EditableValueHolderState.create((EditableValueHolder) child),
                                     saveDescendantComponentStates(child, saveChildFacets, true)} :
-                                new Object[]{new SavedState((EditableValueHolder) child),
+                                new Object[] { EditableValueHolderState.create((EditableValueHolder) child),
                                     null});
                     }
                     else if (child.getChildCount() > 0 || (saveChildFacets && child.getFacetCount() > 0))
@@ -1392,95 +1402,6 @@ public class UIRepeat extends UIComponentBase implements NamingContainer
         }
     }
 
-    // from RI
-    private final static class SavedState implements Serializable
-    {
-        private boolean _localValueSet;
-        private Object _submittedValue;
-        private boolean _valid = true;
-        private Object _value;
-
-        private static final long serialVersionUID = 2920252657338389849L;
-        
-        public SavedState(EditableValueHolder evh)
-        {
-            _value = evh.getLocalValue();
-            _localValueSet = evh.isLocalValueSet();
-            _valid = evh.isValid();
-            _submittedValue = evh.getSubmittedValue();
-        }        
-
-        Object getSubmittedValue()
-        {
-            return (_submittedValue);
-        }
-
-        void setSubmittedValue(Object submittedValue)
-        {
-            _submittedValue = submittedValue;
-        }
-
-        boolean isValid()
-        {
-            return (_valid);
-        }
-
-        void setValid(boolean valid)
-        {
-            _valid = valid;
-        }
-
-        Object getValue()
-        {
-            return _value;
-        }
-
-        public void setValue(Object value)
-        {
-            _value = value;
-        }
-
-        boolean isLocalValueSet()
-        {
-            return _localValueSet;
-        }
-
-        public void setLocalValueSet(boolean localValueSet)
-        {
-            _localValueSet = localValueSet;
-        }
-
-        @Override
-        public String toString()
-        {
-            return ("submittedValue: " + _submittedValue + " value: " + _value + " localValueSet: " + _localValueSet);
-        }
-        
-        public void restoreState(EditableValueHolder evh)
-        {
-            evh.setValue(_value);
-            evh.setValid(_valid);
-            evh.setSubmittedValue(_submittedValue);
-            evh.setLocalValueSet(_localValueSet);
-        }
-
-        public void populate(EditableValueHolder evh)
-        {
-            _value = evh.getLocalValue();
-            _valid = evh.isValid();
-            _submittedValue = evh.getSubmittedValue();
-            _localValueSet = evh.isLocalValueSet();
-        }
-
-        public void apply(EditableValueHolder evh)
-        {
-            evh.setValue(_value);
-            evh.setValid(_valid);
-            evh.setSubmittedValue(_submittedValue);
-            evh.setLocalValueSet(_localValueSet);
-        }
-    }
-
     private final class IndexedEvent extends FacesEvent
     {
         private final FacesEvent _target;