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

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new 2bcbb018 EMPIREDB-436 ControlTag and InputTag: prevent processUpdates 
propagation to children.
2bcbb018 is described below

commit 2bcbb01825c0764816cd7533418f1e1fd650251d
Author: Rainer Döbele <[email protected]>
AuthorDate: Fri Sep 27 14:14:30 2024 +0200

    EMPIREDB-436
    ControlTag and InputTag: prevent processUpdates propagation to children.
---
 .../empire/jakarta/components/ControlTag.java      | 33 ++++++++++++++++++++++
 .../apache/empire/jakarta/components/InputTag.java | 33 ++++++++++++++++++++++
 .../empire/jakarta/controls/InputControl.java      | 32 +++++++++++++++++++++
 .../empire/jakarta/utils/TagEncodingHelper.java    |  5 ++--
 .../apache/empire/jsf2/components/ControlTag.java  | 33 ++++++++++++++++++++++
 .../apache/empire/jsf2/components/InputTag.java    | 33 ++++++++++++++++++++++
 .../apache/empire/jsf2/controls/InputControl.java  | 32 +++++++++++++++++++++
 .../empire/jsf2/utils/TagEncodingHelper.java       |  5 ++--
 8 files changed, 202 insertions(+), 4 deletions(-)

diff --git 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java
 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java
index 938d136f..59d89bab 100644
--- 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java
+++ 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/ControlTag.java
@@ -732,6 +732,39 @@ public class ControlTag extends UIInput implements 
NamingContainer
             this.valueValidated = true;
         }
     }
+    
+    @Override
+    public void processUpdates(FacesContext context)
+    {
+        // Added for EMPIREDB-436 on 2024-09-27
+        try
+        {   
+            // setCachedFacesContext(context);
+            pushComponentToEL(context, this);
+            if (!isRendered())
+            {
+                return;
+            }
+            try
+            {
+                updateModel(context);
+            }
+            catch (RuntimeException e)
+            {
+                context.renderResponse();
+                throw e;
+            }
+            if (!isValid())
+            {
+                context.renderResponse();
+            }
+        }
+        finally
+        {
+            // setCachedFacesContext(null);
+            popComponentFromEL(context);
+        }
+    }
 
     @Override
     public void updateModel(FacesContext context)
diff --git 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java
 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java
index 4460ce72..7f24c4e9 100644
--- 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java
+++ 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/components/InputTag.java
@@ -344,6 +344,39 @@ public class InputTag extends UIInput implements 
NamingContainer
             this.valueValidated = true;
         }
     }
+    
+    @Override
+    public void processUpdates(FacesContext context)
+    {
+        // Added for EMPIREDB-436 on 2024-09-27
+        try
+        {   
+            // setCachedFacesContext(context);
+            pushComponentToEL(context, this);
+            if (!isRendered())
+            {
+                return;
+            }
+            try
+            {
+                updateModel(context);
+            }
+            catch (RuntimeException e)
+            {
+                context.renderResponse();
+                throw e;
+            }
+            if (!isValid())
+            {
+                context.renderResponse();
+            }
+        }
+        finally
+        {
+            // setCachedFacesContext(null);
+            popComponentFromEL(context);
+        }
+    }
 
     @Override
     public void updateModel(FacesContext context)
diff --git 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/InputControl.java
 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/InputControl.java
index 4b690841..e5eaed45 100644
--- 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/InputControl.java
+++ 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/controls/InputControl.java
@@ -339,6 +339,8 @@ public abstract class InputControl
             return; /* May want to override this */
         // Clear submitted value
         clearSubmittedValue(input);
+        // Clear local values
+        clearLocalValues(fc, input);
     }
     
     public Object getInputValue(UIComponent comp, InputInfo ii, boolean 
submitted)
@@ -517,6 +519,36 @@ public abstract class InputControl
         if (reqMap.containsKey(clientId))
             reqMap.remove(clientId);
     }
+    
+    protected void clearLocalValues(FacesContext context, UIComponent comp)
+    {
+        // UIInput
+        if (comp instanceof UIInput)
+        {
+            UIInput input = (UIInput)comp; 
+            if (input.isLocalValueSet())
+            {   input.setValue(null);
+                input.setLocalValueSet(false);
+                // log.debug("clearLocalValues performed for {}", 
input.getClass().getName());
+            }
+        }
+        // clearLocalValues of all facets and children of this UIComponent
+        if (comp.getFacetCount() > 0)
+        {
+            for (UIComponent facet : comp.getFacets().values())
+            {
+                clearLocalValues(context, facet);
+            }
+        }
+        // clear children
+        if (comp.getChildCount() > 0)
+        {
+            for (UIComponent child : comp.getChildren())
+            {
+                clearLocalValues(context, child);
+            }
+        }
+    }
 
     protected Object formatInputValue(Object value, InputInfo ii)
     {
diff --git 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java
 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java
index 5d201500..c4a80696 100644
--- 
a/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java
+++ 
b/empire-db-jakarta-faces/src/main/java/org/apache/empire/jakarta/utils/TagEncodingHelper.java
@@ -1303,8 +1303,9 @@ public class TagEncodingHelper implements NamingContainer
             return ((Options) attr);
         if (hasColumn())
         {   // Do we have a record?
-            if ((getRecord() instanceof Record) && ((Record) 
record).isValid()) 
-                return ((Record) record).getFieldOptions(unwrapColumn(column));
+            Object rec = (this.record!=null ? this.record : findRecord());
+            if ((rec instanceof Record) && ((Record)rec).isValid()) 
+                return ((Record)rec).getFieldOptions(unwrapColumn(column));
             // get From Column
             return column.getOptions();
         }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
index b8facc77..a4be6891 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/ControlTag.java
@@ -732,6 +732,39 @@ public class ControlTag extends UIInput implements 
NamingContainer
             this.valueValidated = true;
         }
     }
+    
+    @Override
+    public void processUpdates(FacesContext context)
+    {
+        // Added for EMPIREDB-436 on 2024-09-27
+        try
+        {   
+            // setCachedFacesContext(context);
+            pushComponentToEL(context, this);
+            if (!isRendered())
+            {
+                return;
+            }
+            try
+            {
+                updateModel(context);
+            }
+            catch (RuntimeException e)
+            {
+                context.renderResponse();
+                throw e;
+            }
+            if (!isValid())
+            {
+                context.renderResponse();
+            }
+        }
+        finally
+        {
+            // setCachedFacesContext(null);
+            popComponentFromEL(context);
+        }
+    }
 
     @Override
     public void updateModel(FacesContext context)
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
index c9d32df5..6ced44c8 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/InputTag.java
@@ -344,6 +344,39 @@ public class InputTag extends UIInput implements 
NamingContainer
             this.valueValidated = true;
         }
     }
+    
+    @Override
+    public void processUpdates(FacesContext context)
+    {
+        // Added for EMPIREDB-436 on 2024-09-27
+        try
+        {   
+            // setCachedFacesContext(context);
+            pushComponentToEL(context, this);
+            if (!isRendered())
+            {
+                return;
+            }
+            try
+            {
+                updateModel(context);
+            }
+            catch (RuntimeException e)
+            {
+                context.renderResponse();
+                throw e;
+            }
+            if (!isValid())
+            {
+                context.renderResponse();
+            }
+        }
+        finally
+        {
+            // setCachedFacesContext(null);
+            popComponentFromEL(context);
+        }
+    }
 
     @Override
     public void updateModel(FacesContext context)
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
index 8f4452bf..2e6b43f9 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
@@ -339,6 +339,8 @@ public abstract class InputControl
             return; /* May want to override this */
         // Clear submitted value
         clearSubmittedValue(input);
+        // Clear local values
+        clearLocalValues(fc, input);
     }
     
     public Object getInputValue(UIComponent comp, InputInfo ii, boolean 
submitted)
@@ -517,6 +519,36 @@ public abstract class InputControl
         if (reqMap.containsKey(clientId))
             reqMap.remove(clientId);
     }
+    
+    protected void clearLocalValues(FacesContext context, UIComponent comp)
+    {
+        // UIInput
+        if (comp instanceof UIInput)
+        {
+            UIInput input = (UIInput)comp; 
+            if (input.isLocalValueSet())
+            {   input.setValue(null);
+                input.setLocalValueSet(false);
+                // log.debug("clearLocalValues performed for {}", 
input.getClass().getName());
+            }
+        }
+        // clearLocalValues of all facets and children of this UIComponent
+        if (comp.getFacetCount() > 0)
+        {
+            for (UIComponent facet : comp.getFacets().values())
+            {
+                clearLocalValues(context, facet);
+            }
+        }
+        // clear children
+        if (comp.getChildCount() > 0)
+        {
+            for (UIComponent child : comp.getChildren())
+            {
+                clearLocalValues(context, child);
+            }
+        }
+    }
 
     protected Object formatInputValue(Object value, InputInfo ii)
     {
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
index e7067b6c..bd6daa3d 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
@@ -1303,8 +1303,9 @@ public class TagEncodingHelper implements NamingContainer
             return ((Options) attr);
         if (hasColumn())
         {   // Do we have a record?
-            if ((getRecord() instanceof Record) && ((Record) 
record).isValid()) 
-                return ((Record) record).getFieldOptions(unwrapColumn(column));
+            Object rec = (this.record!=null ? this.record : findRecord());
+            if ((rec instanceof Record) && ((Record)rec).isValid()) 
+                return ((Record)rec).getFieldOptions(unwrapColumn(column));
             // get From Column
             return column.getOptions();
         }

Reply via email to