package org.erlide.runtime.api; import java.util.ArrayList; import java.util.List; import org.erlide.runtime.rpc.IOtpRpc; import org.erlide.util.ErlLogger; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangBinary; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangTuple; public class BeamLoader { public static boolean loadBeam(final IOtpRpc backend, final String moduleName, final OtpErlangBinary bin) { OtpErlangObject r = null; try { r = backend.call("code", "is_sticky", "a", moduleName); // TODO handle sticky directories if (!((OtpErlangAtom) r).booleanValue()) { r = backend.call("code", "load_binary", "asb", moduleName, moduleName + ".erl", bin); } else { ErlLogger.warn("sticky:: %s", moduleName); r = null; } } catch (final Exception e) { ErlLogger.warn(e); } if (r instanceof OtpErlangTuple) { final OtpErlangTuple t = (OtpErlangTuple) r; if (((OtpErlangAtom) t.elementAt(0)).atomValue().compareTo("module") == 0) { return true; } // code couldn't be loaded // TODO throw exception? ErlLogger.error("Could not load " + moduleName + ": " + r); return false; } // binary couldn't be extracted ErlLogger.error("Could not load " + moduleName + ": " + r); return false; } public static void reloadAllCode(final IOtpRpc backend) { try { final OtpErlangList loaded = (OtpErlangList) backend.call("code", "all_loaded", ""); final List<OtpErlangAtom> mine = new ArrayList<>(); for (final OtpErlangObject elem : loaded) { final OtpErlangTuple t = (OtpErlangTuple) elem; final OtpErlangAtom mod = (OtpErlangAtom) t.elementAt(0); if (mod.atomValue().startsWith("erlide_")) { // ErlLogger.debug(">>> HAD " + mod + " " + // t.elementAt(1)); mine.add(mod); } } for (final OtpErlangAtom mod : mine) { // ErlLogger.debug(">>> reload " + mod); backend.call("c", "l", "x", mod); } } catch (final Exception e) { ErlLogger.error(e); } } }