Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-12-25 15:50:19 +01:00
Clean up and clarify plugin loader logic.
Dieser Commit ist enthalten in:
Ursprung
0b0c36dcfc
Commit
6b2b28796b
@ -22,7 +22,6 @@ import com.google.common.base.Preconditions;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.velocitypowered.api.event.EventManager;
|
|
||||||
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
||||||
import com.velocitypowered.api.event.proxy.ProxyReloadEvent;
|
import com.velocitypowered.api.event.proxy.ProxyReloadEvent;
|
||||||
import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
|
import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
|
||||||
|
@ -43,7 +43,6 @@ import java.nio.file.Path;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
@ -58,7 +57,7 @@ public class VelocityPluginManager implements PluginManager {
|
|||||||
|
|
||||||
private static final Logger logger = LogManager.getLogger(VelocityPluginManager.class);
|
private static final Logger logger = LogManager.getLogger(VelocityPluginManager.class);
|
||||||
|
|
||||||
private final Map<String, PluginContainer> plugins = new LinkedHashMap<>();
|
private final Map<String, PluginContainer> pluginsById = new LinkedHashMap<>();
|
||||||
private final Map<Object, PluginContainer> pluginInstances = new IdentityHashMap<>();
|
private final Map<Object, PluginContainer> pluginInstances = new IdentityHashMap<>();
|
||||||
private final VelocityServer server;
|
private final VelocityServer server;
|
||||||
|
|
||||||
@ -67,7 +66,7 @@ public class VelocityPluginManager implements PluginManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void registerPlugin(PluginContainer plugin) {
|
private void registerPlugin(PluginContainer plugin) {
|
||||||
plugins.put(plugin.getDescription().getId(), plugin);
|
pluginsById.put(plugin.getDescription().getId(), plugin);
|
||||||
Optional<?> instance = plugin.getInstance();
|
Optional<?> instance = plugin.getInstance();
|
||||||
instance.ifPresent(o -> pluginInstances.put(o, plugin));
|
instance.ifPresent(o -> pluginInstances.put(o, plugin));
|
||||||
}
|
}
|
||||||
@ -90,7 +89,7 @@ public class VelocityPluginManager implements PluginManager {
|
|||||||
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.loadPluginDescription(path));
|
found.add(loader.loadCandidate(path));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("Unable to load plugin {}", path, e);
|
logger.error("Unable to load plugin {}", path, e);
|
||||||
}
|
}
|
||||||
@ -119,7 +118,7 @@ public class VelocityPluginManager implements PluginManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
PluginDescription realPlugin = loader.loadPlugin(candidate);
|
PluginDescription realPlugin = loader.createPluginFromCandidate(candidate);
|
||||||
VelocityPluginContainer container = new VelocityPluginContainer(realPlugin);
|
VelocityPluginContainer container = new VelocityPluginContainer(realPlugin);
|
||||||
pluginContainers.put(container, loader.createModule(container));
|
pluginContainers.put(container, loader.createModule(container));
|
||||||
loadedPluginsById.add(realPlugin.getId());
|
loadedPluginsById.add(realPlugin.getId());
|
||||||
@ -175,17 +174,17 @@ public class VelocityPluginManager implements PluginManager {
|
|||||||
@Override
|
@Override
|
||||||
public Optional<PluginContainer> getPlugin(String id) {
|
public Optional<PluginContainer> getPlugin(String id) {
|
||||||
checkNotNull(id, "id");
|
checkNotNull(id, "id");
|
||||||
return Optional.ofNullable(plugins.get(id));
|
return Optional.ofNullable(pluginsById.get(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<PluginContainer> getPlugins() {
|
public Collection<PluginContainer> getPlugins() {
|
||||||
return Collections.unmodifiableCollection(plugins.values());
|
return Collections.unmodifiableCollection(pluginsById.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLoaded(String id) {
|
public boolean isLoaded(String id) {
|
||||||
return plugins.containsKey(id);
|
return pluginsById.containsKey(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -27,9 +27,23 @@ import java.nio.file.Path;
|
|||||||
*/
|
*/
|
||||||
public interface PluginLoader {
|
public interface PluginLoader {
|
||||||
|
|
||||||
PluginDescription loadPluginDescription(Path source) throws Exception;
|
/**
|
||||||
|
* Loads a candidate description from the given {@code source}.
|
||||||
|
*
|
||||||
|
* @param source the source to load the candidate from
|
||||||
|
* @return a plugin candidate description
|
||||||
|
* @throws Exception if anything goes wrong
|
||||||
|
*/
|
||||||
|
PluginDescription loadCandidate(Path source) throws Exception;
|
||||||
|
|
||||||
PluginDescription loadPlugin(PluginDescription source) throws Exception;
|
/**
|
||||||
|
* Materializes a "real" plugin description from the given {@code candidate}.
|
||||||
|
*
|
||||||
|
* @param candidate the candidate to materialize
|
||||||
|
* @return a plugin description
|
||||||
|
* @throws Exception if anything goes wrong
|
||||||
|
*/
|
||||||
|
PluginDescription createPluginFromCandidate(PluginDescription candidate) throws Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link Module} for the provided {@link PluginContainer}
|
* Creates a {@link Module} for the provided {@link PluginContainer}
|
||||||
|
@ -57,7 +57,7 @@ public class JavaPluginLoader implements PluginLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PluginDescription loadPluginDescription(Path source) throws Exception {
|
public PluginDescription loadCandidate(Path source) throws Exception {
|
||||||
Optional<SerializedPluginDescription> serialized = getSerializedPluginInfo(source);
|
Optional<SerializedPluginDescription> serialized = getSerializedPluginInfo(source);
|
||||||
|
|
||||||
if (!serialized.isPresent()) {
|
if (!serialized.isPresent()) {
|
||||||
@ -73,20 +73,20 @@ public class JavaPluginLoader implements PluginLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PluginDescription loadPlugin(PluginDescription source) throws Exception {
|
public PluginDescription createPluginFromCandidate(PluginDescription candidate) throws Exception {
|
||||||
if (!(source instanceof JavaVelocityPluginDescriptionCandidate)) {
|
if (!(candidate instanceof JavaVelocityPluginDescriptionCandidate)) {
|
||||||
throw new IllegalArgumentException("Description provided isn't of the Java plugin loader");
|
throw new IllegalArgumentException("Description provided isn't of the Java plugin loader");
|
||||||
}
|
}
|
||||||
|
|
||||||
URL pluginJarUrl = source.getSource().get().toUri().toURL();
|
URL pluginJarUrl = candidate.getSource().get().toUri().toURL();
|
||||||
PluginClassLoader loader = AccessController.doPrivileged(
|
PluginClassLoader loader = AccessController.doPrivileged(
|
||||||
(PrivilegedAction<PluginClassLoader>) () -> new PluginClassLoader(new URL[]{pluginJarUrl}));
|
(PrivilegedAction<PluginClassLoader>) () -> new PluginClassLoader(new URL[]{pluginJarUrl}));
|
||||||
loader.addToClassloaders();
|
loader.addToClassloaders();
|
||||||
|
|
||||||
JavaVelocityPluginDescriptionCandidate candidate =
|
JavaVelocityPluginDescriptionCandidate candidateInst =
|
||||||
(JavaVelocityPluginDescriptionCandidate) source;
|
(JavaVelocityPluginDescriptionCandidate) candidate;
|
||||||
Class mainClass = loader.loadClass(candidate.getMainClass());
|
Class mainClass = loader.loadClass(candidateInst.getMainClass());
|
||||||
return createDescription(candidate, mainClass);
|
return createDescription(candidateInst, mainClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren