From d0e9529b6fd970d9808c3c6fc9bd1a135d15932b Mon Sep 17 00:00:00 2001 From: crschnick Date: Mon, 6 Apr 2026 03:52:41 +0000 Subject: [PATCH] Improve NPE handling for browser actions --- .../impl/ComputeDirectorySizesActionProvider.java | 2 +- .../app/browser/file/BrowserFileSystemTabModel.java | 10 +++++++++- .../xpipe/app/browser/menu/impl/CopyMenuProvider.java | 2 +- .../xpipe/app/browser/menu/impl/JavapMenuProvider.java | 2 +- .../menu/impl/OpenTerminalInDirectoryMenuProvider.java | 2 +- .../xpipe/app/browser/menu/impl/PasteMenuProvider.java | 4 ++++ .../menu/impl/compress/CompressMenuProvider.java | 4 ++-- .../browser/menu/impl/compress/TarActionProvider.java | 2 +- .../menu/impl/compress/UntarActionProvider.java | 2 +- .../menu/impl/compress/UnzipActionProvider.java | 4 ++-- .../browser/menu/impl/compress/ZipActionProvider.java | 2 +- 11 files changed, 24 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/ComputeDirectorySizesActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/ComputeDirectorySizesActionProvider.java index 019247b1a..fae2be394 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/ComputeDirectorySizesActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/ComputeDirectorySizesActionProvider.java @@ -20,7 +20,7 @@ public class ComputeDirectorySizesActionProvider implements BrowserActionProvide @Override public boolean isApplicable(BrowserFileSystemTabModel model, List entries) { - return model.getFileSystem().supportsDirectorySizes(); + return model.getCurrentDirectory() != null && model.getFileSystem().supportsDirectorySizes(); } @Jacksonized diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java index cfa40f980..e08b0f9ce 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java @@ -286,7 +286,7 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab entries) { - BrowserClipboard.startCopy(model.getCurrentDirectory(), entries); + BrowserClipboard.startCopy(model.getTargetDirectory(entries.getFirst()), entries); } @Override diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java index 8c690d617..71bb5ecb6 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java @@ -55,7 +55,7 @@ public class JavapMenuProvider .add("javap", "-c", "-p") .addFile(entry.getRawFileEntry().getPath()); var out = sc.command(command) - .withWorkingDirectory(model.getTargetDirectory(entries.getFirst())) + .withWorkingDirectory(model.getTargetDirectoryPath(entries.getFirst())) .readStdoutOrThrow(); FileOpener.openReadOnlyString(out); } diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenTerminalInDirectoryMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenTerminalInDirectoryMenuProvider.java index c1eb2d6fa..bf9e0e495 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenTerminalInDirectoryMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenTerminalInDirectoryMenuProvider.java @@ -30,7 +30,7 @@ public class OpenTerminalInDirectoryMenuProvider implements BrowserMenuLeafProvi ? List.of(model.getCurrentDirectory().getPath()) : Collections.singletonList((FilePath) null); for (var dir : dirs) { - var name = model.getFileSystem().supportsTerminalWorkingDirectory() && dir != null ? dir.toString() : null; + var name = model.getFileSystem().supportsTerminalWorkingDirectory() ? dir.toString() : null; model.openTerminalAsync( name, model.getFileSystem().supportsTerminalWorkingDirectory() ? dir : null, diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/PasteMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/PasteMenuProvider.java index 088b3e3f1..0e54c057c 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/PasteMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/PasteMenuProvider.java @@ -29,6 +29,10 @@ public class PasteMenuProvider implements BrowserMenuLeafProvider { var target = entries.size() == 1 && entries.getFirst().getRawFileEntry().getKind() == FileKind.DIRECTORY ? entries.getFirst().getRawFileEntry() : model.getCurrentDirectory(); + if (target == null) { + return; + } + var files = clipboard.getEntries(); if (files.size() == 0) { return; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/CompressMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/CompressMenuProvider.java index 29dd7f820..1fd5cc31d 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/CompressMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/CompressMenuProvider.java @@ -192,7 +192,7 @@ public class CompressMenuProvider implements BrowserMenuBranchProvider { protected void create(String fileName, BrowserFileSystemTabModel model, List entries) { var builder = io.xpipe.app.browser.menu.impl.compress.ZipActionProvider.Action.builder(); builder.initEntries(model, entries); - builder.target(model.getTargetDirectory(entries.getFirst()).join(fileName)); + builder.target(model.getTargetDirectoryPath(entries.getFirst()).join(fileName)); builder.directoryContentOnly(directory); builder.build().executeAsync(); } @@ -216,7 +216,7 @@ public class CompressMenuProvider implements BrowserMenuBranchProvider { protected void create(String fileName, BrowserFileSystemTabModel model, List entries) { var builder = TarActionProvider.Action.builder(); builder.initEntries(model, entries); - builder.target(model.getTargetDirectory(entries.getFirst()).join(fileName)); + builder.target(model.getTargetDirectoryPath(entries.getFirst()).join(fileName)); builder.directoryContentOnly(directory); builder.gz(gz); builder.build().executeAsync(); diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/TarActionProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/TarActionProvider.java index 92d900001..88871e3c9 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/TarActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/TarActionProvider.java @@ -33,7 +33,7 @@ public class TarActionProvider implements BrowserActionProvider { var sc = model.getFileSystem().getShell().orElseThrow(); var args = "c" + (gz ? "z" : "") + "f"; var tar = CommandBuilder.of().add("tar", args).addFile(target); - var base = model.getTargetDirectory(getEntries().getFirst()); + var base = model.getTargetDirectoryPath(getEntries().getFirst()); if (directoryContentOnly) { var dir = getEntries().getFirst().getRawFileEntry().getPath(); diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarActionProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarActionProvider.java index 0e83c3070..4664c0f82 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarActionProvider.java @@ -40,7 +40,7 @@ public class UntarActionProvider implements BrowserActionProvider { .withWorkingDirectory( toDirectory ? target - : model.getTargetDirectory(getEntries().getFirst())) + : model.getTargetDirectoryPath(getEntries().getFirst())) .execute(); } model.refreshSync(); diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipActionProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipActionProvider.java index 667ad46b3..78ce258eb 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipActionProvider.java @@ -50,7 +50,7 @@ public class UnzipActionProvider implements BrowserActionProvider { .addFile(getTarget(entry.getRawFileEntry().getPath())); } try (var cc = sc.command(command) - .withWorkingDirectory(model.getTargetDirectory(getEntries().getFirst())) + .withWorkingDirectory(model.getTargetDirectoryPath(getEntries().getFirst())) .start()) { cc.discardOrThrow(); } @@ -73,7 +73,7 @@ public class UnzipActionProvider implements BrowserActionProvider { } command.add("-Path").addFile(entry.getRawFileEntry().getPath()); sc.command(command) - .withWorkingDirectory(model.getTargetDirectory(getEntries().getFirst())) + .withWorkingDirectory(model.getTargetDirectoryPath(getEntries().getFirst())) .execute(); } } diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/ZipActionProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/ZipActionProvider.java index 88ae21c56..a3c3df4ae 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/ZipActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/ZipActionProvider.java @@ -34,7 +34,7 @@ public class ZipActionProvider implements BrowserActionProvider { try { var sc = model.getFileSystem().getShell().orElseThrow(); if (sc.getOsType() == OsType.WINDOWS) { - var base = model.getTargetDirectory(getEntries().getFirst()); + var base = model.getTargetDirectoryPath(getEntries().getFirst()); var command = CommandBuilder.of() .add("Compress-Archive", "-Force", "-DestinationPath") .addFile(target)