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();
}
}