проверка объекта во вложенной ссылке через dxl

У меня следующая ситуация. Я хочу подсчитать в Модуле 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 перейти по ссылке, а потом перейти по другой ссылке? (без использования атрибутов Wizard или DXL)

Самое главное для меня: знать, сделал ли это кто-то другой и возможно ли это сделать.


person Cristina S    schedule 24.01.2019    source источник


Ответы (1)


Пожалуйста, попробуйте следующий 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)
person Richard Hesketh    schedule 26.01.2019