private static String getWindowStateOrDefault(UpdateNavigationalStateResponse navResponse) {
   org.gatein.pc.api.WindowState state = navResponse.getWindowState();
   if (state == null) {
     state = org.gatein.pc.api.WindowState.NORMAL;
   }
   return state.toString();
 }
    private void handleUpdateNavigationalStateResponse(
        UpdateNavigationalStateResponse navStateResponse,
        UIPortlet<S, C> uiPortlet,
        PortalRequestContext prcontext)
        throws Exception {
      /*
       * Update the portlet window state according to the action output
       * information
       *
       * If the current node is displaying a usual layout page, also tells the
       * page which portlet to render or not when the state is maximized
       */
      // Note: we should only update the WindowState if the
      // UpdateNavigationalStateResponse.getWindowState is not null,
      // otherwise it means the WindowState has not changed and we should use the current value.
      if (navStateResponse.getWindowState() != null) {
        WindowState state = new WindowState(getWindowStateOrDefault(navStateResponse));
        setNextState(uiPortlet, state);
      }

      // update the portlet with the next mode to display
      // Note: we should only update the Mode if the UpdateNavigationalStateResponse.getMode is not
      // null,
      // otherwise it means the mode has not changed and we should use the current value.
      if (navStateResponse.getMode() != null) {
        PortletMode mode = new PortletMode(getPortletModeOrDefault(navStateResponse));
        setNextMode(uiPortlet, mode);
      }

      /*
       * Cache the render parameters in the UI portlet component to handle the
       * navigational state. Each time a portlet is rendered (except using
       * directly a RenderURL) those parameters are added to the portlet request
       * to preserve the portlet state among all the portal clicks
       */

      //
      StateString navigationalState = navStateResponse.getNavigationalState();
      if (navigationalState != null) {
        uiPortlet.setNavigationalState(navigationalState);
      }

      // update the public render parameters with the changes from the invocation
      setupPublicRenderParams(uiPortlet, navStateResponse.getPublicNavigationalStateUpdates());

      /*
       * Handle the events returned by the action output and broadcast a new UI
       * event to the ProcessEventsActionListener that will then target the
       * portlet container service directly
       */

      // TODO: (mwringe) add this to the UpdateNavigationStateResponse.Event class instead of here
      class PortletEvent implements javax.portlet.Event {
        QName qName;

        Serializable value;

        public PortletEvent(QName qName, Serializable value) {
          this.qName = qName;
          this.value = value;
        }

        public String getName() {
          return qName.getLocalPart();
        }

        public QName getQName() {
          return qName;
        }

        public Serializable getValue() {
          return value;
        }
      }

      List<UpdateNavigationalStateResponse.Event> nsEvents = navStateResponse.getEvents();
      List<javax.portlet.Event> events = new ArrayList<javax.portlet.Event>(nsEvents.size());
      if (nsEvents != null && !nsEvents.isEmpty()) {
        for (UpdateNavigationalStateResponse.Event nsEvent : nsEvents) {
          if (uiPortlet.supportsPublishingEvent(nsEvent.getName())) {
            javax.portlet.Event portletEvent =
                new PortletEvent(nsEvent.getName(), nsEvent.getPayload());
            events.add(portletEvent);
          }
        }
      }

      if (events != null) {
        prcontext.setAttribute(PORTLET_EVENTS, new EventsWrapper(events));
        uiPortlet.createEvent("ProcessEvents", Phase.PROCESS, prcontext).broadcast();
      }
    }