code: @Override
      public long doAction(
              IPortletWindowId portletWindowId,
              HttpServletRequest httpServletRequest,
              HttpServletResponse httpServletResponse) {
          this.portletCacheControlService.purgeCachedPortletData(portletWindowId, httpServletRequest);
  
          final IPortletWindow portletWindow =
                  this.portletWindowRegistry.getPortletWindow(httpServletRequest, portletWindowId);
  
          enforceConfigPermission(httpServletRequest, portletWindow);
  
          httpServletRequest = this.setupPortletRequest(httpServletRequest);
          httpServletResponse =
                  new PortletHttpServletResponseWrapper(httpServletResponse, portletWindow);
  
          // Execute the action,
          this.logger.debug("Executing portlet action for window '{}'", portletWindow);
  
          final long start = System.nanoTime();
          try {
              this.portletContainer.doAction(
                      portletWindow.getPlutoPortletWindow(), httpServletRequest, httpServletResponse);
          } catch (PortletException pe) {
              throw new PortletDispatchException(
                      "The portlet window '"
                              + portletWindow
                              + "' threw an exception while executing action.",
                      portletWindow,
                      pe);
          } catch (PortletContainerException pce) {
              throw new PortletDispatchException(
                      "The portlet container threw an exception while executing action on portlet window '"
                              + portletWindow
                              + "'.",
                      portletWindow,
                      pce);
          } catch (IOException ioe) {
              throw new PortletDispatchException(
                      "The portlet window '"
                              + portletWindow
                              + "' threw an exception while executing action.",
                      portletWindow,
                      ioe);
          }
  
          final long executionTime = System.nanoTime() - start;
  
          this.portalEventFactory.publishPortletActionExecutionEvent(
                  httpServletRequest, this, portletWindowId, executionTime);
  
          return executionTime;
      }
docs: /*
  PLT 22.1 If the content of a portlet is cached and the portlet is target of request
  with an action-type semantic (e.g. an action or event call), the portlet container should discard the cache and
  invoke the corresponding request handling methods of the portlet like processAction,or processEvent.