/// <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 }
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(); }
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); }
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); }
public void TestHandleSingleEvent() { var siteEvent = new SiteEvent { Point = new Point(4, 6) }; var edge = _strategy.HandleEvent(siteEvent, _eventQueue, _beachLine); Assert.IsEmpty(edge); }
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); }
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); }
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(); } }
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 }
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); }
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 }
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 }
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; }
public void Create(SiteEvent siteEvent) { db.SiteEvent.Add(siteEvent); }
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; }
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); }
protected virtual void OnSiteEvent(RaiseEventEventArgs e) => SiteEvent?.Invoke(this, e);
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 = "Κατάσταση Ιστοσελίδας" }); } }