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); }
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); }
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)); }