Skip to content

Commit aa2f4f2

Browse files
committed
add back inner cl
1 parent 45335e8 commit aa2f4f2

File tree

2 files changed

+190
-5
lines changed

2 files changed

+190
-5
lines changed

src/main/java/com/cleanroommc/groovyscript/sandbox/CustomGroovyScriptEngine.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ List<CompiledScript> findScripts(Collection<File> files) {
164164
void loadScript(CompiledScript script) {
165165
if (script.requiresReload && !script.preprocessorCheckFailed) {
166166
Class<?> clazz = loadScriptClassInternal(new File(script.path), true);
167+
script.requiresReload = false;
167168
if (script.clazz == null) {
168169
// should not happen
169170
GroovyLog.get().errorMC("Class for {} was loaded, but didn't receive class created callback!", script.path);
@@ -405,6 +406,7 @@ private class ScriptClassLoader extends GroovyScriptClassLoader {
405406

406407
public ScriptClassLoader(ClassLoader loader, CompilerConfiguration config, Map<String, CompiledClass> cache) {
407408
super(loader, config, cache);
409+
init();
408410
}
409411

410412
@Override

src/main/java/com/cleanroommc/groovyscript/sandbox/GroovyScriptClassLoader.java

Lines changed: 188 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import groovy.lang.GroovyClassLoader;
44
import groovy.lang.GroovyCodeSource;
5+
import groovy.lang.GroovyResourceLoader;
56
import groovy.util.CharsetToolkit;
67
import groovyjarjarasm.asm.ClassVisitor;
78
import groovyjarjarasm.asm.ClassWriter;
@@ -12,17 +13,15 @@
1213
import org.codehaus.groovy.util.URLStreams;
1314
import org.jetbrains.annotations.Nullable;
1415

15-
import java.io.File;
16-
import java.io.IOException;
17-
import java.io.InputStreamReader;
18-
import java.io.UnsupportedEncodingException;
16+
import java.io.*;
1917
import java.net.MalformedURLException;
2018
import java.net.URISyntaxException;
2119
import java.net.URL;
2220
import java.net.URLDecoder;
2321
import java.security.CodeSource;
2422
import java.util.ArrayList;
2523
import java.util.Collection;
24+
import java.util.Enumeration;
2625
import java.util.Map;
2726
import java.util.function.BiConsumer;
2827

@@ -33,11 +32,18 @@ public abstract class GroovyScriptClassLoader extends GroovyClassLoader {
3332

3433
private final Map<String, CompiledClass> cache;
3534

35+
private GroovyScriptClassLoader(GroovyScriptClassLoader parent) {
36+
this(parent, parent.config, parent.cache);
37+
}
38+
3639
GroovyScriptClassLoader(ClassLoader parent, CompilerConfiguration config, Map<String, CompiledClass> cache) {
3740
super(parent, config, false);
3841
this.config = config;
3942
this.sourceEncoding = initSourceEncoding(config);
4043
this.cache = cache;
44+
}
45+
46+
protected void init() {
4147
setResourceLoader(this::loadResource);
4248
setShouldRecompile(false);
4349
}
@@ -297,7 +303,7 @@ private void definePackageInternal(String className) {
297303
* @return the ClassCollector
298304
*/
299305
protected ClassCollector createCustomCollector(CompilationUnit unit, SourceUnit su) {
300-
return new ClassCollector(this, unit, su);
306+
return new ClassCollector(new InnerLoader(this), unit, su);
301307
}
302308

303309
@Override
@@ -369,4 +375,181 @@ public ClassCollector creatClassCallback(BiConsumer<byte[], Class<?>> creatClass
369375
return this;
370376
}
371377
}
378+
379+
public static class InnerLoader extends GroovyScriptClassLoader {
380+
381+
private final GroovyScriptClassLoader delegate;
382+
383+
public InnerLoader(GroovyScriptClassLoader delegate) {
384+
super(delegate);
385+
this.delegate = delegate;
386+
}
387+
388+
@Override
389+
public @Nullable URL loadResource(String name) throws MalformedURLException {
390+
return delegate.loadResource(name);
391+
}
392+
393+
@Override
394+
public void addClasspath(String path) {
395+
delegate.addClasspath(path);
396+
}
397+
398+
@Override
399+
public void clearCache() {
400+
delegate.clearCache();
401+
}
402+
403+
@Override
404+
public URL findResource(String name) {
405+
return delegate.findResource(name);
406+
}
407+
408+
@Override
409+
public Enumeration<URL> findResources(String name) throws IOException {
410+
return delegate.findResources(name);
411+
}
412+
413+
@Override
414+
public Class<?>[] getLoadedClasses() {
415+
return delegate.getLoadedClasses();
416+
}
417+
418+
@Override
419+
public URL getResource(String name) {
420+
return delegate.getResource(name);
421+
}
422+
423+
@Override
424+
public InputStream getResourceAsStream(String name) {
425+
return delegate.getResourceAsStream(name);
426+
}
427+
428+
@Override
429+
public GroovyResourceLoader getResourceLoader() {
430+
return delegate.getResourceLoader();
431+
}
432+
433+
@Override
434+
public URL[] getURLs() {
435+
return delegate.getURLs();
436+
}
437+
438+
@Override
439+
public Class<?> loadClass(String name, boolean lookupScriptFiles, boolean preferClassOverScript, boolean resolve) throws ClassNotFoundException, CompilationFailedException {
440+
Class<?> c = findLoadedClass(name);
441+
if (c != null) return c;
442+
return delegate.loadClass(name, lookupScriptFiles, preferClassOverScript, resolve);
443+
}
444+
445+
@Override
446+
public Class<?> parseClass(GroovyCodeSource codeSource, boolean shouldCache) throws CompilationFailedException {
447+
return delegate.parseClass(codeSource, shouldCache);
448+
}
449+
450+
@Override
451+
public void setResourceLoader(GroovyResourceLoader resourceLoader) {
452+
// no need to set a rl
453+
// it's delegated anyway
454+
}
455+
456+
@Override
457+
public void addURL(URL url) {
458+
delegate.addURL(url);
459+
}
460+
461+
@Override
462+
public Class<?> defineClass(ClassNode classNode, String file, String newCodeBase) {
463+
return delegate.defineClass(classNode, file, newCodeBase);
464+
}
465+
466+
@Override
467+
public Class<?> parseClass(File file) throws CompilationFailedException, IOException {
468+
return delegate.parseClass(file);
469+
}
470+
471+
@Override
472+
public Class<?> parseClass(String text, String fileName) throws CompilationFailedException {
473+
return delegate.parseClass(text, fileName);
474+
}
475+
476+
@Override
477+
public Class<?> parseClass(String text) throws CompilationFailedException {
478+
return delegate.parseClass(text);
479+
}
480+
481+
@Override
482+
public String generateScriptName() {
483+
return delegate.generateScriptName();
484+
}
485+
486+
@Override
487+
public Class<?> parseClass(Reader reader, String fileName) throws CompilationFailedException {
488+
return delegate.parseClass(reader, fileName);
489+
}
490+
491+
@Override
492+
public Class<?> parseClass(GroovyCodeSource codeSource) throws CompilationFailedException {
493+
return delegate.parseClass(codeSource);
494+
}
495+
496+
@Override
497+
public Class<?> defineClass(String name, byte[] b) {
498+
return delegate.defineClass(name, b);
499+
}
500+
501+
@Override
502+
public Class<?> loadClass(String name, boolean lookupScriptFiles, boolean preferClassOverScript) throws ClassNotFoundException, CompilationFailedException {
503+
return delegate.loadClass(name, lookupScriptFiles, preferClassOverScript);
504+
}
505+
506+
@Override
507+
public void setShouldRecompile(Boolean mode) {
508+
// it's delegated anyway
509+
}
510+
511+
@Override
512+
public Boolean isShouldRecompile() {
513+
return delegate.isShouldRecompile();
514+
}
515+
516+
@Override
517+
public Class<?> loadClass(String name) throws ClassNotFoundException {
518+
return delegate.loadClass(name);
519+
}
520+
521+
@Override
522+
public Enumeration<URL> getResources(String name) throws IOException {
523+
return delegate.getResources(name);
524+
}
525+
526+
@Override
527+
public void setDefaultAssertionStatus(boolean enabled) {
528+
delegate.setDefaultAssertionStatus(enabled);
529+
}
530+
531+
@Override
532+
public void setPackageAssertionStatus(String packageName, boolean enabled) {
533+
delegate.setPackageAssertionStatus(packageName, enabled);
534+
}
535+
536+
@Override
537+
public void setClassAssertionStatus(String className, boolean enabled) {
538+
delegate.setClassAssertionStatus(className, enabled);
539+
}
540+
541+
@Override
542+
public void clearAssertionStatus() {
543+
delegate.clearAssertionStatus();
544+
}
545+
546+
@Override
547+
public void close() throws IOException {
548+
try {
549+
super.close();
550+
} finally {
551+
delegate.close();
552+
}
553+
}
554+
}
372555
}

0 commit comments

Comments
 (0)