blob: 396fdf8619931b37a8528e76cbafb6f2eba8608b [file] [log] [blame]
/****************************************************************************
* Parallel Performance Wizard (PPW)
* http://ppw.hcs.ufl.edu
*
* Copyright (c) 2010, University of Florida
*
* 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:
* Max Billingsley III - initial API and implementation
****************************************************************************/
package org.eclipse.ptp.etfw.ppw;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ptp.etfw.internal.BuildLaunchUtils;
public class PPWController {
private final ProcessBuilder ppwpb;
private final ProcessBuilder ppwconfigpb;
private final PPWDataManager ppwDataManager;
private String ppwVersion;
private boolean ppwSupportsControl;
public PPWController(PPWDataManager ppwDataManager, String[] args) {
this.ppwDataManager = ppwDataManager;
String ppwToolPath = BuildLaunchUtils.getToolPath("ppw"); //$NON-NLS-1$
String ppw = ppwToolPath + File.separator + "ppw"; //$NON-NLS-1$
String ppwConfig = ppwToolPath + File.separator + "ppw-config"; //$NON-NLS-1$
List<String> ppwConfigCmd = new ArrayList<String>();
ppwConfigCmd.add(ppwConfig);
ppwConfigCmd.add("--version"); //$NON-NLS-1$
ppwconfigpb = new ProcessBuilder(ppwConfigCmd);
Process ppwconf = null;
try {
ppwconf = ppwconfigpb.start();
} catch (IOException e) {
e.printStackTrace();
}
ppwVersion = null;
ppwSupportsControl = false;
try {
InputStreamReader isr = new InputStreamReader(ppwconf.getInputStream());
BufferedReader br = new BufferedReader(isr);
ppwVersion = br.readLine();
} catch (IOException e) {
// e.printStackTrace();
}
// Try to figure out if our PPW version supports "control mode"
if (ppwVersion != null) {
int vMajor = Integer.parseInt(ppwVersion.substring(0, 1));
String ppwVerRest = ppwVersion.substring(2);
// PPW versions up to 2.4 didn't support "control mode"
if (vMajor < 2) {
ppwSupportsControl = false;
} else if (vMajor == 2
&& (ppwVerRest.equals("0") || ppwVerRest.equals("1") || ppwVerRest.equals("2") || ppwVerRest.equals("4"))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
ppwSupportsControl = false;
} else {
ppwSupportsControl = true;
}
}
// Build command to invoke the PPW GUI
List<String> ppwCmd = new ArrayList<String>();
ppwCmd.add(ppw);
if (ppwSupportsControl) {
ppwCmd.add("-c"); //$NON-NLS-1$
}
for (String s : args) {
ppwCmd.add(s);
}
ppwpb = new ProcessBuilder(ppwCmd);
Process p = null;
try {
p = ppwpb.start();
} catch (IOException e) {
e.printStackTrace();
}
new Thread(new IOWatcher(p.getInputStream())).start();
}
class IOWatcher implements Runnable {
InputStream is;
IOWatcher(InputStream is) {
this.is = is;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
if (line.startsWith("source")) { //$NON-NLS-1$
String[] split = line.split(" "); //$NON-NLS-1$
String filename = split[1];
int linenum = Integer.parseInt(split[2]);
ppwDataManager.highlightSourceLine(filename, linenum);
} else if (line.startsWith("exit")) { //$NON-NLS-1$
break;
} else {
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}