Skip to content

Commit 29aff89

Browse files
committed
implement more logic in TemplateConfig
1 parent f20a1a2 commit 29aff89

File tree

2 files changed

+108
-44
lines changed

2 files changed

+108
-44
lines changed

src/main/java/me/hsgamer/bettergui/config/TemplateConfig.java

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import io.github.projectunified.minelib.plugin.postenable.PostEnable;
55
import me.hsgamer.bettergui.BetterGUI;
66
import me.hsgamer.bettergui.builder.ConfigBuilder;
7-
import me.hsgamer.bettergui.util.StringReplacerApplier;
7+
import me.hsgamer.bettergui.util.MapTemplate;
88
import me.hsgamer.hscore.common.MapUtils;
99

1010
import java.io.File;
@@ -17,34 +17,13 @@ public class TemplateConfig implements Loadable, PostEnable {
1717
private final File templateFolder;
1818
private final Map<String, Map<String, Object>> templateMap = new HashMap<>();
1919

20-
public TemplateConfig(File templateFolder) {
21-
this.templateFolder = templateFolder;
22-
}
23-
2420
public TemplateConfig(BetterGUI plugin) {
25-
this(new File(plugin.getDataFolder(), "template"));
21+
this.templateFolder = new File(plugin.getDataFolder(), "template");
2622
if (!templateFolder.exists() && templateFolder.mkdirs()) {
2723
plugin.saveResource("template" + File.separator + "example-template.yml", false);
2824
}
2925
}
3026

31-
/**
32-
* Replace the variables in the object
33-
*
34-
* @param obj the object
35-
* @param variableMap the variable map
36-
*
37-
* @return the replaced object
38-
*/
39-
private static Object replaceVariables(Object obj, Map<String, String> variableMap) {
40-
return StringReplacerApplier.replace(obj, string -> {
41-
for (Map.Entry<String, String> entry : variableMap.entrySet()) {
42-
string = string.replace("{" + entry.getKey() + "}", entry.getValue());
43-
}
44-
return string;
45-
});
46-
}
47-
4827
/**
4928
* Set up the list
5029
*/
@@ -97,23 +76,7 @@ public Map<String, Object> getValues(Map<String, Object> settingMap, List<String
9776
.map(String::valueOf)
9877
.flatMap(this::get)
9978
.ifPresent(finalMap::putAll);
100-
Map<String, String> variableMap = new HashMap<>();
101-
// noinspection unchecked
102-
Optional.ofNullable(keys.get("variable"))
103-
.filter(Map.class::isInstance)
104-
.map(Map.class::cast)
105-
.ifPresent(map -> map.forEach((k, v) -> {
106-
String variable = String.valueOf(k);
107-
String value;
108-
if (v instanceof List) {
109-
List<String> list = new ArrayList<>();
110-
((List<?>) v).forEach(o -> list.add(String.valueOf(o)));
111-
value = String.join("\n", list);
112-
} else {
113-
value = String.valueOf(v);
114-
}
115-
variableMap.put(variable, value);
116-
}));
79+
Map<String, Object> variableMap = MapUtils.castOptionalStringObjectMap(keys.get("variable")).orElse(Collections.emptyMap());
11780
keys.entrySet()
11881
.stream()
11982
.filter(entry ->
@@ -122,11 +85,10 @@ public Map<String, Object> getValues(Map<String, Object> settingMap, List<String
12285
&& !ignoreKeyList.contains(entry.getKey().toLowerCase())
12386
)
12487
.forEach(entry -> finalMap.put(entry.getKey(), entry.getValue()));
125-
if (!variableMap.isEmpty()) {
126-
finalMap.replaceAll((s, o) -> replaceVariables(o, variableMap));
127-
}
88+
return variableMap.isEmpty()
89+
? finalMap
90+
: MapUtils.castOptionalStringObjectMap(MapTemplate.apply(finalMap, variableMap), false).orElse(Collections.emptyMap());
12891

129-
return finalMap;
13092
}
13193

13294
/**
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package me.hsgamer.bettergui.util;
2+
3+
import java.util.*;
4+
import java.util.concurrent.ConcurrentMap;
5+
import java.util.stream.Collectors;
6+
import java.util.stream.Stream;
7+
8+
public class MapTemplate {
9+
public static final String START_VARIABLE = "{";
10+
public static final String END_VARIABLE = "}";
11+
12+
private static Object getVariableValue(String string, Map<String, Object> variableMap) {
13+
int startVariableIndex = string.indexOf(START_VARIABLE);
14+
int endVariableIndex = string.lastIndexOf(END_VARIABLE);
15+
if (startVariableIndex != 0 || endVariableIndex != string.length() - END_VARIABLE.length()) {
16+
return null;
17+
}
18+
String variable = string.substring(startVariableIndex + START_VARIABLE.length(), endVariableIndex);
19+
Object variableValue = variableMap.get(variable);
20+
if (variableValue == null) {
21+
return null;
22+
}
23+
return apply(variableValue, variableMap);
24+
}
25+
26+
public static Collection<?> apply(Collection<?> collection, Map<String, Object> variableMap) {
27+
Stream<Object> stream = collection.stream()
28+
.flatMap(obj -> {
29+
if (!(obj instanceof String)) {
30+
return Stream.of(obj);
31+
}
32+
String string = (String) obj;
33+
Object variableValue = getVariableValue(string, variableMap);
34+
if (variableValue == null) {
35+
return Stream.of(obj);
36+
}
37+
if (variableValue instanceof Collection) {
38+
return ((Collection<?>) variableValue).stream();
39+
}
40+
return Stream.of(variableValue);
41+
});
42+
if (collection instanceof List) {
43+
return stream.collect(Collectors.toList());
44+
} else if (collection instanceof Set) {
45+
return stream.collect(Collectors.toSet());
46+
} else {
47+
return stream.collect(Collectors.toCollection(ArrayList::new));
48+
}
49+
}
50+
51+
public static Map<?, ?> apply(Map<?, ?> map, Map<String, Object> variableMap) {
52+
Stream<Map.Entry<?, ?>> stream = map.entrySet().stream()
53+
.flatMap(entry -> {
54+
Object key = entry.getKey();
55+
if (!(key instanceof String)) {
56+
return Stream.of(new AbstractMap.SimpleEntry<>(key, apply(entry.getValue(), variableMap)));
57+
}
58+
String string = (String) key;
59+
Object variableValue = getVariableValue(string, variableMap);
60+
if (variableValue == null) {
61+
return Stream.of(new AbstractMap.SimpleEntry<>(key, apply(entry.getValue(), variableMap)));
62+
}
63+
if (variableValue instanceof Map) {
64+
return ((Map<?, ?>) variableValue).entrySet().stream();
65+
}
66+
return Stream.empty();
67+
});
68+
if (map instanceof ConcurrentMap) {
69+
return stream.collect(Collectors.toConcurrentMap(Map.Entry::getKey, Map.Entry::getValue));
70+
} else if (map instanceof LinkedHashMap) {
71+
return stream.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new));
72+
} else {
73+
return stream.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a));
74+
}
75+
}
76+
77+
public static Object apply(Object obj, Map<String, Object> variableMap) {
78+
if (variableMap == null || variableMap.isEmpty()) {
79+
return obj;
80+
}
81+
if (obj instanceof Collection) {
82+
return apply((Collection<?>) obj, variableMap);
83+
}
84+
if (obj instanceof Map) {
85+
return apply((Map<?, ?>) obj, variableMap);
86+
}
87+
if (obj instanceof String) {
88+
String result = (String) obj;
89+
StringBuilder sb = new StringBuilder(result);
90+
for (Map.Entry<String, Object> entry : variableMap.entrySet()) {
91+
String placeholder = START_VARIABLE + entry.getKey() + END_VARIABLE;
92+
String replacement = Objects.toString(entry.getValue());
93+
int index;
94+
while ((index = sb.indexOf(placeholder)) != -1) {
95+
sb.replace(index, index + placeholder.length(), replacement);
96+
}
97+
}
98+
return sb.toString();
99+
}
100+
return obj;
101+
}
102+
}

0 commit comments

Comments
 (0)