package org.jetbrains.plugins.clojure; import clojure.lang.RT; import clojure.lang.Symbol; import clojure.lang.Var; import com.intellij.openapi.components.ApplicationComponent; import org.apache.log4j.Logger; import org.jetbrains.annotations.NotNull; import java.io.StringWriter; public class ClojureLoader implements ApplicationComponent { private static final Logger LOG = Logger.getLogger(ClojureLoader.class); private static final String INIT_CLOJURE = "org.jetbrains.plugins.clojure.init-clojure"; public void initComponent() { ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); try { ClassLoader loader = ClojureLoader.class.getClassLoader(); Thread.currentThread().setContextClassLoader(loader); StringWriter writer = new StringWriter(); Class.forName("clojure.lang.RT"); Var.pushThreadBindings(RT.map(clojure.lang.Compiler.LOADER, loader, RT.var("clojure.core", "*warn-on-reflection*"), true, RT.ERR, writer)); RT.var("clojure.core", "require").invoke(Symbol.intern(INIT_CLOJURE)); Var.find(Symbol.intern(INIT_CLOJURE + "/init")).invoke(); String result = writer.toString(); if (result.length() > 0) { LOG.error("Reflection warnings:\n" + result); } } catch (Exception e) { LOG.error(e.getMessage(), e); } finally { Var.popThreadBindings(); Thread.currentThread().setContextClassLoader(oldLoader); } } public void disposeComponent() { } @NotNull public String getComponentName() { return "clojure.support.loader"; } }