/******************************************************************************* * 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.toolchain.ops; import melnorme.lang.tooling.ToolingMessages; import melnorme.lang.utils.parse.StringCharSource; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.misc.StringUtil; import melnorme.utilbox.process.ExternalProcessHelper.ExternalProcessResult; public abstract class AbstractToolResultParser<RESULT> { public AbstractToolResultParser() { super(); } public ToolResponse<RESULT> parseResult(ExternalProcessResult result) { try { return new ToolResponse<>(doParseResult(result)); } catch(OperationSoftFailure e) { return ToolResponse.newError(e.getMessage()); } catch(CommonException e) { return ToolResponse.newError(e.getMultiLineRender()); } } public RESULT doParseResult(ExternalProcessResult result) throws CommonException, OperationSoftFailure { validateExitCode(result); return parseOutput(result.getStdOutBytes().toString(StringUtil.UTF8)); } protected void validateExitCode(ExternalProcessResult result) throws CommonException, OperationSoftFailure { if(result.exitValue != 0) { handleNonZeroExitCode(result); } } protected void handleNonZeroExitCode(ExternalProcessResult result) throws CommonException, OperationSoftFailure { throw new CommonException( ToolingMessages.PROCESS_CompletedWithNonZeroValue(getToolName(), result.exitValue)); } protected abstract String getToolName() throws CommonException; public RESULT parseOutput(String output) throws CommonException, OperationSoftFailure { return parseOutput(new StringCharSource(output)); } public abstract RESULT parseOutput(StringCharSource output) throws CommonException, OperationSoftFailure; }