DXL中如何检测对象IN-LINKS且无需预打开未知关联模块
DXL实现SYS模块IN-LINKS遍历无需预开关联SW模块
问题背景
- 系统内链接方向固定为SW模块指向SYS模块,两类校验逻辑必须独立执行,无法互相替代:
- SW模块场景:遍历对象OUT-LINKS,读取关联SYS对象的属性完成校验
- SYS模块场景:必须在SYS模块上下文内遍历对象IN-LINKS,完成属性多维度校验,无法通过SW侧OUT-LINKS遍历实现
- 已验证可正常运行的SW侧OUT-LINKS遍历代码:
for SW_object in SW_module do { for OUT_link in SW_object -> "*" do { /* TODO: 执行对应校验逻辑 */ } }
- 参照上述逻辑编写的SYS侧IN-LINKS遍历代码存在运行限制:
for SYS_object in SYS_module do { for IN_link in SYS_object <- "*" do { /* TODO: 执行对应校验逻辑 */ } }
该代码仅当所有关联SW模块预先打开时才能正常运行,实际业务中无法提前获知所有关联SW模块的路径,无法预先打开对应模块。
解决方案
问题根因
直接使用<-操作符遍历IN-LINKS时,DOORS不会自动加载链接对应的源模块,未打开源模块时链接指向的源对象无法被正常访问,会导致遍历结果为空或脚本运行异常。
实现逻辑
不需要提前维护关联SW模块的路径列表,直接从IN-LINKS实例中动态提取源模块路径,后台静默加载即可完成遍历,代码如下:
Object SYS_object Link IN_link Module src_SW_Module string src_Module_Path Object src_SW_Object for SYS_object in SYS_module do { for IN_link in SYS_object <- "*" do { // 从当前链接直接获取源SW模块的完整路径 src_Module_Path = target(IN_link) // 检查模块是否已加载,未加载则后台只读打开,不弹出窗口 src_SW_Module = read(src_Module_Path, false, true) if (null(src_SW_Module)) { print "跳过无效链接,无法加载源模块:" src_Module_Path "\n" continue } // 获取链接对应的源SW对象,即可正常读写属性执行校验 src_SW_Object = source(IN_link) /* TODO: 在此处编写SYS侧IN-LINKS对应的校验逻辑 */ } } // 可选:脚本执行完成后关闭临时打开的SW模块,释放许可证
注意事项
read()函数第二个参数传false代表后台静默加载模块,不会弹出模块窗口干扰当前操作界面read()函数第三个参数传true代表以只读模式加载模块,不会触发模块锁,也不会误修改SW模块内容- 该逻辑会自动识别所有关联的SW模块,不需要提前维护模块路径清单,和OUT-LINKS遍历的覆盖范围完全一致
- 如果需要过滤指定链接集的链接,仅需将
<- "*"中的通配符替换为对应链接模块名称即可,用法和OUT-LINKS遍历完全相同
内容的提问来源于stack exchange,提问作者F A Fernández
相关产品推荐
相关产品推荐

