blob: f66a2e433560882c8da111783c6c77789a2e64ac [file] [log] [blame]
package org.eclipse.dltk.core.tests.launching;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.core.environment.IFileHandle;
import org.eclipse.osgi.util.NLS;
public class PathFilesContainer {
private static final String PATH = "path";
private IEnvironment environment;
public PathFilesContainer(IEnvironment environment) {
this.environment = environment;
}
public void accept(IFileVisitor visitor) {
accept(visitor, new NullProgressMonitor());
}
public void accept(IFileVisitor visitor, IProgressMonitor monitor) {
accept(visitor, -1, monitor);
}
public void accept(IFileVisitor visitor, int deep,
IProgressMonitor monitor) {
if (monitor.isCanceled()) {
return;
}
// Path variable
Map<?, ?> env = DebugPlugin.getDefault().getLaunchManager()
.getNativeEnvironmentCasePreserved();
String path = null;
final Iterator<?> it = env.keySet().iterator();
while (it.hasNext()) {
final String name = (String) it.next();
if (name.compareToIgnoreCase(PATH) == 0) { // $NON-NLS-1$
path = (String) env.get(name);
}
}
if (path == null) {
return;
}
// Folder list
final String separator = Platform.getOS().equals(Platform.OS_WIN32)
? ";" //$NON-NLS-1$
: ":"; // $NON-NLS-1$
final List<IPath> folders = new ArrayList<>();
String[] res = path.split(separator);
for (int i = 0; i < res.length; i++) {
folders.add(Path.fromOSString(res[i]));
}
ArrayList<IFileHandle> searchedFiles = new ArrayList<>();
final Iterator<IPath> iter = folders.iterator();
while (iter.hasNext()) {
final IPath folder = iter.next();
if (folder != null) {
IFileHandle f = environment.getFile(folder);
if (f.isDirectory()) {
visitFolder(visitor, f, monitor, deep, searchedFiles);
}
}
}
}
/**
* Searches the specified directory recursively for installed Interpreters,
* adding each detected Interpreter to the <code>found</code> list. Any
* directories specified in the <code>ignore</code> are not traversed.
*
* @param visitor
*
* @param ry
* @param found
* @param types
* @param ignore
* @param deep
* deepness of search. -1 if infinite.
* @param searchedFiles
*/
protected void visitFolder(IFileVisitor visitor, IFileHandle directory,
IProgressMonitor monitor, int deep,
ArrayList<IFileHandle> searchedFiles) {
if (deep == 0) {
return;
}
if (monitor.isCanceled()) {
return;
}
if (searchedFiles.contains(directory)) {
return;
}
IFileHandle[] childFiles = directory.getChildren();
if (childFiles == null) {
return;
}
List<?> subDirs = new ArrayList<>();
for (int i = 0; i < childFiles.length; i++) {
if (monitor.isCanceled()) {
return;
}
final IFileHandle file = childFiles[i];
monitor.subTask(NLS.bind("Searching {0}", file.getCanonicalPath()));
// Check if file is a symlink
if (file.isDirectory()
&& (!file.getCanonicalPath().equals(file.toOSString()))) {
continue;
}
if (visitor.visit(file)) {
while (!subDirs.isEmpty()) {
IFileHandle subDir = (IFileHandle) subDirs.remove(0);
visitFolder(visitor, subDir, monitor, deep - 1,
searchedFiles);
}
}
}
searchedFiles.add(directory);
}
}