diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index a9a1dccb5..385778781 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -11,6 +11,7 @@ import com.devonfw.tools.ide.property.Property; import com.devonfw.tools.ide.tool.az.Azure; import com.devonfw.tools.ide.tool.eclipse.Eclipse; +import com.devonfw.tools.ide.tool.gcviewer.GcViewer; import com.devonfw.tools.ide.tool.gh.Gh; import com.devonfw.tools.ide.tool.gradle.Gradle; import com.devonfw.tools.ide.tool.helm.Helm; @@ -64,6 +65,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Java(context)); add(new Node(context)); add(new Mvn(context)); + add(new GcViewer(context)); add(new Gradle(context)); add(new Eclipse(context)); add(new Terraform(context)); diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java index 14e2150ef..971ae1f2a 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/ToolCommandlet.java @@ -271,7 +271,17 @@ protected void extract(Path file, Path targetDir) { fileAccess.delete(tmpDir); } else { this.context.trace("Extraction is disabled for '{}' hence just moving the downloaded file {}.", getName(), file); - fileAccess.move(file, targetDir); + + if (Files.isDirectory(file)) { + fileAccess.move(file, targetDir); + } else { + try { + Files.createDirectories(targetDir); + } catch (IOException e) { + throw new IllegalStateException("Failed to create folder " + targetDir); + } + fileAccess.move(file, targetDir.resolve(file.getFileName())); + } } } diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/gcviewer/GcViewer.java b/cli/src/main/java/com/devonfw/tools/ide/tool/gcviewer/GcViewer.java new file mode 100644 index 000000000..300a6f909 --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/gcviewer/GcViewer.java @@ -0,0 +1,43 @@ +package com.devonfw.tools.ide.tool.gcviewer; + +import java.util.Set; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.process.ProcessContext; +import com.devonfw.tools.ide.tool.LocalToolCommandlet; +import com.devonfw.tools.ide.tool.ToolCommandlet; + +/** + * {@link ToolCommandlet} for GcViewer. + */ +public class GcViewer extends LocalToolCommandlet { + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public GcViewer(IdeContext context) { + + super(context, "gcviewer", Set.of(Tag.JAVA)); + } + + @Override + protected boolean isExtract() { + + return false; + } + + @Override + public void run() { + + install(true); + ProcessContext pc = this.context.newProcess(); + pc.directory(getToolPath()); + pc.executable("java"); + pc.addArg("-jar"); + pc.addArg("gcviewer-" + getInstalledVersion() + ".jar"); + pc.run(); + } +} \ No newline at end of file diff --git a/cli/src/main/java/com/devonfw/tools/ide/util/FilenameUtil.java b/cli/src/main/java/com/devonfw/tools/ide/util/FilenameUtil.java index e0a2d2add..283e35deb 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/util/FilenameUtil.java +++ b/cli/src/main/java/com/devonfw/tools/ide/util/FilenameUtil.java @@ -28,6 +28,13 @@ public static String getExtension(String path) { lastSlash = 0; } int lastDot = path.lastIndexOf('.'); + + // workaround for sourceforge urls ending with /download like + // https://sourceforge.net/projects/gcviewer/files/gcviewer-1.36.jar/download + if (path.startsWith("https://") && path.contains("sourceforge") && path.endsWith("download")) { + return path.substring(lastDot + 1, lastSlash); + } + if (lastDot < lastSlash) { return null; }