From 4a2ca45652e62c5c92f58d1240fd7c218f33feb3 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 20 Dec 2018 14:14:22 +0100 Subject: [PATCH] =?UTF-8?q?load=20plugin=20descriptors=20in=20parallel,=20?= =?UTF-8?q?make=20read=20progress=20more=20smooth=20and=20precise=20?= =?UTF-8?q?=E2=80=94=20fix=20minor=20IDEs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quick fix — code will be refactored later to make it more clear to avoid such errors in the future --- .../ide/plugins/PluginManagerCore.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java index 522deb32053a..2c7772122a19 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java @@ -1053,7 +1053,10 @@ public class PluginManagerCore { public static List testLoadDescriptorsFromClassPath(@NotNull ClassLoader loader) throws ExecutionException, InterruptedException { List descriptors = ContainerUtil.newSmartList(); - loadDescriptorsFromClassPath(computePluginUrlsFromClassPath(loader), descriptors, loader, null, null); + Map urlsFromClassPath = new LinkedHashMap<>(); + URL platformPluginURL = computePlatformPluginUrl(loader, urlsFromClassPath); + computePluginUrlsFromClassPath(loader, urlsFromClassPath); + loadDescriptorsFromClassPath(urlsFromClassPath, descriptors, loader, null, null, platformPluginURL); return descriptors; } @@ -1061,14 +1064,13 @@ public class PluginManagerCore { @NotNull List result, @NotNull ClassLoader loader, @Nullable PluginLoadProgressManager pluginLoadProgressManager, - @Nullable ExecutorService executorService) + @Nullable ExecutorService executorService, + @Nullable URL platformPluginURL) throws ExecutionException, InterruptedException { if (urls.isEmpty()) { return; } - final URL platformPluginURL = computePlatformPluginUrl(loader, urls); - List> tasks; boolean isParallel = executorService != null; if (isParallel) { @@ -1105,9 +1107,7 @@ public class PluginManagerCore { } } - @NotNull - private static Map computePluginUrlsFromClassPath(@NotNull ClassLoader loader) { - Map urls = new LinkedHashMap<>(); + private static void computePluginUrlsFromClassPath(@NotNull ClassLoader loader, @NotNull Map urls) { try { Enumeration enumeration = loader.getResources(PLUGIN_XML_PATH); while (enumeration.hasMoreElements()) { @@ -1116,25 +1116,21 @@ public class PluginManagerCore { } catch (IOException e) { getLogger().info(e); - return Collections.emptyMap(); } - return urls; } @Nullable private static URL computePlatformPluginUrl(@NotNull ClassLoader loader, @NotNull Map urls) { - URL platformPluginURL = null; - String platformPrefix = System.getProperty(PlatformUtils.PLATFORM_PREFIX_KEY); if (platformPrefix != null) { String fileName = platformPrefix + "Plugin.xml"; URL resource = loader.getResource(META_INF + fileName); if (resource != null) { urls.put(resource, fileName); - platformPluginURL = resource; + return resource; } } - return platformPluginURL; + return null; } @Nullable @@ -1199,7 +1195,11 @@ public class PluginManagerCore { int maxThreads = JobSchedulerImpl.getCPUCoresCount(); boolean isParallel = maxThreads > 1 && SystemProperties.getBooleanProperty("parallel.pluginDescriptors.loading", false); ExecutorService executorService = isParallel ? AppExecutorUtil.createBoundedApplicationPoolExecutor("PluginManager Loader", maxThreads) : null; - Map urlsFromClassPath = computePluginUrlsFromClassPath(PluginManagerCore.class.getClassLoader()); + + Map urlsFromClassPath = new LinkedHashMap<>(); + URL platformPluginURL = computePlatformPluginUrl(PluginManagerCore.class.getClassLoader(), urlsFromClassPath); + computePluginUrlsFromClassPath(PluginManagerCore.class.getClassLoader(), urlsFromClassPath); + PluginLoadProgressManager pluginLoadProgressManager = progress == null ? null : new PluginLoadProgressManager(progress, urlsFromClassPath.size()); try { loadDescriptorsFromDir(new File(PathManager.getPluginsPath()), result, pluginLoadProgressManager, false, executorService); @@ -1209,7 +1209,7 @@ public class PluginManagerCore { } loadDescriptorsFromProperty(result); - loadDescriptorsFromClassPath(urlsFromClassPath, result, PluginManagerCore.class.getClassLoader(), pluginLoadProgressManager, executorService); + loadDescriptorsFromClassPath(urlsFromClassPath, result, PluginManagerCore.class.getClassLoader(), pluginLoadProgressManager, executorService, platformPluginURL); if (application != null && application.isUnitTestMode() && result.size() <= 1) { // We're running in unit test mode but the classpath doesn't contain any plugins; try to load bundled plugins anyway