Skip to content

Commit 89832fd

Browse files
committed
Added another Service Interface -> IModuleConfigurator
1 parent aa05655 commit 89832fd

File tree

9 files changed

+83
-16
lines changed

9 files changed

+83
-16
lines changed

src/main/java/module-info.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
requires java.scripting;
44

55
opens org.mangorage.bootstrap;
6-
exports org.mangorage.bootstrap.api;
6+
exports org.mangorage.bootstrap.api.transformer;
7+
exports org.mangorage.bootstrap.api.module;
78

8-
uses org.mangorage.bootstrap.api.IClassTransformer;
9+
uses org.mangorage.bootstrap.api.transformer.IClassTransformer;
10+
uses org.mangorage.bootstrap.api.module.IModuleConfigurator;
911
}

src/main/java/org/mangorage/bootstrap/Bootstrap.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
public final class Bootstrap {
1717

18+
// --launchProfile mangobot
1819
public static void main(String[] args) throws IOException {
1920

2021
final var librariesPath = Path.of("libraries");
@@ -48,7 +49,7 @@ public static void main(String[] args) throws IOException {
4849

4950
Thread.currentThread().setContextClassLoader(moduleCl);
5051

51-
moduleCl.loadTransformers();
52+
moduleCl.load();
5253

5354
callMain("org.mangorage.entrypoint.MangoBotCore", args, moduleLayer.findModule("org.mangorage.mangobotcore").get());
5455
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.mangorage.bootstrap.api.module;
2+
3+
import java.util.List;
4+
5+
public interface IModuleConfigurator {
6+
List<String> getChildren(String module);
7+
}

src/main/java/org/mangorage/bootstrap/api/IClassTransformer.java renamed to src/main/java/org/mangorage/bootstrap/api/transformer/IClassTransformer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.mangorage.bootstrap.api;
1+
package org.mangorage.bootstrap.api.transformer;
22

33
public interface IClassTransformer {
44
TransformResult transform(String className, byte[] classData);

src/main/java/org/mangorage/bootstrap/api/TransformResult.java renamed to src/main/java/org/mangorage/bootstrap/api/transformer/TransformResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
package org.mangorage.bootstrap.api;
1+
package org.mangorage.bootstrap.api.transformer;
22

33
public record TransformResult(byte[] classData, TransformerFlag flag) {}

src/main/java/org/mangorage/bootstrap/api/TransformerFlag.java renamed to src/main/java/org/mangorage/bootstrap/api/transformer/TransformerFlag.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.mangorage.bootstrap.api;
1+
package org.mangorage.bootstrap.api.transformer;
22

33
public enum TransformerFlag {
44
NO_REWRITE,

src/main/java/org/mangorage/bootstrap/internal/ClassTransformers.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.mangorage.bootstrap.internal;
22

3-
import org.mangorage.bootstrap.api.IClassTransformer;
4-
import org.mangorage.bootstrap.api.TransformResult;
5-
import org.mangorage.bootstrap.api.TransformerFlag;
3+
import org.mangorage.bootstrap.api.transformer.IClassTransformer;
4+
import org.mangorage.bootstrap.api.transformer.TransformResult;
5+
import org.mangorage.bootstrap.api.transformer.TransformerFlag;
66

77
import java.io.IOException;
88
import java.util.ArrayList;

src/main/java/org/mangorage/bootstrap/internal/LoadedModule.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,22 @@
33
import java.io.IOException;
44
import java.lang.module.ModuleReader;
55
import java.lang.module.ModuleReference;
6+
import java.net.URI;
67
import java.security.CodeSigner;
78
import java.security.CodeSource;
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
import java.util.Optional;
12+
import java.util.stream.Stream;
13+
14+
public final class LoadedModule implements ModuleReader {
15+
private final List<LoadedModule> children = new ArrayList<>();
816

9-
public final class LoadedModule {
1017
private final ModuleReference moduleReference;
1118
private final ModuleReader moduleReader;
1219
private final CodeSource codeSource;
1320

21+
1422
LoadedModule(ModuleReference moduleReference) throws IOException {
1523
this.moduleReference = moduleReference;
1624
this.moduleReader = moduleReference.open();
@@ -28,4 +36,32 @@ ModuleReader getModuleReader() {
2836
CodeSource getCodeSource() {
2937
return codeSource;
3038
}
39+
40+
void addChild(LoadedModule module) {
41+
this.children.add(module);
42+
}
43+
44+
@Override
45+
public Optional<URI> find(String name) throws IOException {
46+
final var optional = getModuleReader().find(name);
47+
if (optional.isPresent()) return optional;
48+
49+
for (LoadedModule child : children) {
50+
final var optionalChild = child.getModuleReader().find(name);
51+
if (optionalChild.isPresent())
52+
return optionalChild;
53+
}
54+
55+
return Optional.empty();
56+
}
57+
58+
@Override
59+
public Stream<String> list() throws IOException {
60+
return Stream.empty();
61+
}
62+
63+
@Override
64+
public void close() throws IOException {
65+
66+
}
3167
}

src/main/java/org/mangorage/bootstrap/internal/MangoLoader.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.mangorage.bootstrap.internal;
22

3-
import org.mangorage.bootstrap.api.IClassTransformer;
3+
import org.mangorage.bootstrap.api.module.IModuleConfigurator;
4+
import org.mangorage.bootstrap.api.transformer.IClassTransformer;
45

56
import java.io.IOException;
67
import java.lang.module.ModuleReader;
@@ -44,14 +45,37 @@ public MangoLoader(URL[] urls, Set<ResolvedModule> modules, ClassLoader parent)
4445
});
4546
}
4647

47-
public void loadTransformers() {
48+
public void load() {
49+
loadTransformers();
50+
loadModuleConfiguration();
51+
}
52+
53+
void loadTransformers() {
4854
ServiceLoader.load(IClassTransformer.class)
4955
.stream()
5056
.forEach(provider -> {
5157
transformers.add(provider.get());
5258
});
5359
}
5460

61+
void loadModuleConfiguration() {
62+
ServiceLoader.load(IModuleConfigurator.class)
63+
.stream()
64+
.forEach(provider -> {
65+
final var configurator = provider.get();
66+
67+
moduleMap.forEach((id, module) -> {
68+
final var children = configurator.getChildren(id);
69+
70+
children
71+
.stream()
72+
.filter(moduleMap::containsKey)
73+
.map(moduleMap::get)
74+
.forEach(module::addChild);
75+
});
76+
});
77+
}
78+
5579
@Override
5680
protected Class<?> findClass(String name) throws ClassNotFoundException {
5781
if (transformers == null || transformers.isEmpty())
@@ -94,14 +118,12 @@ private Class<?> defineClass(String name, byte[] bytes) {
94118
return super.defineClass(name, bytes, 0, bytes.length);
95119
}
96120

97-
98-
99121
@Override
100122
protected URL findResource(String moduleName, String name) throws IOException {
101123
final var loadedModule = moduleMap.get(moduleName);
102124

103125
if (loadedModule != null) {
104-
final var uri = loadedModule.getModuleReader().find(name);
126+
final var uri = loadedModule.find(name);
105127
if (uri.isPresent())
106128
return uri.get().toURL();
107129
}
@@ -168,5 +190,4 @@ private String packageName(String cn) {
168190
int pos = cn.lastIndexOf('.');
169191
return (pos < 0) ? "" : cn.substring(0, pos);
170192
}
171-
172193
}

0 commit comments

Comments
 (0)