diff options
Diffstat (limited to 'src/installer')
6 files changed, 174 insertions, 94 deletions
diff --git a/src/installer/lombok/installer/IdeLocation.java b/src/installer/lombok/installer/IdeLocation.java index f23eef01..f34f161f 100644 --- a/src/installer/lombok/installer/IdeLocation.java +++ b/src/installer/lombok/installer/IdeLocation.java @@ -54,7 +54,7 @@ public abstract class IdeLocation { /** * Returns a full path to the provided file. - * Returns the canonical path, unless that is not available, in which cae it returns the absolute path. + * Returns the canonical path, unless that is not available, in which case it returns the absolute path. */ public static String canonical(File p) { try { diff --git a/src/installer/lombok/installer/Installer.java b/src/installer/lombok/installer/Installer.java index 6ce8efdb..f9e5d967 100644 --- a/src/installer/lombok/installer/Installer.java +++ b/src/installer/lombok/installer/Installer.java @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + * Copyright © 2009-2010 Reinier Zwitserloot and Roel Spilker. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -22,6 +22,7 @@ package lombok.installer; import java.awt.HeadlessException; +import java.io.File; import java.io.IOException; import java.net.URI; import java.util.ArrayList; @@ -38,6 +39,7 @@ import lombok.core.LombokApp; import lombok.core.SpiLoadUtil; import lombok.core.Version; import lombok.installer.IdeFinder.OS; +import lombok.patcher.inject.LiveInjector; import org.mangosdk.spi.ProviderFor; @@ -98,6 +100,16 @@ public class Installer { } } + public static boolean isSelf(String jar) { + String self = LiveInjector.findPathJar(Installer.class); + if (self == null) return false; + File a = new File(jar).getAbsoluteFile(); + File b = new File(self).getAbsoluteFile(); + try { a = a.getCanonicalFile(); } catch (IOException ignore) {} + try { b = b.getCanonicalFile(); } catch (IOException ignore) {} + return a.equals(b); + } + @ProviderFor(LombokApp.class) public static class GraphicalInstallerApp implements LombokApp { @Override public String getAppName() { diff --git a/src/installer/lombok/installer/InstallerGUI.java b/src/installer/lombok/installer/InstallerGUI.java index 173aadd4..99968e34 100644 --- a/src/installer/lombok/installer/InstallerGUI.java +++ b/src/installer/lombok/installer/InstallerGUI.java @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + * Copyright © 2009-2010 Reinier Zwitserloot and Roel Spilker. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -512,39 +512,63 @@ public class InstallerGUI { spinner.setLayout(new FlowLayout()); spinner.add(new JLabel(new ImageIcon(Installer.class.getResource("/lombok/installer/loading.gif")))); + final Container originalContentPane = appWindow.getContentPane(); appWindow.setContentPane(spinner); final AtomicReference<Boolean> success = new AtomicReference<Boolean>(true); - new Thread() { + new Thread(new Runnable() { @Override public void run() { for (IdeLocation loc : toUninstall) { try { loc.uninstall(); } catch (final UninstallException e) { - success.set(false); - try { - SwingUtilities.invokeAndWait(new Runnable() { - @Override public void run() { - JOptionPane.showMessageDialog(appWindow, - e.getMessage(), "Uninstall Problem", JOptionPane.ERROR_MESSAGE); - } - }); - } catch (Exception e2) { - //Shouldn't happen. - throw new RuntimeException(e2); + if (e.isWarning()) { + try { + SwingUtilities.invokeAndWait(new Runnable() { + @Override public void run() { + JOptionPane.showMessageDialog(appWindow, + e.getMessage(), "Uninstall Problem", JOptionPane.WARNING_MESSAGE); + } + }); + } catch (Exception e2) { + e2.printStackTrace(); + //Shouldn't happen. + throw new RuntimeException(e2); + } + } else { + success.set(false); + try { + SwingUtilities.invokeAndWait(new Runnable() { + @Override public void run() { + JOptionPane.showMessageDialog(appWindow, + e.getMessage(), "Uninstall Problem", JOptionPane.ERROR_MESSAGE); + } + }); + } catch (Exception e2) { + e2.printStackTrace(); + //Shouldn't happen. + throw new RuntimeException(e2); + } } } } - if (success.get()) SwingUtilities.invokeLater(new Runnable() { + SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - JOptionPane.showMessageDialog(appWindow, "Lombok has been removed from the selected IDE installations.", "Uninstall successful", JOptionPane.INFORMATION_MESSAGE); - appWindow.setVisible(false); - System.exit(0); + if (success.get()) { + JOptionPane.showMessageDialog(appWindow, "Lombok has been removed from the selected IDE installations.", "Uninstall successful", JOptionPane.INFORMATION_MESSAGE); + appWindow.setVisible(false); + System.exit(0); + return; + } + + appWindow.setContentPane(originalContentPane); } }); + + } - }.start(); + }).start(); } private IdesList idesList = new IdesList(); diff --git a/src/installer/lombok/installer/UninstallException.java b/src/installer/lombok/installer/UninstallException.java index f7af8340..c381ecec 100644 --- a/src/installer/lombok/installer/UninstallException.java +++ b/src/installer/lombok/installer/UninstallException.java @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + * Copyright © 2009-2010 Reinier Zwitserloot and Roel Spilker. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,7 +25,16 @@ package lombok.installer; * Thrown when uninstallation of lombok into an IDE fails. */ public class UninstallException extends Exception { + private boolean warning; public UninstallException(String message, Throwable cause) { super(message, cause); } + public UninstallException(boolean warning, String message, Throwable cause) { + super(message, cause); + this.warning = warning; + } + + public boolean isWarning() { + return warning; + } } diff --git a/src/installer/lombok/installer/eclipse/EclipseLocation.java b/src/installer/lombok/installer/eclipse/EclipseLocation.java index a17c9435..d790c0b0 100644 --- a/src/installer/lombok/installer/eclipse/EclipseLocation.java +++ b/src/installer/lombok/installer/eclipse/EclipseLocation.java @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + * Copyright © 2009-2010 Reinier Zwitserloot and Roel Spilker. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -38,6 +38,7 @@ import lombok.installer.CorruptedIdeLocationException; import lombok.installer.IdeFinder; import lombok.installer.IdeLocation; import lombok.installer.InstallException; +import lombok.installer.Installer; import lombok.installer.UninstallException; /** @@ -141,23 +142,7 @@ public class EclipseLocation extends IdeLocation { */ @Override public void uninstall() throws UninstallException { - for (File dir : getUninstallDirs()) { - File lombokJar = new File(dir, "lombok.jar"); - if (lombokJar.exists()) { - if (!lombokJar.delete()) throw new UninstallException( - "Can't delete " + lombokJar.getAbsolutePath() + generateWriteErrorMessage(), null); - } - - /* legacy code - lombok at one point used to have a separate jar for the eclipse agent. - * Leave this code in to delete it for those upgrading from an old version. */ { - File agentJar = new File(dir, "lombok.eclipse.agent.jar"); - if (agentJar.exists()) { - if (!agentJar.delete()) throw new UninstallException( - "Can't delete " + agentJar.getAbsolutePath() + generateWriteErrorMessage(), null); - } - } - } - + final List<File> lombokJarsForWhichCantDeleteSelf = new ArrayList<File>(); StringBuilder newContents = new StringBuilder(); if (eclipseIniPath.exists()) { try { @@ -202,6 +187,35 @@ public class EclipseLocation extends IdeLocation { throw new UninstallException("Cannot uninstall lombok from " + name + generateWriteErrorMessage(), e); } } + + for (File dir : getUninstallDirs()) { + File lombokJar = new File(dir, "lombok.jar"); + if (lombokJar.exists()) { + if (!lombokJar.delete()) { + if (IdeFinder.getOS() == IdeFinder.OS.WINDOWS && Installer.isSelf(lombokJar.getAbsolutePath())) { + lombokJarsForWhichCantDeleteSelf.add(lombokJar); + } else { + throw new UninstallException( + "Can't delete " + lombokJar.getAbsolutePath() + generateWriteErrorMessage(), null); + } + } + } + + /* legacy code - lombok at one point used to have a separate jar for the eclipse agent. + * Leave this code in to delete it for those upgrading from an old version. */ { + File agentJar = new File(dir, "lombok.eclipse.agent.jar"); + if (agentJar.exists()) { + agentJar.delete(); + } + } + } + + if (!lombokJarsForWhichCantDeleteSelf.isEmpty()) { + throw new UninstallException(true, String.format( + "lombok.jar cannot delete itself on windows.\nHowever, lombok has been uncoupled from your %s.\n" + + "You can safely delete this jar file. You can find it at:\n%s", + getTypeName(), lombokJarsForWhichCantDeleteSelf.get(0).getAbsolutePath()), null); + } } private static String generateWriteErrorMessage() { @@ -244,36 +258,39 @@ public class EclipseLocation extends IdeLocation { File lombokJar = new File(eclipseIniPath.getParentFile(), "lombok.jar"); - File ourJar = findOurJar(); - byte[] b = new byte[524288]; - boolean readSucceeded = true; - try { - FileOutputStream out = new FileOutputStream(lombokJar); + /* No need to copy lombok.jar to itself, obviously. On windows this would generate an error so we check for this. */ + if (!Installer.isSelf(lombokJar.getAbsolutePath())) { + File ourJar = findOurJar(); + byte[] b = new byte[524288]; + boolean readSucceeded = true; try { - readSucceeded = false; - InputStream in = new FileInputStream(ourJar); + FileOutputStream out = new FileOutputStream(lombokJar); try { - while (true) { - int r = in.read(b); - if (r == -1) break; - if (r > 0) readSucceeded = true; - out.write(b, 0, r); + readSucceeded = false; + InputStream in = new FileInputStream(ourJar); + try { + while (true) { + int r = in.read(b); + if (r == -1) break; + if (r > 0) readSucceeded = true; + out.write(b, 0, r); + } + } finally { + in.close(); } } finally { - in.close(); + out.close(); } - } finally { - out.close(); + } catch (IOException e) { + try { + lombokJar.delete(); + } catch (Throwable ignore) { /* Nothing we can do about that. */ } + if (!readSucceeded) throw new InstallException( + "I can't read my own jar file. I think you've found a bug in this installer!\nI suggest you restart it " + + "and use the 'what do I do' link, to manually install lombok. Also, tell us about this at:\n" + + "http://groups.google.com/group/project-lombok - Thanks!", e); + throw new InstallException("I can't write to your " + getTypeName() + " directory at " + name + generateWriteErrorMessage(), e); } - } catch (IOException e) { - try { - lombokJar.delete(); - } catch (Throwable ignore) { /* Nothing we can do about that. */ } - if (!readSucceeded) throw new InstallException( - "I can't read my own jar file. I think you've found a bug in this installer!\nI suggest you restart it " + - "and use the 'what do I do' link, to manually install lombok. Also, tell us about this at:\n" + - "http://groups.google.com/group/project-lombok - Thanks!", e); - throw new InstallException("I can't write to your " + getTypeName() + " directory at " + name + generateWriteErrorMessage(), e); } /* legacy - delete lombok.eclipse.agent.jar if its there, which lombok no longer uses. */ { @@ -307,7 +324,6 @@ public class EclipseLocation extends IdeLocation { newContents.append(line).append(OS_NEWLINE); } - } finally { fis.close(); } diff --git a/src/installer/lombok/installer/netbeans/NetbeansLocation.java b/src/installer/lombok/installer/netbeans/NetbeansLocation.java index ab403170..f4da8f3f 100644 --- a/src/installer/lombok/installer/netbeans/NetbeansLocation.java +++ b/src/installer/lombok/installer/netbeans/NetbeansLocation.java @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + * Copyright © 2009-2010 Reinier Zwitserloot and Roel Spilker. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,6 +29,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -36,6 +38,7 @@ import lombok.installer.CorruptedIdeLocationException; import lombok.installer.IdeFinder; import lombok.installer.IdeLocation; import lombok.installer.InstallException; +import lombok.installer.Installer; import lombok.installer.UninstallException; public class NetbeansLocation extends IdeLocation { @@ -117,12 +120,8 @@ public class NetbeansLocation extends IdeLocation { */ @Override public void uninstall() throws UninstallException { + final List<File> lombokJarsForWhichCantDeleteSelf = new ArrayList<File>(); File dir = netbeansConfPath.getParentFile(); - File lombokJar = new File(dir, "lombok.jar"); - if (lombokJar.exists()) { - if (!lombokJar.delete()) throw new UninstallException( - "Can't delete " + lombokJar.getAbsolutePath() + generateWriteErrorMessage(), null); - } StringBuilder newContents = new StringBuilder(); if (netbeansConfPath.exists()) { @@ -154,6 +153,23 @@ public class NetbeansLocation extends IdeLocation { throw new UninstallException("Cannot uninstall lombok from " + name + generateWriteErrorMessage(), e); } } + + File lombokJar = new File(dir, "lombok.jar"); + if (lombokJar.exists()) { + if (IdeFinder.getOS() == IdeFinder.OS.WINDOWS && Installer.isSelf(lombokJar.getAbsolutePath())) { + lombokJarsForWhichCantDeleteSelf.add(lombokJar); + } else { + throw new UninstallException( + "Can't delete " + lombokJar.getAbsolutePath() + generateWriteErrorMessage(), null); + } + } + + if (!lombokJarsForWhichCantDeleteSelf.isEmpty()) { + throw new UninstallException(true, + "lombok.jar cannot delete itself on windows.\nHowever, lombok has been uncoupled from your netbeans.\n" + + "You can safely delete this jar file. You can find it at:\n" + + lombokJarsForWhichCantDeleteSelf.get(0).getAbsolutePath(), null); + } } private static String generateWriteErrorMessage() { @@ -190,36 +206,39 @@ public class NetbeansLocation extends IdeLocation { File lombokJar = new File(netbeansConfPath.getParentFile(), "lombok.jar"); - File ourJar = findOurJar(); - byte[] b = new byte[524288]; - boolean readSucceeded = true; - try { - FileOutputStream out = new FileOutputStream(lombokJar); + /* No need to copy lombok.jar to itself, obviously. On windows this would generate an error so we check for this. */ + if (!Installer.isSelf(lombokJar.getAbsolutePath())) { + File ourJar = findOurJar(); + byte[] b = new byte[524288]; + boolean readSucceeded = true; try { - readSucceeded = false; - InputStream in = new FileInputStream(ourJar); + FileOutputStream out = new FileOutputStream(lombokJar); try { - while (true) { - int r = in.read(b); - if (r == -1) break; - if (r > 0) readSucceeded = true; - out.write(b, 0, r); + readSucceeded = false; + InputStream in = new FileInputStream(ourJar); + try { + while (true) { + int r = in.read(b); + if (r == -1) break; + if (r > 0) readSucceeded = true; + out.write(b, 0, r); + } + } finally { + in.close(); } } finally { - in.close(); + out.close(); } - } finally { - out.close(); + } catch (IOException e) { + try { + lombokJar.delete(); + } catch (Throwable ignore) { /* Nothing we can do about that. */ } + if (!readSucceeded) throw new InstallException( + "I can't read my own jar file. I think you've found a bug in this installer!\nI suggest you restart it " + + "and use the 'what do I do' link, to manually install lombok. Also, tell us about this at:\n" + + "http://groups.google.com/group/project-lombok - Thanks!", e); + throw new InstallException("I can't write to your Netbeans directory at " + name + generateWriteErrorMessage(), e); } - } catch (IOException e) { - try { - lombokJar.delete(); - } catch (Throwable ignore) { /* Nothing we can do about that. */ } - if (!readSucceeded) throw new InstallException( - "I can't read my own jar file. I think you've found a bug in this installer!\nI suggest you restart it " + - "and use the 'what do I do' link, to manually install lombok. Also, tell us about this at:\n" + - "http://groups.google.com/group/project-lombok - Thanks!", e); - throw new InstallException("I can't write to your Netbeans directory at " + name + generateWriteErrorMessage(), e); } try { |