/// <summary> /// Gets the bullet content in the text. /// </summary> /// <param name="product">The product.</param> /// <returns>IEnumerable<System.String>.</returns> public static IEnumerable <string> GetBullets(this TextProduct product) { return(BulletsRegex .Matches(product.Content.RawBody) .Cast <Match>() .Select(x => x.Groups["bullet"].Value)); }
private void PrepareReadable() { foreach (var body in Body) { TextProduct.Add(body.Key, "[" + string.Join("<--DO_NOT_TOUCH!-->", body.Value.Pieces) + "]"); ArgsProduct.Add(body.Key, string.Join("-", body.Value.Arguments.Select(arg => arg.ToString()).ToList())); } }
/// <summary> /// Parses the product and returns a set of latitude/longitude points. /// </summary> /// <param name="product">The product.</param> /// <returns>IEnumerable<Location[]>.</returns> public static IEnumerable <GeoPoint[]> GetPolygons(this TextProduct product) { var polygonMatches = PolygonRegex.Matches(product.Content.RawBody); foreach (var match in polygonMatches.Cast <Match>().Select(x => x.Groups["points"].Captures.Cast <Capture>())) { var result = match.Select(m => new GeoPoint(m.Value)).ToList(); result.Add(result.First()); yield return(result.ToArray()); } }
public static IDictionary <string, UniversalGeoCode> GetGeoCodes(this TextProduct product) => UgcRegex.Matches(product.Content.RawBody) .Cast <Match>() .SelectMany(ugcMatch => ParseUgcGroups(ugcMatch.Value, product.TimeStamp)) .GroupBy(x => x.State) .ToDictionary(k => k.Key, st => new UniversalGeoCode { State = st.Key, PurgeTime = st.First().PurgeTime, Zones = new HashSet <int>(st.Where(x => x.Type == 'Z').Select(z => z.Value)), Counties = new HashSet <int>(st.Where(x => x.Type == 'C').Select(z => z.Value)) });
/// <summary> /// Parses the product and returns a set of latitude/longitude points. /// </summary> /// <param name="product">The product.</param> /// <returns>IEnumerable<TrackingLine>.</returns> public static IEnumerable <TrackingLine> GetTrackingLines(this TextProduct product) { var matches = TimeMotLocRegex.Matches(product.Content.RawBody); return(matches.Cast <Match>().Select(match => new TrackingLine { TimeStamp = TimeParser.ParseHourMinute(product.TimeStamp, match.Groups["time"].Value), DirectionDeg = int.Parse(match.Groups["mot"].Value), WindSpeedKts = int.Parse(match.Groups["wind"].Value), Line = match.Groups["points"].Captures.Cast <Capture>().Select(ToLocation).ToList() })); }
/// <summary> /// Combines segments into text product. /// </summary> /// <param name="segments">The segments.</param> /// <returns>TextProduct.</returns> /// <exception cref="System.ArgumentNullException"></exception> public static TextProduct AsTextProduct(this QuickBlockTransferSegment[] segments) { if (segments == null) { throw new ArgumentNullException(nameof(segments)); } var lastSegment = segments[segments.Length - 1]; var content = segments.Select(b => b.Content).ToList().Combine(true); return(TextProduct.Create(lastSegment.Filename, lastSegment.TimeStamp, content, lastSegment.ReceivedAt, lastSegment.Source)); }
/// <summary> /// Gets the wmo header. /// </summary> /// <param name="textProduct">The text product.</param> /// <returns>WmoHeader.</returns> public static WmoHeader GetWmoHeader(this TextProduct textProduct) { var match = HeaderBlockRegex.Match(textProduct.Content.RawHeader); if (!match.Success) { return(new WmoHeader()); } return(new WmoHeader { DataType = match.Groups["dtl"].Value.Substring(0, 2), Distribution = match.Groups["dtl"].Value.Substring(2), WmoId = match.Groups["station"].Value, IssuedAt = TimeParser.ParseDayHourMinute(textProduct.TimeStamp, match.Groups["time"].Value), Designator = match.Groups["indicator"].Success ? match.Groups["indicator"].Value : string.Empty, ProductCategory = match.Groups["afos"].Success ? match.Groups["afos"].Value.Substring(0, 3) : string.Empty, LocationIdentifier = match.Groups["afos"].Success ? match.Groups["afos"].Value.Substring(3).TrimEnd() : string.Empty }); }
private static void UnZip(CompressedProduct product, IEventPublisher ctx) { using (var zip = new ZipArchive(product.GetStream(), ZipArchiveMode.Read)) { foreach (var file in zip.Entries) { using (var fileStream = file.Open()) { var fileName = file.Name.ToUpperInvariant(); var contentType = ContentTypeParser.GetFileContentType(fileName); switch (contentType) { case ContentFileType.Text: using (var text = new StreamReader(fileStream)) { var textProduct = TextProduct.Create(fileName, file.LastWriteTime, text.ReadToEnd(), product.ReceivedAt, product.Source); ctx.SendMessage(textProduct); ProcessorEventSource.Log.Info(nameof(ZipExtractor), textProduct.ToString()); } break; case ContentFileType.Image: var imageProduct = ImageProduct.Create( fileName, file.LastWriteTime, ReadAllBytes(fileStream), product.ReceivedAt, product.Source); ctx.SendMessage(imageProduct); ProcessorEventSource.Log.Info(nameof(ZipExtractor), imageProduct.ToString()); break; // There are no zips within zips :-) default: ProcessorEventSource.Log.Warning(nameof(ZipExtractor), "Unknown content file type: " + file.Name); return; } } } } }
/// <summary> /// Parses the product for Xml Documents (multiple XML documents can be in a single product). /// </summary> /// <param name="product">The product.</param> /// <returns>IEnumerable<XmlProduct>.</returns> public static IEnumerable <XmlProduct> GetXmlProducts(this TextProduct product) { var startAt = 0; var seq = 1; var body = product.Content.RawBody; do { startAt = body.IndexOf(XmlHeader, startAt, StringComparison.Ordinal); if (startAt == -1) { yield break; } var endAt = body.IndexOf(XmlHeader, startAt + XmlHeader.Length, StringComparison.Ordinal); if (endAt == -1) { endAt = body.Length; } var xml = body.Substring(startAt, endAt - startAt).TrimEnd(); var newFilename = string.Concat( Path.GetFileNameWithoutExtension(product.Filename), '-', seq.ToString("00"), ".XML"); yield return(XmlProduct.Create( newFilename, product.TimeStamp, new TextContent { RawHeader = product.Content.RawHeader, RawBody = xml }, product.ReceivedAt, seq++, product.Source)); startAt = endAt; } while (startAt < body.Length); }
/// <summary> /// Gets the segments in the text product. /// </summary> /// <param name="product">The product.</param> /// <returns>IEnumerable<TextProductSegment>.</returns> public static IEnumerable <TextProductSegment> GetSegments(this TextProduct product) { var matches = SegmentSplitRegex.Split(product.Content.RawBody); var seq = 1; foreach (var segment in matches) { var newFilename = string.Concat( Path.GetFileNameWithoutExtension(product.Filename), '-', seq.ToString("00"), Path.GetExtension(product.Filename)); yield return(TextProductSegment.Create( newFilename, product.TimeStamp, new TextContent { RawHeader = product.Content.RawHeader, RawBody = segment.Trim() }, product.ReceivedAt, seq++, product.Source)); } }
private static TextProduct GetFloodWarning() => TextProduct.Create( "FLWOAXXXXX.TXT", new DateTimeOffset(2015, 6, 5, 23, 45, 0, TimeSpan.Zero), Encoding.ASCII.GetBytes(WarningProducts.FloodWarning), DateTimeOffset.UtcNow, string.Empty);
private static TextProduct GetTornadoWarning() => TextProduct.Create( "TORDDCXXXX.TXT", new DateTimeOffset(2015, 6, 5, 0, 56, 0, TimeSpan.Zero), Encoding.ASCII.GetBytes(WarningProducts.TornadoWarning), DateTimeOffset.UtcNow, string.Empty);
/// <summary> /// Gets the signature. /// </summary> /// <param name="textProduct">The text product.</param> /// <returns>System.String (empty string if none found).</returns> public static string GetSignature(this TextProduct textProduct) => textProduct?.GetSegments().LastOrDefault()?.Content.GetBodyText() ?? string.Empty;
/// <summary> /// Determines whether the specified text product is resent. /// </summary> /// <param name="textProduct">The text product.</param> /// <returns><c>true</c> if the specified text product is resent; otherwise, <c>false</c>.</returns> public static bool IsResent(this TextProduct textProduct) => textProduct?.Content?.RawBody.Contains("...RESENT") ?? false;
/// <summary> /// Parses the content and returns any Primary VTEC items contained. /// </summary> /// <param name="product">The product.</param> /// <returns>IEnumerable<ValidTimeEventCode>.</returns> public static IEnumerable <PrimaryVtec> GetPrimaryVtec(this TextProduct product) => PvtecRegex.Matches(product.Content.RawBody).Cast <Match>().Select(CreatePrimaryVtec);
/// <summary> /// Parses the content and returns any Hydrologic VTEC items contained. /// </summary> /// <param name="product">The product.</param> /// <returns>System.Collections.Generic.IEnumerable<Emwin.Core.Contracts.HydrologicVtec>.</returns> public static IEnumerable <HydrologicVtec> GetHydrologicVtec(this TextProduct product) => HvtecRegex.Matches(product.Content.RawBody).Cast <Match>().Select(CreateHydrologicVtec);