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 2010/01/02 10:12:04 UTC

svn commit: r895151 - in /wicket/trunk/wicket/src/main/java/org/apache/wicket: Component.java MarkupContainer.java markup/MarkupStream.java

Author: jdonnerstag
Date: Sat Jan  2 09:12:04 2010
New Revision: 895151

URL: http://svn.apache.org/viewvc?rev=895151&view=rev
Log:
fixed bug to call onMarkupAttached on children added to Pages (or any other Components without parent)

Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.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=895151&r1=895150&r2=895151&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 Sat Jan  2 09:12:04 2010
@@ -22,6 +22,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Stack;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.authorization.Action;
@@ -734,9 +735,9 @@
 		boolean rtn = getFlag(FLAG_MARKUP_ATTACHED);
 		if (rtn == false)
 		{
+			setFlag(FLAG_MARKUP_ATTACHED, true);
 			onMarkupAttached();
 		}
-		setFlag(FLAG_MARKUP_ATTACHED, true);
 		return rtn;
 	}
 
@@ -753,6 +754,93 @@
 
 		// get the markup ID from the markup if available
 		markupIdFromMarkup = getMarkupIdFromMarkup();
+
+		// move the component to its real parent if necessary
+// moveComponentToItsRealParent();
+	}
+
+	/**
+	 * Move the component to its real parent if necessary
+	 * 
+	 * @return true, if it has been moved
+	 */
+	private boolean moveComponentToItsRealParent()
+	{
+		MarkupContainer parent = getParent();
+		IMarkupFragment markup = getMarkup();
+		if ((parent != null) && (markup != null))
+		{
+			IMarkupFragment parentMarkup = parent.getMarkup(null);
+			if ((parentMarkup != null) && (markup != parentMarkup))
+			{
+				// The component's markup must be in the same file as its parent
+				if (markup.getMarkupResourceStream() == parentMarkup.getMarkupResourceStream())
+				{
+					MarkupStream stream = new MarkupStream(markup);
+					stream.skipUntil(ComponentTag.class);
+					ComponentTag openTag = stream.getTag();
+					if (openTag != null)
+					{
+						MarkupStream parentStream = new MarkupStream(parentMarkup);
+						if (parentStream.skipUntil(ComponentTag.class))
+						{
+							parentStream.next();
+						}
+
+						Stack<ComponentTag> stack = new Stack<ComponentTag>();
+						while (parentStream.skipUntil(ComponentTag.class))
+						{
+							ComponentTag tag = parentStream.getTag();
+							if (openTag == tag)
+							{
+								if (stack.isEmpty() == false)
+								{
+									// This tag belong to the real parent
+									final ComponentTag lastTag = stack.pop();
+									parent.visitChildren(MarkupContainer.class,
+										new IVisitor<MarkupContainer>()
+										{
+											public Object component(final MarkupContainer component)
+											{
+												IMarkupFragment m = component.getMarkup();
+												MarkupStream ms = new MarkupStream(m);
+												ms.skipUntil(ComponentTag.class);
+												if (ms.hasMore() && (lastTag == ms.getTag()))
+												{
+													component.add(Component.this);
+													return IVisitor.STOP_TRAVERSAL;
+												}
+												return IVisitor.CONTINUE_TRAVERSAL;
+											}
+										});
+								}
+								return false;
+							}
+							if (tag.isOpen())
+							{
+								if (tag.hasNoCloseTag() == false)
+								{
+									stack.push(tag);
+								}
+							}
+							else if (tag.isOpenClose())
+							{
+								// noop
+							}
+							else if (tag.isClose())
+							{
+								if (stack.isEmpty() == false)
+								{
+									stack.pop();
+								}
+							}
+							parentStream.next();
+						}
+					}
+				}
+			}
+		}
+		return false;
 	}
 
 	/**

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?rev=895151&r1=895150&r2=895151&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/MarkupContainer.java Sat Jan  2 09:12:04 2010
@@ -151,7 +151,13 @@
 			// Check if the markup is available after the child has been added to the parent
 			try
 			{
-				if ((getParent() != null) && (child.getMarkup() != null))
+				// If not yet triggered, than do now (e.g. Pages)
+				if (getMarkup() != null)
+				{
+					internalOnMarkupAttached();
+				}
+
+				if (child.getMarkup() != null)
 				{
 					child.internalOnMarkupAttached();
 
@@ -1991,52 +1997,53 @@
 	{
 		super.onMarkupAttached();
 
-		// Automatically create components for <wicket:xxx> tag.
+		// createAndAddComponentsForWicketTags();
+	}
+
+	/**
+	 * Automatically create components for <wicket:xxx> tag.
+	 */
+	private void createAndAddComponentsForWicketTags()
+	{
+		// Markup must be available
 		IMarkupFragment markup = getMarkup();
 		if ((markup != null) && (markup.size() > 1))
 		{
-			// Skip the first component tag which already belongs to 'this' container
 			MarkupStream stream = new MarkupStream(markup);
-			for (; stream.hasMore(); stream.next())
+
+			// Skip the first component tag which already belongs to 'this' container
+			if (stream.skipUntil(ComponentTag.class))
 			{
-				MarkupElement elem = stream.get();
-				if (elem instanceof ComponentTag)
-				{
-					stream.next();
-					break;
-				}
+				stream.next();
 			}
 
 			// Search for <wicket:xxx> in the remaining markup and try to resolve the component
-			for (; stream.hasMore(); stream.next())
+			while (stream.skipUntil(ComponentTag.class))
 			{
-				MarkupElement elem = stream.get();
-				if (elem instanceof ComponentTag)
+				ComponentTag tag = stream.getTag();
+				if (tag.isOpen() || tag.isOpenClose())
 				{
-					ComponentTag tag = (ComponentTag)elem;
-					if (tag.isOpen() || tag.isOpenClose())
+					if (tag instanceof WicketTag)
 					{
-						if (elem instanceof WicketTag)
+						Component component = ComponentResolvers.resolve(this, stream, tag);
+						if ((component != null) && (component.getParent() == null))
 						{
-							Component component = ComponentResolvers.resolve(this, stream, tag);
-							if ((component != null) && (component.getParent() == null))
+							if (component.getId().equals(tag.getId()) == false)
 							{
-								if (component.getId().equals(tag.getId()) == false)
-								{
-									// make sure we are able to get() the component during rendering
-									tag.setId(component.getId());
-									tag.setModified(true);
-								}
-								add(component);
+								// make sure we are able to get() the component during rendering
+								tag.setId(component.getId());
+								tag.setModified(true);
 							}
+							add(component);
 						}
+					}
 
-						if (tag.isOpen())
-						{
-							stream.skipToMatchingCloseTag(tag);
-						}
+					if (tag.isOpen())
+					{
+						stream.skipToMatchingCloseTag(tag);
 					}
 				}
+				stream.next();
 			}
 		}
 	}

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java?rev=895151&r1=895150&r2=895151&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/MarkupStream.java Sat Jan  2 09:12:04 2010
@@ -417,6 +417,26 @@
 	}
 
 	/**
+	 * Skip until an element of type 'clazz' is found
+	 * 
+	 * @param clazz
+	 * @return true if found
+	 */
+	public boolean skipUntil(final Class<? extends MarkupElement> clazz)
+	{
+		while (hasMore())
+		{
+			if (clazz.isInstance(current))
+			{
+				return true;
+			}
+			next();
+		}
+
+		return false;
+	}
+
+	/**
 	 * Skips any markup at the current position until the wicket tag name is found.
 	 * 
 	 * @param wicketTagName