/*******************************************************************************
* Copyright (c) 2015 Red Hat, Inc.
* 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:
* Red Hat Incorporated - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.application.tests;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.cdt.utils.pty.PTY;
import org.eclipse.cdt.utils.spawner.ProcessFactory;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
public class Utilities {
private static Utilities instance;
private Utilities() {
}
public static Utilities getDefault() {
if (instance == null)
instance = new Utilities();
return instance;
}
public IPath getProjectPath (String name) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IPath rootLocation = root.getLocation();
IPath destProjectDirPath = rootLocation.append(name);
return destProjectDirPath;
}
public boolean buildProject (String name) {
File destProjectDir = getProjectPath(name).toFile();
String resourceDirPath = "/projects/" + name; //$NON-NLS-1$
try {
String path = FileLocator.toFileURL(
this.getClass().getResource(resourceDirPath)).getPath();
File projectDir = new Path(path).toFile();
copy(projectDir, destProjectDir);
Process process = execute(new String[]{"make","all","2>&1"}, null, destProjectDir, false);
boolean done = false;
while (!done) {
try {
process.exitValue();
done = true;
byte b[] = new byte[1000];
int numread = 0;
InputStream stream = process.getInputStream();
do {
numread = stream.read(b);
String x = new String(b);
System.out.print(x);
} while (numread >= 0);
} catch (IllegalThreadStateException e) {
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
}
}
}
process.destroy();
process = execute(new String[]{"ls","-l"}, null, destProjectDir, false);
done = false;
while (!done) {
try {
process.exitValue();
done = true;
byte b[] = new byte[1000];
int numread = 0;
while (numread >= 0) {
numread = process.getInputStream().read(b);
String x = new String(b);
System.out.println(x);
}
} catch (IllegalThreadStateException e) {
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
}
}
}
process.destroy();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean cleanProject (String name) {
IPath destProjectDirPath = getProjectPath(name);
File destProjectDir = destProjectDirPath.toFile();
try {
Process process = execute(new String[]{"make","clean"}, null, destProjectDir, false);
boolean done = false;
while (!done) {
try {
process.exitValue();
done = true;
byte b[] = new byte[1000];
process.getInputStream().read(b);
System.out.println(b);
} catch (IllegalThreadStateException e) {
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
}
}
}
process.destroy();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public static Process execute(String[] commandArray, String[] env, File wd, boolean usePty) throws IOException {
Process process = null;
if (env == null) {
Map<String, String> envMap = DebugPlugin.getDefault().getLaunchManager().getNativeEnvironment();
env = new String[envMap.size()];
int i = 0;
for (Entry<String, String> entry : envMap.entrySet()) {
env[i++] = entry.getKey() + "=" + entry.getValue();
}
}
try {
process = startProcess(commandArray, env, wd, false);
return process;
} catch (IOException e) {
throw e;
}
}
private static Process startProcess(String[] commandArray, String[] envp, File workDir, boolean usePty) throws IOException {
if (workDir == null) {
return ProcessFactory.getFactory().exec(commandArray, envp);
}
if (PTY.isSupported() && usePty) {
return ProcessFactory.getFactory().exec(commandArray, envp, workDir, new PTY());
} else {
return ProcessFactory.getFactory().exec(commandArray, envp, workDir);
}
}
public static void copy (File src, File dest)
throws IOException {
if (src.isDirectory()) {
// ensure destination directory exists
if (!dest.exists()){
dest.mkdir();
}
// copy all children files recursively
String files[] = src.list();
for (String file : files) {
File srcFile = new File(src, file);
File destFile = new File(dest, file);
copy(srcFile, destFile);
}
} else { // is a file, manually copy the contents over
Files.copy(src.toPath(), dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
}
}