Guest User

Untitled

a guest
Nov 14th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.40 KB | None | 0 0
  1. public class ResourceUtils {
  2. // example: ${date:DD.MM}
  3. private static final Pattern DATE_TIME_PLACEHOLDER_PATTERN =
  4. Pattern.compile("\\$\\{(?<value>date:[\\w.:\\-\\s/\\\\]+)}");
  5.  
  6. // examples: ${number:N}
  7. private static final Pattern NUMBER_PLACEHOLDER_PATTERN =
  8. Pattern.compile("\\$\\{(?<value>number:[\\w.:\\-\\s/\\\\?]+)}");
  9.  
  10. private static final Map<String, Formatter> FORMATTERS = Stream.of(
  11. new AbstractMap.SimpleEntry<>("date:DD.MM", new DateTimeFormatter("dd.MM")),
  12. new AbstractMap.SimpleEntry<>("date:DD.MM.YYYY", new DateTimeFormatter("dd.MM.yyyy")),
  13. new AbstractMap.SimpleEntry<>("date:DD.MM.YYYY HH:MM", new DateTimeFormatter("dd.MM.yyyy HH:mm")),
  14.  
  15. new AbstractMap.SimpleEntry<>("number:N", new NumberFormatter("0")),
  16. new AbstractMap.SimpleEntry<>("number:N.00", new NumberFormatter("0.00")),
  17. new AbstractMap.SimpleEntry<>("number:N.??", new NumberFormatter("0.##"))
  18. ).collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));
  19.  
  20. private static final Formatter NULL_FORMATTER = arg -> "null";
  21.  
  22. public static String formatString(String str, Object[] args) {
  23. if (StringUtils.isEmpty(str)) {
  24. return str;
  25. }
  26. List<Operation> operations = new ArrayList<>();
  27. collectOperations(operations, DATE_TIME_PLACEHOLDER_PATTERN, str);
  28. collectOperations(operations, NUMBER_PLACEHOLDER_PATTERN, str);
  29. if (operations.isEmpty()) {
  30. return str;
  31. } else if (operations.size() != args.length) {
  32. throw new IllegalArgumentException(String.format(
  33. "Arguments count [%d] doesn't matches to placeholders count [%d]",
  34. args.length, operations.size()));
  35. }
  36. operations.sort(Comparator.comparing(Operation::getRangeStart));
  37.  
  38. StringBuilder sb = new StringBuilder();
  39. Operation lastOperation = null;
  40. for (int i = 0; i < operations.size(); i++) {
  41. Operation operation = operations.get(i);
  42. Object arg = args[i];
  43.  
  44. Formatter formatter = arg == null ? NULL_FORMATTER : FORMATTERS.get(operation.getPattern());
  45. if (formatter == null) {
  46. throw new IllegalArgumentException(String.format(
  47. "Unable to find appropriate formatter for pattern [%s]", operation.getPattern()));
  48. }
  49.  
  50. String formattedValue;
  51. try {
  52. formattedValue = formatter.format(arg);
  53. } catch (RuntimeException e) {
  54. throw new IllegalArgumentException(String.format("Unable to format arg [%s] using pattern [%s]",
  55. arg, operation.getPattern()), e);
  56. }
  57.  
  58. int startIndex = lastOperation == null ? 0 : lastOperation.getRangeEnd() + 1;
  59. if (operation.getRangeStart() > startIndex) {
  60. sb.append(str.substring(startIndex, operation.getRangeStart()));
  61. }
  62. sb.append(formattedValue);
  63. lastOperation = operation;
  64. }
  65. if (lastOperation != null && lastOperation.getRangeEnd() < str.length() - 1) {
  66. sb.append(str.substring(lastOperation.getRangeEnd() + 1, str.length()));
  67. }
  68. return sb.toString();
  69. }
  70.  
  71. private static void collectOperations(List<Operation> operations, Pattern pattern, String str) {
  72. Matcher matcher = pattern.matcher(str);
  73. while (matcher.find()) {
  74. operations.add(new Operation(matcher.start(), matcher.end() - 1, matcher.group("value")));
  75. }
  76. }
  77.  
  78. private interface Formatter {
  79. String format(Object arg);
  80. }
  81.  
  82. private static class DateTimeFormatter implements Formatter {
  83. private final java.time.format.DateTimeFormatter dateTimeFormatter;
  84.  
  85. public DateTimeFormatter(String pattern) {
  86. this.dateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern(pattern);
  87. }
  88.  
  89. @Override
  90. public String format(Object arg) {
  91. if (!(arg instanceof TemporalAccessor)) {
  92. throw new IllegalArgumentException(
  93. String.format("Argument [%s] can not be formatted as date-time value", arg));
  94. }
  95. return dateTimeFormatter.format((TemporalAccessor) arg);
  96. }
  97. }
  98.  
  99. private static class NumberFormatter implements Formatter {
  100. private final DecimalFormat decimalFormat;
  101.  
  102. public NumberFormatter(String pattern) {
  103. DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance();
  104. dfs.setDecimalSeparator('.');
  105. decimalFormat = new DecimalFormat(pattern);
  106. decimalFormat.setDecimalFormatSymbols(dfs);
  107. }
  108.  
  109. @Override
  110. public synchronized String format(Object arg) {
  111. return decimalFormat.format(arg);
  112. }
  113. }
  114.  
  115. private static class Operation {
  116. private final int rangeStart;
  117. private final int rangeEnd;
  118. private final String pattern;
  119.  
  120. public Operation(int rangeStart, int rangeEnd, String pattern) {
  121. this.rangeStart = rangeStart;
  122. this.rangeEnd = rangeEnd;
  123. this.pattern = pattern;
  124. }
  125.  
  126. public int getRangeStart() {
  127. return rangeStart;
  128. }
  129.  
  130. public int getRangeEnd() {
  131. return rangeEnd;
  132. }
  133.  
  134. public String getPattern() {
  135. return pattern;
  136. }
  137. }
  138. }
Add Comment
Please, Sign In to add comment