I am new to DOORS DXL scripting and I am facing some issues with a script I have trying to write. I want to achieve the following: We have two DOORS modules: a source module and a target module. You need to create links between specific objects in these modules based on certain criteria. What needs to be achieve:
In the source module: Look at each object's "System Req" attribute. Search for strings that start with "ONESYS" and end with some random numbers (more than one digit). In the target module: Search the "Original ID" attribute for the strings found in the source module. Linking: When a match is found between the "ONESYS" string in the source module and the "Original ID" in the target module, create a link between these two objects. The links should be created in a specified link module. The process should be automated and efficient, capable of handling large modules with many objects. The goal is to automate the process of identifying related objects between the two modules based on the "ONESYS" identifier and creating the appropriate links, thereby establishing traceability between the source and target modules. I have the following script but I get errors indicating incorrect argument for (->), exists, and if. I use DOORS 9.6 and I have been looking at the manual and still struggling. I would appreciate your feedback and your assistance.
Module sourceModule = current
Module targetModule = module("Target Module Name")
Module linkModule = module("Link Module Name")
//search phrase inside the attribute text ending with more than one digit numbers
Regexp reOneSys = regexp "ONE_SYS\_\[0-9\]{2,}"
// Create a Skip list to store target module's "Original ID" and corresponding objects
Skip targetIDs = create()
for Object trgObj in targetModule do {
string originalID = trgObj."Original ID"
if (!null originalID) {
put(targetIDs, originalID, trgObj)
}
}
int createdLinks = 0
// Iterate through source module objects
for Object srcObj in sourceModule do {
string sysReq = srcObj."System Req"
if (!null sysReq) {
// Find all matches of "ONE_SYS\_" pattern in the System Req
int startPos = 0
while (reOneSys sysReq\[startPos:\]) {
string matchedID = sysReq\[match 0\]
// Look for the matched ID in the target module
Object trgObj
if (find(targetIDs, matchedID, trgObj)) {
// Create link if it doesn't exist
if (!exists(srcObj-\>linkModule-\>trgObj)) {
srcObj-\>linkModule-\>trgObj
createdLinks++
}
}
startPos = end 0 + startPos
}
}
}
// Print results to DOORS database window
print "Process completed. " createdLinks " links created.\\n"
The problem and what I have tried so far are mentioned.
you were quite close to the solution. There were mainly just some syntax problems.
See the changes and comments below:
// "exists" does not exist for Links. use an auxiliary function
bool doesLinkExist (Object src, string lmName, Object trg) {
Link l
bool retval = false
for l in src->lmName do {
if target (l) == trg then retval = true
}
return retval
}
Module sourceModule = current
Module targetModule = edit("Target Module Name", true, true) // use "edit"
string linkModuleName = "Link Module Name" // links are created using the name of a module, not the module handle
//search phrase inside the attribute text ending with more than one digit numbers
Regexp reOneSys = regexp2 "ONE_SYS_[0-9][0-9]+" // a) regexp2 instead of regexp, b) {2,} is not supported, c) not sure where all the escape characters stem from, perhaps some copy/paste. I removed them.
// Create a Skip list to store target module's "Original ID" and corresponding objects
Skip targetIDs = create()
Object trgObj // first declare a variable, then use it
for trgObj in targetModule do {
string originalID = trgObj."Original ID"
if (!null originalID) {
put(targetIDs, originalID, trgObj)
}
}
int createdLinks = 0
// Iterate through source module objects
Object srcObj
for srcObj in sourceModule do {
string sysReq = srcObj."System Req"
if (!null sysReq) {
// Find all matches of "ONE_SYS_" pattern in the System Req
int startPos = 0
while (reOneSys sysReq[startPos:]) {
string matchedID = sysReq[match 0]
// Look for the matched ID in the target module
Object trgObj
if (find(targetIDs, matchedID, trgObj)) {
// Create link if it doesn't exist
if (!doesLinkExist(srcObj, linkModuleName, trgObj)) {
srcObj->linkModuleName->trgObj
createdLinks++
}
}
startPos = end 0 + startPos
}
}
}
// Print results to DOORS database window
print "Process completed. " createdLinks " links created.\\n"