You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ad...@apache.org on 2015/11/19 17:05:24 UTC

wicket git commit: WICKET-6028 Detach called on enclosure component while it had a non-empty queue

Repository: wicket
Updated Branches:
  refs/heads/master fee1ff669 -> 2342406bd


WICKET-6028 Detach called on enclosure component while it had a non-empty queue


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/2342406b
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/2342406b
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/2342406b

Branch: refs/heads/master
Commit: 2342406bda57943d4c3deef951c90c2ae776191b
Parents: fee1ff6
Author: Andrea Del Bene <ad...@apache.org>
Authored: Thu Nov 19 14:12:47 2015 +0100
Committer: Andrea Del Bene <ad...@apache.org>
Committed: Thu Nov 19 17:04:40 2015 +0100

----------------------------------------------------------------------
 .../java/org/apache/wicket/Application.java     |   1 -
 .../java/org/apache/wicket/MarkupContainer.java | 116 ++++++++++++-------
 .../org/apache/wicket/markup/WicketTag.java     |   4 +-
 .../parser/filter/WicketTagIdentifier.java      |  28 ++++-
 4 files changed, 104 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2342406b/wicket-core/src/main/java/org/apache/wicket/Application.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java b/wicket-core/src/main/java/org/apache/wicket/Application.java
index db413a6..bc5734c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Application.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
@@ -813,7 +813,6 @@ public abstract class Application implements UnboundListener, IEventSink
 		PageSettings pageSettings = getPageSettings();
 
 		// Install default component resolvers
-		pageSettings.addComponentResolver(new MarkupInheritanceResolver());
 		pageSettings.addComponentResolver(new HtmlHeaderResolver());
 		pageSettings.addComponentResolver(new WicketLinkTagHandler());
 		pageSettings.addComponentResolver(new WicketMessageResolver());

http://git-wip-us.apache.org/repos/asf/wicket/blob/2342406b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
index 8d08b77..916b994 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
@@ -1471,59 +1471,97 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 			else if (tag.getFlag(ComponentTag.RENDER_RAW))
 			{
 				// No component found, but "render as raw markup" flag found
-				getResponse().write(element.toCharSequence());
+				if (canRenderRawTag(tag))
+				{					
+					getResponse().write(element.toCharSequence());
+				} 
 				return true;
 			}
 			else
 			{
-				if (tag instanceof WicketTag)
-				{
-					if (((WicketTag)tag).isChildTag())
-					{
-						markupStream.throwMarkupException("Found " + tag.toString() +
-							" but no <wicket:extend>. Container: " + toString());
-					}
-					else
-					{
-						markupStream.throwMarkupException("Failed to handle: " +
-							tag.toString() +
-							". It might be that no resolver has been registered to handle this special tag. " +
-							" But it also could be that you declared wicket:id=" + id +
-							" in your markup, but that you either did not add the " +
-							"component to your page at all, or that the hierarchy does not match. " +
-							"Container: " + toString());
-					}
-				}
-
-				List<String> names = findSimilarComponents(id);
-
-				// No one was able to handle the component id
-				StringBuilder msg = new StringBuilder(500);
-				msg.append("Unable to find component with id '");
-				msg.append(id);
-				msg.append("' in ");
-				msg.append(this.toString());
-				msg.append("\n\tExpected: '");
-				msg.append(getPageRelativePath());
-				msg.append(PATH_SEPARATOR);
-				msg.append(id);
-				msg.append("'.\n\tFound with similar names: '");
-				msg.append(Strings.join("', ", names));
-				msg.append('\'');
-
-				log.error(msg.toString());
-				markupStream.throwMarkupException(msg.toString());
+				throwException(markupStream, tag);
 			}
 		}
 		else
 		{
 			// Render as raw markup
-			getResponse().write(element.toCharSequence());
+			if (canRenderRawTag(element))
+			{
+				getResponse().write(element.toCharSequence());
+			}
 			return true;
 		}
 
 		return false;
 	}
+	
+	/**
+	 * Says if the given tag can be handled as a raw markup.
+	 * 
+	 * @param tag
+	 * 			the current tag.
+	 * @return true if the tag can be handled as raw markup, false otherwise.
+	 */
+	private boolean canRenderRawTag(MarkupElement tag)
+	{
+		boolean isWicketTag = tag instanceof WicketTag;
+		
+		boolean stripTag = isWicketTag ? Application.get().getMarkupSettings().getStripWicketTags() : false; 
+		
+		return !stripTag;
+	}
+	
+	/**
+	 * Throws a {@code org.apache.wicket.markup.MarkupException} when the
+	 * component markup is not consistent.
+	 * 
+	 * @param markupStream
+	 * 			the source stream for the component markup.
+	 * @param tag
+	 * 			the tag that can not be handled.
+	 */
+	private void throwException(final MarkupStream markupStream, final ComponentTag tag)
+	{
+		final String id = tag.getId();
+		
+		if (tag instanceof WicketTag)
+		{
+			if (((WicketTag)tag).isChildTag())
+			{
+				markupStream.throwMarkupException("Found " + tag.toString() +
+					" but no <wicket:extend>. Container: " + toString());
+			}
+			else
+			{
+				markupStream.throwMarkupException("Failed to handle: " +
+					tag.toString() +
+					". It might be that no resolver has been registered to handle this special tag. " +
+					" But it also could be that you declared wicket:id=" + id +
+					" in your markup, but that you either did not add the " +
+					"component to your page at all, or that the hierarchy does not match. " +
+					"Container: " + toString());
+			}
+		}
+
+		List<String> names = findSimilarComponents(id);
+
+		// No one was able to handle the component id
+		StringBuilder msg = new StringBuilder(500);
+		msg.append("Unable to find component with id '");
+		msg.append(id);
+		msg.append("' in ");
+		msg.append(this.toString());
+		msg.append("\n\tExpected: '");
+		msg.append(getPageRelativePath());
+		msg.append(PATH_SEPARATOR);
+		msg.append(id);
+		msg.append("'.\n\tFound with similar names: '");
+		msg.append(Strings.join("', ", names));
+		msg.append('\'');
+
+		log.error(msg.toString());
+		markupStream.throwMarkupException(msg.toString());
+	}
 
 	private List<String> findSimilarComponents(final String id)
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/2342406b/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java b/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
index 67f96f2..8cb9cf1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/WicketTag.java
@@ -205,8 +205,8 @@ public class WicketTag extends ComponentTag
 		else
 		{
 			final WicketTag tag = new WicketTag(xmlTag.mutable());
-			tag.setId(getId());
-			tag.setAutoComponentTag(isAutoComponentTag());
+			copyPropertiesTo(tag);
+
 			return tag;
 		}
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2342406b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
index c39faea..4834973 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketTagIdentifier.java
@@ -53,6 +53,8 @@ public final class WicketTagIdentifier extends AbstractMarkupFilter
 {
 	/** List of well known wicket tag names */
 	private static final Set<String> WELL_KNOWN_TAG_NAMES = new HashSet<>();
+	/** List of raw wicket tag names */
+	private static final Set<String> RAW_TAG_NAMES = new HashSet<>();
 
 	static {
 		WELL_KNOWN_TAG_NAMES.add(Border.BORDER);
@@ -70,6 +72,11 @@ public final class WicketTagIdentifier extends AbstractMarkupFilter
 		WELL_KNOWN_TAG_NAMES.add(WicketContainerResolver.CONTAINER);
 		WELL_KNOWN_TAG_NAMES.add(WicketMessageResolver.MESSAGE);
 	}
+	
+	static {
+		RAW_TAG_NAMES.add(MarkupInheritanceResolver.CHILD);
+		RAW_TAG_NAMES.add(MarkupInheritanceResolver.EXTEND);
+	}
 
 	/**
 	 * Construct.
@@ -109,14 +116,18 @@ public final class WicketTagIdentifier extends AbstractMarkupFilter
 
 			if (Strings.isEmpty(wicketIdValue))
 			{
-				// Make it a Wicket component. Otherwise it would be RawMarkup
+				// Make it a Wicket component.
 				tag.setId(namespace + "_" + tag.getName() + getRequestUniqueId());
 				tag.setModified(true);
 
-				if (tag.isClose() == false)
+				if (isRaw(tag)) 
 				{
-					tag.setAutoComponentTag(true);
+					tag.setFlag(ComponentTag.RENDER_RAW, true);
 				}
+				else if (tag.isClose() == false)
+				{
+					tag.setAutoComponentTag(true);
+				}				
 			}
 
 			// If the tag is not a well-known wicket namespace tag
@@ -165,4 +176,15 @@ public final class WicketTagIdentifier extends AbstractMarkupFilter
 		String lowerCaseTagName = tag.getName().toLowerCase(Locale.ENGLISH);
 		return WELL_KNOWN_TAG_NAMES.contains(lowerCaseTagName);
 	}
+
+	/**
+	 * 
+	 * @param tag
+	 * @return true, if tag must be raw
+	 */
+	private boolean isRaw(final ComponentTag tag)
+	{
+		String lowerCaseTagName = tag.getName().toLowerCase(Locale.ENGLISH);
+		return RAW_TAG_NAMES.contains(lowerCaseTagName);
+	}
 }