mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-14 08:18:29 +00:00
Added version detection for netbeans. Installing into netbeans now does:
pre 6.8: Error explaining lombok isn't supported pre 6.8. 6.8: Install. post 6.8: Explain its no longer needed + how to make lombok.jar work in 6.9.
This commit is contained in:
1 parent
f89dbe5d0e
commit
dec77abcca
5 files changed
+202
-46
No files matched your search
@@ -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,18 @@ package lombok.installer;
|
||||
* Thrown when installation of lombok into an IDE fails.
|
||||
*/
|
||||
public class InstallException extends Exception {
|
||||
private boolean warning;
|
||||
|
||||
public InstallException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public InstallException(boolean warning, String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
this.warning = warning;
|
||||
}
|
||||
|
||||
public boolean isWarning() {
|
||||
return warning;
|
||||
}
|
||||
}
|
||||
@@ -266,13 +266,21 @@ public class Installer {
|
||||
}
|
||||
System.out.printf("Lombok %s %s: %s\n", uninstall ? "uninstalled" : "installed", uninstall ? "from" : "to", loc.getName());
|
||||
} catch (InstallException e) {
|
||||
System.err.printf("Installation at %s failed:\n", loc.getName());
|
||||
if (e.isWarning()) {
|
||||
System.err.printf("Warning while installing at %s:\n", loc.getName());
|
||||
} else {
|
||||
System.err.printf("Installation at %s failed:\n", loc.getName());
|
||||
validLocations--;
|
||||
}
|
||||
System.err.println(e.getMessage());
|
||||
validLocations--;
|
||||
} catch (UninstallException e) {
|
||||
System.err.printf("Uninstall at %s failed:\n", loc.getName());
|
||||
if (e.isWarning()) {
|
||||
System.err.printf("Warning while uninstalling at %s:\n", loc.getName());
|
||||
} else {
|
||||
System.err.printf("Uninstall at %s failed:\n", loc.getName());
|
||||
validLocations--;
|
||||
}
|
||||
System.err.println(e.getMessage());
|
||||
validLocations--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,6 +45,8 @@ import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -452,56 +454,81 @@ public class InstallerGUI {
|
||||
spinner.add(new JLabel(new ImageIcon(Installer.class.getResource("loading.gif"))));
|
||||
appWindow.setContentPane(spinner);
|
||||
|
||||
final AtomicReference<Boolean> success = new AtomicReference<Boolean>(true);
|
||||
final AtomicInteger successes = new AtomicInteger();
|
||||
final AtomicBoolean failure = new AtomicBoolean();
|
||||
|
||||
new Thread() {
|
||||
@Override public void run() {
|
||||
for (IdeLocation loc : toInstall) {
|
||||
try {
|
||||
installSpecificMessages.add(loc.install());
|
||||
successes.incrementAndGet();
|
||||
} catch (final InstallException e) {
|
||||
success.set(false);
|
||||
try {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override public void run() {
|
||||
JOptionPane.showMessageDialog(appWindow,
|
||||
e.getMessage(), "Install 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(), "Install Problem", JOptionPane.WARNING_MESSAGE);
|
||||
}
|
||||
});
|
||||
} catch (Exception e2) {
|
||||
e2.printStackTrace();
|
||||
//Shouldn't happen.
|
||||
throw new RuntimeException(e2);
|
||||
}
|
||||
} else {
|
||||
failure.set(true);
|
||||
try {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override public void run() {
|
||||
JOptionPane.showMessageDialog(appWindow,
|
||||
e.getMessage(), "Install Problem", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
});
|
||||
} catch (Exception e2) {
|
||||
e2.printStackTrace();
|
||||
//Shouldn't happen.
|
||||
throw new RuntimeException(e2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (success.get()) SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
StringBuilder installSpecific = new StringBuilder();
|
||||
for (String installSpecificMessage : installSpecificMessages) {
|
||||
installSpecific.append("<br>").append(installSpecificMessage);
|
||||
}
|
||||
JOptionPane.showMessageDialog(appWindow,
|
||||
"<html>Lombok has been installed on the selected IDE installations.<br>" +
|
||||
"Don't forget to add <code>lombok.jar</code> to your projects, and restart your IDE!" + installSpecific.toString() + "</html>",
|
||||
"Install successful",
|
||||
JOptionPane.INFORMATION_MESSAGE);
|
||||
appWindow.setVisible(false);
|
||||
synchronized (exitMarker) {
|
||||
exitMarker.set(0);
|
||||
exitMarker.notifyAll();
|
||||
}
|
||||
if (successes.get() > 0) {
|
||||
try {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override public void run() {
|
||||
StringBuilder installSpecific = new StringBuilder();
|
||||
for (String installSpecificMessage : installSpecificMessages) {
|
||||
installSpecific.append("<br>").append(installSpecificMessage);
|
||||
}
|
||||
JOptionPane.showMessageDialog(appWindow,
|
||||
"<html>Lombok has been installed on the selected IDE installations.<br>" +
|
||||
"Don't forget to add <code>lombok.jar</code> to your projects, and restart your IDE!" + installSpecific.toString() + "</html>",
|
||||
"Install successful",
|
||||
JOptionPane.INFORMATION_MESSAGE);
|
||||
appWindow.setVisible(false);
|
||||
synchronized (exitMarker) {
|
||||
exitMarker.set(0);
|
||||
exitMarker.notifyAll();
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
// Shouldn't happen.
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
|
||||
if (!success.get()) SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
synchronized (exitMarker) {
|
||||
exitMarker.set(1);
|
||||
exitMarker.notifyAll();
|
||||
} else {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
synchronized (exitMarker) {
|
||||
exitMarker.set(failure.get() ? 1 : 0);
|
||||
exitMarker.notifyAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
@@ -515,12 +542,13 @@ public class InstallerGUI {
|
||||
final Container originalContentPane = appWindow.getContentPane();
|
||||
appWindow.setContentPane(spinner);
|
||||
|
||||
final AtomicReference<Boolean> success = new AtomicReference<Boolean>(true);
|
||||
final AtomicInteger successes = new AtomicInteger();
|
||||
new Thread(new Runnable() {
|
||||
@Override public void run() {
|
||||
for (IdeLocation loc : toUninstall) {
|
||||
try {
|
||||
loc.uninstall();
|
||||
successes.incrementAndGet();
|
||||
} catch (final UninstallException e) {
|
||||
if (e.isWarning()) {
|
||||
try {
|
||||
@@ -536,7 +564,6 @@ public class InstallerGUI {
|
||||
throw new RuntimeException(e2);
|
||||
}
|
||||
} else {
|
||||
success.set(false);
|
||||
try {
|
||||
SwingUtilities.invokeAndWait(new Runnable() {
|
||||
@Override public void run() {
|
||||
@@ -555,7 +582,7 @@ public class InstallerGUI {
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
if (success.get()) {
|
||||
if (successes.get() > 0) {
|
||||
JOptionPane.showMessageDialog(appWindow, "Lombok has been removed from the selected IDE installations.", "Uninstall successful", JOptionPane.INFORMATION_MESSAGE);
|
||||
appWindow.setVisible(false);
|
||||
System.exit(0);
|
||||
|
||||
@@ -26,9 +26,11 @@ package lombok.installer;
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -44,7 +44,9 @@ import lombok.installer.UninstallException;
|
||||
public class NetbeansLocation extends IdeLocation {
|
||||
private final String name;
|
||||
private final File netbeansConfPath;
|
||||
private volatile boolean hasLombok;
|
||||
private final String version;
|
||||
private final int versionFirst, versionSecond;
|
||||
private final boolean hasLombok;
|
||||
|
||||
private static final String OS_NEWLINE = IdeFinder.getOS().getLineEnding();
|
||||
|
||||
@@ -58,6 +60,33 @@ public class NetbeansLocation extends IdeLocation {
|
||||
"I can't read the configuration file of the Netbeans installed at " + name + "\n" +
|
||||
"You may need to run this installer with root privileges if you want to modify that Netbeans.", "netbeans", e);
|
||||
}
|
||||
this.version = findNetbeansVersion(netbeansConfPath);
|
||||
int first, second;
|
||||
String[] vs = version.split("\\.");
|
||||
try {
|
||||
first = Integer.parseInt(vs[0]);
|
||||
} catch (Exception e) {
|
||||
first = 0;
|
||||
}
|
||||
try {
|
||||
second = Integer.parseInt(vs[1]);
|
||||
} catch (Exception e) {
|
||||
second = 0;
|
||||
}
|
||||
this.versionFirst = first;
|
||||
this.versionSecond = second;
|
||||
}
|
||||
|
||||
public boolean versionIsPre68() {
|
||||
return versionFirst < 6 || (versionFirst == 6 && versionSecond < 8);
|
||||
}
|
||||
|
||||
public boolean versionIs68() {
|
||||
return versionFirst == 6 && versionSecond == 8;
|
||||
}
|
||||
|
||||
public boolean versionIsPost68() {
|
||||
return versionFirst > 6 || (versionFirst == 6 && versionSecond > 8);
|
||||
}
|
||||
|
||||
@Override public int hashCode() {
|
||||
@@ -92,6 +121,51 @@ public class NetbeansLocation extends IdeLocation {
|
||||
private final Pattern OPTIONS_LINE_MATCHER = Pattern.compile(
|
||||
"^\\s*netbeans_default_options\\s*=\\s*\"\\s*" + ID_CHARS + "\\s*(\")\\s*(?:#.*)?$", Pattern.CASE_INSENSITIVE);
|
||||
|
||||
private String findNetbeansVersion(File iniFile) {
|
||||
String forcedVersion = System.getProperty("force.netbeans.version", null);
|
||||
if (forcedVersion != null) return forcedVersion;
|
||||
|
||||
try {
|
||||
for (File child : iniFile.getParentFile().getParentFile().listFiles()) {
|
||||
if (!child.isDirectory()) continue;
|
||||
String name = child.getName();
|
||||
if (name == null || !name.startsWith("nb")) continue;
|
||||
String version = name.substring(2);
|
||||
File versionFile = new File(child, "VERSION.txt");
|
||||
if (versionFile.exists() && versionFile.canRead() && !versionFile.isDirectory()) {
|
||||
try {
|
||||
version = readVersionFile(versionFile);
|
||||
} catch (IOException e) {
|
||||
// Intentional Fallthrough
|
||||
}
|
||||
}
|
||||
if (version != null && version.length() > 0) {
|
||||
return version;
|
||||
}
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
// Intentional Fallthrough
|
||||
}
|
||||
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
private static String readVersionFile(File file) throws IOException {
|
||||
FileInputStream fis = new FileInputStream(file);
|
||||
StringBuilder version = new StringBuilder();
|
||||
try {
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
|
||||
for (String line = br.readLine(); line != null; line = br.readLine()) {
|
||||
if (line.startsWith("#")) continue;
|
||||
if (version.length() > 0) version.append(" ");
|
||||
version.append(line);
|
||||
}
|
||||
return version.toString();
|
||||
} finally {
|
||||
fis.close();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkForLombok(File iniFile) throws IOException {
|
||||
if (!iniFile.exists()) return false;
|
||||
FileInputStream fis = new FileInputStream(iniFile);
|
||||
@@ -203,6 +277,40 @@ public class NetbeansLocation extends IdeLocation {
|
||||
*/
|
||||
@Override
|
||||
public String install() throws InstallException {
|
||||
if ("UNKNOWN".equals(version)) {
|
||||
throw new InstallException(String.format(
|
||||
"Can't determine version of Netbeans installed at:\n%s\n\n" +
|
||||
"Your Netbeans version determines what this installer does:\n" +
|
||||
"Pre 6.8: Lombok is not compatible with netbeans pre 6.8, and thus won't install.\n" +
|
||||
"6.8: Lombok will install itself into Netbeans.\n" +
|
||||
"6.9 and later: NetBeans supports lombok natively. This installer will explain how to enable it.\n\n" +
|
||||
"If you know your netbeans version, you can force this by starting the installer with:\n" +
|
||||
"java -Dforce.netbeans.version=6.8 -jar lombok.jar", this.getName()), null);
|
||||
}
|
||||
|
||||
if (versionIsPre68()) {
|
||||
throw new InstallException(String.format(
|
||||
"Lombok is not compatible with Netbeans versions prior to 6.8.\n" +
|
||||
"Therefore, lombok will not be installed at:\n%s\nbecause it is version: %s",
|
||||
this.getName(), version), null);
|
||||
}
|
||||
if (versionIsPost68()) {
|
||||
try {
|
||||
uninstall();
|
||||
} catch (Exception e) {
|
||||
// Well, we tried. Lombok on 6.9 doesn't do anything, so we'll leave it then.
|
||||
}
|
||||
|
||||
throw new InstallException(true, String.format(
|
||||
"Starting with NetBeans 6.9, lombok is natively supported and does not need to be installed at:\n%s\n\n" +
|
||||
"To use lombok.jar in your netbeans project:\n" +
|
||||
"1. Add lombok.jar to your project (Go to Project Properties, 'Libraries' page, and add lombok.jar in the 'Compile' tab).\n" +
|
||||
"2. Enable Annotation Processors (Go to Project Properties, 'Build/Compiling' page, and check 'Enable Annotation Processing in Editor').\n" +
|
||||
"\n" +
|
||||
"NB: In the first release of NetBeans 6.9, due to a netbeans bug, maven-based projects don't run annotation processors. This \n" +
|
||||
"issue should be fixed by the great folks at NetBeans soon.", this.getName()), null);
|
||||
}
|
||||
|
||||
boolean installSucceeded = false;
|
||||
StringBuilder newContents = new StringBuilder();
|
||||
|
||||
|
||||
Reference in new issue
Block a user