|
1 | 1 | package net.blay09.mods.balm.common.proxy; |
2 | 2 |
|
3 | 3 | import net.blay09.mods.balm.api.proxy.ModProxy; |
| 4 | +import net.minecraft.resources.ResourceLocation; |
4 | 5 | import org.jetbrains.annotations.Nullable; |
| 6 | +import org.slf4j.Logger; |
| 7 | +import org.slf4j.LoggerFactory; |
5 | 8 |
|
6 | 9 | import java.lang.reflect.InvocationTargetException; |
7 | 10 | import java.util.ArrayList; |
8 | 11 | import java.util.List; |
9 | 12 | import java.util.Optional; |
10 | 13 | import java.util.function.Function; |
11 | 14 | import java.util.function.Supplier; |
12 | | -import java.util.stream.Collectors; |
13 | 15 |
|
14 | 16 | public class ModProxyImpl<T> implements ModProxy<T> { |
15 | 17 |
|
| 18 | + private final Logger logger = LoggerFactory.getLogger(ModProxyImpl.class); |
| 19 | + |
16 | 20 | private final Function<String, Optional<String>> modVersionProvider; |
17 | 21 | private final List<ModEntry<T>> proxies = new ArrayList<>(); |
| 22 | + private final @Nullable ResourceLocation identifier; |
18 | 23 | @Nullable |
19 | 24 | private Function<List<T>, T> multiplexer; |
20 | 25 | private @Nullable T fallback; |
21 | 26 |
|
22 | 27 | public ModProxyImpl(Function<String, Optional<String>> modVersionProvider) { |
| 28 | + this(modVersionProvider, null); |
| 29 | + } |
| 30 | + |
| 31 | + public ModProxyImpl(Function<String, Optional<String>> modVersionProvider, @Nullable ResourceLocation identifier) { |
23 | 32 | this.modVersionProvider = modVersionProvider; |
| 33 | + this.identifier = identifier; |
24 | 34 | } |
25 | 35 |
|
26 | 36 | @Override |
@@ -60,14 +70,40 @@ public ModProxy<T> withFallback(T fallback) { |
60 | 70 | public T build() { |
61 | 71 | final var applicableProxies = proxies.stream().filter(this::isApplicable).toList(); |
62 | 72 | if (multiplexer != null && applicableProxies.size() > 1) { |
63 | | - return multiplexer.apply(applicableProxies.stream().map(ModEntry::proxy).map(Supplier::get).collect(Collectors.toList())); |
| 73 | + final var effectiveProxies = new ArrayList<T>(); |
| 74 | + for (final var applicableProxy : applicableProxies) { |
| 75 | + try { |
| 76 | + effectiveProxies.add(applicableProxy.proxy.get()); |
| 77 | + } catch (Exception e) { |
| 78 | + logger.error("Failed to instantiate proxy", e); |
| 79 | + } |
| 80 | + } |
| 81 | + if (effectiveProxies.size() > 1) { |
| 82 | + final var proxy = multiplexer.apply(effectiveProxies); |
| 83 | + logger.info("Mod proxy {} resolved as {}", identifier != null ? identifier : "<unnamed>", proxy); |
| 84 | + return proxy; |
| 85 | + } |
| 86 | + final var proxy = effectiveProxies.get(0); |
| 87 | + logger.info("Mod proxy {} resolved as {}", identifier != null ? identifier : "<unnamed>", proxy); |
| 88 | + return proxy; |
64 | 89 | } |
65 | 90 |
|
66 | | - if (applicableProxies.isEmpty()) { |
67 | | - return fallback; |
| 91 | + for (final var applicableProxy : applicableProxies) { |
| 92 | + try { |
| 93 | + final var proxy = applicableProxy.proxy.get(); |
| 94 | + logger.info("Mod proxy {} resolved as {}", identifier != null ? identifier : "<unnamed>", proxy); |
| 95 | + return proxy; |
| 96 | + } catch (Exception e) { |
| 97 | + logger.error("Failed to instantiate proxy {}", identifier != null ? identifier : "<unnamed>", e); |
| 98 | + } |
68 | 99 | } |
69 | 100 |
|
70 | | - return applicableProxies.get(0).proxy().get(); |
| 101 | + if (fallback != null) { |
| 102 | + logger.info("Mod proxy {} resolved as {}", identifier != null ? identifier : "<unnamed>", fallback); |
| 103 | + } else { |
| 104 | + logger.warn("No applicable proxy found for {}", identifier != null ? identifier : "<unnamed>"); |
| 105 | + } |
| 106 | + return fallback; |
71 | 107 | } |
72 | 108 |
|
73 | 109 | private boolean isApplicable(ModEntry<T> proxy) { |
|
0 commit comments