From e340fb0d2ad2fc88374c26e765f5dc983f6634ac Mon Sep 17 00:00:00 2001 From: michaeloffner Date: Tue, 16 Jul 2024 10:28:07 +0200 Subject: [PATCH] add initial version of MavenClassLoader --- .../commons/io/res/util/MavenClassLoader.java | 25 ++++++++++++ .../io/res/util/ResourceClassLoader.java | 2 +- core/src/main/java/lucee/runtime/mvn/POM.java | 38 +++++++++++++++++-- 3 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/lucee/commons/io/res/util/MavenClassLoader.java diff --git a/core/src/main/java/lucee/commons/io/res/util/MavenClassLoader.java b/core/src/main/java/lucee/commons/io/res/util/MavenClassLoader.java new file mode 100644 index 0000000000..ddf9b859c6 --- /dev/null +++ b/core/src/main/java/lucee/commons/io/res/util/MavenClassLoader.java @@ -0,0 +1,25 @@ +package lucee.commons.io.res.util; + +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import lucee.runtime.mvn.POM; + +public class MavenClassLoader extends ResourceClassLoader { + + private static Map instances = new ConcurrentHashMap<>(); + + public MavenClassLoader(POM pom, ClassLoader parent) throws IOException { + super(pom.getJars(), parent); + } + + public static MavenClassLoader getInstance(POM pom, ClassLoader parent) throws IOException { + MavenClassLoader mcl = instances.get(pom.hash()); + if (mcl == null) { + mcl = new MavenClassLoader(pom, parent); + instances.put(pom.hash(), mcl); + } + return mcl; + } +} diff --git a/core/src/main/java/lucee/commons/io/res/util/ResourceClassLoader.java b/core/src/main/java/lucee/commons/io/res/util/ResourceClassLoader.java index a9957c46f3..cfed5ab7ba 100755 --- a/core/src/main/java/lucee/commons/io/res/util/ResourceClassLoader.java +++ b/core/src/main/java/lucee/commons/io/res/util/ResourceClassLoader.java @@ -38,7 +38,7 @@ /** * Classloader that load classes from resources */ -public final class ResourceClassLoader extends URLClassLoader implements Closeable { +public class ResourceClassLoader extends URLClassLoader implements Closeable { private List resources = new ArrayList(); private Map> customCLs; diff --git a/core/src/main/java/lucee/runtime/mvn/POM.java b/core/src/main/java/lucee/runtime/mvn/POM.java index 19d6f673d5..76b921cee6 100644 --- a/core/src/main/java/lucee/runtime/mvn/POM.java +++ b/core/src/main/java/lucee/runtime/mvn/POM.java @@ -37,9 +37,9 @@ public class POM { public static final int SCOPE_ALL = SCOPE_NOT_TEST + SCOPE_TEST; private Resource localDirectory; - private String groupId; - private String artifactId; - private String version; + private final String groupId; + private final String artifactId; + private final String version; private String scope; private String optional; private int dependencyScope = SCOPE_ALL; @@ -76,6 +76,8 @@ public class POM { private String artifactExtension; + private String hash; + public static POM getInstance(Resource localDirectory, String groupId, String version, String artifactId, Log log) { return getInstance(localDirectory, null, groupId, artifactId, version, null, null, SCOPE_NOT_TEST, SCOPE_ALL, log); } @@ -323,7 +325,14 @@ private StringBuilder _hash(StringBuilder sb) throws IOException { } public String hash() throws IOException { - return HashUtil.create64BitHashAsString(_hash(new StringBuilder())); + if (hash == null) { + synchronized (groupId) { + if (hash == null) { + hash = HashUtil.create64BitHashAsString(_hash(new StringBuilder())); + } + } + } + return hash; } Resource getArtifact(String type) { @@ -514,4 +523,25 @@ private static TreeNode getParents(POM pom, TreeNode parents) throws I } return parents; } + + public Resource[] getJars() throws IOException { + List jars = new ArrayList<>(); + + // current + if ("jar".equalsIgnoreCase(this.artifactExtension)) { + Resource r = getArtifact(); + if (r != null) jars.add(r); + } + + List dependencies = getAllDependencies(); + if (dependencies != null) { + for (POM p: dependencies) { + if ("jar".equalsIgnoreCase(p.artifactExtension)) { + Resource r = p.getArtifact(); + if (r != null) jars.add(r); + } + } + } + return jars.toArray(new Resource[jars.size()]); + } }