GP-0: Using SequencedCollection for application root dirs since order

matters
This commit is contained in:
Ryan Kurtz 2025-05-19 12:47:56 -04:00
parent 2e7c5da7b0
commit ea076b3fa6
5 changed files with 22 additions and 26 deletions

View file

@ -87,7 +87,7 @@ public class GenericApplicationLayout extends ApplicationLayout {
* @param applicationProperties The properties object that will be read system properties. * @param applicationProperties The properties object that will be read system properties.
* @throws IOException if there was a problem getting a user directory. * @throws IOException if there was a problem getting a user directory.
*/ */
public GenericApplicationLayout(Collection<ResourceFile> applicationRootDirs, public GenericApplicationLayout(SequencedCollection<ResourceFile> applicationRootDirs,
ApplicationProperties applicationProperties) throws IOException { ApplicationProperties applicationProperties) throws IOException {
this.applicationProperties = Objects.requireNonNull(applicationProperties); this.applicationProperties = Objects.requireNonNull(applicationProperties);
@ -179,9 +179,9 @@ public class GenericApplicationLayout extends ApplicationLayout {
* first entry will be the primary root in both cases. * first entry will be the primary root in both cases.
* @return root directories * @return root directories
*/ */
public static Collection<ResourceFile> getDefaultApplicationRootDirs() { public static SequencedCollection<ResourceFile> getDefaultApplicationRootDirs() {
Set<ResourceFile> results = new HashSet<>(); List<ResourceFile> results = new ArrayList<>();
String additionalRootsProperty = System.getProperty(ADDITIONAL_APPLICATION_ROOT_DIRS); String additionalRootsProperty = System.getProperty(ADDITIONAL_APPLICATION_ROOT_DIRS);
if (!StringUtils.isBlank(additionalRootsProperty)) { if (!StringUtils.isBlank(additionalRootsProperty)) {
String[] paths = additionalRootsProperty.split(File.pathSeparator); String[] paths = additionalRootsProperty.split(File.pathSeparator);

View file

@ -113,9 +113,9 @@ public class GhidraApplicationLayout extends ApplicationLayout {
/** /**
* Finds the application root directories for this application layout. * Finds the application root directories for this application layout.
* *
* @return A collection of the application root directories for this layout. * @return A {@link SequencedCollection} of the application root directories for this layout.
*/ */
protected Collection<ResourceFile> findGhidraApplicationRootDirs() { protected SequencedCollection<ResourceFile> findGhidraApplicationRootDirs() {
return ApplicationUtilities.findDefaultApplicationRootDirs(); return ApplicationUtilities.findDefaultApplicationRootDirs();
} }

View file

@ -48,17 +48,14 @@ public class GhidraJarApplicationLayout extends GhidraApplicationLayout {
} }
@Override @Override
protected Collection<ResourceFile> findGhidraApplicationRootDirs() { protected SequencedCollection<ResourceFile> findGhidraApplicationRootDirs() {
List<ResourceFile> dirs = new ArrayList<>();
String appPropPath = "/_Root/Ghidra/" + ApplicationProperties.PROPERTY_FILE; String appPropPath = "/_Root/Ghidra/" + ApplicationProperties.PROPERTY_FILE;
URL appPropUrl = getClass().getResource(appPropPath); URL appPropUrl = getClass().getResource(appPropPath);
if (appPropUrl == null) { if (appPropUrl == null) {
throw new IllegalStateException( throw new IllegalStateException(
"The Ghidra Jar must have an application.properties file at " + appPropPath); "The Ghidra Jar must have an application.properties file at " + appPropPath);
} }
ResourceFile rootDir = fromUrl(appPropUrl).getParentFile(); return List.of(fromUrl(appPropUrl).getParentFile());
dirs.add(rootDir);
return dirs;
} }
@Override @Override

View file

@ -33,7 +33,7 @@ import ghidra.framework.GModule;
public abstract class ApplicationLayout { public abstract class ApplicationLayout {
protected ApplicationProperties applicationProperties; protected ApplicationProperties applicationProperties;
protected Collection<ResourceFile> applicationRootDirs; protected SequencedCollection<ResourceFile> applicationRootDirs;
protected ResourceFile applicationInstallationDir; protected ResourceFile applicationInstallationDir;
protected Map<String, GModule> modules; protected Map<String, GModule> modules;
protected File userTempDir; protected File userTempDir;
@ -55,9 +55,9 @@ public abstract class ApplicationLayout {
/** /**
* Gets the application root directories from the application layout. * Gets the application root directories from the application layout.
* *
* @return A collection of application root directories (or null if not set). * @return A {@link SequencedCollection} of application root directories (or null if not set).
*/ */
public final Collection<ResourceFile> getApplicationRootDirs() { public final SequencedCollection<ResourceFile> getApplicationRootDirs() {
return applicationRootDirs; return applicationRootDirs;
} }

View file

@ -16,8 +16,7 @@
package utility.application; package utility.application;
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import generic.jar.ResourceFile; import generic.jar.ResourceFile;
import ghidra.framework.*; import ghidra.framework.*;
@ -50,8 +49,8 @@ public class ApplicationUtilities {
* *
* @return A collection of discovered application root directories (could be empty). * @return A collection of discovered application root directories (could be empty).
*/ */
public static Collection<ResourceFile> findDefaultApplicationRootDirs() { public static SequencedCollection<ResourceFile> findDefaultApplicationRootDirs() {
Collection<ResourceFile> applicationRootDirs = new ArrayList<>(); List<ResourceFile> applicationRootDirs = new ArrayList<>();
ResourceFile applicationRootDir = findPrimaryApplicationRootDir(); ResourceFile applicationRootDir = findPrimaryApplicationRootDir();
if (applicationRootDir != null) { if (applicationRootDir != null) {
applicationRootDirs.add(applicationRootDir); applicationRootDirs.add(applicationRootDir);
@ -121,11 +120,11 @@ public class ApplicationUtilities {
* *
* @param primaryApplicationRootDir The primary application root directory that may contain the * @param primaryApplicationRootDir The primary application root directory that may contain the
* repository config file one directory up. * repository config file one directory up.
* @return A collection of defined application repository root directories. * @return A {@link SequencedCollection} of defined application repository root directories.
*/ */
private static Collection<ResourceFile> findApplicationRootDirsFromRepoConfig( private static SequencedCollection<ResourceFile> findApplicationRootDirsFromRepoConfig(
ResourceFile primaryApplicationRootDir) { ResourceFile primaryApplicationRootDir) {
Collection<ResourceFile> repoApplicationRootDirs = new ArrayList<>(); List<ResourceFile> repoApplicationRootDirs = new ArrayList<>();
ResourceFile repoConfigFile = ResourceFile repoConfigFile =
new ResourceFile(primaryApplicationRootDir.getParentFile(), "ghidra.repos.config"); new ResourceFile(primaryApplicationRootDir.getParentFile(), "ghidra.repos.config");
if (repoConfigFile.isFile()) { if (repoConfigFile.isFile()) {