Connector groovy脚本使用文档

最后更新:2023-02-02

背景

connector 在做字段映射时,提供了字段一对一映射模式和groovy脚本映射模式,为了方便开发,交付,测试等同学更快,更方便的使用脚本,本文档提供groovy脚本的基本使用方法和脚本示例。

脚本基本元素

connector中的groovy脚本,定义了如下所需要使用到的对象:

对象名称

对象类型

对象作用

示例

source

Object

来源数据的对象,里面存放了来源数据

target

TargetDataItem

目标数据的对象,里面存放了目标数据

LOG

Logger

日志打印对象,可以进行日志打印输出

LOG.info(“[{}] - 打印测试”,RIDHolder.id());

attributeGetter

AttributeGetter

来源数据对象的属性获取类,可以从该对象调用getAttribute(SourceDataItem item, String attributeName)方法获取对象的特定属性值

attributeGetter.getAttribute(source,“userName”);

attributeSetter

AttributeSetter

目标数据对象的属性设置类,可以从该对象调用setAttribute(TargetDataItem item, String attributeName, Object… attributeValue)方法把属性值赋值进去。

attributeSetter.setAttribute(target, mapping.getTargetFiledName(), “123”));

mapping

SyncFieldMapping

属性映射的对象,该对象存放了同步任务里面所配置的属性映射字段。
可使用的方法:
获取来源的属性名:
getSourceFiledName()
获取目标的属性名:
getTargetFiledName()
是否启用该属性映射:
isEnabled()

mapping.getTargetFiledName();

脚本创建步骤

  1. 获取所需要的来源属性值,如下:

import java.lang.String

//获取来源对象的用户名
String userName = attributeGetter.getAttribute(source,"userName")

source为来源数据的对象,不用修改。
userName为来源对象的用户名的属性名称。
注意:当使用到脚本基本元素里面没有定义的对象时,需要使用import 导入进来。比如String对象,需要在文件最前面添加import java.lang.String;

  1. 对来源数据的属性值进行逻辑处理,根据业务需求,进行不同的代码逻辑处理,比如需要在用户名前面加上固定的前缀,如下:

import java.lang.String

//获取来源对象的用户名
String userName = attributeGetter.getAttribute(source,"userName")
//添加固定前缀
userName = "test_" + userName
  1. 把转换之后的来源属性值设置到目标数据对象里面去。

import java.lang.String
import com.idsmanager.micro.commons.web.filter.RIDHolder

//获取来源对象的用户名
String userName = attributeGetter.getAttribute(source,"userName")
//添加固定前缀
userName = "test_" + userName
LOG.info("[{}] - new username is :{}", RIDHolder.id(), userName)
//把转换过后的值赋值到目标数据对象里面
attributeSetter.setAttribute(target, mapping.getTargetFiledName(), userName)

target为目标数据的对象,不用修改。
mapping.getTargetFiledName() 该方法用于获取目标数据对象的属性名称。
userName为需要设置的具体值。

脚本使用示例

需求:从IDP4拉取数据同步到钉钉里面,IDP4的手机号是phoneNumber字段,手机区号是phoneRegion字段,同步到钉钉的手机号字段是mobile,钉钉没有手机区号字段,国际手机号的格式为+xx-xxxxxx。需要把IDP4的phoneNumber和phoneRegion拼接成+xx-xxxxxx的格式。
groovy脚本如下:

import java.lang.String

//获取IDP4的手机号
String phoneNumber = attributeGetter.getAttribute(source,"phoneNumber")
//获取IDP4的手机区号
String phoneRegion = attributeGetter.getAttribute(source,"phoneRegion")
//组装成+xx-xxxxxx的格式
String newMobile = "+" + phoneRegion + "-" + phoneNumber
//给钉钉目标数据对象赋值
attributeSetter.setAttribute(target, mapping.getTargetFiledName(), newMobile)

需求:从IDP4同步组到钉钉,需要把IDP4组里面用户名为admin的过滤掉。
groovy脚本如下:

import java.lang.String
import java.util.List
import com.idsmanager.idp.sync.core.idp4.entity.IDP4Member

//获取组名
List<IDP4Member> members = attributeGetter.getAttribute(source,"members")
//过滤掉组名为默认组的数据
Iterator<IDP4Member> it = members.iterator()
while(it.hasNext()){
    IDP4Member member = it.next()
    if("admin".equals(member.getUsername())){
        it.remove()
    }
}
attributeSetter.setAttribute(target, mapping.getTargetFiledName(),members)

注意事项

在实际项目中,特别是生产环境,虽然可以方便的调用应用中的bean或者类的方法,但随意调用也可能引发不可避免的灾难,所以对groovy动态脚本需要进行严格的测试。