Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        public ReqProRequirementPrx(ReqPro40.Project___v7 rpxProject, int nKey)
        {
            if (rpxProject == null)
            {
                Init("Key " + nKey, "unknown Project", "unknown Project");
            }
            else if (!rpxProject.IsProjectOpen)
            {
                Init("Key " + nKey, "not accessible", "not accessible");
            }
            else
            {
                ReqPro40.Requirement___v6 rpxReq = null;
                Tracer tracer = new Tracer("Req (Key: " + nKey + ")");
                if (rpxReqColl != null)
                {
                    if (rpxProject.Prefix == strHomePrjPrefix)
                    {
                        /* somehow strange - Requirement discovered - but not accessible if it does not belong to the home project */
                        rpxReq = (Requirement___v6)rpxReqColl[nKey, ReqPro40.enumRequirementLookups.eReqLookup_Key];
                    }
                }
                if (rpxReq != null)
                {
                    tracer.Stop("Req " + rpxReq.get_Tag(enumTagFormat.eTagFormat_Tag) + " got via rpxColl []");
                }
                else
                {
                    try
                    {
                        rpxReq = dictReqCache[nKey];
                        dictReqCache.Remove(nKey);
                        dictReqCache.Add(nKey, rpxReq);
                        tracer.Stop("Req " + ((rpxReq != null) ? (rpxReq.get_Tag(enumTagFormat.eTagFormat_Tag)) : ("key " + nKey)) +
                                    " got via ReqCache");
                    }
                    catch (System.Collections.Generic.KeyNotFoundException)
                    {
                        rpxReq = (Requirement___v6)rpxProject.GetRequirement(
                            nKey, ReqPro40.enumRequirementLookups.eReqLookup_Key,
                            ReqPro40.enumRequirementsWeights.eReqWeight_Medium,
                            ReqPro40.enumRequirementFlags.eReqFlag_Empty);
                        dictReqCache.Add(nKey, rpxReq);

                        if (dictReqCache.Count > nReqCacheSize)
                        {
                            foreach (KeyValuePair <int, ReqPro40.Requirement___v6> kvp in dictReqCache)
                            {
                                dictReqCache.Remove(kvp.Key);
                                break;
                            }
                        }
                        tracer.Stop("Req " + ((rpxReq != null) ? (rpxReq.get_Tag(enumTagFormat.eTagFormat_Tag)) : ("key " + nKey)) +
                                    " got via rpxProject.GetRequirement");
                    }
                }
                Init(rpxReq);
            }

            this.rpxProject = rpxProject;
            this.nKey       = nKey;
            strPrefix       = "";

            if (rpxProject != null)
            {
                if (rpxProject.Prefix != strHomePrjPrefix)
                {
                    strPrefix = rpxProject.Prefix;
                }
            }
        }
Ejemplo n.º 3
0
        private void ParseRequirements()
        {
            ReqPro40.Requirements     rpxReqColl;
            ReqPro40.Requirement___v6 rpxReq;
            ReqPro40.Relationship     reqRelParent;

            int                           nReqCount;
            ReqTreeNode                   tnPackage;
            ReqTreeNode                   reqMyTreeNode;
            List <ReqTreeNode>            reqUnassigned;
            Dictionary <int, ReqTreeNode> dictReq;
            int                           i = 0;

            reqUnassigned = new List <ReqTreeNode>();
            dictReq       = new Dictionary <int, ReqTreeNode>();

            cb.ShowProgressReqPkgTree(0, 0, 0, 0, "Identifying Requirements");
            rpxReqColl = rpxProject.GetRequirements("*", ReqPro40.enumRequirementsLookups.eReqsLookup_All,
                                                    ReqPro40.enumRequirementsWeights.eReqWeight_Medium, ReqPro40.enumRequirementFlags.eReqFlag_Empty, 1000, 8);
            ReqProRequirementPrx.RPXReqColl = rpxReqColl;

            nReqCount = rpxReqColl.Count;
            cb.ShowProgressReqPkgTree(0, 0, nReqCount, 0, nReqCount + " Requirements identified");
            foreach (object o in rpxReqColl)
            {
                Tracer tracer = new Tracer("Req (Key: " + o + ") from Req Coll");
                rpxReq = (ReqPro40.Requirement___v6)rpxReqColl[o, ReqPro40.enumRequirementLookups.eReqLookup_Key];
                tracer.Stop("Req " + rpxReq.get_Tag(ReqPro40.enumTagFormat.eTagFormat_Tag) +
                            " got via eReqLookup_Key from Requirements Collection");
                try
                {
                    i++;
                    cb.ShowProgressReqPkgTree(0, 0, 0, i, null);
                    tnPackage = (ReqTreeNode)dictPackage[rpxReq.PackageKey];

                    reqMyTreeNode = new ReqTreeNode
                                        (rpxReq.get_Tag(ReqPro40.enumTagFormat.eTagFormat_Tag) + ": " + rpxReq.Name,
                                        rpxReq.key, ReqTreeNode.eReqTreeNodeType.eTreeNodeReq);
                    if (rpxReq.IsRoot)
                    {
                        if (tnPackage != null)
                        {
                            tnPackage.Add(ref reqMyTreeNode);
                        }
                        dictReq.Add(rpxReq.key, reqMyTreeNode);
                    }
                    else
                    {
                        //Tracer tr = new Tracer("Parent of " + reqMyTreeNode.Text + " discovering");

                        // performance is too low for that step :-(
                        //reqRelParent = rpxReq.get_Parent(ReqPro40.enumRequirementsWeights.eReqWeight_Medium);
                        //reqMyTreeNode.Parent = reqRelParent.SourceKey;
                        //reqUnassigned.Add(reqMyTreeNode);
                        //tr.Stop("Parent of " + reqMyTreeNode.Text + " discovered");

                        if (tnPackage != null)
                        {
                            tnPackage.Add(ref reqMyTreeNode);
                        }
                        dictReq.Add(rpxReq.key, reqMyTreeNode);
                    }
                }
                catch (Exception)
                {
                }
            }

            Tracer trCleanup = new Tracer("Cleanup Children Requirements");

            while (reqUnassigned.Count > 0)
            {
                for (int j = 0; j < reqUnassigned.Count; j++)
                {
                    reqMyTreeNode = reqUnassigned[j];
                    if (dictReq.ContainsKey(reqMyTreeNode.Parent))
                    {
                        tnPackage = dictReq[reqMyTreeNode.Parent];

                        tnPackage.Add(ref reqMyTreeNode);
                        dictReq.Add(reqMyTreeNode.Key, reqMyTreeNode);
                        reqUnassigned.Remove(reqMyTreeNode);
                        j--;
                    }
                }
            }
            trCleanup.Stop("Cleanup Children Requirements");

            cb.ShowProgressReqPkgTree(0, 0, 0, 0, i + " Requirements inserted");
            cb.ShowProgressReqPkgTree(0, 0, 0, 0, null);
        }