Bug 477062: tweak logging tests to run on Java9+Jigsaw
diff --git a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java
index 4a487a4..894ddc3 100644
--- a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java
+++ b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LogsTest.java
@@ -10,7 +10,12 @@
  *******************************************************************************/
 package org.eclipse.sisu.inject;
 
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.logging.Handler;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -22,6 +27,10 @@
 public class LogsTest
     extends TestCase
 {
+    public static final ClassLoader WITH_SLF4J = isolatedClassLoader( false );
+
+    public static final ClassLoader WITHOUT_SLF4J = isolatedClassLoader( true );
+
     public void testLogging()
     {
         new LoggingExample();
@@ -34,25 +43,11 @@
         {
             ( (ch.qos.logback.classic.Logger) LoggerFactory.getLogger( Logs.class ) ).setLevel( ch.qos.logback.classic.Level.WARN );
 
-            final ClassLoader productionLoader =
-                new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
-                {
-                    @Override
-                    protected synchronized Class<?> loadClass( final String name, final boolean resolve )
-                        throws ClassNotFoundException
-                    {
-                        if ( name.startsWith( "ch" ) || name.contains( "cobertura" ) )
-                        {
-                            return LogsTest.class.getClassLoader().loadClass( name );
-                        }
-                        return super.loadClass( name, resolve );
-                    }
-                };
-
-            productionLoader.loadClass( LoggingExample.class.getName() ).newInstance();
+            WITH_SLF4J.loadClass( LoggingExample.class.getName() ).newInstance();
         }
         finally
         {
+            // no-op
         }
     }
 
@@ -72,26 +67,7 @@
         {
             rootLogger.setLevel( Level.FINE );
 
-            final ClassLoader noSLF4JLoader =
-                new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
-                {
-                    @Override
-                    protected synchronized Class<?> loadClass( final String name, final boolean resolve )
-                        throws ClassNotFoundException
-                    {
-                        if ( name.contains( "slf4j" ) )
-                        {
-                            throw new ClassNotFoundException( name );
-                        }
-                        if ( name.contains( "cobertura" ) )
-                        {
-                            return LogsTest.class.getClassLoader().loadClass( name );
-                        }
-                        return super.loadClass( name, resolve );
-                    }
-                };
-
-            noSLF4JLoader.loadClass( LoggingExample.class.getName() ).newInstance();
+            WITHOUT_SLF4J.loadClass( LoggingExample.class.getName() ).newInstance();
         }
         finally
         {
@@ -105,26 +81,54 @@
         System.setProperty( "org.eclipse.sisu.log", "console" );
         try
         {
-            final ClassLoader consoleLoader =
-                new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
-                {
-                    @Override
-                    protected synchronized Class<?> loadClass( final String name, final boolean resolve )
-                        throws ClassNotFoundException
-                    {
-                        if ( name.contains( "cobertura" ) )
-                        {
-                            return LogsTest.class.getClassLoader().loadClass( name );
-                        }
-                        return super.loadClass( name, resolve );
-                    }
-                };
-
-            consoleLoader.loadClass( LoggingExample.class.getName() ).newInstance();
+            WITH_SLF4J.loadClass( LoggingExample.class.getName() ).newInstance();
         }
         finally
         {
             System.clearProperty( "org.eclipse.sisu.log" );
         }
     }
+
+    private static ClassLoader isolatedClassLoader( final boolean hideSLF4j )
+    {
+        return new URLClassLoader( systemClassPath(), null )
+        {
+            @Override
+            protected synchronized Class<?> loadClass( final String name, final boolean resolve )
+                throws ClassNotFoundException
+            {
+                if ( hideSLF4j && name.contains( "slf4j" ) )
+                {
+                    throw new ClassNotFoundException( name );
+                }
+                if ( !hideSLF4j && name.startsWith( "ch" ) || name.contains( "cobertura" ) )
+                {
+                    return LogsTest.class.getClassLoader().loadClass( name );
+                }
+                return super.loadClass( name, resolve );
+            }
+        };
+    }
+
+    private static URL[] systemClassPath()
+    {
+        final ClassLoader testClassLoader = LogsTest.class.getClassLoader();
+        if ( testClassLoader instanceof URLClassLoader )
+        {
+            return ( (URLClassLoader) testClassLoader ).getURLs();
+        }
+        final List<URL> urls = new ArrayList<URL>();
+        for ( final String path : System.getProperty( "java.class.path", "." ).split( File.pathSeparator ) )
+        {
+            try
+            {
+                urls.add( new File( path ).getAbsoluteFile().toURI().toURL() );
+            }
+            catch ( final MalformedURLException e )
+            {
+                // skip bad classpath entry
+            }
+        }
+        return urls.toArray( new URL[urls.size()] );
+    }
 }
diff --git a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java
index f1f36f3..037add5 100644
--- a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java
+++ b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/space/QualifiedScanningTest.java
@@ -15,7 +15,6 @@
 import java.lang.annotation.RetentionPolicy;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLClassLoader;
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.ArrayList;
@@ -34,6 +33,7 @@
 import junit.framework.TestCase;
 
 import org.eclipse.sisu.inject.DeferredClass;
+import org.eclipse.sisu.inject.LogsTest;
 import org.eclipse.sisu.space.oops.Handler;
 import org.junit.Ignore;
 
@@ -315,26 +315,7 @@
             Logger.getLogger( "" ).setLevel( Level.SEVERE );
 
             // check everything still works without any SLF4J jars
-            final ClassLoader noLoggingLoader =
-                new URLClassLoader( ( (URLClassLoader) getClass().getClassLoader() ).getURLs(), null )
-                {
-                    @Override
-                    protected synchronized Class<?> loadClass( final String name, final boolean resolve )
-                        throws ClassNotFoundException
-                    {
-                        if ( name.contains( "slf4j" ) )
-                        {
-                            throw new ClassNotFoundException( name );
-                        }
-                        if ( name.contains( "cobertura" ) )
-                        {
-                            return QualifiedScanningTest.class.getClassLoader().loadClass( name );
-                        }
-                        return super.loadClass( name, resolve );
-                    }
-                };
-
-            noLoggingLoader.loadClass( BrokenScanningExample.class.getName() ).newInstance();
+            LogsTest.WITHOUT_SLF4J.loadClass( BrokenScanningExample.class.getName() ).newInstance();
         }
         finally
         {