diff --git a/src/main/java/org/scijava/InstantiableException.java b/src/main/java/org/scijava/InstantiableException.java index 1f2558305..98973208a 100644 --- a/src/main/java/org/scijava/InstantiableException.java +++ b/src/main/java/org/scijava/InstantiableException.java @@ -42,6 +42,8 @@ */ public class InstantiableException extends Exception { + private static final long serialVersionUID = 1L; + public InstantiableException() { super(); } diff --git a/src/main/java/org/scijava/MenuPath.java b/src/main/java/org/scijava/MenuPath.java index 843a81931..0491b0201 100644 --- a/src/main/java/org/scijava/MenuPath.java +++ b/src/main/java/org/scijava/MenuPath.java @@ -45,6 +45,8 @@ */ public class MenuPath extends ArrayList { + private static final long serialVersionUID = 1L; + /** The separator between elements of a menu path string. */ public static final String PATH_SEPARATOR = ">"; diff --git a/src/main/java/org/scijava/NoSuchServiceException.java b/src/main/java/org/scijava/NoSuchServiceException.java index 4ed42102e..6a0e6d4c2 100644 --- a/src/main/java/org/scijava/NoSuchServiceException.java +++ b/src/main/java/org/scijava/NoSuchServiceException.java @@ -44,6 +44,8 @@ */ public class NoSuchServiceException extends RuntimeException { + private static final long serialVersionUID = 1L; + public NoSuchServiceException() { super(); } diff --git a/src/main/java/org/scijava/object/ObjectIndex.java b/src/main/java/org/scijava/object/ObjectIndex.java index 16d3a4e16..e95419b44 100644 --- a/src/main/java/org/scijava/object/ObjectIndex.java +++ b/src/main/java/org/scijava/object/ObjectIndex.java @@ -275,13 +275,13 @@ protected boolean remove(final Object o, final Class type, } protected boolean addToList(final E obj, final List list, - @SuppressWarnings("unused") final boolean batch) + final boolean batch) { return list.add(obj); } protected boolean removeFromList(final Object obj, final List list, - @SuppressWarnings("unused") final boolean batch) + final boolean batch) { return list.remove(obj); } diff --git a/src/main/java/org/scijava/util/CheckSezpoz.java b/src/main/java/org/scijava/util/CheckSezpoz.java index a22a5610c..e0bdc721c 100644 --- a/src/main/java/org/scijava/util/CheckSezpoz.java +++ b/src/main/java/org/scijava/util/CheckSezpoz.java @@ -43,6 +43,7 @@ import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.DigestInputStream; import java.security.MessageDigest; @@ -57,6 +58,8 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -363,19 +366,6 @@ protected static boolean hasAnnotation(final File file) { * @return whether anything in {@code META-INF/annotations/*} changed */ public static boolean fix(final File classes, final File sources) { - final Method aptProcess; - try { - final Class aptClass = - CheckSezpoz.class.getClassLoader().loadClass("com.sun.tools.apt.Main"); - aptProcess = - aptClass.getMethod("process", new Class[] { String[].class }); - } - catch (final Exception e) { - e.printStackTrace(); - System.err - .println("ERROR: Could not fix " + sources + ": apt not found"); - return false; - } if (!sources.exists()) { System.err.println("ERROR: Sources are not in the expected place: " + sources); @@ -383,10 +373,7 @@ public static boolean fix(final File classes, final File sources) { } final List aptArgs = new ArrayList(); - aptArgs.add("-nocompile"); if (verbose) aptArgs.add("-verbose"); - aptArgs.add("-factory"); - aptArgs.add("net.java.sezpoz.impl.IndexerFactory"); aptArgs.add("-d"); aptArgs.add(classes.getPath()); final int count = aptArgs.size(); @@ -412,7 +399,7 @@ public static boolean fix(final File classes, final File sources) { final String[] args = aptArgs.toArray(new String[aptArgs.size()]); try { System.err.println("WARN: Updating the annotation index in " + classes); - aptProcess.invoke(null, new Object[] { args }); + runApt(args); } catch (final Exception e) { e.printStackTrace(); @@ -440,6 +427,36 @@ public static boolean fix(final File classes, final File sources) { return result; } + private static void runApt(String[] args) throws ClassNotFoundException, + SecurityException, NoSuchMethodException, IllegalArgumentException, + IllegalAccessException, InvocationTargetException + { + final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler != null) { + final List aptArgs = new ArrayList(); + aptArgs.add("-proc:only"); + aptArgs.add("-processor"); + aptArgs.add("net.java.sezpoz.impl.Indexer6"); + aptArgs.addAll(Arrays.asList(args)); + compiler.run(null, null, null, args); + return; + } + + System.err.println("WARN: falling back to calling the 'apt' Main class directly"); + final List aptArgs = new ArrayList(); + aptArgs.add("-nocompile"); + aptArgs.add("-factory"); + aptArgs.add("net.java.sezpoz.impl.IndexerFactory"); + aptArgs.addAll(Arrays.asList(args)); + + final Method aptProcess; + final Class aptClass = + ToolProvider.getSystemToolClassLoader().loadClass("com.sun.tools.apt.Main"); + aptProcess = + aptClass.getMethod("process", new Class[] { String[].class }); + aptProcess.invoke(null, aptArgs.toArray()); + } + private static MessageDigest digest; /** diff --git a/src/main/java/org/scijava/util/SizableArrayList.java b/src/main/java/org/scijava/util/SizableArrayList.java index ebbef7906..e15a7dd5a 100644 --- a/src/main/java/org/scijava/util/SizableArrayList.java +++ b/src/main/java/org/scijava/util/SizableArrayList.java @@ -51,6 +51,8 @@ */ public class SizableArrayList extends ArrayList implements Sizable { + private static final long serialVersionUID = 1L; + // -- Constructors -- public SizableArrayList(final int initialCapacity) { diff --git a/src/test/java/org/scijava/util/CheckSezpozTest.java b/src/test/java/org/scijava/util/CheckSezpozTest.java index 0546c0ccb..b1b460cba 100644 --- a/src/test/java/org/scijava/util/CheckSezpozTest.java +++ b/src/test/java/org/scijava/util/CheckSezpozTest.java @@ -38,6 +38,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; import java.io.File; import java.io.FileInputStream; @@ -50,6 +51,9 @@ import java.net.URL; import java.net.URLClassLoader; +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; + import net.java.sezpoz.Index; import net.java.sezpoz.IndexItem; @@ -115,8 +119,11 @@ public void testBasic() throws Exception { + "}\n"); writer.close(); - ProcessUtils.exec(sources, System.err, System.out, "javac", "-classpath", - System.getProperty("java.class.path"), "Annotated.java"); + final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler == null) System.err.println("WARN: running in a JRE; Skipping CheckSezpozTest!"); + assumeTrue(compiler != null); + compiler.run(null, null, null, "-classpath", + System.getProperty("java.class.path"), new File(sources, "Annotated.java").getAbsolutePath()); // to make sure the annotation processor "has not run", // we need to copy the .class file