public override bool Equals(object obj)
        {
            if (obj.GetType() != this.GetType())
            {
                return(false);
            }

            BuildGraph Comparable = obj as BuildGraph;

            if (this.mybuildSpecifiers.Length != Comparable.mybuildSpecifiers.Length)
            {
                return(false);
            }


            for (int i = 0; i < this.mybuildSpecifiers.Length; i++)
            {
                if (!this.mybuildSpecifiers[i].Equals(Comparable.mybuildSpecifiers[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
        public IResponse Execute(ICruiseRequest cruiseRequest)
        {
            Hashtable velocityContext = new Hashtable();
            IProjectSpecifier projectSpecifier = cruiseRequest.ProjectSpecifier;
            IServerSpecifier serverSpecifier = FindServer(projectSpecifier);
            var sessionToken = cruiseRequest.RetrieveSessionToken();

            IBuildSpecifier[] buildSpecifiers = farmService.GetMostRecentBuildSpecifiers(projectSpecifier, 1, sessionToken);
            if (buildSpecifiers.Length == 1)
            {
                velocityContext["mostRecentBuildUrl"] = linkFactory.CreateProjectLink(projectSpecifier, LatestBuildReportProjectPlugin.ACTION_NAME).Url;
            }

            velocityContext["projectName"] = projectSpecifier.ProjectName;
            velocityContext["server"] = serverSpecifier;
            velocityContext["externalLinks"] = farmService.GetExternalLinks(projectSpecifier, sessionToken);
            velocityContext["noLogsAvailable"] = (buildSpecifiers.Length == 0);

            velocityContext["StatusMessage"] = ForceBuildIfNecessary(projectSpecifier, cruiseRequest.Request, sessionToken);
            ProjectStatus status = FindProjectStatus(projectSpecifier, cruiseRequest);
            velocityContext["status"] = status;
            velocityContext["StartStopButtonName"] = (status.Status == ProjectIntegratorState.Running) ? "StopBuild" : "StartBuild";
            velocityContext["StartStopButtonValue"] = (status.Status == ProjectIntegratorState.Running) ? "Stop" : "Start";
            velocityContext["ForceAbortBuildButtonName"] = (status.Activity.IsSleeping() ? "ForceBuild" : "AbortBuild");
            velocityContext["ForceAbortBuildButtonValue"] = (status.Activity.IsSleeping() ? "Force" : "Abort");
            velocityContext["ParametersUrl"] = urlBuilder.BuildProjectUrl(ProjectParametersAction.ActionName, projectSpecifier);

            if (cruiseRequest.Request.ApplicationPath == "/")
                velocityContext["applicationPath"] = string.Empty;
            else
                velocityContext["applicationPath"] = cruiseRequest.Request.ApplicationPath;

            velocityContext["rssDataPresent"] = farmService.GetRSSFeed(projectSpecifier).Length > 0;

            // I (willemsruben) can not figure out why the line below does not work :-(
            // velocityContext["rss"] = linkFactory.CreateProjectLink(projectSpecifier, WebDashboard.Plugins.RSS.RSSFeed.ACTION_NAME).Url;
            //
            velocityContext["rss"] = RSSLinkBuilder.CreateRSSLink(linkFactory, projectSpecifier);

            velocityContext["ohloh"] = farmService.GetLinkedSiteId(projectSpecifier, sessionToken, "ohloh") ?? string.Empty;

            string subReportData = GetPluginSubReport(cruiseRequest, projectSpecifier, buildSpecifiers);
            if (subReportData != null && subReportData != String.Empty)
                velocityContext["pluginInfo"] = subReportData;

            BuildGraph GraphMaker;
            // if the amount of builds exceed this, foresee extra column(s) for the days
            //   adjusting the Y-axis of the graph
            Int32 MaxBuildTreshhold = 15;
            // Limits the X-axis to this amount of days
            Int32 MaxAmountOfDaysToDisplay = 15;
            // the amount of columns to foresee for 1 day in the graph
            Int32 DateMultiPlier;

            GraphMaker = new BuildGraph(
                farmService.GetMostRecentBuildSpecifiers(projectSpecifier, AmountOfBuildsToRetrieve, sessionToken),
                this.linkFactory,
                Translations.RetrieveCurrent());

            velocityContext["graphDayInfo"] = GraphMaker.GetBuildHistory(MaxAmountOfDaysToDisplay);
            velocityContext["highestAmountPerDay"] = GraphMaker.HighestAmountPerDay;

            DateMultiPlier = (GraphMaker.HighestAmountPerDay / MaxBuildTreshhold) + 1;
            velocityContext["dateMultiPlier"] = DateMultiPlier;

            Int32 okpercent = 100;
            if (GraphMaker.AmountOfOKBuilds + GraphMaker.AmountOfFailedBuilds > 0)
            {
                okpercent = 100 * GraphMaker.AmountOfOKBuilds / (GraphMaker.AmountOfOKBuilds + GraphMaker.AmountOfFailedBuilds);
            }
            velocityContext["OKPercent"] = okpercent;
            velocityContext["NOKPercent"] = 100 - okpercent;

            return viewGenerator.GenerateView(@"ProjectReport.vm", velocityContext);
        }