Package org.erlide.engine.internal.services.search

Source Code of org.erlide.engine.internal.services.search.ErlideSearchServer

package org.erlide.engine.internal.services.search;

import org.erlide.engine.model.erlang.IErlModule;
import org.erlide.engine.services.search.ErlSearchScope;
import org.erlide.engine.services.search.ErlangSearchPattern;
import org.erlide.engine.services.search.SearchServerService;
import org.erlide.runtime.api.IOtpRpc;
import org.erlide.runtime.rpc.IRpcResultCallback;
import org.erlide.runtime.rpc.RpcException;
import org.erlide.util.ErlLogger;
import org.erlide.util.Util;

import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangPid;
import com.ericsson.otp.erlang.OtpErlangString;
import com.ericsson.otp.erlang.OtpErlangTuple;

public class ErlideSearchServer implements SearchServerService {

    private static final int SEARCH_LONG_TIMEOUT = 50000;

    private final IOtpRpc backend;

    public ErlideSearchServer(final IOtpRpc backend) {
        this.backend = backend;
    }

    private OtpErlangList getModulesFromScope(final ErlSearchScope scope) {
        final OtpErlangObject[] result = new OtpErlangObject[scope.size()];
        int i = 0;
        for (final IErlModule module : scope.getModules()) {
            result[i] = make2Tuple(module.getScannerName(), module.getFilePath());
            i++;
        }
        return new OtpErlangList(result);
    }

    private OtpErlangTuple make2Tuple(final String scannerModuleName, final String path) {
        return new OtpErlangTuple(new OtpErlangObject[] {
                new OtpErlangAtom(scannerModuleName), new OtpErlangString(path) });
    }

    @Override
    public void startFindRefs(final ErlangSearchPattern pattern,
            final ErlSearchScope scope, final String stateDir,
            final IRpcResultCallback callback, final boolean updateSearchServer)
            throws RpcException {
        final OtpErlangList modules = getModulesFromScope(scope);
        backend.async_call_result(callback, "erlide_search_server", "start_find_refs",
                "xxxso", pattern.getSearchObject(), modules, stateDir, updateSearchServer);
    }

    @Override
    public OtpErlangObject findRefs(final ErlangSearchPattern pattern,
            final ErlSearchScope scope, final String stateDir,
            final boolean updateSearchServer) throws RpcException {
        final OtpErlangList modules = getModulesFromScope(scope);
        final OtpErlangObject searchObject = pattern.getSearchObject();
        ErlLogger.debug("searchObject %s", searchObject);
        final OtpErlangObject r = backend.call(SEARCH_LONG_TIMEOUT,
                "erlide_search_server", "find_refs", "xxso", searchObject, modules,
                stateDir, updateSearchServer);
        if (Util.isOk(r)) {
            return r;
        }
        return null;
    }

    @Override
    public void cancelSearch(final OtpErlangPid searchDeamonPid) throws RpcException {
        backend.call("erlide_search_server", "cancel_find_refs", "x", searchDeamonPid);
    }

}
TOP

Related Classes of org.erlide.engine.internal.services.search.ErlideSearchServer

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.