22
33import groovy .lang .GroovyClassLoader ;
44import groovy .lang .GroovyCodeSource ;
5+ import groovy .lang .GroovyResourceLoader ;
56import groovy .util .CharsetToolkit ;
67import groovyjarjarasm .asm .ClassVisitor ;
78import groovyjarjarasm .asm .ClassWriter ;
1213import org .codehaus .groovy .util .URLStreams ;
1314import 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 .*;
1917import java .net .MalformedURLException ;
2018import java .net .URISyntaxException ;
2119import java .net .URL ;
2220import java .net .URLDecoder ;
2321import java .security .CodeSource ;
2422import java .util .ArrayList ;
2523import java .util .Collection ;
24+ import java .util .Enumeration ;
2625import java .util .Map ;
2726import 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