--- /dev/null 2015-10-09 21:42:24.000000000 +0200 +++ new/jdk/test/java/lang/System/LoggerFinder/internal/backend/SystemClassLoader.java 2015-10-09 21:42:24.000000000 +0200 @@ -0,0 +1,83 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + + + +import java.io.IOException; +import java.net.URL; +import java.util.Enumeration; +import java.lang.System.LoggerFinder; + +/** + * A custom class loader which can hide the registered LoggerProvider + * depending on the value of a test.logger.hidesProvider system property. + * @author danielfuchs + */ +public class SystemClassLoader extends ClassLoader { + + final public boolean hidesProvider; + + public SystemClassLoader() { + hidesProvider = Boolean.getBoolean("test.logger.hidesProvider"); + } + public SystemClassLoader(ClassLoader parent) { + super(parent); + hidesProvider = Boolean.getBoolean("test.logger.hidesProvider"); + } + + boolean accept(String name) { + final boolean res = !name.endsWith(LoggerFinder.class.getName()); + if (res == false) { + System.out.println("Hiding " + name); + } + return res; + } + + @Override + public URL getResource(String name) { + if (hidesProvider && !accept(name)) { + return null; + } else { + return super.getResource(name); + } + } + + class Enumerator implements Enumeration { + final Enumeration enumeration; + volatile URL next; + Enumerator(Enumeration enumeration) { + this.enumeration = enumeration; + } + + @Override + public boolean hasMoreElements() { + if (next != null) return true; + if (!enumeration.hasMoreElements()) return false; + if (hidesProvider == false) return true; + next = enumeration.nextElement(); + if (accept(next.getPath())) return true; + next = null; + return hasMoreElements(); + } + + @Override + public URL nextElement() { + final URL res = next == null ? enumeration.nextElement() : next; + next = null; + if (hidesProvider == false || accept(res.getPath())) return res; + return nextElement(); + } + } + + @Override + public Enumeration getResources(String name) throws IOException { + final Enumeration enumeration = super.getResources(name); + return hidesProvider ? new Enumerator(enumeration) : enumeration; + } + + + +}