public static bool TryParse(Queue <Token> unProcessedTokens, out TzDbZoneDescription zoneDescription)
        {
            // the value of the first token of every zone description entry is an iso 3166-2 character code
            const String zoneDescriptionRegex = "^[A-Z]{2}$";
            Token        token = unProcessedTokens.Peek();

            if (token.TokenType == TokenType.Stringliteral && Regex.IsMatch(token.Value, zoneDescriptionRegex))
            {
                string         countryCode = unProcessedTokens.Dequeue().Value;
                GeographyPoint coordinates = GeographyPointExpression.Parse(unProcessedTokens);

                string tz = unProcessedTokens.Dequeue().Value;
                String comments;
                if (!TryParseComments(unProcessedTokens, out comments))
                {
                    throw new Exception("Unable to parse zone description comments expression");
                }

                zoneDescription = new TzDbZoneDescription(countryCode, coordinates, tz, comments);

                Token endLineToken = unProcessedTokens.Dequeue();
                // guard end of line token was present
                if (endLineToken.TokenType != TokenType.EndLine)
                {
                    string msg = String.Format(
                        "received unexpected token type:{0} when token type should have been {1}",
                        endLineToken.TokenType, TokenType.EndLine);
                    throw new Exception(msg);
                }
                return(true);
            }
            zoneDescription = null;
            return(false);
        }
Exemplo n.º 2
0
        private TzDbZoneDescription FindTzDbZoneDescription(TzDbZoneDefinition tzDbZoneDefinition,
                                                            IEnumerable <TzDbZoneDescription> tzDbZoneDescriptions, IEnumerable <TimeZoneAlias> aliases)
        {
            TzDbZoneDescription description =
                tzDbZoneDescriptions.SingleOrDefault(
                    tzDbZoneDescription => tzDbZoneDescription.Tz == tzDbZoneDefinition.Zone.Name);

            if (null == description)
            {
                tzDbZoneDescriptions.SingleOrDefault(
                    tzDbZoneDescription => aliases.Any(alias => alias.Name == tzDbZoneDescription.Tz));
            }

            return(description);
        }
Exemplo n.º 3
0
        public ITransformerDatabaseReader Transform()
        {
            IExtractorDatabaseReader extractorDatabaseReader = _tzDbExtractor.Extract();

            // start with a clean slate (in case this is an update rather than an initial extraction)
            _transformerDatabase.DropAndReCreate();

            // group the rules by name
            IEnumerable <IGrouping <string, TzDbRule> > tzDbRuleGroups =
                extractorDatabaseReader.TzDbRules.GroupBy(tzDbRule => tzDbRule.Name);


            foreach (TzDbZoneDefinition tzDbZoneDefinition in extractorDatabaseReader.TzDbZoneDefinitions)
            {
                Guid timeZoneId = Guid.NewGuid();
                IEnumerable <TimeZoneImplementation> timeZoneImplementations = GetTimeZoneImplementations(timeZoneId,
                                                                                                          tzDbZoneDefinition, tzDbRuleGroups);
                IEnumerable <TimeZoneAlias> aliases = FindTimeZoneAliases(tzDbZoneDefinition,
                                                                          extractorDatabaseReader.TzDbLinks);
                TzDbZoneDescription description = FindTzDbZoneDescription(tzDbZoneDefinition,
                                                                          extractorDatabaseReader.TzDbZoneDescriptions, aliases);

                if (null != description)
                {
                    // create a DbTimeZone from this ZoneDefinition
                    _transformerDatabase.TimeZones.Add(tzDbZoneDefinition.ToTimeZone(timeZoneId, description.Coordinates,
                                                                                     description.CountryCode, aliases, timeZoneImplementations));
                    continue;
                }

                // create a DbTimeZone from this ZoneDefinition
                _transformerDatabase.TimeZones.Add(tzDbZoneDefinition.ToTimeZone(timeZoneId, null, null, aliases,
                                                                                 timeZoneImplementations));
            }

            return(new TransformerDatabaseReader(_transformerDatabase));
        }