FileOpenRequestHandler.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*******************************************************************************
  2. * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt).
  3. * All rights reserved.
  4. *
  5. * This class is licensed under the LGPL 3.0 (https://www.gnu.org/licenses/lgpl-3.0.de.html).
  6. *******************************************************************************/
  7. package org.cryptomator.launcher;
  8. import org.jetbrains.annotations.VisibleForTesting;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import javax.inject.Inject;
  12. import javax.inject.Named;
  13. import javax.inject.Singleton;
  14. import java.awt.Desktop;
  15. import java.awt.desktop.OpenFilesEvent;
  16. import java.io.File;
  17. import java.nio.file.FileSystem;
  18. import java.nio.file.FileSystems;
  19. import java.nio.file.InvalidPathException;
  20. import java.nio.file.Path;
  21. import java.util.Collection;
  22. import java.util.List;
  23. import java.util.Objects;
  24. import java.util.concurrent.BlockingQueue;
  25. @Singleton
  26. class FileOpenRequestHandler {
  27. private static final Logger LOG = LoggerFactory.getLogger(FileOpenRequestHandler.class);
  28. private final BlockingQueue<AppLaunchEvent> launchEventQueue;
  29. @Inject
  30. public FileOpenRequestHandler(@Named("launchEventQueue") BlockingQueue<AppLaunchEvent> launchEventQueue) {
  31. this.launchEventQueue = launchEventQueue;
  32. if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.APP_OPEN_FILE)) {
  33. Desktop.getDesktop().setOpenFileHandler(this::openFiles);
  34. }
  35. }
  36. private void openFiles(OpenFilesEvent evt) {
  37. Collection<Path> pathsToOpen = evt.getFiles().stream().map(File::toPath).toList();
  38. AppLaunchEvent launchEvent = new AppLaunchEvent(AppLaunchEvent.EventType.OPEN_FILE, pathsToOpen);
  39. tryToEnqueueFileOpenRequest(launchEvent);
  40. }
  41. public void handleLaunchArgs(List<String> args) {
  42. handleLaunchArgs(FileSystems.getDefault(), args);
  43. }
  44. @VisibleForTesting
  45. void handleLaunchArgs(FileSystem fs, List<String> args) {
  46. Collection<Path> pathsToOpen = args.stream().map(str -> {
  47. try {
  48. return fs.getPath(str);
  49. } catch (InvalidPathException e) {
  50. LOG.trace("Argument not a valid path: {}", str);
  51. return null;
  52. }
  53. }).filter(Objects::nonNull).toList();
  54. if (!pathsToOpen.isEmpty()) {
  55. AppLaunchEvent launchEvent = new AppLaunchEvent(AppLaunchEvent.EventType.OPEN_FILE, pathsToOpen);
  56. tryToEnqueueFileOpenRequest(launchEvent);
  57. }
  58. }
  59. private void tryToEnqueueFileOpenRequest(AppLaunchEvent launchEvent) {
  60. if (!launchEventQueue.offer(launchEvent)) {
  61. LOG.warn("Could not enqueue application launch event.", launchEvent);
  62. }
  63. }
  64. }