/** {@inheritDoc} */ @Override public void serviceRequest(final Request request) { String triggerId = request.getParameter(WServlet.AJAX_TRIGGER_PARAM_NAME); AjaxOperation ajaxOperation = AjaxHelper.getCurrentOperation(); if (ajaxOperation == null) { throw new IllegalStateException("No AJAX operation available for trigger " + triggerId + "."); } ComponentWithContext triggerWithContext = AjaxHelper.getCurrentTriggerAndContext(); if (triggerWithContext == null) { throw new IllegalStateException( "No component/context available for AJAX trigger " + triggerId + "."); } UIContext uic = UIContextHolder.getCurrent(); // Reset the focus for this new request. uic.setFocussed(null, null); // We've hit the action phase, so we do want focus on this app. uic.setFocusRequired(true); // Process trigger only if (isProcessTriggerOnly(triggerWithContext, ajaxOperation)) { // Get user context UIContext tuic = triggerWithContext.getContext(); UIContextHolder.pushContext(tuic); try { WComponent trigger = triggerWithContext.getComponent(); trigger.serviceRequest(request); // Manually invoke laters as the InvokeLaters in the service request is not run due to the // trigger // having a "parent" tuic.doInvokeLaters(); } finally { UIContextHolder.popContext(); } } // GET only supports the above scenarios else if ("GET".equals(request.getMethod())) { throw new IllegalStateException( "GET is not supported for the AJAX trigger " + triggerId + "."); } else { // service the request super.serviceRequest(request); } }
/** * Paint the ajax container response. * * @param renderContext the render context * @param operation the ajax operation */ private void paintContainerResponse( final RenderContext renderContext, final AjaxOperation operation) { WebXmlRenderContext webRenderContext = (WebXmlRenderContext) renderContext; XmlStringBuilder xml = webRenderContext.getWriter(); // Get trigger's context ComponentWithContext trigger = AjaxHelper.getCurrentTriggerAndContext(); if (trigger == null) { throw new SystemException("No context available for trigger " + operation.getTriggerId()); } xml.appendTagOpen("ui:ajaxTarget"); xml.appendAttribute("id", operation.getTargetContainerId()); xml.appendAttribute("action", "replaceContent"); xml.appendClose(); // Paint targets - Assume targets are in the same context as the trigger UIContextHolder.pushContext(trigger.getContext()); try { for (String targetId : operation.getTargets()) { ComponentWithContext target = null; if (targetId.equals(operation.getTriggerId())) { target = trigger; } else { target = WebUtilities.getComponentById(targetId, true); if (target == null) { log.warn("Could not find ajax target to render " + target); continue; } } target.getComponent().paint(renderContext); } } finally { UIContextHolder.popContext(); } xml.appendEndTag("ui:ajaxTarget"); }