All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ajax4jsf.framework.util.command.CommandScriptBuilder Maven / Gradle / Ivy

package org.ajax4jsf.framework.util.command;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.faces.component.UICommand;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;

import org.ajax4jsf.framework.renderer.RendererUtils.HTML;
import org.ajax4jsf.framework.resource.ClientScript;
import org.ajax4jsf.framework.util.InputUtils;
import org.ajax4jsf.framework.util.javascript.JSFunction;
import org.ajax4jsf.framework.util.javascript.JSReference;
import org.ajax4jsf.framework.util.javascript.ScriptString;
/**
 * Utility class to build command links, buttons etc.
 * Introduces correct parameter escaping
 * @author Maksim Kaszynski
 *
 */
public class CommandScriptBuilder {
	public static final ClientScript SCRIPT = new CommandScript();

	private static final ScriptString JSR_EVENT =  new JSReference("(event || window.event)");
	
	private boolean checkActionAndListener = true;
	private StringBuffer codeAfter = new StringBuffer();
	private StringBuffer codeBefore = new StringBuffer();
	private UICommand component;
	private Map parameters;
	private String target;
	private boolean useOriginalOnclick = true;
	
	public CommandScriptBuilder(UICommand command) {
		this.component = command;
		collectParams();
	}
	
	public void addCodeAfter(String codeAfter) {
		this.codeAfter.append(codeAfter);
	}
	
	public void addCodeBefore(String codeBefore) {
		this.codeBefore.append(codeBefore);
	}
	
	public void addParameter(String name, Object value) {
		if (parameters == null) {
			parameters = new LinkedHashMap();
		}
		parameters.put(name, value);
	}
	
	
	
	private void addParameter(UIParameter parameter) {
		addParameter(parameter.getName(), parameter.getValue());
	}

	private void collectParams () {
		for (Iterator iter = component.getChildren().iterator(); iter.hasNext();) {
			UIComponent kid = (UIComponent) iter.next();
			if (kid instanceof UIParameter) {
				addParameter((UIParameter) kid);
			}
		}
		
	}

	public StringBuffer getScript() {
		StringBuffer script = new StringBuffer();
		
		script.append(codeBefore).append(";");
		
		if (useOriginalOnclick) {
			Object onclick = component.getAttributes().get(HTML.onclick_ATTRIBUTE);
			
			if (onclick != null) {
				script.append(onclick).append(";");
			}
		}
		
		
		if (shouldGenerateAction()) {
			JSFunction function = new JSFunction("new A4J_Command");
			function.addParameter(JSR_EVENT);
			function.addParameter(parameters);
			function.addParameter(target);
			
			function.appendScript(script);
			script.append(";");
		}
		
		
		script.append(codeAfter).append(";");
		
		return script;
	}

	public String getTarget() {
		return target;
	}
	
	private boolean hasActionOrListenerSet() {
		return (component.getAction() != null) || (component.getActionListener() != null);
	}
	
	public boolean isCheckActionAndListener() {
		return checkActionAndListener;
	}
	
	public boolean isUseOriginalOnclick() {
		return useOriginalOnclick;
	}
	
	public void setCheckActionAndListener(boolean checkActionAndListener) {
		this.checkActionAndListener = checkActionAndListener;
	}

	public void setTarget(String target) {
		this.target = target;
	}
	
	public void setUseOriginalOnclick(boolean useOriginalOnclick) {
		this.useOriginalOnclick = useOriginalOnclick;
	}
	
	private boolean shouldGenerateAction() {
		
		return (!InputUtils.isDisabled(component)) && (checkActionAndListener ? hasActionOrListenerSet() : true);
		
	}
	
	public String toString() {
		return getScript().toString();
	}
	
	
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy