Esempio n. 1
0
        /// <summary>
        /// Capture a Snapshot of the Page content
        /// </summary>
        /// <param name="siteId">The Id of the site to refresh page content</param>
        /// <returns></returns>
        public async Task RefreshSite(string siteId)
        {
            try
            {
                var site = await getSite(siteId);

                if (site != null)
                {
                    var previousSiteStatus = site.Status;
                    await takeSnapshot(site);

                    var message = new SiteEvent
                    {
                        SiteId         = site.Id,
                        Name           = site.Name,
                        CurrentStatus  = site.Status.ToString(),
                        PreviousStatus = previousSiteStatus.ToString(),
                        Message        = $"Site {site.Name} refresh has been requested",
                        Happened       = DateTime.Now
                    };

                    await sendMessage(message);
                }
                else
                {
                    Log.Error("This site {@id} is not being watched by the guard service.", siteId);
                }
            }
            catch (Exception exception)
            {
                Log.Error(exception, "Exception while refreshing site {@id}", siteId);
            }
        }
        public void Insert_ingThreeSitesIntoTheBeachline_ShouldCreateFourArcsEachWithTheOthersSiteOnTheLeft
            (Beachline beachline, SiteEvent site1, SiteEvent site2, SiteEvent site3)
        {
            // Fixture setup

            // Exercise system
            beachline.Insert(site1);
            beachline.Insert(site2);
            beachline.Insert(site3);

            Debug.WriteLine(beachline);

            // Verify outcome
            var sites          = beachline.Select(arc => arc.Site).ToList();
            var leftNeighbours = beachline.Select(arc => arc.LeftNeighbour).ToList();

            leftNeighbours = leftNeighbours.Skip(1).Concat(leftNeighbours.Take(1)).ToList();

            var failureString = String.Format("Beachline was {0}", beachline);

            Assert.True(beachline.Count() == 4, failureString);
            Assert.True(sites.SequenceEqual(leftNeighbours), failureString);

            // Teardown
        }
        public void Insert_ingASiteIntoTheIntersectionBetweenTwoSites_ShouldCreateFourArcsEachWithTheOthersSiteOnTheLeft
            (Beachline beachline, SiteEvent leftSite, SiteEvent centralSite)
        {
            // Fixture setup
            var upperColatitude = leftSite.Position.SphericalCoordinates().Colatitude;
            var leftAzimuth     = leftSite.Position.SphericalCoordinates().Azimuth;
            var centralAzimuth  = centralSite.Position.SphericalCoordinates().Azimuth;
            var rightSite       = new SiteEvent(new SphericalCoords(upperColatitude, centralAzimuth + (centralAzimuth - leftAzimuth)).CartesianCoordinates());

            // Exercise system
            beachline.Insert(leftSite);
            beachline.Insert(rightSite);
            beachline.Insert(centralSite);

            // Verify outcome
            var sites          = beachline.Select(arc => arc.Site).ToList();
            var leftNeighbours = beachline.Select(arc => arc.LeftNeighbour).ToList();

            leftNeighbours = leftNeighbours.Skip(1).Concat(leftNeighbours.Take(1)).ToList();

            var failureString = String.Format("Beachline was {0}", beachline);

            Assert.True(beachline.Count() == 4, failureString);
            Assert.True(sites.SequenceEqual(leftNeighbours), failureString);

            // Teardown
        }
Esempio n. 4
0
        private async Task sendMessage(SiteEvent message)
        {
            await _guardHubContext.Clients.All.SendAsync("SiteStatusChanged", message);

            var db         = _mongoClient.GetDatabase("metis");
            var siteEvents = db.GetCollection <SiteEvent>("siteEvents");
            await siteEvents.InsertOneAsync(message);
        }
    private void Generate()
    {
        // We'll use a sweeping algorithm to calculate the vertices and edges
        // Start with a priority queue for our events, initially storing
        // all our site events (each cell) sorted by y-coord
        SortedSet <VoronoiEvent> events = new SortedSet <VoronoiEvent>(new VoronoiEventComparer());

        foreach (Cell cell in diagram.cells)
        {
            events.Add(new SiteEvent
            {
                site = cell
            });
        }

        float     sweep = ConfigurationManager.Instance.height;
        BeachTree beach = new BeachTree(ConfigurationManager.Instance.width, ConfigurationManager.Instance.height, diagram, events);

        while (events.Count > 0)
        {
            VoronoiEvent e = events.Min;
            events.Remove(e);

            sweep       = e.pos.y;
            beach.sweep = e.pos.y;

            if (e.GetType() == typeof(SiteEvent))
            {
                SiteEvent se = (SiteEvent)e;
                beach.Insert(se.site);
            }
            else
            {
                VertexEvent ve = (VertexEvent)e;
                beach.Remove(ve);
            }
        }
        beach.Finish();

        List <Edge> halves = diagram.edges.Where(e => e.section != null).ToList();

        foreach (Edge e in halves)
        {
            e.start.edges.Remove(e);
            e.start = e.section.end;
            e.section.left.edges.Remove(e.section);
            e.section.right.edges.Remove(e.section);
            e.section.end.edges.Remove(e.section);
            e.section.start.edges.Remove(e.section);
            diagram.edges.Remove(e.section);
        }

        FixDiagram();

        Debug.Log("Done");

        ConstructMap();
    }
Esempio n. 6
0
        public void AddToBeachLineTest_AddPointToNonExistantBeachLine_PointisnowBeachline()
        {
            var sut       = new SweepTable();
            var testevent = new SiteEvent(new VoronoiPoint(1, 1));

            sut.AddToBeachLine(testevent);
            Assert.AreSame(testevent, sut.BeachPoints.arcpoint);
            Assert.AreEqual(1, sut.BeachPoints.arcpoint.X);
        }
Esempio n. 7
0
        public void CheckCircleEventCheck_righthandcircle_returnsblankevent()
        {
            var pointa = new SiteEvent(new VoronoiPoint(10, 10));
            var pointb = new SiteEvent(new VoronoiPoint(20, 15));
            var pointc = new SiteEvent(new VoronoiPoint(15, 20));

            var sut         = new SweepTable();
            var circlecheck = sut.CalculateCircleEventCheck(pointa, pointb, pointc);

            Assert.IsFalse(circlecheck.isCircle);
        }
Esempio n. 8
0
        public void TestHandleSingleEvent()
        {
            var siteEvent = new SiteEvent
            {
                Point = new Point(4, 6)
            };

            var edge = _strategy.HandleEvent(siteEvent, _eventQueue, _beachLine);

            Assert.IsEmpty(edge);
        }
Esempio n. 9
0
        public void CheckCircleEventCheck_sitesdifferent_returnscircleincenter()
        {
            var pointa = new SiteEvent(new VoronoiPoint(10, 10));
            var pointb = new SiteEvent(new VoronoiPoint(20, 15));
            var pointc = new SiteEvent(new VoronoiPoint(15, 20));

            var sut         = new SweepTable();
            var circlecheck = sut.CalculateCircleEventCheck(pointc, pointb, pointa);

            Assert.AreEqual(14.1666, circlecheck.o.X, 0.0001);
            Assert.AreEqual(14.1666, circlecheck.o.Y, 0.0001);
            Assert.AreEqual(20.05922, circlecheck.x, 0.0001);
        }
Esempio n. 10
0
        internal static SiteEvent _CreateMessage(SiteStatusEventArgs args)
        {
            var message = new SiteEvent
            {
                SiteId         = args.Site.Id,
                Name           = args.Site.Name,
                CurrentStatus  = args.Site.Status.ToString(),
                PreviousStatus = args.PreviousStatus.ToString(),
                Message        = args.Reason,
                Happened       = DateTime.Now
            };

            return(message);
        }
Esempio n. 11
0
        public void SaveEvent(PostedEventModel postedEvent)
        {
            using (var db = new SitesEntities())
            {
                SiteEvent newEvent = new SiteEvent();
                newEvent.DateOfEvent      = postedEvent.DateOfEvent;
                newEvent.EventDescription = postedEvent.EventDescription;
                newEvent.SiteID           = postedEvent.SiteID;


                db.SiteEvents.Add(newEvent);
                db.SaveChanges();
            }
        }
Esempio n. 12
0
        internal static SiteEvent _CreateMessage(SiteExceptionEventArgs args)
        {
            var message = new SiteEvent
            {
                SiteId        = args.Site.Id,
                Name          = args.Site.Name,
                CurrentStatus = args.Site.Status.ToString(),
                PageTitle     = args.Page.Title,
                PageUri       = args.Page.Uri,
                Message       = args.Exception.Message,
                Happened      = DateTime.Now
            };

            return(message);
        }
        public void Insert_ingASingleSiteIntoTheBeachline_ShouldCreateOneArcWithTheSameSiteOnTheLeft
            (Beachline beachline, SiteEvent site)
        {
            // Fixture setup

            // Exercise system
            beachline.Insert(site);

            // Verify outcome
            var arc = beachline.First();

            var failureString = String.Format("Beachline was {0}", beachline);

            Assert.True(site == arc.Site, failureString);
            Assert.True(site == arc.LeftNeighbour, failureString);

            // Teardown
        }
Esempio n. 14
0
        private async Task siteException(Site site, Page page, Exception exception)
        {
            Log.Error(exception, "Exception while watching site {@name} {@id} page {@title} {@uri}",
                      site.Name, site.Id, page.Title, page.Uri);

            var message = new SiteEvent
            {
                SiteId        = site.Id,
                Name          = site.Name,
                CurrentStatus = site.Status.ToString(),
                PageTitle     = page.Title,
                PageUri       = page.Uri,
                Message       = exception.Message,
                Happened      = DateTime.Now
            };

            await _guardHubContext.Clients.All.SendAsync("SiteGuardingException", message);

            await _siteEvents.InsertOneAsync(message);
        }
Esempio n. 15
0
        public void TestHandleTwoEvents()
        {
            var siteEvents = new SiteEvent[] {
                new SiteEvent
                {
                    Point = new Point(4, 6)
                },
                new SiteEvent
                {
                    Point = new Point(6, 4)
                }
            };

            _strategy.HandleEvent(siteEvents[0], _eventQueue, _beachLine);
            var edges = _strategy.HandleEvent(siteEvents[1], _eventQueue, _beachLine).Cast <HalfEdge>().ToList();

            Assert.IsNotNull(edges);
            Assert.AreEqual(siteEvents[0].Point, edges[0].Left);
            Assert.AreEqual(siteEvents[1].Point, edges[0].Right);
        }
        public void Insert_ingTwoSitesIntoTheBeachline_ShouldCreateTwoArcsEachWithTheOthersSiteOnTheLeft
            (Beachline beachline, SiteEvent site1, SiteEvent site2)
        {
            // Fixture setup

            // Exercise system
            beachline.Insert(site1);
            beachline.Insert(site2);

            // Verify outcome
            var arc1 = beachline.First();
            var arc2 = beachline.Last();

            var failureString = String.Format("Beachline was {0}", beachline);

            Assert.True(beachline.Count() == 2);
            Assert.True(arc1.Site == arc2.LeftNeighbour, failureString);
            Assert.True(arc2.Site == arc1.LeftNeighbour, failureString);

            // Teardown
        }
Esempio n. 17
0
        public async Task StartMaintenance(string siteId)
        {
            try
            {
                var site = await getSite(siteId);

                if (site != null)
                {
                    var previousSiteStatus = site.Status;
                    foreach (var page in site.Pages)
                    {
                        page.MD5Hash = string.Empty;
                        page.Status  = Status.Maintenance;
                    }
                    site.Status = Status.Maintenance;

                    await updateSite(site);

                    var message = new SiteEvent
                    {
                        SiteId         = site.Id,
                        Name           = site.Name,
                        CurrentStatus  = site.Status.ToString(),
                        PreviousStatus = previousSiteStatus.ToString(),
                        Message        = $"Start maintenance for Site {site.Name} has been requested",
                        Happened       = DateTime.Now
                    };

                    await sendMessage(message);
                }
                else
                {
                    Log.Error("This site {@id} is not being watched by the guard service.", siteId);
                }
            }
            catch (Exception exception)
            {
                Log.Error(exception, "Exception while starting maintenance for site {@id}", siteId);
            }
        }
        public void Insert_ingThreeSitesIntoTheBeachline_ShouldInsertTwoItemsIntoThePotentialCircleEventsList
            (Beachline beachline, SiteEvent site1, SiteEvent site2, SiteEvent site3)
        {
            // Fixture setup

            // Exercise system
            beachline.Insert(site1);
            beachline.Insert(site2);
            beachline.Insert(site3);

            // Verify outcome
            var result = beachline.PotentialCircleEvents.Count;

            var failureString =
                String.Format("Beachline was {0}\n" +
                              "Modified arcs list was {1}",
                              beachline,
                              Utilities.ToString(beachline.PotentialCircleEvents));

            Assert.True(result == 2, failureString);

            // Teardown
        }
        public void Remov_ingAZeroLengthArc_ShouldLeaveThreeArcsEachWithTheOthersSiteOnTheLeft
            (Beachline beachline, SiteEvent leftSite, SiteEvent centralSite)
        {
            // Fixture setup
            var upperColatitude = leftSite.Position.SphericalCoordinates().Colatitude;
            var leftAzimuth     = leftSite.Position.SphericalCoordinates().Azimuth;
            var centralAzimuth  = centralSite.Position.SphericalCoordinates().Azimuth;
            var rightSite       = new SiteEvent(new SphericalCoords(upperColatitude, centralAzimuth + (centralAzimuth - leftAzimuth)).CartesianCoordinates());

            beachline.Insert(leftSite);
            beachline.Insert(rightSite);
            beachline.Insert(centralSite);

            var arcThatWasSplit = beachline.Where(arc1 => beachline.Count(arc2 => arc1.Site == arc2.Site) > 1);
            var arcToBeRemoved  = arcThatWasSplit.First(arc => arc.Site.Position.Z > beachline.Sweepline.Z);

            // Exercise system
            Debug.WriteLine(beachline);
            Debug.WriteLine(arcToBeRemoved);
            beachline.Remove(arcToBeRemoved);

            Debug.WriteLine(beachline);

            // Verify outcome
            var sites          = beachline.Select(arc => arc.Site).ToList();
            var leftNeighbours = beachline.Select(arc => arc.LeftNeighbour).ToList();

            leftNeighbours = leftNeighbours.Skip(1).Concat(leftNeighbours.Take(1)).ToList();

            var failureString = String.Format("Beachline was {0}", beachline);

            Assert.True(beachline.Count() == 3, failureString);
            Assert.True(sites.SequenceEqual(leftNeighbours), failureString);

            // Teardown
        }
Esempio n. 20
0
    public DoublyConnectedEdgeList GetVoronoiDiagram()
    {
        //input
        float [,] input = new float[, ] {
            { 20, 80 }, { 40, 60 }, { 20, 30 }, { 70, 70 }, { 60, 50 }
        };

        DoublyConnectedEdgeList dcel = new DoublyConnectedEdgeList(0, 0, 100, 100);


        SiteEvent siteEvent;
        Face      face;

        //20,30
        siteEvent      = new SiteEvent(20, 20);
        face           = new Face(siteEvent);
        siteEvent.face = face;
        dcel.faceList.Add(face);

        face.AddEdge(new Edge(new Vertex(50, 0)));
        face.AddEdge(new Edge(new Vertex(48, 15)));
        face.AddEdge(new Edge(new Vertex(15, 45)));
        face.AddEdge(new Edge(new Vertex(0, 45)));
        face.AddEdge(new Edge(new Vertex(0, 0)));

        //70,30
        siteEvent      = new SiteEvent(70, 30);
        face           = new Face(siteEvent);
        siteEvent.face = face;
        dcel.faceList.Add(face);

        face.AddEdge(new Edge(new Vertex(50, 0)));
        face.AddEdge(new Edge(new Vertex(100, 0)));
        face.AddEdge(new Edge(new Vertex(100, 58)));
        face.AddEdge(new Edge(new Vertex(55, 35)));
        face.AddEdge(new Edge(new Vertex(48, 15)));

        //40,60
        siteEvent      = new SiteEvent(40, 40);
        face           = new Face(siteEvent);
        siteEvent.face = face;
        dcel.faceList.Add(face);

        face.AddEdge(new Edge(new Vertex(48, 15)));
        face.AddEdge(new Edge(new Vertex(55, 35)));
        face.AddEdge(new Edge(new Vertex(43, 65)));
        face.AddEdge(new Edge(new Vertex(15, 45)));

        //60,50
        siteEvent      = new SiteEvent(60, 50);
        face           = new Face(siteEvent);
        siteEvent.face = face;
        dcel.faceList.Add(face);

        face.AddEdge(new Edge(new Vertex(55, 35)));
        face.AddEdge(new Edge(new Vertex(100, 58)));
        face.AddEdge(new Edge(new Vertex(100, 100)));
        face.AddEdge(new Edge(new Vertex(50, 100)));
        face.AddEdge(new Edge(new Vertex(43, 65)));

        //20,70
        siteEvent      = new SiteEvent(20, 70);
        face           = new Face(siteEvent);
        siteEvent.face = face;
        dcel.faceList.Add(face);

        face.AddEdge(new Edge(new Vertex(0, 45)));
        face.AddEdge(new Edge(new Vertex(15, 45)));
        face.AddEdge(new Edge(new Vertex(43, 65)));
        face.AddEdge(new Edge(new Vertex(50, 100)));
        face.AddEdge(new Edge(new Vertex(0, 100)));

        return(dcel);
    }
    private IEnumerator GenerateVisualized()
    {
        // We'll use a sweeping algorithm to calculate the vertices and edges
        // Start with a priority queue for our events, initially storing
        // all our site events (each cell) sorted by y-coord
        SortedSet <VoronoiEvent> events = new SortedSet <VoronoiEvent>(new VoronoiEventComparer());

        foreach (Cell cell in diagram.cells)
        {
            events.Add(new SiteEvent
            {
                site = cell
            });
        }

        float     sweep = ConfigurationManager.Instance.height;
        BeachTree beach = new BeachTree(ConfigurationManager.Instance.width, ConfigurationManager.Instance.height, diagram, events);


        GameObject        sweepObj    = Instantiate(sweepPrefab, lineRenderersContainer);
        LineRenderer      sweepRend   = sweepObj.GetComponentInChildren <LineRenderer>();
        GameObject        eventObj    = Instantiate(eventPrefab, verticesContainer);
        List <GameObject> beachObjs   = new List <GameObject>();
        List <GameObject> diagramObjs = new List <GameObject>();

        foreach (Cell cell in diagram.cells)
        {
            GameObject cellGObject = Instantiate(cellPrefab, cellsContainer);
            cellGObject.transform.localPosition = cell.pos;
            cellGObject.transform.GetComponentInChildren <TextMeshPro>().text = cell.name;
            // TODO implement CellController and initialize it
        }

        //MakeBeach(beachObjs, beach.GetPoints(sweep));

        sweepRend.SetPositions(new Vector3[] { new Vector2(0, sweep), new Vector2(ConfigurationManager.Instance.width, sweep) });
        yield return(new WaitForSeconds(0.05f));

        while (events.Count > 0)
        {
            VoronoiEvent e = events.Min;
            events.Remove(e);
            eventObj.transform.localPosition = e.pos;
            while (sweep - 0.1f > e.pos.y)
            {
                sweep       = sweep - 0.1f;
                beach.sweep = sweep;

                sweepRend.SetPositions(new Vector3[] { new Vector2(0, sweep), new Vector2(ConfigurationManager.Instance.width, sweep) });
                MakeVoronoi(diagramObjs);
                MakeBeach(beachObjs, beach.GetBeachPoints());
                yield return(new WaitForSeconds(0.1f));
            }
            sweep       = e.pos.y;
            beach.sweep = e.pos.y;

            sweepRend.SetPositions(new Vector3[] { new Vector2(0, sweep), new Vector2(ConfigurationManager.Instance.width, sweep) });
            MakeVoronoi(diagramObjs);
            MakeBeach(beachObjs, beach.GetBeachPoints());
            yield return(new WaitForSeconds(0.1f));

            if (e.GetType() == typeof(SiteEvent))
            {
                SiteEvent se = (SiteEvent)e;
                beach.Insert(se.site);
            }
            else
            {
                VertexEvent ve = (VertexEvent)e;
                beach.Remove(ve);
            }
            MakeVoronoi(diagramObjs);
            MakeBeach(beachObjs, beach.GetBeachPoints());
            yield return(new WaitForSeconds(0.1f));
        }
        Debug.Log("Finished Events");
        beach.Finish();

        List <Edge> halves = diagram.edges.Where(e => e.section != null).ToList();

        foreach (Edge e in halves)
        {
            e.start.edges.Remove(e);
            e.start = e.section.end;
            e.section.left.edges.Remove(e.section);
            e.section.right.edges.Remove(e.section);
            e.section.end.edges.Remove(e.section);
            e.section.start.edges.Remove(e.section);
            diagram.edges.Remove(e.section);
        }

        FixDiagram();

        while (beachObjs.Count > 0)
        {
            Destroy(beachObjs[0]);
            beachObjs.RemoveAt(0);
        }
        while (diagramObjs.Count > 0)
        {
            Destroy(diagramObjs[0]);
            diagramObjs.RemoveAt(0);
        }
        // Construct current map
        ConstructMap();
    }
 public override void SetCurrentEvent(SiteEvent e)
 {
     currentEvent = e;
 }
Esempio n. 23
0
        public void Create(SiteEvent siteEvent)

        {
            db.SiteEvent.Add(siteEvent);
        }
Esempio n. 24
0
        public void Update(SiteEvent siteEvent)

        {
            db.Entry(siteEvent).State = EntityState.Modified;
        }
 public virtual void SetCurrentEvent(SiteEvent e)
 {
     currentEvent = e;
 }
 public WebSiteStateMachine()
 {
     currentSiteState = SiteState.NULL;
     currentEvent     = SiteEvent.NULL;
 }
Esempio n. 27
0
    public List <BeachLineEdge> DoVoronoi(List <VoronoiSite> siteList)
    {
        List <BeachLineEdge> outEdges = new List <BeachLineEdge>();

        beachLine = new BeachLine();
        events    = new List <VoronoiEvent>();

        // Add site list to event list.
        foreach (VoronoiSite site in siteList)
        {
            events.Add(new SiteEvent(site));
        }

        // Sort site list.
        events.Sort();

        // Test for first two events being very close in y
        if (events.Count >= 2)
        {
            if (events[0].y - events[1].y < 0.01f)
            {
                // Add another site events far above them to prevent this from happening
                events.Insert(0, new SiteEvent(new VoronoiSite(new Vector2(0, -10))));
            }
        }

        // Start processing events
        int iterations = 0;

        while (events.Count != 0)
        {
            if (use_max_iterations && iterations == max_iterations)
            {
                break;
            }
            else
            {
                iterations++;
            }

            // Pop event off front of list
            VoronoiEvent thisEvent = events[0];


            // Set sweepline
            sweepLine = thisEvent.y;

            if (sweepLine >= target_sweepline)
            {
                sweepLine = target_sweepline;
                beachLine.Update(sweepLine);
                break;
            }

            beachLine.Update(sweepLine);

            if (thisEvent.IsValid())
            {
                // Check event type
                if (thisEvent is SiteEvent)
                {
                    SiteEvent siteEvent = (SiteEvent)thisEvent;

                    // Create a new arc for this event.
                    BeachLineArc newArc = new BeachLineArc(siteEvent.Site.Point, sweepLine);

                    // Find arc at this site
                    BeachLineArc arcToSplit = beachLine.SearchX(siteEvent.x);
                    if (arcToSplit == null)
                    {
                        // We could not find an arc, meaning this is the first one.
                        // Lets just add it to the beachline as root.
                        beachLine.SetRoot(newArc);
                    }
                    else
                    {
                        // Split the arc
                        arcToSplit.Split(newArc);

                        // The split will have added newArc to the tree and also created two new edges.
                        // We need to check those for intersections.
                        List <BeachLineArc> arcsToSqueeze = new List <BeachLineArc> {
                            newArc.LeftArc, newArc.RightArc
                        };
                        foreach (BeachLineArc arc in arcsToSqueeze)
                        {
                            CheckForNewEdgeEvents(arc);
                        }
                    }
                }
                else if (thisEvent is EdgeEvent)
                {
                    EdgeEvent edgeEvent = (EdgeEvent)thisEvent;

                    if (edgeEvent.SqueezedArc != null)
                    {
                        if (edgeEvent.SqueezedArc.LeftEdge != null && edgeEvent.SqueezedArc.RightEdge != null)
                        {
                            BeachLineEdge        newEdge;
                            List <BeachLineEdge> outputEdges = edgeEvent.SqueezedArc.Squeeze(out newEdge);

                            // Add edges to output
                            foreach (BeachLineEdge edge in outputEdges)
                            {
                                outEdges.Add(edge);
                            }

                            // Squeeze function will have removed arc and edges from tree and created a new edge.
                            // We need to check that edge for any new intersections.
                            CheckForNewEdgeEvents(newEdge.LeftArc);
                            CheckForNewEdgeEvents(newEdge.RightArc);
                        }
                    }
                    // Otherwise, this must have been pre-empted but not invalidated for some reason
                }
                else
                {
                    Debug.LogError("Wrong event type! Should not happen!");
                }
            }
            events.RemoveAt(0);
        }
        if (iterations != max_iterations)
        {
            sweepLine = target_sweepline;
            beachLine.Update(sweepLine);
        }

        if (events.Count == 0)
        {
            // We completed the events list.
            // Add the remaining edges to the output.
            BeachLineElement node = beachLine.GetRoot();
            if (node != null)
            {
                // Mode node to start
                while (node.Prev != null)
                {
                    node = node.Prev;
                }
                // Add all remaining edges
                while (node.Next != null)
                {
                    if (node is BeachLineEdge)
                    {
                        outEdges.Add(node as BeachLineEdge);
                    }
                    node = node.Next;
                }
            }
        }

        return(outEdges);
    }
Esempio n. 28
0
 protected virtual void OnSiteEvent(RaiseEventEventArgs e)
 => SiteEvent?.Invoke(this, e);
Esempio n. 29
0
        private async Task statusChanged(Site site, Page page, string html, Status newStatus)
        {
            var previousSiteStatus = site.Status;
            var previousPageStatus = page.Status;

            page.Status = newStatus;

            // calculate overall site status
            string reason = string.Empty;

            if (page.Status == Status.Alarm || page.Status == Status.NotFound)
            {
                site.Status = Status.Alarm;
                reason      = $"Page {page.Title} {page.Uri} content has been changed";
            }
            else if (page.Status == Status.Maintenance)
            {
                site.Status = Status.Maintenance;
                reason      = $"Page {page.Title} {page.Uri} has gone to maintenance";
            }
            else
            {
                if (site.Pages.ToList().All(p => p.Status == Status.Ok))
                {
                    site.Status = Status.Ok;
                }
                reason = $"Page {page.Title} {page.Uri} status is now {page.Status.ToString()}";
            }

            Log.Information("Status changed for site {@name} {@id} from {@previous} to {@status}",
                            site.Name, site.Id, previousSiteStatus, site.Status);

            // update the page content changes to the database
            await updateSitePageContent(site, page, html);

            // update the page status change to the database
            await updateSitePage(site.Id, page);

            // update the status of the site
            await updateSiteStatus(site);

            var message = new SiteEvent
            {
                SiteId         = site.Id,
                Name           = site.Name,
                CurrentStatus  = site.Status.ToString(),
                PreviousStatus = previousSiteStatus.ToString(),
                Message        = reason,
                Happened       = DateTime.Now
            };

            await _guardHubContext.Clients.All.SendAsync("SiteStatusChanged", message);

            await _siteEvents.InsertOneAsync(message);

            if (site.Status != previousSiteStatus)
            {
                _emailService.Send(new EmailMessage()
                {
                    Content     = $"Status changed for site {site.Name} {site.Id} from {previousSiteStatus} to {site.Status}",
                    FromAddress = new EmailAddress("metis", "*****@*****.**"),
                    ToAddresses = site.EmailAddresses,
                    Subject     = "Κατάσταση Ιστοσελίδας"
                });
            }
        }