diff options
author | grootjans <grootjans@gmail.com> | 2011-05-16 20:12:19 +0200 |
---|---|---|
committer | grootjans <grootjans@gmail.com> | 2011-05-16 20:12:29 +0200 |
commit | 05d3e9c9840da08c97c1026b45f3505726e412bf (patch) | |
tree | 146c52a409b361f7fc1001745aafdd5cff51efbb /src/installer | |
parent | c2fe4f169f47b51829ce9e31edf8f1dc25ef028e (diff) | |
download | lombok-05d3e9c9840da08c97c1026b45f3505726e412bf.tar.gz lombok-05d3e9c9840da08c97c1026b45f3505726e412bf.tar.bz2 lombok-05d3e9c9840da08c97c1026b45f3505726e412bf.zip |
Generalized fix for Issue #210, now the installer looks recursively for all platforms
Diffstat (limited to 'src/installer')
-rw-r--r-- | src/installer/lombok/installer/eclipse/EclipseFinder.java | 198 |
1 files changed, 101 insertions, 97 deletions
diff --git a/src/installer/lombok/installer/eclipse/EclipseFinder.java b/src/installer/lombok/installer/eclipse/EclipseFinder.java index 101b6347..cf8c5149 100644 --- a/src/installer/lombok/installer/eclipse/EclipseFinder.java +++ b/src/installer/lombok/installer/eclipse/EclipseFinder.java @@ -26,6 +26,7 @@ import static java.util.Arrays.asList; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import lombok.installer.IdeFinder; @@ -61,14 +62,6 @@ public class EclipseFinder extends IdeFinder { return Arrays.asList("\\", "\\Program Files", "\\Program Files (x86)", System.getProperty("user.home", ".")); } - protected List<String> getSourceDirsOnMac() { - return Arrays.asList("/Applications", System.getProperty("user.home", ".")); - } - - protected List<String> getSourceDirsOnUnix() { - return Arrays.asList(System.getProperty("user.home", ".")); - } - /** * Returns a list of paths of Eclipse installations. * Eclipse installations are found by checking for the existence of 'eclipse.exe' in the following locations: @@ -80,55 +73,52 @@ public class EclipseFinder extends IdeFinder { * Where 'X' is tried for all local disk drives, unless there's a problem calling fsutil, in which case only * C: is tried. */ - private void findEclipseOnWindows(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) { + private List<String> getSourceDirsOnWindowsWithDriveLetters() { List<String> driveLetters = asList("C"); try { driveLetters = getDrivesOnWindows(); } catch (Throwable ignore) { ignore.printStackTrace(); } - - //Various try/catch/ignore statements are in this for loop. Weird conditions on the disk can cause exceptions, - //such as an unformatted drive causing a NullPointerException on listFiles. Best action is almost invariably to just - //continue onwards. + List<String> sourceDirs = new ArrayList<String>(); for (String letter : driveLetters) { for (String possibleSource : getSourceDirsOnWindows()) { - try { - File f = new File(letter + ":" + possibleSource); - if (!f.isDirectory()) continue; - recurseDirectory(locations, problems, f); - } catch (Exception ignore) {} + sourceDirs.add(letter + ":" + possibleSource); } } + return sourceDirs; } - private void recurseDirectory(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File f) { - //Various try/catch/ignore statements are in this for loop. Weird conditions on the disk can cause exceptions, - //such as an unformatted drive causing a NullPointerException on listFiles. Best action is almost invariably to just - //continue onwards. - for (File dir : f.listFiles()) { - if (!dir.isDirectory()) continue; - try { - if (dir.getName().toLowerCase().contains(getDirName())) { - String eclipseLocation = findEclipseOnWindows1(dir); - if (eclipseLocation != null) { - try { - IdeLocation newLocation = createLocation(eclipseLocation); - if (newLocation != null) locations.add(newLocation); - } catch (CorruptedIdeLocationException e) { - problems.add(e); - } - } - recurseDirectory(locations, problems, dir); - } - } catch (Exception ignore) {} + protected List<String> getSourceDirsOnMac() { + return Arrays.asList("/Applications", System.getProperty("user.home", ".")); + } + + protected List<String> getSourceDirsOnUnix() { + return Arrays.asList(System.getProperty("user.home", ".")); + } + + private List<File> transformToFiles(List<String> fileNames) { + List<File> files = new ArrayList<File>(); + for (String fileName : fileNames) { + files.add(new File(fileName)); } + return files; + } + + private List<File> getFlatSourceLocationsOnUnix() { + List<File> dirs = new ArrayList<File>(); + dirs.add(new File("/usr/bin/")); + dirs.add(new File("/usr/local/bin/")); + dirs.add(new File(System.getProperty("user.home", "."), "bin/")); + return dirs; } - /** Checks if the provided directory contains 'eclipse.exe', and if so, returns the directory, otherwise null. */ - private String findEclipseOnWindows1(File dir) { - if (new File(dir, getWindowsExecutableName()).isFile()) return dir.getAbsolutePath(); - return null; + private List<File> getNestedSourceLocationOnUnix() { + List<File> dirs = new ArrayList<File>(); + dirs.add(new File("/usr/local/share")); + dirs.add(new File("/usr/local")); + dirs.add(new File("/usr/share")); + return dirs; } /** @@ -147,85 +137,99 @@ public class EclipseFinder extends IdeFinder { public void findIdes(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) { switch (getOS()) { case WINDOWS: - findEclipseOnWindows(locations, problems); + new WindowsFinder().findEclipse(locations, problems); break; case MAC_OS_X: - findEclipseOnMac(locations, problems); + new MacFinder().findEclipse(locations, problems); break; default: case UNIX: - findEclipseOnUnix(locations, problems); + new UnixFinder().findEclipse(locations, problems); break; } } - /** Scans a couple of likely locations on linux. */ - private void findEclipseOnUnix(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) { - List<String> guesses = new ArrayList<String>(); - - File d; - - d = new File("/usr/bin/" + getUnixExecutableName()); - if (d.exists()) guesses.add(d.getPath()); - d = new File("/usr/local/bin/" + getUnixExecutableName()); - if (d.exists()) guesses.add(d.getPath()); - d = new File(System.getProperty("user.home", "."), "bin/" + getUnixExecutableName()); - if (d.exists()) guesses.add(d.getPath()); - - findEclipseOnUnix1("/usr/local/share", guesses); - findEclipseOnUnix1("/usr/local", guesses); - findEclipseOnUnix1("/usr/share", guesses); - for (String possibleSourceDir : getSourceDirsOnUnix()) { - findEclipseOnUnix1(possibleSourceDir, guesses); + private class UnixFinder extends DirectoryFinder { + UnixFinder() { + super(getNestedSourceLocationOnUnix(), getFlatSourceLocationsOnUnix()); } - for (String guess : guesses) { - try { - IdeLocation newLocation = createLocation(guess); - if (newLocation != null) locations.add(newLocation); - } catch (CorruptedIdeLocationException e) { - problems.add(e); - } + @Override protected String findEclipseOnPlatform(File dir) { + File possible = new File(dir, getUnixExecutableName()); + return (possible.exists()) ? possible.getAbsolutePath() : null; } } - private void findEclipseOnUnix1(String dir, List<String> guesses) { - File d = new File(dir); - if (!d.isDirectory()) return; - for (File f : d.listFiles()) { - if (f.isDirectory() && f.getName().toLowerCase().contains(getDirName())) { - File possible = new File(f, getUnixExecutableName()); - if (possible.exists()) guesses.add(possible.getAbsolutePath()); - } + private class WindowsFinder extends DirectoryFinder { + WindowsFinder() { + super(transformToFiles(getSourceDirsOnWindowsWithDriveLetters()), Collections.<File>emptyList()); + } + + /** Checks if the provided directory contains 'eclipse.exe', and if so, returns the directory, otherwise null. */ + @Override + protected String findEclipseOnPlatform(File dir) { + File possible = new File(dir, getWindowsExecutableName()); + return (possible.isFile()) ? dir.getAbsolutePath() : null; } } - /** - * Scans /Applications for any folder named 'Eclipse' - */ - private void findEclipseOnMac(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) { - for (String possibleSourceDir : getSourceDirsOnMac()) { - File[] list = new File(possibleSourceDir).listFiles(); - if (list != null) for (File dir : list) { - findEclipseOnMac1(dir, locations, problems); + private class MacFinder extends DirectoryFinder { + MacFinder() { + super(transformToFiles(getSourceDirsOnMac()), Collections.<File>emptyList()); + } + + protected String findEclipseOnPlatform(File dir) { + if (dir.getName().toLowerCase().equals(getMacExecutableName().toLowerCase())) return dir.getParent(); + if (dir.getName().toLowerCase().contains(getDirName())) { + if (new File(dir, getMacExecutableName()).exists()) return dir.toString(); } + return null; } } - private void findEclipseOnMac1(File f, List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) { - if (!f.isDirectory()) return; - if (f.getName().toLowerCase().equals(getMacExecutableName().toLowerCase())) { - try { - IdeLocation newLocation = createLocation(f.getParent()); - if (newLocation != null) locations.add(newLocation); - } catch (CorruptedIdeLocationException e) { - problems.add(e); + private abstract class DirectoryFinder { + private final List<File> flatSourceDirs; + private final List<File> nestedSourceDirs; + + DirectoryFinder(List<File> nestedSourceDirs, List<File> flatSourceDirs) { + this.nestedSourceDirs = nestedSourceDirs; + this.flatSourceDirs = flatSourceDirs; + } + + public void findEclipse(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) { + for (File dir : nestedSourceDirs) recurseDirectory(locations, problems, dir); + for (File dir : flatSourceDirs) findEclipse(locations, problems, dir); + } + + protected abstract String findEclipseOnPlatform(File dir); + + protected void recurseDirectory(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File dir) { + recurseDirectory0(locations, problems, dir, 0); + } + + private void recurseDirectory0(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File f, int loopCounter) { + //Various try/catch/ignore statements are in this for loop. Weird conditions on the disk can cause exceptions, + //such as an unformatted drive causing a NullPointerException on listFiles. Best action is almost invariably to just + //continue onwards. + File[] listFiles = f.listFiles(); + if (listFiles == null) return; + + for (File dir : listFiles) { + if (!dir.isDirectory()) continue; + try { + if (dir.getName().toLowerCase().contains(getDirName())) { + findEclipse(locations, problems, dir); + if (loopCounter < 50) recurseDirectory0(locations, problems, dir, loopCounter + 1); + } + } catch (Exception ignore) {} } } - if (f.getName().toLowerCase().contains(getDirName())) { - if (new File(f, getMacExecutableName()).exists()) { + + private void findEclipse(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File dir) { + String eclipseLocation = findEclipseOnPlatform(dir); + if (eclipseLocation != null) { try { - IdeLocation newLocation = createLocation(f.toString()); + IdeLocation newLocation = createLocation(eclipseLocation); if (newLocation != null) locations.add(newLocation); } catch (CorruptedIdeLocationException e) { problems.add(e); |