|
@@ -65,34 +65,59 @@ public class EventFormatter {
|
65
|
65
|
.ifPresent(c -> event.setDisplayProperty(DisplayProperty.FOREGROUND_COLOUR, c));
|
66
|
66
|
}
|
67
|
67
|
|
68
|
|
- return format.map(f -> {
|
69
|
|
- final StringBuilder builder = getTemplate(f, event);
|
70
|
|
- int tagStart = builder.indexOf("{{");
|
71
|
|
- while (tagStart > -1) {
|
72
|
|
- final int tagEnd = builder.indexOf("}}", tagStart);
|
73
|
|
- final String tag = builder.substring(tagStart + 2, tagEnd);
|
74
|
|
- final String replacement = getReplacement(event, tag);
|
75
|
|
- builder.replace(tagStart, tagEnd + 2, replacement);
|
76
|
|
- tagStart = builder.indexOf("{{", tagStart + replacement.length());
|
77
|
|
- }
|
78
|
|
-
|
79
|
|
- return builder.toString();
|
80
|
|
- });
|
|
68
|
+ return format.map(f -> format(f, event));
|
81
|
69
|
}
|
82
|
70
|
|
83
|
|
- private StringBuilder getTemplate(final EventFormat format, final DisplayableEvent event) {
|
|
71
|
+ private String format(final EventFormat format, final DisplayableEvent event) {
|
84
|
72
|
final StringBuilder builder = new StringBuilder();
|
85
|
|
- format.getBeforeTemplate().ifPresent(before -> builder.append(before).append('\n'));
|
86
|
|
- builder.append(format.getTemplate());
|
87
|
|
- format.getAfterTemplate().ifPresent(after -> builder.append('\n').append(after));
|
88
|
|
- return builder;
|
|
73
|
+ format.getBeforeTemplate().ifPresent(
|
|
74
|
+ before -> builder.append(doSubstitutions(event, before)).append('\n'));
|
|
75
|
+ builder.append(
|
|
76
|
+ format.getIterateProperty()
|
|
77
|
+ .map(iterate -> formatIterable(event, iterate, format.getTemplate()))
|
|
78
|
+ .orElseGet(() -> doSubstitutions(event, format.getTemplate())));
|
|
79
|
+ format.getAfterTemplate().ifPresent(
|
|
80
|
+ after -> builder.append('\n').append(doSubstitutions(event, after)));
|
|
81
|
+ return builder.toString();
|
|
82
|
+ }
|
|
83
|
+
|
|
84
|
+ private String doSubstitutions(final Object dataSource, final String line) {
|
|
85
|
+ final StringBuilder builder = new StringBuilder(line);
|
|
86
|
+ int tagStart = builder.indexOf("{{");
|
|
87
|
+ while (tagStart > -1) {
|
|
88
|
+ final int tagEnd = builder.indexOf("}}", tagStart);
|
|
89
|
+ final String tag = builder.substring(tagStart + 2, tagEnd);
|
|
90
|
+ final String replacement = getReplacement(dataSource, tag);
|
|
91
|
+ builder.replace(tagStart, tagEnd + 2, replacement);
|
|
92
|
+ tagStart = builder.indexOf("{{", tagStart + replacement.length());
|
|
93
|
+ }
|
|
94
|
+ return builder.toString();
|
|
95
|
+ }
|
|
96
|
+
|
|
97
|
+ private String formatIterable(final DisplayableEvent event, final String property,
|
|
98
|
+ final String template) {
|
|
99
|
+ final Optional<Object> value
|
|
100
|
+ = propertyManager.getProperty(event, event.getClass(), property);
|
|
101
|
+ if (!value.isPresent() || !(value.get() instanceof Iterable<?>)) {
|
|
102
|
+ return ERROR_STRING;
|
|
103
|
+ }
|
|
104
|
+ @SuppressWarnings("unchecked")
|
|
105
|
+ final Iterable<Object> collection = (Iterable<Object>) value.get();
|
|
106
|
+ final StringBuilder res = new StringBuilder();
|
|
107
|
+ for (Object line : collection) {
|
|
108
|
+ if (res.length() > 0) {
|
|
109
|
+ res.append('\n');
|
|
110
|
+ }
|
|
111
|
+ res.append(doSubstitutions(line, template));
|
|
112
|
+ }
|
|
113
|
+ return res.toString();
|
89
|
114
|
}
|
90
|
115
|
|
91
|
|
- private String getReplacement(final DisplayableEvent event, final String tag) {
|
|
116
|
+ private String getReplacement(final Object dataSource, final String tag) {
|
92
|
117
|
final String[] functionParts = tag.split("\\|");
|
93
|
118
|
final String[] dataParts = functionParts[0].split("\\.");
|
94
|
119
|
|
95
|
|
- Object target = event;
|
|
120
|
+ Object target = dataSource;
|
96
|
121
|
for (String part : dataParts) {
|
97
|
122
|
final Optional<Object> result =
|
98
|
123
|
propertyManager.getProperty(target, target.getClass(), part);
|