3
0
Mirror von https://github.com/PaperMC/Velocity.git synchronisiert 2024-12-27 00:23:19 +01:00
Realized that the precondition that gets violated happens way too early, in `Maps.uniqueIndex()`.
Dieser Commit ist enthalten in:
Andrew Steinborn 2024-07-05 22:07:15 -04:00
Ursprung 6224adf70a
Commit 5154f02910

Datei anzeigen

@ -86,43 +86,45 @@ public class VelocityPluginManager implements PluginManager {
checkNotNull(directory, "directory"); checkNotNull(directory, "directory");
checkArgument(directory.toFile().isDirectory(), "provided path isn't a directory"); checkArgument(directory.toFile().isDirectory(), "provided path isn't a directory");
List<PluginDescription> found = new ArrayList<>(); Map<String, PluginDescription> foundCandidates = new LinkedHashMap<>();
JavaPluginLoader loader = new JavaPluginLoader(server, directory); JavaPluginLoader loader = new JavaPluginLoader(server, directory);
try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory, try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory,
p -> p.toFile().isFile() && p.toString().endsWith(".jar"))) { p -> p.toFile().isFile() && p.toString().endsWith(".jar"))) {
for (Path path : stream) { for (Path path : stream) {
try { try {
found.add(loader.loadCandidate(path)); PluginDescription candidate = loader.loadCandidate(path);
// If we found a duplicate candidate (with the same ID), don't load it.
PluginDescription maybeExistingCandidate = foundCandidates.putIfAbsent(
candidate.getId(), candidate);
if (maybeExistingCandidate != null) {
logger.error("Refusing to load plugin at path {} since we already "
+ "loaded a plugin with the same ID {} from {}",
candidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"),
candidate.getId(),
maybeExistingCandidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"));
}
} catch (Throwable e) { } catch (Throwable e) {
logger.error("Unable to load plugin {}", path, e); logger.error("Unable to load plugin {}", path, e);
} }
} }
} }
if (found.isEmpty()) { if (foundCandidates.isEmpty()) {
// No plugins found // No plugins found
return; return;
} }
List<PluginDescription> sortedPlugins = PluginDependencyUtils.sortCandidates(found); List<PluginDescription> sortedPlugins = PluginDependencyUtils.sortCandidates(
new ArrayList<>(foundCandidates.values()));
Map<String, PluginDescription> loadedCandidates = new HashMap<>(); Map<String, PluginDescription> loadedCandidates = new HashMap<>();
Map<PluginContainer, Module> pluginContainers = new LinkedHashMap<>(); Map<PluginContainer, Module> pluginContainers = new LinkedHashMap<>();
// Now load the plugins // Now load the plugins
pluginLoad: pluginLoad:
for (PluginDescription candidate : sortedPlugins) { for (PluginDescription candidate : sortedPlugins) {
// If we found a duplicate candidate (with the same ID), don't load it.
PluginDescription existingCandidate = loadedCandidates.get(candidate.getId());
if (existingCandidate != null) {
logger.error("Refusing to load plugin at path {} since we already "
+ "loaded a plugin with the same ID {} from {}",
candidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"),
candidate.getId(),
existingCandidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"));
continue;
}
// Verify dependencies // Verify dependencies
for (PluginDependency dependency : candidate.getDependencies()) { for (PluginDependency dependency : candidate.getDependencies()) {
if (!dependency.isOptional() && !loadedCandidates.containsKey(dependency.getId())) { if (!dependency.isOptional() && !loadedCandidates.containsKey(dependency.getId())) {