package org.yakindu.sct.generator.c.gtest; import java.io.File; /**************************************************************************** * Copyright (c) 2008, 2012 Andreas Unger and others. * 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: * Andreas Unger - initial API and implementation ****************************************************************************/ import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; public class GCCCommandExecutor { public void execute(List<String> command, File workingDirectory) { execute(command, workingDirectory, true); } public void execute(List<String> command, File workingDirectory, boolean refreshWorkspace) { try { // System.out.println("compile: " + command); ProcessBuilder processBuilder = new ProcessBuilder(command).directory(workingDirectory); Process process = processBuilder.redirectErrorStream(true).start(); String message = readProcessInputStream(process); boolean wait = true; int exitCode = 0; do { wait = false; // waiting for the processes termination try { process.waitFor(); } catch (InterruptedException e) { /* * we ignore if waiting was * interrupted ... */ } // if we get an exit code then we know that the process is // finished try { exitCode = process.exitValue(); } catch (IllegalThreadStateException e) { wait = true; // if we get an exception then the process has // not finished ... } } while (wait); if (exitCode != 0) { throw new RuntimeException("Compilation failed (exit status " + process.exitValue() + "):\n" + message); } } catch (Error e) { throw e; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } finally { try { if (refreshWorkspace) { ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); } } catch (CoreException e) { throw new RuntimeException(e); } } } private String readProcessInputStream(Process process) throws IOException { Reader reader = new InputStreamReader(process.getInputStream()); char[] buffer = new char[4096]; int count; StringBuilder message = new StringBuilder(); while ((count = reader.read(buffer)) != -1) { message.append(buffer, 0, count); } return message.toString(); } }