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/lambdas
Commit: 2342406bda57943d4c3deef951c90c2ae776191b
Parents: fee1ff6
Author: Andrea Del Bene <[email protected]>
Authored: Thu Nov 19 14:12:47 2015 +0100
Committer: Andrea Del Bene <[email protected]>
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);
+       }
 }

Reply via email to