/* * 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; } }