in impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlLinkRendererBase.java [719:906]
protected void renderOutputLinkStart(FacesContext facesContext, UIOutput output)
throws IOException
{
ResponseWriter writer = facesContext.getResponseWriter();
Map<String, List<ClientBehavior>> behaviors = null;
if (HtmlRendererUtils.isDisabled(output))
{
writer.startElement(HTML.SPAN_ELEM, output);
if (output instanceof ClientBehaviorHolder holder)
{
behaviors = holder.getClientBehaviors();
if (!behaviors.isEmpty())
{
HtmlRendererUtils.writeIdAndName(writer, output, facesContext);
}
else
{
HtmlRendererUtils.writeIdIfNecessary(writer, output, facesContext);
}
long commonPropertiesMarked = 0L;
if (isCommonPropertiesOptimizationEnabled(facesContext))
{
commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(output);
}
if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
{
CommonHtmlAttributesUtil.renderEventProperties(writer,
commonPropertiesMarked, output);
CommonHtmlAttributesUtil.renderFocusBlurEventProperties(writer,
commonPropertiesMarked, output);
}
else
{
if (isCommonEventsOptimizationEnabled(facesContext))
{
long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(output);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, output, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
facesContext, writer, commonPropertiesMarked, commonEventsMarked, output, behaviors);
}
else
{
HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, output, behaviors);
HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
facesContext, writer, output, behaviors);
}
}
if (isCommonPropertiesOptimizationEnabled(facesContext))
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabledWithoutEvents(writer,
commonPropertiesMarked, output);
}
else
{
HtmlRendererUtils.renderHTMLAttributes(writer, output,
HTML.ANCHOR_PASSTHROUGH_ATTRIBUTES_DISABLED_WITHOUT_EVENTS);
}
}
else
{
HtmlRendererUtils.writeIdIfNecessary(writer, output, facesContext);
if (isCommonPropertiesOptimizationEnabled(facesContext))
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesDisabled(writer,
CommonHtmlAttributesUtil.getMarkedAttributes(output), output);
}
else
{
HtmlRendererUtils.renderHTMLAttributes(writer, output, HTML.ANCHOR_PASSTHROUGH_ATTRIBUTES_DISABLED);
}
}
}
else
{
//calculate href
String href = RendererUtils.getStringValue(facesContext, output);
//check if there is an anchor # in it
int index = href.indexOf('#');
String anchorString = null;
boolean isAnchorInHref = (index > -1);
if (isAnchorInHref)
{
// remove anchor element and add it again after the parameter are encoded
anchorString = href.substring(index);
href = href.substring(0,index);
}
if (getChildCount(output) > 0)
{
StringBuilder hrefBuf = new StringBuilder(href);
addChildParametersToHref(facesContext, output, hrefBuf,
(href.indexOf('?') == -1), //first url parameter?
writer.getCharacterEncoding());
href = hrefBuf.toString();
}
// check for the fragement attribute
String fragmentAttr = null;
if (output instanceof HtmlOutputLink link)
{
fragmentAttr = link.getFragment();
}
else
{
fragmentAttr = (String) output.getAttributes().get(ComponentAttrs.FRAGMENT_ATTR);
}
if (fragmentAttr != null && !fragmentAttr.isEmpty())
{
href += '#' + fragmentAttr;
}
else if (isAnchorInHref)
{
href += anchorString;
}
href = facesContext.getExternalContext().encodeResourceURL(href); //TODO: or encodeActionURL ?
//write anchor
writer.startElement(HTML.ANCHOR_ELEM, output);
writer.writeURIAttribute(HTML.HREF_ATTR, href, null);
if (output instanceof ClientBehaviorHolder holder)
{
behaviors = holder.getClientBehaviors();
if (!behaviors.isEmpty())
{
HtmlRendererUtils.writeIdAndName(writer, output, facesContext);
}
else
{
HtmlRendererUtils.writeIdAndNameIfNecessary(writer, output, facesContext);
}
long commonPropertiesMarked = 0L;
if (isCommonPropertiesOptimizationEnabled(facesContext))
{
commonPropertiesMarked = CommonHtmlAttributesUtil.getMarkedAttributes(output);
}
if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
{
CommonHtmlAttributesUtil.renderEventProperties(writer,
commonPropertiesMarked, output);
CommonHtmlAttributesUtil.renderFocusBlurEventProperties(writer,
commonPropertiesMarked, output);
}
else
{
if (isCommonEventsOptimizationEnabled(facesContext))
{
long commonEventsMarked = CommonHtmlEventsUtil.getMarkedEvents(output);
CommonHtmlEventsUtil.renderBehaviorizedEventHandlers(facesContext, writer,
commonPropertiesMarked, commonEventsMarked, output, behaviors);
CommonHtmlEventsUtil.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
facesContext, writer, commonPropertiesMarked, commonEventsMarked, output, behaviors);
}
else
{
HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, output, behaviors);
HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(
facesContext, writer, output, behaviors);
}
}
if (isCommonPropertiesOptimizationEnabled(facesContext))
{
CommonHtmlAttributesUtil.renderAnchorPassthroughPropertiesWithoutEvents(writer,
commonPropertiesMarked, output);
}
else
{
HtmlRendererUtils.renderHTMLAttributes(writer, output,
HTML.ANCHOR_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS);
}
}
else
{
HtmlRendererUtils.writeIdAndNameIfNecessary(writer, output, facesContext);
if (isCommonPropertiesOptimizationEnabled(facesContext))
{
CommonHtmlAttributesUtil.renderAnchorPassthroughProperties(writer,
CommonHtmlAttributesUtil.getMarkedAttributes(output), output);
}
else
{
HtmlRendererUtils.renderHTMLAttributes(writer, output, HTML.ANCHOR_PASSTHROUGH_ATTRIBUTES);
}
}
writer.flush();
}
}