Beispiel #1
0
 /// <summary>
 /// Gets the bullet content in the text.
 /// </summary>
 /// <param name="product">The product.</param>
 /// <returns>IEnumerable&lt;System.String&gt;.</returns>
 public static IEnumerable <string> GetBullets(this TextProduct product)
 {
     return(BulletsRegex
            .Matches(product.Content.RawBody)
            .Cast <Match>()
            .Select(x => x.Groups["bullet"].Value));
 }
Beispiel #2
0
 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()));
     }
 }
Beispiel #3
0
        /// <summary>
        /// Parses the product and returns a set of latitude/longitude points.
        /// </summary>
        /// <param name="product">The product.</param>
        /// <returns>IEnumerable&lt;Location[]&gt;.</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&lt;TrackingLine&gt;.</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));
        }
Beispiel #7
0
        /// <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&lt;XmlProduct&gt;.</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);
        }
Beispiel #10
0
        /// <summary>
        /// Gets the segments in the text product.
        /// </summary>
        /// <param name="product">The product.</param>
        /// <returns>IEnumerable&lt;TextProductSegment&gt;.</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;
Beispiel #15
0
 /// <summary>
 /// Parses the content and returns any Primary VTEC items contained.
 /// </summary>
 /// <param name="product">The product.</param>
 /// <returns>IEnumerable&lt;ValidTimeEventCode&gt;.</returns>
 public static IEnumerable <PrimaryVtec> GetPrimaryVtec(this TextProduct product)
 => PvtecRegex.Matches(product.Content.RawBody).Cast <Match>().Select(CreatePrimaryVtec);
Beispiel #16
0
 /// <summary>
 /// Parses the content and returns any Hydrologic VTEC items contained.
 /// </summary>
 /// <param name="product">The product.</param>
 /// <returns>System.Collections.Generic.IEnumerable&lt;Emwin.Core.Contracts.HydrologicVtec&gt;.</returns>
 public static IEnumerable <HydrologicVtec> GetHydrologicVtec(this TextProduct product)
 => HvtecRegex.Matches(product.Content.RawBody).Cast <Match>().Select(CreateHydrologicVtec);