GP-3569 - Cleanup of Extension management

This commit is contained in:
dragonmacher 2023-07-11 14:09:56 -04:00
parent b0e0c7372a
commit b7583dc0b9
61 changed files with 3058 additions and 2540 deletions

View file

@ -109,7 +109,15 @@ public abstract class ApplicationLayout {
}
/**
* Returns the directory where archived application Extensions are stored.
* Returns the directory where archived application Extensions are stored. This directory may
* contain both zip files and subdirectories. This directory is only used inside of an
* installation; development mode does not use this directory. This directory is used to ship
* pre-built Ghidra extensions as part of a distribution.
* <P>
* This should be at the following location:<br>
* <ul>
* <li><code>{install dir}/Extensions/Ghidra</code></li>
* </ul>
*
* @return the application Extensions archive directory. Could be null if the
* {@link ApplicationLayout} does not support application Extensions.
@ -120,7 +128,13 @@ public abstract class ApplicationLayout {
}
/**
* Returns an {@link List ordered list} of the application Extensions installation directories.
* Returns a prioritized {@link List ordered list} of the application Extensions installation
* directories. Typically, the values may be any of the following locations:<br>
* <ul>
* <li><code>[user settings dir]/Extensions</code></li>
* <li><code>[application install dir]/Ghidra/Extensions</code> (Release Mode)</li>
* <li><code>ghidra/Ghidra/Extensions</code> (Development Mode)</li>
* </ul>
*
* @return an {@link List ordered list} of the application Extensions installation directories.
* Could be empty if the {@link ApplicationLayout} does not support application Extensions.

View file

@ -92,12 +92,12 @@ public class ModuleUtilities {
if (!rootDir.exists() || remainingDepth <= 0) {
return moduleRootDirs;
}
ResourceFile[] subDirs = rootDir.listFiles(ResourceFile::isDirectory);
ResourceFile[] subDirs = rootDir.listFiles(ResourceFile::isDirectory);
if (subDirs == null) {
throw new RuntimeException("Failed to read directory: " + rootDir);
}
for (ResourceFile subDir : subDirs) {
if ("build".equals(subDir.getName())) {
continue; // ignore all "build" directories
@ -230,9 +230,9 @@ public class ModuleUtilities {
* @param modules The modules to get the library directories of.
* @return A collection of library directories from the given modules.
*/
public static Collection<ResourceFile> getModuleLibDirectories(Map<String, GModule> modules) {
public static Collection<ResourceFile> getModuleLibDirectories(Collection<GModule> modules) {
List<ResourceFile> libraryDirectories = new ArrayList<>();
for (GModule module : modules.values()) {
for (GModule module : modules) {
module.collectExistingModuleDirs(libraryDirectories, "lib");
module.collectExistingModuleDirs(libraryDirectories, "libs");
}
@ -245,10 +245,10 @@ public class ModuleUtilities {
* @param modules The modules to get the compiled .class and resources directories of.
* @return A collection of directories containing classes and resources from the given modules.
*/
public static Collection<ResourceFile> getModuleBinDirectories(Map<String, GModule> modules) {
public static Collection<ResourceFile> getModuleBinDirectories(Collection<GModule> modules) {
String[] binaryPathTokens = BINARY_PATH.split(":");
List<ResourceFile> binDirectories = new ArrayList<>();
for (GModule module : modules.values()) {
for (GModule module : modules) {
Arrays.stream(binaryPathTokens)
.forEach(token -> module.collectExistingModuleDirs(binDirectories, token));
}
@ -404,4 +404,31 @@ public class ModuleUtilities {
.map(dir -> dir.getParentFile().getFile(false))
.anyMatch(dir -> FileUtilities.isPathContainedWithin(dir, moduleRootDir));
}
/**
* Returns true if the given module has been uninstalled.
* @param path the module path to check
* @return true if uninstalled
*/
public static boolean isUninstalled(String path) {
return isUninstalled(new File(path));
}
/**
* Returns true if the given module has been uninstalled.
* @param dir the module dir to check
* @return true if uninstalled
*/
public static boolean isUninstalled(File dir) {
return new File(dir, MANIFEST_FILE_NAME_UNINSTALLED).exists();
}
/**
* Returns true if the given module has been uninstalled.
* @param dir the module dir to check
* @return true if uninstalled
*/
public static boolean isUninstalled(ResourceFile dir) {
return new ResourceFile(dir, MANIFEST_FILE_NAME_UNINSTALLED).exists();
}
}