From d874798076ffd6f638dc6bef4e3d6e1cfba9a6f3 Mon Sep 17 00:00:00 2001 From: Bruno Medeiros Date: Fri, 12 Feb 2016 17:18:41 +0000 Subject: [PATCH] refactor AbstractToolOperation and related. --- .../core/operations/AbstractToolManager.java | 25 ++++---- .../actions/AbstractOpenElementOperation.java | 14 ++++- .../LangCompletionProposalComputer.java | 7 +-- .../operations/CalculateValueUIOperation.java | 5 ++ .../lang/tooling/data/InfoResult.java | 27 ++++++++ .../tooling/ops/AbstractToolOperation.java | 5 +- .../ops/AbstractToolOutputParser2.java | 63 +++++++++++++++++++ .../lang/tooling/ops/IOperationService.java | 10 +-- .../lang/tooling/ops/IProcessRunner.java | 26 ++++++++ 9 files changed, 155 insertions(+), 27 deletions(-) create mode 100644 plugin_tooling/src-lang/melnorme/lang/tooling/data/InfoResult.java create mode 100644 plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOutputParser2.java create mode 100644 plugin_tooling/src-lang/melnorme/lang/tooling/ops/IProcessRunner.java diff --git a/plugin_ide.core/src-lang/melnorme/lang/ide/core/operations/AbstractToolManager.java b/plugin_ide.core/src-lang/melnorme/lang/ide/core/operations/AbstractToolManager.java index 17bd93156..7f354e498 100644 --- a/plugin_ide.core/src-lang/melnorme/lang/ide/core/operations/AbstractToolManager.java +++ b/plugin_ide.core/src-lang/melnorme/lang/ide/core/operations/AbstractToolManager.java @@ -114,7 +114,7 @@ public void notifyMessage(String msgId, StatusLevel statusLevel, String title, S /* ----------------- ----------------- */ - protected EclipseCancelMonitor cm(IProgressMonitor pm) { + public static EclipseCancelMonitor cm(IProgressMonitor pm) { return new EclipseCancelMonitor(pm); } @@ -213,19 +213,19 @@ protected void handleProcessStartResult(ProcessStartHelper psh) { /* ----------------- ----------------- */ - public ExternalProcessResult runEngineTool(ProcessBuilder pb, String clientInput, IProgressMonitor pm) + public ExternalProcessResult runEngineTool(ProcessBuilder pb, String processInput, IProgressMonitor pm) throws CoreException, OperationCancellation { try { - return runEngineTool(pb, clientInput, cm(pm)); + return runEngineTool(pb, processInput, cm(pm)); } catch(CommonException ce) { throw LangCore.createCoreException(ce); } } - public ExternalProcessResult runEngineTool(ProcessBuilder pb, String clientInput, ICancelMonitor cm) + public ExternalProcessResult runEngineTool(ProcessBuilder pb, String processInput, ICancelMonitor cm) throws CommonException, OperationCancellation { IOperationConsoleHandler handler = startNewOperation(ProcessStartKind.ENGINE_TOOLS, false, false); - return new RunToolTask(handler, pb, cm).runProcess(clientInput); + return new RunToolTask(handler, pb, cm).runProcess(processInput); } /* ----------------- ----------------- */ @@ -233,19 +233,22 @@ public ExternalProcessResult runEngineTool(ProcessBuilder pb, String clientInput /** * Helper to start engine client processes in the tool manager. */ - public class ToolManagerEngineToolRunner implements IOperationService { + public class ToolManagerEngineToolRunner2 implements IOperationService { protected final boolean throwOnNonZeroStatus; - protected final EclipseCancelMonitor cm; - public ToolManagerEngineToolRunner(IProgressMonitor monitor, boolean throwOnNonZeroStatus) { + public ToolManagerEngineToolRunner2() { + this(false); + } + + @Deprecated + protected ToolManagerEngineToolRunner2(boolean throwOnNonZeroStatus) { this.throwOnNonZeroStatus = throwOnNonZeroStatus; - this.cm = new EclipseCancelMonitor(monitor); } @Override - public ExternalProcessResult runProcess(ProcessBuilder pb, String input) throws CommonException, - OperationCancellation { + public ExternalProcessResult runProcess(ProcessBuilder pb, String input, ICancelMonitor cm) + throws CommonException, OperationCancellation { IOperationConsoleHandler handler = startNewOperation(ProcessStartKind.ENGINE_TOOLS, false, false); return new RunToolTask(handler, pb, cm).runProcess(input, throwOnNonZeroStatus); } diff --git a/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/editor/actions/AbstractOpenElementOperation.java b/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/editor/actions/AbstractOpenElementOperation.java index 607b0f50e..3d0d6052f 100644 --- a/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/editor/actions/AbstractOpenElementOperation.java +++ b/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/editor/actions/AbstractOpenElementOperation.java @@ -33,12 +33,16 @@ import melnorme.lang.ide.ui.utils.operations.AbstractEditorOperation2; import melnorme.lang.tooling.ast.SourceRange; import melnorme.lang.tooling.ops.FindDefinitionResult; +import melnorme.lang.tooling.ops.IProcessRunner; import melnorme.lang.tooling.ops.SourceLineColumnRange; +import melnorme.utilbox.concurrency.ICancelMonitor; import melnorme.utilbox.concurrency.OperationCancellation; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.misc.Location; +import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult; -public abstract class AbstractOpenElementOperation extends AbstractEditorOperation2 { +public abstract class AbstractOpenElementOperation extends AbstractEditorOperation2 + implements IProcessRunner { protected final String source; protected final SourceRange range; // range of element to open. Usually only offset matters @@ -162,4 +166,12 @@ protected static int getOffsetFrom(IDocument doc, int line_oneBased, int column_ return lineOffset + column_oneBased-1; } + /* ----------------- ----------------- */ + + @Override + public ExternalProcessResult runProcess(ProcessBuilder pb, String input, ICancelMonitor cm) + throws OperationCancellation, CommonException { + return LangCore.getToolManager().runEngineTool(pb, input, cm); + } + } \ No newline at end of file diff --git a/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/text/completion/LangCompletionProposalComputer.java b/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/text/completion/LangCompletionProposalComputer.java index 7beaf9498..e67b3a450 100644 --- a/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/text/completion/LangCompletionProposalComputer.java +++ b/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/text/completion/LangCompletionProposalComputer.java @@ -12,14 +12,13 @@ import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.swt.graphics.Image; import melnorme.lang.ide.core.LangCore; -import melnorme.lang.ide.core.operations.AbstractToolManager.ToolManagerEngineToolRunner; +import melnorme.lang.ide.core.operations.AbstractToolManager.ToolManagerEngineToolRunner2; import melnorme.lang.ide.core.utils.operation.TimeoutProgressMonitor; import melnorme.lang.ide.ui.LangImageProvider; import melnorme.lang.ide.ui.LangImages; @@ -106,8 +105,8 @@ protected AbstractLangImageProvider getImageProvider() { /* ----------------- ----------------- */ - protected ToolManagerEngineToolRunner getEngineToolRunner(IProgressMonitor pm) { - return LangCore.getToolManager().new ToolManagerEngineToolRunner(pm, false); + protected ToolManagerEngineToolRunner2 getEngineToolRunner() { + return LangCore.getToolManager().new ToolManagerEngineToolRunner2(); } } \ No newline at end of file diff --git a/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/utils/operations/CalculateValueUIOperation.java b/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/utils/operations/CalculateValueUIOperation.java index e4065868a..0c0c1b809 100644 --- a/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/utils/operations/CalculateValueUIOperation.java +++ b/plugin_ide.ui/src-lang/melnorme/lang/ide/ui/utils/operations/CalculateValueUIOperation.java @@ -16,6 +16,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.widgets.Display; +import melnorme.lang.ide.core.utils.operation.EclipseCancelMonitor; import melnorme.lang.ide.ui.utils.UIOperationsStatusHandler; import melnorme.lang.tooling.data.Severity; import melnorme.utilbox.concurrency.OperationCancellation; @@ -64,4 +65,8 @@ protected void dialogError(String message) { UIOperationsStatusHandler.displayStatusMessage(operationName, Severity.ERROR, message); } + public static EclipseCancelMonitor cm(IProgressMonitor pm) { + return new EclipseCancelMonitor(pm); + } + } \ No newline at end of file diff --git a/plugin_tooling/src-lang/melnorme/lang/tooling/data/InfoResult.java b/plugin_tooling/src-lang/melnorme/lang/tooling/data/InfoResult.java new file mode 100644 index 000000000..5d6d287a8 --- /dev/null +++ b/plugin_tooling/src-lang/melnorme/lang/tooling/data/InfoResult.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2016 Bruno Medeiros and other Contributors. + * 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: + * Bruno Medeiros - initial API and implementation + *******************************************************************************/ +package melnorme.lang.tooling.data; + +import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull; + +@SuppressWarnings("serial") +public class InfoResult extends Throwable { + + public InfoResult(String message) { + super(assertNotNull(message)); + } + + @Override + public String getMessage() { + return super.getMessage(); + } + +} \ No newline at end of file diff --git a/plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOperation.java b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOperation.java index a85e03f77..f82748d92 100644 --- a/plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOperation.java +++ b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOperation.java @@ -12,6 +12,7 @@ import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull; +import melnorme.utilbox.concurrency.ICancelMonitor; import melnorme.utilbox.concurrency.OperationCancellation; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult; @@ -25,9 +26,9 @@ public AbstractToolOperation(IOperationService opHelper) { this.operationHelper = assertNotNull(opHelper); } - protected ExternalProcessResult runToolProcess(ProcessBuilder pb, String input) + protected ExternalProcessResult runToolProcess(ProcessBuilder pb, String input, ICancelMonitor cm) throws CommonException, OperationCancellation { - return operationHelper.runProcess(pb, input); + return operationHelper.runProcess(pb, input, cm); } public IOperationService getOperationHelper() { diff --git a/plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOutputParser2.java b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOutputParser2.java new file mode 100644 index 000000000..1bf4fe27b --- /dev/null +++ b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/AbstractToolOutputParser2.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2015 Bruno Medeiros and other Contributors. + * 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: + * Bruno Medeiros - initial API and implementation + *******************************************************************************/ +package melnorme.lang.tooling.ops; + + +import melnorme.lang.tooling.data.InfoResult; +import melnorme.utilbox.concurrency.ICancelMonitor; +import melnorme.utilbox.concurrency.OperationCancellation; +import melnorme.utilbox.core.CommonException; +import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult; + +public abstract class AbstractToolOutputParser2 extends ToolOutputParseHelper { + + protected final String toolPath; + protected final boolean nonZeroExitIsFatal; + + public AbstractToolOutputParser2(String toolPath, boolean nonZeroResultIsFatal) { + super(); + this.toolPath = toolPath; + this.nonZeroExitIsFatal = nonZeroResultIsFatal; + } + + public FindDefinitionResult execute(IProcessRunner opRunner, + ICancelMonitor cm) throws OperationCancellation, CommonException, InfoResult { + ProcessBuilder pb = createProcessBuilder(); + + ExternalProcessResult result = opRunner.runProcess(pb, null, cm); + if(result.exitValue != 0) { + handleNonZeroExitValue(result); + } + + return parseToolResult(result); + } + + protected abstract ProcessBuilder createProcessBuilder() throws CommonException; + + @SuppressWarnings("unused") + protected void handleNonZeroExitValue( ExternalProcessResult result) throws CommonException, InfoResult { + String nonZeroExitMsg = getToolName() + " did not complete successfully."; + if(nonZeroExitIsFatal) { + throw new CommonException(nonZeroExitMsg); + } else { + throw new InfoResult(nonZeroExitMsg); + } + } + + protected abstract String getToolName(); + + public FindDefinitionResult parseToolResult(ExternalProcessResult result) throws CommonException { + return parseToolResult(result.getStdOutBytes().toString()); + } + + public abstract FindDefinitionResult parseToolResult(String output) throws CommonException; + +} \ No newline at end of file diff --git a/plugin_tooling/src-lang/melnorme/lang/tooling/ops/IOperationService.java b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/IOperationService.java index dfa2ce832..78e2cf58e 100644 --- a/plugin_tooling/src-lang/melnorme/lang/tooling/ops/IOperationService.java +++ b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/IOperationService.java @@ -10,20 +10,12 @@ *******************************************************************************/ package melnorme.lang.tooling.ops; -import melnorme.utilbox.concurrency.OperationCancellation; -import melnorme.utilbox.core.CommonException; import melnorme.utilbox.misc.ILogHandler; -import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult; /** * Service/helper class to perform certain operation tasks (such as running a process) * under a context that is abstracted away. (Usually it's a UI context that observes the tasks) */ -public interface IOperationService extends ILogHandler { - - /** - * Start a process from given ProcessBuilder pb, run it with given input until completion. - */ - ExternalProcessResult runProcess(ProcessBuilder pb, String input) throws CommonException, OperationCancellation; +public interface IOperationService extends ILogHandler, IProcessRunner { } \ No newline at end of file diff --git a/plugin_tooling/src-lang/melnorme/lang/tooling/ops/IProcessRunner.java b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/IProcessRunner.java new file mode 100644 index 000000000..73f48ac24 --- /dev/null +++ b/plugin_tooling/src-lang/melnorme/lang/tooling/ops/IProcessRunner.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2016 Bruno Medeiros and other Contributors. + * 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: + * Bruno Medeiros - initial API and implementation + *******************************************************************************/ +package melnorme.lang.tooling.ops; + +import melnorme.utilbox.concurrency.ICancelMonitor; +import melnorme.utilbox.concurrency.OperationCancellation; +import melnorme.utilbox.core.CommonException; +import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult; + +public interface IProcessRunner { + + /** + * Start a process from given ProcessBuilder pb, run it with given input until completion. + */ + ExternalProcessResult runProcess(ProcessBuilder pb, String input, ICancelMonitor cm) + throws OperationCancellation, CommonException; + +} \ No newline at end of file