* @return true, if element was rendered as RawMarkup
*/
protected final boolean renderNext(final MarkupStream markupStream)
{
// Get the current markup element
final MarkupElement element = markupStream.get();
// If it's a tag like <wicket..> or <span wicket:id="..." >
if ((element instanceof ComponentTag) && !markupStream.atCloseTag())
{
// Get element as tag
final ComponentTag tag = (ComponentTag)element;
// Get component id
final String id = tag.getId();
// Get the component for the id from the given container
Component component = get(id);
if (component == null)
{
component = ComponentResolvers.resolve(this, markupStream, tag, null);
if ((component != null) && (component.getParent() == null))
{
autoAdd(component, markupStream);
}
else if (component != null)
{
component.setMarkup(markupStream.getMarkupFragment());
}
}
// Failed to find it?
if (component != null)
{
component.render();
}
else if (tag.getFlag(ComponentTag.RENDER_RAW))
{
// No component found, but "render as raw markup" flag found
getResponse().write(element.toCharSequence());
return true;
}
else
{
if (tag instanceof WicketTag)
{
if (((WicketTag)tag).isChildTag())
{
markupStream.throwMarkupException("Found " + tag.toString() +
" but no <wicket:extend>");
}
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 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.");
}
}
List<String> names = findSimilarComponents(id);
// No one was able to handle the component id
StringBuffer msg = new StringBuffer(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(".");
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());
}
}
else
{
// Render as raw markup
getResponse().write(element.toCharSequence());
return true;
}
return false;
}