You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2009/11/08 22:57:50 UTC
svn commit: r833935 - in
/wicket/trunk/wicket/src/main/java/org/apache/wicket: Component.java
markup/html/internal/Enclosure.java
Author: jdonnerstag
Date: Sun Nov 8 21:57:50 2009
New Revision: 833935
URL: http://svn.apache.org/viewvc?rev=833935&view=rev
Log:
basically javadoc for Enclosure
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java?rev=833935&r1=833934&r2=833935&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java Sun Nov 8 21:57:50 2009
@@ -2157,7 +2157,7 @@
MarkupContainer parent = getParent();
if ((parent == null) || (parent.getFlag(FLAG_RENDERING) == false) || isAuto())
{
- prepareForRender();
+ prepareForRender(true);
}
// Do the render
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java?rev=833935&r1=833934&r2=833935&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/internal/Enclosure.java Sun Nov 8 21:57:50 2009
@@ -21,10 +21,15 @@
import org.apache.wicket.RequestCycle;
import org.apache.wicket.Response;
import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.application.IComponentOnAfterRenderListener;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupException;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.EnclosureContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
import org.apache.wicket.markup.parser.filter.EnclosureHandler;
import org.apache.wicket.response.NullResponse;
import org.slf4j.Logger;
@@ -64,8 +69,15 @@
* }
* </pre>
*
+ * Please note that since a transparent auto-component is created for the tag, the markup and the
+ * component hierarchy will not be in sync which leads to subtle differences if your code relies on
+ * onBeforeRender() and validate() being called for the children inside the enclosure tag. E.g. it
+ * might happen that onBeforeRender() and validate() gets called on invisible components. In doubt,
+ * please fall back to {@link EnclosureContainer}.
+ *
* @see EnclosureResolver
* @see EnclosureHandler
+ * @see EnclosureContainer
*
* @author Juergen Donnerstag
* @since 1.3
@@ -154,25 +166,39 @@
// set the enclosure visibility
boolean visible = controller.determineVisibility();
- if (visible)
- {
- super.onComponentTagBody(markupStream, openTag);
- }
- else
+ // We want to know which components are rendered inside the enclosure
+ final IComponentOnAfterRenderListener listener = new EnclosureListener(this);
+
+ try
{
- RequestCycle cycle = getRequestCycle();
- Response response = cycle.getResponse();
- try
- {
- cycle.setResponse(NullResponse.getInstance());
+ // register the listener
+ getApplication().addComponentOnAfterRenderListener(listener);
+ if (visible)
+ {
super.onComponentTagBody(markupStream, openTag);
}
- finally
+ else
{
- cycle.setResponse(response);
+ RequestCycle cycle = getRequestCycle();
+ Response response = cycle.getResponse();
+ try
+ {
+ cycle.setResponse(NullResponse.getInstance());
+
+ super.onComponentTagBody(markupStream, openTag);
+ }
+ finally
+ {
+ cycle.setResponse(response);
+ }
}
}
+ finally
+ {
+ // make sure we remove the listener
+ getApplication().removeComponentOnAfterRenderListener(listener);
+ }
}
/**
@@ -192,4 +218,34 @@
"Programming error: childComponent == enclose component; endless loop");
}
}
+
+ /**
+ * Enclosure will register this listener during the body render phase of the Enclosure
+ */
+ private static class EnclosureListener implements IComponentOnAfterRenderListener
+ {
+ private final Enclosure enclosure;
+
+ private EnclosureListener(final Enclosure enclosure)
+ {
+ this.enclosure = enclosure;
+ }
+
+ /**
+ * @see org.apache.wicket.application.IComponentOnBeforeRenderListener#onBeforeRender(org.apache.wicket.Component)
+ */
+ public void onAfterRender(final Component component)
+ {
+ if (log.isWarnEnabled())
+ {
+ if ((component instanceof FormComponent) ||
+ (component instanceof IFormSubmittingComponent) || (component instanceof Form))
+ {
+ log.warn("Please note that onBeforeRender() and validate() might be called on invisible components inside an Enclosure. " +
+ "Please see EnclosureContainer for an alternative. Enclosure: " +
+ enclosure.toString());
+ }
+ }
+ }
+ }
}