/****************************************************************************** * Copyright (C) 2013 Jonah Graham * * 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: * Jonah Graham <jonah@kichwacoders.com> - initial API and implementation ******************************************************************************/ package org.python.pydev.ui.pythonpathconf; import java.io.File; import java.util.LinkedHashSet; import java.util.List; import java.util.regex.Pattern; import org.python.pydev.shared_core.io.FileUtils; public abstract class AbstractInterpreterProviderFactory implements IInterpreterProviderFactory { public AbstractInterpreterProviderFactory() { super(); } private static final int INVALID = -1; private int matchesPattern(Pattern[] patterns, File afile) { // Add other conditions here if stricter file validation is necessary. for (int i = 0; i < patterns.length; i++) { Pattern pattern = patterns[i]; if (pattern.matcher(afile.getName().toLowerCase()).matches()) { return i; } } return INVALID; } public String[] searchPaths(java.util.Set<String> pathsToSearch, final List<String> expectedPatterns) { return searchPaths(pathsToSearch, expectedPatterns, true); } /** * Searches a set of paths for files whose names match any of the provided patterns. * @param pathsToSearch The paths to search for files. * @param expectedPatterns A list of regex patterns that the filenames to find must match. * The patterns are in order of decreasing priority, meaning that filenames matching the * pattern at index i will appear earlier in the returned array than filenames matching * patterns at index i+1. * @return An array of all matching filenames found, in order of decreasing priority. */ public String[] searchPaths(java.util.Set<String> pathsToSearch, final List<String> expectedPatterns, boolean followLinks) { int n = expectedPatterns.size(); @SuppressWarnings("unchecked") LinkedHashSet<String>[] pathSetsByPriority = new LinkedHashSet[n]; LinkedHashSet<String> prioritizedPaths = new LinkedHashSet<String>(); Pattern[] patterns = new Pattern[n]; for (int i = 0; i < n; i++) { patterns[i] = Pattern.compile(expectedPatterns.get(i)); } for (String s : pathsToSearch) { String pathname = s.trim(); if (pathname.length() > 0) { File file = new File(pathname); if (file.isDirectory()) { File[] available = file.listFiles(); if (available != null) { for (File afile : available) { int priority = matchesPattern(patterns, afile); if (priority != INVALID) { if (pathSetsByPriority[priority] == null) { pathSetsByPriority[priority] = new LinkedHashSet<String>(); } LinkedHashSet<String> pathSet = pathSetsByPriority[priority]; File f = new File(file, afile.getName()); if (!followLinks) { pathSet.add(FileUtils.getFileAbsolutePathNotFollowingLinks(f)); } else { pathSet.add(FileUtils.getFileAbsolutePath(f)); } } } } } } } for (LinkedHashSet<String> pathSet : pathSetsByPriority) { if (pathSet != null) { prioritizedPaths.addAll(pathSet); } } return prioritizedPaths.toArray(new String[prioritizedPaths.size()]); } }