org.zkoss.bind.impl.ClientBinderCommandParser Maven / Gradle / Ivy
/** ClientBinderCommandParser.java.
Purpose:
Description:
History:
12:15:09 PM Jan 7, 2015, Created by jumperchen
Copyright (C) 2015 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.bind.impl;
import org.zkoss.idom.Attribute;
import org.zkoss.lang.Strings;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.metainfo.ComponentInfo;
import org.zkoss.zk.ui.metainfo.LanguageDefinition;
import org.zkoss.zk.ui.metainfo.NamespaceParser;
import org.zkoss.zk.ui.metainfo.NativeInfo;
import org.zkoss.zk.ui.metainfo.PageDefinition;
/**
* A client binder command parser for @command and @global-command
*
* @author jumperchen
* @since 8.0.0
*/
public class ClientBinderCommandParser implements NamespaceParser {
private static String SCRIPT = "zkbind.Binder.%1s(this,%2s)";
public boolean isMatched(String nsURI) {
return isNative(nsURI) || isClient(nsURI) || "".equals(nsURI); // if native component without namespace
}
private boolean isClient(String nsURI) {
return "client".equals(nsURI) || LanguageDefinition.CLIENT_NAMESPACE.equals(nsURI);
}
private boolean isNative(String nsURI) {
return "native".equals(nsURI) || LanguageDefinition.NATIVE_NAMESPACE.equals(nsURI);
}
public boolean parse(Attribute attr, ComponentInfo compInfo, PageDefinition pgdef) throws Exception {
if (!(compInfo instanceof NativeInfo) && "".equals(attr.getNamespaceURI()))
return false; // not what we care.
final String name = attr.getLocalName();
final String value = attr.getValue();
if (Events.isValid(name)) {
if (value.startsWith("@command(")) {
final String subValue = value.substring(9, value.lastIndexOf(')'));
final String[] strings = subValue.split(",");
addAttribute(compInfo, attr, name, String.format(SCRIPT, "postCommand", Strings.join(strings)));
return true;
} else if (value.startsWith("@global-command(")) {
final String subValue = value.substring(16, value.lastIndexOf(')'));
final String[] strings = subValue.split(",");
addAttribute(compInfo, attr, name, String.format(SCRIPT, "postGlobalCommand", Strings.join(strings)));
return true;
}
}
return false;
}
private void addAttribute(ComponentInfo compInfo, Attribute attr, String name, String value) {
if (compInfo instanceof NativeInfo || isNative(attr.getNamespaceURI())) {
compInfo.addProperty(name, value, null);
} else {
compInfo.addWidgetListener(name, value, null);
}
}
public int getPriority() {
return 10000;
}
}