public async Task <IEnumerable <INotification> > CreateDigitizedEvent(RouteSegment routeSegment) { if (routeSegment is null) { throw new ArgumentNullException($"Parameter {nameof(routeSegment)} must not be null"); } if (IsCreatedByApplication(routeSegment)) { return(new List <INotification>()); } // Update integrator "shadow table" with the used digitized segment await _geoDatabase.InsertRouteSegmentShadowTable(routeSegment); if (!_routeSegmentValidator.LineIsValid(routeSegment.GetLineString())) { return new List <INotification> { new InvalidRouteSegmentOperation { RouteSegment = routeSegment } } } ; var intersectingStartNodes = await _geoDatabase.GetIntersectingStartRouteNodes(routeSegment); var intersectingEndNodes = await _geoDatabase.GetIntersectingEndRouteNodes(routeSegment); var intersectingStartSegments = await _geoDatabase.GetIntersectingStartRouteSegments(routeSegment); var intersectingEndSegments = await _geoDatabase.GetIntersectingEndRouteSegments(routeSegment); var allIntersectingRouteNodesNoEdges = await _geoDatabase.GetAllIntersectingRouteNodesNotIncludingEdges(routeSegment); if (intersectingStartNodes.Count >= 2 || intersectingEndNodes.Count >= 2) { return new List <INotification> { new InvalidRouteSegmentOperation { RouteSegment = routeSegment } } } ; var notifications = new List <INotification>(); notifications.AddRange(HandleExistingRouteSegmentSplitted(intersectingStartSegments.Count, intersectingStartNodes.Count, routeSegment.FindStartPoint(), routeSegment)); notifications.AddRange(HandleExistingRouteSegmentSplitted(intersectingEndSegments.Count, intersectingEndNodes.Count, routeSegment.FindEndPoint(), routeSegment)); notifications.Add(CreateNewRouteSegmentDigitized(routeSegment)); if (allIntersectingRouteNodesNoEdges.Count > 0) { foreach (var intersectingRouteNode in allIntersectingRouteNodesNoEdges) { var routeSegmentSplitted = CreateExistingRouteSegmentSplitted(null, intersectingRouteNode, false); notifications.Add(routeSegmentSplitted); } } return(notifications); }