|
18 | 18 | package cn.org.codecrafters.webcal; |
19 | 19 |
|
20 | 20 | import cn.org.codecrafters.webcal.config.Classification; |
| 21 | +import cn.org.codecrafters.webcal.config.Formatter; |
21 | 22 |
|
| 23 | +import java.text.MessageFormat; |
22 | 24 | import java.time.Duration; |
23 | 25 | import java.time.LocalDateTime; |
24 | | -import java.time.format.DateTimeFormatter; |
| 26 | +import java.time.ZoneId; |
25 | 27 | import java.util.Arrays; |
26 | 28 | import java.util.Collection; |
27 | 29 | import java.util.Optional; |
@@ -257,30 +259,34 @@ public WebCalendarEvent setTimezone(String timezone) { |
257 | 259 | */ |
258 | 260 | @Override |
259 | 261 | public String resolve() { |
260 | | - return "\nBEGIN:" + TAG + "\n" + |
261 | | - "UID:" + Optional.ofNullable(uid).orElse(UUID.randomUUID().toString()) + "@" + domainName + "\n" + |
262 | | - Optional.ofNullable(summary).map((item) -> "SUMMARY:" + item + "\n").orElse("") + |
263 | | - "DTSTART" + Optional.ofNullable(timezone).map(item -> ";TZID=" + item).orElse("") + ":" + start.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "\n" + |
| 262 | + var now = LocalDateTime.now().atZone(ZoneId.systemDefault()); |
| 263 | + return MessageFormat.format(""" |
| 264 | + BEGIN:{0} |
| 265 | + UID:{1} |
| 266 | + DTSTAMP:{2} |
| 267 | + DTSTART:{3} |
| 268 | + DURATION:PT{6}S |
| 269 | + {4}{5}{7}{8}{9}{10}{11}{12} |
| 270 | + END:{0}""", |
| 271 | + TAG, // 0 - tag |
| 272 | + Optional.ofNullable(uid).orElse(UUID.randomUUID().toString()) + "@" + domainName, // 1 - uid |
| 273 | + now.format(Formatter.getUtcDatetimeFormatter()), // 2 - dtstamp |
| 274 | + start.atZone(ZoneId.systemDefault()).format(Formatter.getUtcDatetimeFormatter()), // 3 - start time |
| 275 | + Optional.ofNullable(summary).map((item) -> "\nSUMMARY:" + item).orElse(""), // 4 - summary |
264 | 276 | Optional.ofNullable(categories) |
265 | | - .map((item) -> { |
266 | | - if (!item.isEmpty()) { |
267 | | - return "CATEGORIES:" + resolveCategories() + "\n"; |
268 | | - } |
269 | | - return null; |
270 | | - }).orElse("") + |
| 277 | + .map((item) -> !item.isEmpty() ? "\nCATEGORIES:" + resolveCategories() : null).orElse(""), // 5 - categories |
271 | 278 | Optional.ofNullable(duration) |
272 | | - .map((item) -> "DURATION:PT" + item.getSeconds() + "S\n").orElse("") + |
273 | | - Optional.ofNullable(end) |
274 | | - .map((item) -> "DTEND" + Optional.ofNullable(timezone).map(tz -> ";TZID=" + tz).orElse("") + ":" + |
275 | | - end.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + "\n").orElse("") + |
276 | | - Optional.ofNullable(classification) |
277 | | - .map((item) -> "CLASS:" + item.name() + "\n").orElse("") + |
278 | | - Optional.ofNullable(comment).map((item) -> "COMMENT:" + item + "\n").orElse("") + |
279 | | - Optional.ofNullable(description).map((item) -> "DESCRIPTION:" + item + "\n").orElse("") + |
280 | | - Optional.ofNullable(location).map((item) -> "LOCATION:" + item + "\n").orElse("") + |
281 | | - Optional.ofNullable(percentComplete).map((item) -> "PERCENT-COMPLETE:" + item + "\n").orElse("") + |
282 | | - Optional.ofNullable(priority).map((item) -> "PRIORITY:" + item + "\n").orElse("") + |
283 | | - "END:" + TAG + "\n"; |
| 279 | + .map((_duration) -> String.valueOf(_duration.getSeconds())) |
| 280 | + .orElse(Optional.ofNullable(end) |
| 281 | + .map((_end) -> String.valueOf(Duration.between(_end, start).getSeconds())) |
| 282 | + .orElse("0")), // 6 - duration |
| 283 | + Optional.ofNullable(classification).map((_classification) -> "\nCLASS:" + _classification + "\n").orElse(""), /* 7 - classification */ |
| 284 | + Optional.ofNullable(comment).map((_comment) -> "\nCOMMENT:" + _comment + "\n").orElse(""), /* 8 - comment */ |
| 285 | + Optional.ofNullable(location).map((_location) -> "\nLOCATION:" + _location).orElse("") /* 9 - location */, |
| 286 | + Optional.ofNullable(percentComplete).map((_percentComplete) -> "\nPERCENT-COMPLETE:" + _percentComplete).orElse("") /* 10 = percentComplete */, |
| 287 | + Optional.ofNullable(description).map((_description) -> "\nDESCRIPTION:" + _description).orElse("") /* 11 - description */, |
| 288 | + Optional.ofNullable(priority).map((_priority) -> "\nPRIORITY:" + _priority).orElse("") /* 12 - priority */ |
| 289 | + ); |
284 | 290 | } |
285 | 291 |
|
286 | 292 | } |
0 commit comments