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());
+				}
+			}
+		}
+	}
 }