Merge remote-tracking branch 'origin/GP-3922_ryanmkurtz_libs'

This commit is contained in:
Ryan Kurtz
2023-10-13 07:16:19 -04:00
@@ -627,6 +627,15 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
TaskMonitor monitor) throws CancelledException, IOException { TaskMonitor monitor) throws CancelledException, IOException {
Program library = null; Program library = null;
if (libraryDestFolderPath != null) {
String libraryPath = FilenameUtils.getPath(libraryName);
if (libraryPath != null && !libraryPath.isEmpty()) {
if (!libraryDestFolderPath.endsWith("/")) {
libraryDestFolderPath += "/";
}
libraryDestFolderPath += libraryPath;
}
}
String simpleLibraryName = FilenameUtils.getName(libraryName); String simpleLibraryName = FilenameUtils.getName(libraryName);
List<FSRL> candidateLibraryFsrls = List<FSRL> candidateLibraryFsrls =
findLibrary(Path.of(libraryName), fsSearchPaths, log, monitor); findLibrary(Path.of(libraryName), fsSearchPaths, log, monitor);
@@ -921,14 +930,9 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
List<DomainFolder> searchFolders, MessageLog messageLog, TaskMonitor monitor) List<DomainFolder> searchFolders, MessageLog messageLog, TaskMonitor monitor)
throws CancelledException, IOException { throws CancelledException, IOException {
Map<String, Loaded<Program>> loadedByName = loadedPrograms.stream() monitor.initialize(loadedPrograms.size());
.collect( for (Loaded<Program> loadedProgram : loadedPrograms) {
Collectors.toMap(loaded -> loaded.getName(), loaded -> loaded)); monitor.increment();
monitor.initialize(loadedByName.size());
for (Loaded<Program> loadedProgram : loadedByName.values()) {
monitor.incrementProgress(1);
monitor.checkCancelled();
Program program = loadedProgram.getDomainObject(); Program program = loadedProgram.getDomainObject();
ExternalManager extManager = program.getExternalManager(); ExternalManager extManager = program.getExternalManager();
@@ -941,7 +945,8 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
monitor.setMessage("Resolving..." + program.getName()); monitor.setMessage("Resolving..." + program.getName());
int id = program.startTransaction("Resolving external references"); int id = program.startTransaction("Resolving external references");
try { try {
resolveExternalLibraries(program, loadedByName, searchFolders, monitor, messageLog); resolveExternalLibraries(program, loadedPrograms, searchFolders, monitor,
messageLog);
} }
finally { finally {
program.endTransaction(id, true); program.endTransaction(id, true);
@@ -957,9 +962,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
* *
* @param program the program whose Library entries are to be resolved. An open * @param program the program whose Library entries are to be resolved. An open
* transaction on program is required. * transaction on program is required.
* @param loadedByName map of recently loaded things to be considered * @param loadedPrograms the list of {@link Loaded} {@link Program}s
* first when resolving external Libraries. Programs not saved to the project
* will be ignored.
* @param searchFolders an order list of {@link DomainFolder}s which imported libraries will be * @param searchFolders an order list of {@link DomainFolder}s which imported libraries will be
* searched. These folders will be searched if a library is not found within the list of * searched. These folders will be searched if a library is not found within the list of
* programs supplied. * programs supplied.
@@ -968,7 +971,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
* @throws CancelledException if the user cancelled the load. * @throws CancelledException if the user cancelled the load.
*/ */
private void resolveExternalLibraries(Program program, private void resolveExternalLibraries(Program program,
Map<String, Loaded<Program>> loadedByName, List<DomainFolder> searchFolders, List<Loaded<Program>> loadedPrograms, List<DomainFolder> searchFolders,
TaskMonitor monitor, MessageLog messageLog) throws CancelledException { TaskMonitor monitor, MessageLog messageLog) throws CancelledException {
ExternalManager extManager = program.getExternalManager(); ExternalManager extManager = program.getExternalManager();
String[] extLibNames = extManager.getExternalLibraryNames(); String[] extLibNames = extManager.getExternalLibraryNames();
@@ -981,8 +984,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
} }
monitor.checkCancelled(); monitor.checkCancelled();
try { try {
String externalFileName = FilenameUtils.getName(externalLibName); Loaded<Program> matchingExtProgram = findLibrary(loadedPrograms, externalLibName);
Loaded<Program> matchingExtProgram = findLibrary(loadedByName, externalFileName);
if (matchingExtProgram != null) { if (matchingExtProgram != null) {
String path = String path =
matchingExtProgram.getProjectFolderPath() + matchingExtProgram.getName(); matchingExtProgram.getProjectFolderPath() + matchingExtProgram.getName();
@@ -1011,6 +1013,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
Msg.error(this, "Bad library name: " + externalLibName, e); Msg.error(this, "Bad library name: " + externalLibName, e);
} }
} }
messageLog.appendMsg("------------------------------------------------\n");
} }
/** /**
@@ -1134,21 +1137,28 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader
/** /**
* Find the library within the given {@link Map} of {@link Program}s * Find the library within the given {@link Map} of {@link Program}s
* *
* @param loadedByName The map to search * @param loadedPrograms the list of {@link Loaded} {@link Program}s
* @param libraryName The library name to lookup * @param libraryName The library name to lookup. Depending on the type of library, this could
* be a simple filename or an absolute path.
* @return The found {@link Loaded} {@link Program} or null if not found * @return The found {@link Loaded} {@link Program} or null if not found
*/ */
private Loaded<Program> findLibrary(Map<String, Loaded<Program>> loadedByName, private Loaded<Program> findLibrary(List<Loaded<Program>> loadedPrograms, String libraryName) {
String libraryName) {
Comparator<String> comparator = getLibraryNameComparator(); Comparator<String> comparator = getLibraryNameComparator();
boolean noExtension = FilenameUtils.getExtension(libraryName).equals(""); boolean noExtension = FilenameUtils.getExtension(libraryName).equals("");
for (String key : loadedByName.keySet()) { boolean absolute = libraryName.startsWith("/");
String candidateName = key; for (Loaded<Program> loadedProgram : loadedPrograms) {
String candidateName = loadedProgram.getName();
if (isOptionalLibraryFilenameExtensions() && noExtension) { if (isOptionalLibraryFilenameExtensions() && noExtension) {
candidateName = FilenameUtils.getBaseName(candidateName); candidateName = FilenameUtils.getBaseName(candidateName);
} }
if (comparator.compare(candidateName, libraryName) == 0) { if (absolute) {
return loadedByName.get(key); String loadedProgramPath = loadedProgram.getProjectFolderPath() + candidateName;
if (loadedProgramPath.endsWith(libraryName)) {
return loadedProgram;
}
}
else if (comparator.compare(candidateName, libraryName) == 0) {
return loadedProgram;
} }
} }
return null; return null;