/*******************************************************************************
* Copyright (c) 2010 György Orosz.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* György Orosz - initial API and implementation
******************************************************************************/
package org.erlide.wrangler.refactoring.backend.internal;
import org.erlide.runtime.rpc.IOtpRpc;
import org.erlide.runtime.rpc.RpcResult;
import org.erlide.util.ErlLogger;
import org.erlide.wrangler.refactoring.backend.IRpcMessage;
import org.erlide.wrangler.refactoring.backend.IWranglerBackend;
import com.ericsson.otp.erlang.OtpErlangAtom;
/**
* This class handles the Erlide backends, and holds special ones for Wrangler
* operations
*
* @author Gyorgy Orosz
* @version %I%, %G%
*/
public class WranglerRefactoringBackend implements IWranglerBackend {
/**
* Wrangler module name
*/
final static public String MODULE = "wrangler_refacs";
/**
* Wrangler code inspection module name
*/
final static public String INSPECTION_MODULE = "inspec_lib";
final static protected String RENAME_FUNCTION = "rename_fun_eclipse";
protected IOtpRpc backend;
public static final int UNLIMITED_TIMEOUT = Integer.MAX_VALUE;
/**
* Default constructor
*
* @param backend
* Erlide backend
*/
public WranglerRefactoringBackend(final IOtpRpc backend) {
this.backend = backend;
}
/**
* Send an RPC, and allow to define a costum parser
*
* @param parser
* parser object
* @param functionName
* function name in wrangler_refacs.erl
* @param signature
* parameters signature
* @param parameters
* parameters array
* @return parsed RPC message
*/
public IRpcMessage callWithParser(final IRpcMessage parser, final String functionName,
final String signature, final Object... parameters) {
final RpcResult res = callWithoutParser(functionName, signature, parameters);
parser.parse(res);
return parser;
}
/**
* Send an RPC and parses it with the default parser
*
* @param functionName
* function name in wrangler.erl
* @param signature
* parameters signature
* @param parameters
* parameters in an array
* @return parsed RPC message
* @noreference This method is not intended to be referenced by clients.
*/
public AbstractRefactoringRpcMessage call(final String functionName,
final String signature, final Object... parameters) {
final RpcResult res = callWithoutParser(functionName, signature, parameters);
final AbstractRefactoringRpcMessage message = new RefactoringRpcMessage();
message.parse(res);
return message;
}
/**
* Call an RPC without a parser
*
* @param functionName
* function name in wrangler_refacs.erl
* @param signature
* parameters signature
* @param parameters
* parameters array
* @return raw RPC result
*/
public RpcResult callWithoutParser(final String functionName, final String signature,
final Object... parameters) {
/*
* ErlLogger .info("Wrangler call: " + makeLogStr(functionName,
* parameters)); RpcResultImpl res = backend.call_noexception(MODULE,
* functionName, signature, parameters);
*/
return callWithoutParser(-1, functionName, signature, parameters);
}
/**
* Send an RPC without using any RpcResultImpl parser
*
* @param timeout
* timeout for the RPC
* @param functionName
* function name
* @param signature
* signature for the parameters
* @param parameters
* parameters
* @return RpcResultImpl object
*/
public RpcResult callWithoutParser(final int timeout, final String functionName,
final String signature, final Object... parameters) {
ErlLogger.info("Wrangler call: " + makeLogStr(functionName, parameters));
RpcResult res;
if (timeout < 0) {
res = backend.call_noexception(MODULE, functionName, signature, parameters);
} else {
res = backend.call_noexception(timeout, MODULE, functionName, signature,
parameters);
}
// ErlLogger.info("Warning: " + err);
return res;
}
/**
* Call inspection function which returns with boolean values
*
* @param functionName
* function to call
* @param signature
* signature
* @param parameters
* parameters
* @return true if the call was successful, else false
*/
public boolean callSimpleInspection(final String functionName, final String signature,
final Object... parameters) {
ErlLogger.info(
"Wrangler inspection call: " + makeLogStr(functionName, parameters));
RpcResult res;
res = backend.call_noexception(UNLIMITED_TIMEOUT, INSPECTION_MODULE, functionName,
signature, parameters);
try {
if (res.isOk()) {
final OtpErlangAtom b = (OtpErlangAtom) res.getValue();
return b.atomValue().equals("true") || b.atomValue().equals("ok");
}
} catch (final Exception e) {
ErlLogger.error(e);
}
return false;
}
/**
* Call an inspection function
*
* @param functionName
* function name
* @param signature
* signature
* @param parameters
* function parameters
* @return RpcResultImpl wrapped result
*/
public RpcResult callInspection(final String functionName, final String signature,
final Object... parameters) {
ErlLogger.info(
"Wrangler inspection call: " + makeLogStr(functionName, parameters));
RpcResult res;
res = backend.call_noexception(UNLIMITED_TIMEOUT, INSPECTION_MODULE, functionName,
signature, parameters);
return res;
}
/**
* Gets logged info (warnings, errors) from Wrangler
*
* @return log list
*/
public RpcResult getLoggedInfo() {
final RpcResult res = backend.call_noexception("wrangler_error_logger",
"get_logged_info", "");
@SuppressWarnings("unused")
final RpcResult res2 = backend.call_noexception("wrangler_error_logger",
"remove_all_from_logger", "");
return res;
}
protected String makeLogStr(final String function, final Object[] parameters) {
String ret = function + "(";
for (final Object o : parameters) {
ret += o.toString();
ret += ", ";
}
if (ret.endsWith(", ")) {
ret = ret.substring(0, ret.length() - 2);
}
return ret + ")";
}
}