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;