aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/lombok/javac/apt/LombokFileObjects.java154
-rw-r--r--src/core/lombok/javac/apt/LombokProcessor.java26
-rw-r--r--src/core8/lombok/javac/apt/Javac9BaseFileObjectWrapper.java (renamed from src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java)0
-rw-r--r--src/core8/lombok/javac/apt/Javac9Compiler.java157
-rw-r--r--src/stubs/java/lang/annotation/ElementType.java118
-rw-r--r--src/stubsstubs/java/nio/file/Path.java4
-rw-r--r--src/support/info.txt4
-rw-r--r--src/support/log4j.properties (renamed from src/website/log4j.properties)0
-rw-r--r--src/support/lombok/eclipseCreate/CreateEclipseDebugTarget.java177
-rw-r--r--src/support/lombok/website/CompileChangelog.java (renamed from src/website/lombok/website/CompileChangelog.java)0
-rw-r--r--src/support/lombok/website/Domain.java26
-rw-r--r--src/support/lombok/website/FetchCurrentVersion.java (renamed from src/website/lombok/website/FetchCurrentVersion.java)7
-rw-r--r--src/support/lombok/website/WebsiteMaker.java (renamed from src/website/lombok/website/WebsiteMaker.java)77
-rw-r--r--src/utils/lombok/core/SpiLoadUtil.java4
14 files changed, 586 insertions, 168 deletions
diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java
index f6643db3..880ef1fd 100644
--- a/src/core/lombok/javac/apt/LombokFileObjects.java
+++ b/src/core/lombok/javac/apt/LombokFileObjects.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010-2019 The Project Lombok Authors.
+ * Copyright (C) 2010-2020 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,23 +22,15 @@
package lombok.javac.apt;
-import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.net.URI;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Arrays;
-import java.util.Iterator;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
-import javax.tools.FileObject;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
-import javax.tools.JavaFileObject.Kind;
-
-import com.sun.tools.javac.file.BaseFileManager;
import lombok.core.DiagnosticsReceiver;
import lombok.permit.Permit;
@@ -116,22 +108,20 @@ final class LombokFileObjects {
if (jfmClassName.equals("com.sun.tools.javac.file.JavacFileManager")) {
try {
Class<?> superType = Class.forName("com.sun.tools.javac.file.BaseFileManager");
- if (superType.isInstance(jfm)) {
- return new Java9Compiler(jfm);
- }
+ if (superType.isInstance(jfm)) return java9Compiler(jfm);
}
catch (Throwable e) {}
return Compiler.JAVAC7;
}
if (KNOWN_JAVA9_FILE_MANAGERS.contains(jfmClassName)) {
try {
- return new Java9Compiler(jfm);
+ return java9Compiler(jfm);
}
catch (Throwable e) {}
}
try {
if (Class.forName("com.sun.tools.javac.file.PathFileObject") == null) throw new NullPointerException();
- return new Java9Compiler(jfm);
+ return java9Compiler(jfm);
} catch (Throwable e) {}
try {
if (Class.forName("com.sun.tools.javac.file.BaseFileObject") == null) throw new NullPointerException();
@@ -156,122 +146,24 @@ final class LombokFileObjects {
return compiler.wrap(new InterceptingJavaFileObject(delegate, fileName, diagnostics, compiler.getDecoderMethod()));
}
- static class Java9Compiler implements Compiler {
- private final BaseFileManager fileManager;
-
- public Java9Compiler(JavaFileManager jfm) {
- fileManager = asBaseFileManager(jfm);
- }
-
- @Override public JavaFileObject wrap(LombokFileObject fileObject) {
- Path p; try {
- p = toPath(fileObject);
- } catch (Exception e) {
- p = null;
- }
-
- // J9BFOW extends javac's internal file base impl of javax.tools.JavaFileObject.
- // J9JFOW just straight implements it. Probably J9JFOW is fine, but we decided to extend java's internal impl possibly for a reason.
- // Some exotic build environments don't _have_ file objects and crash with FileNotFoundEx, so if that happens, let's try the alternative.
- if (p != null) return new Javac9BaseFileObjectWrapper(fileManager, p, fileObject);
- return new Javac9JavaFileObjectWrapper(fileObject);
- }
-
- @Override public Method getDecoderMethod() {
+ private static Constructor<?> j9CompilerConstructor = null;
+ private static Compiler java9Compiler(JavaFileManager jfm) {
+ try {
+ if (j9CompilerConstructor == null) j9CompilerConstructor = Class.forName("lombok.javac.apt.Java9Compiler").getConstructor(JavaFileManager.class);
+ return (Compiler) j9CompilerConstructor.newInstance(jfm);
+ } catch (ClassNotFoundException e) {
return null;
- }
-
- private static Path toPath(LombokFileObject fileObject) {
- URI uri = fileObject.toUri();
- if (uri.getScheme() == null) {
- uri = URI.create("file:///" + uri);
- }
- try {
- return Paths.get(uri);
- } catch (IllegalArgumentException e) {
- throw new IllegalArgumentException("Problems in URI '" + uri + "' (" + fileObject.toUri() + ")", e);
- }
- }
-
- private static BaseFileManager asBaseFileManager(JavaFileManager jfm) {
- if (jfm instanceof BaseFileManager) {
- return (BaseFileManager) jfm;
- }
- return new FileManagerWrapper(jfm);
- }
-
- static class FileManagerWrapper extends BaseFileManager {
- JavaFileManager manager;
-
- public FileManagerWrapper(JavaFileManager manager) {
- super(null);
- this.manager = manager;
- }
-
- @Override
- public int isSupportedOption(String option) {
- return manager.isSupportedOption(option);
- }
-
- @Override
- public ClassLoader getClassLoader(Location location) {
- return manager.getClassLoader(location);
- }
-
- @Override
- public Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse) throws IOException {
- return manager.list(location, packageName, kinds, recurse);
- }
-
- @Override
- public String inferBinaryName(Location location, JavaFileObject file) {
- return manager.inferBinaryName(location, file);
- }
-
- @Override
- public boolean isSameFile(FileObject a, FileObject b) {
- return manager.isSameFile(a, b);
- }
-
- @Override
- public boolean handleOption(String current, Iterator<String> remaining) {
- return manager.handleOption(current, remaining);
- }
-
- @Override
- public boolean hasLocation(Location location) {
- return manager.hasLocation(location);
- }
-
- @Override
- public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException {
- return manager.getJavaFileForInput(location, className, kind);
- }
-
- @Override
- public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException {
- return manager.getJavaFileForOutput(location, className, kind, sibling);
- }
-
- @Override
- public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException {
- return manager.getFileForInput(location, packageName, relativeName);
- }
-
- @Override
- public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException {
- return manager.getFileForOutput(location, packageName, relativeName, sibling);
- }
-
- @Override
- public void flush() throws IOException {
- manager.flush();
- }
-
- @Override
- public void close() throws IOException {
- manager.close();
- }
+ } catch (NoSuchMethodException e) {
+ return null;
+ } catch (InvocationTargetException e) {
+ Throwable t = e.getCause();
+ if (t instanceof RuntimeException) throw (RuntimeException) t;
+ if (t instanceof Error) throw (Error) t;
+ throw new RuntimeException(t);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (InstantiationException e) {
+ throw new RuntimeException(e);
}
}
}
diff --git a/src/core/lombok/javac/apt/LombokProcessor.java b/src/core/lombok/javac/apt/LombokProcessor.java
index c32e09d5..852e5de6 100644
--- a/src/core/lombok/javac/apt/LombokProcessor.java
+++ b/src/core/lombok/javac/apt/LombokProcessor.java
@@ -24,6 +24,7 @@ package lombok.javac.apt;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
@@ -42,7 +43,6 @@ import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
-import javax.lang.model.element.QualifiedNameable;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
import javax.tools.JavaFileManager;
@@ -371,7 +371,7 @@ public class LombokProcessor extends AbstractProcessor {
private String getModuleNameFor(Element element) {
while (element != null) {
- if (element.getKind().name().equals("MODULE")) return ModuleNameOracle.getModuleName(element);
+ if (element.getKind().name().equals("MODULE")) return getModuleName(element);
Element n = element.getEnclosingElement();
if (n == element) return null;
element = n;
@@ -379,12 +379,24 @@ public class LombokProcessor extends AbstractProcessor {
return null;
}
- // QualifiedNameable is a java7 thing, so to remain compatible with java6, shove this into an inner class to avoid the ClassNotFoundError.
- private static class ModuleNameOracle {
- static String getModuleName(Element element) {
- if (!(element instanceof QualifiedNameable)) return null;
- String name = ((QualifiedNameable) element).getQualifiedName().toString().trim();
+ private static Class<?> qualifiedNamableClass = null;
+ private static Method qualifiedNamableQualifiedNameMethod = null;
+ // QualifiedNameable isn't in java 6, so to remain compatible with java6, use reflection.
+ private static String getModuleName(Element element) {
+ try {
+ if (qualifiedNamableClass == null) qualifiedNamableClass = Class.forName("javax.lang.model.element.QualifiedNamable");
+ if (!qualifiedNamableClass.isInstance(element)) return null;
+ if (qualifiedNamableQualifiedNameMethod == null) qualifiedNamableQualifiedNameMethod = qualifiedNamableClass.getMethod("getQualifiedName");
+ String name = qualifiedNamableQualifiedNameMethod.invoke(element).toString().trim();
return name.isEmpty() ? null : name;
+ } catch (ClassNotFoundException e) {
+ return null;
+ } catch (NoSuchMethodException e) {
+ return null;
+ } catch (InvocationTargetException e) {
+ return null;
+ } catch (IllegalAccessException e) {
+ return null;
}
}
diff --git a/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java b/src/core8/lombok/javac/apt/Javac9BaseFileObjectWrapper.java
index f71be366..f71be366 100644
--- a/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java
+++ b/src/core8/lombok/javac/apt/Javac9BaseFileObjectWrapper.java
diff --git a/src/core8/lombok/javac/apt/Javac9Compiler.java b/src/core8/lombok/javac/apt/Javac9Compiler.java
new file mode 100644
index 00000000..c02e5929
--- /dev/null
+++ b/src/core8/lombok/javac/apt/Javac9Compiler.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2010-2020 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.javac.apt;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URI;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.tools.FileObject;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+
+import com.sun.tools.javac.file.BaseFileManager;
+
+class Java9Compiler implements lombok.javac.apt.LombokFileObjects.Compiler {
+ private final BaseFileManager fileManager;
+
+ public Java9Compiler(JavaFileManager jfm) {
+ fileManager = asBaseFileManager(jfm);
+ }
+
+ @Override public JavaFileObject wrap(LombokFileObject fileObject) {
+ Path p; try {
+ p = toPath(fileObject);
+ } catch (Exception e) {
+ p = null;
+ }
+
+ // J9BFOW extends javac's internal file base impl of javax.tools.JavaFileObject.
+ // J9JFOW just straight implements it. Probably J9JFOW is fine, but we decided to extend java's internal impl possibly for a reason.
+ // Some exotic build environments don't _have_ file objects and crash with FileNotFoundEx, so if that happens, let's try the alternative.
+ if (p != null) return new Javac9BaseFileObjectWrapper(fileManager, p, fileObject);
+ return new Javac9JavaFileObjectWrapper(fileObject);
+ }
+
+ @Override public Method getDecoderMethod() {
+ return null;
+ }
+
+ private static Path toPath(LombokFileObject fileObject) {
+ URI uri = fileObject.toUri();
+ if (uri.getScheme() == null) {
+ uri = URI.create("file:///" + uri);
+ }
+ try {
+ return Paths.get(uri);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("Problems in URI '" + uri + "' (" + fileObject.toUri() + ")", e);
+ }
+ }
+
+ private static BaseFileManager asBaseFileManager(JavaFileManager jfm) {
+ if (jfm instanceof BaseFileManager) {
+ return (BaseFileManager) jfm;
+ }
+ return new FileManagerWrapper(jfm);
+ }
+
+ static class FileManagerWrapper extends BaseFileManager {
+ JavaFileManager manager;
+
+ public FileManagerWrapper(JavaFileManager manager) {
+ super(null);
+ this.manager = manager;
+ }
+
+ @Override
+ public int isSupportedOption(String option) {
+ return manager.isSupportedOption(option);
+ }
+
+ @Override
+ public ClassLoader getClassLoader(Location location) {
+ return manager.getClassLoader(location);
+ }
+
+ @Override
+ public Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse) throws IOException {
+ return manager.list(location, packageName, kinds, recurse);
+ }
+
+ @Override
+ public String inferBinaryName(Location location, JavaFileObject file) {
+ return manager.inferBinaryName(location, file);
+ }
+
+ @Override
+ public boolean isSameFile(FileObject a, FileObject b) {
+ return manager.isSameFile(a, b);
+ }
+
+ @Override
+ public boolean handleOption(String current, Iterator<String> remaining) {
+ return manager.handleOption(current, remaining);
+ }
+
+ @Override
+ public boolean hasLocation(Location location) {
+ return manager.hasLocation(location);
+ }
+
+ @Override
+ public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException {
+ return manager.getJavaFileForInput(location, className, kind);
+ }
+
+ @Override
+ public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException {
+ return manager.getJavaFileForOutput(location, className, kind, sibling);
+ }
+
+ @Override
+ public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException {
+ return manager.getFileForInput(location, packageName, relativeName);
+ }
+
+ @Override
+ public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException {
+ return manager.getFileForOutput(location, packageName, relativeName, sibling);
+ }
+
+ @Override
+ public void flush() throws IOException {
+ manager.flush();
+ }
+
+ @Override
+ public void close() throws IOException {
+ manager.close();
+ }
+ }
+}
diff --git a/src/stubs/java/lang/annotation/ElementType.java b/src/stubs/java/lang/annotation/ElementType.java
new file mode 100644
index 00000000..bbab9cda
--- /dev/null
+++ b/src/stubs/java/lang/annotation/ElementType.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang.annotation;
+
+/**
+ * The constants of this enumerated type provide a simple classification of the
+ * syntactic locations where annotations may appear in a Java program. These
+ * constants are used in {@link java.lang.annotation.Target Target}
+ * meta-annotations to specify where it is legal to write annotations of a
+ * given type.
+ *
+ * <p>The syntactic locations where annotations may appear are split into
+ * <em>declaration contexts</em> , where annotations apply to declarations, and
+ * <em>type contexts</em> , where annotations apply to types used in
+ * declarations and expressions.
+ *
+ * <p>The constants {@link #ANNOTATION_TYPE}, {@link #CONSTRUCTOR}, {@link
+ * #FIELD}, {@link #LOCAL_VARIABLE}, {@link #METHOD}, {@link #PACKAGE}, {@link
+ * #MODULE}, {@link #PARAMETER}, {@link #TYPE}, and {@link #TYPE_PARAMETER}
+ * correspond to the declaration contexts in JLS 9.6.4.1.
+ *
+ * <p>For example, an annotation whose type is meta-annotated with
+ * {@code @Target(ElementType.FIELD)} may only be written as a modifier for a
+ * field declaration.
+ *
+ * <p>The constant {@link #TYPE_USE} corresponds to the type contexts in JLS
+ * 4.11, as well as to two declaration contexts: type declarations (including
+ * annotation type declarations) and type parameter declarations.
+ *
+ * <p>For example, an annotation whose type is meta-annotated with
+ * {@code @Target(ElementType.TYPE_USE)} may be written on the type of a field
+ * (or within the type of the field, if it is a nested, parameterized, or array
+ * type), and may also appear as a modifier for, say, a class declaration.
+ *
+ * <p>The {@code TYPE_USE} constant includes type declarations and type
+ * parameter declarations as a convenience for designers of type checkers which
+ * give semantics to annotation types. For example, if the annotation type
+ * {@code NonNull} is meta-annotated with
+ * {@code @Target(ElementType.TYPE_USE)}, then {@code @NonNull}
+ * {@code class C {...}} could be treated by a type checker as indicating that
+ * all variables of class {@code C} are non-null, while still allowing
+ * variables of other classes to be non-null or not non-null based on whether
+ * {@code @NonNull} appears at the variable's declaration.
+ *
+ * @author Joshua Bloch
+ * @since 1.5
+ * @jls 9.6.4.1 @Target
+ * @jls 4.1 The Kinds of Types and Values
+ */
+public enum ElementType {
+ /** Class, interface (including annotation type), or enum declaration */
+ TYPE,
+
+ /** Field declaration (includes enum constants) */
+ FIELD,
+
+ /** Method declaration */
+ METHOD,
+
+ /** Formal parameter declaration */
+ PARAMETER,
+
+ /** Constructor declaration */
+ CONSTRUCTOR,
+
+ /** Local variable declaration */
+ LOCAL_VARIABLE,
+
+ /** Annotation type declaration */
+ ANNOTATION_TYPE,
+
+ /** Package declaration */
+ PACKAGE,
+
+ /**
+ * Type parameter declaration
+ *
+ * @since 1.8
+ */
+ TYPE_PARAMETER,
+
+ /**
+ * Use of a type
+ *
+ * @since 1.8
+ */
+ TYPE_USE,
+
+ /**
+ * Module declaration.
+ *
+ * @since 9
+ */
+ MODULE
+}
diff --git a/src/stubsstubs/java/nio/file/Path.java b/src/stubsstubs/java/nio/file/Path.java
new file mode 100644
index 00000000..5fb2e7ec
--- /dev/null
+++ b/src/stubsstubs/java/nio/file/Path.java
@@ -0,0 +1,4 @@
+package java.nio.file;
+
+public class Path {
+}
diff --git a/src/support/info.txt b/src/support/info.txt
new file mode 100644
index 00000000..1723bffe
--- /dev/null
+++ b/src/support/info.txt
@@ -0,0 +1,4 @@
+These classes are not part of lombok itself, but used during the build. For example:
+* Code to turn the changelog into HTML ready to ship to projectlombok.org
+* Code to create eclipse debug targets
+
diff --git a/src/website/log4j.properties b/src/support/log4j.properties
index 9cafcc3b..9cafcc3b 100644
--- a/src/website/log4j.properties
+++ b/src/support/log4j.properties
diff --git a/src/support/lombok/eclipseCreate/CreateEclipseDebugTarget.java b/src/support/lombok/eclipseCreate/CreateEclipseDebugTarget.java
new file mode 100644
index 00000000..d3b314cb
--- /dev/null
+++ b/src/support/lombok/eclipseCreate/CreateEclipseDebugTarget.java
@@ -0,0 +1,177 @@
+package lombok.eclipseCreate;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+public class CreateEclipseDebugTarget {
+ private Map<String, String> args;
+ private StringBuilder launchContent = new StringBuilder();
+
+ private static class InvalidCommandLineException extends Exception {
+ InvalidCommandLineException(String msg) {
+ super(msg);
+
+ }
+ InvalidCommandLineException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ CreateEclipseDebugTarget instance = new CreateEclipseDebugTarget();
+ try {
+ instance.args = parseArgs(args);
+ if (instance.args.isEmpty()) throw new InvalidCommandLineException("");
+ instance.go();
+ } catch (InvalidCommandLineException e) {
+ String msg = e.getMessage();
+ if (!msg.isEmpty()) System.err.println("ERROR: " + msg);
+ if (e.getCause() != null) {
+ e.getCause().printStackTrace();
+ }
+ printCommandLineHelp();
+ System.exit(1);
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private void go() throws InvalidCommandLineException, IOException {
+ prologue();
+ classpath();
+ epilogue();
+ String n = getArgString("name");
+ File f = new File(n + ".launch").getCanonicalFile();
+
+ OutputStream out = new FileOutputStream(f);
+ try {
+ out.write(launchContent.toString().getBytes("UTF-8"));
+ } finally {
+ out.close();
+ }
+
+ System.out.println("Debug target created: " + f);
+ }
+
+ private void prologue() throws InvalidCommandLineException {
+ String type = getArgString("testType");
+
+ launchContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n");
+ launchContent.append("<launchConfiguration type=\"org.eclipse.jdt.junit.launchconfig\">\n");
+ launchContent.append("\t<listAttribute key=\"org.eclipse.debug.core.MAPPED_RESOURCE_PATHS\">\n");
+ launchContent.append("\t\t<listEntry value=\"/lombok/test/core/src/").append(type.replace(".", "/")).append(".java\"/>\n");
+ launchContent.append("\t</listAttribute>\n");
+ launchContent.append("\t<listAttribute key=\"org.eclipse.debug.core.MAPPED_RESOURCE_TYPES\">\n");
+ launchContent.append("\t\t<listEntry value=\"1\"/>\n");
+ launchContent.append("\t</listAttribute>\n");
+
+ if (getArgBoolean("favorite")) {
+ launchContent.append("\t<listAttribute key=\"org.eclipse.debug.ui.favoriteGroups\">\n");
+ launchContent.append("\t\t<listEntry value=\"org.eclipse.debug.ui.launchGroup.debug\"/>\n");
+ launchContent.append("\t</listAttribute>\n");
+ }
+
+ launchContent.append("\t<stringAttribute key=\"org.eclipse.jdt.junit.CONTAINER\" value=\"\"/>\n");
+ launchContent.append("\t<booleanAttribute key=\"org.eclipse.jdt.junit.KEEPRUNNING_ATTR\" value=\"false\"/>\n");
+ launchContent.append("\t<stringAttribute key=\"org.eclipse.jdt.junit.TESTNAME\" value=\"\"/>\n");
+ launchContent.append("\t<stringAttribute key=\"org.eclipse.jdt.junit.TEST_KIND\" value=\"org.eclipse.jdt.junit.loader.junit4\"/>\n");
+ launchContent.append("\t<booleanAttribute key=\"org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD\" value=\"true\"/>\n");
+ }
+
+ private void classpath() throws InvalidCommandLineException {
+ launchContent.append("\t<listAttribute key=\"org.eclipse.jdt.launching.CLASSPATH\">\n");
+
+ String self; try {
+ self = new File("..").getCanonicalPath();
+ } catch (IOException e) {
+ throw new InvalidCommandLineException("Cannot obtain canonical path to parent directory", e);
+ }
+
+ launchContent.append("\t\t<listEntry value=\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/lombok/bin&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;\"/>\n");
+ for (Map.Entry<String, String> entry : args.entrySet()) {
+ if (!entry.getKey().startsWith("conf.")) continue;
+ String[] files = entry.getValue().split(Pattern.quote(File.pathSeparator));
+ for (String file : files) {
+ String n;
+ try {
+ n = new File(file).getCanonicalPath();
+ } catch (IOException e) {
+ throw new InvalidCommandLineException("Cannot obtain canonical path to dependency " + file, e);
+ }
+ if (n.startsWith(self)) {
+ launchContent.append("\t\t<listEntry value=\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;");
+ launchContent.append(n.substring(self.length()));
+ launchContent.append("&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;\"/>\n");
+ }
+ }
+ }
+ launchContent.append("\t\t<listEntry value=\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/lombok/lib/openjdk6_rt.jar&quot; path=&quot;5&quot; type=&quot;2&quot;/&gt;&#10;\"/>\n");
+ launchContent.append("\t</listAttribute>\n");
+ }
+
+ private void epilogue() throws InvalidCommandLineException {
+ String type = getArgString("testType");
+
+ launchContent.append("\t<booleanAttribute key=\"org.eclipse.jdt.launching.DEFAULT_CLASSPATH\" value=\"false\"/>\n");
+ String jvmTarget = getArgString("jvmTarget");
+ launchContent.append("\t<stringAttribute key=\"org.eclipse.jdt.launching.JRE_CONTAINER\" value=\"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-").append(jvmTarget).append("\"/>\n");
+ launchContent.append("\t<stringAttribute key=\"org.eclipse.jdt.launching.MAIN_TYPE\" value=\"").append(type).append("\"/>\n");
+ launchContent.append("\t<listAttribute key=\"org.eclipse.jdt.launching.MODULEPATH\"/>\n");
+ launchContent.append("\t<stringAttribute key=\"org.eclipse.jdt.launching.PROJECT_ATTR\" value=\"lombok\"/>\n");
+ launchContent.append("<stringAttribute key=\"org.eclipse.jdt.launching.VM_ARGUMENTS\" value=\"-javaagent:dist/lombok.jar -Dshadow.override.lombok=${project_loc:lombok}/bin");
+ for (Map.Entry<String, String> entry : args.entrySet()) {
+ if (!entry.getKey().startsWith("conf.")) continue;
+ launchContent.append(File.pathSeparator).append(entry.getValue());
+ }
+ launchContent.append(" -Ddelombok.bootclasspath=lib/openjdk6_rt.jar\"/>\n");
+ launchContent.append("</launchConfiguration>\n");
+ }
+
+ private String getArgString(String key) throws InvalidCommandLineException {
+ String v = args.get(key);
+ if (v == null) throw new InvalidCommandLineException("mandatory argument '" + key + "' missing");
+ return v;
+ }
+
+ private boolean getArgBoolean(String key) throws InvalidCommandLineException {
+ String v = args.get(key);
+ if (v == null) return false;
+ if (v.equalsIgnoreCase("false") || v.equalsIgnoreCase("f")) return false;
+ return true;
+ }
+
+ private static void printCommandLineHelp() {
+ System.err.println("CreateEclipseDebugTarget\n" +
+ " name=Lombok-test BaseJavac 11 # Sets the name of the debug target to make\n" +
+ " testType=lombok.RunJavacAndBaseTests # The test class file that this debug target should run\n" +
+ " conf.test=foo:bar:baz # Where 'test' is an ivy conf name, and 'foo' is a path to a jar, relativized vs. current directory.\n" +
+ " favorite # Should the debug target be marked as favourite?\n" +
+ "");
+ }
+
+ private static Map<String, String> parseArgs(String[] args) throws IllegalArgumentException {
+ Map<String, String> map = new LinkedHashMap<String, String>();
+
+ for (String arg : args) {
+ int idx = arg.indexOf('=');
+ String key = (idx == -1 ? arg : arg.substring(0, idx)).trim();
+ String value = (idx == -1 ? "" : arg.substring(idx + 1)).trim();
+ String existing = map.get(key);
+ if (existing != null) {
+ if (key.startsWith("conf.")) {
+ value = existing + File.pathSeparator + value;
+ } else {
+ throw new IllegalArgumentException("Duplicate argument not allowed: " + key);
+ }
+ }
+ map.put(key, value);
+ }
+ return map;
+ }
+} \ No newline at end of file
diff --git a/src/website/lombok/website/CompileChangelog.java b/src/support/lombok/website/CompileChangelog.java
index 8912434e..8912434e 100644
--- a/src/website/lombok/website/CompileChangelog.java
+++ b/src/support/lombok/website/CompileChangelog.java
diff --git a/src/support/lombok/website/Domain.java b/src/support/lombok/website/Domain.java
new file mode 100644
index 00000000..103c7377
--- /dev/null
+++ b/src/support/lombok/website/Domain.java
@@ -0,0 +1,26 @@
+package lombok.website;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class Domain {
+ private static final String DEFAULT = "https://projectlombok.org/";
+ private final String prefix;
+
+ public Domain(String arg) {
+ if (arg == null || arg.isEmpty()) this.prefix = DEFAULT;
+ else {
+ if (!arg.contains("://")) arg = "https://" + arg;
+ if (!arg.endsWith("/")) arg += "/";
+ this.prefix = arg;
+ }
+ }
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public URL url(String path) throws MalformedURLException {
+ return new URL(prefix + path);
+ }
+}
diff --git a/src/website/lombok/website/FetchCurrentVersion.java b/src/support/lombok/website/FetchCurrentVersion.java
index d32c45dd..ec8d833a 100644
--- a/src/website/lombok/website/FetchCurrentVersion.java
+++ b/src/support/lombok/website/FetchCurrentVersion.java
@@ -4,7 +4,6 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -14,11 +13,11 @@ public class FetchCurrentVersion {
private static final Pattern VERSION_PATTERN = Pattern.compile("^.*<\\s*span\\s+id\\s*=\\s*[\"'](currentVersion|currentVersionFull)[\"'](?:\\s+style\\s*=\\s*[\"']display\\s*:\\s*none;?[\"'])?\\s*>\\s*([^\t<]+)\\s*<\\s*/\\s*span\\s*>.*$");
public static void main(String[] args) throws IOException {
- System.out.print(fetchVersionFromSite(args.length == 0 || args[0].equals("full")));
+ System.out.print(fetchVersionFromSite(args.length < 2 || args[1].equals("full"), new Domain(args.length < 1 ? "" : args[0])));
}
- public static String fetchVersionFromSite(boolean fetchFull) throws IOException {
- InputStream in = new URL("https://projectlombok.org/download").openStream();
+ public static String fetchVersionFromSite(boolean fetchFull, Domain domain) throws IOException {
+ InputStream in = domain.url("download").openStream();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
try {
diff --git a/src/website/lombok/website/WebsiteMaker.java b/src/support/lombok/website/WebsiteMaker.java
index 87d6dcc6..d786e605 100644
--- a/src/website/lombok/website/WebsiteMaker.java
+++ b/src/support/lombok/website/WebsiteMaker.java
@@ -11,7 +11,6 @@ import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.reflect.Method;
-import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -70,7 +69,14 @@ public class WebsiteMaker {
}
}
- private static void buildAll(String version, String fullVersion, String argIn, String argOut) throws Exception {
+ private static void printAllVersions(Domain domain) throws Exception {
+ List<List<String>> versions = readAllVersions(domain);
+ for (List<String> v : versions) {
+ System.out.println(" <a href=\"" + v.get(0) + "\">" + v.get(1) + "</a>");
+ }
+ }
+
+ private static void buildAll(Domain domain, String version, String fullVersion, String argIn, String argOut, boolean newRelease) throws Exception {
File in, out;
if (argIn == null) {
in = new File(".");
@@ -89,7 +95,7 @@ public class WebsiteMaker {
out = new File(argOut);
}
WebsiteMaker maker = new WebsiteMaker(version, fullVersion, in, out);
- maker.buildWebsite();
+ maker.buildWebsite(domain, newRelease);
}
private static void buildChangelog(String version, String fullVersion, String argIn, String argOut) throws Exception {
@@ -160,25 +166,32 @@ public class WebsiteMaker {
public static void main(String[] args) throws Exception {
String version, fullVersion;
+ Domain domain = new Domain(args.length < 1 ? "" : args[0]);
- if (args.length < 2) {
+ if (args.length < 3) {
version = VersionFinder.getVersion();
fullVersion = VersionFinder.getFullVersion();
} else {
- version = args[0];
- fullVersion = args[1];
+ version = args[1];
+ fullVersion = args[2];
}
- if (args.length < 3 || args[2].equalsIgnoreCase("all")) {
- buildAll(version, fullVersion, args.length < 4 ? null : args[3], args.length < 5 ? null : args[4]);
- } else if (args[2].equalsIgnoreCase("changelog")) {
- buildChangelog(version, fullVersion, args.length < 4 ? null : args[3], args.length < 5 ? null : args[4]);
- } else if (args[2].equalsIgnoreCase("download-edge")) {
- buildDownloadEdge(version, fullVersion, args.length < 4 ? null : args[3], args.length < 5 ? null : args[4]);
- } else if (args[2].equalsIgnoreCase("changelog-latest")) {
- buildChangelogLatest(version, fullVersion, args.length < 4 ? null : args[3], args.length < 5 ? null : args[4]);
+ String argIn = args.length < 5 ? null : args[4];
+ String argOut = args.length < 6 ? null : args[5];
+ if (args.length < 4 || args[3].equalsIgnoreCase("all")) {
+ buildAll(domain, version, fullVersion, argIn, argOut, false);
+ } else if (args.length < 4 || args[3].equalsIgnoreCase("all-newrelease")) {
+ buildAll(domain, version, fullVersion, argIn, argOut, true);
+ } else if (args[3].equalsIgnoreCase("changelog")) {
+ buildChangelog(version, fullVersion, argIn, argOut);
+ } else if (args[3].equalsIgnoreCase("download-edge")) {
+ buildDownloadEdge(version, fullVersion, argIn, argOut);
+ } else if (args[3].equalsIgnoreCase("changelog-latest")) {
+ buildChangelogLatest(version, fullVersion, argIn, argOut);
+ } else if (args[3].equalsIgnoreCase("print-allversions")) {
+ printAllVersions(domain);
} else {
- throw new IllegalArgumentException("3rd argument must be one of 'all', 'changelog', 'download-edge', 'changelog-latest'");
+ throw new IllegalArgumentException("4th argument must be one of 'all', 'changelog', 'download-edge', 'changelog-latest'");
}
}
@@ -230,11 +243,11 @@ public class WebsiteMaker {
convertHtAccess(freemarkerConfig, out);
}
- public void buildWebsite() throws Exception {
+ public void buildWebsite(Domain domain, boolean newRelease) throws Exception {
Configuration freemarkerConfig = makeFreemarkerConfig();
outputDir.mkdirs();
- convertTemplates(freemarkerConfig);
+ convertTemplates(domain, freemarkerConfig, newRelease);
buildHtAccess(new File(outputDir, ".htaccess"));
}
@@ -298,10 +311,10 @@ public class WebsiteMaker {
}
}
- private void convertTemplates(Configuration freemarker) throws Exception {
+ private void convertTemplates(Domain domain, Configuration freemarker, boolean newRelease) throws Exception {
File basePagesLoc = new File(baseDir, "templates");
Map<String, Object> dataModel = createBasicDataModel();
- dataModel.putAll(createExtendedDataModel());
+ dataModel.putAll(createExtendedDataModel(domain, newRelease));
convertTemplates_(freemarker, "", basePagesLoc, outputDir, 0, dataModel);
}
@@ -342,25 +355,39 @@ public class WebsiteMaker {
}
private static final Pattern LOMBOK_LINK = Pattern.compile("^.*<a(?: (?:id|class|rel|rev|download|target|type)(?:=\"[^\"]*\")?)* href=\"(downloads/[^\"]+)\"(?: (?:id|class|rel|rev|download|target|type)(?:=\"[^\"]*\")?)*>([^<]+)</a>.*$");
- private Map<String, Object> createExtendedDataModel() throws IOException {
+ private Map<String, Object> createExtendedDataModel(Domain domain, boolean newRelease) throws IOException {
Map<String, Object> data = new HashMap<String, Object>();
data.put("usages", new HtmlMaker(new File(baseDir, "usageExamples")));
- InputStream in = new URL("https://projectlombok.org/all-versions.html").openStream();
+ List<List<String>> allVersions = readAllVersions(domain);
+ if (!newRelease && !allVersions.isEmpty()) allVersions.remove(0); // remove current version; it will be 're-added' as current version automatically.
+ data.put("linksToVersions", allVersions);
+
+ return data;
+ }
+
+ private static List<List<String>> readAllVersions(Domain domain) throws IOException {
+ InputStream in = domain.url("all-versions.html").openStream();
ArrayList<List<String>> links = new ArrayList<List<String>>();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
for (String line = br.readLine(); line != null; line = br.readLine()) {
Matcher m = LOMBOK_LINK.matcher(line);
- if (m.matches()) links.add(Arrays.asList(m.group(1), m.group(2)));
+ if (m.matches()) {
+ String url = m.group(1);
+ String name = m.group(2);
+ if (name.endsWith(" [Current Version]")) {
+ name = "lombok-" + name.substring(0, name.length() - " [Current Version]".length()) + ".jar";
+ url = url.replace("lombok.jar", name);
+ }
+ links.add(Arrays.asList(name, url));
+ }
}
} finally {
in.close();
}
- data.put("linksToVersions", links);
-
- return data;
+ return links;
}
public static class HtmlMaker {
diff --git a/src/utils/lombok/core/SpiLoadUtil.java b/src/utils/lombok/core/SpiLoadUtil.java
index e685acd6..0feb7f12 100644
--- a/src/utils/lombok/core/SpiLoadUtil.java
+++ b/src/utils/lombok/core/SpiLoadUtil.java
@@ -129,9 +129,10 @@ public class SpiLoadUtil {
private static void readServicesFromUrl(Collection<String> list, URL url) throws IOException {
InputStream in = url.openStream();
+ BufferedReader r = null;
try {
if (in == null) return;
- BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8"));
+ r = new BufferedReader(new InputStreamReader(in, "UTF-8"));
while (true) {
String line = r.readLine();
if (line == null) break;
@@ -143,6 +144,7 @@ public class SpiLoadUtil {
}
} finally {
try {
+ if (r != null) r.close();
if (in != null) in.close();
} catch (Throwable ignore) {}
}