A function can be used everywhere within the rule engine (condition expression, nls text). A predefined set of functions already exists.
To register the own function, open the "Preferences" dialog in the XUI Editor ("View" menu) and add a new function. After adding/modifying the functions, the XUI Edtior needs to be closed and started again.
Implementing an own function means to extend the "com.jaxfront.core.jep.JaxfrontMathCommand" class . In the field "Implementation Class" enter the class name which extends this class. In the field "Category" add an existing category name or a new one. You will see all categories when using the formula engine.
The class needs to extend the "com.jaxfront.core.jep.JaxfrontMathCommand" class:
Name | Description |
---|---|
run(Stack) | Each function should use it's own run() method for evaluating the function. This includes popping off the parameters from the stack, and pushing the result back on the stack. |
...
Hinweis |
---|
See class com.jaxfront.demo.api.OwnFunction |
This function checks if the passed node values is a future date.
Codeblock | ||||||
---|---|---|---|---|---|---|
| ||||||
public class OwnFunction extends SuperTypeNode { |
...
public void run(Stack stack) throws ParseException { |
...
// Check if stack is null |
...
checkStack(stack); |
...
Object param = null; |
...
String xPath = null; |
...
boolean isFutureDate = false; |
...
if (curNumberOfParameters == 1) { |
...
Type baseType = getCommunicator().getRootType(); |
...
param = stack.pop(); |
...
if (param == NULL._null) { |
...
stack.push(NULL._null); |
...
return; |
...
} else if (param instanceof Type) { |
...
baseType = (Type) param; |
...
} else if (param instanceof String) { |
...
xPath = (String) param; |
...
} |
...
Type resultType = null; |
...
if (xPath != null && xPath.length() > 0) { |
...
resultType = |
...
TypePathExecuter.getInstance().getTypeForXPath( |
...
baseType, |
...
xPath.trim(), |
...
true, |
...
true); |
...
} else |
...
resultType = baseType; |
...
if (resultType != null) { |
...
if (resultType.isSimple()) { |
...
SimpleType simpleType = (SimpleType)resultType; |
...
String dateString = simpleType.getValue(); |
...
if (dateString != null) { |
...
try { |
...
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); |
...
Date inputDate = format.parse(dateString); |
...
Date currentDate = new Date(); |
...
isFutureDate = inputDate.compareTo(currentDate) > 0; |
...
} |
...
catch (java.text.ParseException ex) { |
...
//do nothing |
...
} |
...
} |
...
} else { |
...
throw new ParseException(this.getClass() + " Invalid target type (must be simple)"); |
...
} |
...
} |
...
if (isFutureDate) { |
...
stack.push(SuperTypeNode.isTrue); |
...
} |
...
else { |
...
stack.push(SuperTypeNode.isFalse); |
...
} |
...
} else { |
...
throw new ParseException(this.getClass() + " Invalid parameter type"); |
...
} |
...
} |
...
} |