From 6addd63396bed51e9a0f1e46bcbfb3d9153d4860 Mon Sep 17 00:00:00 2001 From: jglrxavpok Date: Thu, 4 Feb 2021 20:40:12 +0100 Subject: [PATCH] Fix extension subdependencies not being loaded + Test that J9 modules are supported --- build.gradle | 3 ++ .../server/extensions/ExtensionManager.java | 21 ++++++--- ...inestomCoreWithJava9ModuleOnClasspath.java | 43 +++++++++++++++++++ .../j9modules/extension.json | 14 ++++++ .../j9modules/mixins.minestomcore.json | 10 +++++ 5 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 src/test/java/improveextensions/MixinIntoMinestomCoreWithJava9ModuleOnClasspath.java create mode 100644 src/test/resources/improveextensions/j9modules/extension.json create mode 100644 src/test/resources/improveextensions/j9modules/mixins.minestomcore.json diff --git a/build.gradle b/build.gradle index 3585753cc..facce88d5 100644 --- a/build.gradle +++ b/build.gradle @@ -105,6 +105,9 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2' testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.6.2') + // Only here to ensure J9 module support for extensions and our classloaders + testCompileOnly "org.mockito:mockito-core:2.28.2" + // Netty api 'io.netty:netty-handler:4.1.58.Final' api 'io.netty:netty-codec:4.1.58.Final' diff --git a/src/main/java/net/minestom/server/extensions/ExtensionManager.java b/src/main/java/net/minestom/server/extensions/ExtensionManager.java index 1625d3d0a..3643d7660 100644 --- a/src/main/java/net/minestom/server/extensions/ExtensionManager.java +++ b/src/main/java/net/minestom/server/extensions/ExtensionManager.java @@ -2,6 +2,7 @@ package net.minestom.server.extensions; import com.google.gson.Gson; import net.minestom.dependencies.DependencyGetter; +import net.minestom.dependencies.ResolvedDependency; import net.minestom.dependencies.maven.MavenRepository; import net.minestom.server.MinecraftServer; import net.minestom.server.extras.selfmodification.MinestomExtensionClassLoader; @@ -402,13 +403,13 @@ public class ExtensionManager { for (var artifact : externalDependencies.artifacts) { var resolved = getter.get(artifact, dependenciesFolder); - addDependencyFile(resolved.getContentsLocation(), ext); + addDependencyFile(resolved, ext); LOGGER.trace("Dependency of extension {}: {}", ext.getName(), resolved); } for (var dependencyName : ext.getDependencies()) { var resolved = getter.get(dependencyName, dependenciesFolder); - addDependencyFile(resolved.getContentsLocation(), ext); + addDependencyFile(resolved, ext); LOGGER.trace("Dependency of extension {}: {}", ext.getName(), resolved); } } catch (Exception e) { @@ -420,9 +421,19 @@ public class ExtensionManager { } } - private void addDependencyFile(URL dependency, DiscoveredExtension extension) { - extension.files.add(dependency); - LOGGER.trace("Added dependency {} to extension {} classpath", dependency.toExternalForm(), extension.getName()); + private void addDependencyFile(ResolvedDependency dependency, DiscoveredExtension extension) { + URL location = dependency.getContentsLocation(); + extension.files.add(location); + LOGGER.trace("Added dependency {} to extension {} classpath", location.toExternalForm(), extension.getName()); + + // recurse to add full dependency tree + if(!dependency.getSubdependencies().isEmpty()) { + LOGGER.trace("Dependency {} has subdependencies, adding...", location.toExternalForm()); + for(ResolvedDependency sub : dependency.getSubdependencies()) { + addDependencyFile(sub, extension); + } + LOGGER.trace("Dependency {} has had its subdependencies added.", location.toExternalForm()); + } } /** diff --git a/src/test/java/improveextensions/MixinIntoMinestomCoreWithJava9ModuleOnClasspath.java b/src/test/java/improveextensions/MixinIntoMinestomCoreWithJava9ModuleOnClasspath.java new file mode 100644 index 000000000..2de1ba459 --- /dev/null +++ b/src/test/java/improveextensions/MixinIntoMinestomCoreWithJava9ModuleOnClasspath.java @@ -0,0 +1,43 @@ +package improveextensions; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.extensions.Extension; +import net.minestom.server.instance.InstanceContainer; +import net.minestom.server.world.DimensionType; +import org.junit.jupiter.api.Assertions; +import org.opentest4j.AssertionFailedError; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Extensions should be able to use Mixins for classes loaded very early by Minestom (InstanceContainer for instance) + */ +public class MixinIntoMinestomCoreWithJava9ModuleOnClasspath extends Extension { + + @Override + public void initialize() { + // use Mockito only to ensure J9 modules on the classpath are supported + List mockedList = mock(List.class); + when(mockedList.get(0)).thenReturn("Test"); + // force load of InstanceContainer class + InstanceContainer c = new InstanceContainer(UUID.randomUUID(), DimensionType.OVERWORLD, null); + System.out.println(c.toString()); + try { + Assertions.assertTrue(MixinIntoMinestomCore.success, "InstanceContainer must have been mixed in with improveextensions.InstanceContainerMixin"); + Assertions.assertEquals(1, MinecraftServer.getExtensionManager().getExtensionLoaders().size(), "Only one extension classloader (this extension's) must be active."); + Assertions.assertEquals("Test", mockedList.get(0)); + } catch (AssertionFailedError e) { + e.printStackTrace(); + } + MinecraftServer.stopCleanly(); + } + + @Override + public void terminate() { + getLogger().info("Terminate extension"); + } +} diff --git a/src/test/resources/improveextensions/j9modules/extension.json b/src/test/resources/improveextensions/j9modules/extension.json new file mode 100644 index 000000000..ba409d029 --- /dev/null +++ b/src/test/resources/improveextensions/j9modules/extension.json @@ -0,0 +1,14 @@ +{ + "entrypoint": "improveextensions.MixinIntoMinestomCoreWithJava9ModuleOnClasspath", + "name": "MixinIntoMinestomCoreWithJava9ModuleOnClasspath", + "codeModifiers": [], + "mixinConfig": "mixins.minestomcore.json", + "externalDependencies": { + "repositories": [ + {"name": "JCentral", "url": "https://jcenter.bintray.com/"} + ], + "artifacts": [ + "org.mockito:mockito-core:2.28.2" + ] + } +} \ No newline at end of file diff --git a/src/test/resources/improveextensions/j9modules/mixins.minestomcore.json b/src/test/resources/improveextensions/j9modules/mixins.minestomcore.json new file mode 100644 index 000000000..7c8c03fe2 --- /dev/null +++ b/src/test/resources/improveextensions/j9modules/mixins.minestomcore.json @@ -0,0 +1,10 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "improveextensions.mixins", + "target": "@env(DEFAULT)", + "compatibilityLevel": "JAVA_11", + "mixins": [ + "InstanceContainerMixin" + ] +} \ No newline at end of file