aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@zwitserloot.com>2017-01-20 00:38:10 +0100
committerReinier Zwitserloot <reinier@zwitserloot.com>2017-01-20 00:38:10 +0100
commitce9fa7fb06fda7c459e381022f38564c31b41744 (patch)
tree87bd0cf8593b008e37a5b152c698e1f3c0ebfea1 /src
parent00ce9a72e6625f685da485b3338a9f52ce4227e5 (diff)
parentac2bedb8f31c73a9b92793611c9199ba95f904af (diff)
downloadlombok-ce9fa7fb06fda7c459e381022f38564c31b41744.tar.gz
lombok-ce9fa7fb06fda7c459e381022f38564c31b41744.tar.bz2
lombok-ce9fa7fb06fda7c459e381022f38564c31b41744.zip
Merge remote-tracking branch 'origin/master' into playNiceWithOtherAP
Diffstat (limited to 'src')
-rw-r--r--src/core/lombok/ConfigurationKeys.java25
-rw-r--r--src/core/lombok/core/configuration/ConfigurationApp.java2
-rw-r--r--src/core/lombok/core/handlers/HandlerUtil.java8
-rw-r--r--src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java24
-rw-r--r--src/core/lombok/javac/handlers/JavacHandlerUtil.java17
-rw-r--r--src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java20
-rw-r--r--src/eclipseAgent/lombok/launch/PatchFixesHider.java46
-rw-r--r--src/installer/lombok/installer/IdeLocation.java7
-rw-r--r--src/installer/lombok/installer/IdeLocationProvider.java22
-rw-r--r--src/installer/lombok/installer/Installer.java17
-rw-r--r--src/installer/lombok/installer/InstallerGUI.java10
-rw-r--r--src/installer/lombok/installer/OsUtils.java (renamed from src/installer/lombok/installer/IdeFinder.java)21
-rw-r--r--src/installer/lombok/installer/eclipse/EclipseLocationProvider.java149
-rw-r--r--src/installer/lombok/installer/eclipse/EclipseProductDescriptor.java (renamed from src/installer/lombok/installer/eclipse/STSLocation.java)38
-rw-r--r--src/installer/lombok/installer/eclipse/EclipseProductLocation.java (renamed from src/installer/lombok/installer/eclipse/EclipseLocation.java)55
-rw-r--r--src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java (renamed from src/installer/lombok/installer/eclipse/EclipseFinder.java)256
-rw-r--r--src/installer/lombok/installer/eclipse/JbdsFinder.java70
-rw-r--r--src/installer/lombok/installer/eclipse/JbdsLocation.java45
-rw-r--r--src/installer/lombok/installer/eclipse/JbdsLocationProvider.java49
-rw-r--r--src/installer/lombok/installer/eclipse/MyEclipseFinder.java69
-rw-r--r--src/installer/lombok/installer/eclipse/MyEclipseLocation.java45
-rw-r--r--src/installer/lombok/installer/eclipse/MyEclipseLocationProvider.java52
-rw-r--r--src/installer/lombok/installer/eclipse/RhdsFinder.java70
-rw-r--r--src/installer/lombok/installer/eclipse/RhdsLocation.java45
-rw-r--r--src/installer/lombok/installer/eclipse/RhdsLocationProvider.java49
-rw-r--r--src/installer/lombok/installer/eclipse/STSFinder.java70
-rw-r--r--src/installer/lombok/installer/eclipse/STSLocationProvider.java48
-rw-r--r--src/installer/lombok/installer/eclipse/StandardProductDescriptor.java158
28 files changed, 591 insertions, 896 deletions
diff --git a/src/core/lombok/ConfigurationKeys.java b/src/core/lombok/ConfigurationKeys.java
index 132bde8d..ff17ca09 100644
--- a/src/core/lombok/ConfigurationKeys.java
+++ b/src/core/lombok/ConfigurationKeys.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2014 The Project Lombok Authors.
+ * Copyright (C) 2013-2017 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -41,11 +41,32 @@ public class ConfigurationKeys {
/**
* lombok configuration: {@code lombok.addGeneratedAnnotation} = {@code true} | {@code false}.
*
- * If unset or {@code true}, lombok generates {@code @javax.annotation.Generated("lombok")} on all fields, methods, and types that are generated.
+ * If unset or {@code true}, lombok generates various annotations to mark generated code like {@code @javax.annotation.Generated("lombok")} and {@code @lombok.Generated}.
+ *
+ * @see ConfigurationKeys#ADD_JAVAX_GENERATED_ANNOTATIONS
+ * @see ConfigurationKeys#ADD_LOMBOK_GENERATED_ANNOTATIONS
*/
public static final ConfigurationKey<Boolean> ADD_GENERATED_ANNOTATIONS = new ConfigurationKey<Boolean>("lombok.addGeneratedAnnotation", "Generate @javax.annotation.Generated on all generated code (default: true).") {};
/**
+ * lombok configuration: {@code lombok.addJavaxGeneratedAnnotation} = {@code true} | {@code false}.
+ *
+ * If unset or {@code true}, lombok generates {@code @javax.annotation.Generated("lombok")} on all fields, methods, and types that are generated, unless {@code lombok.addGeneratedAnnotation} is set to {@code false}.
+ *
+ * @see ConfigurationKeys#ADD_GENERATED_ANNOTATIONS
+ */
+ public static final ConfigurationKey<Boolean> ADD_JAVAX_GENERATED_ANNOTATIONS = new ConfigurationKey<Boolean>("lombok.addJavaxGeneratedAnnotation", "Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).") {};
+
+ /**
+ * lombok configuration: {@code lombok.addLombokGeneratedAnnotation} = {@code true} | {@code false}.
+ *
+ * If unset or {@code true}, lombok generates {@code @lombok.Generated} on all fields, methods, and types that are generated, unless {@code lombok.addGeneratedAnnotation} is set to {@code false}.
+ *
+ * @see ConfigurationKeys#ADD_GENERATED_ANNOTATIONS
+ */
+ public static final ConfigurationKey<Boolean> ADD_LOMBOK_GENERATED_ANNOTATIONS = new ConfigurationKey<Boolean>("lombok.addLombokGeneratedAnnotation", "Generate @lombok.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).") {};
+
+ /**
* lombok configuration: {@code lombok.extern.findbugs.addSuppressFBWarnings} = {@code true} | {@code false}.
*
* If {@code true}, lombok generates {@code edu.umd.cs.findbugs.annotations.SuppressFBWarnings} on all fields, methods, and types that are generated.
diff --git a/src/core/lombok/core/configuration/ConfigurationApp.java b/src/core/lombok/core/configuration/ConfigurationApp.java
index e441b4de..efe57e38 100644
--- a/src/core/lombok/core/configuration/ConfigurationApp.java
+++ b/src/core/lombok/core/configuration/ConfigurationApp.java
@@ -198,7 +198,7 @@ public class ConfigurationApp extends LombokApp {
if (paths.size() == 1) {
if (!(argsPaths.size() == 1)) out.printf("Configuration for '%s'.%n%n", paths.iterator().next());
} else {
- out.printf("Configuration for:%n", paths.iterator().next());
+ out.printf("Configuration for:%n");
for (String path : paths) out.printf("- %s%n", path);
out.println();
}
diff --git a/src/core/lombok/core/handlers/HandlerUtil.java b/src/core/lombok/core/handlers/HandlerUtil.java
index ef4ac7d6..a05578d4 100644
--- a/src/core/lombok/core/handlers/HandlerUtil.java
+++ b/src/core/lombok/core/handlers/HandlerUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2015 The Project Lombok Authors.
+ * Copyright (C) 2013-2017 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -109,6 +109,12 @@ public class HandlerUtil {
}
}
+ public static boolean shouldAddGenerated(LombokNode<?, ?, ?> node, ConfigurationKey<Boolean> key) {
+ Boolean add = node.getAst().readConfiguration(key);
+ if (add != null) return add;
+ return !Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_GENERATED_ANNOTATIONS));
+ }
+
public static void handleExperimentalFlagUsage(LombokNode<?, ?, ?> node, ConfigurationKey<FlagUsageType> key, String featureName) {
handleFlagUsage(node, key, featureName, ConfigurationKeys.EXPERIMENTAL_FLAG_USAGE, "any lombok.experimental feature");
}
diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
index 76251225..f822e095 100644
--- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
+++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2015 The Project Lombok Authors.
+ * Copyright (C) 2009-2017 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -1329,6 +1329,7 @@ public class EclipseHandlerUtil {
private static final char[] GENERATED_CODE = "generated code".toCharArray();
private static final char[] LOMBOK = "lombok".toCharArray();
private static final char[][] JAVAX_ANNOTATION_GENERATED = Eclipse.fromQualifiedName("javax.annotation.Generated");
+ private static final char[][] LOMBOK_GENERATED = Eclipse.fromQualifiedName("lombok.Generated");
private static final char[][] EDU_UMD_CS_FINDBUGS_ANNOTATIONS_SUPPRESSFBWARNINGS = Eclipse.fromQualifiedName("edu.umd.cs.findbugs.annotations.SuppressFBWarnings");
public static Annotation[] addSuppressWarningsAll(EclipseNode node, ASTNode source, Annotation[] originalAnnotationArray) {
@@ -1343,24 +1344,29 @@ public class EclipseHandlerUtil {
}
public static Annotation[] addGenerated(EclipseNode node, ASTNode source, Annotation[] originalAnnotationArray) {
- if (Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_GENERATED_ANNOTATIONS))) return originalAnnotationArray;
- return addAnnotation(source, originalAnnotationArray, JAVAX_ANNOTATION_GENERATED, new StringLiteral(LOMBOK, 0, 0, 0));
+ Annotation[] result = originalAnnotationArray;
+ if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_JAVAX_GENERATED_ANNOTATIONS)) {
+ result = addAnnotation(source, result, JAVAX_ANNOTATION_GENERATED, new StringLiteral(LOMBOK, 0, 0, 0));
+ }
+ if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS)) {
+ result = addAnnotation(source, result, LOMBOK_GENERATED, null);
+ }
+ return result;
}
private static Annotation[] addAnnotation(ASTNode source, Annotation[] originalAnnotationArray, char[][] annotationTypeFqn, ASTNode arg) {
char[] simpleName = annotationTypeFqn[annotationTypeFqn.length - 1];
if (originalAnnotationArray != null) for (Annotation ann : originalAnnotationArray) {
- char[] lastToken = null;
-
if (ann.type instanceof QualifiedTypeReference) {
char[][] t = ((QualifiedTypeReference) ann.type).tokens;
- lastToken = t[t.length - 1];
- } else if (ann.type instanceof SingleTypeReference) {
- lastToken = ((SingleTypeReference) ann.type).token;
+ if (Arrays.deepEquals(t, annotationTypeFqn)) return originalAnnotationArray;
}
- if (lastToken != null && Arrays.equals(simpleName, lastToken)) return originalAnnotationArray;
+ if (ann.type instanceof SingleTypeReference) {
+ char[] lastToken = ((SingleTypeReference) ann.type).token;
+ if (Arrays.equals(lastToken, simpleName)) return originalAnnotationArray;
+ }
}
int pS = source.sourceStart, pE = source.sourceEnd;
diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
index af6bb48f..0b4e839d 100644
--- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java
+++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
@@ -1025,9 +1025,12 @@ public class JavacHandlerUtil {
public static void addGenerated(JCModifiers mods, JavacNode node, int pos, JCTree source, Context context) {
if (!LombokOptionsFactory.getDelombokOptions(context).getFormatPreferences().generateGenerated()) return;
- if (!Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_GENERATED_ANNOTATIONS))) {
+ if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_JAVAX_GENERATED_ANNOTATIONS)) {
addAnnotation(mods, node, pos, source, context, "javax.annotation.Generated", node.getTreeMaker().Literal("lombok"));
}
+ if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS)) {
+ addAnnotation(mods, node, pos, source, context, "lombok.Generated", null);
+ }
}
private static void addAnnotation(JCModifiers mods, JavacNode node, int pos, JCTree source, Context context, String annotationTypeFqn, JCExpression arg) {
@@ -1041,12 +1044,16 @@ public class JavacHandlerUtil {
for (JCAnnotation ann : mods.annotations) {
JCTree annType = ann.getAnnotationType();
- Name lastPart = null;
- if (annType instanceof JCIdent) lastPart = ((JCIdent) annType).name;
- else if (annType instanceof JCFieldAccess) lastPart = ((JCFieldAccess) annType).name;
+ if (annType instanceof JCIdent) {
+ Name lastPart = ((JCIdent) annType).name;
+ if (lastPart.contentEquals(simpleName)) return;
+ }
- if (lastPart != null && lastPart.contentEquals(simpleName)) return;
+ if (annType instanceof JCFieldAccess) {
+ if (annType.toString().equals(annotationTypeFqn)) return;
+ }
}
+
JavacTreeMaker maker = node.getTreeMaker();
JCExpression annType = isJavaLangBased ? genJavaLangTypeRef(node, simpleName) : chainDotsString(node, annotationTypeFqn);
annType.pos = pos;
diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java
index 4b18dc0f..77f615b5 100644
--- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java
+++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java
@@ -30,6 +30,8 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup;
+
import lombok.core.AgentLauncher;
import lombok.patcher.Filter;
import lombok.patcher.Hook;
@@ -120,10 +122,28 @@ public class EclipsePatcher implements AgentLauncher.AgentLaunchable {
patchLombokizeAST(sm);
patchEcjTransformers(sm, ecjOnly);
patchExtensionMethod(sm, ecjOnly);
+ patchRenameField(sm);
if (reloadExistingClasses) sm.reloadClasses(instrumentation);
}
+ private static void patchRenameField(ScriptManager sm) {
+ /* RefactoringSearchEngine.search will not return results when renaming field and Data Annotation is present. Return a fake Element to make checks pass */
+ sm.addScript(ScriptBuilder.wrapMethodCall()
+ .target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor", "checkAccessorDeclarations", "org.eclipse.ltk.core.refactoring.RefactoringStatus", "org.eclipse.core.runtime.IProgressMonitor", "org.eclipse.jdt.core.IMethod"))
+ .methodToWrap(new Hook("org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine", "search", "org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup[]", "org.eclipse.jdt.core.search.SearchPattern","org.eclipse.jdt.core.search.IJavaSearchScope","org.eclipse.core.runtime.IProgressMonitor","org.eclipse.ltk.core.refactoring.RefactoringStatus"))
+ .wrapMethod(new Hook("lombok.launch.PatchFixesHider$PatchFixes", "createFakeSearchResult", "org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup[]", "org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup[]", "java.lang.Object"))
+ .requestExtra(StackRequest.THIS)
+ .transplant().build());
+
+ /* Filter search results which are Generated and based on Fields, e.g. Generated getters/setters */
+ sm.addScript(ScriptBuilder.wrapMethodCall()
+ .target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor", "addAccessorOccurrences", "void", "org.eclipse.core.runtime.IProgressMonitor", "org.eclipse.jdt.core.IMethod", "java.lang.String","java.lang.String","org.eclipse.ltk.core.refactoring.RefactoringStatus"))
+ .methodToWrap(new Hook("org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup", "getSearchResults", "org.eclipse.jdt.core.search.SearchMatch[]"))
+ .wrapMethod(new Hook("lombok.launch.PatchFixesHider$PatchFixes", "removeGenerated", "org.eclipse.jdt.core.search.SearchMatch[]", "org.eclipse.jdt.core.search.SearchMatch[]"))
+ .transplant().build());
+ }
+
private static void patchExtractInterface(ScriptManager sm) {
/* Fix sourceEnding for generated nodes to avoid null pointer */
sm.addScript(ScriptBuilder.wrapMethodCall()
diff --git a/src/eclipseAgent/lombok/launch/PatchFixesHider.java b/src/eclipseAgent/lombok/launch/PatchFixesHider.java
index fae06900..b1d73352 100644
--- a/src/eclipseAgent/lombok/launch/PatchFixesHider.java
+++ b/src/eclipseAgent/lombok/launch/PatchFixesHider.java
@@ -36,11 +36,13 @@ import lombok.eclipse.EclipseAugments;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IAnnotatable;
import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.search.SearchMatch;
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Annotation;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
@@ -55,9 +57,11 @@ import org.eclipse.jdt.internal.compiler.lookup.Scope;
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
import org.eclipse.jdt.internal.compiler.parser.Parser;
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
+import org.eclipse.jdt.internal.core.SourceField;
import org.eclipse.jdt.internal.core.dom.rewrite.NodeRewriteEvent;
import org.eclipse.jdt.internal.core.dom.rewrite.RewriteEvent;
import org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner;
+import org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup;
import org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil;
/** These contain a mix of the following:
@@ -565,6 +569,48 @@ final class PatchFixesHider {
return result.size() == methods.length ? methods : result.toArray(new IMethod[result.size()]);
}
+ public static SearchMatch[] removeGenerated(SearchMatch[] returnValue) {
+ List<SearchMatch> result = new ArrayList<SearchMatch>();
+ for (int j = 0; j < returnValue.length; j++) {
+ SearchMatch searchResult = returnValue[j];
+ if (searchResult.getElement() instanceof IField) {
+ IField field = (IField) searchResult.getElement();
+
+ // can not check for value=lombok because annotation is
+ // not fully resolved
+ IAnnotation annotation = field.getAnnotation("Generated");
+ if (annotation != null) {
+ // Method generated at field location, skip
+ continue;
+ }
+
+ }
+ result.add(searchResult);
+ }
+ return result.toArray(new SearchMatch[result.size()]);
+ }
+
+ public static SearchResultGroup[] createFakeSearchResult(SearchResultGroup[] returnValue,
+ Object/*
+ * org.eclipse.jdt.internal.corext.refactoring.rename.
+ * RenameFieldProcessor
+ */ processor) throws Exception {
+ if (returnValue == null || returnValue.length == 0) {
+ // if no matches were found, check if Data annotation is present on the class
+ Field declaredField = processor.getClass().getDeclaredField("fField");
+ if (declaredField != null) {
+ declaredField.setAccessible(true);
+ SourceField fField = (SourceField) declaredField.get(processor);
+ IAnnotation dataAnnotation = fField.getDeclaringType().getAnnotation("Data");
+ if (dataAnnotation != null) {
+ // add fake item, to make refactoring checks pass
+ return new SearchResultGroup[] {new SearchResultGroup(null, new SearchMatch[1])};
+ }
+ }
+ }
+ return returnValue;
+ }
+
public static SimpleName[] removeGeneratedSimpleNames(SimpleName[] in) throws Exception {
Field f = SimpleName.class.getField("$isGenerated");
diff --git a/src/installer/lombok/installer/IdeLocation.java b/src/installer/lombok/installer/IdeLocation.java
index 4e3a7e41..c3853867 100644
--- a/src/installer/lombok/installer/IdeLocation.java
+++ b/src/installer/lombok/installer/IdeLocation.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2014 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* 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,6 @@ import java.io.File;
import java.io.IOException;
import java.net.URL;
-import lombok.installer.eclipse.EclipseFinder;
import lombok.patcher.ClassRootFinder;
/**
@@ -46,7 +45,7 @@ public abstract class IdeLocation {
* a jar that wasn't accessed via the file-system, or if its started via e.g. unpacking the jar.
*/
public static File findOurJar() {
- return new File(ClassRootFinder.findClassRootOfClass(IdeFinder.class));
+ return new File(ClassRootFinder.findClassRootOfClass(OsUtils.class));
}
@Override public String toString() {
@@ -70,7 +69,7 @@ public abstract class IdeLocation {
private static final String LEGAL_PATH_CHARS_WINDOWS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_/:\\ ";
public static String escapePath(String path) {
StringBuilder out = new StringBuilder();
- String legalChars = IdeFinder.getOS() == EclipseFinder.OS.UNIX ? LEGAL_PATH_CHARS : LEGAL_PATH_CHARS_WINDOWS;
+ String legalChars = OsUtils.getOS() == OsUtils.OS.UNIX ? LEGAL_PATH_CHARS : LEGAL_PATH_CHARS_WINDOWS;
for (char c : path.toCharArray()) {
if (legalChars.indexOf(c) == -1) out.append('\\');
out.append(c);
diff --git a/src/installer/lombok/installer/IdeLocationProvider.java b/src/installer/lombok/installer/IdeLocationProvider.java
index 933a5989..c4b64141 100644
--- a/src/installer/lombok/installer/IdeLocationProvider.java
+++ b/src/installer/lombok/installer/IdeLocationProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,20 +21,30 @@
*/
package lombok.installer;
+import java.util.List;
import java.util.regex.Pattern;
-import lombok.installer.IdeFinder.OS;
-
public interface IdeLocationProvider {
/**
* @throws CorruptedIdeLocationException
* Only throw this exception if the location seems like a proper installation except there's something wrong with it.
* Do not throw it (just return {@code null}) if there's nothing there or it looks absolutely nothing like your IDE.
*/
- public abstract IdeLocation create(String path) throws CorruptedIdeLocationException;
+ IdeLocation create(String path) throws CorruptedIdeLocationException;
+
+ /**
+ * Return the usual name of the IDE executable or other obvious marker of an IDE installation on the current platform.
+ */
+ Pattern getLocationSelectors();
/**
- * Return the usual name of the IDE executable or other obvious marker of an IDE installation on the provided platform.
+ * Look for installations of your IDE in the usual places.
+ *
+ * @param locations Add to this list any valid locations that you found.
+ * @param problems
+ * Add to this list any locations that look like installations,
+ * but have problems that prevent you from installing/uninstalling from them. DONT add to this list
+ * any common locations that have no installation at all - only add near misses.
*/
- public abstract Pattern getLocationSelectors(OS os);
+ void findIdes(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems);
}
diff --git a/src/installer/lombok/installer/Installer.java b/src/installer/lombok/installer/Installer.java
index 7ae01d7a..94cc1a45 100644
--- a/src/installer/lombok/installer/Installer.java
+++ b/src/installer/lombok/installer/Installer.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2010 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* 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,7 +38,7 @@ import lombok.Lombok;
import lombok.core.LombokApp;
import lombok.core.SpiLoadUtil;
import lombok.core.Version;
-import lombok.installer.IdeFinder.OS;
+import lombok.installer.OsUtils.OS;
import lombok.patcher.ClassRootFinder;
import org.mangosdk.spi.ProviderFor;
@@ -72,10 +72,9 @@ public class Installer {
}
static List<Pattern> getIdeExecutableNames() {
- OS os = IdeFinder.getOS();
List<Pattern> list = new ArrayList<Pattern>();
for (IdeLocationProvider provider : locationProviders) {
- Pattern p = provider.getLocationSelectors(os);
+ Pattern p = provider.getLocationSelectors();
if (p != null) list.add(p);
}
return list;
@@ -91,12 +90,8 @@ public class Installer {
}
static void autoDiscover(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) {
- try {
- for (IdeFinder finder : SpiLoadUtil.findServices(IdeFinder.class)) {
- finder.findIdes(locations, problems);
- }
- } catch (IOException e) {
- throw Lombok.sneakyThrow(e);
+ for (IdeLocationProvider provider : locationProviders) {
+ provider.findIdes(locations, problems);
}
}
@@ -160,7 +155,7 @@ public class Installer {
}
private static int guiInstaller() {
- if (IdeFinder.getOS() == OS.MAC_OS_X) {
+ if (OsUtils.getOS() == OS.MAC_OS_X) {
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Lombok Installer");
System.setProperty("com.apple.macos.use-file-dialog-packages", "true");
}
diff --git a/src/installer/lombok/installer/InstallerGUI.java b/src/installer/lombok/installer/InstallerGUI.java
index 6b8a58ab..ebdf2035 100644
--- a/src/installer/lombok/installer/InstallerGUI.java
+++ b/src/installer/lombok/installer/InstallerGUI.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2010 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -67,7 +67,7 @@ import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import lombok.core.Version;
-import lombok.installer.IdeFinder.OS;
+import lombok.installer.OsUtils.OS;
/**
* The lombok GUI installer.
@@ -313,7 +313,7 @@ public class InstallerGUI {
final List<Pattern> exeNames = Installer.getIdeExecutableNames();
String file = null;
- if (IdeFinder.getOS() == OS.MAC_OS_X) {
+ if (OsUtils.getOS() == OS.MAC_OS_X) {
FileDialog chooser = new FileDialog(appWindow);
chooser.setMode(FileDialog.LOAD);
@@ -740,7 +740,7 @@ public class InstallerGUI {
} catch (Exception e) {
Runtime rt = Runtime.getRuntime();
try {
- switch (IdeFinder.getOS()) {
+ switch (OsUtils.getOS()) {
case WINDOWS:
String[] cmd = new String[4];
cmd[0] = "cmd.exe";
@@ -781,7 +781,7 @@ public class InstallerGUI {
*/
public void show() {
appWindow.setVisible(true);
- if (IdeFinder.getOS() == OS.MAC_OS_X) {
+ if (OsUtils.getOS() == OS.MAC_OS_X) {
try {
AppleNativeLook.go();
} catch (Throwable ignore) {
diff --git a/src/installer/lombok/installer/IdeFinder.java b/src/installer/lombok/installer/OsUtils.java
index f68a0e4c..2da7de09 100644
--- a/src/installer/lombok/installer/IdeFinder.java
+++ b/src/installer/lombok/installer/OsUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2011 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -34,9 +34,13 @@ import lombok.core.Version;
/**
* Implement and provide this class to add auto-finding a certain brand of IDEs to the lombok installer.
*/
-public abstract class IdeFinder {
+public final class OsUtils {
private static final AtomicBoolean windowsDriveInfoLibLoaded = new AtomicBoolean(false);
+ private OsUtils() {
+ // Prevent instantiation
+ }
+
private static void loadWindowsDriveInfoLib() throws IOException {
if (!windowsDriveInfoLibLoaded.compareAndSet(false, true)) return;
@@ -63,7 +67,7 @@ public abstract class IdeFinder {
}
private static boolean unpackDLL(String dllName, File target) throws IOException {
- InputStream in = IdeFinder.class.getResourceAsStream(dllName);
+ InputStream in = OsUtils.class.getResourceAsStream(dllName);
try {
try {
FileOutputStream out = new FileOutputStream(target);
@@ -130,15 +134,4 @@ public abstract class IdeFinder {
return OS.UNIX;
}
-
- /**
- * Look for installations of your IDE in the usual places.
- *
- * @param locations Add to this list any valid locations that you found.
- * @param problems
- * Add to this list any locations that look like installations,
- * but have problems that prevent you from installing/uninstalling from them. DONT add to this list
- * any common locations that have no installation at all - only add near misses.
- */
- public abstract void findIdes(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems);
}
diff --git a/src/installer/lombok/installer/eclipse/EclipseLocationProvider.java b/src/installer/lombok/installer/eclipse/EclipseLocationProvider.java
index 29716a1f..fa2ce958 100644
--- a/src/installer/lombok/installer/eclipse/EclipseLocationProvider.java
+++ b/src/installer/lombok/installer/eclipse/EclipseLocationProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2011 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,145 +21,24 @@
*/
package lombok.installer.eclipse;
-import static lombok.installer.IdeLocation.canonical;
+import java.util.Collections;
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import lombok.installer.IdeLocation;
import lombok.installer.IdeLocationProvider;
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeFinder.OS;
import org.mangosdk.spi.ProviderFor;
@ProviderFor(IdeLocationProvider.class)
-public class EclipseLocationProvider implements IdeLocationProvider {
- @Override public IdeLocation create(String path) throws CorruptedIdeLocationException {
- return create0(path);
- }
-
- protected List<String> getEclipseExecutableNames() {
- return Arrays.asList("eclipse.app", "eclipse.exe", "eclipse");
- }
-
- protected String getIniName() {
- return "eclipse.ini";
- }
-
- protected IdeLocation makeLocation(String name, File ini) throws CorruptedIdeLocationException {
- return new EclipseLocation(name, ini);
- }
-
- protected String getMacAppName() {
- return "Eclipse.app";
- }
-
- protected String getUnixAppName() {
- return "eclipse";
- }
-
- /**
- * Create a new EclipseLocation by pointing at either the directory contains the Eclipse executable, or the executable itself,
- * or an eclipse.ini file.
- *
- * @throws NotAnIdeLocationException
- * If this isn't an Eclipse executable or a directory with an
- * Eclipse executable.
- */
- protected IdeLocation create0(String path) throws CorruptedIdeLocationException {
- if (path == null) throw new NullPointerException("path");
- File p = new File(path);
-
- if (!p.exists()) return null;
- if (p.isDirectory()) {
- for (String possibleExeName : getEclipseExecutableNames()) {
- File f = new File(p, possibleExeName);
- if (f.exists()) return findEclipseIniFromExe(f, 0);
- }
-
- File f = new File(p, getIniName());
- if (f.exists()) return new EclipseLocation(canonical(p), f);
- }
-
- if (p.isFile()) {
- if (p.getName().equalsIgnoreCase(getIniName())) {
- return new EclipseLocation(canonical(p.getParentFile()), p);
- }
- }
-
- if (getEclipseExecutableNames().contains(p.getName().toLowerCase())) {
- return findEclipseIniFromExe(p, 0);
- }
-
- return null;
- }
-
- private IdeLocation findEclipseIniFromExe(File exePath, int loopCounter) throws CorruptedIdeLocationException {
- /* Try looking for eclipse.ini as sibling to the executable */ {
- File ini = new File(exePath.getParentFile(), getIniName());
- if (ini.isFile()) return makeLocation(canonical(exePath), ini);
- }
-
- /* Try looking for Eclipse.app/Contents/MacOS/eclipse.ini as sibling to executable; this works on Mac OS X. */ {
- File ini = new File(exePath.getParentFile(), getMacAppName() + "/Contents/MacOS/" + getIniName());
- if (ini.isFile()) return makeLocation(canonical(exePath), ini);
- }
-
- /* Starting with Eclipse Mars (with the oomph installer), the structure has changed, and it's now at Eclipse.app/Contents/Eclipse/eclipse.ini*/ {
- File ini = new File(exePath.getParentFile(), getMacAppName() + "/Contents/Eclipse/" + getIniName());
- if (ini.isFile()) return makeLocation(canonical(exePath), ini);
- }
-
- /* If executable is a soft link, follow it and retry. */ {
- if (loopCounter < 50) {
- try {
- String oPath = exePath.getAbsolutePath();
- String nPath = exePath.getCanonicalPath();
- if (!oPath.equals(nPath)) try {
- IdeLocation loc = findEclipseIniFromExe(new File(nPath), loopCounter + 1);
- if (loc != null) return loc;
- } catch (CorruptedIdeLocationException ignore) {
- // Unlinking didn't help find an eclipse, so continue.
- }
- } catch (IOException ignore) { /* okay, that didn't work, assume it isn't a soft link then. */ }
- }
- }
-
- /* If executable is a linux LSB-style path, then look in the usual places that package managers like apt-get use.*/ {
- String path = exePath.getAbsolutePath();
- try {
- path = exePath.getCanonicalPath();
- } catch (IOException ignore) { /* We'll stick with getAbsolutePath()'s result then. */ }
-
- if (path.equals("/usr/bin/" + getUnixAppName()) || path.equals("/bin/" + getUnixAppName()) || path.equals("/usr/local/bin/" + getUnixAppName())) {
- File ini = new File("/usr/lib/" + getUnixAppName() + "/" + getIniName());
- if (ini.isFile()) return makeLocation(path, ini);
- ini = new File("/usr/local/lib/" + getUnixAppName() + "/" + getIniName());
- if (ini.isFile()) return makeLocation(path, ini);
- ini = new File("/usr/local/etc/" + getUnixAppName() + "/" + getIniName());
- if (ini.isFile()) return makeLocation(path, ini);
- ini = new File("/etc/" + getIniName());
- if (ini.isFile()) return makeLocation(path, ini);
- }
- }
-
- /* If we get this far, we lose. */
- return null;
- }
-
- @Override public Pattern getLocationSelectors(OS os) {
- switch (os) {
- case MAC_OS_X:
- return Pattern.compile("^(eclipse|eclipse\\.ini|eclipse\\.app)$", Pattern.CASE_INSENSITIVE);
- case WINDOWS:
- return Pattern.compile("^(eclipse\\.exe|eclipse\\.ini)$", Pattern.CASE_INSENSITIVE);
- default:
- case UNIX:
- return Pattern.compile("^(eclipse|eclipse\\.ini)$", Pattern.CASE_INSENSITIVE);
- }
+public class EclipseLocationProvider extends EclipseProductLocationProvider {
+
+ private static final EclipseProductDescriptor ECLIPSE = new StandardProductDescriptor(
+ "Eclipse",
+ "eclipse",
+ "eclipse",
+ EclipseLocationProvider.class.getResource("eclipse.png"),
+ Collections.<String>emptySet()
+ );
+
+ public EclipseLocationProvider() {
+ super(ECLIPSE);
}
}
diff --git a/src/installer/lombok/installer/eclipse/STSLocation.java b/src/installer/lombok/installer/eclipse/EclipseProductDescriptor.java
index 40ade40a..8f736a57 100644
--- a/src/installer/lombok/installer/eclipse/STSLocation.java
+++ b/src/installer/lombok/installer/eclipse/EclipseProductDescriptor.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Project Lombok Authors.
+ * Copyright (C) 2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,25 +21,21 @@
*/
package lombok.installer.eclipse;
-import java.io.File;
import java.net.URL;
+import java.util.List;
+import java.util.regex.Pattern;
-import lombok.installer.CorruptedIdeLocationException;
-
-public class STSLocation extends EclipseLocation {
- public STSLocation(String nameOfLocation, File pathToEclipseIni) throws CorruptedIdeLocationException {
- super(nameOfLocation, pathToEclipseIni);
- }
-
- @Override public URL getIdeIcon() {
- return STSLocation.class.getResource("STS.png");
- }
-
- @Override protected String getIniFileName() {
- return "STS.ini";
- }
-
- @Override protected String getTypeName() {
- return "STS";
- }
-}
+public interface EclipseProductDescriptor {
+ String getProductName();
+ String getWindowsExecutableName();
+ String getUnixAppName();
+ String getMacAppName();
+ String getDirectoryName();
+ List<String> getExecutableNames();
+ List<String> getSourceDirsOnWindows();
+ List<String> getSourceDirsOnMac();
+ List<String> getSourceDirsOnUnix();
+ String getIniFileName();
+ Pattern getLocationSelectors();
+ URL getIdeIcon();
+} \ No newline at end of file
diff --git a/src/installer/lombok/installer/eclipse/EclipseLocation.java b/src/installer/lombok/installer/eclipse/EclipseProductLocation.java
index 6c63c48d..886e3e85 100644
--- a/src/installer/lombok/installer/eclipse/EclipseLocation.java
+++ b/src/installer/lombok/installer/eclipse/EclipseProductLocation.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2012 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -35,7 +35,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeFinder;
+import lombok.installer.OsUtils;
import lombok.installer.IdeLocation;
import lombok.installer.InstallException;
import lombok.installer.Installer;
@@ -46,23 +46,18 @@ import lombok.installer.UninstallException;
* An instance can figure out if an Eclipse installation has been lombok-ified, and can
* install and uninstall lombok from the Eclipse installation.
*/
-public class EclipseLocation extends IdeLocation {
+public final class EclipseProductLocation extends IdeLocation {
+
+ private static final String OS_NEWLINE = OsUtils.getOS().getLineEnding();
+
+ private final EclipseProductDescriptor descriptor;
private final String name;
private final File eclipseIniPath;
private final String pathToLombokJarPrefix;
- private volatile boolean hasLombok;
-
- private static final String OS_NEWLINE = IdeFinder.getOS().getLineEnding();
-
- protected String getTypeName() {
- return "eclipse";
- }
-
- protected String getIniFileName() {
- return "eclipse.ini";
- }
+ private final boolean hasLombok;
- EclipseLocation(String nameOfLocation, File pathToEclipseIni) throws CorruptedIdeLocationException {
+ EclipseProductLocation(EclipseProductDescriptor descriptor, String nameOfLocation, File pathToEclipseIni) throws CorruptedIdeLocationException {
+ this.descriptor = descriptor;
this.name = nameOfLocation;
this.eclipseIniPath = pathToEclipseIni;
File p1 = pathToEclipseIni.getParentFile();
@@ -78,8 +73,8 @@ public class EclipseLocation extends IdeLocation {
this.hasLombok = checkForLombok(eclipseIniPath);
} catch (IOException e) {
throw new CorruptedIdeLocationException(
- "I can't read the configuration file of the " + getTypeName() + " installed at " + name + "\n" +
- "You may need to run this installer with root privileges if you want to modify that " + getTypeName() + ".", getTypeName(), e);
+ "I can't read the configuration file of the " + descriptor.getProductName() + " installed at " + name + "\n" +
+ "You may need to run this installer with root privileges if you want to modify that " + descriptor.getProductName() + ".", descriptor.getProductName(), e);
}
}
@@ -88,8 +83,8 @@ public class EclipseLocation extends IdeLocation {
}
@Override public boolean equals(Object o) {
- if (!(o instanceof EclipseLocation)) return false;
- return ((EclipseLocation)o).eclipseIniPath.equals(eclipseIniPath);
+ if (!(o instanceof EclipseProductLocation)) return false;
+ return ((EclipseProductLocation)o).eclipseIniPath.equals(eclipseIniPath);
}
/**
@@ -108,13 +103,13 @@ public class EclipseLocation extends IdeLocation {
return hasLombok;
}
- private final Pattern JAVA_AGENT_LINE_MATCHER = Pattern.compile(
+ private static final Pattern JAVA_AGENT_LINE_MATCHER = Pattern.compile(
"^\\-javaagent\\:.*lombok.*\\.jar$", Pattern.CASE_INSENSITIVE);
- private final Pattern BOOTCLASSPATH_LINE_MATCHER = Pattern.compile(
+ private static final Pattern BOOTCLASSPATH_LINE_MATCHER = Pattern.compile(
"^\\-Xbootclasspath\\/a\\:(.*lombok.*\\.jar.*)$", Pattern.CASE_INSENSITIVE);
- private boolean checkForLombok(File iniFile) throws IOException {
+ private static boolean checkForLombok(File iniFile) throws IOException {
if (!iniFile.exists()) return false;
FileInputStream fis = new FileInputStream(iniFile);
try {
@@ -206,7 +201,7 @@ public class EclipseLocation extends IdeLocation {
File lombokJar = new File(dir, "lombok.jar");
if (lombokJar.exists()) {
if (!lombokJar.delete()) {
- if (IdeFinder.getOS() == IdeFinder.OS.WINDOWS && Installer.isSelf(lombokJar.getAbsolutePath())) {
+ if (OsUtils.getOS() == OsUtils.OS.WINDOWS && Installer.isSelf(lombokJar.getAbsolutePath())) {
lombokJarsForWhichCantDeleteSelf.add(lombokJar);
} else {
throw new UninstallException(
@@ -228,14 +223,14 @@ public class EclipseLocation extends IdeLocation {
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);
+ descriptor.getProductName(), lombokJarsForWhichCantDeleteSelf.get(0).getAbsolutePath()), null);
}
}
private static String generateWriteErrorMessage() {
String osSpecificError;
- switch (IdeFinder.getOS()) {
+ switch (OsUtils.getOS()) {
default:
case MAC_OS_X:
case UNIX:
@@ -265,7 +260,7 @@ public class EclipseLocation extends IdeLocation {
// If someone knows how to fix this, please do so, as this current hack solution (putting the absolute path
// to the jar files in your eclipse.ini) means you can't move your eclipse around on linux without lombok
// breaking it. NB: rerunning lombok.jar installer and hitting 'update' will fix it if you do that.
- boolean fullPathRequired = IdeFinder.getOS() == EclipseFinder.OS.UNIX || System.getProperty("lombok.installer.fullpath") != null;
+ boolean fullPathRequired = OsUtils.getOS() == OsUtils.OS.UNIX || System.getProperty("lombok.installer.fullpath") != null;
boolean installSucceeded = false;
StringBuilder newContents = new StringBuilder();
@@ -303,7 +298,7 @@ public class EclipseLocation extends IdeLocation {
"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);
+ throw new InstallException("I can't write to your " + descriptor.getProductName() + " directory at " + name + generateWriteErrorMessage(), e);
}
}
@@ -369,14 +364,14 @@ public class EclipseLocation extends IdeLocation {
}
if (!installSucceeded) {
- throw new InstallException("I can't find the " + getIniFileName() + " file. Is this a real " + getTypeName() + " installation?", null);
+ throw new InstallException("I can't find the " + descriptor.getIniFileName() + " file. Is this a real " + descriptor.getProductName() + " installation?", null);
}
- return "If you start " + getTypeName() + " with a custom -vm parameter, you'll need to add:<br>" +
+ return "If you start " + descriptor.getProductName() + " with a custom -vm parameter, you'll need to add:<br>" +
"<code>-vmargs -javaagent:lombok.jar</code><br>as parameter as well.";
}
@Override public URL getIdeIcon() {
- return EclipseLocation.class.getResource("eclipse.png");
+ return descriptor.getIdeIcon();
}
}
diff --git a/src/installer/lombok/installer/eclipse/EclipseFinder.java b/src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java
index 8a1a689a..3710d7d9 100644
--- a/src/installer/lombok/installer/eclipse/EclipseFinder.java
+++ b/src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2011 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* 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,109 +22,130 @@
package lombok.installer.eclipse;
import static java.util.Arrays.asList;
+import static lombok.installer.IdeLocation.canonical;
import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.regex.Pattern;
-import lombok.installer.IdeFinder;
-import lombok.installer.IdeLocation;
import lombok.installer.CorruptedIdeLocationException;
+import lombok.installer.OsUtils;
+import lombok.installer.IdeLocation;
+import lombok.installer.IdeLocationProvider;
-import org.mangosdk.spi.ProviderFor;
+public class EclipseProductLocationProvider implements IdeLocationProvider {
+ private final EclipseProductDescriptor descriptor;
-@ProviderFor(IdeFinder.class)
-public class EclipseFinder extends IdeFinder {
- /** should be lowercase! */
- protected String getDirName() {
- return "eclipse";
- }
-
- protected String getWindowsExecutableName() {
- return "eclipse.exe";
- }
-
- protected String getUnixExecutableName() {
- return "eclipse";
- }
-
- protected String getMacExecutableName() {
- return "Eclipse.app";
+ EclipseProductLocationProvider(EclipseProductDescriptor descriptor) {
+ this.descriptor = descriptor;
}
- protected IdeLocation createLocation(String guess) throws CorruptedIdeLocationException {
- return new EclipseLocationProvider().create0(guess);
- }
-
- protected List<String> getSourceDirsOnWindows() {
- return Arrays.asList("\\", "\\Program Files", "\\Program Files (x86)", System.getProperty("user.home", "."));
+ @Override public final IdeLocation create(String path) throws CorruptedIdeLocationException {
+ return create0(path);
}
/**
- * Returns a list of paths of Eclipse installations.
+ * Create a new EclipseLocation by pointing at either the directory contains the Eclipse executable, or the executable itself,
+ * or an eclipse.ini file.
*
- * The search process works by scanning for each 'source dir' for either an eclipse installation or a folder containing the text returned
- * by getDirName(). If such a folder is found, this process is applied recursively. On windows, this process is run on each drive letter
- * which represents a physical hard disk. If the native windows API call to determine these drive letters fails, only 'C:' is checked.
+ * @throws NotAnIdeLocationException
+ * If this isn't an Eclipse executable or a directory with an
+ * Eclipse executable.
*/
- private List<String> getSourceDirsOnWindowsWithDriveLetters() {
- List<String> driveLetters = asList("C");
- try {
- driveLetters = getDrivesOnWindows();
- } catch (Throwable ignore) {
- ignore.printStackTrace();
+ private IdeLocation create0(String path) throws CorruptedIdeLocationException {
+ if (path == null) throw new NullPointerException("path");
+ String iniName = descriptor.getIniFileName();
+ File p = new File(path);
+
+ if (!p.exists()) return null;
+ if (p.isDirectory()) {
+ for (String possibleExeName : descriptor.getExecutableNames()) {
+ File f = new File(p, possibleExeName);
+ if (f.exists()) return findEclipseIniFromExe(f, 0);
+ }
+
+ File f = new File(p, iniName);
+ if (f.exists()) return makeLocation(canonical(p), f);
}
- List<String> sourceDirs = new ArrayList<String>();
- for (String letter : driveLetters) {
- for (String possibleSource : getSourceDirsOnWindows()) {
- if (!isDriveSpecificOnWindows(possibleSource)) {
- sourceDirs.add(letter + ":" + possibleSource);
- }
+
+ if (p.isFile()) {
+ if (p.getName().equalsIgnoreCase(iniName)) {
+ return makeLocation(canonical(p.getParentFile()), p);
}
}
- for (String possibleSource : getSourceDirsOnWindows()) {
- if (isDriveSpecificOnWindows(possibleSource)) sourceDirs.add(possibleSource);
+
+ if (descriptor.getExecutableNames().contains(p.getName().toLowerCase())) {
+ return findEclipseIniFromExe(p, 0);
}
- return sourceDirs;
+ return null;
}
- public boolean isDriveSpecificOnWindows(String path) {
- return path.length() > 1 && path.charAt(1) == ':';
- }
-
- 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));
+ private IdeLocation findEclipseIniFromExe(File exePath, int loopCounter) throws CorruptedIdeLocationException {
+ String iniName = descriptor.getIniFileName();
+ /* Try looking for eclipse.ini as sibling to the executable */ {
+ File ini = new File(exePath.getParentFile(), iniName);
+ if (ini.isFile()) return makeLocation(canonical(exePath), ini);
}
- return files;
+
+ String macAppName = descriptor.getMacAppName();
+ /* Try looking for Eclipse.app/Contents/MacOS/eclipse.ini as sibling to executable; this works on Mac OS X. */ {
+ File ini = new File(exePath.getParentFile(), macAppName + "/Contents/MacOS/" + iniName);
+ if (ini.isFile()) return makeLocation(canonical(exePath), ini);
+ }
+
+ /* Starting with Eclipse Mars (with the oomph installer), the structure has changed, and it's now at Eclipse.app/Contents/Eclipse/eclipse.ini*/ {
+ File ini = new File(exePath.getParentFile(), macAppName + "/Contents/Eclipse/" + iniName);
+ if (ini.isFile()) return makeLocation(canonical(exePath), ini);
+ }
+
+ /* If executable is a soft link, follow it and retry. */ {
+ if (loopCounter < 50) {
+ try {
+ String oPath = exePath.getAbsolutePath();
+ String nPath = exePath.getCanonicalPath();
+ if (!oPath.equals(nPath)) try {
+ IdeLocation loc = findEclipseIniFromExe(new File(nPath), loopCounter + 1);
+ if (loc != null) return loc;
+ } catch (CorruptedIdeLocationException ignore) {
+ // Unlinking didn't help find an eclipse, so continue.
+ }
+ } catch (IOException ignore) { /* okay, that didn't work, assume it isn't a soft link then. */ }
+ }
+ }
+
+ /* If executable is a linux LSB-style path, then look in the usual places that package managers like apt-get use.*/ {
+ String path = exePath.getAbsolutePath();
+ try {
+ path = exePath.getCanonicalPath();
+ } catch (IOException ignore) { /* We'll stick with getAbsolutePath()'s result then. */ }
+
+ String unixAppName = descriptor.getUnixAppName();
+ if (path.equals("/usr/bin/" + unixAppName) || path.equals("/bin/" + unixAppName) || path.equals("/usr/local/bin/" + unixAppName)) {
+ File ini = new File("/usr/lib/" + unixAppName + "/" + iniName);
+ if (ini.isFile()) return makeLocation(path, ini);
+ ini = new File("/usr/local/lib/" + unixAppName + "/" + iniName);
+ if (ini.isFile()) return makeLocation(path, ini);
+ ini = new File("/usr/local/etc/" + unixAppName + "/" + iniName);
+ if (ini.isFile()) return makeLocation(path, ini);
+ ini = new File("/etc/" + iniName);
+ if (ini.isFile()) return makeLocation(path, ini);
+ }
+ }
+
+ /* If we get this far, we lose. */
+ return null;
}
- 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;
+ private IdeLocation makeLocation(String name, File ini) throws CorruptedIdeLocationException {
+ return new EclipseProductLocation(descriptor, name, ini);
}
- 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;
+ @Override public Pattern getLocationSelectors() {
+ return descriptor.getLocationSelectors();
}
/**
@@ -141,7 +162,7 @@ public class EclipseFinder extends IdeFinder {
*/
@Override
public void findIdes(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) {
- switch (getOS()) {
+ switch (OsUtils.getOS()) {
case WINDOWS:
new WindowsFinder().findEclipse(locations, problems);
break;
@@ -155,17 +176,74 @@ public class EclipseFinder extends IdeFinder {
}
}
+ 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;
+ }
+
+ 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;
+ }
+
private class UnixFinder extends DirectoryFinder {
UnixFinder() {
super(getNestedSourceLocationOnUnix(), getFlatSourceLocationsOnUnix());
}
@Override protected String findEclipseOnPlatform(File dir) {
- File possible = new File(dir, getUnixExecutableName());
+ File possible = new File(dir, descriptor.getUnixAppName());
return (possible.exists()) ? possible.getAbsolutePath() : null;
}
}
+ /**
+ * Returns a list of paths of Eclipse installations.
+ *
+ * The search process works by scanning for each 'source dir' for either an eclipse installation or a folder containing the text returned
+ * by getDirName(). If such a folder is found, this process is applied recursively. On windows, this process is run on each drive letter
+ * which represents a physical hard disk. If the native windows API call to determine these drive letters fails, only 'C:' is checked.
+ */
+ private List<String> getSourceDirsOnWindowsWithDriveLetters() {
+ List<String> driveLetters = asList("C");
+ try {
+ driveLetters = OsUtils.getDrivesOnWindows();
+ } catch (Throwable ignore) {
+ ignore.printStackTrace();
+ }
+ List<String> sourceDirs = new ArrayList<String>();
+ for (String letter : driveLetters) {
+ for (String possibleSource : descriptor.getSourceDirsOnWindows()) {
+ if (!isDriveSpecificOnWindows(possibleSource)) {
+ sourceDirs.add(letter + ":" + possibleSource);
+ }
+ }
+ }
+ for (String possibleSource : descriptor.getSourceDirsOnWindows()) {
+ if (isDriveSpecificOnWindows(possibleSource)) sourceDirs.add(possibleSource);
+ }
+
+ return sourceDirs;
+ }
+
+ private boolean isDriveSpecificOnWindows(String path) {
+ return path.length() > 1 && path.charAt(1) == ':';
+ }
+
private class WindowsFinder extends DirectoryFinder {
WindowsFinder() {
super(transformToFiles(getSourceDirsOnWindowsWithDriveLetters()), Collections.<File>emptyList());
@@ -174,20 +252,20 @@ public class EclipseFinder extends IdeFinder {
/** 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());
+ File possible = new File(dir, descriptor.getWindowsExecutableName());
return (possible.isFile()) ? dir.getAbsolutePath() : null;
}
}
private class MacFinder extends DirectoryFinder {
MacFinder() {
- super(transformToFiles(getSourceDirsOnMac()), Collections.<File>emptyList());
+ super(transformToFiles(descriptor.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();
+ if (dir.getName().toLowerCase().equals(descriptor.getMacAppName().toLowerCase())) return dir.getParent();
+ if (dir.getName().toLowerCase().contains(descriptor.getDirectoryName())) {
+ if (new File(dir, descriptor.getMacAppName()).exists()) return dir.toString();
}
return null;
}
@@ -202,14 +280,14 @@ public class EclipseFinder extends IdeFinder {
this.flatSourceDirs = flatSourceDirs;
}
- public void findEclipse(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) {
+ 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);
+ abstract String findEclipseOnPlatform(File dir);
- protected void recurseDirectory(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File dir) {
+ void recurseDirectory(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File dir) {
recurseDirectory0(locations, problems, dir, 0);
}
@@ -223,19 +301,19 @@ public class EclipseFinder extends IdeFinder {
for (File dir : listFiles) {
if (!dir.isDirectory()) continue;
try {
- if (dir.getName().toLowerCase().contains(getDirName())) {
+ if (dir.getName().toLowerCase().contains(descriptor.getDirectoryName())) {
findEclipse(locations, problems, dir);
if (loopCounter < 50) recurseDirectory0(locations, problems, dir, loopCounter + 1);
}
} catch (Exception ignore) {}
}
}
-
+
private void findEclipse(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File dir) {
String eclipseLocation = findEclipseOnPlatform(dir);
if (eclipseLocation != null) {
try {
- IdeLocation newLocation = createLocation(eclipseLocation);
+ IdeLocation newLocation = create(eclipseLocation);
if (newLocation != null) locations.add(newLocation);
} catch (CorruptedIdeLocationException e) {
problems.add(e);
diff --git a/src/installer/lombok/installer/eclipse/JbdsFinder.java b/src/installer/lombok/installer/eclipse/JbdsFinder.java
deleted file mode 100644
index 2dfaacba..00000000
--- a/src/installer/lombok/installer/eclipse/JbdsFinder.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2013 The Project Lombok Authors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.installer.eclipse;
-
-import java.util.Arrays;
-import java.util.List;
-
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeFinder;
-import lombok.installer.IdeLocation;
-
-import org.mangosdk.spi.ProviderFor;
-
-/**
- * JBDS (JBoss Developer Studio) is an eclipse variant.
- * Other than different executable names, it's the same as eclipse, as far as lombok support goes.
- */
-@ProviderFor(IdeFinder.class)
-public class JbdsFinder extends EclipseFinder {
- @Override protected IdeLocation createLocation(String guess) throws CorruptedIdeLocationException {
- return new JbdsLocationProvider().create0(guess);
- }
-
- @Override protected String getDirName() {
- return "studio";
- }
-
- @Override protected String getMacExecutableName() {
- return "jbdevstudio.app";
- }
-
- @Override protected String getUnixExecutableName() {
- return "jbdevstudio";
- }
-
- @Override protected String getWindowsExecutableName() {
- return "jbdevstudio.exe";
- }
-
- @Override protected List<String> getSourceDirsOnWindows() {
- return Arrays.asList("\\", "\\Program Files", "\\Program Files (x86)", System.getProperty("user.home", "."));
- }
-
- @Override protected List<String> getSourceDirsOnMac() {
- return Arrays.asList("/Applications", System.getProperty("user.home", "."));
- }
-
- @Override protected List<String> getSourceDirsOnUnix() {
- return Arrays.asList(System.getProperty("user.home", "."));
- }
-}
diff --git a/src/installer/lombok/installer/eclipse/JbdsLocation.java b/src/installer/lombok/installer/eclipse/JbdsLocation.java
deleted file mode 100644
index 81fb5261..00000000
--- a/src/installer/lombok/installer/eclipse/JbdsLocation.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2013 The Project Lombok Authors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.installer.eclipse;
-
-import java.io.File;
-import java.net.URL;
-
-import lombok.installer.CorruptedIdeLocationException;
-
-public class JbdsLocation extends EclipseLocation {
- public JbdsLocation(String nameOfLocation, File pathToEclipseIni) throws CorruptedIdeLocationException {
- super(nameOfLocation, pathToEclipseIni);
- }
-
- @Override public URL getIdeIcon() {
- return JbdsLocation.class.getResource("jbds.png");
- }
-
- @Override protected String getIniFileName() {
- return "jbdevstudio.ini";
- }
-
- @Override protected String getTypeName() {
- return "JBoss Developer Studio";
- }
-}
diff --git a/src/installer/lombok/installer/eclipse/JbdsLocationProvider.java b/src/installer/lombok/installer/eclipse/JbdsLocationProvider.java
index e6df0e43..635f304a 100644
--- a/src/installer/lombok/installer/eclipse/JbdsLocationProvider.java
+++ b/src/installer/lombok/installer/eclipse/JbdsLocationProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 The Project Lombok Authors.
+ * Copyright (C) 2013-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,49 +21,24 @@
*/
package lombok.installer.eclipse;
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Pattern;
+import java.util.Collections;
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeLocation;
import lombok.installer.IdeLocationProvider;
-import lombok.installer.IdeFinder.OS;
import org.mangosdk.spi.ProviderFor;
@ProviderFor(IdeLocationProvider.class)
-public class JbdsLocationProvider extends EclipseLocationProvider {
- @Override protected List<String> getEclipseExecutableNames() {
- return Arrays.asList("jbdevstudio.app", "jbdevstudio.exe", "jbdevstudioc.exe", "jbdevstudio");
- }
-
- @Override protected String getIniName() {
- return "jbdevstudio.ini";
- }
-
- @Override protected IdeLocation makeLocation(String name, File ini) throws CorruptedIdeLocationException {
- return new JbdsLocation(name, ini);
- }
-
- @Override protected String getMacAppName() {
- return "jbdevstudio.app";
- }
+public class JbdsLocationProvider extends EclipseProductLocationProvider {
- @Override protected String getUnixAppName() {
- return "jbdevstudio";
- }
+ private static final EclipseProductDescriptor JBDS = new StandardProductDescriptor(
+ "JBoss Developer Studio",
+ "jbdevstudio",
+ "studio",
+ JbdsLocationProvider.class.getResource("jbds.png"),
+ Collections.<String>emptySet()
+ );
- @Override public Pattern getLocationSelectors(OS os) {
- switch (os) {
- case MAC_OS_X:
- return Pattern.compile("^(jbdevstudio|jbdevstudio\\.ini|jbdevstudio\\.app)$", Pattern.CASE_INSENSITIVE);
- case WINDOWS:
- return Pattern.compile("^(jbdevstudioc?\\.exe|jbdevstudio\\.ini)$", Pattern.CASE_INSENSITIVE);
- default:
- case UNIX:
- return Pattern.compile("^(jbdevstudio|jbdevstudio\\.ini)$", Pattern.CASE_INSENSITIVE);
- }
+ public JbdsLocationProvider() {
+ super(JBDS);
}
}
diff --git a/src/installer/lombok/installer/eclipse/MyEclipseFinder.java b/src/installer/lombok/installer/eclipse/MyEclipseFinder.java
deleted file mode 100644
index 6ba8c861..00000000
--- a/src/installer/lombok/installer/eclipse/MyEclipseFinder.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2009 The Project Lombok Authors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.installer.eclipse;
-
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeFinder;
-import lombok.installer.IdeLocation;
-import org.mangosdk.spi.ProviderFor;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * MyEclipse is an eclipse variant.
- * Other than different executable names, it's the same as eclipse, as far as lombok support goes.
- */
-@ProviderFor(IdeFinder.class)
-public class MyEclipseFinder extends EclipseFinder {
- @Override protected IdeLocation createLocation(String guess) throws CorruptedIdeLocationException {
- return new MyEclipseLocationProvider().create0(guess);
- }
-
- @Override protected String getDirName() {
- return "myeclipse";
- }
-
- @Override protected String getMacExecutableName() {
- return "myeclipse.app";
- }
-
- @Override protected String getUnixExecutableName() {
- return "myeclipse";
- }
-
- @Override protected String getWindowsExecutableName() {
- return "myeclipse.exe";
- }
-
- @Override protected List<String> getSourceDirsOnWindows() {
- return Arrays.asList("\\", "\\Program Files", "\\Program Files (x86)", System.getProperty("user.home", "."));
- }
-
- @Override protected List<String> getSourceDirsOnMac() {
- return Arrays.asList("/Applications", System.getProperty("user.home", "."));
- }
-
- @Override protected List<String> getSourceDirsOnUnix() {
- return Arrays.asList(System.getProperty("user.home", "."));
- }
-}
diff --git a/src/installer/lombok/installer/eclipse/MyEclipseLocation.java b/src/installer/lombok/installer/eclipse/MyEclipseLocation.java
deleted file mode 100644
index e8f0da21..00000000
--- a/src/installer/lombok/installer/eclipse/MyEclipseLocation.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2009 The Project Lombok Authors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.installer.eclipse;
-
-import lombok.installer.CorruptedIdeLocationException;
-
-import java.io.File;
-import java.net.URL;
-
-public class MyEclipseLocation extends EclipseLocation {
- public MyEclipseLocation(String nameOfLocation, File pathToEclipseIni) throws CorruptedIdeLocationException {
- super(nameOfLocation, pathToEclipseIni);
- }
-
- @Override public URL getIdeIcon() {
- return MyEclipseLocation.class.getResource("myeclipse.png");
- }
-
- @Override protected String getIniFileName() {
- return "myeclipse.ini";
- }
-
- @Override protected String getTypeName() {
- return "MyEclipse";
- }
-}
diff --git a/src/installer/lombok/installer/eclipse/MyEclipseLocationProvider.java b/src/installer/lombok/installer/eclipse/MyEclipseLocationProvider.java
index 3c3d45be..298cabd6 100644
--- a/src/installer/lombok/installer/eclipse/MyEclipseLocationProvider.java
+++ b/src/installer/lombok/installer/eclipse/MyEclipseLocationProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Project Lombok Authors.
+ * Copyright (C) 2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,48 +21,24 @@
*/
package lombok.installer.eclipse;
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeFinder.OS;
-import lombok.installer.IdeLocation;
+import java.util.Collections;
+
import lombok.installer.IdeLocationProvider;
-import org.mangosdk.spi.ProviderFor;
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Pattern;
+import org.mangosdk.spi.ProviderFor;
@ProviderFor(IdeLocationProvider.class)
-public class MyEclipseLocationProvider extends EclipseLocationProvider {
- @Override protected List<String> getEclipseExecutableNames() {
- return Arrays.asList("myeclipse.app", "myeclipse.exe", "myeclipsec.exe", "myeclipse");
- }
-
- @Override protected String getIniName() {
- return "myeclipse.ini";
- }
+public class MyEclipseLocationProvider extends EclipseProductLocationProvider {
- @Override protected IdeLocation makeLocation(String name, File ini) throws CorruptedIdeLocationException {
- return new MyEclipseLocation(name, ini);
- }
-
- @Override protected String getMacAppName() {
- return "myeclipse.app";
- }
-
- @Override protected String getUnixAppName() {
- return "myeclipse";
- }
+ private static final EclipseProductDescriptor MY_ECLIPSE = new StandardProductDescriptor(
+ "MyEclipse",
+ "myeclipse",
+ "myeclipse",
+ MyEclipseLocationProvider.class.getResource("myeclipse.png"),
+ Collections.<String>emptySet()
+ );
- @Override public Pattern getLocationSelectors(OS os) {
- switch (os) {
- case MAC_OS_X:
- return Pattern.compile("^(myeclipse|myeclipse\\.ini|myeclipse\\.app)$", Pattern.CASE_INSENSITIVE);
- case WINDOWS:
- return Pattern.compile("^(myeclipsec?\\.exe|myeclipse\\.ini)$", Pattern.CASE_INSENSITIVE);
- default:
- case UNIX:
- return Pattern.compile("^(myeclipse|myeclipse\\.ini)$", Pattern.CASE_INSENSITIVE);
- }
+ public MyEclipseLocationProvider() {
+ super(MY_ECLIPSE);
}
}
diff --git a/src/installer/lombok/installer/eclipse/RhdsFinder.java b/src/installer/lombok/installer/eclipse/RhdsFinder.java
deleted file mode 100644
index 5e639fa5..00000000
--- a/src/installer/lombok/installer/eclipse/RhdsFinder.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2013 The Project Lombok Authors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.installer.eclipse;
-
-import java.util.Arrays;
-import java.util.List;
-
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeFinder;
-import lombok.installer.IdeLocation;
-
-import org.mangosdk.spi.ProviderFor;
-
-/**
- * RHDS (Red Hat JBoss Developer Studio) is an eclipse variant.
- * Other than different executable names, it's the same as eclipse, as far as lombok support goes.
- */
-@ProviderFor(IdeFinder.class)
-public class RhdsFinder extends EclipseFinder {
- @Override protected IdeLocation createLocation(String guess) throws CorruptedIdeLocationException {
- return new RhdsLocationProvider().create0(guess);
- }
-
- @Override protected String getDirName() {
- return "studio";
- }
-
- @Override protected String getMacExecutableName() {
- return "devstudio.app";
- }
-
- @Override protected String getUnixExecutableName() {
- return "devstudio";
- }
-
- @Override protected String getWindowsExecutableName() {
- return "devstudio.exe";
- }
-
- @Override protected List<String> getSourceDirsOnWindows() {
- return Arrays.asList("\\", "\\Program Files", "\\Program Files (x86)", System.getProperty("user.home", "."));
- }
-
- @Override protected List<String> getSourceDirsOnMac() {
- return Arrays.asList("/Applications", System.getProperty("user.home", "."));
- }
-
- @Override protected List<String> getSourceDirsOnUnix() {
- return Arrays.asList(System.getProperty("user.home", "."));
- }
-}
diff --git a/src/installer/lombok/installer/eclipse/RhdsLocation.java b/src/installer/lombok/installer/eclipse/RhdsLocation.java
deleted file mode 100644
index dbe1812c..00000000
--- a/src/installer/lombok/installer/eclipse/RhdsLocation.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2013 The Project Lombok Authors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.installer.eclipse;
-
-import java.io.File;
-import java.net.URL;
-
-import lombok.installer.CorruptedIdeLocationException;
-
-public class RhdsLocation extends EclipseLocation {
- public RhdsLocation(String nameOfLocation, File pathToEclipseIni) throws CorruptedIdeLocationException {
- super(nameOfLocation, pathToEclipseIni);
- }
-
- @Override public URL getIdeIcon() {
- return RhdsLocation.class.getResource("rhds.png");
- }
-
- @Override protected String getIniFileName() {
- return "devstudio.ini";
- }
-
- @Override protected String getTypeName() {
- return "Red Hat JBoss Developer Studio";
- }
-}
diff --git a/src/installer/lombok/installer/eclipse/RhdsLocationProvider.java b/src/installer/lombok/installer/eclipse/RhdsLocationProvider.java
index fabddba2..5e1d303d 100644
--- a/src/installer/lombok/installer/eclipse/RhdsLocationProvider.java
+++ b/src/installer/lombok/installer/eclipse/RhdsLocationProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 The Project Lombok Authors.
+ * Copyright (C) 2013-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,49 +21,24 @@
*/
package lombok.installer.eclipse;
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Pattern;
+import java.util.Collections;
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeLocation;
import lombok.installer.IdeLocationProvider;
-import lombok.installer.IdeFinder.OS;
import org.mangosdk.spi.ProviderFor;
@ProviderFor(IdeLocationProvider.class)
-public class RhdsLocationProvider extends EclipseLocationProvider {
- @Override protected List<String> getEclipseExecutableNames() {
- return Arrays.asList("devstudio.app", "devstudio.exe", "devstudioc.exe", "devstudio");
- }
-
- @Override protected String getIniName() {
- return "devstudio.ini";
- }
-
- @Override protected IdeLocation makeLocation(String name, File ini) throws CorruptedIdeLocationException {
- return new RhdsLocation(name, ini);
- }
-
- @Override protected String getMacAppName() {
- return "devstudio.app";
- }
+public class RhdsLocationProvider extends EclipseProductLocationProvider {
- @Override protected String getUnixAppName() {
- return "devstudio";
- }
+ private static final EclipseProductDescriptor RHDS = new StandardProductDescriptor(
+ "Red Hat JBoss Developer Studio",
+ "devstudio",
+ "studio",
+ RhdsLocationProvider.class.getResource("rhds.png"),
+ Collections.<String>emptySet()
+ );
- @Override public Pattern getLocationSelectors(OS os) {
- switch (os) {
- case MAC_OS_X:
- return Pattern.compile("^(devstudio|devstudio\\.ini|devstudio\\.app)$", Pattern.CASE_INSENSITIVE);
- case WINDOWS:
- return Pattern.compile("^(devstudioc?\\.exe|devstudio\\.ini)$", Pattern.CASE_INSENSITIVE);
- default:
- case UNIX:
- return Pattern.compile("^(devstudio|devstudio\\.ini)$", Pattern.CASE_INSENSITIVE);
- }
+ public RhdsLocationProvider() {
+ super(RHDS);
}
}
diff --git a/src/installer/lombok/installer/eclipse/STSFinder.java b/src/installer/lombok/installer/eclipse/STSFinder.java
deleted file mode 100644
index 82bc9b80..00000000
--- a/src/installer/lombok/installer/eclipse/STSFinder.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2009 The Project Lombok Authors.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.installer.eclipse;
-
-import java.util.Arrays;
-import java.util.List;
-
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeFinder;
-import lombok.installer.IdeLocation;
-
-import org.mangosdk.spi.ProviderFor;
-
-/**
- * STS (Springsource Tool Suite) is an eclipse variant.
- * Other than different executable names, it's the same as eclipse, as far as lombok support goes.
- */
-@ProviderFor(IdeFinder.class)
-public class STSFinder extends EclipseFinder {
- @Override protected IdeLocation createLocation(String guess) throws CorruptedIdeLocationException {
- return new STSLocationProvider().create0(guess);
- }
-
- @Override protected String getDirName() {
- return "sts";
- }
-
- @Override protected String getMacExecutableName() {
- return "STS.app";
- }
-
- @Override protected String getUnixExecutableName() {
- return "STS";
- }
-
- @Override protected String getWindowsExecutableName() {
- return "STS.exe";
- }
-
- @Override protected List<String> getSourceDirsOnWindows() {
- return Arrays.asList("\\", "\\springsource", "\\Program Files", "\\Program Files (x86)", "\\Program Files\\springsource", "\\Program Files (x86)\\springsource", System.getProperty("user.home", "."), System.getProperty("user.home", ".") + "\\springsource");
- }
-
- @Override protected List<String> getSourceDirsOnMac() {
- return Arrays.asList("/Applications", "/Applications/springsource", System.getProperty("user.home", "."), System.getProperty("user.home", ".") + "/springsource");
- }
-
- @Override protected List<String> getSourceDirsOnUnix() {
- return Arrays.asList(System.getProperty("user.home", "."), System.getProperty("user.home", ".") + "/springsource");
- }
-}
diff --git a/src/installer/lombok/installer/eclipse/STSLocationProvider.java b/src/installer/lombok/installer/eclipse/STSLocationProvider.java
index 7d129838..d2efb956 100644
--- a/src/installer/lombok/installer/eclipse/STSLocationProvider.java
+++ b/src/installer/lombok/installer/eclipse/STSLocationProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 The Project Lombok Authors.
+ * Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,49 +21,23 @@
*/
package lombok.installer.eclipse;
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Pattern;
+import java.util.Collections;
-import lombok.installer.CorruptedIdeLocationException;
-import lombok.installer.IdeLocation;
import lombok.installer.IdeLocationProvider;
-import lombok.installer.IdeFinder.OS;
import org.mangosdk.spi.ProviderFor;
@ProviderFor(IdeLocationProvider.class)
-public class STSLocationProvider extends EclipseLocationProvider {
- @Override protected List<String> getEclipseExecutableNames() {
- return Arrays.asList("sts.app", "sts.exe", "stsc.exe", "sts");
- }
-
- @Override protected String getIniName() {
- return "STS.ini";
- }
-
- @Override protected IdeLocation makeLocation(String name, File ini) throws CorruptedIdeLocationException {
- return new STSLocation(name, ini);
- }
-
- @Override protected String getMacAppName() {
- return "STS.app";
- }
+public class STSLocationProvider extends EclipseProductLocationProvider {
- @Override protected String getUnixAppName() {
- return "STS";
- }
+ private static final EclipseProductDescriptor STS = new StandardProductDescriptor("STS",
+ "STS",
+ "sts",
+ STSLocationProvider.class.getResource("STS.png"),
+ Collections.singleton("springsource")
+ );
- @Override public Pattern getLocationSelectors(OS os) {
- switch (os) {
- case MAC_OS_X:
- return Pattern.compile("^(sts|sts\\.ini|sts\\.app)$", Pattern.CASE_INSENSITIVE);
- case WINDOWS:
- return Pattern.compile("^(stsc?\\.exe|sts\\.ini)$", Pattern.CASE_INSENSITIVE);
- default:
- case UNIX:
- return Pattern.compile("^(sts|sts\\.ini)$", Pattern.CASE_INSENSITIVE);
- }
+ public STSLocationProvider() {
+ super(STS);
}
}
diff --git a/src/installer/lombok/installer/eclipse/StandardProductDescriptor.java b/src/installer/lombok/installer/eclipse/StandardProductDescriptor.java
new file mode 100644
index 00000000..47e103aa
--- /dev/null
+++ b/src/installer/lombok/installer/eclipse/StandardProductDescriptor.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2016 The Project Lombok Authors.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package lombok.installer.eclipse;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import lombok.installer.OsUtils;
+
+public class StandardProductDescriptor implements EclipseProductDescriptor {
+
+ private static final String USER_HOME = System.getProperty("user.home", ".");
+ private static final String[] WINDOWS_ROOTS = {"\\", "\\Program Files", "\\Program Files (x86)", USER_HOME};
+ private static final String[] MAC_ROOTS = {"/Applications", USER_HOME};
+ private static final String[] UNIX_ROOTS = {USER_HOME};
+
+ private final String productName;
+ private final String windowsName;
+ private final String unixName;
+ private final String macAppName;
+ private final List<String> executableNames;
+ private final List<String> sourceDirsOnWindows;
+ private final List<String> sourceDirsOnMac;
+ private final List<String> sourceDirsOnUnix;
+ private final String iniFileName;
+ private final Pattern locationSelectors;
+ private final String directoryName;
+ private final URL ideIcon;
+
+ public StandardProductDescriptor(String productName, String baseName, String directoryName, URL ideIcon, Collection<String> alternativeDirectoryNames) {
+ this.productName = productName;
+ this.windowsName = baseName + ".exe";
+ this.unixName = baseName;
+ this.macAppName = baseName + ".app";
+ this.executableNames = executableNames(baseName);
+ this.sourceDirsOnWindows = generateAlternatives(WINDOWS_ROOTS, "\\", alternativeDirectoryNames);
+ this.sourceDirsOnMac = generateAlternatives(MAC_ROOTS, "/", alternativeDirectoryNames);
+ this.sourceDirsOnUnix = generateAlternatives(UNIX_ROOTS, "/", alternativeDirectoryNames);
+ this.iniFileName = baseName + ".ini";
+ this.locationSelectors = getLocationSelectors(baseName);
+ this.directoryName = directoryName.toLowerCase();
+ this.ideIcon = ideIcon;
+ }
+
+ @Override public String getProductName() {
+ return productName;
+ }
+
+ @Override public String getWindowsExecutableName() {
+ return windowsName;
+ }
+
+ @Override public String getUnixAppName() {
+ return unixName;
+ }
+
+ @Override public String getMacAppName() {
+ return macAppName;
+ }
+
+ @Override public String getDirectoryName() {
+ return directoryName;
+ }
+
+ @Override public List<String> getExecutableNames() {
+ return executableNames;
+ }
+
+ @Override public List<String> getSourceDirsOnWindows() {
+ return sourceDirsOnWindows;
+ }
+
+ @Override public List<String> getSourceDirsOnMac() {
+ return sourceDirsOnMac;
+ }
+
+ @Override public List<String> getSourceDirsOnUnix() {
+ return sourceDirsOnUnix;
+ }
+
+ @Override public String getIniFileName() {
+ return iniFileName;
+ }
+
+ @Override public Pattern getLocationSelectors() {
+ return locationSelectors;
+ }
+
+ @Override public URL getIdeIcon() {
+ return ideIcon;
+ }
+
+ private static Pattern getLocationSelectors(String baseName) {
+ return Pattern.compile(String.format(platformPattern(), baseName.toLowerCase()), Pattern.CASE_INSENSITIVE);
+ }
+
+ private static String platformPattern() {
+ switch (OsUtils.getOS()) {
+ case MAC_OS_X:
+ return "^(%s|%<s\\.ini|%<s\\.app)$";
+ case WINDOWS:
+ return "^(%sc?\\.exe|%<s\\.ini)$";
+ default:
+ case UNIX:
+ return "^(%s|%<s\\.ini)$";
+ }
+ }
+
+ private static List<String> executableNames(String baseName) {
+ String base = baseName.toLowerCase();
+ return Collections.unmodifiableList(Arrays.asList(base, base + ".app", base + ".exe", base + "c.exe"));
+ }
+
+ private static List<String> generateAlternatives(String[] roots, String pathSeparator, Collection<String> alternatives) {
+ List<String> result = new ArrayList<String>();
+ for (String root : roots) {
+ result.add(concat(root, pathSeparator, ""));
+ for (String alternative : alternatives) {
+ result.add(concat(root, pathSeparator, alternative));
+ }
+ }
+ return Collections.unmodifiableList(result);
+ }
+
+ private static String concat(String base, String pathSeparator, String alternative) {
+ if (alternative.isEmpty()) {
+ return base;
+ }
+ if (base.endsWith(pathSeparator)) {
+ return base + alternative.replaceAll("[\\/]", "\\" + pathSeparator);
+ }
+ return base + pathSeparator + alternative.replaceAll("[\\/]", "\\" + pathSeparator);
+ }
+}