org.zkoss.bind.impl.AccessInfo Maven / Gradle / Ivy
/* AccessInfo.java
Purpose:
Description:
History:
Jul 28, 2011 5:17:48 PM, Created by henrichen
Copyright (C) 2011 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.bind.impl;
import java.io.Serializable;
import org.zkoss.bind.BindContext;
import org.zkoss.bind.Binder;
import org.zkoss.bind.sys.BindEvaluatorX;
import org.zkoss.bind.sys.Binding;
import org.zkoss.bind.sys.ConditionType;
import org.zkoss.lang.Strings;
import org.zkoss.xel.ExpressionX;
/**
* Represent an load/save binding expression
* e.g.
* "load = property (before|after) command"
* "save = property (before|after) command"
*
* @author henrichen
* @since 6.0.0
*/
public class AccessInfo implements Serializable {
private static final long serialVersionUID = 1463169907348730644L;
final String commandName; //command name
final ExpressionX property; //property expression
final ConditionType type; //the condition type, prompt, before command or after command
public AccessInfo(ExpressionX property, ConditionType type, String command) {
this.property = property;
this.type = type;
this.commandName = command;
}
public String getCommandName() {
return this.commandName;
}
public ConditionType getConditionType() {
return this.type;
}
public ExpressionX getProperty() {
return this.property;
}
public static AccessInfo create(Binding binding, String accessExpr, Class> expectedType, ConditionType type,
String command, boolean ignoreTracker) {
final Binder binder = binding.getBinder();
if (ConditionType.PROMPT != type && Strings.isEmpty(command)) {
throw new IllegalArgumentException(MiscUtil.formatLocationMessage(
"condition type is " + type + ", but command is null", binding.getComponent()));
}
final BindEvaluatorX eval = binder.getEvaluatorX();
//ZK-1066 Incorrect form value if inner binding waiting a command
//ignore when non-prompt and binding marked ignored
final BindContext ctx = BindContextUtil.newBindContext(binder, binding, false, null, binding.getComponent(),
null);
if (ConditionType.PROMPT != type || ignoreTracker) {
ctx.setAttribute(BinderImpl.IGNORE_TRACKER, Boolean.TRUE);
}
final ExpressionX prop = eval.parseExpressionX(ctx, accessExpr, expectedType);
return new AccessInfo(prop, type, command);
}
}