You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ar...@apache.org on 2009/02/21 21:22:35 UTC

svn commit: r746584 - in /myfaces/trinidad/branches/1.2.10.1-branch: ./ trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/ trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/ trinidad-impl/src/main/java/org/apache/myfaces/tri...

Author: arobinson74
Date: Sat Feb 21 20:22:35 2009
New Revision: 746584

URL: http://svn.apache.org/viewvc?rev=746584&view=rev
Log:
TRINIDAD-1402 - add component level control of partial target adding

Modified:
    myfaces/trinidad/branches/1.2.10.1-branch/   (props changed)
    myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java
    myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/PartialPageContext.java
    myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java
    myfaces/trinidad/branches/1.2.10.1-branch/trinidad-sandbox/sandbox-api/src/main/java-templates/org/apache/myfaces/trinidad/sandbox/component/   (props changed)
    myfaces/trinidad/branches/1.2.10.1-branch/trinidad-sandbox/sandbox-api/src/main/java/org/apache/myfaces/trinidad/sandbox/event/   (props changed)

Propchange: myfaces/trinidad/branches/1.2.10.1-branch/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Feb 21 20:22:35 2009
@@ -1,2 +1,4 @@
+/myfaces/trinidad/branches/1.2.11.1-branch:745918
 /myfaces/trinidad/branches/1.2.9.1-branch:697924,699406,699496
+/myfaces/trinidad/branches/TRINIDAD-1402:745675
 /myfaces/trinidad/trunk_1.2.x:738664,739156

Modified: myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java?rev=746584&r1=746583&r2=746584&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java (original)
+++ myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java Sat Feb 21 20:22:35 2009
@@ -6,9 +6,9 @@
  *  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
@@ -23,14 +23,12 @@
 import java.util.Collection;
 import java.util.Iterator;
 
-import javax.faces.component.UIComponent;
-
 import javax.el.MethodExpression;
 
 import javax.faces.component.NamingContainer;
+import javax.faces.component.UIComponent;
 import javax.faces.component.UINamingContainer;
 import javax.faces.context.FacesContext;
-
 import javax.faces.event.PhaseId;
 import javax.faces.render.Renderer;
 
@@ -44,6 +42,7 @@
 import org.apache.myfaces.trinidad.event.AttributeChangeListener;
 import org.apache.myfaces.trinidad.render.CoreRenderer;
 
+
 /**
  * Pure abstract base class for all UIX components.
  */
@@ -108,7 +107,7 @@
     S callbackContext) throws IOException
   {
     if (child.isRendered())
-    {      
+    {
        // component is an action FlattenedComponent.  Ask it to flatten its children
       if ((child instanceof FlattenedComponent) &&
           ((FlattenedComponent)child).isFlatteningChildren(context))
@@ -130,7 +129,7 @@
           // if startDepth is > 0, only the first visible child will be marked as starting a group
           cpContext.resetStartDepth();
         }
-        
+
         return true;
       }
     }
@@ -195,7 +194,7 @@
   {
     // we haven't processed a child yet
     boolean processedChild = false;
-    
+
     for (UIComponent currChild : children)
     {
       // latch processed child to the first child processed
@@ -204,7 +203,7 @@
                                                  currChild,
                                                  callbackContext);
     }
-    
+
     return processedChild;
   }
 
@@ -237,7 +236,7 @@
   {
     return visitTree(visitContext, this, callback);
   }
-  
+
   /**
   * <p>Perform a tree visit starting at the specified node in the tree.</p>
   *
@@ -272,7 +271,7 @@
     if (component instanceof UIXComponent)
     {
       uixComponent = (UIXComponent)component;
-      
+
       // delegate to the UIXComponent
       if (!uixComponent.isVisitable(visitContext))
         return false;
@@ -282,10 +281,10 @@
       // use generic isVisitable implemetation
       if (!_isVisitable(visitContext, component))
         return false;
-      
+
       uixComponent = null;
     }
-    
+
     // invoke the callback for this component
     VisitResult result = visitContext.invokeVisitCallback(component, callback);
 
@@ -299,7 +298,7 @@
       RenderingContext rc = (PhaseId.RENDER_RESPONSE == phaseId)
                               ? RenderingContext.getCurrentInstance()
                               : null;
-      
+
       if (uixComponent != null)
       {
         // assume that all UIXComponent NamingContainers always act as NamingContainers,
@@ -311,7 +310,7 @@
           if (visitContext.getSubtreeIdsToVisit(uixComponent).isEmpty())
             return false;
         }
-        
+
         // UIXComponents are allowed to set up their context differently for encoding
         // than normal processing, so behave differently if this is the RenderResponse
         // phase
@@ -334,22 +333,22 @@
             return false;
         }
       }
-      
+
       // visit the children of the component
       try
       {
         Iterator<UIComponent> kids = component.getFacetsAndChildren();
-              
+
         while(kids.hasNext())
         {
           boolean done;
-          
+
           UIComponent currChild = kids.next();
-          
+
           if (currChild instanceof UIXComponent)
           {
             UIXComponent uixChild = (UIXComponent)currChild;
-            
+
             // delegate to UIXComponent's visitTree implementation to allow
             // subclassses to modify the behavior
             done = uixChild.visitTree(visitContext, callback);
@@ -359,7 +358,7 @@
             // use generic visit implementation
             done = visitTree(visitContext, currChild, callback);
           }
-          
+
           // If any kid visit returns true, we are done.
           if (done)
           {
@@ -385,15 +384,53 @@
     }
     else
     {
-      assert(result == VisitResult.REJECT);      
+      assert(result == VisitResult.REJECT);
     }
 
     // if we got this far, we're not done
     return false;
   }
 
-  
-  
+  /**
+   * Add a component as a partial target to the current request. This code handles the
+   * delegation to {@link #setPartialTarget(FacesContext, PartialPageContext)}
+   * for UIXComponents or assumes for {@link UIComponent} that components with a renderer
+   * type are able to produce DOM elements that have IDs that can be replaced.
+   *
+   * @param facesContext the faces context
+   * @param partialContext the partial page context
+   * @param component the component to add as a target
+   */
+  public static void addPartialTarget(FacesContext facesContext,
+    PartialPageContext partialContext, UIComponent component)
+  {
+    if (component instanceof UIXComponent)
+    {
+      ((UIXComponent)component).setPartialTarget(facesContext, partialContext);
+    }
+    else
+    {
+      // default to using the renderer type implementation
+      _addPartialTargetImpl(facesContext, partialContext, component);
+    }
+  }
+
+  /**
+   * Marks this component as a partial target for this request. Typically called
+   * by the {@link org.apache.myfaces.trinidad.context.RequestContext RequestContext}.
+   * The component should add the client ID the desired rendered component to the context.
+   * This allows components that do not render a replacable DOM element with an ID
+   * to choose an alternative component, like a parent.
+   *
+   * @param facesContext the faces context
+   * @param partialContext the partial page context
+   */
+  protected void setPartialTarget(FacesContext facesContext,
+    PartialPageContext partialContext)
+  {
+    UIXComponent._addPartialTargetImpl(facesContext, partialContext, this);
+  }
+
   /**
    * <p>Called by
    * {@link UIXComponent#visitTree UIXComponent.visitTree()} to determine
@@ -413,7 +450,29 @@
   {
     return _isVisitable(visitContext, this);
   }
-  
+
+  /**
+   * @see #addPartialTarget(FacesContext, PartialPageContext, UIComponent)
+   * @see #setPartialTarget(FacesContext, PartialPageContext)
+   */
+  private static void _addPartialTargetImpl(
+    FacesContext facesContext, PartialPageContext partialContext, UIComponent component)
+  {
+    if (component.getRendererType() == null)
+    {
+      if (component.getParent() != null)
+      {
+        // delegate to the parent component, assuming that no renderer type means that
+        // there is no suitable replacable DOM element for this component
+        addPartialTarget(facesContext, partialContext, component.getParent());
+      }
+    }
+    else
+    {
+      partialContext.addPartialTarget(component.getClientId(facesContext));
+    }
+  }
+
   /**
    * default implementation checking the <code>VisitHint.SKIP_TRANSIENT</code> and
    * <code>VisitHint.SKIP_UNRENDERED</code> hints.
@@ -421,16 +480,16 @@
   private static boolean _isVisitable(VisitContext visitContext, UIComponent component)
   {
     Collection<VisitHint> hints = visitContext.getHints();
-    
+
     if (hints.contains(VisitHint.SKIP_TRANSIENT) && component.isTransient())
       return false;
-    
+
     if (hints.contains(VisitHint.SKIP_UNRENDERED) && !component.isRendered())
       return false;
-    
+
     return true;
   }
-  
+
   /**
    * <p>
    * Called when visiting the component during optimized partial page encoding so that the
@@ -457,7 +516,7 @@
   {
     FacesContext context  = visitContext.getFacesContext();
     Renderer     renderer = getRenderer(context);
-    
+
     if (renderer instanceof CoreRenderer)
     {
       // delegate to the CoreRenderer
@@ -500,7 +559,7 @@
   {
     // do nothing
   }
-  
+
   /**
    * <p>Tears down context created in order to visit or invoke the component
    * for all phases.</p>
@@ -513,11 +572,11 @@
    * @see #setUpEncodingContext
    * @see #tearDownEncodingContext
    */
-  protected void tearDownVisitingContext(FacesContext context) 
+  protected void tearDownVisitingContext(FacesContext context)
   {
     // do nothing
   }
-  
+
   /**
    * <p>Sets up the context necessary to encode the component.</p>
    * <p>The default implementation delegates to
@@ -535,13 +594,13 @@
   protected void setUpEncodingContext(FacesContext context, RenderingContext rc)
   {
     setupVisitingContext(context);
-    
+
     Renderer renderer = getRenderer(context);
-    
+
     if (renderer instanceof CoreRenderer)
     {
       CoreRenderer coreRenderer = (CoreRenderer)renderer;
-      
+
       coreRenderer.setupEncodingContext(context, rc, this);
     }
   }
@@ -565,15 +624,15 @@
     RenderingContext rc)
   {
     Renderer renderer = getRenderer(context);
-    
+
     try
     {
       if (renderer instanceof CoreRenderer)
       {
         CoreRenderer coreRenderer = (CoreRenderer)renderer;
-      
+
         coreRenderer.tearDownEncodingContext(context, rc, this);
-      } 
+      }
     }
     finally
     {
@@ -606,7 +665,7 @@
 
   /**
    * Gets the registered AttributeChangeListeners.
-   */ 
+   */
   abstract public AttributeChangeListener[] getAttributeChangeListeners();
 
   /**
@@ -630,11 +689,11 @@
   abstract public MethodExpression getAttributeChangeListener();
 
   abstract public void markInitialState();
-  
+
   /**
-   * Provides additional context (the target child component for which the container 
+   * Provides additional context (the target child component for which the container
    * client ID is requested) to a naming container for constructing a client ID.
-   * This is useful for components such as @link UIXTable and @link UIXTreeTable which need 
+   * This is useful for components such as @link UIXTable and @link UIXTreeTable which need
    * to return different container client IDs for stamped and non-stamped child components.
    * @see UIXComponentBase#getClientId(FacesContext context)
    */

Modified: myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/PartialPageContext.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/PartialPageContext.java?rev=746584&r1=746583&r2=746584&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/PartialPageContext.java (original)
+++ myfaces/trinidad/branches/1.2.10.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/PartialPageContext.java Sat Feb 21 20:22:35 2009
@@ -6,9 +6,9 @@
  *  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
@@ -38,6 +38,7 @@
  *
  * @version $Name:  $ ($Revision: adfrt/faces/adf-faces-impl/src/main/java/oracle/adfinternal/view/faces/renderkit/core/ppr/PartialPageContext.java#0 $) $Date: 10-nov-2005.19:02:58 $
  */
+// TODO why is this an abstract class and not an interface?
 abstract public class PartialPageContext
 {
   protected PartialPageContext()
@@ -110,7 +111,7 @@
    * @return the client ids of the partial targets that have been rendered so far.
    */
   abstract public Iterator<String> getRenderedPartialTargets();
-  
+
   /**
    * Returns the VisitContext to use when partial rendering.
    * @return the VisitContext to use when partial rendering.

Modified: myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java?rev=746584&r1=746583&r2=746584&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java (original)
+++ myfaces/trinidad/branches/1.2.10.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java Sat Feb 21 20:22:35 2009
@@ -6,9 +6,9 @@
  *  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
@@ -23,6 +23,7 @@
 import java.io.Serializable;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -37,12 +38,12 @@
 import javax.faces.component.UIViewRoot;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
-
 import javax.faces.event.PhaseId;
 
 import org.apache.myfaces.trinidad.change.ChangeManager;
 import org.apache.myfaces.trinidad.change.NullChangeManager;
 import org.apache.myfaces.trinidad.change.SessionChangeManager;
+import org.apache.myfaces.trinidad.component.UIXComponent;
 import org.apache.myfaces.trinidad.component.visit.VisitContext;
 import org.apache.myfaces.trinidad.component.visit.VisitHint;
 import org.apache.myfaces.trinidad.config.RegionManager;
@@ -74,6 +75,8 @@
 import org.apache.myfaces.trinidadinternal.util.nls.LocaleUtils;
 import org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl;
 
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
+
 
 /**
  */
@@ -191,7 +194,7 @@
 
     return true;
   }
-  
+
   @SuppressWarnings("unchecked")
   @Override
   public boolean isPartialRequest(FacesContext context)
@@ -218,11 +221,11 @@
   {
     //=-= Scott O'Bryan =-=
     // FIXME: Not real happy with this.  We should find a way to get this into
-    // the bean.  The bean is cached by the RequestContextFactory, and the 
+    // the bean.  The bean is cached by the RequestContextFactory, and the
     // Portlet mode needs to be assigned per request since it's possible to run
     // a trinidad application from a servlet container and a portlet container
     // at the same time.  For now?  Hey, it works.
-    
+
     if(ExternalContextUtils.isPortlet(__getFacesContext().getExternalContext()))
     {
       return CoreRenderKit.OUTPUT_MODE_PORTLET;
@@ -238,23 +241,23 @@
 
   @Override
   public Accessibility getAccessibilityMode()
-  { 
+  {
     String name = (String) _bean.getProperty(
       RequestContextBean.ACCESSIBILITY_MODE_KEY);
-    
+
     return _ACCESSIBILITY_NAMES.get(name);
   }
 
   @Override
   public AccessibilityProfile getAccessibilityProfile()
-  { 
+  {
     return (AccessibilityProfile) _bean.getProperty(
       RequestContextBean.ACCESSIBILITY_PROFILE_KEY);
   }
 
   @Override
   public ClientValidation getClientValidation()
-  { 
+  {
     ClientValidation clientValidation = (ClientValidation)
       _bean.getProperty(RequestContextBean.CLIENT_VALIDATION_KEY);
 
@@ -275,7 +278,7 @@
   {
     return !Boolean.FALSE.equals(_bean.getProperty(RequestContextBean.ANIMATION_ENABLED_KEY));
   }
-  
+
   @Override
   public char getNumberGroupingSeparator()
   {
@@ -297,7 +300,7 @@
     char c = CoreRenderer.toChar(property);
     if (c != CoreRenderer.CHAR_UNDEFINED)
       return c;
-      
+
     return (char) 0;
   }
 
@@ -333,14 +336,14 @@
     FacesContext context = __getFacesContext();
     Map<String, Object> appMap = context.getExternalContext().getApplicationMap();
     ChangeManager changeManager = _getHeldProperty(appMap, _CHANGE_MANAGER_KEY, ChangeManager.class);
-    
+
     if (changeManager == null)
     {
       changeManager = _createChangeManager();
-      
+
       _setHeldProperty(appMap, _CHANGE_MANAGER_KEY, changeManager);
     }
-    
+
     return changeManager;
   }
 
@@ -437,10 +440,10 @@
 
     if (o instanceof Locale)
       return (Locale) o;
-    
+
     // Don't know how this would ever get here.  ConfigParser should have set the key if
     // formatting-locale was specified, or it is null.
-    if (o instanceof String)  
+    if (o instanceof String)
       o = ((String)o).replace('_', '-');
     return LocaleUtils.getLocaleForIANAString(o.toString());
   }
@@ -471,7 +474,7 @@
   //
 
   @Override
-  public void addPartialTarget(UIComponent newTarget)
+  public void addPartialTarget(UIComponent target)
   {
     FacesContext fContext = __getFacesContext();
 
@@ -480,26 +483,19 @@
     PartialPageContext pContext = null;
 
     if (afContext != null)
-      pContext = afContext.getPartialPageContext();
-
-    // find the nearest ancestor that generates html markup:
-    newTarget = _getNearestPPRTarget(newTarget);
-    String clientId = newTarget.getClientId(fContext);
-
-    _LOG.finer("Adding partial target: {0}", newTarget);
-
-    if (pContext != null)
     {
-      pContext.addPartialTarget(clientId);
+      pContext = afContext.getPartialPageContext();
     }
-    else
+
+    if (pContext == null)
     {
-      // If we haven't built the partial context yet, maintain a list of the
-      // target IDs that have requested partial update.
-      _partialTargets.add(clientId);
+      pContext = new MockPartialPageContext(fContext);
     }
+
+    // delegate to UIXComponent to allow for components to influence the IDs that get added
+    UIXComponent.addPartialTarget(fContext, pContext, target);
   }
-  
+
   /**
    * @see org.apache.myfaces.trinidad.context.RequestContext#addPartialTargets(javax.faces.component.UIComponent, java.lang.String[])
    */
@@ -528,9 +524,9 @@
   {
     HashSet<UIComponent> set = new HashSet<UIComponent>();
     _addPartialTargets(set, source);
-    return set;    
+    return set;
   }
-  
+
   @Override
   public void addPartialTriggerListeners
     (UIComponent listener,
@@ -544,24 +540,24 @@
     for (int i = 0; i < triggers.length; i++)
     {
       String trigger = triggers[i];
-            
+
 
       UIComponent master = ComponentUtils.findRelativeComponent(listener, trigger);
-      
+
       boolean deprecatedFind = false;
-    
+
       if (master == null)
       {
         UIComponent from = listener;
         // backward compatible code
-        // The old rule is "if the component is a naming container, search relative 
-        // to the parent; otherwise, search relative to the component." 
+        // The old rule is "if the component is a naming container, search relative
+        // to the parent; otherwise, search relative to the component."
         if (listener instanceof NamingContainer)
         {
           from = listener.getParent();
           master = ComponentUtils.findRelativeComponent(from, trigger);
           deprecatedFind = true;
-        } 
+        }
       }
 
       if (master == null)
@@ -570,14 +566,14 @@
       }
       else
       {
-        // if we found this with the deprecated method, 
+        // if we found this with the deprecated method,
         // then warn the user to change their syntax.
         if (deprecatedFind)
         {
-          _LOG.warning("DEPRECATED_TRIGGER_SYNTAX", 
+          _LOG.warning("DEPRECATED_TRIGGER_SYNTAX",
             new Object[] {trigger, listener});
         }
-      
+
         // Get the set of listeners on this trigger and add this component.
         Set<UIComponent> listeners = pl.get(master);
         if (listeners == null)
@@ -625,7 +621,7 @@
   }
 
   /**
-   * <p>Creates a VisitContext instance for use with 
+   * <p>Creates a VisitContext instance for use with
    * {@link org.apache.myfaces.trinidad.component.UIXComponent#visitTree UIComponent.visitTree()}.</p>
    *
    * @param context the FacesContext for the current request
@@ -634,7 +630,7 @@
    * @param hints the VisitHints to apply to the visit
    * @param phaseId.  PhaseId if any for this visit.  If PhaseId is specified,
    * hints must contain VisitHint.EXECUTE_LIFECYCLE
-   * @return a VisitContext instance that is initialized with the 
+   * @return a VisitContext instance that is initialized with the
    *   specified ids and hints.
    */
    @Override
@@ -781,24 +777,6 @@
     return fContext;
   }
 
-  /**
-   * Components that do not render any html-markup cannot be
-   * added as PPR targets. This method will walk up the component
-   * tree finding the nearest ancestor that does render markup.
-   * Components that return null for {@link UIComponent#getRendererType}
-   * are treated as generating no markup.
-   * @param component This component, and its ancestors will be searched.
-   * @return the first component that does render html-markup.
-   */
-  private UIComponent _getNearestPPRTarget(UIComponent component)
-  {
-    while(component.getRendererType() == null)
-    {
-      component = component.getParent();
-    }
-    return component;
-  }
-
   private Map<UIComponent, Set<UIComponent>> _getPartialListeners()
   {
     if (_partialListeners == null)
@@ -818,7 +796,7 @@
     Set<UIComponent> listeners = pl.get(from);
     if (listeners == null)
       return;
-    
+
     for (UIComponent target : listeners)
     {
       // If we haven't encountered this target yet, add
@@ -832,7 +810,7 @@
   }
 
   /**
-   * Convenience function for cached properties potentially held using a TransientHolder 
+   * Convenience function for cached properties potentially held using a TransientHolder
    * that hides the TransientHolder.getValue() step from the caller
    * @param stateMap Map containing TransientHolders to retrieve value from
    * @param key Key value/TransientHolder value is held under
@@ -862,7 +840,7 @@
         }
       }
     }
-    
+
     return null;
   }
 
@@ -873,10 +851,89 @@
   {
     if (!(value instanceof Serializable))
       value = TransientHolder.newTransientHolder(value);
-    
+
     stateMap.put(key, value);
   }
 
+  private class MockPartialPageContext
+    extends PartialPageContext
+  {
+    private MockPartialPageContext(FacesContext facesContext)
+    {
+      _facesContext = facesContext;
+    }
+
+    @Override
+    public boolean areAllTargetsProcessed()
+    {
+      // will never be true outside of rendering
+      return false;
+    }
+
+    @Override
+    public boolean isPartialTargetRendered(String id)
+    {
+      // not valid outside of rendering
+      return false;
+    }
+
+    @Override
+    public boolean isInsidePartialTarget()
+    {
+      // not valid outside of rendering
+      return false;
+    }
+
+    public void addRenderedPartialTarget(String id)
+    {
+      // not valid outside of rendering
+      throw new NotImplementedException();
+    }
+
+    public boolean isPartialTarget(String clientId)
+    {
+      return _partialTargets.contains(clientId);
+    }
+
+    public boolean isPossiblePartialTarget(String componentId)
+    {
+      return _componentIds.contains(componentId);
+    }
+
+    public Iterator<String> getPartialTargets()
+    {
+      return _partialTargets.iterator();
+    }
+
+    public void addPartialTarget(String clientId)
+    {
+      _partialTargets.add(clientId);
+
+      int lastFragmentIndex = clientId.lastIndexOf(NamingContainer.SEPARATOR_CHAR);
+
+      String id = (lastFragmentIndex != -1)
+                    ? clientId.substring(lastFragmentIndex + 1)
+                    : clientId;
+
+      _componentIds.add(id);
+    }
+
+    public Iterator<String> getRenderedPartialTargets()
+    {
+      // not valid outside of rendering
+      Set<String> empty = Collections.emptySet();
+      return empty.iterator();
+    }
+
+    public VisitContext getVisitContext()
+    {
+      // not valid outside of rendering
+      throw new NotImplementedException();
+    }
+
+    private FacesContext _facesContext;
+    private HashSet<String> _componentIds = new HashSet<String>();
+  }
 
   private RequestContextBean _bean;
   private HelpProvider        _provider;
@@ -888,7 +945,7 @@
 
   private PageResolver        _pageResolver;
   private PageFlowScopeProvider _pageFlowScopeProvider;
-  
+
   //todo: get factory from configuration (else implementations have to provide their own RequestContext)
   static private final AgentFactory _agentFactory = new AgentFactoryImpl();
 
@@ -903,7 +960,7 @@
   // to accessibility objects
   static private final Map<String, Accessibility>
     _ACCESSIBILITY_NAMES = new HashMap<String, Accessibility>();
-  
+
   static
   {
     _ACCESSIBILITY_NAMES.put("default", Accessibility.DEFAULT);

Propchange: myfaces/trinidad/branches/1.2.10.1-branch/trinidad-sandbox/sandbox-api/src/main/java-templates/org/apache/myfaces/trinidad/sandbox/component/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Feb 21 20:22:35 2009
@@ -1,2 +1,4 @@
+/myfaces/trinidad/branches/1.2.11.1-branch/trinidad-sandbox/sandbox-api/src/main/java-templates/org/apache/myfaces/trinidad/sandbox/component:745918
 /myfaces/trinidad/branches/1.2.9.1-branch/trinidad-sandbox/sandbox-api/src/main/java-templates/org/apache/myfaces/trinidad/sandbox/component:699406,699496
+/myfaces/trinidad/branches/TRINIDAD-1402/trinidad-sandbox/sandbox-api/src/main/java-templates/org/apache/myfaces/trinidad/sandbox/component:745675
 /myfaces/trinidad/trunk_1.2.x/trinidad-sandbox/sandbox-api/src/main/java-templates/org/apache/myfaces/trinidad/sandbox/component:738664,739156

Propchange: myfaces/trinidad/branches/1.2.10.1-branch/trinidad-sandbox/sandbox-api/src/main/java/org/apache/myfaces/trinidad/sandbox/event/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Feb 21 20:22:35 2009
@@ -1,2 +1,4 @@
+/myfaces/trinidad/branches/1.2.11.1-branch/trinidad-sandbox/sandbox-api/src/main/java/org/apache/myfaces/trinidad/sandbox/event:745918
 /myfaces/trinidad/branches/1.2.9.1-branch/trinidad-sandbox/sandbox-api/src/main/java/org/apache/myfaces/trinidad/sandbox/event:699406,699496
+/myfaces/trinidad/branches/TRINIDAD-1402/trinidad-sandbox/sandbox-api/src/main/java/org/apache/myfaces/trinidad/sandbox/event:745675
 /myfaces/trinidad/trunk_1.2.x/trinidad-sandbox/sandbox-api/src/main/java/org/apache/myfaces/trinidad/sandbox/event:738664,739156