From c7ee2509e9151f8bde14c8313b7dfbf4be47559e Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Mon, 26 Feb 2024 12:34:35 +0100 Subject: [PATCH 01/13] no duplicates in pluginsMap, if plugin id already exists then overwrite else add to plugins map --- .../tools/ide/tool/PluginBasedCommandlet.java | 28 ++++++++++------- .../ide/tool/PluginBasedCommandletTest.java | 31 ++++++++++--------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index 2d92a6cec..f2dfb45b0 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -4,12 +4,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Stream; import com.devonfw.tools.ide.cli.CliException; @@ -68,8 +63,20 @@ private void loadPluginsFromDirectory(Map map, Path pl if (filename.endsWith(IdeContext.EXT_PROPERTIES) && Files.exists(child)) { PluginDescriptor descriptor = PluginDescriptorImpl.of(child, this.context, isPluginUrlNeeded()); - // Priority to user-specific plugins - map.put(descriptor.getName(), descriptor); + // Check if plugin with same id exists + boolean pluginExists = map.values().stream() + .anyMatch(existingDescriptor -> existingDescriptor.getId().equals(descriptor.getId())); + + if (pluginExists) { + // Plugin with same id already exists, overwrite it + map.entrySet().stream() + .filter(entry -> entry.getValue().getId().equals(descriptor.getId())) + .findFirst() + .ifPresent(entry -> entry.setValue(descriptor)); + } else { + // Plugin does not exist, add it normally to the map + map.put(descriptor.getName(), descriptor); + } } } } catch (IOException e) { @@ -96,7 +103,6 @@ private Path getUserHomePluginsConfigPath() { return context.getUserHome().resolve(Paths.get(".ide", "settings", this.tool, IdeContext.FOLDER_PLUGINS)); } - /** * @return the immutable {@link Collection} of {@link PluginDescriptor}s configured for this IDE tool. */ @@ -144,7 +150,7 @@ public void uninstallPlugin(PluginDescriptor plugin) { /** * @param key the filename of the properties file configuring the requested plugin (typically excluding the - * ".properties" extension). + * ".properties" extension). * @return the {@link PluginDescriptor} for the given {@code key}. */ public PluginDescriptor getPlugin(String key) { @@ -189,7 +195,7 @@ protected boolean doInstall(boolean silent) { /** * @param plugin the in{@link PluginDescriptor#isActive() active} {@link PluginDescriptor} that is skipped for regular - * plugin installation. + * plugin installation. */ protected void handleInstall4InactivePlugin(PluginDescriptor plugin) { diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java index f72ee5a35..da21e6b42 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java @@ -1,26 +1,21 @@ package com.devonfw.tools.ide.tool; -import static org.junit.jupiter.api.Assertions.*; - -import java.util.Map; -import java.util.Set; - -import org.junit.jupiter.api.Test; - -import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.context.AbstractIdeContextTest; import com.devonfw.tools.ide.context.IdeTestContext; import com.devonfw.tools.ide.tool.ide.PluginDescriptor; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; public class PluginBasedCommandletTest extends AbstractIdeContextTest { - @Test - void testGetPluginsMap() { - IdeTestContext context = newContext(PROJECT_BASIC, "", true); - String tool = "eclipse"; - Set tags = null; - ExamplePluginBasedCommandlet pluginBasedCommandlet = new ExamplePluginBasedCommandlet(context, tool, tags); + public IdeTestContext context = newContext(PROJECT_BASIC, "", true); + public ExamplePluginBasedCommandlet pluginBasedCommandlet = new ExamplePluginBasedCommandlet(context, "eclipse", null); + @Test + void testGetPluginsMap() { Map pluginsMap = pluginBasedCommandlet.getPluginsMap(); assertNotNull(pluginsMap); @@ -36,6 +31,12 @@ void testGetPluginsMap() { assertEquals("anyedit", plugin2.getName()); // Check if anyedit plugin has value "false" --> value from user directory - assertEquals(false, plugin2.isActive()); + assertFalse(plugin2.isActive()); + + assertFalse(pluginsMap.containsKey("anyedit2")); + + assertEquals(2, pluginsMap.size()); } + + } From cb6efc75a7409e4d7bb1d0dfc8b21535bc2049ac Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Mon, 4 Mar 2024 16:27:31 +0100 Subject: [PATCH 02/13] changed asserts to assertThat --- .../devonfw/tools/ide/tool/PluginBasedCommandletTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java index 16ffbc49d..f5b0257c3 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java @@ -34,11 +34,11 @@ void testGetPluginsMap() { assertThat(plugin2.getName()).isEqualTo("anyedit"); // Check if anyedit plugin has value "false" --> value from user directory - assertFalse(plugin2.isActive()); + assertThat(plugin2.isActive()).isFalse(); - assertFalse(pluginsMap.containsKey("anyedit2")); + assertThat(pluginsMap.containsKey("anyedit2")).isFalse(); - assertEquals(2, pluginsMap.size()); + assertThat(pluginsMap.size()).isEqualTo(2); } From cd0f477845265a12e7b995a6dc5ba8495fc6d5c1 Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:07:34 +0100 Subject: [PATCH 03/13] removes paths import --- .../java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index ad2e8a7bc..3f918b81e 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -3,7 +3,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; import java.util.HashMap; From 016e23741340ba781ef9a60a4df2ea1d3f384299 Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:55:58 +0100 Subject: [PATCH 04/13] modified ide test context such that copy mutation is false --- .../com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java index f5b0257c3..b56e7a478 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java @@ -14,7 +14,7 @@ */ public class PluginBasedCommandletTest extends AbstractIdeContextTest { - public IdeTestContext context = newContext(PROJECT_BASIC, "", true); + public IdeTestContext context = newContext(PROJECT_BASIC, "", false); public ExamplePluginBasedCommandlet pluginBasedCommandlet = new ExamplePluginBasedCommandlet(context, "eclipse", null); @Test From 5f4e9b2d3e96ec7e53ed931162e17d9cbe771278 Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Fri, 15 Mar 2024 11:27:16 +0100 Subject: [PATCH 05/13] changed testcontext declaration --- .../com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java index 3115c65c7..3ba5dd7e5 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java @@ -14,7 +14,7 @@ */ public class PluginBasedCommandletTest extends AbstractIdeContextTest { - public IdeTestContext context = newContext(PROJECT_BASIC, "", false); + public IdeTestContext context = newContext(PROJECT_BASIC); public ExamplePluginBasedCommandlet pluginBasedCommandlet = new ExamplePluginBasedCommandlet(context, "eclipse", null); @Test From f4282c2722e15137f0bc200f93997448d2843e54 Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:01:20 +0100 Subject: [PATCH 06/13] changed graalvm version to 21.0.2 --- .github/workflows/nightly-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index abf709c48..5324c269c 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -33,7 +33,7 @@ jobs: - uses: graalvm/setup-graalvm@v1 with: - java-version: '17.0.7' + java-version: '21.0.2' distribution: 'graalvm' github-token: ${{ secrets.GITHUB_TOKEN }} native-image-job-reports: 'true' From 13c59b8887707a8d2107db893a8726cc2e1a9ce4 Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:37:18 +0200 Subject: [PATCH 07/13] modified getPluginsMap, getPlugin, doInstall added PluginMaps wrapper class modified testGetPluginsMap and added testGetPlugin --- .../tools/ide/tool/PluginBasedCommandlet.java | 88 +++++++++++++------ .../devonfw/tools/ide/tool/PluginMaps.java | 42 +++++++++ .../ide/tool/PluginBasedCommandletTest.java | 53 ++++++++--- 3 files changed, 146 insertions(+), 37 deletions(-) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index 41b7b5df7..a87b948f3 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -13,7 +13,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Set; @@ -23,7 +22,8 @@ */ public abstract class PluginBasedCommandlet extends LocalToolCommandlet { - private Map pluginsMap; + private Map pluginsMapById; + private Map pluginsMapByName; private Collection configuredPlugins; @@ -40,37 +40,52 @@ public PluginBasedCommandlet(IdeContext context, String tool, Set tags) { super(context, tool, tags); } - protected Map getPluginsMap() { + protected PluginMaps getPluginsMap() { - if (this.pluginsMap == null) { - Map map = new HashMap<>(); + if (this.pluginsMapById == null && this.pluginsMapByName == null) { + Map mapById = new HashMap<>(); + Map mapByName = new HashMap<>(); // Load project-specific plugins Path pluginsPath = getPluginsConfigPath(); - loadPluginsFromDirectory(map, pluginsPath); + loadPluginsFromDirectory(mapById, mapByName, pluginsPath); // Load user-specific plugins, this is done after loading the project-specific plugins so the user can potentially // override plugins (e.g. change active flag). Path userPluginsPath = getUserHomePluginsConfigPath(); - loadPluginsFromDirectory(map, userPluginsPath); + loadPluginsFromDirectory(mapById, mapByName, userPluginsPath); - this.pluginsMap = map; + this.pluginsMapById = mapById; + this.pluginsMapByName = mapByName; } - return this.pluginsMap; + return new PluginMaps(this.pluginsMapById, this.pluginsMapByName); } - private void loadPluginsFromDirectory(Map map, Path pluginsPath) { - - List children = this.context.getFileAccess() - .listChildren(pluginsPath, p -> p.getFileName().toString().endsWith(IdeContext.EXT_PROPERTIES)); - for (Path child : children) { - PluginDescriptor descriptor = PluginDescriptorImpl.of(child, this.context, isPluginUrlNeeded()); - PluginDescriptor duplicate = map.put(descriptor.getName(), descriptor); - if (duplicate != null) { - this.context.info("Plugin {} from project is overridden by {}", descriptor.getName(), child); - } - } + /** + * Loads plugin descriptors from a directory into two maps: one keyed by plugin ID and the other keyed by plugin name. + * + * @param mapById A map with plugin IDs as keys and corresponding plugin descriptors as values. + * @param mapByName A map with plugin names as keys and corresponding plugin descriptors as values. + * @param pluginsPath The path to the directory containing plugin configuration files. + */ + private void loadPluginsFromDirectory(Map mapById, Map mapByName, Path pluginsPath) { + + this.context.getFileAccess() + .listChildren(pluginsPath, p -> p.getFileName().toString().endsWith(IdeContext.EXT_PROPERTIES)) + .forEach(child -> { + PluginDescriptor descriptor = PluginDescriptorImpl.of(child, this.context, isPluginUrlNeeded()); + if (!descriptor.getId().isEmpty()) { + PluginDescriptor duplicateById = mapById.put(descriptor.getId(), descriptor); + if (duplicateById != null) + this.context.info("Plugin {} from project is overridden by {}", descriptor.getId(), child); + } + if (!descriptor.getName().isEmpty()) { + PluginDescriptor duplicateByName = mapByName.put(descriptor.getName(), descriptor); + if (duplicateByName != null) + this.context.info("Plugin {} from project is overridden by {}", descriptor.getName(), child); + } + }); } /** @@ -100,7 +115,7 @@ private Path getUserHomePluginsConfigPath() { public Collection getConfiguredPlugins() { if (this.configuredPlugins == null) { - this.configuredPlugins = Collections.unmodifiableCollection(getPluginsMap().values()); + this.configuredPlugins = Collections.unmodifiableCollection(getPluginsMap().getById().values()); } return this.configuredPlugins; } @@ -140,8 +155,10 @@ public void uninstallPlugin(PluginDescriptor plugin) { } /** - * @param key the filename of the properties file configuring the requested plugin (typically excluding the - * ".properties" extension). + * Retrieves the plugin descriptor for the specified key, which can be either the ID or filename of the plugin properties file. + * + * @param key The key representing the plugin, which can be either the ID or filename + * (excluding the ".properties" extension) of the plugin configuration file. * @return the {@link PluginDescriptor} for the given {@code key}. */ public PluginDescriptor getPlugin(String key) { @@ -152,7 +169,13 @@ public PluginDescriptor getPlugin(String key) { if (key.endsWith(IdeContext.EXT_PROPERTIES)) { key = key.substring(0, key.length() - IdeContext.EXT_PROPERTIES.length()); } - PluginDescriptor pluginDescriptor = getPluginsMap().get(key); + + PluginDescriptor pluginDescriptor = getPluginsMap().getById().get(key); + + if (pluginDescriptor == null) { + pluginDescriptor = getPluginsMap().getByName().get(key); + } + if (pluginDescriptor == null) { throw new CliException( "Could not find plugin " + key + " at " + getPluginsConfigPath().resolve(key) + ".properties"); @@ -160,6 +183,9 @@ public PluginDescriptor getPlugin(String key) { return pluginDescriptor; } + /** + * Iterates over plugins from both maps by name and ID, installing missing plugins and handling inactive ones. + */ @Override protected boolean doInstall(boolean silent) { @@ -173,7 +199,19 @@ protected boolean doInstall(boolean silent) { installPlugins = true; } if (installPlugins) { - for (PluginDescriptor plugin : getPluginsMap().values()) { + Map mapById = getPluginsMap().getById(); + Map mapByName = getPluginsMap().getByName(); + + for (PluginDescriptor plugin : mapByName.values()) { + if (!mapById.containsKey(plugin.getId())) { + if (plugin.isActive()) { + installPlugin(plugin); + } else { + handleInstall4InactivePlugin(plugin); + } + } + } + for (PluginDescriptor plugin : mapById.values()) { if (plugin.isActive()) { installPlugin(plugin); } else { diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java new file mode 100644 index 000000000..c1444531c --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java @@ -0,0 +1,42 @@ +package com.devonfw.tools.ide.tool; + +import com.devonfw.tools.ide.tool.ide.PluginDescriptor; + +import java.util.Map; + +/** + * A wrapper class for holding two maps of plugin descriptors: one keyed by plugin ID and the other keyed by plugin name. + */ +public class PluginMaps { + private final Map mapById; + private final Map mapByName; + + /** + * Constructs a new PluginMaps object with the specified maps. + * + * @param mapById A map with plugin IDs as keys and corresponding plugin descriptors as values. + * @param mapByName A map with plugin names as keys and corresponding plugin descriptors as values. + */ + public PluginMaps(Map mapById, Map mapByName) { + this.mapById = mapById; + this.mapByName = mapByName; + } + + /** + * Returns the map of plugin descriptors keyed by plugin ID. + * + * @return The map of plugin descriptors keyed by plugin ID. + */ + public Map getById() { + return mapById; + } + + /** + * Returns the map of plugin descriptors keyed by plugin name. + * + * @return The map of plugin descriptors keyed by plugin name. + */ + public Map getByName() { + return mapByName; + } +} diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java index 3ba5dd7e5..7114cd4d2 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java @@ -1,5 +1,6 @@ package com.devonfw.tools.ide.tool; +import com.devonfw.tools.ide.cli.CliException; import com.devonfw.tools.ide.context.AbstractIdeContextTest; import com.devonfw.tools.ide.context.IdeTestContext; import com.devonfw.tools.ide.tool.ide.PluginDescriptor; @@ -14,30 +15,58 @@ */ public class PluginBasedCommandletTest extends AbstractIdeContextTest { - public IdeTestContext context = newContext(PROJECT_BASIC); - public ExamplePluginBasedCommandlet pluginBasedCommandlet = new ExamplePluginBasedCommandlet(context, "eclipse", null); + public IdeTestContext context = newContext(PROJECT_BASIC); - @Test - void testGetPluginsMap() { - Map pluginsMap = pluginBasedCommandlet.getPluginsMap(); - assertThat(pluginsMap).isNotNull(); + public ExamplePluginBasedCommandlet pluginBasedCommandlet = new ExamplePluginBasedCommandlet(context, "eclipse", + null); - assertThat(pluginsMap.containsKey("checkstyle")).isTrue(); - assertThat(pluginsMap.containsKey("anyedit")).isTrue(); + Map pluginsMapById = pluginBasedCommandlet.getPluginsMap().getById(); + Map pluginsMapByName = pluginBasedCommandlet.getPluginsMap().getByName(); - PluginDescriptor plugin1 = pluginsMap.get("checkstyle"); + @Test + void testGetPluginsMap() { + assertThat(pluginsMapById).isNotNull(); + assertThat(pluginsMapByName).isNotNull(); + + assertThat(pluginsMapById.containsKey("net.sf.eclipsecs.feature.group")).isTrue(); + assertThat(pluginsMapById.containsKey("AnyEditTools.feature.group")).isTrue(); + assertThat(pluginsMapByName.containsKey("anyedit")).isTrue(); + assertThat(pluginsMapByName.containsKey("checkstyle")).isTrue(); + + PluginDescriptor plugin1 = pluginsMapById.get("net.sf.eclipsecs.feature.group"); assertNotNull(plugin1); assertThat(plugin1.getName()).isEqualTo("checkstyle"); - PluginDescriptor plugin2 = pluginsMap.get("anyedit"); + PluginDescriptor plugin2 = pluginsMapById.get("AnyEditTools.feature.group"); assertNotNull(plugin2); assertThat(plugin2.getName()).isEqualTo("anyedit"); // Check if anyedit plugin has value "false" --> value from user directory assertThat(plugin2.isActive()).isFalse(); - assertThat(pluginsMap.containsKey("anyedit2")).isFalse(); + assertThat(pluginsMapById.containsKey("anyedit2")).isFalse(); + + assertThat(pluginsMapById.size()).isEqualTo(2); + assertThat(pluginsMapByName.size()).isEqualTo(2); + } + + @Test + void testGetPlugin() { + // Testing with existing plugin ID + PluginDescriptor pluginDescriptorById = pluginBasedCommandlet.getPlugin("net.sf.eclipsecs.feature.group"); + assertThat(pluginDescriptorById).isNotNull(); + assertThat(pluginDescriptorById.getName()).isEqualTo("checkstyle"); + assertThat(pluginDescriptorById.isActive()).isTrue(); + + // Testing with existing plugin name + PluginDescriptor pluginDescriptorByName = pluginBasedCommandlet.getPlugin("AnyEditTools.feature.group"); + assertThat(pluginDescriptorByName).isNotNull(); + assertThat(pluginDescriptorByName.getName()).isEqualTo("anyedit"); + assertThat(pluginDescriptorByName.isActive()).isFalse(); - assertThat(pluginsMap.size()).isEqualTo(2); + // Testing with non-existing key + assertThatThrownBy(() -> pluginBasedCommandlet.getPlugin("non-existing-key")) + .isInstanceOf(CliException.class) + .hasMessageContaining("Could not find plugin non-existing-key"); } } \ No newline at end of file From 264c11815d3d6e9d21e70c853d2f6321006b590a Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:36:53 +0200 Subject: [PATCH 08/13] Update cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jörg Hohwiller --- .../devonfw/tools/ide/tool/PluginMaps.java | 60 +++++++++++++------ 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java index c1444531c..9f0834abb 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java @@ -11,32 +11,58 @@ public class PluginMaps { private final Map mapById; private final Map mapByName; + + private final IdeContext context; + /** - * Constructs a new PluginMaps object with the specified maps. - * - * @param mapById A map with plugin IDs as keys and corresponding plugin descriptors as values. - * @param mapByName A map with plugin names as keys and corresponding plugin descriptors as values. + * The constructor. + * @param context the {@link IdeContext}. */ - public PluginMaps(Map mapById, Map mapByName) { - this.mapById = mapById; - this.mapByName = mapByName; + public PluginMaps(IdeContext context) { + super(); + this.context = context; + this.mapById = new HashMap<>(); + this.mapByName = new HashMap<>(); } /** - * Returns the map of plugin descriptors keyed by plugin ID. - * - * @return The map of plugin descriptors keyed by plugin ID. + * @return the {@link PluginDescriptor} for the given {@link PluginDescriptor#getId() ID} or {@code null} if not found. */ - public Map getById() { - return mapById; + public PluginDescriptor getById(String id) { + return this.mapById.get(id); } /** - * Returns the map of plugin descriptors keyed by plugin name. - * - * @return The map of plugin descriptors keyed by plugin name. + * @return the {@link PluginDescriptor} for the given {@link PluginDescriptor#getName() name} or {@code null} if not found. + */ + public PluginDescriptor getByName(String name) { + return this.mapByName.get(name); + } + + public Collection getPlugins() { + + Map map = this.mapById; + if (map.isEmpty()) { + map = this.mapByName; // potentially plugins for this tool have no ID + } + return Collections.unmodifyableCollection(map.values()); + } + + /** + * Registers a {@link PluginDescriptor} to this map. */ - public Map getByName() { - return mapByName; + protected void add(PluginDescriptor descriptor) { + put(decriptor.getName(), descriptor, this.mapByName); + String id = descriptor.getId(); + if ((id != null) && !id.isEmpty()) { + put(id, descriptor, this.mapById); + } + } + + private void put(String key, PluginDescriptor descriptor, Map map) { + PluginDescriptor duplicate = map.put(key, descriptor); + if (duplicate != null) { + this.context.info("Plugin with key {} was {} but got overridden by {}", key, duplicate, descriptor); + } } } From 48dfda3fc1d541865b1838d54ed1e6a0f47035fe Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:37:12 +0200 Subject: [PATCH 09/13] Update cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jörg Hohwiller --- .../java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index a87b948f3..1d335606f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -170,7 +170,7 @@ public PluginDescriptor getPlugin(String key) { key = key.substring(0, key.length() - IdeContext.EXT_PROPERTIES.length()); } - PluginDescriptor pluginDescriptor = getPluginsMap().getById().get(key); + PluginDescriptor pluginDescriptor = getPluginsMap().getById(key); if (pluginDescriptor == null) { pluginDescriptor = getPluginsMap().getByName().get(key); From eba359bfec88a96f578b371b05bf9792b99f762f Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:37:27 +0200 Subject: [PATCH 10/13] Update cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jörg Hohwiller --- .../com/devonfw/tools/ide/tool/PluginBasedCommandlet.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index 1d335606f..cc680bc96 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -199,11 +199,7 @@ protected boolean doInstall(boolean silent) { installPlugins = true; } if (installPlugins) { - Map mapById = getPluginsMap().getById(); - Map mapByName = getPluginsMap().getByName(); - - for (PluginDescriptor plugin : mapByName.values()) { - if (!mapById.containsKey(plugin.getId())) { + for (PluginDescriptor plugin : getPluginsMap().getPlugins()) { if (plugin.isActive()) { installPlugin(plugin); } else { @@ -211,7 +207,6 @@ protected boolean doInstall(boolean silent) { } } } - for (PluginDescriptor plugin : mapById.values()) { if (plugin.isActive()) { installPlugin(plugin); } else { From 87121208cb7429e9c752bdb5f53b26a803b8704c Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Tue, 14 May 2024 11:04:15 +0200 Subject: [PATCH 11/13] added some imports and made some adjustments on recent changes --- .../com/devonfw/tools/ide/tool/PluginBasedCommandlet.java | 7 ++++--- .../main/java/com/devonfw/tools/ide/tool/PluginMaps.java | 8 ++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index 8289f02dc..d3375e177 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -8,12 +8,13 @@ import com.devonfw.tools.ide.tool.ide.PluginDescriptor; import com.devonfw.tools.ide.tool.ide.PluginDescriptorImpl; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; import java.util.Map; +import java.util.HashMap; import java.util.Set; /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java index 9f0834abb..5b369284c 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java @@ -1,7 +1,11 @@ package com.devonfw.tools.ide.tool; +import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.tool.ide.PluginDescriptor; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; /** @@ -45,14 +49,14 @@ public Collection getPlugins() { if (map.isEmpty()) { map = this.mapByName; // potentially plugins for this tool have no ID } - return Collections.unmodifyableCollection(map.values()); + return Collections.unmodifiableCollection(map.values()); } /** * Registers a {@link PluginDescriptor} to this map. */ protected void add(PluginDescriptor descriptor) { - put(decriptor.getName(), descriptor, this.mapByName); + put(descriptor.getName(), descriptor, this.mapByName); String id = descriptor.getId(); if ((id != null) && !id.isEmpty()) { put(id, descriptor, this.mapById); From d16b8366ac3341f21999ce4c6dc3887d7c1f13ec Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Fri, 17 May 2024 10:51:44 +0200 Subject: [PATCH 12/13] included usage of PluginMaps.java --- .../tools/ide/tool/PluginBasedCommandlet.java | 34 ++++--------------- .../devonfw/tools/ide/tool/PluginMaps.java | 7 ++-- .../ide/tool/PluginBasedCommandletTest.java | 11 +++--- 3 files changed, 17 insertions(+), 35 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index d3375e177..a8ba5f4b6 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -8,13 +8,9 @@ import com.devonfw.tools.ide.tool.ide.PluginDescriptor; import com.devonfw.tools.ide.tool.ide.PluginDescriptorImpl; -import java.util.Collection; -import java.util.Collections; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import java.util.Map; -import java.util.HashMap; import java.util.Set; /** @@ -23,9 +19,7 @@ */ public abstract class PluginBasedCommandlet extends LocalToolCommandlet { - private Map pluginsMap; - - private Collection configuredPlugins; + private PluginMaps pluginsMap; /** * The constructor. @@ -40,10 +34,10 @@ public PluginBasedCommandlet(IdeContext context, String tool, Set tags) { super(context, tool, tags); } - protected Map getPluginsMap() { + protected PluginMaps getPluginsMap() { if (this.pluginsMap == null) { - Map map = new HashMap<>(); + PluginMaps map = new PluginMaps(context); // Load project-specific plugins Path pluginsPath = getPluginsConfigPath(); @@ -60,16 +54,13 @@ protected Map getPluginsMap() { return this.pluginsMap; } - private void loadPluginsFromDirectory(Map map, Path pluginsPath) { + private void loadPluginsFromDirectory(PluginMaps map, Path pluginsPath) { List children = this.context.getFileAccess() .listChildren(pluginsPath, p -> p.getFileName().toString().endsWith(IdeContext.EXT_PROPERTIES)); for (Path child : children) { PluginDescriptor descriptor = PluginDescriptorImpl.of(child, this.context, isPluginUrlNeeded()); - PluginDescriptor duplicate = map.put(descriptor.getName(), descriptor); - if (duplicate != null) { - this.context.info("Plugin {} from project is overridden by {}", descriptor.getName(), child); - } + map.add(descriptor); } } @@ -94,17 +85,6 @@ private Path getUserHomePluginsConfigPath() { return this.context.getUserHomeIde().resolve("settings").resolve(this.tool).resolve(IdeContext.FOLDER_PLUGINS); } - /** - * @return the immutable {@link Collection} of {@link PluginDescriptor}s configured for this IDE tool. - */ - public Collection getConfiguredPlugins() { - - if (this.configuredPlugins == null) { - this.configuredPlugins = Collections.unmodifiableCollection(getPluginsMap().values()); - } - return this.configuredPlugins; - } - /** * @return the {@link Path} where the plugins of this {@link IdeToolCommandlet} shall be installed. */ @@ -153,7 +133,7 @@ public PluginDescriptor getPlugin(String key) { key = key.substring(0, key.length() - IdeContext.EXT_PROPERTIES.length()); } - PluginDescriptor pluginDescriptor = getPluginsMap().get(key); + PluginDescriptor pluginDescriptor = pluginsMap.getByName(key); if (pluginDescriptor == null) { throw new CliException( "Could not find plugin " + key + " at " + getPluginsConfigPath().resolve(key) + ".properties"); @@ -175,7 +155,7 @@ protected boolean doInstall(boolean silent) { installPlugins = true; } if (installPlugins) { - for (PluginDescriptor plugin : getPluginsMap().values()) { + for (PluginDescriptor plugin : pluginsMap.getPlugins()) { if (plugin.isActive()) { installPlugin(plugin); } else { diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java index 5b369284c..dcd728c5d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginMaps.java @@ -42,7 +42,10 @@ public PluginDescriptor getById(String id) { public PluginDescriptor getByName(String name) { return this.mapByName.get(name); } - + + /** + * @return the immutable {@link Collection} of {@link PluginDescriptor}s configured for this IDE tool. + */ public Collection getPlugins() { Map map = this.mapById; @@ -63,7 +66,7 @@ protected void add(PluginDescriptor descriptor) { } } - private void put(String key, PluginDescriptor descriptor, Map map) { + public void put(String key, PluginDescriptor descriptor, Map map) { PluginDescriptor duplicate = map.put(key, descriptor); if (duplicate != null) { this.context.info("Plugin with key {} was {} but got overridden by {}", key, duplicate, descriptor); diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java index 1cb6bc15c..a41bdab28 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/PluginBasedCommandletTest.java @@ -6,7 +6,6 @@ import com.devonfw.tools.ide.tool.ide.PluginDescriptor; import org.junit.jupiter.api.Test; -import java.util.Map; import java.util.Set; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -24,17 +23,17 @@ void testGetPluginsMap() { Set tags = null; ExamplePluginBasedCommandlet pluginBasedCommandlet = new ExamplePluginBasedCommandlet(context, tool, tags); - Map pluginsMap = pluginBasedCommandlet.getPluginsMap(); + PluginMaps pluginsMap = pluginBasedCommandlet.getPluginsMap(); assertThat(pluginsMap).isNotNull(); - assertThat(pluginsMap.containsKey("checkstyle")).isTrue(); - assertThat(pluginsMap.containsKey("anyedit")).isTrue(); + assertThat(pluginsMap.getByName("checkstyle")).isNotNull(); + assertThat(pluginsMap.getByName("anyedit")).isNotNull(); - PluginDescriptor plugin1 = pluginsMap.get("checkstyle"); + PluginDescriptor plugin1 = pluginsMap.getByName("checkstyle"); assertNotNull(plugin1); assertThat(plugin1.getName()).isEqualTo("checkstyle"); - PluginDescriptor plugin2 = pluginsMap.get("anyedit"); + PluginDescriptor plugin2 = pluginsMap.getByName("anyedit"); assertNotNull(plugin2); assertThat(plugin2.getName()).isEqualTo("anyedit"); From 481c08dbb2384e168b712fb83c44b712e212c24e Mon Sep 17 00:00:00 2001 From: diiinesh <63147290+diiinesh@users.noreply.github.com> Date: Tue, 21 May 2024 08:51:43 +0200 Subject: [PATCH 13/13] initialized pluginMaps to avoid nullpointererror --- .../com/devonfw/tools/ide/tool/PluginBasedCommandlet.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java index a8ba5f4b6..6f59024dc 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/PluginBasedCommandlet.java @@ -132,8 +132,9 @@ public PluginDescriptor getPlugin(String key) { if (key.endsWith(IdeContext.EXT_PROPERTIES)) { key = key.substring(0, key.length() - IdeContext.EXT_PROPERTIES.length()); } - - PluginDescriptor pluginDescriptor = pluginsMap.getByName(key); + + PluginMaps pluginMaps = getPluginsMap(); + PluginDescriptor pluginDescriptor = pluginMaps.getByName(key); if (pluginDescriptor == null) { throw new CliException( "Could not find plugin " + key + " at " + getPluginsConfigPath().resolve(key) + ".properties"); @@ -155,7 +156,8 @@ protected boolean doInstall(boolean silent) { installPlugins = true; } if (installPlugins) { - for (PluginDescriptor plugin : pluginsMap.getPlugins()) { + PluginMaps pluginMaps = getPluginsMap(); + for (PluginDescriptor plugin : pluginMaps.getPlugins()) { if (plugin.isActive()) { installPlugin(plugin); } else {