SPL 自定义插件
自定义函数要求
每个自定义函数都用一个 Java 类来进行定义,它必须满足以下条件:
1、 类是公开的,即 public class。
2、 类继承自函数基类 com.scudata.expression.Function
3、 实现基类中的抽象方法 public Object calculate(Context ctx),在此方法中进行函数参数、选项的解析,完成函数应有的功能,返回函数的计算结果。ctx 是函数运行的上下文环境,包括有系统配置文件中的各种配置及 SPL 脚本文件的参数等。下面补充一个例子。
插件功能描述
实现一个插件,程序计算 2 个数的平方和,然后返回这个结果。插件的名称为 powersum, 参数为 2 个整数。
应用的方式与原生的函数一致。
在 A1 的单元格中,输入 =powersum(1,2);结果为 5
插件开发
在源码环境下开发插件,或者在已经集成了 SPL 的环境下开发。
创建插件所在包,package com.self,在该包下创建 PowerSum 类
该插件类继承与 Function
重写 checkValidity,检查表达式的有效性,无效则抛出异常
@Override
public void checkValidity() {
if (param == null) {
MessageManager mm = EngineMessage.get();
throw new RQException(“combin” + mm.getMessage(“function.missingParam”));
} else if (param.getSubSize() != 2) {
MessageManager mm = EngineMessage.get();
throw new RQException(“combin” + mm.getMessage(“function.invalidParam”));
}
}
重写计算的部分
获取 sub1 参数,计算表达式为 result1
获取 sub2 参数,计算表达式为 result2
对 2 个表达式进行平方求和之后进行返回
@Override
public Object calculate(Context ctx) {
IParam sub1 = param.getSub(0);
IParam sub2 = param.getSub(1);
if (sub1 == null || sub2 == null) {
MessageManager mm = EngineMessage.get();
throw new RQException("combin" + mm.getMessage("function.invalidParam"));
}
Object result1 = sub1.getLeafExpression().calculate(ctx);
if (result1 == null) {
return null;
} else if (! (result1 instanceof Number)) {
MessageManager mm = EngineMessage.get();
throw new RQException("The first param of combin" + mm.getMessage("function.paramTypeError"));
}
Object result2 = sub2.getLeafExpression().calculate(ctx);
if (result2 == null) {
return null;
} else if (! (result2 instanceof Number)) {
MessageManager mm = EngineMessage.get();
throw new RQException("The second param of combin" + mm.getMessage("function.paramTypeError"));
}
return new Long(Variant.longValue(result1)*Variant.longValue(result1)
+Variant.longValue(result2)*Variant.longValue(result2));
}
}
插件部署
插件 class 复制到指定目录
PowerSum 这个类所在的包为 com.self, 最后这个类编译为 PowerSum.class。
在这个 C:\Program Files\raqsoft\esProc\classes 目录下,
新建包的同名目录, 即形成 C:\Program Files\raqsoft\esProc\classes\com\self 这个目录,将 PowerSum.class 文件复制到该目录下
插件配置及注册
在 C:\Program Files\raqsoft\esProc\classes 目录下,打开 customFunctions.properties 文件
添加一行
powersum=0,com.self.PowerSum
逗号前面是在编辑器中使用的函数名,函数名必须是系统里唯一的,不能与系统函数同名或其它自定义函数同名。第 1 部分的值为 0 或 1,0 表示是普通函数,1 表示是某对象的成员函数,例如字符串对象的函数 s.len(),逗号后面的是自定义函数的完整 Java 类名。
在 spl 启动的时候,默认加载 customFunctions.properties,这个位置用户也可以移动其他地方。
使用方式
如 powersum 是自定义的插件,在 spl 的编辑环境一下
A1 的格子里输入 =powersum(1,2),点击运行结果是 5