public VisitResult visit()

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