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 2008/01/17 20:20:27 UTC
svn commit: r612935 - in /myfaces/trinidad/branches/1.2.5.1-branch:
trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/
trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/
trinidad-impl/src/main/java/org/apache/myf...
Author: matzew
Date: Thu Jan 17 11:20:26 2008
New Revision: 612935
URL: http://svn.apache.org/viewvc?rev=612935&view=rev
Log:
TRINIDAD-905
Modified:
myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXGroupTemplate.java
myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java
myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXSwitcherTemplate.java
myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java
myfaces/trinidad/branches/1.2.5.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/DialogServiceImpl.java
Modified: myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXGroupTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXGroupTemplate.java?rev=612935&r1=612934&r2=612935&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXGroupTemplate.java (original)
+++ myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXGroupTemplate.java Thu Jan 17 11:20:26 2008
@@ -30,7 +30,8 @@
* <p>
* @version $Name: $ ($Revision: 429530 $) $Date: 2006-08-07 18:44:54 -0600 (Mon, 07 Aug 2006) $
*/
-abstract public class UIXGroupTemplate extends UIXComponentBase
+abstract public class UIXGroupTemplate extends UIXComponentBase implements FlattenedComponent
+
{
/**
* Overridden to return true.
@@ -43,6 +44,44 @@
}
/**
+ * Sets up the grouping context and processes all of the
+ * UIXGroup's children
+ */
+ public <S> boolean processFlattenedChildren(
+ FacesContext context,
+ ComponentProcessingContext cpContext,
+ ComponentProcessor<S> childProcessor,
+ S callBackContext
+ ) throws IOException
+ {
+ cpContext.pushGroup();
+
+ try
+ {
+ // bump up the group depth and render all of the children
+ return UIXComponent.processFlattenedChildren(context,
+ cpContext,
+ childProcessor,
+ this.getChildren(),
+ callBackContext);
+ }
+ finally
+ {
+ cpContext.popGroup();
+ }
+ }
+
+ /**
+ * Returns <code>true</code> if this FlattenedComponent is currently flattening its children
+ * @param context FacesContext
+ * @return <code>true</code> if this FlattenedComponent is currently flattening its children
+ */
+ public boolean isFlatteningChildren(FacesContext context)
+ {
+ return true;
+ }
+
+ /**
* Renders the children in their raw form.
* There is no Renderer for this component because it has no
* visual representation or any sort of layout for its children.
@@ -67,4 +106,5 @@
}
}
}
+
Modified: myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java?rev=612935&r1=612934&r2=612935&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java (original)
+++ myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXIteratorTemplate.java Thu Jan 17 11:20:26 2008
@@ -41,7 +41,7 @@
* If {@link #getRows()} returns 0, then the iteration continues until
* there are no more elements in the underlying data.
*/
-public abstract class UIXIteratorTemplate extends UIXCollection
+public abstract class UIXIteratorTemplate extends UIXCollection implements FlattenedComponent
{
/**/ abstract public int getFirst();
@@ -58,6 +58,49 @@
}
/**
+ * Sets up the iteration context for each child and processes it
+ */
+ public <S> boolean processFlattenedChildren(
+ final FacesContext context,
+ ComponentProcessingContext cpContext,
+ final ComponentProcessor<S> childProcessor,
+ final S callbackContext) throws IOException
+ {
+ Runner runner = new Runner(cpContext)
+ {
+ @Override
+ protected void process(UIComponent kid, ComponentProcessingContext cpContext) throws IOException
+ {
+ childProcessor.processComponent(context, cpContext, kid, callbackContext);
+ }
+ };
+ boolean processedChildren = runner.run();
+ Exception exp = runner.exception;
+ if (exp != null)
+ {
+ if (exp instanceof RuntimeException)
+ throw (RuntimeException) exp;
+
+ if (exp instanceof IOException)
+ throw (IOException) exp;
+ throw new IllegalStateException(exp);
+ }
+
+ return processedChildren;
+ }
+
+ /**
+ * Returns <code>true</code> if this FlattenedComponent is currently flattening its children
+ * @param context FacesContext
+ * @return <code>true</code> if this FlattenedComponent is currently flattening its children
+ */
+ public boolean isFlatteningChildren(FacesContext context)
+ {
+ // if we don't have a Renderer, then we're flattening
+ return (getRendererType() == null);
+ }
+
+ /**
* Repeatedly render the children as many times as needed.
*/
@Override
@@ -81,7 +124,8 @@
Runner runner = new Runner()
{
@Override
- protected void process(UIComponent kid) throws IOException
+ protected void process(UIComponent kid,
+ ComponentProcessingContext cpContext) throws IOException
{
__encodeRecursive(context, kid);
}
@@ -172,18 +216,30 @@
Runner runner = new Runner()
{
@Override
- protected void process(UIComponent kid)
+ protected void process(UIComponent kid, ComponentProcessingContext cpContext)
{
- processComponent(context, kid, phaseId);
+ UIXIterator.this.processComponent(context, kid, phaseId);
}
};
runner.run();
}
-
- private abstract class Runner
+
+ private abstract class Runner implements ComponentProcessor<Object>
{
- public final void run()
+ public Runner()
+ {
+ this(null);
+ }
+
+ public Runner(ComponentProcessingContext cpContext)
+ {
+ _cpContext = cpContext;
+ }
+
+ public final boolean run()
{
+ FacesContext context = FacesContext.getCurrentInstance();
+
List<UIComponent> stamps = getStamps();
int oldIndex = getRowIndex();
int first = getFirst();
@@ -191,6 +247,9 @@
int end = (rows <= 0) //show everything
? Integer.MAX_VALUE
: first + rows;
+
+ boolean processedChild = false;
+
try
{
for(int i=first; i<end; i++)
@@ -198,16 +257,16 @@
setRowIndex(i);
if (isRowAvailable())
{
- for(UIComponent stamp : stamps)
- {
- process(stamp);
- }
+ // latch processedChild the first time we process a child
+ processedChild |= (_cpContext != null)
+ ? UIXComponent.processFlattenedChildren(context, _cpContext, this, stamps, null)
+ : UIXComponent.processFlattenedChildren(context, this, stamps, null);
}
else
break;
}
}
- catch (Exception e)
+ catch (IOException e)
{
exception = e;
}
@@ -215,10 +274,39 @@
{
setRowIndex(oldIndex);
}
+
+ return processedChild;
}
-
+
+ /**
+ * Sets up the context for the child and processes it
+ */
+ public void processComponent(
+ FacesContext context,
+ ComponentProcessingContext cpContext,
+ UIComponent component,
+ Object callbackContext) throws IOException
+ {
+ try
+ {
+ process(component, cpContext);
+ }
+ catch (IOException ioe)
+ {
+ throw ioe;
+ }
+ catch (Exception e)
+ {
+ exception = e;
+ }
+ }
+
+ protected abstract void process(UIComponent comp, ComponentProcessingContext cpContext)
+ throws Exception;
+
public Exception exception = null;
- protected abstract void process(UIComponent comp) throws Exception;
+
+ private final ComponentProcessingContext _cpContext;
}
@Override
Modified: myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXSwitcherTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXSwitcherTemplate.java?rev=612935&r1=612934&r2=612935&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXSwitcherTemplate.java (original)
+++ myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXSwitcherTemplate.java Thu Jan 17 11:20:26 2008
@@ -29,7 +29,7 @@
* <p>
* @version $Name: $ ($Revision$) $Date$
*/
-abstract public class UIXSwitcherTemplate extends UIXComponentBase
+abstract public class UIXSwitcherTemplate extends UIXComponentBase implements FlattenedComponent
{
/**/ // Abstract methods implemented by code gen
/**/ abstract public String getFacetName();
@@ -69,6 +69,36 @@
facet.processUpdates(context);
}
+ /**
+ * Processes the selected switcher facet
+ */
+ public <S> boolean processFlattenedChildren(
+ final FacesContext context,
+ ComponentProcessingContext cpContext,
+ final ComponentProcessor<S> childProcessor,
+ final S callbackContext) throws IOException
+ {
+ UIComponent facet = _getFacet();
+
+ if (facet != null)
+ return UIXComponent.processFlattenedChildren(context,
+ cpContext,
+ childProcessor,
+ facet,
+ callbackContext);
+ else
+ return false;
+ }
+
+ /**
+ * Returns <code>true</code> if this FlattenedComponent is currently flattening its children
+ * @param context FacesContext
+ * @return <code>true</code> if this FlattenedComponent is currently flattening its children
+ */
+ public boolean isFlatteningChildren(FacesContext context)
+ {
+ return true;
+ }
/**
* Only render the currently active facet.
@@ -113,4 +143,5 @@
}
}
+
Modified: myfaces/trinidad/branches/1.2.5.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.5.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java?rev=612935&r1=612934&r2=612935&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java (original)
+++ myfaces/trinidad/branches/1.2.5.1-branch/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/UIXComponent.java Thu Jan 17 11:20:26 2008
@@ -18,10 +18,14 @@
*/
package org.apache.myfaces.trinidad.component;
+import java.io.IOException;
+
import javax.faces.component.UIComponent;
import javax.el.MethodExpression;
+import javax.faces.context.FacesContext;
+
import org.apache.myfaces.trinidad.bean.FacesBean;
import org.apache.myfaces.trinidad.event.AttributeChangeListener;
@@ -30,6 +34,165 @@
*/
abstract public class UIXComponent extends UIComponent
{
+ /**
+ * Helper function called by Renderers to iterate over a flattened view of a group of
+ * potentially FlattenedComponent instances rooted at a single child of the component that
+ * the Renderer is encoding, invoking the <code>childProcessor</code> with its
+ * <code>callbackContext</code> on each renderable instance.
+ * <p>
+ * If the child is a FlattenedComponent, the <code>childProcessor</code> will
+ * be called on each of that FlattenedComponent's children, recursing if those children are
+ * themselves FlattenedComponents, otherwise, the <code>childProcessor</code> will be called on
+ * the child itself.
+ * <p>
+ * This method is typically used to flatten the contents of a facet on the FlattenedComponent to
+ * be encoded. If the Renderer accidentally passes in the component to be encoded instead of one
+ * of its children, the result will almost certainly be an infinite recursion and stack overflow.
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessor, Iterable, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessingContext, ComponentProcessor, UIComponent, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessingContext, ComponentProcessor, Iterable, Object)
+ * @see FlattenedComponent
+ */
+ public static <S> boolean processFlattenedChildren(
+ FacesContext context,
+ ComponentProcessor<S> childProcessor,
+ UIComponent child,
+ S callbackContext) throws IOException
+ {
+ return processFlattenedChildren(context,
+ new ComponentProcessingContext(),
+ childProcessor,
+ child,
+ callbackContext);
+ }
+
+ /**
+ * Helper function called by FlattenedComponent to iterate over a flattened view of a group of
+ * potentially FlattenedComponent instances rooted at a single child of the FlattenedComponent,
+ * invoking the <code>childProcessor</code> with its
+ * <code>callbackContext</code> on each renderable instance.
+ * <p>
+ * If the child is a FlattenedComponent, the <code>childProcessor</code> will
+ * be called on each of that FlattenedComponent's children, recursing if those children are
+ * themselves FlattenedComponents, otherwise, the <code>childProcessor</code> will be called on
+ * the child itself.
+ * <p>
+ * This method is typically used to flatten the contents of a facet of the FlattenedComponent.
+ * If the FlattenedComponent accidentally passes in itself instead of one
+ * of its children, the result will almost certainly be an infinite recursion and stack overflow.
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessor, UIComponent, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessor, Iterable, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessingContext, ComponentProcessor, Iterable, Object)
+ * @see FlattenedComponent
+ */
+ public static <S> boolean processFlattenedChildren(
+ FacesContext context,
+ ComponentProcessingContext cpContext,
+ ComponentProcessor<S> childProcessor,
+ UIComponent child,
+ 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))
+ {
+ return ((FlattenedComponent)child).processFlattenedChildren(context,
+ cpContext,
+ childProcessor,
+ callbackContext);
+ }
+ else
+ {
+ // not a FlattenedComponent, pass the component directly to the ComponentProcessor
+ try
+ {
+ childProcessor.processComponent(context, cpContext, child, callbackContext);
+ }
+ finally
+ {
+ // if startDepth is > 0, only the first visible child will be marked as starting a group
+ cpContext.resetStartDepth();
+ }
+
+ return true;
+ }
+ }
+ else
+ {
+ // component not rendered
+ return false;
+ }
+ }
+
+ /**
+ * Helper function called by Renderers to iterate over a flattened view of the
+ * children, potentially containing FlattenedComponents, of the component the Renderer is
+ * encoding, invoking the <code>childProcessor</code> with its
+ * <code>callbackContext</code> on each renderable instance.
+ * <p>
+ * For each FlattenedComponent child, the <code>childProcessor</code> will
+ * be called on each of that FlattenedComponent's children, recursing if those children are
+ * themselves FlattenedComponents, otherwise, the <code>childProcessor</code> will be called on
+ * the child itself.
+ * <p>
+ * This method is typically used to flatten the children of the FlattenedComponent to
+ * be encoded.
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessor, UIComponent, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessingContext, ComponentProcessor, UIComponent, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessingContext, ComponentProcessor, Iterable, Object)
+ * @see FlattenedComponent
+ */
+ public static <S> boolean processFlattenedChildren(
+ FacesContext context,
+ ComponentProcessor<S> childProcessor,
+ Iterable<UIComponent> children,
+ S callbackContext) throws IOException
+ {
+ return processFlattenedChildren(context,
+ new ComponentProcessingContext(),
+ childProcessor,
+ children,
+ callbackContext);
+ }
+
+ /**
+ * Helper function called by FlattenedComponents to iterate over a flattened view of their
+ * children, potentially themselves FlattenedComponents, invoking the <code>childProcessor</code>
+ * with its <code>callbackContext</code> on each renderable instance.
+ * <p>
+ * For each FlattenedComponent child, the <code>childProcessor</code> will
+ * be called on each of that FlattenedComponent's children, recursing if those children are
+ * themselves FlattenedComponents, otherwise, the <code>childProcessor</code> will be called on
+ * the child itself.
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessor, UIComponent, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessor, Iterable, Object)
+ * @see UIXComponent#processFlattenedChildren(FacesContext, ComponentProcessingContext, ComponentProcessor, UIComponent, Object)
+ * @see FlattenedComponent
+ */
+ public static <S> boolean processFlattenedChildren(
+ FacesContext context,
+ ComponentProcessingContext cpContext,
+ ComponentProcessor<S> childProcessor,
+ Iterable<UIComponent> children,
+ S callbackContext) throws IOException
+ {
+ // we haven't processed a child yet
+ boolean processedChild = false;
+
+ for (UIComponent currChild : children)
+ {
+ // latch processed child to the first child processed
+ processedChild |= processFlattenedChildren(context,
+ cpContext, childProcessor,
+ currChild,
+ callbackContext);
+ }
+
+ return processedChild;
+ }
+
/**
* Returns the FacesBean used for storing the component's state.
*/
Modified: myfaces/trinidad/branches/1.2.5.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/DialogServiceImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.5.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/DialogServiceImpl.java?rev=612935&r1=612934&r2=612935&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.5.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/DialogServiceImpl.java (original)
+++ myfaces/trinidad/branches/1.2.5.1-branch/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/DialogServiceImpl.java Thu Jan 17 11:20:26 2008
@@ -396,7 +396,7 @@
// Save the parameters used to launch the dialog so we can
// simulate a postback when coming back to the dialog; and
// write in a "returnId" with the "id" that will be used.
- Map<String, Object> savedRequestParameters = new HashMap<String, Object>();
+ Map<String, String[]> savedRequestParameters = new HashMap<String, String[]>();
savedRequestParameters.putAll(
context.getExternalContext().getRequestParameterValuesMap());
if (source != null)