private Rule createRule()

in gflog-core/src/main/java/com/epam/deltix/gflog/core/layout/template/FastDateFormat.java [137:222]


    private Rule createRule(final char c,
                            final String token,
                            final int tokenLen,
                            final String[] eras,
                            final String[] months,
                            final String[] shortMonths,
                            final String[] weekdays,
                            final String[] shortWeekdays,
                            final String[] amPmStrings) {
        switch (c) {
            case 'G': // era designator (text)
                return new TextField(Calendar.ERA, eras);

            case 'y': // year (number)
                return tokenLen >= 4 ?
                        selectNumberRule(Calendar.YEAR, tokenLen) :
                        TwoDigitYearField.INSTANCE;

            case 'M': // month in year (text and number)
                return tokenLen >= 4 ? new TextField(Calendar.MONTH, months) :
                        tokenLen == 3 ? new TextField(Calendar.MONTH, shortMonths) :
                                tokenLen == 2 ? TwoDigitMonthField.INSTANCE :
                                        UnpaddedMonthField.INSTANCE;

            case 'd': // day in month (number)
                return selectNumberRule(Calendar.DAY_OF_MONTH, tokenLen);

            case 'h': // hour in am/pm (number, 1..12)
                return new TwelveHourField(selectNumberRule(Calendar.HOUR, tokenLen));

            case 'H': // hour in day (number, 0..23)
                return selectNumberRule(Calendar.HOUR_OF_DAY, tokenLen);

            case 'm': // minute in hour (number)
                return selectNumberRule(Calendar.MINUTE, tokenLen);

            case 's': // second in minute (number)
                return selectNumberRule(Calendar.SECOND, tokenLen);

            case 'S': // millisecond (number)
                return selectSubSecondField(Calendar.MILLISECOND, tokenLen);

            case 'E': // day in week (text)
                return new TextField(Calendar.DAY_OF_WEEK, tokenLen < 4 ? shortWeekdays : weekdays);

            case 'D': // day in year (number)
                return selectNumberRule(Calendar.DAY_OF_YEAR, tokenLen);

            case 'F': // day of week in month (number)
                return selectNumberRule(Calendar.DAY_OF_WEEK_IN_MONTH, tokenLen);

            case 'w': // week in year (number)
                return selectNumberRule(Calendar.WEEK_OF_YEAR, tokenLen);

            case 'W': // week in month (number)
                return selectNumberRule(Calendar.WEEK_OF_MONTH, tokenLen);

            case 'a': // am/pm marker (text)
                return new TextField(Calendar.AM_PM, amPmStrings);

            case 'k': // hour in day (1..24)
                return new TwentyFourHourField(selectNumberRule(Calendar.HOUR_OF_DAY, tokenLen));

            case 'K': // hour in am/pm (0..11)
                return selectNumberRule(Calendar.HOUR, tokenLen);

            case 'z': // time zone (text)
                return (tokenLen >= 4) ?
                        new TimeZoneNameRule(mTimeZone, mTimeZoneForced, mLocale, TimeZone.LONG) :
                        new TimeZoneNameRule(mTimeZone, mTimeZoneForced, mLocale, TimeZone.SHORT);

            case 'Z': // time zone (value)
                return (tokenLen == 1) ?
                        TimeZoneNumberRule.INSTANCE_NO_COLON :
                        TimeZoneNumberRule.INSTANCE_COLON;

            case '\'': // literal text
                final String sub = token.substring(1);
                return (sub.length() == 1) ?
                        new CharacterLiteral(sub.charAt(0)) :
                        new StringLiteral(sub);

            default:
                throw new IllegalArgumentException("Illegal pattern component: " + token);
        }
    }