通过dxl检查嵌套链接中的对象

时间:2019-01-24 17:40:37

标签: ibm-doors

我有以下情况。 我想在模块1中计算,在模块3的链接中有多少对象具有链接。

示例:

模块1 Obj1 <-模块2 Obj1 <-模块3.Obj1

模块1 Obj2 <-模块2 Obj1 <-模块3.Obj1

模块1 Obj3 <-模块2 Obj1 <-模块3.Obj1

模块1 Obj4 <-模块2 Obj1

模块1 Obj5 <-模块2 Obj1

在上述情况下,计数应返回3。

是否可以通过DXL跟随链接,然后再跟随另一个链接? (不使用向导或DXL属性)

对我来说最重要:知道是否有人这样做并且有可能做到。

1 个答案:

答案 0 :(得分:0)

请从具有传入链接的模块中尝试以下DXL。在运行代码之前:

  1. 确保您从相关模块中打开“编辑DXL”窗口
  2. 将分配给全局常量STR_LINK_MOD_FULLNAME(第17行)的字符串值设置为您感兴趣的链接的链接模块的完整路径名
  3. 将分配给全局常量STR_SRC_MOD_FULLNAME(第18行)的字符串值设置为您感兴趣的链接的源形式模块(在本例中为模块3)的完整路径名

您无需更改任何其他内容即可使其工作。

我没有考虑通过使用字符串“ *”代替第17行中的特定链接模块名称来分析所有链接模块中的链接的含义(请参见上面的第2点)。

我也没有竭尽全力地解释代码,尽管我努力地做到了自己整洁,并按照DOORS和DXL的要求整理自己。如有任何疑问,请随时答复。

亲切的问候,

理查德

//<CheckObjectInNestedLink.dxl>

/*
 */

///////////////
// Sanity check

if (null (current Module))
{
    print "ERROR: this script must be run from a Formal Module."
}

///////////////////
// Global Constants

const string STR_LINK_MOD_FULLNAME = "/New Family Car Project/Admin/Satisfies" // the fullName of a single link module - results of using "*" have not been considered/tested
const string STR_SRC_MOD_FULLNAME  = "/New Family Car Project/Architecture/Architectural Design" // The fullName of the desired source Formal Module


///////////////////
// Global Variables

Module modSource               = null
Object objTarget               = null
Object objSource               = null
Link   lkIn                    = null
Skip   skLinkedMods            = create()
Skip   skObjsWithDesiredSource = create()

int intNoOfLinked              = 0


//////////////////////
// Auxiliary Functions

void closeSourceMods ()
{
    Module srcMod

    for srcMod in skLinkedMods do
    {
        close(srcMod)
    }
}

void openSourceMods (Object objWithLinks)
{
    ModName_ srcModRef
    Module   srcMod

    for srcModRef in (objWithLinks <- STR_LINK_MOD_FULLNAME) do
    {
        srcMod = read(fullName(srcModRef), false)
        put(skLinkedMods, srcMod, srcMod)
    }
}

void recurseFollowInLinks (Object objWithLinks)
{
    openSourceMods(objWithLinks)

    for lkIn in objWithLinks <- STR_LINK_MOD_FULLNAME do
    {
            openSourceMods(objWithLinks)
            objSource = source(lkIn)

            string strSrcModName = fullName(module(objSource))

            if (strSrcModName == STR_SRC_MOD_FULLNAME)
            {
                bool blNewEntry = put(skObjsWithDesiredSource, objTarget, objTarget)

                if (blNewEntry)
                {
                    intNoOfLinked++
                }
                //print "put(skObjsWithDesiredSource, " identifier(objTarget) ", " identifier(objTarget) ")\n"
            }

            recurseFollowInLinks(objSource)
    }
}

void checkObjectInNestedLink (Module modThis, string strSourceModuleFullname, string strLinkModuleFullName)
{
    intNoOfLinked = 0

    for objTarget in modThis do
    {
        recurseFollowInLinks(objTarget)
    }

    print "The following " intNoOfLinked " objects have direct or indirect links of type " STR_LINK_MOD_FULLNAME " from formal module " STR_SRC_MOD_FULLNAME ":\n"

    for objTarget in skObjsWithDesiredSource do
    {
        print identifier(objTarget)
        print "\n"
    }
}


///////////////
// Main Program

checkObjectInNestedLink ((current Module), STR_SRC_MOD_FULLNAME, STR_LINK_MOD_FULLNAME)

closeSourceMods()
delete(skLinkedMods)
delete(skObjsWithDesiredSource)