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 2014/09/02 21:04:00 UTC
svn commit: r1622094 -
/myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
Author: lu4242
Date: Tue Sep 2 19:03:59 2014
New Revision: 1622094
URL: http://svn.apache.org/r1622094
Log:
MYFACES-3918 DefaultFaceletsStateManagementStrategy: keep list of removed client IDs stable over time
Modified:
myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
Modified: myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java?rev=1622094&r1=1622093&r2=1622094&view=diff
==============================================================================
--- myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java (original)
+++ myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java Tue Sep 2 19:03:59 2014
@@ -412,8 +412,13 @@ public class DefaultFaceletsStateManagem
String clientId = clientIdsRemoved.get(i);
if (!idsRemovedSet.contains(clientId))
{
- view.invokeOnComponent(context, clientId, new RemoveComponentCallback());
- idsRemovedSet.add(clientId);
+ RemoveComponentCallback callback = new RemoveComponentCallback();
+ view.invokeOnComponent(context, clientId, callback);
+ if (callback.isComponentFound())
+ {
+ //Add only if component found
+ idsRemovedSet.add(clientId);
+ }
}
}
clientIdsRemoved.clear();
@@ -472,32 +477,50 @@ public class DefaultFaceletsStateManagem
public static class RemoveComponentCallback implements ContextCallback
{
+ private boolean componentFound;
+
+ public RemoveComponentCallback()
+ {
+ this.componentFound = false;
+ }
+
public void invokeContextCallback(FacesContext context,
UIComponent target)
{
- if (target.getParent() != null)
+ if (target.getParent() != null &&
+ !target.getParent().getChildren().remove(target))
{
- if (!target.getParent().getChildren().remove(target))
+ String key = null;
+ if (target.getParent().getFacetCount() > 0)
{
- String key = null;
- if (target.getParent().getFacetCount() > 0)
+ for (Map.Entry<String, UIComponent> entry :
+ target.getParent().getFacets().entrySet())
{
- for (Map.Entry<String, UIComponent> entry :
- target.getParent().getFacets().entrySet())
+ if (entry.getValue()==target)
{
- if (entry.getValue()==target)
- {
- key = entry.getKey();
- break;
- }
+ key = entry.getKey();
+ break;
}
}
- if (key != null)
+ }
+ if (key != null)
+ {
+ UIComponent removedTarget = target.getParent().getFacets().remove(key);
+ if (removedTarget != null)
{
- target.getParent().getFacets().remove(key);
+ this.componentFound = true;
}
}
}
+ else
+ {
+ this.componentFound = true;
+ }
+ }
+
+ public boolean isComponentFound()
+ {
+ return this.componentFound;
}
}
@@ -1135,9 +1158,25 @@ public class DefaultFaceletsStateManagem
public void suscribeListeners(UIViewRoot uiViewRoot)
{
- PostAddPreRemoveFromViewListener componentListener = new PostAddPreRemoveFromViewListener();
- uiViewRoot.subscribeToViewEvent(PostAddToViewEvent.class, componentListener);
- uiViewRoot.subscribeToViewEvent(PreRemoveFromViewEvent.class, componentListener);
+ boolean listenerSubscribed = false;
+ List<SystemEventListener> pavList = uiViewRoot.getViewListenersForEventClass(PostAddToViewEvent.class);
+ if (pavList != null)
+ {
+ for (SystemEventListener listener : pavList)
+ {
+ if (listener instanceof PostAddPreRemoveFromViewListener)
+ {
+ listenerSubscribed = true;
+ break;
+ }
+ }
+ }
+ if (!listenerSubscribed)
+ {
+ PostAddPreRemoveFromViewListener componentListener = new PostAddPreRemoveFromViewListener();
+ uiViewRoot.subscribeToViewEvent(PostAddToViewEvent.class, componentListener);
+ uiViewRoot.subscribeToViewEvent(PreRemoveFromViewEvent.class, componentListener);
+ }
}
private void checkIds (FacesContext context, UIComponent component, Set<String> existingIds)