mrksbrg/ImpRec

View on GitHub
Logic/TrackerCase.cs

Summary

Maintainability
B
6 hrs
Test Coverage
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace ImpRec
{
    /// <summary>
    /// A TrackerCase represents an issue report.
    /// </summary>
    [Serializable()]
    public class TrackerCase : SoftwareArtifact
    {
        private String description;
        private String IAReport;
        private Boolean visited;
        private Boolean safetyCritical;

        private LinkedList<TrackerCase> relatedCases;
        private LinkedList<ImpactItem> needsUpdateLinks;
        private LinkedList<ImpactItem> impactedHWLinks;
        private LinkedList<ImpactItem> specifiedByLinks;
        private LinkedList<ImpactItem> verifiedByLinks;
        private LinkedList<ImpactItem> unspecifiedLinks;

        // Parameter tuning, based on training set
        public const int MAX_LEVELS_FOLLOW = 3;
        public const double CENT_WEIGHT = 1;
        public const double SIM_WEIGHT = 1;
        public const double LEVEL_PENELTY = 0.73;
        public const double ALPHA = 0.83;

        public TrackerCase()
        {
        }

        public TrackerCase(/*KnowlBase an, */string iCaseID)
            : base(/*an, */iCaseID, "TrackerCase")
        {
            IAReport = "";
            visited = false;
            safetyCritical = false;
            relatedCases = new LinkedList<TrackerCase>();
            needsUpdateLinks = new LinkedList<ImpactItem>();
            impactedHWLinks = new LinkedList<ImpactItem>();
            specifiedByLinks = new LinkedList<ImpactItem>();
            verifiedByLinks = new LinkedList<ImpactItem>();
            unspecifiedLinks = new LinkedList<ImpactItem>();
        }

        #region Serialization
        public TrackerCase(SerializationInfo info, StreamingContext ctxt)
        {
            this.title = (String)info.GetValue("Title", typeof(String));
            this.description = (String)info.GetValue("Description", typeof(String));
            this.IAReport = (String)info.GetValue("IAReport", typeof(String));
            this.visited = (Boolean)info.GetValue("Visited", typeof(Boolean));
            this.safetyCritical = (Boolean)info.GetValue("SafetyCritical", typeof(Boolean));
            this.relatedCases = (LinkedList<TrackerCase>)info.GetValue("RelatedCases", typeof(LinkedList<TrackerCase>));
            this.needsUpdateLinks = (LinkedList<ImpactItem>)info.GetValue("NeedsUpdateLinks", typeof(LinkedList<ImpactItem>));
            this.impactedHWLinks = (LinkedList<ImpactItem>)info.GetValue("ImpactedHWLinks", typeof(LinkedList<ImpactItem>));
            this.specifiedByLinks = (LinkedList<ImpactItem>)info.GetValue("SpecifiedByLinks", typeof(LinkedList<ImpactItem>));
            this.verifiedByLinks = (LinkedList<ImpactItem>)info.GetValue("VerifiedByLinks", typeof(LinkedList<ImpactItem>));
            this.unspecifiedLinks = (LinkedList<ImpactItem>)info.GetValue("UnspecifiedLinks", typeof(LinkedList<ImpactItem>));
        }

        public override void GetObjectData(SerializationInfo info, StreamingContext ctxt)
        {
            info.AddValue("Title", this.title);
            info.AddValue("Description", this.description);
            info.AddValue("IAReport", this.IAReport);
            info.AddValue("Visited", this.visited);
            info.AddValue("SafetyCritical", this.safetyCritical);
            info.AddValue("RelatedCases", this.relatedCases);
            info.AddValue("NeedsUpdateLinks", this.needsUpdateLinks);
            info.AddValue("ImpactedHWLinks", this.impactedHWLinks);
            info.AddValue("SpecifiedByLinks", this.specifiedByLinks);
            info.AddValue("VerifiedByLinks", this.verifiedByLinks);
            info.AddValue("UnspecifiedLinks", this.unspecifiedLinks);
        }
        #endregion

        public String Description
        {
            get { return description; }
            set { description = value; }
        }


        public String IAREPORT
        {
            get { return IAReport; }
            set { IAReport = value; }
        }


        public Boolean Visited
        {
            get { return visited; }
            set { visited = value; }
        }


        public Boolean SafetyCritical
        {
            get { return safetyCritical; }
            set { safetyCritical = value; }
        }

        public void AddRelatedCase(TrackerCase tc)
        {
            relatedCases.AddLast(tc);
        }

        public void AddNeedsUpdateLink(ImpactItem ii)
        {
            if (!needsUpdateLinks.Contains(ii))
            {
                needsUpdateLinks.AddLast(ii);
            }
        }

        public void AddImpactedHWLink(ImpactItem ii)
        {
            if (!impactedHWLinks.Contains(ii))
            {
                impactedHWLinks.AddLast(ii);
            }
        }

        public void AddSpecifiedByLink(ImpactItem ii)
        {
            if (!specifiedByLinks.Contains(ii))
            {
                specifiedByLinks.AddLast(ii);
            }
        }

        public void AddVerifiedByLink(ImpactItem ii)
        {
            if (!verifiedByLinks.Contains(ii))
            {
                verifiedByLinks.AddLast(ii);
            }
        }

        public void AddUnspecifiedLink(ImpactItem ii)
        {
            if (!unspecifiedLinks.Contains(ii))
            {
                unspecifiedLinks.AddLast(ii);
            }
        }

        public LinkedList<TrackerCase> GetRelatedCases()
        {
            return relatedCases;
        }

        public LinkedList<ImpactItem> GetNeedsUpdateLinks()
        {
            return needsUpdateLinks;
        }

        public LinkedList<ImpactItem> GetImpactedHWLinks()
        {
            return impactedHWLinks;
        }

        public LinkedList<ImpactItem> GetSpecifiedByLinks()
        {
            return specifiedByLinks;
        }

        public LinkedList<ImpactItem> GetVerifiedByLinks()
        {
            return verifiedByLinks;
        }

        public LinkedList<ImpactItem> GetUnspecifiedLinks()
        {
            return unspecifiedLinks;
        }

        public LinkedList<ImpactItem> GetAllLinks()
        {
            LinkedList<ImpactItem> mergedList = new LinkedList<ImpactItem>();

            foreach (ImpactItem ii in needsUpdateLinks)
            {
                if (!mergedList.Contains(ii))
                {
                    mergedList.AddLast(ii);
                }
            }

            foreach (ImpactItem ii in impactedHWLinks)
            {
                if (!mergedList.Contains(ii))
                {
                    mergedList.AddLast(ii);
                }
            }

            foreach (ImpactItem ii in specifiedByLinks)
            {
                if (!mergedList.Contains(ii))
                {
                    mergedList.AddLast(ii);
                }
            }

            foreach (ImpactItem ii in verifiedByLinks)
            {
                if (!mergedList.Contains(ii))
                {
                    mergedList.AddLast(ii);
                }
            }

            foreach (ImpactItem ii in unspecifiedLinks)
            {
                if (!mergedList.Contains(ii))
                {
                    mergedList.AddLast(ii);
                }
            }
            return mergedList;
        }

        /// <summary>
        /// Recursive function to find impact starting from a specific TC. 
        /// </summary>
        /// <param name="impactList"></param>
        /// <param name="level"></param>
        /// <param name="startSimilarity"></param>
        /// <returns></returns>
        public LinkedList<ImpactItem> FindImpact(LinkedList<ImpactItem> impactList, double level, double startSimilarity)
        {
            if (Visited)
            {
                return impactList;
            }
            else
            {
                Visited = true;
            }
            if (level > MAX_LEVELS_FOLLOW)
            {
                return impactList;
            }

            // Deal with the current TrackerCase
            LinkedList<ImpactItem> tmpList = GetAllLinks();
            foreach (ImpactItem tmp in tmpList)
            {
                if (tmp.LevelsFromSource == -1)
                {
                    tmp.LevelsFromSource = level;
                }
                else if (tmp.LevelsFromSource > level)
                {
                    tmp.LevelsFromSource = level;
                }
              
                if (impactList.Contains(tmp))
                {
                    tmp.RankingValue += (ALPHA * tmp.Centrality + (1 - ALPHA) * startSimilarity) / (1 + level * LEVEL_PENELTY);
                    tmp.NbrInLinks++;
                }
                else
                {
                    tmp.RankingValue = (ALPHA * tmp.Centrality + (1 - ALPHA) * startSimilarity) / (1 + level * LEVEL_PENELTY);
                    impactList.AddLast(tmp);
                }
            }

            // Call the next TrackerCase to analyze
            foreach (TrackerCase next in relatedCases)
            {
                if (!next.Visited)
                {
                    impactList = next.FindImpact(impactList, level + 1, startSimilarity);
                }
            }
            return impactList;
        }

        public override String ToXmlElement()
        {
            return "<TrackerCase>" + artifactID + "</TrackerCase>";
        }
    }
}