Add relative time and date #6
@ -35,36 +35,19 @@ public class MockService {
|
|||||||
|
|
||||||
private final MockFileLoader loader;
|
private final MockFileLoader loader;
|
||||||
private final AntPathMatcher pathMatcher = new AntPathMatcher();
|
private final AntPathMatcher pathMatcher = new AntPathMatcher();
|
||||||
private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\{([\\w\\.]+)(?::(int|float|bool))?}");
|
// Patterns using named capture groups (Java 21+)
|
||||||
|
private static final Pattern PLACEHOLDER_PATTERN =
|
||||||
|
Pattern.compile("\\{(?<key>[\\w\\.]+)(?::(?<type>int|float|bool))?}");
|
||||||
|
|
||||||
// Patterns for relative date/time placeholders with optional format specifier
|
// Patterns for relative date/time placeholders with optional format specifier
|
||||||
private static final Pattern DATETIME_OFFSET_PATTERN =
|
private static final Pattern DATETIME_OFFSET_PATTERN =
|
||||||
Pattern.compile("\\{datetime([+-])(\\d+d)?(\\d+h)?(\\d+m)?(?::(\\w+|[^}]+))?}");
|
Pattern.compile("\\{datetime(?<sign>[+-])(?<days>\\d+d)?(?<hours>\\d+h)?"
|
||||||
|
+ "(?<minutes>\\d+m)?(?::(?<format>\\w+|[^}]+))?}");
|
||||||
private static final Pattern DATETIME_AT_TIME_PATTERN =
|
private static final Pattern DATETIME_AT_TIME_PATTERN =
|
||||||
Pattern.compile("\\{datetime([+-])(\\d+)d@(\\d{1,2}:\\d{2})(?::(\\w+|[^}]+))?}");
|
Pattern.compile("\\{datetime(?<sign>[+-])(?<days>\\d+)d@(?<time>\\d{1,2}:\\d{2})"
|
||||||
private static final Pattern DATE_OFFSET_PATTERN = Pattern.compile("\\{date([+-])(\\d+)d(?::(\\w+|[^}]+))?}");
|
+ "(?::(?<format>\\w+|[^}]+))?}");
|
||||||
|
private static final Pattern DATE_OFFSET_PATTERN =
|
||||||
// Placeholder pattern groups
|
Pattern.compile("\\{date(?<sign>[+-])(?<days>\\d+)d(?::(?<format>\\w+|[^}]+))?}");
|
||||||
private static final int PLACEHOLDER_KEY = 1;
|
|
||||||
private static final int PLACEHOLDER_TYPE = 2;
|
|
||||||
|
|
||||||
// Date/time pattern groups
|
|
||||||
private static final int DATETIME_SIGN = 1;
|
|
||||||
private static final int DATETIME_DAYS = 2;
|
|
||||||
private static final int DATETIME_HOURS = 3;
|
|
||||||
private static final int DATETIME_MINUTES = 4;
|
|
||||||
private static final int DATETIME_FORMAT = 5;
|
|
||||||
|
|
||||||
// Date/time at specific time pattern groups
|
|
||||||
private static final int AT_TIME_SIGN = 1;
|
|
||||||
private static final int AT_TIME_DAYS = 2;
|
|
||||||
private static final int AT_TIME_TIME = 3;
|
|
||||||
private static final int AT_TIME_FORMAT = 4;
|
|
||||||
|
|
||||||
// Date offset pattern groups
|
|
||||||
private static final int DATE_SIGN = 1;
|
|
||||||
private static final int DATE_DAYS = 2;
|
|
||||||
private static final int DATE_FORMAT = 3;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -186,8 +169,8 @@ public class MockService {
|
|||||||
Matcher matcher = PLACEHOLDER_PATTERN.matcher(str);
|
Matcher matcher = PLACEHOLDER_PATTERN.matcher(str);
|
||||||
// If the string is a single placeholder (e.g. "{id:int}" or "{id}"), resolve and return its value
|
// If the string is a single placeholder (e.g. "{id:int}" or "{id}"), resolve and return its value
|
||||||
if (matcher.matches()) {
|
if (matcher.matches()) {
|
||||||
String key = matcher.group(PLACEHOLDER_KEY);
|
String key = matcher.group("key");
|
||||||
String type = matcher.group(PLACEHOLDER_TYPE);
|
String type = matcher.group("type");
|
||||||
String raw = resolveValue(key, pathVariables, globals);
|
String raw = resolveValue(key, pathVariables, globals);
|
||||||
return convertWithType(raw, type);
|
return convertWithType(raw, type);
|
||||||
}
|
}
|
||||||
@ -195,8 +178,8 @@ public class MockService {
|
|||||||
// Otherwise: perform inline replacement for all placeholders in the string
|
// Otherwise: perform inline replacement for all placeholders in the string
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
while (matcher.find()) {
|
while (matcher.find()) {
|
||||||
String key = matcher.group(PLACEHOLDER_KEY);
|
String key = matcher.group("key");
|
||||||
String type = matcher.group(PLACEHOLDER_TYPE);
|
String type = matcher.group("type");
|
||||||
String raw = resolveValue(key, pathVariables, globals);
|
String raw = resolveValue(key, pathVariables, globals);
|
||||||
Object replacement = convertWithType(raw, type);
|
Object replacement = convertWithType(raw, type);
|
||||||
matcher.appendReplacement(sb, Matcher.quoteReplacement(String.valueOf(replacement)));
|
matcher.appendReplacement(sb, Matcher.quoteReplacement(String.valueOf(replacement)));
|
||||||
@ -234,11 +217,11 @@ public class MockService {
|
|||||||
// Process datetime with offset (e.g., {datetime+2d4h30m} or {datetime+2d4h30m:rfc3339})
|
// Process datetime with offset (e.g., {datetime+2d4h30m} or {datetime+2d4h30m:rfc3339})
|
||||||
Matcher dateTimeOffsetMatcher = DATETIME_OFFSET_PATTERN.matcher(result);
|
Matcher dateTimeOffsetMatcher = DATETIME_OFFSET_PATTERN.matcher(result);
|
||||||
if (dateTimeOffsetMatcher.find()) {
|
if (dateTimeOffsetMatcher.find()) {
|
||||||
String sign = dateTimeOffsetMatcher.group(DATETIME_SIGN);
|
String sign = dateTimeOffsetMatcher.group("sign");
|
||||||
String daysStr = dateTimeOffsetMatcher.group(DATETIME_DAYS);
|
String daysStr = dateTimeOffsetMatcher.group("days");
|
||||||
String hoursStr = dateTimeOffsetMatcher.group(DATETIME_HOURS);
|
String hoursStr = dateTimeOffsetMatcher.group("hours");
|
||||||
String minutesStr = dateTimeOffsetMatcher.group(DATETIME_MINUTES);
|
String minutesStr = dateTimeOffsetMatcher.group("minutes");
|
||||||
String format = dateTimeOffsetMatcher.group(DATETIME_FORMAT);
|
String format = dateTimeOffsetMatcher.group("format");
|
||||||
|
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
LocalDateTime target = calculateDateTimeWithOffset(now, sign, daysStr, hoursStr, minutesStr);
|
LocalDateTime target = calculateDateTimeWithOffset(now, sign, daysStr, hoursStr, minutesStr);
|
||||||
@ -250,10 +233,10 @@ public class MockService {
|
|||||||
// Process datetime with days at specific time (e.g., {datetime+2d@13:00} or {datetime+2d@13:00:rfc3339})
|
// Process datetime with days at specific time (e.g., {datetime+2d@13:00} or {datetime+2d@13:00:rfc3339})
|
||||||
Matcher dateTimeAtTimeMatcher = DATETIME_AT_TIME_PATTERN.matcher(result);
|
Matcher dateTimeAtTimeMatcher = DATETIME_AT_TIME_PATTERN.matcher(result);
|
||||||
if (dateTimeAtTimeMatcher.find()) {
|
if (dateTimeAtTimeMatcher.find()) {
|
||||||
String sign = dateTimeAtTimeMatcher.group(AT_TIME_SIGN);
|
String sign = dateTimeAtTimeMatcher.group("sign");
|
||||||
int days = Integer.parseInt(dateTimeAtTimeMatcher.group(AT_TIME_DAYS));
|
int days = Integer.parseInt(dateTimeAtTimeMatcher.group("days"));
|
||||||
String timeStr = dateTimeAtTimeMatcher.group(AT_TIME_TIME);
|
String timeStr = dateTimeAtTimeMatcher.group("time");
|
||||||
String format = dateTimeAtTimeMatcher.group(AT_TIME_FORMAT);
|
String format = dateTimeAtTimeMatcher.group("format");
|
||||||
|
|
||||||
LocalDate targetDate = LocalDate.now();
|
LocalDate targetDate = LocalDate.now();
|
||||||
if ("+".equals(sign)) {
|
if ("+".equals(sign)) {
|
||||||
@ -272,9 +255,9 @@ public class MockService {
|
|||||||
// Process date with offset (e.g., {date-4d} or {date-4d:MMM dd, yyyy})
|
// Process date with offset (e.g., {date-4d} or {date-4d:MMM dd, yyyy})
|
||||||
Matcher dateOffsetMatcher = DATE_OFFSET_PATTERN.matcher(result);
|
Matcher dateOffsetMatcher = DATE_OFFSET_PATTERN.matcher(result);
|
||||||
if (dateOffsetMatcher.find()) {
|
if (dateOffsetMatcher.find()) {
|
||||||
String sign = dateOffsetMatcher.group(DATE_SIGN);
|
String sign = dateOffsetMatcher.group("sign");
|
||||||
int days = Integer.parseInt(dateOffsetMatcher.group(DATE_DAYS));
|
int days = Integer.parseInt(dateOffsetMatcher.group("days"));
|
||||||
String format = dateOffsetMatcher.group(DATE_FORMAT);
|
String format = dateOffsetMatcher.group("format");
|
||||||
|
|
||||||
LocalDate target = LocalDate.now();
|
LocalDate target = LocalDate.now();
|
||||||
if ("+".equals(sign)) {
|
if ("+".equals(sign)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user