public void execute(Event<UIPortlet<S, C>> event) throws Exception { UIPortlet<S, C> uiPortlet = event.getSource(); PortalRequestContext prcontext = (PortalRequestContext) event.getRequestContext(); // set the public render parameters from the request before creating the invocation HttpServletRequest request = prcontext.getRequest(); setupPublicRenderParams(uiPortlet, request.getParameterMap()); // set the navigational state String navState = prcontext.getRequestParameter(ExoPortletInvocationContext.NAVIGATIONAL_STATE_PARAM_NAME); if (navState != null) { uiPortlet.setNavigationalState(ParametersStateString.create(navState)); } // ActionInvocation actionInvocation = uiPortlet.create(ActionInvocation.class, prcontext); if (actionInvocation == null) { return; } // PortletInvocationResponse portletResponse = uiPortlet.invoke(actionInvocation); // deal with potential portlet context modifications ExoPortletInstanceContext instanceCtx = (ExoPortletInstanceContext) actionInvocation.getInstanceContext(); if (instanceCtx.getModifiedContext() != null) { StatefulPortletContext<C> updatedCtx = (StatefulPortletContext<C>) instanceCtx.getModifiedContext(); C portletState = uiPortlet.getModifiedState(updatedCtx); uiPortlet.update(portletState); } else { // todo: fix me as this shouldn't probably be done only for the WSRP case PortletContext clonedContext = instanceCtx.getClonedContext(); if (clonedContext != null) { C state = uiPortlet.getClonedState(clonedContext); uiPortlet.update(state); } } if (portletResponse instanceof UpdateNavigationalStateResponse) { handleUpdateNavigationalStateResponse( (UpdateNavigationalStateResponse) portletResponse, uiPortlet, prcontext); } else if (portletResponse instanceof HTTPRedirectionResponse) { handleRedirectionResponse( (HTTPRedirectionResponse) portletResponse, prcontext.getResponse()); prcontext.setResponseComplete(true); } else if (portletResponse instanceof ErrorResponse) { handleErrorResponse((ErrorResponse) portletResponse); } else if (portletResponse instanceof SecurityResponse) { handleSecurityResponse((SecurityResponse) portletResponse); } else { throw new Exception( "Unexpected response type [" + portletResponse + "]. Expected an UpdateNavigationResponse" + ", a HTTPRedirectionResponse or an ErrorResponse."); } }
public void execute(Event<UIPortlet> event) throws Exception { UIPortlet uiPortlet = event.getSource(); uiPortlet.setNavigationalState(null); // set the public params HttpServletRequest request = event.getRequestContext().getRequest(); setupPublicRenderParams(uiPortlet, request.getParameterMap()); // set render params String navState = event .getRequestContext() .getRequestParameter(ExoPortletInvocationContext.NAVIGATIONAL_STATE_PARAM_NAME); if (navState != null) { uiPortlet.setNavigationalState(ParametersStateString.create(navState)); } }
/** * This method is called when the javax.portlet.Event is supported by the current portlet stored * in the Portlet Caontainer * * <p>The processEvent() method can also generates IPC events and hence the portal itself will * call the ProcessEventsActionListener once again */ public static <S, C extends Serializable, I> List<javax.portlet.Event> processEvent( UIPortlet<S, C> uiPortlet, javax.portlet.Event event) { log.trace("Process Event: " + event.getName() + " for portlet: " + uiPortlet.getState()); try { PortalRequestContext context = (PortalRequestContext) WebuiRequestContext.getCurrentInstance(); // EventInvocation eventInvocation = uiPortlet.create(EventInvocation.class, context); // eventInvocation.setName(event.getQName()); eventInvocation.setPayload(event.getValue()); // PortletInvocationResponse piResponse = uiPortlet.invoke(eventInvocation); // ExoPortletInstanceContext instanceCtx = (ExoPortletInstanceContext) eventInvocation.getInstanceContext(); if (instanceCtx.getModifiedContext() != null) { StatefulPortletContext<C> updatedCtx = (StatefulPortletContext<C>) instanceCtx.getModifiedContext(); C portletState = updatedCtx.getState(); uiPortlet.update(portletState); } // todo: handle the error response better than this. if (!(piResponse instanceof UpdateNavigationalStateResponse)) { if (piResponse instanceof ErrorResponse) { ErrorResponse errorResponse = (ErrorResponse) piResponse; throw (Exception) errorResponse.getCause(); } else { throw new Exception( "Unexpected response type [" + piResponse + "]. Expected a UpdateNavigationResponse or an ErrorResponse."); } } UpdateNavigationalStateResponse navResponse = (UpdateNavigationalStateResponse) piResponse; // /* * 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 */ WindowState state = new WindowState(getWindowStateOrDefault(navResponse)); setNextState(uiPortlet, state); // update the portlet with the next mode to display PortletMode mode = new PortletMode(getPortletModeOrDefault(navResponse)); setNextMode(uiPortlet, mode); StateString navState = navResponse.getNavigationalState(); if (navState != null) { uiPortlet.setNavigationalState(navResponse.getNavigationalState()); } setupPublicRenderParams(uiPortlet, navResponse.getPublicNavigationalStateUpdates()); // 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 = navResponse.getEvents(); List<javax.portlet.Event> events = new ArrayList<javax.portlet.Event>(nsEvents.size()); if (nsEvents != null && !nsEvents.isEmpty()) { for (UpdateNavigationalStateResponse.Event nsEvent : nsEvents) { javax.portlet.Event portletEvent = new PortletEvent(nsEvent.getName(), nsEvent.getPayload()); events.add(portletEvent); } } return events; } catch (Exception e) { log.error("Problem while processesing event for the portlet: " + uiPortlet.getState(), e); } return null; }
public void execute(Event<UIPortlet<S, C>> event) throws Exception { UIPortlet<S, C> uiPortlet = event.getSource(); log.trace("Serve Resource for portlet: " + uiPortlet.getPortletContext()); String resourceId = null; // PortalRequestContext context = (PortalRequestContext) event.getRequestContext(); HttpServletResponse response = context.getResponse(); // try { // Set the NavigationalState String navState = context.getRequestParameter(ExoPortletInvocationContext.NAVIGATIONAL_STATE_PARAM_NAME); if (navState != null) { uiPortlet.setNavigationalState(ParametersStateString.create(navState)); } // ResourceInvocation resourceInvocation = uiPortlet.create(ResourceInvocation.class, context); // set the resourceId to be used in case of a problem resourceId = resourceInvocation.getResourceId(); // PortletInvocationResponse portletResponse = uiPortlet.invoke(resourceInvocation); // int statusCode; MultiValuedPropertyMap<String> transportHeaders; String contentType; String charset; Object content; if (!(portletResponse instanceof ContentResponse)) { if (portletResponse instanceof ErrorResponse) { ErrorResponse errorResponse = (ErrorResponse) portletResponse; Throwable cause = errorResponse.getCause(); if (cause != null) { log.trace("Got error response from portlet", cause); } else if (errorResponse.getMessage() != null) { log.trace("Got error response from portlet:" + errorResponse.getMessage()); } else { log.trace("Got error response from portlet"); } } else { log.trace( "Unexpected response type [" + portletResponse + "]. Expected a ContentResponse or an ErrorResponse."); } statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR; contentType = null; charset = null; transportHeaders = null; content = null; } else { // ContentResponse piResponse = (ContentResponse) portletResponse; ResponseProperties properties = piResponse.getProperties(); transportHeaders = properties != null ? properties.getTransportHeaders() : null; // Look at status code if there is one and honour it String status = transportHeaders != null ? transportHeaders.getValue(ResourceResponse.HTTP_STATUS_CODE) : null; if (status != null) { try { statusCode = Integer.parseInt(status); } catch (NumberFormatException e) { statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR; } } else { statusCode = HttpServletResponse.SC_OK; } // contentType = piResponse.getContentType(); charset = piResponse.getEncoding(); // log.trace( "Try to get a resource of type: " + contentType + " for the portlet: " + uiPortlet.getPortletContext()); if (piResponse.getChars() != null) { content = piResponse.getChars(); } else if (piResponse.getBytes() != null) { content = piResponse.getBytes(); } else { content = null; } } // response.setStatus(statusCode); // Set content type if any if (contentType != null) { response.setContentType(contentType); } // Set encoding if (charset != null) { response.setCharacterEncoding(charset); } // Send headers if any if (transportHeaders != null) { sendHeaders(transportHeaders, context); } // Send body if any if (content instanceof String) { context.getWriter().write((String) content); } else if (content instanceof byte[]) { byte[] bytes = (byte[]) content; response.setContentLength(bytes.length); OutputStream stream = response.getOutputStream(); try { stream.write(bytes); } finally { Safe.close(stream); } } // response.flushBuffer(); } catch (Exception e) { if (!e.getClass().toString().contains("ClientAbortException")) { log.error( "Problem while serving resource " + (resourceId != null ? resourceId : "") + " for the portlet: " + uiPortlet.getPortletContext().getId(), e); } } finally { /** The resource method does not need to go through the render phase */ event.getRequestContext().setResponseComplete(true); } }
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(); } }