public String intercept()

in core/src/main/java/org/apache/struts2/interceptor/debugging/DebuggingInterceptor.java [157:271]


    public String intercept(ActionInvocation inv) throws Exception {
        boolean actionOnly = false;
        boolean cont = true;
        Boolean devModeOverride = PrepareOperations.getDevModeOverride();
        boolean devMode = devModeOverride != null ? devModeOverride : this.devMode;
        if (devMode) {
            final ActionContext ctx = ActionContext.getContext();
            String type = getParameter(DEBUG_PARAM);
            ctx.getParameters().remove(DEBUG_PARAM);
            if (XML_MODE.equals(type)) {
                inv.addPreResultListener(
                        (inv1, result) -> printContext());
            } else if (CONSOLE_MODE.equals(type)) {
                consoleEnabled = true;
                inv.addPreResultListener(
                        (inv12, actionResult) -> {
                            String xml = "";
                            if (enableXmlWithConsole) {
                                StringWriter writer = new StringWriter();
                                printContext(new PrettyPrintWriter(writer));
                                xml = writer.toString();
                                xml = xml.replaceAll("&", "&");
                                xml = xml.replaceAll(">", ">");
                                xml = xml.replaceAll("<", "&lt;");
                            }
                            ActionContext.getContext().put("debugXML", xml);

                            FreemarkerResult result = new FreemarkerResult();
                            result.setFreemarkerManager(freemarkerManager);
                            result.setContentType("text/html");
                            result.setLocation("/org/apache/struts2/interceptor/debugging/console.ftl");
                            result.setParse(false);
                            try {
                                result.execute(inv12);
                            } catch (Exception ex) {
                                LOG.error("Unable to create debugging console", ex);
                            }

                        });
            } else if (COMMAND_MODE.equals(type)) {
                ValueStack stack = (ValueStack) ctx.getSession().get(SESSION_KEY);
                if (stack == null) {
                    //allows it to be embedded on another page
                    stack = ctx.getValueStack();
                    ctx.getSession().put(SESSION_KEY, stack);
                }
                String cmd = getParameter(EXPRESSION_PARAM);

                ServletActionContext.getRequest().setAttribute("decorator", "none");
                HttpServletResponse res = ServletActionContext.getResponse();
                res.setContentType("text/plain");

                try (PrintWriter writer =
                             ServletActionContext.getResponse().getWriter()) {
                    writer.print(stack.findValue(cmd));
                } catch (IOException ex) {
                    LOG.warn("Interceptor in: {} mode has failed!", COMMAND_MODE, ex);
                }
                cont = false;
            } else if (BROWSER_MODE.equals(type)) {
                actionOnly = true;
                inv.addPreResultListener(
                        (inv13, actionResult) -> {
                            String rootObjectExpression = getParameter(OBJECT_PARAM);
                            if (rootObjectExpression == null) {
                                rootObjectExpression = "action";
                            }
                            String decorate = getParameter(DECORATE_PARAM);
                            ValueStack stack = ctx.getValueStack();
                            Object rootObject = stack.findValue(rootObjectExpression);
                            allowListClass(rootObject);

                            try (StringWriter writer = new StringWriter()) {
                                ObjectToHTMLWriter htmlWriter = new ObjectToHTMLWriter(writer);
                                htmlWriter.write(reflectionProvider, rootObject, rootObjectExpression);
                                String html = writer.toString();
                                writer.close();

                                stack.set("debugHtml", html);

                                //on the first request, response can be decorated
                                //but we need plain text on the other ones
                                if ("false".equals(decorate)) {
                                    ServletActionContext.getRequest().setAttribute("decorator", "none");
                                }

                                FreemarkerResult result = new FreemarkerResult();
                                result.setFreemarkerManager(freemarkerManager);
                                result.setContentType("text/html");
                                result.setLocation("/org/apache/struts2/interceptor/debugging/browser.ftl");
                                result.execute(inv13);
                            } catch (Exception ex) {
                                LOG.error("Unable to create debugging console", ex);
                            }
                        });
            }
        }
        if (cont) {
            try {
                if (actionOnly) {
                    inv.invokeActionOnly();
                    return null;
                } else {
                    return inv.invoke();
                }
            } finally {
                if (devMode && consoleEnabled) {
                    final ActionContext ctx = ActionContext.getContext();
                    ctx.getSession().put(SESSION_KEY, ctx.getValueStack());
                }
            }
        } else {
            return null;
        }
    }