Skip to content

Commit

Permalink
Merge branch 'master' of git@github.com:rzwitserloot/lombok
Browse files Browse the repository at this point in the history
  • Loading branch information
unknown committed Nov 27, 2009
2 parents 645a0b0 + f1d33d4 commit e10d58e
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 6 deletions.
6 changes: 3 additions & 3 deletions src/delombok/lombok/delombok/Delombok.java
Expand Up @@ -78,7 +78,7 @@ private static class CmdArgs {

@Shorthand("d")
@Description("Directory to save delomboked files to")
@Mandatory(onlyIfNot="print")
@Mandatory(onlyIfNot={"print", "help"})
@Parameterized
private String target;

Expand All @@ -103,9 +103,9 @@ public static void main(String[] rawArgs) {
}

if (args.help || args.input.isEmpty()) {
if (args.input.isEmpty()) System.err.println("ERROR: no files or directories to delombok specified.");
if (!args.help) System.err.println("ERROR: no files or directories to delombok specified.");
System.err.println(reader.generateCommandLineHelp("delombok"));
System.exit(args.input.isEmpty() ? 1 : 0);
System.exit(args.help ? 0 : 1);
return;
}

Expand Down
86 changes: 83 additions & 3 deletions src/delombok/lombok/delombok/DelombokApp.java
@@ -1,9 +1,15 @@
package lombok.delombok;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import lombok.core.LombokApp;

Expand All @@ -18,13 +24,87 @@ public class DelombokApp implements LombokApp {
return 0;
} catch (ClassNotFoundException e) {
//tools.jar is probably not on the classpath. We're going to try and find it, and then load the rest via a ClassLoader that includes tools.jar.
File toolsJar = findToolsJar();
final File toolsJar = findToolsJar();
if (toolsJar == null) {
System.err.println("Can't find tools.jar. Rerun delombok with tools.jar on the classpath.");
return 1;
}

URLClassLoader loader = new URLClassLoader(new URL[] {toolsJar.toURI().toURL()});
final JarFile toolsJarFile = new JarFile(toolsJar);

ClassLoader loader = new ClassLoader() {
private Class<?>loadStreamAsClass(String name, boolean resolve, InputStream in) throws ClassNotFoundException {
try {
try {
byte[] b = new byte[65536];
ByteArrayOutputStream out = new ByteArrayOutputStream();
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
in.close();
byte[] data = out.toByteArray();
Class<?> c = defineClass(name, data, 0, data.length);
if (resolve) resolveClass(c);
return c;
} finally {
in.close();
}
} catch (IOException e2) {
throw new ClassNotFoundException(name, e2);
}
}

@Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
String rawName = name.replace(".", "/") + ".class";
JarEntry entry = toolsJarFile.getJarEntry(rawName);
if (entry == null) {
if (name.startsWith("lombok.")) return loadStreamAsClass(name, resolve, super.getResourceAsStream(rawName));
return super.loadClass(name, resolve);
}

try {
return loadStreamAsClass(name, resolve, toolsJarFile.getInputStream(entry));
} catch (IOException e2) {
throw new ClassNotFoundException(name, e2);
}
}

@Override public URL getResource(String name) {
JarEntry entry = toolsJarFile.getJarEntry(name);
if (entry == null) return super.getResource(name);
try {
return new URL("jar:file:" + toolsJar.getAbsolutePath() + "!" + name);
} catch (MalformedURLException ignore) {
return null;
}
}

@Override public Enumeration<URL> getResources(final String name) throws IOException {
JarEntry entry = toolsJarFile.getJarEntry(name);
final Enumeration<URL> parent = super.getResources(name);
if (entry == null) return super.getResources(name);
return new Enumeration<URL>() {
private boolean first = false;
@Override public boolean hasMoreElements() {
return !first || parent.hasMoreElements();
}

@Override public URL nextElement() {
if (!first) {
first = true;
try {
return new URL("jar:file:" + toolsJar.getAbsolutePath() + "!" + name);
} catch (MalformedURLException ignore) {
return parent.nextElement();
}
}
return parent.nextElement();
}
};
}
};
try {
loader.loadClass("lombok.delombok.Delombok").getMethod("main", String[].class).invoke(null, new Object[] {args});
} catch (InvocationTargetException e1) {
Expand Down

0 comments on commit e10d58e

Please sign in to comment.