@Override public void decode(FacesContext context, UIComponent component, ClientBehavior behavior) { if (null == context || null == component || null == behavior) { throw new NullPointerException(); } if (!(behavior instanceof AjaxBehavior)) { // TODO: use MessageUtils for this error message? throw new IllegalArgumentException( "Instance of javax.faces.component.behavior.AjaxBehavior required: " + behavior); } AjaxBehavior ajaxBehavior = (AjaxBehavior) behavior; // First things first - if AjaxBehavior is disabled, we are done. if (ajaxBehavior.isDisabled()) { return; } component.queueEvent(createEvent(context, component, ajaxBehavior)); if (logger.isLoggable(Level.FINE)) { logger.fine("This command resulted in form submission " + " AjaxBehaviorEvent queued."); logger.log(Level.FINE, "End decoding component {0}", component.getId()); } }
// Tests whether we should perform immediate processing. Note // that we "inherit" immediate from the parent if not specified // on the behavior. private static boolean isImmediate(UIComponent component, AjaxBehavior ajaxBehavior) { boolean immediate = false; if (ajaxBehavior.isImmediateSet()) { immediate = ajaxBehavior.isImmediate(); } else if (component instanceof EditableValueHolder) { immediate = ((EditableValueHolder) component).isImmediate(); } else if (component instanceof ActionSource) { immediate = ((ActionSource) component).isImmediate(); } return immediate; }
@Override public void addClientBehavior(String eventName, ClientBehavior clientBehavior) { // If the specified client behavior is an Ajax behavior, then the alloy:accordion component tag // has an f:ajax // child tag. Register a listener that can respond to the Ajax behavior by invoking the // tabCollapseListener or // tabExpandListener that may have been specified. if (clientBehavior instanceof AjaxBehavior) { AjaxBehavior ajaxBehavior = (AjaxBehavior) clientBehavior; ajaxBehavior.addAjaxBehaviorListener(new AccordionBehaviorListener()); } super.addClientBehavior(eventName, clientBehavior); }
public AjaxParameters(InputFile inputFile, String clientId, String formClientId) { // Default value of execute is "@this" which maps to name and id of the rendered input element. this.execute = clientId.concat(StringPool.SPACE).concat(clientId); // Default value of render is "@none" which maps to an empty string. this.render = StringPool.BLANK; // For each Ajax behavior associated with the specified component: Map<String, List<ClientBehavior>> clientBehaviorMap = inputFile.getClientBehaviors(); List<ClientBehavior> clientBehaviors = clientBehaviorMap.get(inputFile.getDefaultEventName()); for (ClientBehavior clientBehavior : clientBehaviors) { if (clientBehavior instanceof AjaxBehavior) { // Interpret the value of the f:ajax "execute" attribute. AjaxBehavior ajaxBehavior = (AjaxBehavior) clientBehavior; Collection<String> executeIds = ajaxBehavior.getExecute(); if ((executeIds != null) && (executeIds.size() > 0)) { boolean foundAllKeyword = false; boolean foundNoneKeyword = false; StringBuilder buf = new StringBuilder(clientId); for (String executeId : executeIds) { if ("@all".equals(executeId)) { foundAllKeyword = true; break; } else if ("@none".equals(executeId)) { foundNoneKeyword = true; this.execute = StringPool.BLANK; break; } else if (executeId.length() > 0) { buf.append(StringPool.SPACE); buf.append(executeId); } } if (!foundNoneKeyword) { if (foundAllKeyword) { this.execute = "@all"; } else { this.execute = buf.toString(); this.execute = this.execute.replace("@form", formClientId); this.execute = this.execute.replace("@this", clientId); boolean foundClientId = false; String[] executeIdArray = this.execute.split(StringPool.SPACE); for (String executeId : executeIdArray) { if (clientId.equals(executeId)) { foundClientId = true; break; } } if (!foundClientId) { this.execute = clientId.concat(StringPool.SPACE).concat(this.execute); } } } } // Interpret the value of the f:ajax "render" attribute. Collection<String> renderIds = ajaxBehavior.getRender(); if ((renderIds != null) && (renderIds.size() > 0)) { boolean first = true; boolean foundAllKeyword = false; boolean foundNoneKeyword = false; StringBuilder buf = new StringBuilder(); for (String renderId : renderIds) { if ("@all".equals(renderId)) { foundAllKeyword = true; break; } else if ("@none".equals(renderId)) { foundNoneKeyword = true; this.render = StringPool.BLANK; break; } else { if (renderId.length() > 0) { if (first) { first = false; } else { buf.append(StringPool.SPACE); } buf.append(renderId); } } } if (!foundNoneKeyword) { if (foundAllKeyword) { this.render = "@all"; } else { this.render = buf.toString(); this.render = this.render.replace("@form", formClientId); this.render = this.render.replace("@this", clientId); } } } } } }
private static String buildAjaxCommand( ClientBehaviorContext behaviorContext, AjaxBehavior ajaxBehavior, boolean namespaceParameters) { // First things first - if AjaxBehavior is disabled, we are done. if (ajaxBehavior.isDisabled()) { return null; } UIComponent component = behaviorContext.getComponent(); String eventName = behaviorContext.getEventName(); StringBuilder ajaxCommand = new StringBuilder(256); Collection<String> execute = ajaxBehavior.getExecute(); Collection<String> render = ajaxBehavior.getRender(); String onevent = ajaxBehavior.getOnevent(); String onerror = ajaxBehavior.getOnerror(); String sourceId = behaviorContext.getSourceId(); String delay = ajaxBehavior.getDelay(); Boolean resetValues = null; if (ajaxBehavior.isResetValuesSet()) { resetValues = ajaxBehavior.isResetValues(); } Collection<ClientBehaviorContext.Parameter> params = behaviorContext.getParameters(); // Needed workaround for SelectManyCheckbox - if execute doesn't have sourceId, // we need to add it - otherwise, we use the default, which is sourceId:child, which // won't work. ClientBehaviorContext.Parameter foundparam = null; for (ClientBehaviorContext.Parameter param : params) { if (param.getName().equals("incExec") && (Boolean) param.getValue()) { foundparam = param; } } if (foundparam != null && !execute.contains(sourceId)) { execute = new LinkedList<>(execute); execute.add(component.getClientId()); } if (foundparam != null) { try { // And since this is a hack, we now try to remove the param params.remove(foundparam); } catch (UnsupportedOperationException uoe) { if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "Unsupported operation", uoe); } } } ajaxCommand.append("mojarra.ab("); if (sourceId == null) { ajaxCommand.append("this"); } else { ajaxCommand.append("'"); ajaxCommand.append(sourceId); ajaxCommand.append("'"); } ajaxCommand.append(",event,'"); ajaxCommand.append(eventName); ajaxCommand.append("',"); appendIds(component, ajaxCommand, execute); ajaxCommand.append(","); appendIds(component, ajaxCommand, render); String namingContainerId = null; if (namespaceParameters) { FacesContext context = behaviorContext.getFacesContext(); UIViewRoot viewRoot = context.getViewRoot(); if (viewRoot instanceof NamingContainer) { namingContainerId = viewRoot.getContainerClientId(context); } } if ((namingContainerId != null) || (onevent != null) || (onerror != null) || (delay != null) || (resetValues != null) || !params.isEmpty()) { ajaxCommand.append(",{"); if (namingContainerId != null) { // the literal string must exactly match the corresponding value // in jsf.js. RenderKitUtils.appendProperty( ajaxCommand, "com.sun.faces.namingContainerId", namingContainerId, true); } if (onevent != null) { RenderKitUtils.appendProperty(ajaxCommand, "onevent", onevent, false); } if (onerror != null) { RenderKitUtils.appendProperty(ajaxCommand, "onerror", onerror, false); } if (delay != null) { RenderKitUtils.appendProperty(ajaxCommand, "delay", delay, true); } if (resetValues != null) { RenderKitUtils.appendProperty(ajaxCommand, "resetValues", resetValues, false); } if (!params.isEmpty()) { for (ClientBehaviorContext.Parameter param : params) { RenderKitUtils.appendProperty(ajaxCommand, param.getName(), param.getValue()); } } ajaxCommand.append("}"); } ajaxCommand.append(")"); return ajaxCommand.toString(); }