Interval.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package org.jetlinks.community;
  2. import com.alibaba.fastjson.annotation.JSONType;
  3. import com.fasterxml.jackson.core.JsonParser;
  4. import com.fasterxml.jackson.databind.DeserializationContext;
  5. import com.fasterxml.jackson.databind.JsonDeserializer;
  6. import com.fasterxml.jackson.databind.JsonNode;
  7. import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
  8. import lombok.AllArgsConstructor;
  9. import lombok.Getter;
  10. import lombok.NoArgsConstructor;
  11. import lombok.SneakyThrows;
  12. import java.math.BigDecimal;
  13. @Getter
  14. @AllArgsConstructor
  15. @NoArgsConstructor
  16. @JsonDeserialize(using = Interval.IntervalJSONDeserializer.class)
  17. @JSONType(deserializer = Interval.IntervalJSONDeserializer.class)
  18. public class Interval {
  19. public static final String year = "y";
  20. public static final String quarter = "q";
  21. public static final String month = "M";
  22. public static final String weeks = "w";
  23. public static final String days = "d";
  24. public static final String hours = "h";
  25. public static final String minutes = "m";
  26. public static final String seconds = "s";
  27. private BigDecimal number;
  28. private String expression;
  29. public boolean isFixed() {
  30. return expression.equalsIgnoreCase(hours) ||
  31. expression.equals(minutes) ||
  32. expression.equals(seconds);
  33. }
  34. public boolean isCalendar() {
  35. return expression.equals(days) ||
  36. expression.equals(month) ||
  37. expression.equals(year);
  38. }
  39. @Override
  40. public String toString() {
  41. return (number) + expression;
  42. }
  43. public static Interval ofSeconds(int seconds) {
  44. return of(seconds, Interval.seconds);
  45. }
  46. public static Interval ofDays(int days) {
  47. return of(days, Interval.days);
  48. }
  49. public static Interval ofHours(int hours) {
  50. return of(hours, Interval.hours);
  51. }
  52. public static Interval ofMonth(int month) {
  53. return of(month, Interval.month);
  54. }
  55. public static Interval of(int month, String expression) {
  56. return new Interval(new BigDecimal(month), expression);
  57. }
  58. public static Interval of(String expr) {
  59. char[] chars = expr.toCharArray();
  60. int numIndex = 0;
  61. for (char c : expr.toCharArray()) {
  62. if (c == '-' || c == '.' || (c >= '0' && c <= '9')) {
  63. numIndex++;
  64. } else {
  65. BigDecimal val = new BigDecimal(chars, 0, numIndex);
  66. return new Interval(val, expr.substring(numIndex));
  67. }
  68. }
  69. throw new IllegalArgumentException("can not parse interval expression:" + expr);
  70. }
  71. public String getDefaultFormat() {
  72. switch (getExpression()) {
  73. case year:
  74. return "yyyy";
  75. case quarter:
  76. case month:
  77. return "yyyy-MM";
  78. case days:
  79. return "yyyy-MM-dd";
  80. case hours:
  81. return "MM-dd HH";
  82. case minutes:
  83. return "MM-dd HH:mm";
  84. case seconds:
  85. return "HH:mm:ss";
  86. default:
  87. return "yyyy-MM-dd HH:mm:ss";
  88. }
  89. }
  90. public static class IntervalJSONDeserializer extends JsonDeserializer<Interval> {
  91. @Override
  92. @SneakyThrows
  93. public Interval deserialize(JsonParser jp, DeserializationContext ctxt) {
  94. JsonNode node = jp.getCodec().readTree(jp);
  95. String currentName = jp.currentName();
  96. Object currentValue = jp.getCurrentValue();
  97. if (currentName == null || currentValue == null) {
  98. return null;
  99. }
  100. return of(node.textValue());
  101. }
  102. }
  103. }