Ejemplo n.º 1
0
        public static bool TryParse(Queue <Token> unProcessedTokens,
                                    out AbstractDayOfMonthSpecification dayOfMonthSpecification)
        {
            if (TryGetDayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(unProcessedTokens,
                                                                           out dayOfMonthSpecification))
            {
                return(true);
            }
            if (TryGetDayOfWeekLessThanOrEqualToDayOfMonthSpecification(unProcessedTokens,
                                                                        out dayOfMonthSpecification))
            {
                return(true);
            }
            if (TryGetExplicitDayOfMonthSpecification(unProcessedTokens, out dayOfMonthSpecification))
            {
                return(true);
            }
            if (TryGetLastWeekdayOfMonthSpecification(unProcessedTokens, out dayOfMonthSpecification))
            {
                return(true);
            }

            dayOfMonthSpecification = null;
            return(false);
        }
Ejemplo n.º 2
0
 public TzDbRule(String name, AbstractYearSpecification from, AbstractYearSpecification to, String type,
                 MonthOfYear @in, AbstractDayOfMonthSpecification on, AbstractTime at, TimeSpan save,
                 TimeZoneAbbreviationVariable letter)
     : this()
 {
     Name   = name;
     From   = from;
     To     = to;
     Type   = type;
     In     = @in;
     On     = on;
     At     = at;
     Save   = save;
     Letter = letter;
 }
Ejemplo n.º 3
0
        private static bool TryGetExplicitDayOfMonthSpecification(Queue <Token> unProcessedTokens,
                                                                  out AbstractDayOfMonthSpecification dayOfMonthSpecification)
        {
            const String explicitDayOfMonthRegex = @"^\d{1,2}$";

            // check if the next token is an explicit day of month specification token
            if (Regex.IsMatch(unProcessedTokens.Peek().Value, explicitDayOfMonthRegex))
            {
                string dayOfMonthSpecificationString = unProcessedTokens.Dequeue().Value;

                dayOfMonthSpecification = new ExplicitDayOfMonthSpecification(int.Parse(dayOfMonthSpecificationString));
                return(true);
            }
            dayOfMonthSpecification = null;
            return(false);
        }
Ejemplo n.º 4
0
        public static bool TryParse(Queue <Token> unProcessedTokens, out TzDbRule?tzDbRule)
        {
            // the value of the first token of every link entry is Rule
            const String ruleRegex = "Rule";

            if (Regex.IsMatch(unProcessedTokens.Peek().Value, ruleRegex))
            {
                try
                {
                    // dequeue Rule token and discard
                    unProcessedTokens.Dequeue();

                    string name = unProcessedTokens.Dequeue().Value;
                    AbstractYearSpecification from = YearSpecificationExpression.Parse(unProcessedTokens);
                    AbstractYearSpecification to   = ParseToExpression(unProcessedTokens, from);
                    string      type = unProcessedTokens.Dequeue().Value;
                    MonthOfYear @in  = MonthOfYearExpression.Parse(unProcessedTokens);
                    AbstractDayOfMonthSpecification on = DayOfMonthSpecificationExpression.Parse(unProcessedTokens);
                    AbstractTime at   = TzDbTimeExpression.Parse(unProcessedTokens);
                    TimeSpan     save = TimeSpanExpression.Parse(unProcessedTokens);
                    TimeZoneAbbreviationVariable letter = TimeZoneAbbreviationVariableExpression.Parse(unProcessedTokens);

                    tzDbRule = new TzDbRule(name, from, to, type, @in, on, at, save, letter);

                    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);
                }
                catch (Exception e)
                {
                    string msg = String.Format("Unable to parse {0}", typeof(RuleExpression).Name);

                    throw new Exception(msg, e);
                }
            }
            tzDbRule = null;
            return(false);
        }
Ejemplo n.º 5
0
 public DaylightSavingsRule(
     TimeSpan adjustmentToStandardOffset,
     AbstractYearSpecification utcEffectiveFromSpecification,
     AbstractYearSpecification utcEffectiveToSpecification,
     MonthOfYear occursIn,
     AbstractDayOfMonthSpecification occursOnSpecification,
     AbstractTime occursAt,
     TimeZoneAbbreviationVariable timeZoneAbbreviationVariable,
     Guid?id = null
     )
 {
     AdjustmentToStandardOffset    = adjustmentToStandardOffset;
     UtcEffectiveFromSpecification = utcEffectiveFromSpecification;
     UtcEffectiveToSpecification   = utcEffectiveToSpecification;
     OccursIn = occursIn;
     OccursOnSpecification = occursOnSpecification;
     OccursAt = occursAt;
     TimeZoneAbbreviationVariable = timeZoneAbbreviationVariable;
     Id = id ?? Guid.NewGuid();
 }
Ejemplo n.º 6
0
 public DayOfYearSpecification(MonthOfYear monthOfYear, AbstractDayOfMonthSpecification dayOfMonthSpecification)
     : this()
 {
     MonthOfYear             = monthOfYear;
     DayOfMonthSpecification = dayOfMonthSpecification;
 }
Ejemplo n.º 7
0
        private static bool TryGetDayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(
            Queue <Token> unProcessedTokens, out AbstractDayOfMonthSpecification dayOfMonthSpecification)
        {
            const String weekdayGreaterThanOrEqualToDayRegexFormat = @"^{0}>=\d{{1,2}}$";
            string       weekdayGreaterThanOrEqualToDayRegex       = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                                   DaysOfWeekRegex);
            string mondayGreaterThanOrEqualToDayRegex = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                      MondayRegex);
            string tuesdayGreaterThanOrEqualToDayRegex = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                       TuesdayRegex);
            string wednesdayGreaterThanOrEqualToDayRegex = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                         WednesdayRegex);
            string thursdayGreaterThanOrEqualToDayRegex = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                        ThursdayRegex);
            string fridayGreaterThanOrEqualToDayRegex = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                      FridayRegex);
            string saturdayGreaterThanOrEqualToDayRegex = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                        SaturdayRegex);
            string sundayGreaterThanOrEqualToDayRegex = String.Format(weekdayGreaterThanOrEqualToDayRegexFormat,
                                                                      SundayRegex);

            // check if the next token is a day of week greater than or equal to day of month specification token
            if (Regex.IsMatch(unProcessedTokens.Peek().Value, weekdayGreaterThanOrEqualToDayRegex))
            {
                string dayOfMonthSpecificationString = unProcessedTokens.Dequeue().Value;

                if (Regex.IsMatch(dayOfMonthSpecificationString, mondayGreaterThanOrEqualToDayRegex))
                {
                    int dayOfMonth = ParseDayOfMonthFromInequality(dayOfMonthSpecificationString);
                    dayOfMonthSpecification = new DayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(DayOfWeek.Monday,
                                                                                                       dayOfMonth);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, tuesdayGreaterThanOrEqualToDayRegex))
                {
                    int dayOfMonth = ParseDayOfMonthFromInequality(dayOfMonthSpecificationString);
                    dayOfMonthSpecification = new DayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(
                        DayOfWeek.Tuesday,
                        dayOfMonth);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, wednesdayGreaterThanOrEqualToDayRegex))
                {
                    int dayOfMonth = ParseDayOfMonthFromInequality(dayOfMonthSpecificationString);
                    dayOfMonthSpecification = new DayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(
                        DayOfWeek.Wednesday, dayOfMonth);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, thursdayGreaterThanOrEqualToDayRegex))
                {
                    int dayOfMonth = ParseDayOfMonthFromInequality(dayOfMonthSpecificationString);
                    dayOfMonthSpecification =
                        new DayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(DayOfWeek.Thursday,
                                                                                 dayOfMonth);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, fridayGreaterThanOrEqualToDayRegex))
                {
                    int dayOfMonth = ParseDayOfMonthFromInequality(dayOfMonthSpecificationString);
                    dayOfMonthSpecification = new DayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(DayOfWeek.Friday,
                                                                                                       dayOfMonth);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, saturdayGreaterThanOrEqualToDayRegex))
                {
                    int dayOfMonth = ParseDayOfMonthFromInequality(dayOfMonthSpecificationString);
                    dayOfMonthSpecification =
                        new DayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(DayOfWeek.Saturday,
                                                                                 dayOfMonth);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, sundayGreaterThanOrEqualToDayRegex))
                {
                    int dayOfMonth = ParseDayOfMonthFromInequality(dayOfMonthSpecificationString);
                    dayOfMonthSpecification = new DayOfWeekGreaterThanOrEqualToDayOfMonthSpecification(DayOfWeek.Sunday,
                                                                                                       dayOfMonth);
                    return(true);
                }

                string msg =
                    String.Format(
                        "Unable to parse day of week greater than or equal to day of month specification expression: {0}",
                        dayOfMonthSpecificationString);
                throw new Exception(msg);
            }
            dayOfMonthSpecification = null;
            return(false);
        }
Ejemplo n.º 8
0
        private static bool TryGetLastWeekdayOfMonthSpecification(Queue <Token> unProcessedTokens,
                                                                  out AbstractDayOfMonthSpecification dayOfMonthSpecification)
        {
            const String lastDayOfWeekRegexFormat = @"^last{0}$";
            string       lastDayOfWeekRegex       = String.Format(lastDayOfWeekRegexFormat, DaysOfWeekRegex);
            string       lastMondayRegex          = String.Format(lastDayOfWeekRegexFormat, MondayRegex);
            string       lastTuesdayRegex         = String.Format(lastDayOfWeekRegexFormat, TuesdayRegex);
            string       lastWednesdayRegex       = String.Format(lastDayOfWeekRegexFormat, WednesdayRegex);
            string       lastThursdayRegex        = String.Format(lastDayOfWeekRegexFormat, ThursdayRegex);
            string       lastFridayRegex          = String.Format(lastDayOfWeekRegexFormat, FridayRegex);
            string       lastSaturdayRegex        = String.Format(lastDayOfWeekRegexFormat, SaturdayRegex);
            string       lastSundayRegex          = String.Format(lastDayOfWeekRegexFormat, SundayRegex);

            // check if the next token is a last weekday of month specification token
            if (Regex.IsMatch(unProcessedTokens.Peek().Value, lastDayOfWeekRegex))
            {
                string dayOfMonthSpecificationString = unProcessedTokens.Dequeue().Value;

                if (Regex.IsMatch(dayOfMonthSpecificationString, lastMondayRegex))
                {
                    dayOfMonthSpecification = new LastWeekdayOfMonthSpecification(DayOfWeek.Monday);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, lastTuesdayRegex))
                {
                    dayOfMonthSpecification = new LastWeekdayOfMonthSpecification(DayOfWeek.Tuesday);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, lastWednesdayRegex))
                {
                    dayOfMonthSpecification = new LastWeekdayOfMonthSpecification(DayOfWeek.Wednesday);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, lastThursdayRegex))
                {
                    dayOfMonthSpecification = new LastWeekdayOfMonthSpecification(DayOfWeek.Thursday);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, lastFridayRegex))
                {
                    dayOfMonthSpecification = new LastWeekdayOfMonthSpecification(DayOfWeek.Friday);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, lastSaturdayRegex))
                {
                    dayOfMonthSpecification = new LastWeekdayOfMonthSpecification(DayOfWeek.Saturday);
                    return(true);
                }
                if (Regex.IsMatch(dayOfMonthSpecificationString, lastSundayRegex))
                {
                    dayOfMonthSpecification = new LastWeekdayOfMonthSpecification(DayOfWeek.Sunday);
                    return(true);
                }

                string msg = String.Format("Unable to parse last weekday of month specification expression: {0}",
                                           dayOfMonthSpecificationString);
                throw new Exception(msg);
            }
            dayOfMonthSpecification = null;
            return(false);
        }