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