Skip to content

Commit 9e0872e

Browse files
committed
Fixed it up abit...
1 parent fce1347 commit 9e0872e

File tree

5 files changed

+70
-64
lines changed

5 files changed

+70
-64
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ plugins {
2525
apply plugin: 'maven-publish'
2626

2727
group = 'org.mangorage'
28-
version = getLatestGitTag() + "." + getLatestGitVersion()
28+
version = getLatestGitTag() + "." + getLatestGitVersion() + "-beta"
2929

3030
println("Version -> " + version)
3131

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static void main(String[] args) throws IOException {
3030
JarHandler.safeHandle(Path.of("libraries"), Path.of("sorted-libraries"));
3131

3232
List<Path> deleteFiles = List.of(
33-
Path.of("sorted-libraries").resolve("okio-jvm-3.6.0.jar")
33+
Path.of("sorted-libraries").resolve("okio-3.6.0.jar")
3434
);
3535

3636
for (Path deleteFile : deleteFiles) {

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

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@
44
import org.mangorage.bootstrap.api.transformer.TransformResult;
55
import org.mangorage.bootstrap.api.transformer.TransformerFlag;
66

7-
import java.io.IOException;
8-
import java.util.ArrayList;
9-
import java.util.HashMap;
107
import java.util.List;
118
import java.util.Map;
9+
import java.util.concurrent.ConcurrentHashMap;
10+
import java.util.concurrent.CopyOnWriteArrayList;
1211
import java.util.concurrent.atomic.AtomicReference;
1312

1413
public final class ClassTransformers {
15-
private final Map<String, Class<?>> classes = new HashMap<>(); // Transformed Class's
16-
private final List<IClassTransformer> transformers = new ArrayList<>(); // Transformer's
14+
private final Map<String, Class<?>> classes = new ConcurrentHashMap<>();
15+
private final List<IClassTransformer> transformers = new CopyOnWriteArrayList<>(); // Transformer's
1716
private final ClassLoader loader;
1817

1918
public ClassTransformers(ClassLoader loader) {
@@ -32,28 +31,13 @@ public boolean isEmpty() {
3231
return transformers.isEmpty();
3332
}
3433

35-
private byte[] getClassBytes(String clazz) {
36-
try {
37-
String className = clazz.replace('.', '/');
38-
String classFileName = className + ".class";
34+
public byte[] transform(String name, byte[] classData) {;
3935

40-
try (var is = loader.getResourceAsStream(classFileName)) {
41-
if (is != null) return is.readAllBytes();
42-
}
43-
} catch (IOException e) {
44-
return null;
45-
}
46-
return null;
47-
}
48-
49-
public byte[] transform(String name) {
50-
byte[] originalClassData = getClassBytes(name);
51-
52-
AtomicReference<TransformResult> result = new AtomicReference<>(TransformerFlag.NO_REWRITE.of(originalClassData));
36+
AtomicReference<TransformResult> result = new AtomicReference<>(TransformerFlag.NO_REWRITE.of(classData));
5337
AtomicReference<IClassTransformer> _transformer = new AtomicReference<>();
5438

5539
for (IClassTransformer transformer : transformers) {
56-
result.set(transformer.transform(name, originalClassData));
40+
result.set(transformer.transform(name, classData));
5741
if (result.get().flag() != TransformerFlag.NO_REWRITE) {
5842
_transformer.set(transformer);
5943
break;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ void addChild(LoadedModule module) {
4141
this.children.add(module);
4242
}
4343

44+
String name() {
45+
return getModuleReference().descriptor().name();
46+
}
47+
4448
@Override
4549
public Optional<URI> find(String name) throws IOException {
4650
final var optional = getModuleReader().find(name);

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

Lines changed: 57 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import java.net.URL;
1010
import java.net.URLClassLoader;
1111
import java.nio.ByteBuffer;
12-
import java.util.HashMap;
1312
import java.util.Map;
1413
import java.util.ServiceLoader;
1514
import java.util.Set;
15+
import java.util.concurrent.ConcurrentHashMap;
1616

1717
public final class MangoLoader extends URLClassLoader {
1818

@@ -21,8 +21,10 @@ public final class MangoLoader extends URLClassLoader {
2121
}
2222

2323
private ClassTransformers transformers = new ClassTransformers(this);
24-
private final Map<String, LoadedModule> moduleMap = new HashMap<>();
25-
private final Map<String, LoadedModule> localPackageToModule = new HashMap<>();
24+
private final Map<String, LoadedModule> moduleMap = new ConcurrentHashMap<>();
25+
private final Map<String, LoadedModule> localPackageToModule = new ConcurrentHashMap<>();
26+
27+
2628

2729
public MangoLoader(URL[] urls, Set<ResolvedModule> modules, ClassLoader parent) {
2830
super(urls, parent);
@@ -76,46 +78,39 @@ void loadModuleConfiguration() {
7678
});
7779
}
7880

81+
/**
82+
* Loads the class with the specified binary name.
83+
*/
7984
@Override
80-
protected Class<?> findClass(String name) throws ClassNotFoundException {
81-
if (transformers == null || transformers.isEmpty())
82-
return super.findClass(name);
85+
protected Class<?> loadClass(String cn, boolean resolve) throws ClassNotFoundException
86+
{
8387

84-
if (transformers.containsClass(name))
85-
return transformers.getClazz(name);
88+
synchronized (getClassLoadingLock(cn)) {
89+
// check if already loaded
90+
Class<?> c = findLoadedClass(cn);
8691

87-
byte[] originalBytes = getClassBytes(name);
92+
if (c == null) {
8893

89-
if (originalBytes == null) {
90-
throw new ClassNotFoundException("Failed to load original class bytes for " + name);
91-
}
94+
LoadedModule loadedModule = findLoadedModule(cn);
9295

93-
byte[] arr = transformers.transform(name);
94-
if (arr != null) {
95-
Class<?> clz = defineClass(name, arr);
96-
transformers.add(name, clz);
97-
return clz;
98-
}
96+
if (loadedModule != null) {
9997

100-
return super.findClass(name);
101-
}
98+
// class is in module defined to this class loader
99+
c = defineClass(cn, loadedModule);
102100

103-
private byte[] getClassBytes(String clazz) {
104-
try {
105-
String className = clazz.replace('.', '/');
106-
String classFileName = className + ".class";
107-
108-
try (var is = getResourceAsStream(classFileName)) {
109-
if (is != null) return is.readAllBytes();
101+
} else {
102+
return getParent().loadClass(cn);
103+
}
110104
}
111-
} catch (IOException e) {
112-
return null;
113-
}
114-
return null;
115-
}
116105

117-
private Class<?> defineClass(String name, byte[] bytes) {
118-
return super.defineClass(name, bytes, 0, bytes.length);
106+
if (c == null)
107+
throw new ClassNotFoundException(cn);
108+
109+
if (resolve)
110+
resolveClass(c);
111+
112+
return c;
113+
}
119114
}
120115

121116
@Override
@@ -131,6 +126,17 @@ protected URL findResource(String moduleName, String name) throws IOException {
131126
return null;
132127
}
133128

129+
@Override
130+
protected Class<?> findClass(String cn) throws ClassNotFoundException {
131+
Class<?> c = null;
132+
LoadedModule loadedModule = findLoadedModule(cn);
133+
if (loadedModule != null)
134+
c = defineClass(cn, loadedModule);
135+
if (c == null)
136+
throw new ClassNotFoundException(cn);
137+
return c;
138+
}
139+
134140
@Override
135141
protected Class<?> findClass(String moduleName, String name) {
136142
Class<?> c = null;
@@ -161,12 +167,24 @@ private Class<?> defineClass(String cn, LoadedModule loadedModule) {
161167
return null;
162168
}
163169

164-
try {
165-
return defineClass(cn, bb, loadedModule.getCodeSource());
166-
} finally {
167-
reader.release(bb);
168-
}
170+
if (transformers.containsClass(cn))
171+
return transformers.getClazz(cn);
169172

173+
byte[] classbytes = bb.array();
174+
175+
byte[] classBytesModified = transformers.transform(cn, classbytes);
176+
177+
if (classBytesModified != null) {
178+
Class<?> clz = defineClass(cn, classBytesModified, 0, classBytesModified.length, loadedModule.getCodeSource());
179+
transformers.add(cn, clz);
180+
return clz;
181+
} else {
182+
try {
183+
return defineClass(cn, bb, loadedModule.getCodeSource());
184+
} finally {
185+
reader.release(bb);
186+
}
187+
}
170188
} catch (IOException ioe) {
171189
// TBD on how I/O errors should be propagated
172190
return null;

0 commit comments

Comments
 (0)