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); } }