From d0672b3d64b47893385b516048ee62c9e3cfb625 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Sun, 2 Aug 2020 16:26:56 -0500 Subject: [PATCH 1/5] POM: update parent to pom-scijava 29.2.0 --- pom.xml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 39a8f04b..02ca1cd9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.scijava pom-scijava - 28.0.0 + 29.2.0 @@ -146,13 +146,6 @@ deploy-to-scijava - - 5.2 - 0.7.0 - 0.1.7 - 0.13.1 - 2.83.1 - 2.0.0 From 4dfc23aba382860bb3334dd96e300982e170388c Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Sun, 2 Aug 2020 16:21:04 -0500 Subject: [PATCH 2/5] EditorPane: update bug URL --- src/main/java/org/scijava/ui/swing/script/EditorPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/scijava/ui/swing/script/EditorPane.java b/src/main/java/org/scijava/ui/swing/script/EditorPane.java index 6825dfde..debea1e9 100644 --- a/src/main/java/org/scijava/ui/swing/script/EditorPane.java +++ b/src/main/java/org/scijava/ui/swing/script/EditorPane.java @@ -500,7 +500,7 @@ protected void setLanguage(final ScriptLanguage language, } catch (final NullPointerException exc) { // NB: Avoid possible NPEs in RSyntaxTextArea code. - // See: http://fiji.sc/bugzilla/show_bug.cgi?id=1181 + // See: https://fiji.sc/bug/1181.html log.debug(exc); } From 917d1b3d9344ed0aa6762e79770eb9ceaac2a7dd Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Sun, 2 Aug 2020 16:21:36 -0500 Subject: [PATCH 3/5] FileFunctions: deprecated getSourcePath The common case these days is to open the source code in the browser -- typically on GitHub, but whatever SCM URL the POM lists. --- .../ui/swing/script/FileFunctions.java | 7 ++++-- .../scijava/ui/swing/script/TextEditor.java | 22 ++++++------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/scijava/ui/swing/script/FileFunctions.java b/src/main/java/org/scijava/ui/swing/script/FileFunctions.java index 055ced1e..1790f30c 100644 --- a/src/main/java/org/scijava/ui/swing/script/FileFunctions.java +++ b/src/main/java/org/scijava/ui/swing/script/FileFunctions.java @@ -152,9 +152,12 @@ public boolean isBinaryFile(final String path) { } /** - * Make a sensible effort to get the path of the source for a class. + * @deprecated Use {@link #getSourceURL(String)} instead. + * @throws ClassNotFoundException */ - public String getSourcePath(final String className) + @Deprecated + public String getSourcePath( + @SuppressWarnings("unused") final String className) throws ClassNotFoundException { // move updater's stuff into ij-core and re-use here diff --git a/src/main/java/org/scijava/ui/swing/script/TextEditor.java b/src/main/java/org/scijava/ui/swing/script/TextEditor.java index 6e99c6fc..4455ba26 100644 --- a/src/main/java/org/scijava/ui/swing/script/TextEditor.java +++ b/src/main/java/org/scijava/ui/swing/script/TextEditor.java @@ -1402,22 +1402,14 @@ else if (source == openMacroFunctions) try { else if (source == extractSourceJar) extractSourceJar(); else if (source == openSourceForClass) { final String className = getSelectedClassNameOrAsk(); - if (className != null) try { - final String path = new FileFunctions(this).getSourcePath(className); - if (path != null) open(new File(path)); - else { - final String url = new FileFunctions(this).getSourceURL(className); - try { - platformService.open(new URL(url)); - } - catch (final Throwable e) { - handleException(e); - } + if (className != null) { + final String url = new FileFunctions(this).getSourceURL(className); + try { + platformService.open(new URL(url)); + } + catch (final Throwable e) { + handleException(e); } - } - catch (final ClassNotFoundException e) { - log.debug(e); - error("Could not open source for class " + className); } } /* TODO From 4d15013ffcafe5a834ab27d4cd26aaaa672bf145 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Sun, 2 Aug 2020 16:23:40 -0500 Subject: [PATCH 4/5] Fix the "Open .java file for class" command The "http://fiji.sc/Foo.java" shortcut has not worked for many years. And will not be made to work again, due to security considerations. Instead, we look in the POM and/or JAR manifest for the given class. --- .../ui/swing/script/FileFunctions.java | 21 ++++++++++++++++++- .../scijava/ui/swing/script/TextEditor.java | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/scijava/ui/swing/script/FileFunctions.java b/src/main/java/org/scijava/ui/swing/script/FileFunctions.java index 1790f30c..cd6c17b9 100644 --- a/src/main/java/org/scijava/ui/swing/script/FileFunctions.java +++ b/src/main/java/org/scijava/ui/swing/script/FileFunctions.java @@ -47,6 +47,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.regex.Matcher; @@ -65,7 +66,10 @@ import org.scijava.util.AppUtils; import org.scijava.util.FileUtils; import org.scijava.util.LineOutputStream; +import org.scijava.util.Manifest; +import org.scijava.util.POM; import org.scijava.util.ProcessUtils; +import org.scijava.util.Types; /** * TODO @@ -165,7 +169,22 @@ public String getSourcePath( } public String getSourceURL(final String className) { - return "http://fiji.sc/" + className.replace('.', '/') + ".java"; + final Class c = Types.load(className, false); + final POM pom = POM.getPOM(c); + final String scmPath = pom.getSCMURL(); + if (scmPath == null || scmPath.isEmpty()) return null; + final String branch; + final String scmTag = pom.getSCMTag(); + if (scmTag == null || scmTag.isEmpty() || Objects.equals(scmTag, "HEAD")) { + final Manifest m = Manifest.getManifest(c); + final String commit = m == null ? null : m.getImplementationBuild(); + branch = commit == null || commit.isEmpty() ? "master" : commit; + } + else branch = scmTag; + + final String prefix = scmPath.endsWith("/") ? scmPath : scmPath + "/"; + return prefix + "blob/" + branch + "/src/main/java/" + // + className.replace('.', '/') + ".java"; } protected static Map> class2source; diff --git a/src/main/java/org/scijava/ui/swing/script/TextEditor.java b/src/main/java/org/scijava/ui/swing/script/TextEditor.java index 4455ba26..f7c85b83 100644 --- a/src/main/java/org/scijava/ui/swing/script/TextEditor.java +++ b/src/main/java/org/scijava/ui/swing/script/TextEditor.java @@ -1403,8 +1403,8 @@ else if (source == openMacroFunctions) try { else if (source == openSourceForClass) { final String className = getSelectedClassNameOrAsk(); if (className != null) { - final String url = new FileFunctions(this).getSourceURL(className); try { + final String url = new FileFunctions(this).getSourceURL(className); platformService.open(new URL(url)); } catch (final Throwable e) { From a05d7da2cecf5bb6bc4ad21f9fba75cb54c9964d Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Sun, 2 Aug 2020 17:03:17 -0500 Subject: [PATCH 5/5] Fix the "Open Help for Class" commands --- .../scijava/ui/swing/script/TextEditor.java | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/scijava/ui/swing/script/TextEditor.java b/src/main/java/org/scijava/ui/swing/script/TextEditor.java index f7c85b83..07323382 100644 --- a/src/main/java/org/scijava/ui/swing/script/TextEditor.java +++ b/src/main/java/org/scijava/ui/swing/script/TextEditor.java @@ -162,6 +162,8 @@ import org.scijava.ui.swing.script.commands.KillScript; import org.scijava.util.FileUtils; import org.scijava.util.MiscUtils; +import org.scijava.util.POM; +import org.scijava.util.Types; import org.scijava.widget.FileWidget; /** @@ -2598,10 +2600,63 @@ public void openHelp(final String className) { * @param className * @param withFrames */ - public void openHelp(final String className, final boolean withFrames) { - if (className == null) { - // FIXME: This cannot be right. - getSelectedClassNameOrAsk(); + public void openHelp(String className, final boolean withFrames) { + if (className == null) className = getSelectedClassNameOrAsk(); + if (className == null) return; + final Class c = Types.load(className, false); + + final String path = (withFrames ? "index.html?" : "") + // + className.replace('.', '/') + ".html"; + + final String url; + + if (className.startsWith("java.") || className.startsWith("javax.")) { + // Core Java class -- use javadoc.scijava.org/Java<#> link. + final String javaVersion = System.getProperty("java.version"); + final String majorVersion; + if (javaVersion.startsWith("1.")) { + majorVersion = javaVersion.substring(2, javaVersion.indexOf('.', 2)); + } + else majorVersion = javaVersion.substring(0, javaVersion.indexOf('.')); + url = "https://javadoc.scijava.org/Java" + majorVersion + "/" + path; + } + else { + // Third party library -- look for a Maven POM identifying it. + final POM pom = POM.getPOM(c); + if (pom == null) { + throw new IllegalArgumentException(// + "Unknown origin for class " + className); + } + final String releaseProfiles = pom.cdata("//properties/releaseProfiles"); + final boolean scijavaRepo = "deploy-to-scijava".equals(releaseProfiles); + if (scijavaRepo) { + // Use javadoc.scijava.org -- try to figure out which project. + // Maybe some day, we can bake this information into the POM. + final String project; + final String g = pom.getGroupId(); + if ("net.imagej".equals(g)) { + project = "ij".equals(pom.getArtifactId()) ? "ImageJ1" : "ImageJ"; + } + else if ("io.scif".equals(g)) project = "SCIFIO"; + else if ("net.imglib2".equals(g)) project = "ImgLib2"; + else if ("org.bonej".equals(g)) project = "BoneJ"; + else if ("org.scijava".equals(g)) project = "SciJava"; + else if ("sc.fiji".equals(g)) project = "Fiji"; + else project = "Java"; + url = "https://javadoc.scijava.org/" + project + "/" + path; + } + else { + // Assume Maven Central -- use javadoc.io. + url = "https://javadoc.io/static/" + pom.getGroupId() + "/" + // + pom.getArtifactId() + "/" + pom.getVersion() + "/" + path; + } + } + + try { + platformService.open(new URL(url)); + } + catch (final Throwable e) { + handleException(e); } }