package org.jpos.util.slf4j; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import java.io.IOException; import java.net.URL; import java.security.ProtectionDomain; import java.util.Enumeration; @SuppressWarnings("WeakerAccess") public class Slf4JDynamicBinder { private static final String STATIC_BINDER_CLASS = "org.slf4j.impl.StaticLoggerBinder"; private static final String STATIC_BINDER_RESOURCE = "org/slf4j/impl/StaticLoggerBinder.class"; private static boolean bound = false; public static void applyMods() throws Exception { if (!bound && !bindingsExist()) { final ProtectionDomain pd = Slf4JDynamicBinder.class.getProtectionDomain(); final ClassPool cp = ClassPool.getDefault(); CtClass clz = cp.getAndRename(StaticLoggerBinder.class.getName(), STATIC_BINDER_CLASS); clz.toClass(null, pd); CtClass clz2 = cp.get("org.slf4j.LoggerFactory"); CtMethod bindMethod = clz2.getDeclaredMethod("bind"); bindMethod.setBody("try " + "{" + " org.slf4j.impl.StaticLoggerBinder.getSingleton();" + " INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;" + " fixSubstituteLoggers();" + " replayEvents();" + " SUBST_FACTORY.clear();" + "} " + "catch(Exception e)" + "{" + " failedBinding(e); " + " throw new IllegalStateException(\"Unexpected initialization failure\", e);" + "}"); clz2.toClass(null, pd); clz2.detach(); clz.detach(); bound = true; } } private static boolean bindingsExist() { int cnt = 0; try { ClassLoader cl = Slf4JDynamicBinder.class.getClassLoader(); Enumeration<URL> paths = cl.getResources(STATIC_BINDER_RESOURCE); while (paths.hasMoreElements()) { paths.nextElement(); cnt++; } } catch (IOException ioe) { } return cnt > 0; } }