/******************************************************************************* | |
* Copyright (c) 2010, 2012 Ericsson | |
* | |
* 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 | |
* | |
* Description: | |
* | |
* Contributors: | |
* Ericsson AB - Initial API and Implementation | |
* Alvaro Sanchez-Leon - Adapted for Review for Eclipse | |
*******************************************************************************/ | |
package org.eclipse.mylyn.reviews.r4e.core.utils.cmd; | |
import java.io.IOException; | |
import java.util.List; | |
import org.eclipse.mylyn.reviews.r4e.core.Activator; | |
/** | |
* @author Jacques Bouthillier | |
* | |
*/ | |
public class BaseSupportCommand { | |
/** | |
* @param cmdPath | |
* @param command | |
* @param waitFor | |
* @param errorNotified | |
* @return | |
* @throws IOException | |
*/ | |
protected String executeWithStringReturned(String cmdPath, List<String> command, boolean waitFor, | |
boolean errorNotified) throws IOException { | |
List<String> results = execute(cmdPath, command, waitFor, errorNotified); | |
if (results == null || results.size() == 0) { | |
Activator.fTracer.traceInfo("execute received no results"); | |
return new String(""); | |
} | |
// reasonable limit to 10 lines, if more lines needed, use method "execute" | |
StringBuilder result = new StringBuilder(); | |
int maxLines = results.size() > 10 ? 10 : results.size(); | |
for (int i = 0; i < maxLines; i++) { | |
result.append(results.get(i)); | |
} | |
return result.toString(); | |
} | |
/** | |
* @param cmdPath | |
* @param command | |
* @param waitFor | |
* @param notifyIfError | |
* @return | |
* @throws IOException | |
*/ | |
private List<String> execute(String cmdPath, List<String> command, boolean waitFor /* Blocking */, | |
boolean notifyIfError) throws IOException { | |
List<String> results = null; | |
ShellCommandManager manager = new ShellCommandManager(cmdPath, command); | |
StreamThread outputStream = new StreamThread(); | |
StreamThread errorStream = new StreamThread(); | |
Activator.fTracer.traceInfo("Command Path: " + cmdPath + "\n" + command.toString()); | |
int exitValue = manager.execute(outputStream, errorStream, waitFor /* true=wait */); | |
StringBuilder str = new StringBuilder(); | |
if (!(outputStream.isAlive() || errorStream.isAlive())) { | |
str.append("outputStream + errorStream CLOSED properly, Java Process exit value: "); | |
// Popup.info(null, str); | |
Activator.fTracer.traceInfo(str.toString() + exitValue); | |
} else { | |
// Shellmanager waits for thread termination before providing the | |
// result so this should not happen unless the waiting period have elapsed | |
if (outputStream.isAlive()) { | |
str.append("outputStream is alive: Java Process exit value: " + exitValue); | |
} | |
if (errorStream.isAlive()) { | |
str.append("\nerrorStream is alive: Java Process exit value: " | |
+ exitValue); | |
Activator.fTracer.traceInfo(str.toString()); | |
} | |
} | |
if (exitValue == 0) { | |
results = outputStream.getLines(); | |
} else { | |
results = errorStream.getLines(); | |
} | |
// Print errors, if any | |
if (notifyIfError) { | |
List<String> lines = errorStream.getLines(); | |
if (lines.size() > 0) { | |
StringBuilder sb = new StringBuilder(); | |
for (String s : lines) { | |
sb = sb.append(s + "\n"); | |
} | |
sb.append("Path: " + cmdPath + "\n"); | |
sb.append("Command: \n"); | |
sb.append(command.toString()); | |
Activator.fTracer.traceInfo(sb.toString()); | |
if (exitValue != 5) { | |
// Filter the eror code 5 | |
// Error code 5 = Access is Denied | |
throw new IOException("R4E - Unable to perform operation: " + "\n" + sb.toString()); | |
} | |
} | |
} | |
return results; | |
} | |
} |