Moved extension loader to kotlin
This commit is contained in:
@@ -1,138 +0,0 @@
|
||||
package com.willfp.eco.internal.extensions;
|
||||
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginDependent;
|
||||
import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.yaml.YamlTransientConfig;
|
||||
import com.willfp.eco.core.extensions.Extension;
|
||||
import com.willfp.eco.core.extensions.ExtensionLoader;
|
||||
import com.willfp.eco.core.extensions.ExtensionMetadata;
|
||||
import com.willfp.eco.core.extensions.MalformedExtensionException;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class EcoExtensionLoader extends PluginDependent<EcoPlugin> implements ExtensionLoader {
|
||||
private final Map<Extension, ClassLoader> extensions = new HashMap<>();
|
||||
|
||||
public EcoExtensionLoader(@NotNull final EcoPlugin plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadExtensions() {
|
||||
File dir = new File(this.getPlugin().getDataFolder(), "/extensions");
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs();
|
||||
}
|
||||
|
||||
File[] extensionJars = dir.listFiles();
|
||||
|
||||
if (extensionJars == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (File extensionJar : extensionJars) {
|
||||
if (!extensionJar.isFile()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
loadExtension(extensionJar);
|
||||
} catch (MalformedExtensionException e) {
|
||||
this.getPlugin().getLogger().warning(extensionJar.getName() + " caused an error!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void loadExtension(@NotNull final File extensionJar) throws MalformedExtensionException {
|
||||
URL url = null;
|
||||
try {
|
||||
url = extensionJar.toURI().toURL();
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
ClassLoader classLoader = new URLClassLoader(new URL[]{url}, this.getPlugin().getClass().getClassLoader());
|
||||
|
||||
InputStream ymlIn = classLoader.getResourceAsStream("extension.yml");
|
||||
|
||||
if (ymlIn == null) {
|
||||
throw new MalformedExtensionException("No extension.yml found in " + extensionJar.getName());
|
||||
}
|
||||
|
||||
Config extensionYml = new YamlTransientConfig(YamlConfiguration.loadConfiguration(new InputStreamReader(ymlIn)));
|
||||
|
||||
String mainClass = extensionYml.getStringOrNull("main");
|
||||
String name = extensionYml.getStringOrNull("name");
|
||||
String version = extensionYml.getStringOrNull("version");
|
||||
String author = extensionYml.getStringOrNull("author");
|
||||
|
||||
if (mainClass == null) {
|
||||
throw new MalformedExtensionException("Invalid extension.yml found in " + extensionJar.getName());
|
||||
}
|
||||
|
||||
if (name == null) {
|
||||
this.getPlugin().getLogger().warning(extensionJar.getName() + " doesn't have a name!");
|
||||
name = "Unnamed Extension " + extensionJar.getName();
|
||||
}
|
||||
|
||||
if (version == null) {
|
||||
this.getPlugin().getLogger().warning(extensionJar.getName() + " doesn't have a version!");
|
||||
version = "1.0.0";
|
||||
}
|
||||
|
||||
if (author == null) {
|
||||
this.getPlugin().getLogger().warning(extensionJar.getName() + " doesn't have an author!");
|
||||
author = "Unnamed Author";
|
||||
}
|
||||
|
||||
ExtensionMetadata metadata = new ExtensionMetadata(version, name, author);
|
||||
|
||||
Class<?> cls;
|
||||
Object object = null;
|
||||
try {
|
||||
cls = classLoader.loadClass(mainClass);
|
||||
object = cls.getConstructor(EcoPlugin.class).newInstance(this.getPlugin());
|
||||
} catch (ReflectiveOperationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (!(object instanceof Extension extension)) {
|
||||
throw new MalformedExtensionException(extensionJar.getName() + " is invalid");
|
||||
}
|
||||
|
||||
extension.setMetadata(metadata);
|
||||
extension.enable();
|
||||
extensions.put(extension, classLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unloadExtensions() {
|
||||
extensions.keySet().forEach(Extension::disable);
|
||||
for (ClassLoader loader : extensions.values()) {
|
||||
try {
|
||||
((URLClassLoader) loader).close();
|
||||
} catch (IOException e) {
|
||||
// Do nothing.
|
||||
}
|
||||
}
|
||||
extensions.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Extension> getLoadedExtensions() {
|
||||
return extensions.keySet();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package com.willfp.eco.internal.extensions;
|
||||
|
||||
import com.google.common.collect.ImmutableSet
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.PluginDependent
|
||||
import com.willfp.eco.core.config.yaml.YamlTransientConfig
|
||||
import com.willfp.eco.core.extensions.Extension
|
||||
import com.willfp.eco.core.extensions.ExtensionLoader
|
||||
import com.willfp.eco.core.extensions.ExtensionMetadata
|
||||
import com.willfp.eco.core.extensions.MalformedExtensionException
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
import java.io.File
|
||||
import java.io.InputStreamReader
|
||||
import java.net.MalformedURLException
|
||||
import java.net.URL
|
||||
import java.net.URLClassLoader
|
||||
|
||||
class EcoExtensionLoader(
|
||||
plugin: EcoPlugin
|
||||
) : PluginDependent<EcoPlugin>(plugin), ExtensionLoader {
|
||||
private val extensions: MutableMap<Extension, URLClassLoader> = HashMap();
|
||||
|
||||
override fun loadExtensions() {
|
||||
val dir = File(this.plugin.dataFolder, "/extensions")
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs()
|
||||
}
|
||||
|
||||
val extensionJars = dir.listFiles() ?: return
|
||||
|
||||
for (extensionJar in extensionJars) {
|
||||
if (!extensionJar.isFile) {
|
||||
continue
|
||||
}
|
||||
|
||||
try {
|
||||
loadExtension(extensionJar)
|
||||
} catch (e: MalformedExtensionException) {
|
||||
this.plugin.logger.warning(extensionJar.name + " caused an error!")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(MalformedExtensionException::class)
|
||||
private fun loadExtension(extensionJar: File) {
|
||||
lateinit var url : URL
|
||||
|
||||
try {
|
||||
url = extensionJar.toURI().toURL()
|
||||
} catch (e: MalformedURLException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
val classLoader = URLClassLoader(arrayOf(url), this.plugin::class.java.classLoader);
|
||||
val ymlIn = classLoader.getResourceAsStream("extension.yml")
|
||||
?: throw MalformedExtensionException ("No extension.yml found in " + extensionJar.name)
|
||||
|
||||
val extensionYml = YamlTransientConfig(YamlConfiguration.loadConfiguration(InputStreamReader(ymlIn)))
|
||||
|
||||
val mainClass = extensionYml.getStringOrNull("main")
|
||||
var name = extensionYml.getStringOrNull("name")
|
||||
var version = extensionYml.getStringOrNull("version")
|
||||
var author = extensionYml.getStringOrNull("author")
|
||||
|
||||
|
||||
if (mainClass == null) {
|
||||
throw MalformedExtensionException ("Invalid extension.yml found in " + extensionJar.name);
|
||||
}
|
||||
|
||||
if (name == null) {
|
||||
this.plugin.logger.warning(extensionJar.name + " doesn't have a name!");
|
||||
name = "Unnamed Extension " + extensionJar.name;
|
||||
}
|
||||
|
||||
if (version == null) {
|
||||
this.plugin.logger.warning(extensionJar.name + " doesn't have a version!");
|
||||
version = "1.0.0";
|
||||
}
|
||||
|
||||
if (author == null) {
|
||||
this.plugin.logger.warning(extensionJar.name + " doesn't have an author!");
|
||||
author = "Unnamed Author";
|
||||
}
|
||||
|
||||
val metadata = ExtensionMetadata(version, name, author)
|
||||
|
||||
val cls: Class<*> = classLoader.loadClass(mainClass)
|
||||
val extension: Extension = cls.getConstructor(EcoPlugin::class.java).newInstance(this.plugin) as Extension
|
||||
|
||||
extension.setMetadata(metadata)
|
||||
extension.enable()
|
||||
extensions[extension] = classLoader
|
||||
}
|
||||
|
||||
override fun getLoadedExtensions(): MutableSet<Extension> {
|
||||
return ImmutableSet.copyOf(extensions.keys)
|
||||
}
|
||||
|
||||
override fun unloadExtensions() {
|
||||
extensions.keys.forEach { e -> e.disable() }
|
||||
for (urlClassLoader in extensions.values) {
|
||||
urlClassLoader.close()
|
||||
}
|
||||
|
||||
extensions.clear()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user