private void ShowRequirements(ArrayList arrKeys, string strTreePathName, bool bWithFilter) { ReqProRequirementPrx rpxReq; FormGenericTable genTable; int nCount; string strCell; int nTraceCountTo; int nTraceCountFrom; ReqProRequirementPrx[] arpxReqTracesTo; ReqProRequirementPrx[] arpxReqTracesFrom; ReqTraceNode reqTN; string[] arrStringTrace; List <string> listTrace = new List <string>(); string[,] astrGrid; List <string[]> aastrCells; List <string> rowHdrCells = new List <string>(); string[] rowCells; string[] astrCol; string[] astrValue; int nColCount; List <string> colTraceTo; List <string> colTraceFrom; ReqProRequirementPrx.eTraceAbortReason eAbortReason = ReqProRequirementPrx.eTraceAbortReason.eNoAbort; if (bWithFilter) { if (!ToContinueAfterFilter(true, false)) { return; } } genTable = new FormGenericTable("Requirements - Package: " + strTreePathName, null, null, FormGenericTableLayout.eFormGenericTableToken.eReqDetails); nCount = 0; /* at least we have: Tag, Name, Text, Version, Date, User, */ rowHdrCells.Add("Tag"); rowHdrCells.Add("Name"); rowHdrCells.Add("Text"); rowHdrCells.Add("Version"); rowHdrCells.Add("Date"); rowHdrCells.Add("User"); rowHdrCells.Add("Path"); rowHdrCells.Add("Package"); colTraceTo = new List <string>(); colTraceFrom = new List <string>(); colTraceTo.Add("Trace To"); colTraceFrom.Add("Trace From"); aastrCells = new List <string[]> (); foreach (int nKey in arrKeys) { int nColIdx; rowCells = new string [rowHdrCells.Count]; rpxReq = reqDBBrowser.GetRequirementPrx(nKey); if (!listnReqTypeRootKeyExcl.Contains(rpxReq.ReqTypeKey)) { rowCells[0] = rpxReq.Tag; rowCells[1] = rpxReq.Name; rowCells[2] = rpxReq.Text; rowCells[3] = rpxReq.VersionNumber; rowCells[4] = rpxReq.VersionDateTime; rowCells[5] = rpxReq.VersionUser; rowCells[6] = rpxReq.PackagePathName; rowCells[7] = rpxReq.PackageName; nColCount = rpxReq.GetAttributes(out astrCol, out astrValue); for (int i = 0; i < nColCount; i++) { nColIdx = rowHdrCells.IndexOf(astrCol[i]); if (nColIdx == -1) { int nOldCnt = rowHdrCells.Count; string[] rowCellsOld = rowCells; rowCells = new string[nOldCnt + 1]; rowHdrCells.Add(astrCol[i]); for (int j = 0; j < nOldCnt; j++) { rowCells[j] = rowCellsOld[j]; } nColIdx = rowHdrCells.Count - 1; } rowCells[nColIdx] = astrValue[i]; if (rowCells[nColIdx] == null) { rowCells[nColIdx] = ""; } System.Diagnostics.Trace.Write(rowHdrCells[nColIdx] + "(" + rowCells[nColIdx] + "); "); } aastrCells.Add(rowCells); arpxReqTracesTo = rpxReq.GetRequirementTracesTo(20, ref eAbortReason, out nTraceCountTo, null); arpxReqTracesFrom = rpxReq.GetRequirementTracesFrom(20, ref eAbortReason, out nTraceCountFrom, null); reqTN = new ReqTraceNode(rpxReq, 0, true, arpxReqTracesFrom, arpxReqTracesTo, nTraceCountFrom, nTraceCountTo, eAbortReason, 0, 0); reqTN.GetTraceFromString(out listTrace); arrStringTrace = listTrace.ToArray(); colTraceFrom.Add(string.Join("\n", arrStringTrace)); reqTN.GetTraceToString(out listTrace); arrStringTrace = listTrace.ToArray(); colTraceTo.Add(string.Join("\n", arrStringTrace)); nCount++; } } aastrCells.Insert(0, rowHdrCells.ToArray()); // we want some additional space for Trace To and From astrGrid = new string[aastrCells.Count, rowHdrCells.Count + 2]; for (int i = 0; i < aastrCells.Count; i++) { int j; for (j = 0; j < rowHdrCells.Count; j++) { if (j < aastrCells[i].GetLength(0)) { strCell = aastrCells[i][j]; } else { strCell = null; } if (strCell == null) { strCell = "n/a"; } astrGrid[i, j] = strCell; } astrGrid[i, j] = colTraceTo[i]; astrGrid[i, j + 1] = colTraceFrom[i]; } genTable.SetGridContent(astrGrid, nCount + " Requirements"); genTable.Show(); }
private void AddReq(ReqProRequirementPrx reqReqPrx, int nTraceLevel, int nTraceFromHopCount, int nTraceToHopCount, ulong ulDegreeOffset, ReqProRequirementPrx reqReqPrxTracesPreceder) { ReqTraceNode reqTraceNode = null; ReqProRequirementPrx.eTraceAbortReason eAbort = ReqProRequirementPrx.eTraceAbortReason.eNoAbort; if (dictReqKey.ContainsKey(reqReqPrx.Key)) /* this requirement was already handled */ { reqTraceNode = dictReqKey[reqReqPrx.Key]; if (reqReqPrxTracesPreceder == null) { reqTraceNode.MakeRootNode(); } if (!(reqTraceNode.TunedUp(nTraceFromHopCount, nTraceToHopCount))) { return; } } if (reqReqPrxTracesPreceder != null) { if (listnReqTypeTracedKeyExcl.Contains(reqReqPrx.ReqTypeKey)) { eAbort |= ReqProRequirementPrx.eTraceAbortReason.eReqTypeFilter; showProgressReqTraceGrid(0, 0, "Filtered: " + reqReqPrx.Tag); return; } } int nTracesTo; int nTracesFrom; ReqProRequirementPrx[] aTracesTo; ReqProRequirementPrx[] aTracesFrom; ulong ulDegreeInc = 1UL; for (int i = 0; i < (nTraceLevel + nMaxLevelTo); i++) { ulDegreeInc *= ulLevelMultiplier * ((ulong)nTraceLevel + (ulong)nMaxLevelTo); } Tracer tracer = new Tracer("Traces from/to Req " + reqReqPrx.Tag); aTracesTo = reqReqPrx.GetRequirementTracesTo(nMaxTraceCount, ref eAbort, out nTracesTo, reqReqPrxTracesPreceder); aTracesFrom = reqReqPrx.GetRequirementTracesFrom(nMaxTraceCount, ref eAbort, out nTracesFrom, reqReqPrxTracesPreceder); tracer.Stop("Traces from/to Req " + reqReqPrx.Tag); if (reqTraceNode == null) { reqTraceNode = new ReqTraceNode(reqReqPrx, ulDegreeOffset, reqReqPrxTracesPreceder == null, aTracesFrom, aTracesTo, nTracesFrom, nTracesTo, eAbort, nTraceFromHopCount, nTraceToHopCount); dictReqKey.Add(reqReqPrx.Key, reqTraceNode); grid[TraceLevel2Index(nTraceLevel)].Add(reqTraceNode); } else { reqTraceNode.OnceAgain(ulDegreeOffset, reqReqPrxTracesPreceder == null, aTracesFrom, aTracesTo, nTracesFrom, nTracesTo, eAbort, nTraceFromHopCount, nTraceToHopCount); } showProgressReqTraceGrid(0, 1, "Adding: " + reqTraceNode.Tag); if (aTracesFrom.GetLength(0) > 0) { if (nTraceLevel < this.nMaxLevelFrom) { if (reqTraceNode.TraceFromHopCount < this.nMaxFromTraceHops) { int nNextTraceFromHopCount = nTraceFromHopCount; ulong ulLocOffset = ulDegreeOffset * ulLevelMultiplier; showProgressReqTraceGrid(aTracesFrom.GetLength(0), 0, null); foreach (ReqProRequirementPrx reqReqPrxFrom in aTracesFrom) { if (dictReqKey.ContainsKey(reqReqPrxFrom.Key)) { ReqTraceNode reqTN = dictReqKey[reqReqPrxFrom.Key]; reqTN.SetRelDegree(ulLocOffset); reqTN.AddTraceTo(reqReqPrx); } else { ulLocOffset += ulDegreeInc; AddReq(reqReqPrxFrom, nTraceLevel + 1, ++nNextTraceFromHopCount, nTraceToHopCount, ulLocOffset, reqReqPrx); } } } else { System.Diagnostics.Trace.WriteLine("From Hops exceeded at: " + reqReqPrx.TagName); showProgressReqTraceGrid(0, 0, "tracing from hops exceeded at: " + reqTraceNode.Tag); eAbort |= ReqProRequirementPrx.eTraceAbortReason.eMaxFromHopsExceeded; } } else { eAbort |= ReqProRequirementPrx.eTraceAbortReason.eMaxFromLevelReached; } } if (aTracesTo.GetLength(0) > 0) { if (nTraceLevel > -this.nMaxLevelTo) { if (reqTraceNode.TraceToHopCount + 1 <= this.nMaxToTraceHops) { int nNextTraceToHopCount = reqTraceNode.TraceToHopCount + 1; ulong ulLocOffset = ulDegreeOffset; showProgressReqTraceGrid(aTracesTo.GetLength(0), 0, null); foreach (ReqProRequirementPrx reqReqPrxTo in aTracesTo) { if (dictReqKey.ContainsKey(reqReqPrxTo.Key)) { ReqTraceNode reqTN = dictReqKey[reqReqPrxTo.Key]; reqTN.SetRelDegree(ulLocOffset); reqTN.AddTraceFrom(reqReqPrx); } else { ulLocOffset += ulDegreeInc; AddReq(reqReqPrxTo, nTraceLevel - 1, nTraceFromHopCount, nTraceToHopCount, ulLocOffset, reqReqPrx); } } } else { System.Diagnostics.Trace.WriteLine("To Hops exceeded at: " + reqReqPrx.TagName); showProgressReqTraceGrid(0, 0, "tracing to exceeded at: " + reqTraceNode.Tag); eAbort |= ReqProRequirementPrx.eTraceAbortReason.eMaxToHopsExceeded; } } else { eAbort |= ReqProRequirementPrx.eTraceAbortReason.eMaxToLevelReached; } } reqTraceNode.AbortReason = eAbort; }