You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/10/02 19:15:01 UTC
svn commit: r1003837 -
/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
Author: lu4242
Date: Sat Oct 2 17:15:01 2010
New Revision: 1003837
URL: http://svn.apache.org/viewvc?rev=1003837&view=rev
Log:
MYFACES-2935 SystemEvent Acid Test (prevent add components twice on restore and remove duplicate ids)
Modified:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java?rev=1003837&r1=1003836&r2=1003837&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java Sat Oct 2 17:15:01 2010
@@ -52,6 +52,7 @@ import javax.faces.view.ViewMetadata;
import org.apache.myfaces.shared_impl.renderkit.RendererUtils;
import org.apache.myfaces.shared_impl.util.ClassUtils;
+import org.apache.myfaces.shared_impl.util.HashMapUtils;
/**
* This class implements partial state saving feature when facelets
@@ -225,91 +226,105 @@ public class DefaultFaceletsStateManagem
if (clientIdsRemoved != null)
{
+ Set<String> idsRemovedSet = new HashSet<String>(HashMapUtils.calcCapacity(clientIdsRemoved.size()));
for (String clientId : clientIdsRemoved)
{
- view.invokeOnComponent(context, clientId, new ContextCallback()
- {
- public void invokeContextCallback(FacesContext context,
- UIComponent target)
+ if (!idsRemovedSet.contains(clientId))
+ {
+ view.invokeOnComponent(context, clientId, new ContextCallback()
{
- if (target.getParent() != null)
+ public void invokeContextCallback(FacesContext context,
+ UIComponent target)
{
- if (!target.getParent().getChildren().remove(target))
+ if (target.getParent() != null)
{
- String key = null;
- for (Map.Entry<String, UIComponent> entry : target.getParent().getFacets().entrySet())
+ if (!target.getParent().getChildren().remove(target))
{
- if (entry.getValue()==target)
+ String key = null;
+ for (Map.Entry<String, UIComponent> entry : target.getParent().getFacets().entrySet())
{
- key = entry.getKey();
- break;
+ if (entry.getValue()==target)
+ {
+ key = entry.getKey();
+ break;
+ }
+ }
+ if (key != null)
+ {
+ target.getParent().getFacets().remove(key);
}
- }
- if (key != null)
- {
- target.getParent().getFacets().remove(key);
}
}
}
- }
- });
+ });
+ idsRemovedSet.add(clientId);
+ }
}
+ clientIdsRemoved.clear();
+ clientIdsRemoved.addAll(idsRemovedSet);
}
List<String> clientIdsAdded = getClientIdsAdded(view);
if (clientIdsAdded != null)
{
+ Set<String> idsAddedSet = new HashSet<String>(HashMapUtils.calcCapacity(clientIdsAdded.size()));
for (String clientId : clientIdsAdded)
{
- final AttachedFullStateWrapper wrapper = (AttachedFullStateWrapper) states.get(clientId);
- if (wrapper != null)
+ if (!idsAddedSet.contains(clientId))
{
- final Object[] addedState = (Object[]) wrapper.getWrappedStateObject();
- if (addedState != null)
+ final AttachedFullStateWrapper wrapper = (AttachedFullStateWrapper) states.get(clientId);
+ if (wrapper != null)
{
- if (addedState.length == 2)
+ final Object[] addedState = (Object[]) wrapper.getWrappedStateObject();
+ if (addedState != null)
{
- view = (UIViewRoot) internalRestoreTreeStructure((TreeStructComponent) addedState[0]);
- view.processRestoreState(context, addedState[1]);
- break;
- }
- else
- {
- final String parentClientId = (String) addedState[0];
- view.invokeOnComponent(context, parentClientId, new ContextCallback()
+ if (addedState.length == 2)
+ {
+ view = (UIViewRoot) internalRestoreTreeStructure((TreeStructComponent) addedState[0]);
+ view.processRestoreState(context, addedState[1]);
+ break;
+ }
+ else
{
- public void invokeContextCallback(FacesContext context,
- UIComponent target)
+ final String parentClientId = (String) addedState[0];
+ view.invokeOnComponent(context, parentClientId, new ContextCallback()
{
- if (addedState[1] != null)
+ public void invokeContextCallback(FacesContext context,
+ UIComponent target)
{
- String facetName = (String) addedState[1];
- UIComponent child = internalRestoreTreeStructure((TreeStructComponent) addedState[3]);
- child.processRestoreState(context, addedState[4]);
- target.getFacets().put(facetName,child);
- }
- else
- {
- Integer childIndex = (Integer) addedState[2];
- UIComponent child = internalRestoreTreeStructure((TreeStructComponent) addedState[3]);
- child.processRestoreState(context, addedState[4]);
- try
+ if (addedState[1] != null)
{
- target.getChildren().add(childIndex, child);
+ String facetName = (String) addedState[1];
+ UIComponent child = internalRestoreTreeStructure((TreeStructComponent) addedState[3]);
+ child.processRestoreState(context, addedState[4]);
+ target.getFacets().put(facetName,child);
}
- catch (IndexOutOfBoundsException e)
+ else
{
- // We can't be sure about where should be this
- // item, so just add it.
- target.getChildren().add(child);
+ Integer childIndex = (Integer) addedState[2];
+ UIComponent child = internalRestoreTreeStructure((TreeStructComponent) addedState[3]);
+ child.processRestoreState(context, addedState[4]);
+ try
+ {
+ target.getChildren().add(childIndex, child);
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ // We can't be sure about where should be this
+ // item, so just add it.
+ target.getChildren().add(child);
+ }
}
}
- }
- });
+ });
+ }
}
}
+ idsAddedSet.add(clientId);
}
}
+ clientIdsAdded.clear();
+ clientIdsAdded.addAll(idsAddedSet);
}
}
}