You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ma...@apache.org on 2010/04/13 08:53:12 UTC

svn commit: r933494 - in /myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change: ChangeManager.java SessionChangeManager.java

Author: matzew
Date: Tue Apr 13 06:53:12 2010
New Revision: 933494

URL: http://svn.apache.org/viewvc?rev=933494&view=rev
Log:
TRINIDAD-1761 - Add support for rowKey change in ChangeManager module

thanks to Yuan Gao for the patch

Modified:
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/ChangeManager.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/SessionChangeManager.java

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/ChangeManager.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/ChangeManager.java?rev=933494&r1=933493&r2=933494&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/ChangeManager.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/ChangeManager.java Tue Apr 13 06:53:12 2010
@@ -145,6 +145,22 @@ public abstract class ChangeManager
     FacesContext facesContext,
     UIComponent uiComponent,
     ComponentChange change);
+  
+  /**
+   * Replace an AttributeComponentChange if it's present. 
+   * 
+   * @param facesContext
+   * @param uiComponent
+   * @param attributeComponentChange
+   * @return the old change instance
+   */
+  public AttributeComponentChange replaceAttributeChangeIfPresent(FacesContext facesContext,
+    UIComponent uiComponent,
+    AttributeComponentChange attributeComponentChange)
+  {    
+    _LOG.warning("Must be implemented by subclass");
+    return null;
+  }  
 
   /**
    * Add a DocumentChange to this current request for a specified component.

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/SessionChangeManager.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/SessionChangeManager.java?rev=933494&r1=933493&r2=933494&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/SessionChangeManager.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/change/SessionChangeManager.java Tue Apr 13 06:53:12 2010
@@ -100,101 +100,174 @@ public class SessionChangeManager extend
     UIComponent targetComponent,
     ComponentChange componentChange)
   {
-    String viewId = facesContext.getViewRoot().getViewId();
-    
-    // get the ComponentChanges for the current viewId
-    ChangesForView changesForView = _getChangesForView(facesContext, viewId, true);
-
     // get the absolute scopedId for the target component so that we have a unique identifier
     // to compare
     String scopedIdForTargetComponent = 
-                                     ComponentUtils.getScopedIdForComponent(targetComponent, null);
-
+      ComponentUtils.getScopedIdForComponent(targetComponent, null);
+    
     // try to collapse AttributeComponentChanges, handling component movement so that
     // we can collapse any attribute change on the same component
     if (componentChange instanceof AttributeComponentChange)
     {
       AttributeComponentChange attributeChange = (AttributeComponentChange)componentChange;
-      String attributeName = attributeChange.getAttributeName();
- 
-      // would really rather use a Deque here and iterate backwards, which would also make
-      // handling the rename changes easier
-      Iterator<QualifiedComponentChange> changes =
-                                            changesForView.getComponentChangesForView().iterator();
-      
-      // list of changes that have renamed the scoped id of this component.  We need to
-      // handle this aliasing when traversing through the changes looking for matches
-      Iterator<MoveChildComponentChange> renameChanges =
-                                       changesForView.getRenameChanges(scopedIdForTargetComponent);
-      
-      // we need to look through the rename list to map from the current names to
-      // the new names
-      MoveChildComponentChange nextRenameChange;
-      String currTargetScopedId;
+      _extractAttributeChange(facesContext, 
+                              scopedIdForTargetComponent, 
+                              attributeChange);
+    }
+
+    _insertComponentChange(facesContext, scopedIdForTargetComponent, componentChange);
+  }
+  
+  /**
+   * @inheritDoc
+   */
+  @Override
+  public AttributeComponentChange replaceAttributeChangeIfPresent(FacesContext facesContext,
+    UIComponent uiComponent,
+    AttributeComponentChange attributeComponentChange)
+  {    
+    // get the absolute scopedId for the target component so that we have a unique identifier
+    // to compare
+    String scopedIdForTargetComponent = 
+      ComponentUtils.getScopedIdForComponent(uiComponent, null);
+    
+    // check if we have an existing attribute change for the same attribute name, 
+    // if found, remove it
+    AttributeComponentChange replaced = 
+      _extractAttributeChange(facesContext, 
+                              scopedIdForTargetComponent, 
+                              attributeComponentChange);
+    
+    // if found, we insert the new change instance
+    if (replaced != null)
+    {
+      _insertComponentChange(facesContext, scopedIdForTargetComponent, attributeComponentChange);
+    }
+    
+    return replaced;
+  }  
+
+  /** 
+   * We don't support DocumentChange persistence
+   */
+  @Override
+  protected Document getDocument(FacesContext context)
+  {
+    return null;
+  }
+
+  /**
+   * Check if we have an existing attribute change for the same attribute name: 
+   * - if not found, return null
+   * - if found, remove and return the old change instance
+   * 
+   * @param facesContext
+   * @param uiComponent
+   * @param attributeChange
+   * @return the old change instance, null if not found
+   */
+  private AttributeComponentChange _extractAttributeChange(
+    FacesContext facesContext,
+    String scopedIdForTargetComponent,
+    AttributeComponentChange attributeChange)
+  {
+    AttributeComponentChange extracted = null;
+    
+    String viewId = facesContext.getViewRoot().getViewId();
+    
+    // get the ComponentChanges for the current viewId
+    ChangesForView changesForView = _getChangesForView(facesContext, viewId, true);
+
+    String attributeName = attributeChange.getAttributeName();
+
+    // would really rather use a Deque here and iterate backwards, which would also make
+    // handling the rename changes easier
+    Iterator<QualifiedComponentChange> changes =
+                                          changesForView.getComponentChangesForView().iterator();
+    
+    // list of changes that have renamed the scoped id of this component.  We need to
+    // handle this aliasing when traversing through the changes looking for matches
+    Iterator<MoveChildComponentChange> renameChanges =
+                                     changesForView.getRenameChanges(scopedIdForTargetComponent);
+    
+    // we need to look through the rename list to map from the current names to
+    // the new names
+    MoveChildComponentChange nextRenameChange;
+    String currTargetScopedId;
+    
+    if (renameChanges.hasNext())
+    {
+      // we have at least one rename change, so get it and find the name that this
+      // component was originally known by
+      nextRenameChange = renameChanges.next();
+      currTargetScopedId = nextRenameChange.getSourceScopedId();
+    }
+    else
+    {
+      nextRenameChange = null;
+      currTargetScopedId = scopedIdForTargetComponent;
+    }
+    
+    // loop forward through the changes looking for AttributeChanges to collapse
+    while (changes.hasNext())
+    {
+      QualifiedComponentChange currQualifiedChange = changes.next();
       
-      if (renameChanges.hasNext())
+      if (currQualifiedChange.getComponentChange() == nextRenameChange)
       {
-        // we have at least one rename change, so get it and find the name that this
-        // component was originally known by
-        nextRenameChange = renameChanges.next();
-        currTargetScopedId = nextRenameChange.getSourceScopedId();
-      }
-      else
-      {
-        nextRenameChange = null;
-        currTargetScopedId = scopedIdForTargetComponent;
+        // we got a match, so update the scoped id we should be looking for
+        currTargetScopedId = nextRenameChange.getDestinationScopedId();
+        
+        nextRenameChange = (renameChanges.hasNext())
+                             ? renameChanges.next()
+                             : null;
       }
-      
-      // loop forward through the changes looking for AttributeChanges to collapse
-      while (changes.hasNext())
+      else if (currQualifiedChange.getTargetComponentScopedId().equals(currTargetScopedId))
       {
-        QualifiedComponentChange currQualifiedChange = changes.next();
+        // found a change on the same component.  Check if it's an AttributeChange
+        ComponentChange currChange = currQualifiedChange.getComponentChange();
         
-        if (currQualifiedChange.getComponentChange() == nextRenameChange)
+        if (currChange instanceof AttributeComponentChange)
         {
-          // we got a match, so update the scoped id we should be looking for
-          currTargetScopedId = nextRenameChange.getDestinationScopedId();
+          AttributeComponentChange currAttributeChange = (AttributeComponentChange)currChange;
           
-          nextRenameChange = (renameChanges.hasNext())
-                               ? renameChanges.next()
-                               : null;
-        }
-        else if (currQualifiedChange.getTargetComponentScopedId().equals(currTargetScopedId))
-        {
-          // found a change on the same component.  Check if it's an AttributeChange
-          ComponentChange currChange = currQualifiedChange.getComponentChange();
-          
-          if (currChange instanceof AttributeComponentChange)
+          // Check if the AttributeChange is for the same attribute
+          if (attributeName.equals(currAttributeChange.getAttributeName()))
           {
-            AttributeComponentChange currAttributeChange = (AttributeComponentChange)currChange;
-            
-            // Check if the AttributeChange is for the same attribute
-            if (attributeName.equals(currAttributeChange.getAttributeName()))
-            {
-              // the old AttributeChange is for the same attribute, so remove it since the
-              // new AttributeChange would eclipse it anyway.
-              changes.remove();
-              break;
-            }
+            // the old AttributeChange is for the same attribute, so remove it since the
+            // new AttributeChange would eclipse it anyway.
+            changes.remove();
+            extracted = currAttributeChange;
+            break;
           }
         }
       }
     }
 
-    QualifiedComponentChange newQualifiedChange = new QualifiedComponentChange(
-                                                                      scopedIdForTargetComponent,
-                                                                      componentChange);
-    
-    changesForView.addChange(newQualifiedChange);
+    return extracted;    
   }
 
-  /** 
-   * We don't support DocumentChange persistence
+  /**
+   * insert a component change for a specific component
+   * 
+   * @param facesContext
+   * @param scopedIdForTargetComponent
+   * @param componentChange
    */
-  @Override
-  protected Document getDocument(FacesContext context)
+  private void _insertComponentChange(FacesContext facesContext,
+                                      String scopedIdForTargetComponent,
+                                      ComponentChange componentChange) 
   {
-    return null;
+    String viewId = facesContext.getViewRoot().getViewId();
+    
+    // get the ComponentChanges for the current viewId
+    ChangesForView changesForView = _getChangesForView(facesContext, viewId, true);
+
+    QualifiedComponentChange newQualifiedChange = 
+      new QualifiedComponentChange(scopedIdForTargetComponent,
+                                   componentChange);
+    
+    changesForView.addChange(newQualifiedChange);
   }
   
   /**