Package org.erlide.runtime.api

Source Code of org.erlide.runtime.api.BeamLoader

package org.erlide.runtime.api;

import java.util.ArrayList;
import java.util.List;

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
            // maybe here we should throw exception?
            return false;
        }
        // binary couldn't be extracted
        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<OtpErlangAtom>();
            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);
        }
    }

}
TOP

Related Classes of org.erlide.runtime.api.BeamLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.