Logback: the reliable, generic, fast and flexible logging framework.
Copyright (C) 1999-2015, QOS.ch. All rights reserved.
This program and the accompanying materials are dual-licensed under
either the terms of the Eclipse Public License v1.0 as published by
the Eclipse Foundation
or (per the licensee's choosing)
under the terms of the GNU Lesser General Public License version 2.1
as published by the Free Software Foundation.
/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.core.util;
import java.text.DateFormatSymbols;
This class supports mapping character sequences to
regular expressions as appropriate for SimpleDateFormatter.
Author: Ceki
/**
* This class supports mapping character sequences to
* regular expressions as appropriate for SimpleDateFormatter.
*
* @author Ceki
*/
class CharSequenceToRegexMapper {
DateFormatSymbols symbols = DateFormatSymbols.getInstance();
String toRegex(CharSequenceState css) {
final int occurrences = css.occurrences;
final char c = css.c;
switch (css.c) {
case 'G':
case 'z':
return ".*";
case 'M':
if (occurrences <= 2)
return number(occurrences);
else if (occurrences == 3)
return getRegexForShortMonths();
else
return getRegexForLongMonths();
case 'y':
case 'w':
case 'W':
case 'D':
case 'd':
case 'F':
case 'H':
case 'k':
case 'K':
case 'h':
case 'm':
case 's':
case 'S':
return number(occurrences);
case 'E':
if (occurrences >= 4) {
return getRegexForLongDaysOfTheWeek();
} else {
return getRegexForShortDaysOfTheWeek();
}
case 'a':
return getRegexForAmPms();
case 'Z':
return "(\\+|-)\\d{4}";
case '.':
return "\\.";
case '\\':
throw new IllegalStateException("Forward slashes are not allowed");
case '\'':
if (occurrences == 1) {
return "";
}
throw new IllegalStateException("Too many single quotes");
default:
if (occurrences == 1) {
return "" + c;
} else {
return c + "{" + occurrences + "}";
}
}
}
private String number(int occurrences) {
return "\\d{" + occurrences + "}";
}
private String getRegexForAmPms() {
return symbolArrayToRegex(symbols.getAmPmStrings());
}
private String getRegexForLongDaysOfTheWeek() {
return symbolArrayToRegex(symbols.getWeekdays());
}
private String getRegexForShortDaysOfTheWeek() {
return symbolArrayToRegex(symbols.getShortWeekdays());
}
private String getRegexForLongMonths() {
return symbolArrayToRegex(symbols.getMonths());
}
String getRegexForShortMonths() {
return symbolArrayToRegex(symbols.getShortMonths());
}
private String symbolArrayToRegex(String[] symbolArray) {
int[] minMax = findMinMaxLengthsInSymbols(symbolArray);
return ".{" + minMax[0] + "," + minMax[1] + "}";
}
static int[] findMinMaxLengthsInSymbols(String[] symbols) {
int min = Integer.MAX_VALUE;
int max = 0;
for (String symbol : symbols) {
int len = symbol.length();
// some SENTINEL values can be empty strings, the month at index 12 or the weekday at index 0
if (len == 0)
continue;
min = Math.min(min, len);
max = Math.max(max, len);
}
return new int[] { min, max };
}
}