diff --git a/release_scripts/APIUpdate/nbactions.xml b/release_scripts/APIUpdate/nbactions.xml
index e3b484bf66..0102967d7e 100644
--- a/release_scripts/APIUpdate/nbactions.xml
+++ b/release_scripts/APIUpdate/nbactions.xml
@@ -1,55 +1,55 @@
-
-
- run
-
- jar
-
-
- process-classes
- org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
-
-
-
- ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
- --help
- ${packageClassName}
- java
-
-
-
- debug
-
- jar
-
-
- process-classes
- org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
-
-
- -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}
- ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
- --help
- ${packageClassName}
- java
- true
-
-
-
- profile
-
- jar
-
-
- process-classes
- org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
-
-
-
- ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
- ${packageClassName}
- java
- --help
-
-
-
+
+
+ run
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
+
+
+
+ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
+ --help
+ ${packageClassName}
+ java
+
+
+
+ debug
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
+
+
+ -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}
+ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
+ --help
+ ${packageClassName}
+ java
+ true
+
+
+
+ profile
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
+
+
+
+ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
+ ${packageClassName}
+ java
+ --help
+
+
+
diff --git a/release_scripts/APIUpdate/pom.xml b/release_scripts/APIUpdate/pom.xml
index 1d38e4f5e2..0feced8364 100644
--- a/release_scripts/APIUpdate/pom.xml
+++ b/release_scripts/APIUpdate/pom.xml
@@ -24,5 +24,39 @@
1.5.0
+
+
+ org.apache.commons
+ commons-lang3
+ 3.13.0
+
+
+
+
+
+
+ maven-assembly-plugin
+
+
+
+ org.sleuthkit.autopsy.apiupdate.Main
+
+
+
+ jar-with-dependencies
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
\ No newline at end of file
diff --git a/release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/apiupdate/APIDiff.java b/release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/apiupdate/APIDiff.java
new file mode 100644
index 0000000000..7c73627d81
--- /dev/null
+++ b/release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/apiupdate/APIDiff.java
@@ -0,0 +1,70 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
+package org.sleuthkit.autopsy.apiupdate;
+
+import japicmp.cmp.JApiCmpArchive;
+import japicmp.cmp.JarArchiveComparator;
+import japicmp.cmp.JarArchiveComparatorOptions;
+import japicmp.model.JApiClass;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ *
+ * @author gregd
+ */
+public class APIDiff {
+
+ private static final FileFilter JAR_FILTER
+ = (File f) -> f.isFile() && (f.getName().toLowerCase().endsWith(".jar") || f.getName().toLowerCase().endsWith(".nbm"));
+
+ private static List getCommonJars(File prevDir, File currDir) {
+ Set prevJars = getJars(prevDir);
+ Set currJars = getJars(currDir);
+
+ Set commonJars = new HashSet<>(prevJars);
+ commonJars.retainAll(currJars);
+
+ // TODO how to handle different
+ return commonJars.stream().sorted().collect(Collectors.toList());
+ }
+
+ private static Set getJars(File dir) {
+ return Stream.of(dir.listFiles(JAR_FILTER))
+ .map(f -> f.getName())
+ .collect(Collectors.toSet());
+ }
+
+ private static Set getPublicPackages(File jarFile) throws IOException, IllegalStateException {
+ String publicPackageStr = ManifestLoader.loadFromJar(jarFile).getValue("OpenIDE-Module-Public-Packages");
+ if (publicPackageStr == null) {
+ throw new IllegalStateException(MessageFormat.format("Manifest for {0} does not have key of 'OpenIDE-Module-Public-Packages'", jarFile.getAbsolutePath()));
+ } else {
+ return Stream.of(publicPackageStr.split(","))
+ .map(String::trim)
+ .map(str -> str.endsWith(".*") ? str.substring(0, str.length() - 2) : str)
+ .collect(Collectors.toSet());
+ }
+ }
+
+ private static void getComparison(String prevVersion, String curVersion, File prevJar, File curJar) {
+ JarArchiveComparatorOptions comparatorOptions = new JarArchiveComparatorOptions();
+ comparatorOptions.getIgnoreMissingClasses().setIgnoreAllMissingClasses(true);
+ JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(comparatorOptions);
+ List jApiClasses = jarArchiveComparator.compare(
+ new JApiCmpArchive(prevJar, prevVersion),
+ new JApiCmpArchive(curJar, curVersion)
+ );
+ System.out.println("Comparing " + prevJar.getName());
+ System.out.println(jApiClasses);
+ }
+}
diff --git a/release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/classpathsimplication/apiupdate/CLIProcessor.java b/release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/apiupdate/CLIProcessor.java
similarity index 84%
rename from release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/classpathsimplication/apiupdate/CLIProcessor.java
rename to release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/apiupdate/CLIProcessor.java
index 0ac99e73ed..5295febd70 100644
--- a/release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/classpathsimplication/apiupdate/CLIProcessor.java
+++ b/release_scripts/APIUpdate/src/main/java/org/sleuthkit/autopsy/apiupdate/CLIProcessor.java
@@ -2,7 +2,7 @@
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
-package org.sleuthkit.autopsy.classpathsimplication.apiupdate;
+package org.sleuthkit.autopsy.apiupdate;
import java.io.File;
import java.util.Arrays;
@@ -57,12 +57,22 @@ public class CLIProcessor {
.option("cv")
.required(true)
.build();
+
+ static Option SRC_LOC_OPT = Option.builder()
+ .argName("path")
+ .desc("The path to the root of the autopsy repor")
+ .hasArg(true)
+ .longOpt("src-path")
+ .option("s")
+ .required(true)
+ .build();
static List