Scope the dependency map

This commit is contained in:
LeoDog896 2021-03-23 20:04:25 -04:00
parent 1de1fb062d
commit b5728e2255

View File

@ -313,37 +313,49 @@ public class ExtensionManager {
@NotNull @NotNull
private List<DiscoveredExtension> generateLoadOrder(@NotNull List<DiscoveredExtension> discoveredExtensions) { private List<DiscoveredExtension> generateLoadOrder(@NotNull List<DiscoveredExtension> discoveredExtensions) {
// Do some mapping so we can map strings to extensions. // Do some mapping so we can map strings to extensions.
Map<String, DiscoveredExtension> extensionMap = new HashMap<>();
Map<DiscoveredExtension, List<DiscoveredExtension>> dependencyMap = new HashMap<>(); Map<DiscoveredExtension, List<DiscoveredExtension>> dependencyMap = new HashMap<>();
// Put dependencies in dependency map
{
Map<String, DiscoveredExtension> extensionMap = new HashMap<>();
for (DiscoveredExtension discoveredExtension : discoveredExtensions) { for (DiscoveredExtension discoveredExtension : discoveredExtensions) {
extensionMap.put(discoveredExtension.getName().toLowerCase(), discoveredExtension); extensionMap.put(discoveredExtension.getName().toLowerCase(), discoveredExtension);
} }
allExtensions: // label the loop allExtensions:
// label the loop
for (DiscoveredExtension discoveredExtension : discoveredExtensions) { for (DiscoveredExtension discoveredExtension : discoveredExtensions) {
List<DiscoveredExtension> dependencies = new ArrayList<>(discoveredExtension.getDependencies().length); List<DiscoveredExtension> dependencies = new ArrayList<>(discoveredExtension.getDependencies().length);
// Map the dependencies into DiscoveredExtensions. // Map the dependencies into DiscoveredExtensions.
for (String dependencyName : discoveredExtension.getDependencies()) { for (String dependencyName : discoveredExtension.getDependencies()) {
DiscoveredExtension dependencyExtension = extensionMap.get(dependencyName.toLowerCase()); DiscoveredExtension dependencyExtension = extensionMap.get(dependencyName.toLowerCase());
// Specifies an extension we don't have. // Specifies an extension we don't have.
if (dependencyExtension == null) { if (dependencyExtension == null) {
// attempt to see if it is not already loaded (happens with dynamic (re)loading) // attempt to see if it is not already loaded (happens with dynamic (re)loading)
if (extensions.containsKey(dependencyName.toLowerCase())) { if (extensions.containsKey(dependencyName.toLowerCase())) {
dependencies.add(extensions.get(dependencyName.toLowerCase()).getOrigin()); dependencies.add(extensions.get(dependencyName.toLowerCase()).getOrigin());
continue; // Go to the next loop in this dependency loop, this iteration is done. continue; // Go to the next loop in this dependency loop, this iteration is done.
} else { } else {
// dependency isn't loaded, move on.
LOGGER.error("Extension {} requires an extension called {}.", discoveredExtension.getName(), dependencyName); LOGGER.error("Extension {} requires an extension called {}.", discoveredExtension.getName(), dependencyName);
LOGGER.error("However the extension {} could not be found.", dependencyName); LOGGER.error("However the extension {} could not be found.", dependencyName);
LOGGER.error("Therefore {} will not be loaded.", discoveredExtension.getName()); LOGGER.error("Therefore {} will not be loaded.", discoveredExtension.getName());
discoveredExtension.loadStatus = DiscoveredExtension.LoadStatus.MISSING_DEPENDENCIES; discoveredExtension.loadStatus = DiscoveredExtension.LoadStatus.MISSING_DEPENDENCIES;
continue allExtensions; // the above labeled loop will go to the next extension as this dependency is invalid. continue allExtensions; // the above labeled loop will go to the next extension as this dependency is invalid.
} }
} }
// This will add null for an unknown-extension // This will add null for an unknown-extension
dependencies.add(dependencyExtension); dependencies.add(dependencyExtension);
} }
dependencyMap.put( dependencyMap.put(
@ -352,12 +364,14 @@ public class ExtensionManager {
); );
} }
}
// List containing the real load order. // List containing the real load order.
LinkedList<DiscoveredExtension> sortedList = new LinkedList<>(); LinkedList<DiscoveredExtension> sortedList = new LinkedList<>();
// entries with empty lists // entries with empty lists
List<Map.Entry<DiscoveredExtension, List<DiscoveredExtension>>> loadableExtensions; List<Map.Entry<DiscoveredExtension, List<DiscoveredExtension>>> loadableExtensions;
// While there are entries with no more elements (no more dependencies) // While there are entries with no more elements (no more dependencies)
while (!( while (!(
loadableExtensions = dependencyMap.entrySet().stream().filter(entry -> areAllDependenciesLoaded(entry.getValue())).collect(Collectors.toList()) loadableExtensions = dependencyMap.entrySet().stream().filter(entry -> areAllDependenciesLoaded(entry.getValue())).collect(Collectors.toList())