in impl/src/main/java/org/apache/myfaces/renderkit/ErrorPageWriter.java [800:1043]
public VisitResult visit(VisitContext context, UIComponent target)
{
Map<String, Object> requestMap = context.getFacesContext().getExternalContext().getRequestMap();
try
{
if (!(target instanceof UIViewRoot))
{
writer.write("<dd>");
}
UIComponent parent = target.getParent();
boolean hasChildren = (target.getChildCount() > 0 || target.getFacetCount() > 0);
String facetName = getFacetName(target);
if (!(target instanceof UIColumn))
{
if (parent instanceof UIColumn column
&& ((parent.getChildCount() > 0 && parent.getChildren().get(0) == target)
|| (facetName != null &&
getVisitedFacetCount(context.getFacesContext(), parent) == 0)))
{
if (parent.getParent() instanceof UIData
&& isFirstUIColumn(parent.getParent(), column))
{
writer.write("<span>Row: ");
int rowIndex = ((UIData) parent.getParent()).getRowIndex();
writer.write("" + rowIndex);
if (rowIndex == -1)
{
// tell the user that rowIndex == -1 stands for visiting column-facets
writer.write(" (all column facets)");
}
writer.write("</span>");
}
writer.write("<dl><dt>");
writeStart(writer, parent, true, false);
writer.write("</dt><dd>");
}
if (facetName != null)
{
writer.write("<span>" + facetName + "</span>");
incrementVisitedFacetCount(context.getFacesContext(), parent);
}
writer.write("<dl><dt");
if (isText(target))
{
writer.write(" class=\"uicText\"");
}
writer.write(">");
Map<String, List<Object[]>> debugInfos = null;
// is the target a EditableValueHolder component?
// If so, debug infos from DebugPhaseListener should be available
if (target instanceof EditableValueHolder)
{
// get the debug info
debugInfos = (Map<String, List<Object[]>>) requestMap
.get(DEBUG_INFO_KEY + target.getClientId());
}
// Get the component's renderer.
// Note that getRenderer(FacesContext context) is definded in UIComponent,
// but it is protected, so we have to use reflection!
Renderer renderer = null;
try
{
Method getRenderer = UIComponent.class.getDeclaredMethod(
"getRenderer", FacesContext.class);
// make it accessible for us!
getRenderer.setAccessible(true);
renderer = (Renderer) getRenderer.invoke(target, context.getFacesContext());
}
catch (Exception e)
{
// nothing - do not output renderer information
}
// write the component start
writeStart(writer, target, (hasChildren || debugInfos != null || renderer != null), false);
writer.write("</dt>");
if (renderer != null)
{
// write renderer info
writer.write("<div class=\"renderer\">Rendered by ");
writer.write(renderer.getClass().getCanonicalName());
writer.write("</div>");
if (!hasChildren && debugInfos == null)
{
// close the component
writer.write("<dt>");
writeEnd(writer, target);
writer.write("</dt>");
}
}
if (debugInfos != null)
{
final String fieldid = target.getClientId() + "_lifecycle";
writer.write("<div class=\"lifecycle_values_wrapper\">");
writer.write("<a href=\"#\" onclick=\"toggle('");
writer.write(fieldid);
writer.write("'); return false;\"><span id=\"");
writer.write(fieldid);
writer.write("Off\">+</span><span id=\"");
writer.write(fieldid);
writer.write("On\" style=\"display: none;\">-</span> Value Lifecycle</a>");
writer.write("<div id=\"");
writer.write(fieldid);
writer.write("\" class=\"lifecycle_values\">");
// process any available debug info
for (Map.Entry<String, List<Object[]>> entry : debugInfos.entrySet())
{
writer.write("<span>");
writer.write(entry.getKey());
writer.write("</span><ol>");
int i = 0;
for (Object[] debugInfo : entry.getValue())
{
// structure of the debug-info array:
// - 0: phase
// - 1: old value
// - 2: new value
// - 3: StackTraceElement List
// oldValue and newValue could be null
String oldValue = debugInfo[1] == null ? "null" : debugInfo[1].toString();
String newValue = debugInfo[2] == null ? "null" : debugInfo[2].toString();
writer.write("<li><b>");
writer.write(entry.getKey());
writer.write("</b> set from <b>");
writer.write(oldValue);
writer.write("</b> to <b>");
writer.write(newValue);
writer.write("</b> in Phase ");
writer.write(debugInfo[0].toString());
// check if a call stack is available
if (debugInfo[3] != null)
{
final String stackTraceId = fieldid + '_' + entry.getKey() + '_' + i;
writer.write("<div class=\"stacktrace_wrapper\">");
writer.write("<a href=\"#\" onclick=\"toggle('");
writer.write(stackTraceId);
writer.write("'); return false;\"><span id=\"");
writer.write(stackTraceId);
writer.write("Off\">+</span><span id=\"");
writer.write(stackTraceId);
writer.write("On\" style=\"display: none;\">-</span> Call Stack</a>");
writer.write("<div id=\"");
writer.write(stackTraceId);
writer.write("\" class=\"stacktrace_values\">");
writer.write("<ul>");
for (StackTraceElement stackTraceElement
: (List<StackTraceElement>) debugInfo[3])
{
writer.write("<li>");
writer.write(stackTraceElement.toString());
writer.write("</li>");
}
writer.write("</ul></div></div>");
}
writer.write("</li>");
i++;
}
writer.write("</ol>");
}
writer.write("</div></div>");
// now remove the debug info from the request map,
// so that it does not appear in the scope values of the debug page
requestMap.remove(DEBUG_INFO_KEY + target.getClientId());
if (!hasChildren)
{
// close the component
writer.write("<dt>");
writeEnd(writer, target);
writer.write("</dt>");
}
}
}
if (!hasChildren)
{
writer.write("</dl>");
while (parent != null &&
((parent.getChildCount()>0 && parent.getChildren().get(parent.getChildCount()-1) == target)
|| (parent.getFacetCount() != 0
&& getVisitedFacetCount(context.getFacesContext(), parent) ==
parent.getFacetCount())))
{
// target is last child of parent or the "last" facet
// remove the visited facet count from the attribute map
removeVisitedFacetCount(context.getFacesContext(), parent);
// check for componentes that visit their children multiple times
if (parent instanceof UIData uidata)
{
if (uidata.getRowIndex() != uidata.getRowCount() - 1)
{
// only continue if we're in the last row
break;
}
}
else if (parent instanceof UIRepeat uirepeat)
{
if (uirepeat.getIndex() + uirepeat.getStep() < uirepeat.getRowCount())
{
// only continue if we're in the last row
break;
}
}
writer.write("</dd><dt>");
writeEnd(writer, parent);
writer.write("</dt></dl>");
if (!(parent instanceof UIViewRoot))
{
writer.write("</dd>");
}
target = parent;
parent = target.getParent();
}
}
}
catch (IOException ioe)
{
throw new FacesException(ioe);
}
return VisitResult.ACCEPT;
}