package org.erlide.wrangler.refactoring.core.internal; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.swt.widgets.Shell; import org.erlide.runtime.rpc.RpcResult; import org.erlide.wrangler.refactoring.backend.IRefactoringRpcMessage; import org.erlide.wrangler.refactoring.backend.internal.WranglerBackendManager; import org.erlide.wrangler.refactoring.core.RefactoringWorkflowController; import org.erlide.wrangler.refactoring.core.SimpleOneStepWranglerRefactoring; import org.erlide.wrangler.refactoring.selection.IErlSelection; import org.erlide.wrangler.refactoring.util.GlobalParameters; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangString; import com.ericsson.otp.erlang.OtpErlangTuple; /** * Abstract class for user-defined refactoring handlers * * This class should be extended by classes dedicated to composite and * elementary refactorings * * @author Aleksandra Lipiec <aleksandra.lipiec@erlang-solutions.com> * @version %I%, %G% */ public abstract class UserRefactoring extends SimpleOneStepWranglerRefactoring { private String callbackModule; // callback module private final List<String> parPrompts = new LinkedList<>(); // parameter // prompts private List<String> parValues = new ArrayList<>(0); // parameter // values // submited by // user protected boolean fetched; // if parameter prompts are already fetched protected RefactoringStatus status; // refactoring status @Override public RefactoringStatus checkFinalConditions(final IProgressMonitor pm) throws CoreException, OperationCanceledException { return status; } public String getCallbackModule() { return callbackModule; } /** * Ad hoc refactoring needs name of the callback module to be called * * @param module */ public void setCallbackModuleName(final String module) { callbackModule = module; fetched = false; } /** * Fetch parameter prompts from the right callback module * * @param module */ public boolean fetchParPrompts() { if (fetched) { return true; } final RpcResult res = WranglerBackendManager.getRefactoringBackend() .callWithoutParser("input_par_prompts_eclipse", "s", callbackModule); final OtpErlangList params = (OtpErlangList) ((OtpErlangTuple) res.getValue()) .elementAt(1); parPrompts.clear(); for (final OtpErlangObject obj : params.elements()) { parPrompts.add(obj.toString().replace("\"", "")); } fetched = true; return true; } /** * Getter for parameter prompts * * @return */ public List<String> getParPrompts() { return parPrompts; } /** * Clear parameter prompts list */ protected void clearParPrompts() { parPrompts.clear(); } /** * Add a new prompt * * @param prompt */ protected void addParPrompts(final String prompt) { parPrompts.add(prompt); } /** * Getter for parameter values * * @return */ public List<String> getParValues() { return parValues; } /** * Appends new parameter value * * @param value */ public void setParValue(final List<String> params) { parValues = params; } protected OtpErlangList prepareUserInput() { final OtpErlangObject[] params = new OtpErlangObject[parValues.size()]; int i = 0; for (final String val : parValues) { params[i] = new OtpErlangString(val); i++; } return new OtpErlangList(params); } /** * Defines workflow of the refactoring, sets changed files and status * * @param shell * @return */ public RefactoringWorkflowController getWorkflowController(final Shell shell) { return new RefactoringWorkflowController(shell) { @Override public void doRefactoring() { final IErlSelection sel = GlobalParameters.getWranglerSelection(); final IRefactoringRpcMessage message = run(sel); if (message.isSuccessful()) { changedFiles = message.getRefactoringChangeset(); status = new RefactoringStatus(); } else { status = RefactoringStatus .createFatalErrorStatus(message.getMessageString()); } } }; } }