在odi映射对象中设置上下文

时间:2019-12-24 11:24:50

标签: java groovy oracle-data-integrator

由于项目要求,我们需要从其他服务器导入项目映射和其他对象。但是我们发现所有映射上下文都变得不确定。

我正在尝试编写一个普通的程序来设置上下文。我已经编写了下面的代码,但由于某种原因interfaceList为空,因此无法执行odiInterface.setOptimizationContext(context);

下面是我的代码。为简便起见,我没有提到stmt软件包。

def all the variables like url,driver,schema etc
def all variables like MasterInfo, auth, transaction, etc 

def OdiContext context = ((IOdiContextFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiContext.class)).findByCode("CTX_ANN1_S4")
for (p in odiProjectList) {
    if (p.getName() == "PrjDemo_TA") {
        def OdiFolderList = p.getFolders()
        for (f in OdiFolderList) {
            if (f.getName() == "TrgDemoMod_Comn_TA_S4") {
                // def OdiInterfaceList2 = f.getInterfaces()                
                // def OdiMappingList = odiInstance.getTransactionalEntityManager().findAll( Mapping.class)
                def OdiInterfaceList = ((IOdiInterfaceFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiInterface.class)).findByProject(projectCode, folderName)

                for (m in OdiInterfaceList2) {
                    println(m.getName() + "|" + m.getClass()) //+ "|" + m.getParent()   + "|" + m.getFolder() )
                    m.setOptimizationContext(context)
                }
                tm.commit(txnStatus)
            }
        }
    }
}

初始化OdiInterfaceList的行不会引发任何错误,也不会填充文件夹中所有接口的所需接口列表。 因此m.setOptimizationContext(context)未执行。

如果我将该行替换为:

def OdiMappingList = odiInstance.getTransactionalEntityManager().findAll( Mapping.class)

for ... loop内,我可以访问映射,但是我不知道如何设置其上下文OdiMappingList,因为setOptimizationContext是接口的方法。

1 个答案:

答案 0 :(得分:4)

由于我没有可以测试的环境,因此我无法重提您的案件,但我仍然认为我可以提供帮助。

首先,我重构了您的代码,使其更具趣味性:

def OdiContext context = ((IOdiContextFinder) odiInstance.getTransactionalEntityManager().getFinder(OdiContext.class)).findByCode("CTX_ANN1_S4")

// Looking for the project
def prjDemo = odiProjectList.find { it.name == "PrjDemo_TA" }
assert prjDemo : "Unable to find ODI project"

//Getting the Mappings
def mappingList = odiInstance.getTransactionalEntityManager().findAll( Mapping.class)
assert ! mappingList.toList().empty : "Mappings not found"

// Printing interfaces
mappingList.each {
    it.setDefaultContext(context as IContext)
}

有了这些断言,您也许可以详细了解代码可能真正失败的地方。

我注意到IOdiInterfaceFindermarked as deprecated,因此它可能无法在Oracle 12c中正常使用。检查您的版本。

如果尝试使用更新的版本替换不推荐使用的代码,可能会更好。我在this page中找到了一些与您相似的代码,因此它可能很有用。

更新: 更新了代码以使用Mapping类。由于它具有setDefaultContext(IContext ctx)方法,并且OdiContext实现了IContext,因此也许可行。