From 3ceead048ec5fa6b5a655625049ed4354f56ba36 Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 29 May 2026 02:15:42 +0000 Subject: [PATCH] Rework --- app/build.gradle | 11 +- app/src/main/java/io/xpipe/app/Main.java | 10 +- .../xpipe/app/action/ActionJacksonMapper.java | 4 +- .../io/xpipe/app/action/ActionProvider.java | 7 +- .../java/io/xpipe/app/action/ActionUrls.java | 4 +- .../xpipe/app/action/SerializableAction.java | 4 +- .../io/xpipe/app/beacon/AppBeaconCache.java | 1 - .../io/xpipe/app/beacon/AppBeaconServer.java | 14 +- .../xpipe/app}/beacon/BeaconAuthMethod.java | 2 +- .../io/xpipe/app}/beacon/BeaconClient.java | 34 ++-- .../beacon/BeaconClientErrorResponse.java | 2 +- .../app}/beacon/BeaconClientException.java | 2 +- .../app}/beacon/BeaconClientInformation.java | 2 +- .../app}/beacon/BeaconConnectorException.java | 2 +- .../io/xpipe/app}/beacon/BeaconInterface.java | 23 ++- .../app/beacon/BeaconRequestHandler.java | 3 +- .../io/xpipe/app}/beacon/BeaconServer.java | 4 +- .../beacon/BeaconServerErrorResponse.java | 2 +- .../app}/beacon/BeaconServerException.java | 2 +- .../io/xpipe/app/beacon/BeaconSession.java | 2 - .../java/io/xpipe/app/beacon/BlobManager.java | 1 - .../ActionExchange.java} | 34 +++- .../AskpassExchange.java} | 53 +++++- .../CategoryAddExchange.java} | 40 ++++- .../CategoryInfoExchange.java} | 65 ++++++- .../app/beacon/api/CategoryQueryExchange.java | 51 ++++++ .../CategoryRemoveExchange.java} | 39 +++- .../ConnectionAddExchange.java} | 48 ++++- .../ConnectionInfoExchange.java} | 77 +++++++- .../beacon/api/ConnectionQueryExchange.java | 21 ++- .../ConnectionRefreshExchange.java} | 34 +++- .../ConnectionRemoveExchange.java} | 35 +++- .../DaemonFocusExchange.java} | 26 ++- .../DaemonModeExchange.java} | 41 ++++- .../DaemonOpenExchange.java} | 36 +++- .../DaemonStatusExchange.java} | 30 +++- .../DaemonStopExchange.java} | 31 +++- .../DaemonVersionExchange.java} | 43 ++++- .../xpipe/app/beacon/api/FsBlobExchange.java | 53 ++++++ .../FsReadExchange.java} | 45 ++++- .../FsScriptExchange.java} | 44 ++++- .../xpipe/app/beacon/api/FsWriteExchange.java | 55 ++++++ .../HandshakeExchange.java} | 57 ++++-- .../app/beacon/api/SecretDecryptExchange.java | 48 +++++ .../beacon/api/SecretEncryptExchange.java | 13 +- .../ShellExecExchange.java} | 46 ++++- .../ShellStartExchange.java} | 53 +++++- .../app/beacon/api/ShellStopExchange.java | 43 +++++ .../SshLaunchExchange.java} | 34 +++- .../TerminalExternalLaunchExchange.java} | 42 ++++- .../beacon/api/TerminalLaunchExchange.java | 50 ++++++ .../beacon/api/TerminalPrepareExchange.java | 54 ++++++ .../beacon/api/TerminalRegisterExchange.java | 49 +++++ .../app/beacon/api/TerminalWaitExchange.java | 45 +++++ .../impl/CategoryQueryExchangeImpl.java | 23 --- .../impl/ConnectionQueryExchangeImpl.java | 24 --- .../app/beacon/impl/FsBlobExchangeImpl.java | 26 --- .../app/beacon/impl/FsWriteExchangeImpl.java | 24 --- .../impl/SecretDecryptExchangeImpl.java | 22 --- .../impl/SecretEncryptExchangeImpl.java | 16 -- .../beacon/impl/ShellStopExchangeImpl.java | 19 -- .../impl/TerminalLaunchExchangeImpl.java | 21 --- .../impl/TerminalPrepareExchangeImpl.java | 25 --- .../impl/TerminalRegisterExchangeImpl.java | 23 --- .../beacon/impl/TerminalWaitExchangeImpl.java | 21 --- .../xpipe/app/beacon/mcp/McpSchemaFiles.java | 2 +- .../xpipe/app/beacon/mcp/McpToolHandler.java | 4 +- .../io/xpipe/app/beacon/mcp/McpTools.java | 8 +- .../BrowserFileChooserSessionComp.java | 2 +- .../BrowserFileChooserSessionModel.java | 4 +- .../app/browser/BrowserFullSessionModel.java | 4 +- .../app/browser/action/BrowserAction.java | 2 +- .../action/impl/MoveFileActionProvider.java | 2 +- .../action/impl/NewLinkActionProvider.java | 2 +- .../OpenFileNativeDetailsActionProvider.java | 2 +- .../impl/OpenFileWithActionProvider.java | 2 +- .../browser/file/BrowserBreadcrumbBar.java | 2 +- .../app/browser/file/BrowserDialogs.java | 2 +- .../browser/file/BrowserFileDuplicates.java | 2 +- .../app/browser/file/BrowserFileInput.java | 4 +- .../file/BrowserFileListCompEntry.java | 2 +- .../browser/file/BrowserFileListModel.java | 2 +- .../browser/file/BrowserFileListNameCell.java | 2 +- .../app/browser/file/BrowserFileOutput.java | 4 +- .../browser/file/BrowserFileSystemHelper.java | 4 +- .../file/BrowserFileSystemHistory.java | 2 +- .../file/BrowserFileSystemSavedState.java | 4 +- .../file/BrowserFileSystemTabComp.java | 2 +- .../file/BrowserFileSystemTabModel.java | 6 +- .../file/BrowserFileTransferOperation.java | 2 +- .../file/BrowserHistorySavedState.java | 2 +- .../file/BrowserHistorySavedStateImpl.java | 2 +- .../browser/file/BrowserLocalFileSystem.java | 2 +- .../app/browser/file/BrowserOverviewComp.java | 2 +- .../BrowseInNativeManagerMenuProvider.java | 2 +- .../menu/impl/EditFileMenuProvider.java | 2 +- .../menu/impl/GradleRunMenuProvider.java | 2 +- .../menu/impl/NewItemMenuProvider.java | 2 +- .../impl/OpenFileDefaultMenuProvider.java | 2 +- .../menu/impl/OpenFileWithMenuProvider.java | 2 +- .../OpenNativeFileDetailsMenuProvider.java | 2 +- .../OpenTerminalInDirectoryMenuProvider.java | 2 +- .../browser/menu/impl/RenameMenuProvider.java | 2 +- .../menu/impl/RunFileMenuProvider.java | 2 +- .../impl/compress/BaseUntarMenuProvider.java | 2 +- .../compress/BaseUnzipUnixMenuProvider.java | 2 +- .../BaseUnzipWindowsActionProvider.java | 2 +- .../impl/compress/CompressMenuProvider.java | 2 +- .../impl/compress/GunzipActionProvider.java | 6 +- .../impl/compress/GunzipUnixMenuProvider.java | 3 +- .../impl/compress/GzipActionProvider.java | 2 +- .../menu/impl/compress/TarActionProvider.java | 2 +- .../impl/compress/UntarActionProvider.java | 2 +- .../impl/compress/UnzipActionProvider.java | 4 +- .../menu/impl/compress/ZipActionProvider.java | 4 +- .../ContextualFileReferenceChoiceComp.java | 2 +- .../app/comp/base/LazyTextFieldComp.java | 2 +- .../xpipe/app/comp/base/ListBoxViewComp.java | 6 +- .../io/xpipe/app/comp/base/MarkdownComp.java | 2 +- .../xpipe/app/comp/base/ModalOverlayComp.java | 2 +- .../xpipe/app/comp/base/PrettyImageComp.java | 2 +- .../app/comp/base/PrettyImageHelper.java | 2 +- .../xpipe/app/comp/base/SecretFieldComp.java | 2 +- .../xpipe/app/comp/base/TestButtonComp.java | 2 +- .../java/io/xpipe/app/core/AppAotTrain.java | 2 +- .../java/io/xpipe/app/core/AppArguments.java | 10 +- .../main/java/io/xpipe/app/core/AppCache.java | 2 +- .../app/core/AppConfigurationDialog.java | 2 +- .../xpipe/app/core/AppDesktopIntegration.java | 2 +- .../io/xpipe/app/core/AppExecutableCache.java | 4 +- .../xpipe/app/core/AppExtensionManager.java | 2 +- .../java/io/xpipe/app/core/AppFontSizes.java | 2 +- .../io/xpipe/app/core/AppInstallation.java | 28 +-- .../java/io/xpipe/app/core/AppInstance.java | 62 ++----- .../java/io/xpipe/app/core/AppLocalTemp.java | 2 +- .../io/xpipe/app/core/AppOpenArguments.java | 4 +- .../java/io/xpipe/app/core/AppPreloader.java | 2 +- .../java/io/xpipe/app/core/AppProperties.java | 113 +++++++++++- .../java/io/xpipe/app/core/AppResources.java | 2 +- .../java/io/xpipe/app/core/AppRestart.java | 2 +- .../main/java/io/xpipe/app/core/AppSid.java | 2 +- .../java/io/xpipe/app/core/AppSystemInfo.java | 2 +- .../main/java/io/xpipe/app/core/AppTheme.java | 2 +- .../java/io/xpipe/app/core/AppTrayIcon.java | 2 +- .../check/AppAndroidLinuxTerminalCheck.java | 2 +- .../io/xpipe/app/core/check/AppAvCheck.java | 2 +- .../check/AppDirectoryPermissionsCheck.java | 2 +- .../AppHardwareAccelerationDisableCheck.java | 2 +- .../app/core/check/AppPathCorruptCheck.java | 2 +- .../xpipe/app/core/check/AppRosettaCheck.java | 2 +- .../xpipe/app/core/check/AppShellCheck.java | 2 +- .../app/core/check/AppSystemFontCheck.java | 2 +- .../app/core/check/AppTestCommandCheck.java | 2 +- .../app/core/check/AppWindowsArmCheck.java | 2 +- .../app/core/check/AppWindowsTempCheck.java | 2 +- .../io/xpipe/app/core/mode/AppBaseMode.java | 2 +- .../io/xpipe/app/core/mode/AppGuiMode.java | 2 +- .../xpipe/app/core/mode/AppOperationMode.java | 102 ++++++----- .../io/xpipe/app/core/mode/AppTrayMode.java | 2 +- .../xpipe/app/core/window/AppMainWindow.java | 2 +- .../app/core/window/AppModifiedStage.java | 2 +- .../app/core/window/AppWindowBounds.java | 2 +- .../xpipe/app/core/window/AppWindowStyle.java | 7 +- .../app/cred/CertificateKeyFileStrategy.java | 6 +- .../xpipe/app/cred/CustomAgentStrategy.java | 6 +- .../io/xpipe/app/cred/GpgAgentStrategy.java | 8 +- .../io/xpipe/app/cred/InPlaceKeyStrategy.java | 6 +- .../io/xpipe/app/cred/KeyFileStrategy.java | 6 +- .../io/xpipe/app/cred/NoIdentityStrategy.java | 2 +- .../xpipe/app/cred/OpenSshAgentStrategy.java | 6 +- .../cred/OtherExternalIdentityStrategy.java | 8 +- .../io/xpipe/app/cred/PageantStrategy.java | 6 +- .../cred/PasswordManagerAgentStrategy.java | 4 +- .../io/xpipe/app/cred/PublicKeyStrategy.java | 2 +- .../io/xpipe/app/cred/SecurityKeyImpl.java | 4 +- .../xpipe/app/cred/SecurityKeyStrategy.java | 5 +- .../app/cred/ShortLivedCertificateImpl.java | 2 +- .../app/cred/SshIdentityAgentStrategy.java | 2 +- .../app/cred/SshIdentityStateManager.java | 4 +- .../xpipe/app/cred/SshIdentityStrategy.java | 6 +- .../io/xpipe/app/cred/UsernameStrategy.java | 2 +- .../java/io/xpipe/app/ext/CliProvider.java | 32 ++++ .../io/xpipe/app/ext/CloudSetupProvider.java | 7 +- .../xpipe/app/ext/ConnectionFileSystem.java | 4 +- .../io/xpipe/app/ext/ContainerStoreState.java | 2 +- .../app/ext/DataStorageExtensionProvider.java | 7 +- .../io/xpipe/app/ext/DataStoreProvider.java | 2 +- .../io/xpipe/app/ext/DataStoreProviders.java | 9 +- .../main/java/io/xpipe/app/ext/FileEntry.java | 2 +- .../java/io/xpipe/app/ext/FileSystem.java | 2 +- .../java/io/xpipe/app/ext/LinkFileEntry.java | 2 +- .../java/io/xpipe/app/ext/PrefsProvider.java | 7 +- .../xpipe/app/ext/ProcessControlProvider.java | 2 +- .../java/io/xpipe/app/ext/ScanProvider.java | 7 +- .../java/io/xpipe/app/ext/ShellSession.java | 2 +- .../io/xpipe/app/ext/WrapperFileSystem.java | 4 +- .../app/hub/action/BatchStoreAction.java | 2 +- .../app/hub/action/MultiStoreAction.java | 2 +- .../io/xpipe/app/hub/action/StoreAction.java | 2 +- .../action/impl/BrowseHubLeafProvider.java | 2 +- .../action/impl/SampleHubLeafProvider.java | 2 +- .../io/xpipe/app/hub/comp/OsLogoComp.java | 4 +- .../app/hub/comp/StandardStoreEntryComp.java | 2 +- .../xpipe/app/hub/comp/StoreCategoryComp.java | 2 +- .../app/hub/comp/StoreCategoryListComp.java | 2 +- .../io/xpipe/app/hub/comp/StoreEntryComp.java | 2 +- .../hub/comp/StoreEntryListOverviewComp.java | 2 +- .../io/xpipe/app/icon/SystemIconSource.java | 2 +- .../java/io/xpipe/app/issue/ErrorAction.java | 2 +- .../io/xpipe/app/issue/ErrorEventFactory.java | 2 +- .../xpipe/app/platform/ClipboardHelper.java | 2 +- .../io/xpipe/app/platform/NativeBridge.java | 2 +- .../io/xpipe/app/platform/OptionsBuilder.java | 4 +- .../io/xpipe/app/platform/PlatformInit.java | 2 +- .../io/xpipe/app/platform/PlatformState.java | 2 +- .../java/io/xpipe/app/prefs/AppPrefs.java | 4 +- .../app/prefs/AppPrefsStorageHandler.java | 2 +- .../app/prefs/ConnectionHubCategory.java | 2 +- .../io/xpipe/app/prefs/DisplayCategory.java | 2 +- .../app/prefs/ExternalApplicationHelper.java | 2 +- .../app/prefs/ExternalApplicationType.java | 2 +- .../xpipe/app/prefs/ExternalEditorType.java | 2 +- .../xpipe/app/prefs/FileBrowserCategory.java | 2 +- .../io/xpipe/app/prefs/IconsCategory.java | 4 +- .../java/io/xpipe/app/prefs/SshCategory.java | 2 +- .../io/xpipe/app/prefs/StartupBehaviour.java | 2 +- .../java/io/xpipe/app/prefs/SyncCategory.java | 2 +- .../io/xpipe/app/prefs/TerminalCategory.java | 2 +- .../xpipe/app/prefs/TroubleshootCategory.java | 2 +- .../io/xpipe/app/prefs/WorkspaceManager.java | 2 +- .../io/xpipe/app/process/CommandBuilder.java | 8 +- .../io/xpipe/app/process/CommandControl.java | 2 +- .../io/xpipe/app/process/CommandSupport.java | 2 +- .../xpipe/app/process/ElevationFunction.java | 4 +- .../io/xpipe/app/process/OsFileSystem.java | 4 +- .../xpipe/app/process/ParentSystemAccess.java | 2 +- .../io/xpipe/app/process/ScriptHelper.java | 2 +- .../io/xpipe/app/process/ShellControl.java | 8 +- .../io/xpipe/app/process/ShellDialect.java | 4 +- .../io/xpipe/app/process/ShellDialects.java | 11 +- .../xpipe/app/process/ShellLaunchCommand.java | 2 +- .../io/xpipe/app/process/ShellStoreState.java | 2 +- .../java/io/xpipe/app/process/ShellTemp.java | 4 +- .../java/io/xpipe/app/process/ShellView.java | 6 +- .../xpipe/app/process/StubShellControl.java | 2 +- .../java/io/xpipe/app/process/SudoCache.java | 2 +- .../io/xpipe/app/process/SystemState.java | 2 +- .../app/process/TerminalInitFunction.java | 2 +- .../app/process/WorkingDirectoryFunction.java | 4 +- .../app/process/WrapperShellControl.java | 6 +- .../app/pwman/BitwardenPasswordManager.java | 4 +- .../app/pwman/DashlanePasswordManager.java | 2 +- .../app/pwman/EnpassPasswordManager.java | 4 +- .../app/pwman/KeePassXcAssociationKey.java | 2 +- .../app/pwman/KeePassXcPasswordManager.java | 2 +- .../xpipe/app/pwman/KeePassXcProxyClient.java | 4 +- .../app/pwman/KeeperPasswordManager.java | 3 +- .../app/pwman/LastpassPasswordManager.java | 2 +- .../xpipe/app/pwman/OnePasswordManager.java | 4 +- .../app/pwman/PassboltPasswordManager.java | 8 +- .../io/xpipe/app/pwman/PasswordManager.java | 6 +- .../app/pwman/PasswordManagerCommand.java | 2 +- .../pwman/PasswordManagerCommandTemplate.java | 2 +- .../app/pwman/PasswordManagerKeyStrategy.java | 6 +- .../app/pwman/PassworkPasswordManager.java | 2 +- .../app/pwman/ProtonPasswordManager.java | 4 +- .../xpipe/app/pwman/PsonoPasswordManager.java | 4 +- .../io/xpipe/app/rdp/ExternalRdpClient.java | 2 +- .../java/io/xpipe/app/rdp/FreeRdpClient.java | 2 +- .../java/io/xpipe/app/rdp/MstscRdpClient.java | 4 +- .../io/xpipe/app/rdp/RdpLaunchConfig.java | 2 +- .../io/xpipe/app/secret/EncryptedValue.java | 2 +- .../app/secret/PasswordLockSecretValue.java | 4 +- .../secret/SecretCustomCommandStrategy.java | 2 +- .../app/secret/SecretInPlaceStrategy.java | 2 +- .../io/xpipe/app/secret/SecretManager.java | 2 +- .../xpipe/app/secret/SecretQueryFilter.java | 2 +- .../xpipe/app/secret/SecretQueryProgress.java | 2 +- .../xpipe/app/secret/SecretQueryResult.java | 2 +- .../xpipe/app/secret/VaultKeySecretValue.java | 4 +- .../xpipe/app/spice/ExternalSpiceClient.java | 2 +- .../app/storage/ContextualFileReference.java | 2 +- .../io/xpipe/app/storage/DataStorage.java | 2 +- .../io/xpipe/app/storage/DataStorageNode.java | 4 +- .../xpipe/app/storage/DataStorageSecret.java | 8 +- .../xpipe/app/storage/DataStoreCategory.java | 2 +- .../io/xpipe/app/storage/DataStoreEntry.java | 2 +- .../io/xpipe/app/storage/StandardStorage.java | 2 +- .../io/xpipe/app/terminal/ClinkHelper.java | 2 +- .../terminal/ConfigFileTerminalPrompt.java | 2 +- .../app/terminal/CustomTerminalType.java | 2 +- .../app/terminal/ExternalTerminalType.java | 2 +- .../xpipe/app/terminal/KittyTerminalType.java | 2 +- .../app/terminal/OhMyPoshTerminalPrompt.java | 4 +- .../app/terminal/OhMyZshTerminalPrompt.java | 2 +- .../app/terminal/StarshipTerminalPrompt.java | 4 +- .../app/terminal/TerminalDockHubManager.java | 2 +- .../io/xpipe/app/terminal/TerminalLaunch.java | 4 +- .../app/terminal/TerminalLaunchRequest.java | 4 +- .../xpipe/app/terminal/TerminalLauncher.java | 6 +- .../app/terminal/TerminalLauncherManager.java | 6 +- .../app/terminal/TerminalMultiplexer.java | 2 +- .../terminal/TerminalMultiplexerManager.java | 2 +- .../terminal/TerminalPaneConfiguration.java | 4 +- .../io/xpipe/app/terminal/TerminalPrompt.java | 2 +- .../io/xpipe/app/terminal/TerminalView.java | 2 +- .../app/terminal/TermiusTerminalType.java | 2 +- .../xpipe/app/terminal/WezTerminalType.java | 4 +- .../app/terminal/WindowsTerminalType.java | 4 +- .../terminal/ZellijTerminalMultiplexer.java | 4 +- .../java/io/xpipe/app/test/ExtensionTest.java | 2 +- .../io/xpipe/app/test/LocalExtensionTest.java | 2 +- .../java/io/xpipe/app/test/TestModule.java | 2 +- .../xpipe/app/update/AppDistributionType.java | 2 +- .../io/xpipe/app/update/AppDownloads.java | 4 +- .../io/xpipe/app/update/AppInstaller.java | 4 +- .../java/io/xpipe/app/update/AppRelease.java | 2 +- .../app/update/UpdateAvailableDialog.java | 5 + .../app/update/UpdateChangelogDialog.java | 2 +- .../io/xpipe/app/util}/AesSecretValue.java | 2 +- .../io/xpipe/app/util/AppJacksonModule.java | 116 +++++++++++- .../java/io/xpipe/app/util/AskpassAlert.java | 1 - .../java/io/xpipe/app/util/BooleanScope.java | 2 - .../java/io/xpipe/app/util/Deobfuscator.java | 1 - .../java/io/xpipe/app/util/DesktopHelper.java | 2 - .../io/xpipe/app/util/DesktopShortcuts.java | 2 - .../xpipe/app/util}/EncryptedSecretValue.java | 2 +- .../xpipe/app/util}/FailableBiFunction.java | 2 +- .../io/xpipe/app/util}/FailableConsumer.java | 2 +- .../io/xpipe/app/util}/FailableFunction.java | 2 +- .../io/xpipe/app/util}/FailableRunnable.java | 2 +- .../io/xpipe/app/util}/FailableSupplier.java | 2 +- .../java/io/xpipe/app/util/FileBridge.java | 2 - .../java/io/xpipe/app/util/FileOpener.java | 1 - .../java/io/xpipe/app/util}/FilePath.java | 2 +- .../java/io/xpipe/app/util/FileReference.java | 1 - .../app/util/GithubReleaseDownloader.java | 1 - .../java/io/xpipe/app/util/GroupFile.java | 1 - .../xpipe/app/util/HashicorpVaultConfig.java | 2 - .../java/io/xpipe/app/util/HttpProxy.java | 1 - .../xpipe/app/util}/InPlaceSecretValue.java | 2 +- .../io/xpipe/app/util}/JacksonMapper.java | 10 +- .../java/io/xpipe/app/util}/KeyValue.java | 2 +- .../io/xpipe/app/util/LicenseProvider.java | 6 +- .../java/io/xpipe/app/util/LocalExec.java | 6 + .../io/xpipe/app/util}/ModuleLayerLoader.java | 16 +- .../java/io/xpipe/app/util/OpenBaoConfig.java | 2 - .../main/java/io/xpipe/app/util}/OsType.java | 2 +- .../java/io/xpipe/app/util/PasswdFile.java | 1 - .../java/io/xpipe/app/util/RdpConfig.java | 2 - .../java/io/xpipe/app/util/RemminaHelper.java | 1 - .../xpipe/app/util/RemoteDesktopWindow.java | 1 - .../java/io/xpipe/app/util}/SecretValue.java | 2 +- .../io/xpipe/app/util/SshLocalBridge.java | 1 - .../java/io/xpipe/app/util}/StorePath.java | 2 +- .../io/xpipe/app/util}/StreamCharset.java | 2 +- .../java/io/xpipe/app/util/ThreadHelper.java | 1 - .../java/io/xpipe/app/util}/UuidHelper.java | 2 +- .../io/xpipe/app/util/WindowsRegistry.java | 1 - .../io/xpipe/app/util}/XPipeDaemonMode.java | 2 +- .../io/xpipe/app/vnc/ExternalVncClient.java | 2 +- .../io/xpipe/app/vnc/VncLaunchConfig.java | 2 +- app/src/main/java/module-info.java | 83 ++++----- .../src/test/java}/StorePathTest.java | 4 +- beacon/README.md | 36 ---- beacon/build.gradle | 31 ---- beacon/publish.gradle | 41 ----- .../java/io/xpipe/beacon/BeaconConfig.java | 100 ----------- .../io/xpipe/beacon/BeaconJacksonModule.java | 17 -- .../io/xpipe/beacon/api/ActionExchange.java | 32 ---- .../io/xpipe/beacon/api/AskpassExchange.java | 45 ----- .../xpipe/beacon/api/CategoryAddExchange.java | 37 ---- .../beacon/api/CategoryInfoExchange.java | 60 ------- .../beacon/api/CategoryQueryExchange.java | 35 ---- .../beacon/api/CategoryRemoveExchange.java | 36 ---- .../beacon/api/ConnectionAddExchange.java | 43 ----- .../beacon/api/ConnectionInfoExchange.java | 73 -------- .../beacon/api/ConnectionRefreshExchange.java | 31 ---- .../beacon/api/ConnectionRemoveExchange.java | 32 ---- .../xpipe/beacon/api/DaemonFocusExchange.java | 25 --- .../xpipe/beacon/api/DaemonModeExchange.java | 33 ---- .../xpipe/beacon/api/DaemonOpenExchange.java | 31 ---- .../beacon/api/DaemonStatusExchange.java | 27 --- .../xpipe/beacon/api/DaemonStopExchange.java | 30 ---- .../beacon/api/DaemonVersionExchange.java | 42 ----- .../io/xpipe/beacon/api/FsBlobExchange.java | 36 ---- .../io/xpipe/beacon/api/FsReadExchange.java | 35 ---- .../io/xpipe/beacon/api/FsScriptExchange.java | 38 ---- .../io/xpipe/beacon/api/FsWriteExchange.java | 38 ---- .../xpipe/beacon/api/HandshakeExchange.java | 47 ----- .../beacon/api/SecretDecryptExchange.java | 33 ---- .../xpipe/beacon/api/ShellExecExchange.java | 42 ----- .../xpipe/beacon/api/ShellStartExchange.java | 48 ----- .../xpipe/beacon/api/ShellStopExchange.java | 31 ---- .../xpipe/beacon/api/SshLaunchExchange.java | 33 ---- .../api/TerminalExternalLaunchExchange.java | 37 ---- .../beacon/api/TerminalLaunchExchange.java | 35 ---- .../beacon/api/TerminalPrepareExchange.java | 36 ---- .../beacon/api/TerminalRegisterExchange.java | 33 ---- .../beacon/api/TerminalWaitExchange.java | 31 ---- beacon/src/main/java/module-info.java | 62 ------- .../services/io.xpipe.core.ModuleLayerLoader | 1 - build.gradle | 168 +++++++++++++----- core/README.md | 20 --- core/build.gradle | 38 ---- core/publish.gradle | 33 ---- .../java/io/xpipe/core/CoreJacksonModule.java | 123 ------------- core/src/main/java/module-info.java | 22 --- .../com.fasterxml.jackson.databind.Module | 1 - .../services/io.xpipe.core.ModuleLayerLoader | 1 - core/src/test/java/module-info.java | 8 - dist/base.gradle | 6 +- dist/build.gradle | 1 - dist/jpackage.gradle | 17 +- .../DesktopApplicationStoreProvider.java | 2 +- .../base/identity/IdentityApplyDialog.java | 4 +- .../PasswordManagerIdentityStore.java | 2 +- .../identity/SyncedIdentityStoreProvider.java | 2 +- .../base/script/ScriptCollectionSource.java | 4 +- .../ScriptCollectionSourceImportDialog.java | 2 +- .../ext/base/script/ScriptStoreProvider.java | 2 +- .../ext/base/script/ScriptStoreSetup.java | 2 +- .../ext/base/script/ScriptTextSource.java | 4 +- .../service/AbstractServiceStoreProvider.java | 2 +- .../ext/base/store/ShellStoreProvider.java | 2 +- ext/base/src/main/java/module-info.java | 1 - .../ext/system/incus/IncusCommandView.java | 2 +- ...sContainerEditRunConfigActionProvider.java | 2 +- .../ext/system/incus/IncusScanProvider.java | 2 +- .../xpipe/ext/system/lxd/LxdCommandView.java | 4 +- .../xpipe/ext/system/lxd/LxdScanProvider.java | 2 +- .../ext/system/podman/PodmanCommandView.java | 2 +- ...anContainerUnitFileEditActionProvider.java | 2 +- ext/system/src/main/java/module-info.java | 1 - get-xpipe.ps1 | 2 +- gradle/gradle_scripts/extension.gradle | 2 - .../gradle_scripts/local_junit_suite.gradle | 5 +- gradle/gradle_scripts/modules.gradle | 20 --- .../gradle_scripts/remote_junit_suite.gradle | 5 +- lang/strings/translations_en.properties | 13 ++ settings.gradle | 3 - 441 files changed, 2355 insertions(+), 2839 deletions(-) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconAuthMethod.java (95%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconClient.java (88%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconClientErrorResponse.java (92%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconClientException.java (87%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconClientInformation.java (97%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconConnectorException.java (92%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconInterface.java (71%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconServer.java (94%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconServerErrorResponse.java (95%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/BeaconServerException.java (93%) rename app/src/main/java/io/xpipe/app/beacon/{impl/ActionExchangeImpl.java => api/ActionExchange.java} (59%) rename app/src/main/java/io/xpipe/app/beacon/{impl/AskpassExchangeImpl.java => api/AskpassExchange.java} (80%) rename app/src/main/java/io/xpipe/app/beacon/{impl/CategoryAddExchangeImpl.java => api/CategoryAddExchange.java} (61%) rename app/src/main/java/io/xpipe/app/beacon/{impl/CategoryInfoExchangeImpl.java => api/CategoryInfoExchange.java} (50%) create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/CategoryQueryExchange.java rename app/src/main/java/io/xpipe/app/beacon/{impl/CategoryRemoveExchangeImpl.java => api/CategoryRemoveExchange.java} (61%) rename app/src/main/java/io/xpipe/app/beacon/{impl/ConnectionAddExchangeImpl.java => api/ConnectionAddExchange.java} (75%) rename app/src/main/java/io/xpipe/app/beacon/{impl/ConnectionInfoExchangeImpl.java => api/ConnectionInfoExchange.java} (64%) rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/api/ConnectionQueryExchange.java (51%) rename app/src/main/java/io/xpipe/app/beacon/{impl/ConnectionRefreshExchangeImpl.java => api/ConnectionRefreshExchange.java} (53%) rename app/src/main/java/io/xpipe/app/beacon/{impl/ConnectionRemoveExchangeImpl.java => api/ConnectionRemoveExchange.java} (56%) rename app/src/main/java/io/xpipe/app/beacon/{impl/DaemonFocusExchangeImpl.java => api/DaemonFocusExchange.java} (61%) rename app/src/main/java/io/xpipe/app/beacon/{impl/DaemonModeExchangeImpl.java => api/DaemonModeExchange.java} (53%) rename app/src/main/java/io/xpipe/app/beacon/{impl/DaemonOpenExchangeImpl.java => api/DaemonOpenExchange.java} (66%) rename app/src/main/java/io/xpipe/app/beacon/{impl/DaemonStatusExchangeImpl.java => api/DaemonStatusExchange.java} (53%) rename app/src/main/java/io/xpipe/app/beacon/{impl/DaemonStopExchangeImpl.java => api/DaemonStopExchange.java} (51%) rename app/src/main/java/io/xpipe/app/beacon/{impl/DaemonVersionExchangeImpl.java => api/DaemonVersionExchange.java} (59%) create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/FsBlobExchange.java rename app/src/main/java/io/xpipe/app/beacon/{impl/FsReadExchangeImpl.java => api/FsReadExchange.java} (74%) rename app/src/main/java/io/xpipe/app/beacon/{impl/FsScriptExchangeImpl.java => api/FsScriptExchange.java} (54%) create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/FsWriteExchange.java rename app/src/main/java/io/xpipe/app/beacon/{impl/HandshakeExchangeImpl.java => api/HandshakeExchange.java} (58%) create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/SecretDecryptExchange.java rename {beacon/src/main/java/io/xpipe => app/src/main/java/io/xpipe/app}/beacon/api/SecretEncryptExchange.java (55%) rename app/src/main/java/io/xpipe/app/beacon/{impl/ShellExecExchangeImpl.java => api/ShellExecExchange.java} (56%) rename app/src/main/java/io/xpipe/app/beacon/{impl/ShellStartExchangeImpl.java => api/ShellStartExchange.java} (65%) create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/ShellStopExchange.java rename app/src/main/java/io/xpipe/app/beacon/{impl/SshLaunchExchangeImpl.java => api/SshLaunchExchange.java} (70%) rename app/src/main/java/io/xpipe/app/beacon/{impl/TerminalExternalLaunchExchangeImpl.java => api/TerminalExternalLaunchExchange.java} (71%) create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/TerminalLaunchExchange.java create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/TerminalPrepareExchange.java create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/TerminalRegisterExchange.java create mode 100644 app/src/main/java/io/xpipe/app/beacon/api/TerminalWaitExchange.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/CategoryQueryExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/FsBlobExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/FsWriteExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/SecretDecryptExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/SecretEncryptExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/ShellStopExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/TerminalRegisterExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java create mode 100644 app/src/main/java/io/xpipe/app/ext/CliProvider.java rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/AesSecretValue.java (98%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/EncryptedSecretValue.java (98%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/FailableBiFunction.java (83%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/FailableConsumer.java (81%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/FailableFunction.java (81%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/FailableRunnable.java (79%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/FailableSupplier.java (73%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/FilePath.java (99%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/InPlaceSecretValue.java (98%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/JacksonMapper.java (96%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/KeyValue.java (96%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/ModuleLayerLoader.java (50%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/OsType.java (99%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/SecretValue.java (97%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/StorePath.java (98%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/StreamCharset.java (99%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/UuidHelper.java (95%) rename {core/src/main/java/io/xpipe/core => app/src/main/java/io/xpipe/app/util}/XPipeDaemonMode.java (98%) rename {core/src/test/java/io/xpipe/core/test => app/src/test/java}/StorePathTest.java (97%) delete mode 100644 beacon/README.md delete mode 100644 beacon/build.gradle delete mode 100644 beacon/publish.gradle delete mode 100644 beacon/src/main/java/io/xpipe/beacon/BeaconConfig.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/BeaconJacksonModule.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ActionExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/AskpassExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/CategoryAddExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/CategoryInfoExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/CategoryQueryExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/CategoryRemoveExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ConnectionAddExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ConnectionInfoExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ConnectionRefreshExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ConnectionRemoveExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/DaemonFocusExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/DaemonModeExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/DaemonOpenExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/DaemonStatusExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/DaemonStopExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/DaemonVersionExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/FsBlobExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/FsReadExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/FsScriptExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/FsWriteExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/HandshakeExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/SecretDecryptExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ShellExecExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ShellStartExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/ShellStopExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/SshLaunchExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/TerminalExternalLaunchExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/TerminalPrepareExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/TerminalRegisterExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java delete mode 100644 beacon/src/main/java/module-info.java delete mode 100644 beacon/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader delete mode 100644 core/README.md delete mode 100644 core/build.gradle delete mode 100644 core/publish.gradle delete mode 100644 core/src/main/java/io/xpipe/core/CoreJacksonModule.java delete mode 100644 core/src/main/java/module-info.java delete mode 100644 core/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module delete mode 100644 core/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader delete mode 100644 core/src/test/java/module-info.java diff --git a/app/build.gradle b/app/build.gradle index 43e36ad7c..462b05e48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,9 +19,6 @@ configurations { } dependencies { - api project(':core') - api project(':beacon') - compileOnly 'org.hamcrest:hamcrest:3.0' compileOnly 'org.junit.jupiter:junit-jupiter-api:5.14.2' compileOnly 'org.junit.jupiter:junit-jupiter-params:5.14.2' @@ -97,7 +94,7 @@ jar { application { mainModule = groupName + '.app' mainClass = groupName + '.app.Main' - applicationDefaultJvmArgs = jvmRunArgs + applicationDefaultJvmArgs = daemonJvmRunArgs } run { @@ -123,6 +120,10 @@ run { def exts = files(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0].outputs.files.singleFile).toList()) classpath += exts + def cli = project(':cli').getTasksByName('jar', true)[0].outputs.files.singleFile + classpath += files(cli) + + dependsOn(project(':cli').getTasksByName('jar', true)[0]) dependsOn(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0]).toList()) } @@ -132,7 +133,7 @@ tasks.register('runAttachedDebugger', JavaExec) { mainModule = groupName + '.app' mainClass = groupName + '.app.Main' modularity.inferModulePath = true - jvmArgs += jvmRunArgs + jvmArgs += daemonJvmRunArgs jvmArgs += List.of( "-javaagent:${System.getProperty("user.home")}/.attachme/attachme-agent-1.2.9.jar=port:7857,host:localhost".toString(), "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0" diff --git a/app/src/main/java/io/xpipe/app/Main.java b/app/src/main/java/io/xpipe/app/Main.java index 5368cec57..ddaa22abd 100644 --- a/app/src/main/java/io/xpipe/app/Main.java +++ b/app/src/main/java/io/xpipe/app/Main.java @@ -13,14 +13,8 @@ public class Main { return; } - // Since this is not marked as a console application, it will not print anything when you run it in a console on - // Windows - if (args.length == 1 && args[0].equals("--help")) { - System.out.printf(""" - The daemon executable %s does not accept any command-line arguments. - - For a reference on how to use xpipe from the command-line, take a look at https://docs.xpipe.io/cli. - %n""", AppNames.ofCurrent().getExecutableName()); + if (args.length == 1 && (args[0].equals("--help") || args[0].equals("help"))) { + System.out.println("For a reference on how to use xpipe from the command-line, take a look at https://docs.xpipe.io/cli"); return; } diff --git a/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java b/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java index 04ff87008..a1d803510 100644 --- a/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java +++ b/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java @@ -4,8 +4,8 @@ import io.xpipe.app.ext.DataStore; import io.xpipe.app.hub.action.*; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.storage.DataStorage; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.UuidHelper; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.UuidHelper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; diff --git a/app/src/main/java/io/xpipe/app/action/ActionProvider.java b/app/src/main/java/io/xpipe/app/action/ActionProvider.java index 3abeb1f44..b12c01949 100644 --- a/app/src/main/java/io/xpipe/app/action/ActionProvider.java +++ b/app/src/main/java/io/xpipe/app/action/ActionProvider.java @@ -2,7 +2,7 @@ package io.xpipe.app.action; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import java.util.*; @@ -59,5 +59,10 @@ public interface ActionProvider { .map(p -> p.get()) .toList()); } + + @Override + public boolean initForCli() { + return false; + } } } diff --git a/app/src/main/java/io/xpipe/app/action/ActionUrls.java b/app/src/main/java/io/xpipe/app/action/ActionUrls.java index 57b985542..b50a84c71 100644 --- a/app/src/main/java/io/xpipe/app/action/ActionUrls.java +++ b/app/src/main/java/io/xpipe/app/action/ActionUrls.java @@ -1,7 +1,7 @@ package io.xpipe.app.action; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.SecretValue; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; diff --git a/app/src/main/java/io/xpipe/app/action/SerializableAction.java b/app/src/main/java/io/xpipe/app/action/SerializableAction.java index 96b5441ab..464810714 100644 --- a/app/src/main/java/io/xpipe/app/action/SerializableAction.java +++ b/app/src/main/java/io/xpipe/app/action/SerializableAction.java @@ -2,8 +2,8 @@ package io.xpipe.app.action; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.DataStoreFormatter; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.UuidHelper; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.UuidHelper; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/app/src/main/java/io/xpipe/app/beacon/AppBeaconCache.java b/app/src/main/java/io/xpipe/app/beacon/AppBeaconCache.java index 025c4e1e1..b9c1ff6b5 100644 --- a/app/src/main/java/io/xpipe/app/beacon/AppBeaconCache.java +++ b/app/src/main/java/io/xpipe/app/beacon/AppBeaconCache.java @@ -2,7 +2,6 @@ package io.xpipe.app.beacon; import io.xpipe.app.ext.ShellStore; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.beacon.BeaconClientException; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java b/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java index 4d7073ab2..27cbc6538 100644 --- a/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java +++ b/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java @@ -2,13 +2,12 @@ package io.xpipe.app.beacon; import io.xpipe.app.beacon.mcp.AppMcpServer; import io.xpipe.app.core.AppLocalTemp; +import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.beacon.BeaconConfig; -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; @@ -56,7 +55,8 @@ public class AppBeaconServer { public static void init() { try { - INSTANCE = new AppBeaconServer(BeaconConfig.getUsedPort()); + // We already queried the beacon port at this point, so this will always work + INSTANCE = new AppBeaconServer(AppProperties.get().queryEffectiveBeaconPort(false).orElseThrow()); INSTANCE.initAuthSecret(); INSTANCE.start(); TrackEvent.withInfo("Started http server") @@ -111,7 +111,7 @@ public class AppBeaconServer { } private void initAuthSecret() throws IOException { - var file = BeaconConfig.getLocalBeaconAuthFile(); + var file = AppProperties.get().getBeaconAuthFile(); // Create and set temp dir permissions for Linux AppLocalTemp.getLocalTempDataDirectory(); @@ -122,13 +122,13 @@ public class AppBeaconServer { } localAuthSecret = id; - var lockFile = BeaconConfig.getLocalBeaconLockFile(); + var lockFile = AppProperties.get().getBeaconLockFile(); localLockFileChannel = new RandomAccessFile(lockFile.toFile(), "rw").getChannel(); localLockFileLock = localLockFileChannel.tryLock(); } private void deleteAuthSecret() { - var file = BeaconConfig.getLocalBeaconAuthFile(); + var file = AppProperties.get().getBeaconAuthFile(); try { Files.delete(file); localLockFileLock.release(); diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconAuthMethod.java b/app/src/main/java/io/xpipe/app/beacon/BeaconAuthMethod.java similarity index 95% rename from beacon/src/main/java/io/xpipe/beacon/BeaconAuthMethod.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconAuthMethod.java index 7df93e070..6fba60bfe 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconAuthMethod.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconAuthMethod.java @@ -1,4 +1,4 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconClient.java b/app/src/main/java/io/xpipe/app/beacon/BeaconClient.java similarity index 88% rename from beacon/src/main/java/io/xpipe/beacon/BeaconClient.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconClient.java index 99c587f9b..5740971c3 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconClient.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconClient.java @@ -1,7 +1,7 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; -import io.xpipe.beacon.api.HandshakeExchange; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.beacon.api.HandshakeExchange; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.SneakyThrows; @@ -12,10 +12,20 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.file.Files; +import java.nio.file.Path; import java.util.Optional; public class BeaconClient { + private static final String PRINT_MESSAGES_PROPERTY = "io.xpipe.beacon.printMessages"; + + private static boolean printMessages() { + if (System.getProperty(PRINT_MESSAGES_PROPERTY) != null) { + return Boolean.parseBoolean(System.getProperty(PRINT_MESSAGES_PROPERTY)); + } + return false; + } + private final int port; private String token; @@ -23,9 +33,9 @@ public class BeaconClient { this.port = port; } - public static BeaconClient establishConnection(int port, BeaconClientInformation information) throws Exception { + public static BeaconClient establishConnection(int port, BeaconClientInformation information, Path authFile) throws Exception { var client = new BeaconClient(port); - var auth = Files.readString(BeaconConfig.getLocalBeaconAuthFile()); + var auth = Files.readString(authFile); HandshakeExchange.Response response = client.performRequest(HandshakeExchange.Request.builder() .client(information) .auth(BeaconAuthMethod.Local.builder().authFileContent(auth).build()) @@ -34,19 +44,11 @@ public class BeaconClient { return client; } - public static Optional tryEstablishConnection(int port, BeaconClientInformation information) { - try { - return Optional.of(establishConnection(port, information)); - } catch (Exception ex) { - return Optional.empty(); - } - } - @SuppressWarnings("unchecked") public RES performRequest(BeaconInterface prov, String rawNode) throws BeaconConnectorException, BeaconClientException, BeaconServerException { var content = rawNode; - if (BeaconConfig.printMessages()) { + if (printMessages()) { System.out.println("Sending raw request:"); System.out.println(content); } @@ -70,7 +72,7 @@ public class BeaconClient { throw new BeaconConnectorException("Couldn't send request", ex); } - if (BeaconConfig.printMessages()) { + if (printMessages()) { System.out.println("Received raw response:"); System.out.println(response.body()); } @@ -117,7 +119,7 @@ public class BeaconClient { if (prov.isEmpty()) { throw new IllegalArgumentException("Unknown request class " + req.getClass()); } - if (BeaconConfig.printMessages()) { + if (printMessages()) { System.out.println( "Sending request to server of type " + req.getClass().getName()); } diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconClientErrorResponse.java b/app/src/main/java/io/xpipe/app/beacon/BeaconClientErrorResponse.java similarity index 92% rename from beacon/src/main/java/io/xpipe/beacon/BeaconClientErrorResponse.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconClientErrorResponse.java index bd2c196a2..fcc5128a8 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconClientErrorResponse.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconClientErrorResponse.java @@ -1,4 +1,4 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconClientException.java b/app/src/main/java/io/xpipe/app/beacon/BeaconClientException.java similarity index 87% rename from beacon/src/main/java/io/xpipe/beacon/BeaconClientException.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconClientException.java index 031edbb51..06c76d430 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconClientException.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconClientException.java @@ -1,4 +1,4 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; /** * Indicates that a client request was invalid. diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconClientInformation.java b/app/src/main/java/io/xpipe/app/beacon/BeaconClientInformation.java similarity index 97% rename from beacon/src/main/java/io/xpipe/beacon/BeaconClientInformation.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconClientInformation.java index 605f5e495..81f6d684a 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconClientInformation.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconClientInformation.java @@ -1,4 +1,4 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconConnectorException.java b/app/src/main/java/io/xpipe/app/beacon/BeaconConnectorException.java similarity index 92% rename from beacon/src/main/java/io/xpipe/beacon/BeaconConnectorException.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconConnectorException.java index 4511d0b7b..29d31cc05 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconConnectorException.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconConnectorException.java @@ -1,4 +1,4 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; /** * Indicates that a connection error occurred. diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconInterface.java b/app/src/main/java/io/xpipe/app/beacon/BeaconInterface.java similarity index 71% rename from beacon/src/main/java/io/xpipe/beacon/BeaconInterface.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconInterface.java index 8ab336566..344a18b47 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconInterface.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconInterface.java @@ -1,6 +1,6 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import com.sun.net.httpserver.HttpExchange; import lombok.SneakyThrows; @@ -31,16 +31,14 @@ public abstract class BeaconInterface { @SuppressWarnings("unchecked") @SneakyThrows public Class getRequestClass() { - var c = getClass().getSuperclass(); - var name = (c.getSuperclass().equals(BeaconInterface.class) ? c : getClass()).getName() + "$Request"; + var name = getClass().getName() + "$Request"; return (Class) Class.forName(name); } @SuppressWarnings("unchecked") @SneakyThrows public Class getResponseClass() { - var c = getClass().getSuperclass(); - var name = (c.getSuperclass().equals(BeaconInterface.class) ? c : getClass()).getName() + "$Response"; + var name = getClass().getName() + "$Response"; return (Class) Class.forName(name); } @@ -78,17 +76,16 @@ public abstract class BeaconInterface { @Override public void init(ModuleLayer layer) { - var services = layer != null - ? ServiceLoader.load(layer, BeaconInterface.class) - : ServiceLoader.load(BeaconInterface.class); + var services = ServiceLoader.load(layer, BeaconInterface.class); ALL = services.stream() .map(ServiceLoader.Provider::get) .map(beaconInterface -> (BeaconInterface) beaconInterface) .collect(Collectors.toList()); - // Remove parent classes - ALL.removeIf(beaconInterface -> ALL.stream() - .anyMatch(other -> !other.equals(beaconInterface) - && beaconInterface.getClass().isAssignableFrom(other.getClass()))); + } + + @Override + public boolean initForCli() { + return true; } } } diff --git a/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java b/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java index 14c885644..14bacec9b 100644 --- a/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java @@ -5,8 +5,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.beacon.*; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconServer.java b/app/src/main/java/io/xpipe/app/beacon/BeaconServer.java similarity index 94% rename from beacon/src/main/java/io/xpipe/beacon/BeaconServer.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconServer.java index 4bf21a641..e6d0784a7 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconServer.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconServer.java @@ -1,6 +1,6 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; -import io.xpipe.beacon.api.DaemonStopExchange; +import io.xpipe.app.beacon.api.DaemonStopExchange; import lombok.SneakyThrows; diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconServerErrorResponse.java b/app/src/main/java/io/xpipe/app/beacon/BeaconServerErrorResponse.java similarity index 95% rename from beacon/src/main/java/io/xpipe/beacon/BeaconServerErrorResponse.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconServerErrorResponse.java index 7d61954a5..c9917bc05 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconServerErrorResponse.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconServerErrorResponse.java @@ -1,4 +1,4 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconServerException.java b/app/src/main/java/io/xpipe/app/beacon/BeaconServerException.java similarity index 93% rename from beacon/src/main/java/io/xpipe/beacon/BeaconServerException.java rename to app/src/main/java/io/xpipe/app/beacon/BeaconServerException.java index 227b74899..959fe7d91 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconServerException.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconServerException.java @@ -1,4 +1,4 @@ -package io.xpipe.beacon; +package io.xpipe.app.beacon; /** * Indicates that an internal server error occurred. diff --git a/app/src/main/java/io/xpipe/app/beacon/BeaconSession.java b/app/src/main/java/io/xpipe/app/beacon/BeaconSession.java index 69c549147..907da05dd 100644 --- a/app/src/main/java/io/xpipe/app/beacon/BeaconSession.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconSession.java @@ -1,7 +1,5 @@ package io.xpipe.app.beacon; -import io.xpipe.beacon.BeaconClientInformation; - import lombok.Value; @Value diff --git a/app/src/main/java/io/xpipe/app/beacon/BlobManager.java b/app/src/main/java/io/xpipe/app/beacon/BlobManager.java index e5c2acd1c..7ea1d74d3 100644 --- a/app/src/main/java/io/xpipe/app/beacon/BlobManager.java +++ b/app/src/main/java/io/xpipe/app/beacon/BlobManager.java @@ -2,7 +2,6 @@ package io.xpipe.app.beacon; import io.xpipe.app.core.AppLocalTemp; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.beacon.BeaconClientException; import org.apache.commons.io.FileUtils; diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ActionExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/ActionExchange.java similarity index 59% rename from app/src/main/java/io/xpipe/app/beacon/impl/ActionExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/ActionExchange.java index 913ace5d9..0e62baae4 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ActionExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/ActionExchange.java @@ -1,14 +1,23 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; +import com.fasterxml.jackson.databind.JsonNode; +import com.sun.net.httpserver.HttpExchange; import io.xpipe.app.action.ActionJacksonMapper; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.core.AppCache; import io.xpipe.app.core.window.AppDialog; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.ActionExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +public class ActionExchange extends BeaconInterface { -public class ActionExchangeImpl extends ActionExchange { + @Override + public String getPath() { + return "/action"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws Exception { @@ -37,4 +46,19 @@ public class ActionExchangeImpl extends ActionExchange { } return r; } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + JsonNode action; + + boolean confirm; + } + + @Jacksonized + @Builder + @Value + public static class Response {} } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/AskpassExchange.java similarity index 80% rename from app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/AskpassExchange.java index d2b55e143..b5acd66e5 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/AskpassExchange.java @@ -1,5 +1,8 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.core.AppCache; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.core.window.AppDialog; @@ -8,18 +11,31 @@ import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.secret.SecretManager; import io.xpipe.app.secret.SecretQueryState; import io.xpipe.app.terminal.TerminalView; -import io.xpipe.app.util.*; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.AskpassExchange; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.AskpassAlert; +import io.xpipe.app.util.GlobalTimer; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.SecretValue; import javafx.beans.property.SimpleStringProperty; - -import com.sun.net.httpserver.HttpExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.time.Duration; +import java.util.UUID; -public class AskpassExchangeImpl extends AskpassExchange { +public class AskpassExchange extends BeaconInterface { + + @Override + public boolean acceptInShutdown() { + return true; + } + + @Override + public String getPath() { + return "/askpass"; + } @Override public boolean requiresCompletedStartup() { @@ -106,4 +122,25 @@ public class AskpassExchangeImpl extends AskpassExchange { } TerminalView.focus(term.get()); } + + @Jacksonized + @Builder + @Value + public static class Request { + long pid; + + UUID secretId; + + UUID request; + + String prompt; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + SecretValue value; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/CategoryAddExchange.java similarity index 61% rename from app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/CategoryAddExchange.java index 7437ea490..b4b87bb55 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/CategoryAddExchange.java @@ -1,13 +1,24 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreCategory; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.CategoryAddExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +import java.util.UUID; -public class CategoryAddExchangeImpl extends CategoryAddExchange { +public class CategoryAddExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/category/add"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws Throwable { @@ -32,4 +43,23 @@ public class CategoryAddExchangeImpl extends CategoryAddExchange { public Object getSynchronizationObject() { return DataStorage.get(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + String name; + + @NonNull + UUID parent; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + UUID category; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryInfoExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/CategoryInfoExchange.java similarity index 50% rename from app/src/main/java/io/xpipe/app/beacon/impl/CategoryInfoExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/CategoryInfoExchange.java index b9ca1e79e..1d9a3fdf5 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryInfoExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/CategoryInfoExchange.java @@ -1,16 +1,29 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.storage.DataStorage; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.CategoryInfoExchange; -import io.xpipe.core.JacksonMapper; +package io.xpipe.app.beacon.api; import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.StorePath; +import com.fasterxml.jackson.databind.JsonNode; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.time.Instant; import java.util.ArrayList; +import java.util.List; import java.util.UUID; -public class CategoryInfoExchangeImpl extends CategoryInfoExchange { +public class CategoryInfoExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/category/info"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { @@ -39,4 +52,42 @@ public class CategoryInfoExchangeImpl extends CategoryInfoExchange { public Object getSynchronizationObject() { return DataStorage.get(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + List categories; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + List<@NonNull InfoResponse> infos; + } + + @Jacksonized + @Builder + @Value + public static class InfoResponse { + @NonNull + UUID category; + + UUID parentCategory; + + @NonNull + StorePath name; + + @NonNull + Instant lastUsed; + + @NonNull + Instant lastModified; + + @NonNull + JsonNode config; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/api/CategoryQueryExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/CategoryQueryExchange.java new file mode 100644 index 000000000..8e61b4e2c --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/CategoryQueryExchange.java @@ -0,0 +1,51 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStorageQuery; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.util.List; +import java.util.UUID; + +public class CategoryQueryExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/category/query"; + } + + @Override + public Object handle(HttpExchange exchange, Request msg) { + var found = DataStorageQuery.queryCategory(msg.getFilter()); + return Response.builder() + .found(found.stream().map(entry -> entry.getUuid()).toList()) + .build(); + } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + String filter; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + List<@NonNull UUID> found; + } +} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryRemoveExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/CategoryRemoveExchange.java similarity index 61% rename from app/src/main/java/io/xpipe/app/beacon/impl/CategoryRemoveExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/CategoryRemoveExchange.java index 3085fad4f..ff579134f 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryRemoveExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/CategoryRemoveExchange.java @@ -1,16 +1,26 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreCategory; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.CategoryRemoveExchange; - -import com.sun.net.httpserver.HttpExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.util.ArrayList; +import java.util.List; import java.util.UUID; -public class CategoryRemoveExchangeImpl extends CategoryRemoveExchange { +public class CategoryRemoveExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/category/remove"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { @@ -38,4 +48,21 @@ public class CategoryRemoveExchangeImpl extends CategoryRemoveExchange { public Object getSynchronizationObject() { return DataStorage.get(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + List categories; + + boolean removeChildrenCategories; + + boolean removeContents; + } + + @Jacksonized + @Builder + @Value + public static class Response {} } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionAddExchange.java similarity index 75% rename from app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/ConnectionAddExchange.java index 01459cfde..ff9045864 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionAddExchange.java @@ -1,17 +1,29 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; + +import com.fasterxml.jackson.databind.JsonNode; import io.xpipe.app.ext.DataStore; import io.xpipe.app.ext.ValidationException; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.ConnectionAddExchange; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +import java.util.UUID; -public class ConnectionAddExchangeImpl extends ConnectionAddExchange { +public class ConnectionAddExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/connection/add"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws Throwable { @@ -76,4 +88,28 @@ public class ConnectionAddExchangeImpl extends ConnectionAddExchange { public Object getSynchronizationObject() { return DataStorage.get(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + String name; + + @NonNull + JsonNode data; + + @NonNull + Boolean validate; + + UUID category; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + UUID connection; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionInfoExchange.java similarity index 64% rename from app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/ConnectionInfoExchange.java index 2a2ac542f..59d811c77 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionInfoExchange.java @@ -1,18 +1,30 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.storage.DataStorage; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.ConnectionInfoExchange; -import io.xpipe.core.StorePath; +package io.xpipe.app.beacon.api; import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.util.StorePath; + +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import org.apache.commons.lang3.ClassUtils; +import java.time.Instant; import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; -public class ConnectionInfoExchangeImpl extends ConnectionInfoExchange { +public class ConnectionInfoExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/connection/info"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { @@ -60,4 +72,55 @@ public class ConnectionInfoExchangeImpl extends ConnectionInfoExchange { public Object getSynchronizationObject() { return DataStorage.get(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + List connections; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + List<@NonNull InfoResponse> infos; + } + + @Jacksonized + @Builder + @Value + public static class InfoResponse { + @NonNull + UUID connection; + + @NonNull + StorePath category; + + @NonNull + StorePath name; + + @NonNull + String type; + + @NonNull + Object rawData; + + @NonNull + Object usageCategory; + + @NonNull + Instant lastUsed; + + @NonNull + Instant lastModified; + + @NonNull + Object state; + + @NonNull + Map cache; + } } diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionQueryExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionQueryExchange.java similarity index 51% rename from beacon/src/main/java/io/xpipe/beacon/api/ConnectionQueryExchange.java rename to app/src/main/java/io/xpipe/app/beacon/api/ConnectionQueryExchange.java index 5cfa51907..48bb24b85 100644 --- a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionQueryExchange.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionQueryExchange.java @@ -1,7 +1,10 @@ -package io.xpipe.beacon.api; +package io.xpipe.app.beacon.api; -import io.xpipe.beacon.BeaconInterface; +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStorageQuery; import lombok.Builder; import lombok.NonNull; import lombok.Value; @@ -17,6 +20,20 @@ public class ConnectionQueryExchange extends BeaconInterface entry.getUuid()).toList()) + .build(); + } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } + @Jacksonized @Builder @Value diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionRefreshExchange.java similarity index 53% rename from app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/ConnectionRefreshExchange.java index 4fabec9c8..6c74155ad 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionRefreshExchange.java @@ -1,13 +1,24 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.ext.FixedHierarchyStore; import io.xpipe.app.storage.DataStorage; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.ConnectionRefreshExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +import java.util.UUID; -public class ConnectionRefreshExchangeImpl extends ConnectionRefreshExchange { +public class ConnectionRefreshExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/connection/refresh"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws Throwable { @@ -26,4 +37,17 @@ public class ConnectionRefreshExchangeImpl extends ConnectionRefreshExchange { public Object getSynchronizationObject() { return DataStorage.get(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID connection; + } + + @Jacksonized + @Builder + @Value + public static class Response {} } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionRemoveExchange.java similarity index 56% rename from app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/ConnectionRemoveExchange.java index 1fb6d4176..4817c026f 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/ConnectionRemoveExchange.java @@ -1,16 +1,26 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.ConnectionRemoveExchange; - -import com.sun.net.httpserver.HttpExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.util.ArrayList; +import java.util.List; import java.util.UUID; -public class ConnectionRemoveExchangeImpl extends ConnectionRemoveExchange { +public class ConnectionRemoveExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/connection/remove"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { @@ -29,4 +39,17 @@ public class ConnectionRemoveExchangeImpl extends ConnectionRemoveExchange { public Object getSynchronizationObject() { return DataStorage.get(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + List connections; + } + + @Jacksonized + @Builder + @Value + public static class Response {} } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonFocusExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/DaemonFocusExchange.java similarity index 61% rename from app/src/main/java/io/xpipe/app/beacon/impl/DaemonFocusExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/DaemonFocusExchange.java index bb454b355..b63d644e7 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonFocusExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/DaemonFocusExchange.java @@ -1,12 +1,20 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.core.window.AppMainWindow; -import io.xpipe.beacon.api.DaemonFocusExchange; +import lombok.Builder; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +public class DaemonFocusExchange extends BeaconInterface { -public class DaemonFocusExchangeImpl extends DaemonFocusExchange { + @Override + public String getPath() { + return "/daemon/focus"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws Throwable { @@ -34,4 +42,14 @@ public class DaemonFocusExchangeImpl extends DaemonFocusExchange { public boolean requiresCompletedStartup() { return false; } + + @Jacksonized + @Builder + @Value + public static class Request {} + + @Jacksonized + @Builder + @Value + public static class Response {} } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonModeExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/DaemonModeExchange.java similarity index 53% rename from app/src/main/java/io/xpipe/app/beacon/impl/DaemonModeExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/DaemonModeExchange.java index 341354f54..0a9f13121 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonModeExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/DaemonModeExchange.java @@ -1,12 +1,23 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.core.mode.AppOperationMode; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.DaemonModeExchange; +package io.xpipe.app.beacon.api; import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.core.mode.AppOperationMode; +import io.xpipe.app.util.XPipeDaemonMode; + +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +public class DaemonModeExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/daemon/mode"; + } -public class DaemonModeExchangeImpl extends DaemonModeExchange { @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { var mode = AppOperationMode.map(msg.getMode()); @@ -22,11 +33,27 @@ public class DaemonModeExchangeImpl extends DaemonModeExchange { } AppOperationMode.switchToSyncIfPossible(mode); - return DaemonModeExchange.Response.builder().usedMode(msg.getMode()).build(); + return Response.builder().usedMode(msg.getMode()).build(); } @Override public boolean requiresEnabledApi() { return false; } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + XPipeDaemonMode mode; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + XPipeDaemonMode usedMode; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/DaemonOpenExchange.java similarity index 66% rename from app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/DaemonOpenExchange.java index 207421e52..2668a7287 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/DaemonOpenExchange.java @@ -1,18 +1,29 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.beacon.BeaconServerException; import io.xpipe.app.core.AppOpenArguments; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.platform.PlatformInit; -import io.xpipe.beacon.BeaconServerException; -import io.xpipe.beacon.api.DaemonOpenExchange; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +import java.util.List; -public class DaemonOpenExchangeImpl extends DaemonOpenExchange { +public class DaemonOpenExchange extends BeaconInterface { private int openCounter = 0; + @Override + public String getPath() { + return "/daemon/open"; + } + @Override public boolean requiresCompletedStartup() { return false; @@ -46,4 +57,17 @@ public class DaemonOpenExchangeImpl extends DaemonOpenExchange { public boolean requiresEnabledApi() { return false; } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + List arguments; + } + + @Jacksonized + @Builder + @Value + public static class Response {} } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonStatusExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/DaemonStatusExchange.java similarity index 53% rename from app/src/main/java/io/xpipe/app/beacon/impl/DaemonStatusExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/DaemonStatusExchange.java index 74854d1d3..957c98804 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonStatusExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/DaemonStatusExchange.java @@ -1,11 +1,19 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.core.mode.AppOperationMode; -import io.xpipe.beacon.api.DaemonStatusExchange; +package io.xpipe.app.beacon.api; import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; -public class DaemonStatusExchangeImpl extends DaemonStatusExchange { +import io.xpipe.app.core.mode.AppOperationMode; +import lombok.Builder; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +public class DaemonStatusExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/daemon/status"; + } @Override public boolean requiresCompletedStartup() { @@ -28,4 +36,16 @@ public class DaemonStatusExchangeImpl extends DaemonStatusExchange { public boolean requiresEnabledApi() { return false; } + + @Value + @Jacksonized + @Builder + public static class Request {} + + @Jacksonized + @Builder + @Value + public static class Response { + String mode; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonStopExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/DaemonStopExchange.java similarity index 51% rename from app/src/main/java/io/xpipe/app/beacon/impl/DaemonStopExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/DaemonStopExchange.java index ef5ffa7de..263e78cb4 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonStopExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/DaemonStopExchange.java @@ -1,12 +1,23 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.beacon.api.DaemonStopExchange; +import lombok.Builder; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +/** + * Requests the daemon to stop. + */ +public class DaemonStopExchange extends BeaconInterface { -public class DaemonStopExchangeImpl extends DaemonStopExchange { + @Override + public String getPath() { + return "/daemon/stop"; + } @Override public boolean requiresCompletedStartup() { @@ -26,4 +37,16 @@ public class DaemonStopExchangeImpl extends DaemonStopExchange { public boolean requiresEnabledApi() { return false; } + + @Jacksonized + @Builder + @Value + public static class Request {} + + @Jacksonized + @Builder + @Value + public static class Response { + boolean success; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonVersionExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/DaemonVersionExchange.java similarity index 59% rename from app/src/main/java/io/xpipe/app/beacon/impl/DaemonVersionExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/DaemonVersionExchange.java index b1c6764bd..c88353cc8 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonVersionExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/DaemonVersionExchange.java @@ -1,13 +1,22 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.core.AppProperties; import io.xpipe.app.core.AppVersion; import io.xpipe.app.util.LicenseProvider; -import io.xpipe.beacon.api.DaemonVersionExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -import com.sun.net.httpserver.HttpExchange; +public class DaemonVersionExchange extends BeaconInterface { -public class DaemonVersionExchangeImpl extends DaemonVersionExchange { + @Override + public String getPath() { + return "/daemon/version"; + } @Override public boolean requiresCompletedStartup() { @@ -34,4 +43,30 @@ public class DaemonVersionExchangeImpl extends DaemonVersionExchange { public boolean requiresEnabledApi() { return false; } + + @Jacksonized + @Builder + @Value + public static class Request {} + + @Jacksonized + @Builder + @Value + public static class Response { + + @NonNull + String version; + + @NonNull + String canonicalVersion; + + @NonNull + String buildVersion; + + @NonNull + String jvmVersion; + + @NonNull + String plan; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/api/FsBlobExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/FsBlobExchange.java new file mode 100644 index 000000000..ce0cebc99 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/FsBlobExchange.java @@ -0,0 +1,53 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.beacon.BlobManager; +import lombok.Builder; +import lombok.NonNull; +import lombok.SneakyThrows; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.util.UUID; + +public class FsBlobExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/fs/blob"; + } + + @Override + public boolean readRawRequestBody() { + return true; + } + + @Override + @SneakyThrows + public Object handle(HttpExchange exchange, Request msg) { + var id = UUID.randomUUID(); + + var size = exchange.getRequestBody().available(); + if (size > 100_000_000) { + BlobManager.get().store(id, exchange.getRequestBody()); + } else { + BlobManager.get().store(id, exchange.getRequestBody().readAllBytes()); + } + return Response.builder().blob(id).build(); + } + + @Jacksonized + @Builder + @Value + public static class Request {} + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + UUID blob; + } +} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/FsReadExchange.java similarity index 74% rename from app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/FsReadExchange.java index b3db97e8b..f2835bc0c 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/FsReadExchange.java @@ -1,20 +1,31 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.beacon.AppBeaconServer; -import io.xpipe.app.beacon.BlobManager; -import io.xpipe.app.ext.ConnectionFileSystem; -import io.xpipe.app.util.FixedSizeInputStream; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.FsReadExchange; +package io.xpipe.app.beacon.api; import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.AppBeaconServer; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.beacon.BlobManager; +import io.xpipe.app.ext.ConnectionFileSystem; +import io.xpipe.app.util.FilePath; + +import io.xpipe.app.util.FixedSizeInputStream; +import lombok.Builder; +import lombok.NonNull; import lombok.SneakyThrows; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.io.BufferedInputStream; import java.io.OutputStream; import java.nio.file.Files; +import java.util.UUID; -public class FsReadExchangeImpl extends FsReadExchange { +public class FsReadExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/fs/read"; + } @Override @SneakyThrows @@ -56,4 +67,20 @@ public class FsReadExchangeImpl extends FsReadExchange { } return Response.builder().build(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID connection; + + @NonNull + FilePath path; + } + + @Jacksonized + @Builder + @Value + public static class Response {} } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/FsScriptExchange.java similarity index 54% rename from app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/FsScriptExchange.java index eb46b4edf..e44880575 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/FsScriptExchange.java @@ -1,16 +1,27 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.beacon.AppBeaconServer; -import io.xpipe.app.beacon.BlobManager; -import io.xpipe.app.process.ScriptHelper; -import io.xpipe.beacon.api.FsScriptExchange; +package io.xpipe.app.beacon.api; import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.AppBeaconServer; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.beacon.BlobManager; +import io.xpipe.app.process.ScriptHelper; +import io.xpipe.app.util.FilePath; + +import lombok.Builder; +import lombok.NonNull; import lombok.SneakyThrows; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.nio.charset.StandardCharsets; +import java.util.UUID; -public class FsScriptExchangeImpl extends FsScriptExchange { +public class FsScriptExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/fs/script"; + } @Override @SneakyThrows @@ -24,4 +35,23 @@ public class FsScriptExchangeImpl extends FsScriptExchange { var file = ScriptHelper.createExecScript(shell.getControl(), data); return Response.builder().path(file).build(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID connection; + + @NonNull + UUID blob; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + FilePath path; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/api/FsWriteExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/FsWriteExchange.java new file mode 100644 index 000000000..cd3ef1725 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/FsWriteExchange.java @@ -0,0 +1,55 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.AppBeaconServer; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.beacon.BlobManager; +import io.xpipe.app.ext.ConnectionFileSystem; +import io.xpipe.app.util.FilePath; + +import lombok.Builder; +import lombok.NonNull; +import lombok.SneakyThrows; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.util.UUID; + +public class FsWriteExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/fs/write"; + } + + @Override + @SneakyThrows + public Object handle(HttpExchange exchange, Request msg) { + var shell = AppBeaconServer.get().getCache().getShellSession(msg.getConnection()); + var fs = new ConnectionFileSystem(shell.getControl()); + try (var in = BlobManager.get().getBlob(msg.getBlob()); + var os = fs.openOutput(msg.getPath(), in.available())) { + in.transferTo(os); + } + return Response.builder().build(); + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID connection; + + @NonNull + UUID blob; + + @NonNull + FilePath path; + } + + @Jacksonized + @Builder + @Value + public static class Response {} +} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/HandshakeExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/HandshakeExchange.java similarity index 58% rename from app/src/main/java/io/xpipe/app/beacon/impl/HandshakeExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/HandshakeExchange.java index 629ea5370..f0f234f9c 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/HandshakeExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/HandshakeExchange.java @@ -1,18 +1,34 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.beacon.AppBeaconServer; -import io.xpipe.app.beacon.BeaconSession; -import io.xpipe.app.issue.TrackEvent; -import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.beacon.BeaconAuthMethod; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.HandshakeExchange; +package io.xpipe.app.beacon.api; import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.*; +import io.xpipe.app.beacon.BeaconAuthMethod; +import io.xpipe.app.issue.TrackEvent; +import io.xpipe.app.prefs.AppPrefs; + +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.util.UUID; -public class HandshakeExchangeImpl extends HandshakeExchange { +public class HandshakeExchange extends BeaconInterface { + + @Override + public boolean acceptInShutdown() { + return true; + } + + @Override + public boolean requiresAuthentication() { + return false; + } + + @Override + public String getPath() { + return "/handshake"; + } @Override public boolean requiresCompletedStartup() { @@ -39,7 +55,7 @@ public class HandshakeExchangeImpl extends HandshakeExchange { return false; } - private boolean checkAuth(BeaconAuthMethod authMethod) { + private boolean checkAuth(io.xpipe.app.beacon.BeaconAuthMethod authMethod) { if (authMethod instanceof BeaconAuthMethod.Local local) { var c = local.getAuthFileContent().strip(); return AppBeaconServer.get().getLocalAuthSecret().equals(c); @@ -52,4 +68,23 @@ public class HandshakeExchangeImpl extends HandshakeExchange { return false; } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + BeaconAuthMethod auth; + + @NonNull + BeaconClientInformation client; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + String sessionToken; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/api/SecretDecryptExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/SecretDecryptExchange.java new file mode 100644 index 000000000..6eb6170f3 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/SecretDecryptExchange.java @@ -0,0 +1,48 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; + +import com.fasterxml.jackson.databind.JsonNode; +import io.xpipe.app.storage.DataStorageSecret; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.io.IOException; + +public class SecretDecryptExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/secret/decrypt"; + } + + @Override + public Object handle(HttpExchange exchange, Request msg) throws IOException, BeaconClientException { + var secret = DataStorageSecret.deserialize(msg.getEncrypted()); + if (secret == null) { + throw new BeaconClientException("Unable to parse secret"); + } + + return Response.builder().decrypted(new String(secret.getSecret())).build(); + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + JsonNode encrypted; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + String decrypted; + } +} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/SecretEncryptExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/SecretEncryptExchange.java similarity index 55% rename from beacon/src/main/java/io/xpipe/beacon/api/SecretEncryptExchange.java rename to app/src/main/java/io/xpipe/app/beacon/api/SecretEncryptExchange.java index 9a8fa2619..7e6b092e3 100644 --- a/beacon/src/main/java/io/xpipe/beacon/api/SecretEncryptExchange.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/SecretEncryptExchange.java @@ -1,8 +1,11 @@ -package io.xpipe.beacon.api; +package io.xpipe.app.beacon.api; -import io.xpipe.beacon.BeaconInterface; +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; import com.fasterxml.jackson.databind.JsonNode; +import io.xpipe.app.storage.DataStorageSecret; +import io.xpipe.app.util.InPlaceSecretValue; import lombok.Builder; import lombok.NonNull; import lombok.Value; @@ -15,6 +18,12 @@ public class SecretEncryptExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/shell/exec"; + } @Override @SneakyThrows @@ -30,4 +40,28 @@ public class ShellExecExchangeImpl extends ShellExecExchange { .exitCode(exitCode) .build(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID connection; + + @NonNull + String command; + } + + @Jacksonized + @Builder + @Value + public static class Response { + long exitCode; + + @NonNull + String stdout; + + @NonNull + String stderr; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/ShellStartExchange.java similarity index 65% rename from app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/ShellStartExchange.java index 548950b1a..0c8201e0e 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/ShellStartExchange.java @@ -1,17 +1,30 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; +import com.sun.net.httpserver.HttpExchange; import io.xpipe.app.beacon.AppBeaconServer; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.beacon.BeaconShellSession; import io.xpipe.app.ext.ShellStore; import io.xpipe.app.storage.DataStorage; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.ShellStartExchange; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.OsType; -import com.sun.net.httpserver.HttpExchange; +import lombok.Builder; +import lombok.NonNull; import lombok.SneakyThrows; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; -public class ShellStartExchangeImpl extends ShellStartExchange { +import java.util.UUID; + +public class ShellStartExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/shell/start"; + } @Override @SneakyThrows @@ -51,4 +64,32 @@ public class ShellStartExchangeImpl extends ShellStartExchange { .ttyState(ttyState) .build(); } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID connection; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + String shellDialect; + + @NonNull + OsType.Any osType; + + @NonNull + String osName; + + @NonNull + String ttyState; + + @NonNull + FilePath temp; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/api/ShellStopExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/ShellStopExchange.java new file mode 100644 index 000000000..a7d6aa83b --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/ShellStopExchange.java @@ -0,0 +1,43 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.AppBeaconServer; +import io.xpipe.app.beacon.BeaconInterface; + +import lombok.Builder; +import lombok.NonNull; +import lombok.SneakyThrows; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.util.UUID; + +public class ShellStopExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/shell/stop"; + } + + @Override + @SneakyThrows + public Object handle(HttpExchange exchange, Request msg) { + var e = AppBeaconServer.get().getCache().getShellSession(msg.getConnection()); + e.getControl().close(); + AppBeaconServer.get().getCache().getShellSessions().remove(e); + return Response.builder().build(); + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID connection; + } + + @Jacksonized + @Builder + @Value + public static class Response {} +} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/SshLaunchExchange.java similarity index 70% rename from app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/SshLaunchExchange.java index 3e1472e95..120d1b727 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/SshLaunchExchange.java @@ -1,15 +1,24 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.terminal.TerminalLauncherManager; -import io.xpipe.beacon.api.SshLaunchExchange; - -import com.sun.net.httpserver.HttpExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.util.List; -public class SshLaunchExchangeImpl extends SshLaunchExchange { +public class SshLaunchExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/sshLaunch"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws Exception { @@ -40,4 +49,19 @@ public class SshLaunchExchangeImpl extends SshLaunchExchange { public boolean requiresEnabledApi() { return false; } + + @Jacksonized + @Builder + @Value + public static class Request { + String arguments; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + List command; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalExternalLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/api/TerminalExternalLaunchExchange.java similarity index 71% rename from app/src/main/java/io/xpipe/app/beacon/impl/TerminalExternalLaunchExchangeImpl.java rename to app/src/main/java/io/xpipe/app/beacon/api/TerminalExternalLaunchExchange.java index 8c2c8b7c4..885816eaf 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalExternalLaunchExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/TerminalExternalLaunchExchange.java @@ -1,5 +1,10 @@ -package io.xpipe.app.beacon.impl; +package io.xpipe.app.beacon.api; +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.beacon.BeaconServerException; import io.xpipe.app.core.AppCache; import io.xpipe.app.core.window.AppDialog; import io.xpipe.app.ext.ShellStore; @@ -7,15 +12,19 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStorageQuery; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.terminal.TerminalLauncherManager; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.BeaconServerException; -import io.xpipe.beacon.api.TerminalExternalLaunchExchange; - -import com.sun.net.httpserver.HttpExchange; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; import java.util.List; -public class TerminalExternalLaunchExchangeImpl extends TerminalExternalLaunchExchange { +public class TerminalExternalLaunchExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/terminal/externalLaunch"; + } @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException { @@ -66,4 +75,23 @@ public class TerminalExternalLaunchExchangeImpl extends TerminalExternalLaunchEx } return r; } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + String connection; + + @NonNull + List arguments; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + List command; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/api/TerminalLaunchExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/TerminalLaunchExchange.java new file mode 100644 index 000000000..c04931b8c --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/TerminalLaunchExchange.java @@ -0,0 +1,50 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.beacon.BeaconServerException; +import io.xpipe.app.terminal.TerminalLauncherManager; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.nio.file.Path; +import java.util.UUID; + +public class TerminalLaunchExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/terminal/launch"; + } + + @Override + public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException { + var r = TerminalLauncherManager.launchExchange(msg.getRequest()); + return Response.builder().targetFile(r).build(); + } + + @Override + public boolean requiresEnabledApi() { + return false; + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID request; + } + + @Jacksonized + @Builder + @Value + public static class Response { + @NonNull + Path targetFile; + } +} diff --git a/app/src/main/java/io/xpipe/app/beacon/api/TerminalPrepareExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/TerminalPrepareExchange.java new file mode 100644 index 000000000..1ffdc911b --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/TerminalPrepareExchange.java @@ -0,0 +1,54 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.prefs.AppPrefs; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.util.UUID; + +public class TerminalPrepareExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/terminal/prepare"; + } + + @Override + public Object handle(HttpExchange exchange, Request msg) { + var term = AppPrefs.get().terminalType().getValue(); + var unicode = term.supportsUnicode(); + var escapes = term.supportsEscapes(); + return Response.builder() + .supportsUnicode(unicode) + .supportsEscapeSequences(escapes) + .build(); + } + + @Override + public boolean requiresEnabledApi() { + return false; + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID request; + + long pid; + } + + @Jacksonized + @Builder + @Value + public static class Response { + boolean supportsUnicode; + boolean supportsEscapeSequences; + } +} diff --git a/app/src/main/java/io/xpipe/app/beacon/api/TerminalRegisterExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/TerminalRegisterExchange.java new file mode 100644 index 000000000..3e799c1ae --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/TerminalRegisterExchange.java @@ -0,0 +1,49 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.terminal.TerminalLauncherManager; +import io.xpipe.app.terminal.TerminalView; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.util.UUID; + +public class TerminalRegisterExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/terminal/register"; + } + + @Override + public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { + TerminalView.get().open(msg.getRequest(), msg.getPid()); + TerminalLauncherManager.registerPid(msg.getRequest(), msg.getPid()); + return Response.builder().build(); + } + + @Override + public boolean requiresEnabledApi() { + return false; + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID request; + + long pid; + } + + @Jacksonized + @Builder + @Value + public static class Response {} +} diff --git a/app/src/main/java/io/xpipe/app/beacon/api/TerminalWaitExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/TerminalWaitExchange.java new file mode 100644 index 000000000..44eb45925 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/api/TerminalWaitExchange.java @@ -0,0 +1,45 @@ +package io.xpipe.app.beacon.api; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.beacon.BeaconInterface; + +import io.xpipe.app.beacon.BeaconServerException; +import io.xpipe.app.terminal.TerminalLauncherManager; +import lombok.Builder; +import lombok.NonNull; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +import java.util.UUID; + +public class TerminalWaitExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/terminal/wait"; + } + + @Override + public Object handle(HttpExchange exchange, Request msg) throws BeaconServerException { + TerminalLauncherManager.waitExchange(msg.getRequest()); + return Response.builder().build(); + } + + @Override + public boolean requiresEnabledApi() { + return false; + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID request; + } + + @Jacksonized + @Builder + @Value + public static class Response {} +} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryQueryExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/CategoryQueryExchangeImpl.java deleted file mode 100644 index f79dd0de4..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryQueryExchangeImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.storage.DataStorage; -import io.xpipe.app.storage.DataStorageQuery; -import io.xpipe.beacon.api.CategoryQueryExchange; - -import com.sun.net.httpserver.HttpExchange; - -public class CategoryQueryExchangeImpl extends CategoryQueryExchange { - - @Override - public Object handle(HttpExchange exchange, Request msg) { - var found = DataStorageQuery.queryCategory(msg.getFilter()); - return Response.builder() - .found(found.stream().map(entry -> entry.getUuid()).toList()) - .build(); - } - - @Override - public Object getSynchronizationObject() { - return DataStorage.get(); - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java deleted file mode 100644 index 37dfdc5f1..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.storage.DataStorage; -import io.xpipe.app.storage.DataStorageQuery; -import io.xpipe.beacon.api.ConnectionQueryExchange; - -import com.sun.net.httpserver.HttpExchange; - -public class ConnectionQueryExchangeImpl extends ConnectionQueryExchange { - - @Override - public Object handle(HttpExchange exchange, Request msg) { - var found = - DataStorageQuery.queryEntry(msg.getCategoryFilter(), msg.getConnectionFilter(), msg.getTypeFilter()); - return Response.builder() - .found(found.stream().map(entry -> entry.getUuid()).toList()) - .build(); - } - - @Override - public Object getSynchronizationObject() { - return DataStorage.get(); - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/FsBlobExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/FsBlobExchangeImpl.java deleted file mode 100644 index 2c404ceac..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/FsBlobExchangeImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.beacon.BlobManager; -import io.xpipe.beacon.api.FsBlobExchange; - -import com.sun.net.httpserver.HttpExchange; -import lombok.SneakyThrows; - -import java.util.UUID; - -public class FsBlobExchangeImpl extends FsBlobExchange { - - @Override - @SneakyThrows - public Object handle(HttpExchange exchange, Request msg) { - var id = UUID.randomUUID(); - - var size = exchange.getRequestBody().available(); - if (size > 100_000_000) { - BlobManager.get().store(id, exchange.getRequestBody()); - } else { - BlobManager.get().store(id, exchange.getRequestBody().readAllBytes()); - } - return Response.builder().blob(id).build(); - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/FsWriteExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/FsWriteExchangeImpl.java deleted file mode 100644 index fed9d0cc0..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/FsWriteExchangeImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.beacon.AppBeaconServer; -import io.xpipe.app.beacon.BlobManager; -import io.xpipe.app.ext.ConnectionFileSystem; -import io.xpipe.beacon.api.FsWriteExchange; - -import com.sun.net.httpserver.HttpExchange; -import lombok.SneakyThrows; - -public class FsWriteExchangeImpl extends FsWriteExchange { - - @Override - @SneakyThrows - public Object handle(HttpExchange exchange, Request msg) { - var shell = AppBeaconServer.get().getCache().getShellSession(msg.getConnection()); - var fs = new ConnectionFileSystem(shell.getControl()); - try (var in = BlobManager.get().getBlob(msg.getBlob()); - var os = fs.openOutput(msg.getPath(), in.available())) { - in.transferTo(os); - } - return Response.builder().build(); - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/SecretDecryptExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/SecretDecryptExchangeImpl.java deleted file mode 100644 index 0be181103..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/SecretDecryptExchangeImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.storage.DataStorageSecret; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.SecretDecryptExchange; - -import com.sun.net.httpserver.HttpExchange; - -import java.io.IOException; - -public class SecretDecryptExchangeImpl extends SecretDecryptExchange { - - @Override - public Object handle(HttpExchange exchange, Request msg) throws IOException, BeaconClientException { - var secret = DataStorageSecret.deserialize(msg.getEncrypted()); - if (secret == null) { - throw new BeaconClientException("Unable to parse secret"); - } - - return Response.builder().decrypted(new String(secret.getSecret())).build(); - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/SecretEncryptExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/SecretEncryptExchangeImpl.java deleted file mode 100644 index ceee66979..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/SecretEncryptExchangeImpl.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.storage.DataStorageSecret; -import io.xpipe.beacon.api.SecretEncryptExchange; -import io.xpipe.core.InPlaceSecretValue; - -import com.sun.net.httpserver.HttpExchange; - -public class SecretEncryptExchangeImpl extends SecretEncryptExchange { - - @Override - public Object handle(HttpExchange exchange, Request msg) { - var secret = DataStorageSecret.ofCurrentSecret(InPlaceSecretValue.of(msg.getValue())); - return Response.builder().encrypted(secret.serialize(true)).build(); - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ShellStopExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ShellStopExchangeImpl.java deleted file mode 100644 index 5329275e6..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ShellStopExchangeImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.beacon.AppBeaconServer; -import io.xpipe.beacon.api.ShellStopExchange; - -import com.sun.net.httpserver.HttpExchange; -import lombok.SneakyThrows; - -public class ShellStopExchangeImpl extends ShellStopExchange { - - @Override - @SneakyThrows - public Object handle(HttpExchange exchange, Request msg) { - var e = AppBeaconServer.get().getCache().getShellSession(msg.getConnection()); - e.getControl().close(); - AppBeaconServer.get().getCache().getShellSessions().remove(e); - return Response.builder().build(); - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java deleted file mode 100644 index 650742201..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.terminal.TerminalLauncherManager; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.BeaconServerException; -import io.xpipe.beacon.api.TerminalLaunchExchange; - -import com.sun.net.httpserver.HttpExchange; - -public class TerminalLaunchExchangeImpl extends TerminalLaunchExchange { - @Override - public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException { - var r = TerminalLauncherManager.launchExchange(msg.getRequest()); - return Response.builder().targetFile(r).build(); - } - - @Override - public boolean requiresEnabledApi() { - return false; - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java deleted file mode 100644 index a69a3e921..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.beacon.api.TerminalPrepareExchange; - -import com.sun.net.httpserver.HttpExchange; - -public class TerminalPrepareExchangeImpl extends TerminalPrepareExchange { - - @Override - public Object handle(HttpExchange exchange, Request msg) { - var term = AppPrefs.get().terminalType().getValue(); - var unicode = term.supportsUnicode(); - var escapes = term.supportsEscapes(); - return Response.builder() - .supportsUnicode(unicode) - .supportsEscapeSequences(escapes) - .build(); - } - - @Override - public boolean requiresEnabledApi() { - return false; - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalRegisterExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalRegisterExchangeImpl.java deleted file mode 100644 index b96297be4..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalRegisterExchangeImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.terminal.TerminalLauncherManager; -import io.xpipe.app.terminal.TerminalView; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.api.TerminalRegisterExchange; - -import com.sun.net.httpserver.HttpExchange; - -public class TerminalRegisterExchangeImpl extends TerminalRegisterExchange { - - @Override - public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { - TerminalView.get().open(msg.getRequest(), msg.getPid()); - TerminalLauncherManager.registerPid(msg.getRequest(), msg.getPid()); - return Response.builder().build(); - } - - @Override - public boolean requiresEnabledApi() { - return false; - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java deleted file mode 100644 index 0c9f44734..000000000 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.xpipe.app.beacon.impl; - -import io.xpipe.app.terminal.TerminalLauncherManager; -import io.xpipe.beacon.BeaconServerException; -import io.xpipe.beacon.api.TerminalWaitExchange; - -import com.sun.net.httpserver.HttpExchange; - -public class TerminalWaitExchangeImpl extends TerminalWaitExchange { - - @Override - public Object handle(HttpExchange exchange, Request msg) throws BeaconServerException { - TerminalLauncherManager.waitExchange(msg.getRequest()); - return Response.builder().build(); - } - - @Override - public boolean requiresEnabledApi() { - return false; - } -} diff --git a/app/src/main/java/io/xpipe/app/beacon/mcp/McpSchemaFiles.java b/app/src/main/java/io/xpipe/app/beacon/mcp/McpSchemaFiles.java index 68d528dbb..2d6ee6b41 100644 --- a/app/src/main/java/io/xpipe/app/beacon/mcp/McpSchemaFiles.java +++ b/app/src/main/java/io/xpipe/app/beacon/mcp/McpSchemaFiles.java @@ -1,6 +1,6 @@ package io.xpipe.app.beacon.mcp; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import io.modelcontextprotocol.spec.McpSchema; diff --git a/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java b/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java index e664d033c..fb67aafd8 100644 --- a/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java +++ b/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java @@ -6,8 +6,8 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStorageQuery; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.core.FilePath; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.util.FilePath; import io.modelcontextprotocol.server.McpSyncServerExchange; import io.modelcontextprotocol.spec.McpSchema; diff --git a/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java b/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java index b2a623c1e..7b3822d3e 100644 --- a/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java +++ b/app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java @@ -13,10 +13,10 @@ import io.xpipe.app.storage.DataStorageQuery; import io.xpipe.app.terminal.TerminalLaunch; import io.xpipe.app.util.CommandDialog; import io.xpipe.app.util.HttpHelper; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.FilePath; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper; diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java index 1589458a0..6cc69388c 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java @@ -21,7 +21,7 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.FileReference; import io.xpipe.app.util.ObservableSubscriber; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java index f947377ee..974f9f068 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java @@ -8,8 +8,8 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.FileReference; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java index 2a49e5184..b983e05d4 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java @@ -13,8 +13,8 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; import javafx.beans.binding.Bindings; import javafx.beans.property.BooleanProperty; diff --git a/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java index d91faab82..de4fb2593 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java @@ -8,7 +8,7 @@ import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.ext.FileSystemStore; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/MoveFileActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/MoveFileActionProvider.java index e5c6dbc3b..bf0d56a54 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/MoveFileActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/MoveFileActionProvider.java @@ -2,7 +2,7 @@ package io.xpipe.app.browser.action.impl; import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.browser.action.BrowserActionProvider; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.NonNull; import lombok.experimental.SuperBuilder; diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/NewLinkActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/NewLinkActionProvider.java index cf7bc834b..24014049c 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/NewLinkActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/NewLinkActionProvider.java @@ -4,7 +4,7 @@ import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.browser.action.BrowserActionProvider; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.ext.FileKind; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.NonNull; import lombok.experimental.SuperBuilder; diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeDetailsActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeDetailsActionProvider.java index 9de70d022..9eac63d16 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeDetailsActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeDetailsActionProvider.java @@ -8,7 +8,7 @@ import io.xpipe.app.ext.FileKind; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java index b2a6cd233..ed860c538 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java @@ -6,7 +6,7 @@ import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.file.BrowserFileOpener; import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.ext.FileKind; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java index 05e870e98..920afc1dc 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java @@ -5,7 +5,7 @@ import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.GlobalTimer; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.application.Platform; import javafx.css.PseudoClass; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserDialogs.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserDialogs.java index a70f0e648..cd9ecadd5 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserDialogs.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserDialogs.java @@ -4,7 +4,7 @@ import io.xpipe.app.comp.base.ModalButton; import io.xpipe.app.comp.base.ModalOverlay; import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.window.AppDialog; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileDuplicates.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileDuplicates.java index 9f06b46ee..343683325 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileDuplicates.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileDuplicates.java @@ -1,7 +1,7 @@ package io.xpipe.app.browser.file; import io.xpipe.app.ext.FileSystem; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.util.regex.Pattern; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java index da52a9639..063538ae0 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java @@ -6,8 +6,8 @@ import io.xpipe.app.ext.FileEntry; import io.xpipe.app.ext.FileInfo; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ElevationFunction; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import java.io.InputStream; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java index 6fbce30cb..27e93438a 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java @@ -7,7 +7,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.GlobalTimer; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.scene.Node; import javafx.scene.control.ContextMenu; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java index 8e303e5c7..09737bbc0 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java @@ -5,7 +5,7 @@ import io.xpipe.app.ext.FileEntry; import io.xpipe.app.ext.FileKind; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.Property; import javafx.beans.property.SimpleBooleanProperty; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java index 83fb45a5b..4ce07565c 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java @@ -9,7 +9,7 @@ import io.xpipe.app.platform.MenuHelper; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java index b3584a086..64d4b338e 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java @@ -9,8 +9,8 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ElevationFunction; import io.xpipe.app.process.ProcessOutputException; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import java.io.OutputStream; import java.util.List; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java index c570c8d4b..3a323609d 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java @@ -4,8 +4,8 @@ import io.xpipe.app.ext.FileEntry; import io.xpipe.app.ext.FileKind; import io.xpipe.app.ext.FileSystem; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import java.time.Instant; import java.util.List; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java index 0d9603e41..691ec41d9 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java @@ -1,6 +1,6 @@ package io.xpipe.app.browser.file; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanBinding; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java index 777c19e4a..cbc702eda 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java @@ -2,8 +2,8 @@ package io.xpipe.app.browser.file; import io.xpipe.app.core.AppCache; import io.xpipe.app.util.GlobalTimer; -import io.xpipe.core.FilePath; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.JacksonMapper; import javafx.application.Platform; import javafx.collections.FXCollections; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java index b6819fbae..02b6afd31 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java @@ -10,7 +10,7 @@ import io.xpipe.app.platform.InputHelper; import io.xpipe.app.platform.MenuHelper; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.util.GlobalTimer; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.binding.Bindings; import javafx.beans.property.ReadOnlyBooleanWrapper; 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 fcc896f52..ad37efe1c 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 @@ -18,9 +18,9 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.terminal.*; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java index f7a24443c..6c06033b2 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java @@ -6,7 +6,7 @@ import io.xpipe.app.ext.FileKind; import io.xpipe.app.ext.FileSystem; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.BooleanProperty; import javafx.beans.value.ChangeListener; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedState.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedState.java index 90ff71084..1f7314528 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedState.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedState.java @@ -1,6 +1,6 @@ package io.xpipe.app.browser.file; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.collections.ObservableList; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedStateImpl.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedStateImpl.java index 49b01704d..5411abab5 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedStateImpl.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedStateImpl.java @@ -1,7 +1,7 @@ package io.xpipe.app.browser.file; import io.xpipe.app.core.AppCache; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import javafx.collections.FXCollections; import javafx.collections.ObservableList; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java index 08e157e63..1b6da635d 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java @@ -4,7 +4,7 @@ import io.xpipe.app.ext.FileEntry; import io.xpipe.app.ext.FileKind; import io.xpipe.app.ext.FileSystem; import io.xpipe.app.ext.LocalStore; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.nio.file.Files; import java.nio.file.Path; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java index 7b580cb74..0aa1be29f 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java @@ -9,7 +9,7 @@ import io.xpipe.app.ext.FileEntry; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.platform.DerivedObservableList; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/BrowseInNativeManagerMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/BrowseInNativeManagerMenuProvider.java index 9921cc458..9ac3c1185 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/BrowseInNativeManagerMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/BrowseInNativeManagerMenuProvider.java @@ -8,7 +8,7 @@ import io.xpipe.app.browser.menu.BrowserMenuCategory; import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java index 2f47a126a..734d5bea1 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java @@ -10,7 +10,7 @@ import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/GradleRunMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/GradleRunMenuProvider.java index b6ec02b05..71c9b18c5 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/GradleRunMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/GradleRunMenuProvider.java @@ -10,7 +10,7 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.process.CommandBuilder; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/NewItemMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/NewItemMenuProvider.java index 305901803..e0bb2bd2d 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/NewItemMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/NewItemMenuProvider.java @@ -15,7 +15,7 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.platform.OptionsBuilder; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileDefaultMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileDefaultMenuProvider.java index 588d3dd62..d9e95bcb4 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileDefaultMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileDefaultMenuProvider.java @@ -8,7 +8,7 @@ import io.xpipe.app.browser.menu.BrowserMenuCategory; import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileWithMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileWithMenuProvider.java index a6710e8ea..fee45e128 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileWithMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileWithMenuProvider.java @@ -9,7 +9,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenNativeFileDetailsMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenNativeFileDetailsMenuProvider.java index 3d11c58cd..c22dc2191 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenNativeFileDetailsMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/OpenNativeFileDetailsMenuProvider.java @@ -8,7 +8,7 @@ import io.xpipe.app.browser.menu.BrowserMenuCategory; import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; 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 d30887909..1b3780eb2 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 @@ -8,7 +8,7 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/RenameMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/RenameMenuProvider.java index 36d6b3227..e30a02197 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/RenameMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/RenameMenuProvider.java @@ -7,7 +7,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/RunFileMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/RunFileMenuProvider.java index b3cff50d6..2e07f3a8f 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/RunFileMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/RunFileMenuProvider.java @@ -10,7 +10,7 @@ import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellDialects; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUntarMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUntarMenuProvider.java index 9fc8d2ae4..40b65dc07 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUntarMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUntarMenuProvider.java @@ -11,7 +11,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.process.OsFileSystem; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipUnixMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipUnixMenuProvider.java index 6b8024dbb..1329b380b 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipUnixMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipUnixMenuProvider.java @@ -11,7 +11,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.process.OsFileSystem; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipWindowsActionProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipWindowsActionProvider.java index 986a7497b..899cb4bfa 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipWindowsActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipWindowsActionProvider.java @@ -10,7 +10,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.process.OsFileSystem; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; 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 c0400806e..dbf2c81b5 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 @@ -8,7 +8,7 @@ import io.xpipe.app.comp.base.ModalOverlay; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.FileKind; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipActionProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipActionProvider.java index 8e4f54bfb..5ef22b080 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipActionProvider.java @@ -3,12 +3,8 @@ package io.xpipe.app.browser.menu.impl.compress; import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.browser.action.BrowserActionProvider; import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.process.CommandBuilder; -import io.xpipe.app.process.ShellControl; -import io.xpipe.app.process.ShellDialects; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipUnixMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipUnixMenuProvider.java index 7bb6ada13..ad74fc67d 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipUnixMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GunzipUnixMenuProvider.java @@ -10,8 +10,7 @@ import io.xpipe.app.browser.menu.BrowserMenuCategory; import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.app.process.OsFileSystem; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GzipActionProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GzipActionProvider.java index d692909cc..1ab589db6 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GzipActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/compress/GzipActionProvider.java @@ -4,7 +4,7 @@ import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.browser.action.BrowserActionProvider; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.process.CommandBuilder; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.NonNull; import lombok.experimental.SuperBuilder; 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 88871e3c9..94b964da5 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 @@ -4,7 +4,7 @@ import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.browser.action.BrowserActionProvider; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.process.CommandBuilder; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.NonNull; import lombok.experimental.SuperBuilder; 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 aff0d2601..aaf56bff8 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 @@ -5,7 +5,7 @@ import io.xpipe.app.browser.action.BrowserActionProvider; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; 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 ae99147f7..b5d404d8d 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 @@ -7,8 +7,8 @@ import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellDialects; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; 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 a3c3df4ae..2913c7006 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 @@ -6,8 +6,8 @@ import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.ext.FileKind; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellDialects; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.NonNull; import lombok.experimental.SuperBuilder; diff --git a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java index ed10f8dcc..264d6ada6 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java @@ -15,7 +15,7 @@ import io.xpipe.app.storage.ContextualFileReference; import io.xpipe.app.storage.DataStorageSyncHandler; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/comp/base/LazyTextFieldComp.java b/app/src/main/java/io/xpipe/app/comp/base/LazyTextFieldComp.java index 3e2a031a3..7d370187e 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/LazyTextFieldComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/LazyTextFieldComp.java @@ -3,7 +3,7 @@ package io.xpipe.app.comp.base; import io.xpipe.app.comp.RegionStructure; import io.xpipe.app.comp.RegionStructureBuilder; import io.xpipe.app.platform.PlatformThread; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java index 24fb166ff..104ab232f 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java @@ -291,11 +291,11 @@ public class ListBoxViewComp extends RegionBuilder { } } - if (pane.getScene().getHeight() > 200) { + if (pane.getScene().getHeight() > 300) { var sceneNodeBounds = node.localToScene(node.getBoundsInLocal()); // Add some margin to preload - if (sceneNodeBounds.getMaxY() < -250 - || sceneNodeBounds.getMinY() > pane.getScene().getHeight() + 250) { + if (sceneNodeBounds.getMaxY() < -300 + || sceneNodeBounds.getMinY() > pane.getScene().getHeight() + 300) { return false; } } diff --git a/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java b/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java index 602f628c7..066059d09 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java @@ -9,7 +9,7 @@ import io.xpipe.app.platform.MarkdownHelper; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.Hyperlinks; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; diff --git a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java index fd4405299..aa1b1cac5 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java @@ -8,7 +8,7 @@ import io.xpipe.app.core.AppLogs; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.util.BooleanScope; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.animation.Timeline; import javafx.application.Platform; diff --git a/app/src/main/java/io/xpipe/app/comp/base/PrettyImageComp.java b/app/src/main/java/io/xpipe/app/comp/base/PrettyImageComp.java index 101d84e5b..894753dd1 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/PrettyImageComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/PrettyImageComp.java @@ -5,7 +5,7 @@ import io.xpipe.app.core.AppImages; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleStringProperty; diff --git a/app/src/main/java/io/xpipe/app/comp/base/PrettyImageHelper.java b/app/src/main/java/io/xpipe/app/comp/base/PrettyImageHelper.java index a9789f55b..6ce29bab9 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/PrettyImageHelper.java +++ b/app/src/main/java/io/xpipe/app/comp/base/PrettyImageHelper.java @@ -4,7 +4,7 @@ import io.xpipe.app.comp.BaseRegionBuilder; import io.xpipe.app.core.AppDisplayScale; import io.xpipe.app.core.AppImages; import io.xpipe.app.platform.BindingsHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.ReadOnlyStringWrapper; import javafx.beans.property.SimpleStringProperty; diff --git a/app/src/main/java/io/xpipe/app/comp/base/SecretFieldComp.java b/app/src/main/java/io/xpipe/app/comp/base/SecretFieldComp.java index c97dc743e..0ba2b2720 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/SecretFieldComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/SecretFieldComp.java @@ -7,7 +7,7 @@ import io.xpipe.app.comp.RegionStructureBuilder; import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.ClipboardHelper; import io.xpipe.app.platform.PlatformThread; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; import javafx.application.Platform; import javafx.beans.property.ObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/comp/base/TestButtonComp.java b/app/src/main/java/io/xpipe/app/comp/base/TestButtonComp.java index 0e2cf1c8f..da997b0c0 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/TestButtonComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/TestButtonComp.java @@ -4,7 +4,7 @@ import io.xpipe.app.comp.RegionBuilder; import io.xpipe.app.core.AppI18n; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FailableSupplier; +import io.xpipe.app.util.FailableSupplier; import javafx.application.Platform; import javafx.geometry.Insets; diff --git a/app/src/main/java/io/xpipe/app/core/AppAotTrain.java b/app/src/main/java/io/xpipe/app/core/AppAotTrain.java index ff2a6403d..b8821beb7 100644 --- a/app/src/main/java/io/xpipe/app/core/AppAotTrain.java +++ b/app/src/main/java/io/xpipe/app/core/AppAotTrain.java @@ -4,7 +4,7 @@ import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppAotTrain { diff --git a/app/src/main/java/io/xpipe/app/core/AppArguments.java b/app/src/main/java/io/xpipe/app/core/AppArguments.java index 476532412..e69b89696 100644 --- a/app/src/main/java/io/xpipe/app/core/AppArguments.java +++ b/app/src/main/java/io/xpipe/app/core/AppArguments.java @@ -2,7 +2,7 @@ package io.xpipe.app.core; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.LogErrorHandler; -import io.xpipe.core.XPipeDaemonMode; +import io.xpipe.app.util.XPipeDaemonMode; import lombok.Value; import picocli.CommandLine; @@ -20,13 +20,15 @@ public class AppArguments { private static final Pattern PROPERTY_PATTERN = Pattern.compile("^-[DP](.+)=(.+)$"); List rawArgs; List resolvedArgs; - List openArgs; + List daemonOpenArgs; public static AppArguments init(String[] args) { var rawArgs = Arrays.asList(args); var resolvedArgs = Arrays.asList(parseProperties(args)); - var command = LauncherCommand.resolveLauncher(resolvedArgs.toArray(String[]::new)); - return new AppArguments(rawArgs, resolvedArgs, command.inputs); + var isDaemon = Boolean.getBoolean("io.xpipe.app.isDaemon"); + var openArgs = !isDaemon ? List.of() : + LauncherCommand.resolveLauncher(resolvedArgs.toArray(String[]::new)).inputs; + return new AppArguments(rawArgs, resolvedArgs, openArgs); } private static String[] parseProperties(String[] args) { diff --git a/app/src/main/java/io/xpipe/app/core/AppCache.java b/app/src/main/java/io/xpipe/app/core/AppCache.java index 0fb9d3a9e..9cb95a8f6 100644 --- a/app/src/main/java/io/xpipe/app/core/AppCache.java +++ b/app/src/main/java/io/xpipe/app/core/AppCache.java @@ -1,7 +1,7 @@ package io.xpipe.app.core; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java b/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java index 5a4ad9db8..90c351886 100644 --- a/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java +++ b/app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java @@ -8,7 +8,7 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.platform.PlatformState; import io.xpipe.app.prefs.*; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.scene.layout.Region; diff --git a/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java b/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java index 040fc7716..4de2dff13 100644 --- a/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java +++ b/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java @@ -6,7 +6,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.platform.PlatformState; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.awt.*; import java.awt.desktop.*; diff --git a/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java b/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java index 6d51487d3..91bef2dbc 100644 --- a/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java +++ b/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java @@ -3,8 +3,8 @@ package io.xpipe.app.core; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.util.Hyperlinks; -import io.xpipe.core.FailableConsumer; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableConsumer; +import io.xpipe.app.util.OsType; import java.nio.file.Files; import java.nio.file.Path; diff --git a/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java b/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java index 01dadc450..c8f45f557 100644 --- a/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java +++ b/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java @@ -6,7 +6,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.util.LocalExec; import io.xpipe.app.util.ModuleAccess; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/core/AppFontSizes.java b/app/src/main/java/io/xpipe/app/core/AppFontSizes.java index 79e68236a..44fef9b69 100644 --- a/app/src/main/java/io/xpipe/app/core/AppFontSizes.java +++ b/app/src/main/java/io/xpipe/app/core/AppFontSizes.java @@ -1,7 +1,7 @@ package io.xpipe.app.core; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.scene.Node; diff --git a/app/src/main/java/io/xpipe/app/core/AppInstallation.java b/app/src/main/java/io/xpipe/app/core/AppInstallation.java index b9f98bca7..746c21760 100644 --- a/app/src/main/java/io/xpipe/app/core/AppInstallation.java +++ b/app/src/main/java/io/xpipe/app/core/AppInstallation.java @@ -1,6 +1,6 @@ package io.xpipe.app.core; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.io.IOException; import java.nio.file.Files; @@ -185,13 +185,13 @@ public abstract class AppInstallation { } @Override - public Path getLangPath() { - return getBaseInstallationPath().resolve("lang"); + public Path getCliExecutablePath() { + return getBaseInstallationPath().resolve("xpipe.exe"); } @Override - public Path getCliExecutablePath() { - return getBaseInstallationPath().resolve("bin", "xpipe.exe"); + public Path getLangPath() { + return getBaseInstallationPath().resolve("lang"); } @Override @@ -243,13 +243,13 @@ public abstract class AppInstallation { } @Override - public Path getLangPath() { - return getBaseInstallationPath().resolve("lang"); + public Path getCliExecutablePath() { + return getBaseInstallationPath().resolve("bin", "xpipe"); } @Override - public Path getCliExecutablePath() { - return getBaseInstallationPath().resolve("bin", "xpipe"); + public Path getLangPath() { + return getBaseInstallationPath().resolve("lang"); } @Override @@ -303,6 +303,11 @@ public abstract class AppInstallation { AppNames.ofCurrent().getExecutableName() + "_debug.sh"); } + @Override + public Path getCliExecutablePath() { + return getBaseInstallationPath().resolve("Contents", "MacOS", "xpipe"); + } + @Override public Path getLangPath() { if (!AppProperties.get().isImage()) { @@ -312,11 +317,6 @@ public abstract class AppInstallation { return getBaseInstallationPath().resolve("Contents", "Resources", "lang"); } - @Override - public Path getCliExecutablePath() { - return getBaseInstallationPath().resolve("Contents", "MacOS", "xpipe"); - } - @Override public Path getDaemonExecutablePath() { return getBaseInstallationPath() diff --git a/app/src/main/java/io/xpipe/app/core/AppInstance.java b/app/src/main/java/io/xpipe/app/core/AppInstance.java index 084545b07..13363f21e 100644 --- a/app/src/main/java/io/xpipe/app/core/AppInstance.java +++ b/app/src/main/java/io/xpipe/app/core/AppInstance.java @@ -1,23 +1,18 @@ package io.xpipe.app.core; -import io.xpipe.app.beacon.AppBeaconServer; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.beacon.BeaconClient; -import io.xpipe.beacon.BeaconClientInformation; -import io.xpipe.beacon.BeaconConfig; -import io.xpipe.beacon.BeaconServer; -import io.xpipe.beacon.api.DaemonFocusExchange; -import io.xpipe.beacon.api.DaemonOpenExchange; -import io.xpipe.core.OsType; +import io.xpipe.app.beacon.BeaconClient; +import io.xpipe.app.beacon.BeaconClientInformation; +import io.xpipe.app.beacon.BeaconServer; +import io.xpipe.app.beacon.api.DaemonFocusExchange; +import io.xpipe.app.beacon.api.DaemonOpenExchange; +import io.xpipe.app.util.OsType; import java.awt.*; -import java.io.RandomAccessFile; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.List; import java.util.Optional; @@ -30,7 +25,7 @@ public class AppInstance { public static Optional tryEstablishConnection(int port) { try { return Optional.of(BeaconClient.establishConnection( - port, BeaconClientInformation.Daemon.builder().build())); + port, BeaconClientInformation.Daemon.builder().build(), AppProperties.get().getBeaconAuthFile())); } catch (Exception ex) { ErrorEventFactory.fromThrowable(ex).omit().expected().handle(); return Optional.empty(); @@ -38,40 +33,17 @@ public class AppInstance { } private static void checkStart(int attemptCounter) { - var port = BeaconConfig.getUsedPort(); + var port = AppProperties.get().getDefaultBeaconPort(); var reachable = BeaconServer.isReachable(port); - if (reachable) { - // If an instance is running as another user, we cannot connect to it as the xpipe_auth file is inaccessible - var authFile = BeaconConfig.getLocalBeaconAuthFile(); - var hasAuthFile = Files.exists(authFile); - - // Make sure that it is not a leftover - if (hasAuthFile) { - try (var channel = new RandomAccessFile(BeaconConfig.getLocalBeaconLockFile().toFile(), "rw").getChannel()) { - var lock = channel.tryLock(); - if (lock != null) { - lock.release(); - Files.delete(authFile); - hasAuthFile = false; - } - } catch (Exception ignored) {} - } - - if (!hasAuthFile) { - var replacement = BeaconConfig.fallBackToAnotherPort(); - if (replacement.isEmpty()) { - ErrorEventFactory.fromMessage("Unable to find free beacon port") - .term() - .documentationLink(DocumentationLink.BEACON_PORT_BIND) - .expected() - .handle(); - AppOperationMode.halt(1); - } else { - port = replacement.getAsInt(); - reachable = false; - } - } + var effectiveBeaconPort = AppProperties.get().queryEffectiveBeaconPort(reachable); + if (effectiveBeaconPort.isEmpty()) { + ErrorEventFactory.fromMessage("Unable to find free beacon port") + .term() + .documentationLink(DocumentationLink.BEACON_PORT_BIND) + .expected() + .handle(); + AppOperationMode.halt(1); } if (!reachable) { @@ -99,7 +71,7 @@ public class AppInstance { } try { - var inputs = AppProperties.get().getArguments().getOpenArgs(); + var inputs = AppProperties.get().getArguments().getDaemonOpenArgs(); // Assume that we want to open the GUI if we launched again client.get().performRequest(DaemonFocusExchange.Request.builder().build()); if (!inputs.isEmpty()) { diff --git a/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java b/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java index c3c0cd594..2dd7f339a 100644 --- a/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java +++ b/app/src/main/java/io/xpipe/app/core/AppLocalTemp.java @@ -1,7 +1,7 @@ package io.xpipe.app.core; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.io.IOException; import java.nio.file.Files; diff --git a/app/src/main/java/io/xpipe/app/core/AppOpenArguments.java b/app/src/main/java/io/xpipe/app/core/AppOpenArguments.java index 4d8e0a8b2..fa9dea45e 100644 --- a/app/src/main/java/io/xpipe/app/core/AppOpenArguments.java +++ b/app/src/main/java/io/xpipe/app/core/AppOpenArguments.java @@ -7,7 +7,7 @@ import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.storage.DataStorage; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.net.URI; import java.nio.file.Files; @@ -21,7 +21,7 @@ public class AppOpenArguments { private static final List bufferedArguments = new ArrayList<>(); public static synchronized void init() { - handleImpl(AppProperties.get().getArguments().getOpenArgs()); + handleImpl(AppProperties.get().getArguments().getDaemonOpenArgs()); handleImpl(bufferedArguments); bufferedArguments.clear(); } diff --git a/app/src/main/java/io/xpipe/app/core/AppPreloader.java b/app/src/main/java/io/xpipe/app/core/AppPreloader.java index 42945f823..a83a6481c 100644 --- a/app/src/main/java/io/xpipe/app/core/AppPreloader.java +++ b/app/src/main/java/io/xpipe/app/core/AppPreloader.java @@ -1,7 +1,7 @@ package io.xpipe.app.core; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Preloader; import javafx.stage.Stage; diff --git a/app/src/main/java/io/xpipe/app/core/AppProperties.java b/app/src/main/java/io/xpipe/app/core/AppProperties.java index b3c0b88fd..963a3521d 100644 --- a/app/src/main/java/io/xpipe/app/core/AppProperties.java +++ b/app/src/main/java/io/xpipe/app/core/AppProperties.java @@ -3,11 +3,17 @@ package io.xpipe.app.core; import io.xpipe.app.core.check.AppDirectoryPermissionsCheck; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.XPipeDaemonMode; +import io.xpipe.app.beacon.BeaconServer; +import io.xpipe.app.util.OsType; +import io.xpipe.app.util.XPipeDaemonMode; +import lombok.AccessLevel; +import lombok.Getter; import lombok.Value; +import lombok.experimental.NonFinal; import java.io.IOException; +import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; @@ -56,6 +62,15 @@ public class AppProperties { boolean logPlatformDebug; String logLevel; String loginTarget; + int defaultBeaconPort; + Path beaconAuthFile; + Path beaconLockFile; + boolean debugCli; + boolean isDaemon; + boolean isCli; + @NonFinal + @Getter(AccessLevel.PRIVATE) + Integer effectiveBeaconPort; public AppProperties(String[] args) { var appDir = Path.of(System.getProperty("user.dir")).resolve("app"); @@ -158,6 +173,12 @@ public class AppProperties { .orElse("info"); loginTarget = Optional.ofNullable(System.getProperty(AppNames.propertyName("login"))) .orElse(null); + isCli = Optional.ofNullable(System.getProperty(AppNames.propertyName("isCli"))) + .map(Boolean::parseBoolean) + .orElse(false); + isDaemon = Optional.ofNullable(System.getProperty(AppNames.propertyName("isDaemon"))) + .map(Boolean::parseBoolean) + .orElse(!isCli); // We require the user dir from here AppDirectoryPermissionsCheck.checkDirectory(dataDir); @@ -180,6 +201,94 @@ public class AppProperties { .orElse(false); explicitMode = XPipeDaemonMode.getIfPresent(System.getProperty(AppNames.propertyName("mode"))) .orElse(null); + defaultBeaconPort = getDefaultBeaconPort(staging); + beaconAuthFile = getLocalBeaconAuthFile(staging); + beaconLockFile = beaconAuthFile.getParent().resolve("lock"); + clearLeftoverAuthFile(); + debugCli = Optional.ofNullable(System.getProperty(AppNames.propertyName("debugCli"))) + .map(Boolean::parseBoolean) + .orElse(false); + } + + public OptionalInt queryEffectiveBeaconPort(boolean reachable) { + if (effectiveBeaconPort != null) { + return OptionalInt.of(effectiveBeaconPort); + } + + if (!reachable) { + effectiveBeaconPort = getDefaultBeaconPort(); + return OptionalInt.of(effectiveBeaconPort); + } + + var authFile = getBeaconAuthFile(); + if (Files.exists(authFile)) { + effectiveBeaconPort = getDefaultBeaconPort(); + return OptionalInt.of(effectiveBeaconPort); + } + + var hasEnv = System.getenv("BEACON_PORT") != null || System.getenv("XPIPE_BEACON_PORT") != null; + if (hasEnv) { + effectiveBeaconPort = getDefaultBeaconPort(); + return OptionalInt.of(effectiveBeaconPort); + } + + var start = 21723; + for (int i = 0; i < 20; i++) { + var p = start + i; + var occupied = BeaconServer.isReachable(p); + if (!occupied) { + effectiveBeaconPort = p; + return OptionalInt.of(p); + } + } + return OptionalInt.empty(); + } + + private void clearLeftoverAuthFile() { + var hasAuthFile = Files.exists(beaconAuthFile); + if (hasAuthFile) { + try (var channel = new RandomAccessFile(beaconLockFile.toFile(), "rw").getChannel()) { + var lock = channel.tryLock(); + if (lock != null) { + lock.release(); + Files.delete(beaconAuthFile); + } + } catch (Exception ignored) { + } + } + } + + private static int getDefaultBeaconPort(boolean staging) { + var customPortVar = System.getenv("XPIPE_BEACON_PORT"); + Integer customPort = null; + if (customPortVar != null) { + try { + customPort = Integer.parseInt(customPortVar); + } catch (NumberFormatException ignored) { + } + } + + var rawPortProp = System.getProperty(AppNames.propertyName("beaconPort")); + if (customPort == null && rawPortProp != null) { + try { + var parsed = Integer.parseInt(rawPortProp); + customPort = parsed; + } catch (NumberFormatException ignored) { + } + } + + var effectivePort = customPort != null ? customPort : 21721 + (staging ? 1 : 0);; + return effectivePort; + } + + private static Path getLocalBeaconAuthFile(boolean staging) { + if (OsType.ofLocal() == OsType.LINUX) { + var name = AppSystemInfo.ofCurrent().getUser(); + return AppSystemInfo.ofCurrent().getTemp().resolve(staging ? "xpipe-ptb" : "xpipe", name, "beacon-auth"); + } else { + var path = AppSystemInfo.ofCurrent().getTemp().resolve(staging ? "xpipe-ptb" : "xpipe", "beacon-auth"); + return path; + } } private static boolean isJUnitTest() { @@ -222,7 +331,7 @@ public class AppProperties { TrackEvent.withInfo("Received arguments") .tag("raw", arguments.getRawArgs()) .tag("resolved", arguments.getResolvedArgs()) - .tag("resolvedCommand", arguments.getOpenArgs()) + .tag("resolvedCommand", arguments.getDaemonOpenArgs()) .handle(); for (var e : System.getProperties().entrySet()) { diff --git a/app/src/main/java/io/xpipe/app/core/AppResources.java b/app/src/main/java/io/xpipe/app/core/AppResources.java index be65d257e..688940329 100644 --- a/app/src/main/java/io/xpipe/app/core/AppResources.java +++ b/app/src/main/java/io/xpipe/app/core/AppResources.java @@ -1,7 +1,7 @@ package io.xpipe.app.core; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.FailableConsumer; +import io.xpipe.app.util.FailableConsumer; import io.xpipe.modulefs.ModuleFileSystem; import java.io.IOException; diff --git a/app/src/main/java/io/xpipe/app/core/AppRestart.java b/app/src/main/java/io/xpipe/app/core/AppRestart.java index a08ee84b3..958102ad2 100644 --- a/app/src/main/java/io/xpipe/app/core/AppRestart.java +++ b/app/src/main/java/io/xpipe/app/core/AppRestart.java @@ -3,7 +3,7 @@ package io.xpipe.app.core; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.process.*; import io.xpipe.app.update.AppDistributionType; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.nio.file.Path; import java.util.ArrayList; diff --git a/app/src/main/java/io/xpipe/app/core/AppSid.java b/app/src/main/java/io/xpipe/app/core/AppSid.java index 2e1848cfa..a103b1c0b 100644 --- a/app/src/main/java/io/xpipe/app/core/AppSid.java +++ b/app/src/main/java/io/xpipe/app/core/AppSid.java @@ -2,7 +2,7 @@ package io.xpipe.app.core; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.sun.jna.Function; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java b/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java index 8dd396c49..ca204873b 100644 --- a/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java +++ b/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java @@ -3,7 +3,7 @@ package io.xpipe.app.core; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.LocalShell; import io.xpipe.app.util.LocalExec; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.sun.jna.platform.win32.*; diff --git a/app/src/main/java/io/xpipe/app/core/AppTheme.java b/app/src/main/java/io/xpipe/app/core/AppTheme.java index cb3d86426..f32417ae6 100644 --- a/app/src/main/java/io/xpipe/app/core/AppTheme.java +++ b/app/src/main/java/io/xpipe/app/core/AppTheme.java @@ -7,7 +7,7 @@ import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.platform.ColorHelper; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Application; import javafx.application.ColorScheme; diff --git a/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java b/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java index 6ac0121f2..bb7bab7c3 100644 --- a/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java +++ b/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java @@ -2,7 +2,7 @@ package io.xpipe.app.core; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.awt.*; import java.io.IOException; diff --git a/app/src/main/java/io/xpipe/app/core/check/AppAndroidLinuxTerminalCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppAndroidLinuxTerminalCheck.java index 642bce30c..b0795a622 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppAndroidLinuxTerminalCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppAndroidLinuxTerminalCheck.java @@ -3,7 +3,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.core.AppProperties; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.LocalExec; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppAndroidLinuxTerminalCheck { diff --git a/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java index 5243388ee..f0410c3a3 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java @@ -9,7 +9,7 @@ import io.xpipe.app.core.AppProperties; import io.xpipe.app.core.AppResources; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.WindowsRegistry; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.scene.layout.Region; diff --git a/app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java index c0ca99e6d..23d0d176d 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java @@ -1,7 +1,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import org.apache.commons.io.FileUtils; diff --git a/app/src/main/java/io/xpipe/app/core/check/AppHardwareAccelerationDisableCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppHardwareAccelerationDisableCheck.java index 563de6eff..8a2a429c5 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppHardwareAccelerationDisableCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppHardwareAccelerationDisableCheck.java @@ -2,7 +2,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.core.AppCache; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppHardwareAccelerationDisableCheck { diff --git a/app/src/main/java/io/xpipe/app/core/check/AppPathCorruptCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppPathCorruptCheck.java index 852948973..dc6bc322f 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppPathCorruptCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppPathCorruptCheck.java @@ -2,7 +2,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.LocalExec; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppPathCorruptCheck { diff --git a/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java index e3283786e..f3c49e595 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java @@ -4,7 +4,7 @@ import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.LocalShell; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppRosettaCheck { diff --git a/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java index 5ce93ec03..5dd2d5e7f 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java @@ -1,7 +1,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.core.AppNames; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppShellCheck { diff --git a/app/src/main/java/io/xpipe/app/core/check/AppSystemFontCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppSystemFontCheck.java index 806d62a83..c575306a1 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppSystemFontCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppSystemFontCheck.java @@ -1,7 +1,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.core.AppInstallation; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.util.concurrent.TimeUnit; diff --git a/app/src/main/java/io/xpipe/app/core/check/AppTestCommandCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppTestCommandCheck.java index 1e5123f3f..2441f9ae3 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppTestCommandCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppTestCommandCheck.java @@ -5,7 +5,7 @@ import io.xpipe.app.core.AppNames; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ProcessOutputException; import io.xpipe.app.update.AppDistributionType; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppTestCommandCheck { diff --git a/app/src/main/java/io/xpipe/app/core/check/AppWindowsArmCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppWindowsArmCheck.java index 1da49eec5..f76331a3e 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppWindowsArmCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppWindowsArmCheck.java @@ -3,7 +3,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class AppWindowsArmCheck { diff --git a/app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java index cab325f52..ecaa5a306 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java @@ -2,7 +2,7 @@ package io.xpipe.app.core.check; import io.xpipe.app.core.AppSystemInfo; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.io.IOException; import java.nio.file.Files; diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java index 32e6ef519..585993cdc 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java @@ -36,7 +36,7 @@ import io.xpipe.app.update.UpdateAvailableDialog; import io.xpipe.app.update.UpdateChangelogDialog; import io.xpipe.app.update.UpdateNagDialog; import io.xpipe.app.util.*; -import io.xpipe.core.XPipeDaemonMode; +import io.xpipe.app.util.XPipeDaemonMode; import java.util.concurrent.CountDownLatch; diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java index f447919e8..d121d7f08 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java @@ -6,7 +6,7 @@ import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.platform.PlatformInit; import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.util.LicenseProvider; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.stage.Stage; diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java index 35c3b6e63..61f949cd4 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java @@ -1,9 +1,10 @@ package io.xpipe.app.core.mode; -import io.xpipe.app.beacon.AppBeaconServer; import io.xpipe.app.core.*; import io.xpipe.app.core.check.AppDebugModeCheck; import io.xpipe.app.core.window.AppMainWindow; +import io.xpipe.app.ext.CliProvider; +import io.xpipe.app.ext.ExtensionException; import io.xpipe.app.issue.*; import io.xpipe.app.platform.PlatformInit; import io.xpipe.app.platform.PlatformState; @@ -15,8 +16,9 @@ import io.xpipe.app.process.LocalShell; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.update.AppDistributionType; import io.xpipe.app.util.*; -import io.xpipe.core.FailableRunnable; -import io.xpipe.core.XPipeDaemonMode; +import io.xpipe.app.util.FailableRunnable; +import io.xpipe.app.util.ModuleLayerLoader; +import io.xpipe.app.util.XPipeDaemonMode; import javafx.application.Platform; @@ -67,52 +69,67 @@ public abstract class AppOperationMode { private static void setup(String[] args) { try { - // Only for handling SIGTERM - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - externalShutdown(); - })); + // Ugly, but we haven't initialized anything yet + if (Boolean.getBoolean("io.xpipe.app.isDaemon")) { + // Only for handling SIGTERM + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + externalShutdown(); + })); - // Handle uncaught exceptions - Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> { - // It seems like a few exceptions are thrown in the quantum renderer - // when in shutdown. We can ignore these - if (AppOperationMode.isInShutdown() - && Platform.isFxApplicationThread() - && ex instanceof NullPointerException) { - return; + // Handle uncaught exceptions + Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> { + // It seems like a few exceptions are thrown in the quantum renderer + // when in shutdown. We can ignore these + if (AppOperationMode.isInShutdown() && Platform.isFxApplicationThread() && ex instanceof NullPointerException) { + return; + } + + // It seems like a few exceptions are thrown in the quantum renderer + // when the screen configuration changes + if (Platform.isFxApplicationThread() && ex instanceof IllegalArgumentException && ex.getStackTrace()[0].toString().contains( + "Rectangle2D")) { + return; + } + + // Some random AWT errors are thrown sometimes + if (ex instanceof AWTError) { + return; + } + + // Handle any startup uncaught errors + if (AppOperationMode.isInStartup() && thread.threadId() == 1) { + ex.printStackTrace(); + AppOperationMode.halt(1); + } + + if (ex instanceof OutOfMemoryError) { + ex.printStackTrace(); + AppOperationMode.halt(1); + } + + ErrorEventFactory.fromThrowable(ex).unhandled(true).build().handle(); + }); + } + + AppProperties.init(args); + + if (AppProperties.get().isCli()) { + ModuleLayerLoader.loadAll(ModuleLayer.boot(), throwable -> throwable.printStackTrace()); + var cli = CliProvider.get(); + if (cli == null) { + throw ExtensionException.corrupt("Missing cli module"); } - - // It seems like a few exceptions are thrown in the quantum renderer - // when the screen configuration changes - if (Platform.isFxApplicationThread() - && ex instanceof IllegalArgumentException - && ex.getStackTrace()[0].toString().contains("Rectangle2D")) { - return; + var r = cli.execute(AppProperties.get().getArguments().getResolvedArgs().toArray(String[]::new)); + if (AppProperties.get().isAotTrainMode()) { + r = 0; } - - // Some random AWT errors are thrown sometimes - if (ex instanceof AWTError) { - return; - } - - // Handle any startup uncaught errors - if (AppOperationMode.isInStartup() && thread.threadId() == 1) { - ex.printStackTrace(); - AppOperationMode.halt(1); - } - - if (ex instanceof OutOfMemoryError) { - ex.printStackTrace(); - AppOperationMode.halt(1); - } - - ErrorEventFactory.fromThrowable(ex).unhandled(true).build().handle(); - }); + halt(r); + return; + } TrackEvent.info("Initial setup"); AppMainWindow.loadingText("initializingApp"); GlobalTimer.init(); - AppProperties.init(args); PlatformThreadWatcher.init(); AppLogs.init(); AppDebugModeCheck.printIfNeeded(); @@ -273,7 +290,6 @@ public abstract class AppOperationMode { public static void halt(int code) { synchronized (HALT_LOCK) { - TrackEvent.info("Halting now!"); AppLogs.teardown(); Runtime.getRuntime().halt(code); } diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java index cbcba3370..078ee1b0f 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java @@ -4,7 +4,7 @@ import io.xpipe.app.core.AppTray; import io.xpipe.app.issue.*; import io.xpipe.app.platform.PlatformInit; import io.xpipe.app.platform.PlatformThread; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.awt.*; diff --git a/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java b/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java index ea7b73737..2c62adb35 100644 --- a/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java +++ b/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java @@ -11,7 +11,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.update.AppDistributionType; import io.xpipe.app.util.GlobalTimer; import io.xpipe.app.util.NativeWinWindowControl; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/core/window/AppModifiedStage.java b/app/src/main/java/io/xpipe/app/core/window/AppModifiedStage.java index 580a306a3..16561f825 100644 --- a/app/src/main/java/io/xpipe/app/core/window/AppModifiedStage.java +++ b/app/src/main/java/io/xpipe/app/core/window/AppModifiedStage.java @@ -6,7 +6,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.NativeMacOsWindowControl; import io.xpipe.app.util.NativeWinWindowControl; import io.xpipe.app.util.RemoteDesktopWindow; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.animation.PauseTransition; import javafx.application.Platform; diff --git a/app/src/main/java/io/xpipe/app/core/window/AppWindowBounds.java b/app/src/main/java/io/xpipe/app/core/window/AppWindowBounds.java index a38394b89..8a7bbad8c 100644 --- a/app/src/main/java/io/xpipe/app/core/window/AppWindowBounds.java +++ b/app/src/main/java/io/xpipe/app/core/window/AppWindowBounds.java @@ -1,6 +1,6 @@ package io.xpipe.app.core.window; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.geometry.Rectangle2D; import javafx.stage.Screen; diff --git a/app/src/main/java/io/xpipe/app/core/window/AppWindowStyle.java b/app/src/main/java/io/xpipe/app/core/window/AppWindowStyle.java index a04609d6f..cbe4a5ccb 100644 --- a/app/src/main/java/io/xpipe/app/core/window/AppWindowStyle.java +++ b/app/src/main/java/io/xpipe/app/core/window/AppWindowStyle.java @@ -4,7 +4,7 @@ import io.xpipe.app.core.*; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.GlobalTimer; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.binding.Bindings; @@ -23,7 +23,7 @@ import java.util.List; public class AppWindowStyle { public static void setSceneFill(Scene scene) { - if (OsType.ofLocal() != OsType.LINUX) { + if (OsType.ofLocal() != OsType.LINUX || AppPrefs.get() == null) { scene.setFill(Color.TRANSPARENT); return; } @@ -31,8 +31,7 @@ public class AppWindowStyle { scene.fillProperty() .bind(Bindings.createObjectBinding( () -> { - return AppPrefs.get() != null - && AppPrefs.get().theme().getValue().isDark() + return AppPrefs.get().theme().getValue().isDark() ? Color.BLACK : Color.WHITE; }, diff --git a/app/src/main/java/io/xpipe/app/cred/CertificateKeyFileStrategy.java b/app/src/main/java/io/xpipe/app/cred/CertificateKeyFileStrategy.java index 77e460d40..d5b21399f 100644 --- a/app/src/main/java/io/xpipe/app/cred/CertificateKeyFileStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/CertificateKeyFileStrategy.java @@ -19,9 +19,9 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.LicenseProvider; import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.Validators; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/cred/CustomAgentStrategy.java b/app/src/main/java/io/xpipe/app/cred/CustomAgentStrategy.java index ad9d94f4b..8ee1ebb4b 100644 --- a/app/src/main/java/io/xpipe/app/cred/CustomAgentStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/CustomAgentStrategy.java @@ -12,9 +12,9 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.Validators; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/cred/GpgAgentStrategy.java b/app/src/main/java/io/xpipe/app/cred/GpgAgentStrategy.java index 1ff187899..7149a3907 100644 --- a/app/src/main/java/io/xpipe/app/cred/GpgAgentStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/GpgAgentStrategy.java @@ -1,15 +1,13 @@ package io.xpipe.app.cred; -import io.xpipe.app.comp.base.TextFieldComp; import io.xpipe.app.core.AppSystemInfo; import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.app.util.LicenseProvider; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; diff --git a/app/src/main/java/io/xpipe/app/cred/InPlaceKeyStrategy.java b/app/src/main/java/io/xpipe/app/cred/InPlaceKeyStrategy.java index bec0a0480..221622a12 100644 --- a/app/src/main/java/io/xpipe/app/cred/InPlaceKeyStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/InPlaceKeyStrategy.java @@ -13,11 +13,7 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.secret.SecretRetrievalStrategy; import io.xpipe.app.secret.SecretStrategyChoiceConfig; -import io.xpipe.app.util.DocumentationLink; -import io.xpipe.app.util.LocalFileTracker; -import io.xpipe.app.util.ThreadHelper; -import io.xpipe.app.util.Validators; -import io.xpipe.core.*; +import io.xpipe.app.util.*; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/cred/KeyFileStrategy.java b/app/src/main/java/io/xpipe/app/cred/KeyFileStrategy.java index de514f3f1..ab09cc735 100644 --- a/app/src/main/java/io/xpipe/app/cred/KeyFileStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/KeyFileStrategy.java @@ -20,9 +20,9 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.Validators; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/cred/NoIdentityStrategy.java b/app/src/main/java/io/xpipe/app/cred/NoIdentityStrategy.java index 02c4b7a9d..6232294da 100644 --- a/app/src/main/java/io/xpipe/app/cred/NoIdentityStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/NoIdentityStrategy.java @@ -2,7 +2,7 @@ package io.xpipe.app.cred; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.KeyValue; +import io.xpipe.app.util.KeyValue; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/cred/OpenSshAgentStrategy.java b/app/src/main/java/io/xpipe/app/cred/OpenSshAgentStrategy.java index a22baa3a1..962f38457 100644 --- a/app/src/main/java/io/xpipe/app/cred/OpenSshAgentStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/OpenSshAgentStrategy.java @@ -6,9 +6,9 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; diff --git a/app/src/main/java/io/xpipe/app/cred/OtherExternalIdentityStrategy.java b/app/src/main/java/io/xpipe/app/cred/OtherExternalIdentityStrategy.java index d9430efad..ec62673a0 100644 --- a/app/src/main/java/io/xpipe/app/cred/OtherExternalIdentityStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/OtherExternalIdentityStrategy.java @@ -1,14 +1,8 @@ package io.xpipe.app.cred; -import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; - -import javafx.beans.property.Property; -import javafx.beans.property.SimpleStringProperty; +import io.xpipe.app.util.KeyValue; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.Builder; diff --git a/app/src/main/java/io/xpipe/app/cred/PageantStrategy.java b/app/src/main/java/io/xpipe/app/cred/PageantStrategy.java index 006c9a7cc..3684444b1 100644 --- a/app/src/main/java/io/xpipe/app/cred/PageantStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/PageantStrategy.java @@ -7,9 +7,9 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.util.LocalExec; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; diff --git a/app/src/main/java/io/xpipe/app/cred/PasswordManagerAgentStrategy.java b/app/src/main/java/io/xpipe/app/cred/PasswordManagerAgentStrategy.java index d62408d37..e743d06d0 100644 --- a/app/src/main/java/io/xpipe/app/cred/PasswordManagerAgentStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/PasswordManagerAgentStrategy.java @@ -13,8 +13,8 @@ import io.xpipe.app.pwman.PasswordManagerKeyConfiguration; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.Validators; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/cred/PublicKeyStrategy.java b/app/src/main/java/io/xpipe/app/cred/PublicKeyStrategy.java index bf02b76d7..672575233 100644 --- a/app/src/main/java/io/xpipe/app/cred/PublicKeyStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/PublicKeyStrategy.java @@ -1,6 +1,6 @@ package io.xpipe.app.cred; -import io.xpipe.core.FailableSupplier; +import io.xpipe.app.util.FailableSupplier; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/app/src/main/java/io/xpipe/app/cred/SecurityKeyImpl.java b/app/src/main/java/io/xpipe/app/cred/SecurityKeyImpl.java index 512c4e39c..3e7979b6f 100644 --- a/app/src/main/java/io/xpipe/app/cred/SecurityKeyImpl.java +++ b/app/src/main/java/io/xpipe/app/cred/SecurityKeyImpl.java @@ -7,8 +7,8 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.Validators; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.beans.property.Property; import javafx.beans.property.ReadOnlyObjectWrapper; diff --git a/app/src/main/java/io/xpipe/app/cred/SecurityKeyStrategy.java b/app/src/main/java/io/xpipe/app/cred/SecurityKeyStrategy.java index 16471ba37..b07f193fa 100644 --- a/app/src/main/java/io/xpipe/app/cred/SecurityKeyStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/SecurityKeyStrategy.java @@ -11,11 +11,10 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.app.util.LicenseProvider; import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.Validators; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/cred/ShortLivedCertificateImpl.java b/app/src/main/java/io/xpipe/app/cred/ShortLivedCertificateImpl.java index 76f3de32c..5260a0c57 100644 --- a/app/src/main/java/io/xpipe/app/cred/ShortLivedCertificateImpl.java +++ b/app/src/main/java/io/xpipe/app/cred/ShortLivedCertificateImpl.java @@ -14,7 +14,7 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellScript; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.*; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.*; diff --git a/app/src/main/java/io/xpipe/app/cred/SshIdentityAgentStrategy.java b/app/src/main/java/io/xpipe/app/cred/SshIdentityAgentStrategy.java index d76afce94..dc969b69b 100644 --- a/app/src/main/java/io/xpipe/app/cred/SshIdentityAgentStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/SshIdentityAgentStrategy.java @@ -2,7 +2,7 @@ package io.xpipe.app.cred; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; public interface SshIdentityAgentStrategy extends SshIdentityKeyListStrategy { diff --git a/app/src/main/java/io/xpipe/app/cred/SshIdentityStateManager.java b/app/src/main/java/io/xpipe/app/cred/SshIdentityStateManager.java index 6f28fd211..c1f9e0817 100644 --- a/app/src/main/java/io/xpipe/app/cred/SshIdentityStateManager.java +++ b/app/src/main/java/io/xpipe/app/cred/SshIdentityStateManager.java @@ -5,8 +5,8 @@ import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.*; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import com.sun.jna.Memory; import com.sun.jna.platform.win32.Kernel32; diff --git a/app/src/main/java/io/xpipe/app/cred/SshIdentityStrategy.java b/app/src/main/java/io/xpipe/app/cred/SshIdentityStrategy.java index d4ed79b80..9f9e8301a 100644 --- a/app/src/main/java/io/xpipe/app/cred/SshIdentityStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/SshIdentityStrategy.java @@ -7,9 +7,9 @@ import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.process.ShellControl; import io.xpipe.app.secret.SecretNoneStrategy; import io.xpipe.app.secret.SecretRetrievalStrategy; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/cred/UsernameStrategy.java b/app/src/main/java/io/xpipe/app/cred/UsernameStrategy.java index bbba93057..21fb66f4a 100644 --- a/app/src/main/java/io/xpipe/app/cred/UsernameStrategy.java +++ b/app/src/main/java/io/xpipe/app/cred/UsernameStrategy.java @@ -1,6 +1,6 @@ package io.xpipe.app.cred; -import io.xpipe.core.FailableSupplier; +import io.xpipe.app.util.FailableSupplier; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/app/src/main/java/io/xpipe/app/ext/CliProvider.java b/app/src/main/java/io/xpipe/app/ext/CliProvider.java new file mode 100644 index 000000000..e02b0df17 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/ext/CliProvider.java @@ -0,0 +1,32 @@ +package io.xpipe.app.ext; + +import io.xpipe.app.util.ModuleLayerLoader; + +import java.util.ServiceLoader; + +public abstract class CliProvider { + + private static CliProvider INSTANCE; + + public static CliProvider get() { + return INSTANCE; + } + + public abstract int execute(String[] args); + + public static class Loader implements ModuleLayerLoader { + + @Override + public void init(ModuleLayer layer) { + INSTANCE = ServiceLoader.load(layer, CliProvider.class).stream() + .map(p -> p.get()) + .findFirst() + .orElse(null); + } + + @Override + public boolean initForCli() { + return true; + } + } +} diff --git a/app/src/main/java/io/xpipe/app/ext/CloudSetupProvider.java b/app/src/main/java/io/xpipe/app/ext/CloudSetupProvider.java index 68f7aa003..637b12d16 100644 --- a/app/src/main/java/io/xpipe/app/ext/CloudSetupProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/CloudSetupProvider.java @@ -1,7 +1,7 @@ package io.xpipe.app.ext; import io.xpipe.app.platform.LabelGraphic; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import java.util.*; @@ -32,5 +32,10 @@ public interface CloudSetupProvider { .map(p -> p.get()) .toList()); } + + @Override + public boolean initForCli() { + return false; + } } } diff --git a/app/src/main/java/io/xpipe/app/ext/ConnectionFileSystem.java b/app/src/main/java/io/xpipe/app/ext/ConnectionFileSystem.java index 8ed4b71f4..bee48614a 100644 --- a/app/src/main/java/io/xpipe/app/ext/ConnectionFileSystem.java +++ b/app/src/main/java/io/xpipe/app/ext/ConnectionFileSystem.java @@ -6,8 +6,8 @@ import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/ext/ContainerStoreState.java b/app/src/main/java/io/xpipe/app/ext/ContainerStoreState.java index 0647ba15c..f6b9991e4 100644 --- a/app/src/main/java/io/xpipe/app/ext/ContainerStoreState.java +++ b/app/src/main/java/io/xpipe/app/ext/ContainerStoreState.java @@ -4,7 +4,7 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellDialect; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.process.ShellStoreState; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.AccessLevel; import lombok.EqualsAndHashCode; diff --git a/app/src/main/java/io/xpipe/app/ext/DataStorageExtensionProvider.java b/app/src/main/java/io/xpipe/app/ext/DataStorageExtensionProvider.java index 855a615a5..8c1bd9d3d 100644 --- a/app/src/main/java/io/xpipe/app/ext/DataStorageExtensionProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/DataStorageExtensionProvider.java @@ -1,6 +1,6 @@ package io.xpipe.app.ext; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import java.util.Comparator; import java.util.List; @@ -27,5 +27,10 @@ public abstract class DataStorageExtensionProvider { scanProvider -> scanProvider.getClass().getName())) .collect(Collectors.toList()); } + + @Override + public boolean initForCli() { + return false; + } } } diff --git a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java index 5b9c5574a..756a4d2e0 100644 --- a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java @@ -12,7 +12,7 @@ import io.xpipe.app.hub.comp.StoreSection; import io.xpipe.app.storage.DataStoreCategory; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.FailableRunnable; +import io.xpipe.app.util.FailableRunnable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java b/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java index 9b3f7304b..14a3b3b54 100644 --- a/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java +++ b/app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java @@ -2,8 +2,8 @@ package io.xpipe.app.ext; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.ModuleLayerLoader; import com.fasterxml.jackson.databind.jsontype.NamedType; @@ -90,5 +90,10 @@ public class DataStoreProviders { }); } } + + @Override + public boolean initForCli() { + return false; + } } } diff --git a/app/src/main/java/io/xpipe/app/ext/FileEntry.java b/app/src/main/java/io/xpipe/app/ext/FileEntry.java index 09deeaf02..68c7ea5f3 100644 --- a/app/src/main/java/io/xpipe/app/ext/FileEntry.java +++ b/app/src/main/java/io/xpipe/app/ext/FileEntry.java @@ -1,6 +1,6 @@ package io.xpipe.app.ext; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.NonNull; import lombok.Setter; diff --git a/app/src/main/java/io/xpipe/app/ext/FileSystem.java b/app/src/main/java/io/xpipe/app/ext/FileSystem.java index a9483fbf1..96c167c88 100644 --- a/app/src/main/java/io/xpipe/app/ext/FileSystem.java +++ b/app/src/main/java/io/xpipe/app/ext/FileSystem.java @@ -1,7 +1,7 @@ package io.xpipe.app.ext; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.io.Closeable; import java.io.InputStream; diff --git a/app/src/main/java/io/xpipe/app/ext/LinkFileEntry.java b/app/src/main/java/io/xpipe/app/ext/LinkFileEntry.java index 5551c35e5..b9cceb088 100644 --- a/app/src/main/java/io/xpipe/app/ext/LinkFileEntry.java +++ b/app/src/main/java/io/xpipe/app/ext/LinkFileEntry.java @@ -1,6 +1,6 @@ package io.xpipe.app.ext; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.EqualsAndHashCode; import lombok.NonNull; diff --git a/app/src/main/java/io/xpipe/app/ext/PrefsProvider.java b/app/src/main/java/io/xpipe/app/ext/PrefsProvider.java index 62e214b48..85b6f76d0 100644 --- a/app/src/main/java/io/xpipe/app/ext/PrefsProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/PrefsProvider.java @@ -1,6 +1,6 @@ package io.xpipe.app.ext; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import java.util.List; import java.util.ServiceLoader; @@ -36,5 +36,10 @@ public abstract class PrefsProvider { .map(ServiceLoader.Provider::get) .collect(Collectors.toList()); } + + @Override + public boolean initForCli() { + return false; + } } } diff --git a/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java b/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java index b009ed8f1..0a04022f0 100644 --- a/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java @@ -10,7 +10,7 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.HttpProxy; import io.xpipe.app.util.RemoteDesktopDockContentEntry; import io.xpipe.app.vnc.VncBaseStore; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/ext/ScanProvider.java b/app/src/main/java/io/xpipe/app/ext/ScanProvider.java index 4dd8a2ba4..87b28e2f2 100644 --- a/app/src/main/java/io/xpipe/app/ext/ScanProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/ScanProvider.java @@ -3,7 +3,7 @@ package io.xpipe.app.ext; import io.xpipe.app.core.AppI18n; import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import javafx.beans.value.ObservableValue; @@ -43,6 +43,11 @@ public abstract class ScanProvider { scanProvider -> scanProvider.getClass().getName())) .collect(Collectors.toList()); } + + @Override + public boolean initForCli() { + return false; + } } @Value diff --git a/app/src/main/java/io/xpipe/app/ext/ShellSession.java b/app/src/main/java/io/xpipe/app/ext/ShellSession.java index e13ab2aec..f4b4f40c8 100644 --- a/app/src/main/java/io/xpipe/app/ext/ShellSession.java +++ b/app/src/main/java/io/xpipe/app/ext/ShellSession.java @@ -4,7 +4,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.FailableSupplier; +import io.xpipe.app.util.FailableSupplier; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/ext/WrapperFileSystem.java b/app/src/main/java/io/xpipe/app/ext/WrapperFileSystem.java index 736dc4f70..a00ebea24 100644 --- a/app/src/main/java/io/xpipe/app/ext/WrapperFileSystem.java +++ b/app/src/main/java/io/xpipe/app/ext/WrapperFileSystem.java @@ -1,8 +1,8 @@ package io.xpipe.app.ext; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.FailableConsumer; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FailableConsumer; +import io.xpipe.app.util.FilePath; import java.io.IOException; import java.io.InputStream; diff --git a/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java b/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java index e79dae7e9..8cf773b59 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java +++ b/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java @@ -6,7 +6,7 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/hub/action/MultiStoreAction.java b/app/src/main/java/io/xpipe/app/hub/action/MultiStoreAction.java index 616a7d75c..42f0efc76 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/MultiStoreAction.java +++ b/app/src/main/java/io/xpipe/app/hub/action/MultiStoreAction.java @@ -7,7 +7,7 @@ import io.xpipe.app.ext.DataStore; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/hub/action/StoreAction.java b/app/src/main/java/io/xpipe/app/hub/action/StoreAction.java index 376282141..9012c18f8 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/StoreAction.java +++ b/app/src/main/java/io/xpipe/app/hub/action/StoreAction.java @@ -7,7 +7,7 @@ import io.xpipe.app.ext.DataStore; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseHubLeafProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseHubLeafProvider.java index 5746d3d0b..03d4cd781 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseHubLeafProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/BrowseHubLeafProvider.java @@ -10,7 +10,7 @@ import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.hub.action.StoreActionCategory; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/hub/action/impl/SampleHubLeafProvider.java b/app/src/main/java/io/xpipe/app/hub/action/impl/SampleHubLeafProvider.java index bcf4c01fe..bb59aa944 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/impl/SampleHubLeafProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/impl/SampleHubLeafProvider.java @@ -11,7 +11,7 @@ import io.xpipe.app.process.ElevationFunction; import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/OsLogoComp.java b/app/src/main/java/io/xpipe/app/hub/comp/OsLogoComp.java index aceb997c1..370f2e8ac 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/OsLogoComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/OsLogoComp.java @@ -5,8 +5,8 @@ import io.xpipe.app.comp.base.PrettyImageHelper; import io.xpipe.app.comp.base.StackComp; import io.xpipe.app.core.AppResources; import io.xpipe.app.process.SystemState; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StandardStoreEntryComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StandardStoreEntryComp.java index 8bd81a8ae..05e3f5901 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StandardStoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StandardStoreEntryComp.java @@ -3,7 +3,7 @@ package io.xpipe.app.hub.comp; import io.xpipe.app.comp.BaseRegionBuilder; import io.xpipe.app.comp.RegionBuilder; import io.xpipe.app.core.AppFontSizes; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.geometry.HPos; import javafx.geometry.Insets; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java index 1cf3f483a..4c0e317b7 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryComp.java @@ -13,7 +13,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreColor; import io.xpipe.app.util.DesktopHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleBooleanProperty; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryListComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryListComp.java index f68b7dcc3..05aa2b750 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryListComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreCategoryListComp.java @@ -3,7 +3,7 @@ package io.xpipe.app.hub.comp; import io.xpipe.app.comp.SimpleRegionBuilder; import io.xpipe.app.comp.base.ScrollComp; import io.xpipe.app.core.AppFontSizes; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.scene.layout.Region; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java index 764501f5c..80022413d 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java @@ -18,7 +18,7 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreColor; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.*; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryListOverviewComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryListOverviewComp.java index 49329407c..ff8f7dae8 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryListOverviewComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryListOverviewComp.java @@ -10,7 +10,7 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.platform.BindingsHelper; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.platform.MenuHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.css.PseudoClass; diff --git a/app/src/main/java/io/xpipe/app/icon/SystemIconSource.java b/app/src/main/java/io/xpipe/app/icon/SystemIconSource.java index 41d9756f9..7f251451a 100644 --- a/app/src/main/java/io/xpipe/app/icon/SystemIconSource.java +++ b/app/src/main/java/io/xpipe/app/icon/SystemIconSource.java @@ -5,7 +5,7 @@ import io.xpipe.app.ext.ValidationException; import io.xpipe.app.util.DesktopHelper; import io.xpipe.app.util.Hyperlinks; import io.xpipe.app.util.Validators; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/issue/ErrorAction.java b/app/src/main/java/io/xpipe/app/issue/ErrorAction.java index 43b833851..b1723ddc1 100644 --- a/app/src/main/java/io/xpipe/app/issue/ErrorAction.java +++ b/app/src/main/java/io/xpipe/app/issue/ErrorAction.java @@ -4,7 +4,7 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.Hyperlinks; import io.xpipe.app.util.LicenseProvider; -import io.xpipe.core.FailableSupplier; +import io.xpipe.app.util.FailableSupplier; public interface ErrorAction { diff --git a/app/src/main/java/io/xpipe/app/issue/ErrorEventFactory.java b/app/src/main/java/io/xpipe/app/issue/ErrorEventFactory.java index e4b29a342..f6d198e10 100644 --- a/app/src/main/java/io/xpipe/app/issue/ErrorEventFactory.java +++ b/app/src/main/java/io/xpipe/app/issue/ErrorEventFactory.java @@ -2,7 +2,7 @@ package io.xpipe.app.issue; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.process.ProcessOutputException; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.nio.file.AccessDeniedException; import java.nio.file.NoSuchFileException; diff --git a/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java b/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java index 6bedfa813..24cece7aa 100644 --- a/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java +++ b/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java @@ -4,7 +4,7 @@ import io.xpipe.app.core.AppCache; import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.core.window.AppDialog; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import javafx.animation.PauseTransition; import javafx.scene.input.Clipboard; diff --git a/app/src/main/java/io/xpipe/app/platform/NativeBridge.java b/app/src/main/java/io/xpipe/app/platform/NativeBridge.java index ce12e7264..b5d82744a 100644 --- a/app/src/main/java/io/xpipe/app/platform/NativeBridge.java +++ b/app/src/main/java/io/xpipe/app/platform/NativeBridge.java @@ -3,7 +3,7 @@ package io.xpipe.app.platform; import io.xpipe.app.core.AppInstallation; import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.sun.jna.Library; import com.sun.jna.Native; diff --git a/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java b/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java index 4228f8a7a..1c5c84ea0 100644 --- a/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java +++ b/app/src/main/java/io/xpipe/app/platform/OptionsBuilder.java @@ -11,8 +11,8 @@ import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.Checkable; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.LicenseProvider; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.JacksonMapper; import javafx.beans.property.*; import javafx.beans.value.ChangeListener; diff --git a/app/src/main/java/io/xpipe/app/platform/PlatformInit.java b/app/src/main/java/io/xpipe/app/platform/PlatformInit.java index 79594695b..6f09699f8 100644 --- a/app/src/main/java/io/xpipe/app/platform/PlatformInit.java +++ b/app/src/main/java/io/xpipe/app/platform/PlatformInit.java @@ -6,7 +6,7 @@ import io.xpipe.app.core.check.AppGpuCheck; import io.xpipe.app.core.window.AppModifiedStage; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Application; import javafx.application.Platform; diff --git a/app/src/main/java/io/xpipe/app/platform/PlatformState.java b/app/src/main/java/io/xpipe/app/platform/PlatformState.java index 74af4ecc4..b395542e2 100644 --- a/app/src/main/java/io/xpipe/app/platform/PlatformState.java +++ b/app/src/main/java/io/xpipe/app/platform/PlatformState.java @@ -8,7 +8,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.GlobalTimer; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.scene.text.Font; diff --git a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java index 3d15a26a4..b96a523d0 100644 --- a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java +++ b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java @@ -25,8 +25,8 @@ import io.xpipe.app.util.*; import io.xpipe.app.vnc.ExternalVncClient; import io.xpipe.app.vnc.InternalVncClient; import io.xpipe.app.vnc.VncCategory; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.property.*; diff --git a/app/src/main/java/io/xpipe/app/prefs/AppPrefsStorageHandler.java b/app/src/main/java/io/xpipe/app/prefs/AppPrefsStorageHandler.java index abd42e034..133b21867 100644 --- a/app/src/main/java/io/xpipe/app/prefs/AppPrefsStorageHandler.java +++ b/app/src/main/java/io/xpipe/app/prefs/AppPrefsStorageHandler.java @@ -3,7 +3,7 @@ package io.xpipe.app.prefs; import io.xpipe.app.ext.PrefsChoiceValue; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; diff --git a/app/src/main/java/io/xpipe/app/prefs/ConnectionHubCategory.java b/app/src/main/java/io/xpipe/app/prefs/ConnectionHubCategory.java index 9de65c56f..bcac6669d 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ConnectionHubCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/ConnectionHubCategory.java @@ -7,7 +7,7 @@ import io.xpipe.app.core.AppResources; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.util.FileOpener; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.ReadOnlyObjectWrapper; diff --git a/app/src/main/java/io/xpipe/app/prefs/DisplayCategory.java b/app/src/main/java/io/xpipe/app/prefs/DisplayCategory.java index 51eff6e2c..7e519ad14 100644 --- a/app/src/main/java/io/xpipe/app/prefs/DisplayCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/DisplayCategory.java @@ -5,7 +5,7 @@ import io.xpipe.app.comp.RegionBuilder; import io.xpipe.app.comp.base.IntFieldComp; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.platform.OptionsBuilder; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.SimpleBooleanProperty; import javafx.scene.control.Slider; diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java index ee43b484d..fbf459468 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationHelper.java @@ -5,7 +5,7 @@ import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.CommandSupport; import io.xpipe.app.process.LocalShell; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.io.IOException; import java.util.Arrays; diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java index 650f3cc9f..a5f6f646f 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java @@ -9,7 +9,7 @@ import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellControl; import io.xpipe.app.util.FlatpakCache; import io.xpipe.app.util.Translatable; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.io.IOException; import java.nio.file.Files; diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java index d84c1bca9..c069bf91c 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java @@ -7,7 +7,7 @@ import io.xpipe.app.process.*; import io.xpipe.app.terminal.TerminalLaunch; import io.xpipe.app.util.FlatpakCache; import io.xpipe.app.util.WindowsRegistry; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java b/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java index 2fbbcdb2d..d35421202 100644 --- a/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/FileBrowserCategory.java @@ -5,7 +5,7 @@ import io.xpipe.app.comp.base.ContextualFileReferenceChoiceComp; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.storage.DataStorage; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.ReadOnlyObjectWrapper; diff --git a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java index 560695a7c..1868f3174 100644 --- a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java @@ -16,8 +16,8 @@ import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.*; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleBooleanProperty; diff --git a/app/src/main/java/io/xpipe/app/prefs/SshCategory.java b/app/src/main/java/io/xpipe/app/prefs/SshCategory.java index c114d9ab9..569fc1af1 100644 --- a/app/src/main/java/io/xpipe/app/prefs/SshCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/SshCategory.java @@ -7,7 +7,7 @@ import io.xpipe.app.cred.SshAgentTestComp; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.storage.DataStorage; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java b/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java index e8b50ef0e..e4b991262 100644 --- a/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java +++ b/app/src/main/java/io/xpipe/app/prefs/StartupBehaviour.java @@ -2,7 +2,7 @@ package io.xpipe.app.prefs; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.ext.PrefsChoiceValue; -import io.xpipe.core.XPipeDaemonMode; +import io.xpipe.app.util.XPipeDaemonMode; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java b/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java index 9d60f2826..1fe336e43 100644 --- a/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java @@ -12,7 +12,7 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStorageSyncHandler; import io.xpipe.app.terminal.TerminalLaunch; import io.xpipe.app.util.*; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.SimpleBooleanProperty; import javafx.geometry.Pos; diff --git a/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java b/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java index 2cd5090a5..53127f2d4 100644 --- a/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java @@ -17,7 +17,7 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.terminal.*; import io.xpipe.app.util.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.ReadOnlyBooleanWrapper; diff --git a/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java b/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java index 637a2fdf0..d1a85b703 100644 --- a/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java @@ -15,7 +15,7 @@ import io.xpipe.app.process.ShellScript; import io.xpipe.app.terminal.TerminalLaunch; import io.xpipe.app.update.AppDistributionType; import io.xpipe.app.util.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.sun.management.HotSpotDiagnosticMXBean; import lombok.SneakyThrows; diff --git a/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java b/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java index f2bc49e2c..c1a107652 100644 --- a/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java +++ b/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java @@ -12,7 +12,7 @@ import io.xpipe.app.util.DesktopHelper; import io.xpipe.app.util.DesktopShortcuts; import io.xpipe.app.util.LicenseProvider; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; diff --git a/app/src/main/java/io/xpipe/app/process/CommandBuilder.java b/app/src/main/java/io/xpipe/app/process/CommandBuilder.java index e318006ed..78655c7e5 100644 --- a/app/src/main/java/io/xpipe/app/process/CommandBuilder.java +++ b/app/src/main/java/io/xpipe/app/process/CommandBuilder.java @@ -1,9 +1,9 @@ package io.xpipe.app.process; -import io.xpipe.core.FailableConsumer; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableConsumer; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.Getter; import lombok.Setter; diff --git a/app/src/main/java/io/xpipe/app/process/CommandControl.java b/app/src/main/java/io/xpipe/app/process/CommandControl.java index c3ae62875..8e10ccebc 100644 --- a/app/src/main/java/io/xpipe/app/process/CommandControl.java +++ b/app/src/main/java/io/xpipe/app/process/CommandControl.java @@ -1,7 +1,7 @@ package io.xpipe.app.process; import io.xpipe.app.util.GlobalTimer; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.io.InputStream; import java.io.OutputStream; diff --git a/app/src/main/java/io/xpipe/app/process/CommandSupport.java b/app/src/main/java/io/xpipe/app/process/CommandSupport.java index 24abdd873..5e35d769f 100644 --- a/app/src/main/java/io/xpipe/app/process/CommandSupport.java +++ b/app/src/main/java/io/xpipe/app/process/CommandSupport.java @@ -3,7 +3,7 @@ package io.xpipe.app.process; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.FailableSupplier; +import io.xpipe.app.util.FailableSupplier; import java.io.IOException; diff --git a/app/src/main/java/io/xpipe/app/process/ElevationFunction.java b/app/src/main/java/io/xpipe/app/process/ElevationFunction.java index 2fa48d4d8..88cea0eb5 100644 --- a/app/src/main/java/io/xpipe/app/process/ElevationFunction.java +++ b/app/src/main/java/io/xpipe/app/process/ElevationFunction.java @@ -1,7 +1,7 @@ package io.xpipe.app.process; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.OsType; public interface ElevationFunction { diff --git a/app/src/main/java/io/xpipe/app/process/OsFileSystem.java b/app/src/main/java/io/xpipe/app/process/OsFileSystem.java index 238f66f11..c787b4b21 100644 --- a/app/src/main/java/io/xpipe/app/process/OsFileSystem.java +++ b/app/src/main/java/io/xpipe/app/process/OsFileSystem.java @@ -1,7 +1,7 @@ package io.xpipe.app.process; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; diff --git a/app/src/main/java/io/xpipe/app/process/ParentSystemAccess.java b/app/src/main/java/io/xpipe/app/process/ParentSystemAccess.java index 386f2a399..d9845b567 100644 --- a/app/src/main/java/io/xpipe/app/process/ParentSystemAccess.java +++ b/app/src/main/java/io/xpipe/app/process/ParentSystemAccess.java @@ -1,6 +1,6 @@ package io.xpipe.app.process; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; public interface ParentSystemAccess { diff --git a/app/src/main/java/io/xpipe/app/process/ScriptHelper.java b/app/src/main/java/io/xpipe/app/process/ScriptHelper.java index acdfd1d54..39ede9dd7 100644 --- a/app/src/main/java/io/xpipe/app/process/ScriptHelper.java +++ b/app/src/main/java/io/xpipe/app/process/ScriptHelper.java @@ -1,7 +1,7 @@ package io.xpipe.app.process; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.SneakyThrows; diff --git a/app/src/main/java/io/xpipe/app/process/ShellControl.java b/app/src/main/java/io/xpipe/app/process/ShellControl.java index 67bd910b3..70b17d79f 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellControl.java +++ b/app/src/main/java/io/xpipe/app/process/ShellControl.java @@ -4,10 +4,10 @@ import io.xpipe.app.ext.DataStore; import io.xpipe.app.ext.StatefulDataStore; import io.xpipe.app.util.LicensedFeature; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FailableConsumer; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableConsumer; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.NonNull; diff --git a/app/src/main/java/io/xpipe/app/process/ShellDialect.java b/app/src/main/java/io/xpipe/app/process/ShellDialect.java index e68eaa932..5fdbe8b01 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellDialect.java +++ b/app/src/main/java/io/xpipe/app/process/ShellDialect.java @@ -2,8 +2,8 @@ package io.xpipe.app.process; import io.xpipe.app.ext.FileEntry; import io.xpipe.app.ext.FileSystem; -import io.xpipe.core.FilePath; -import io.xpipe.core.StreamCharset; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.StreamCharset; import java.nio.charset.Charset; import java.util.List; diff --git a/app/src/main/java/io/xpipe/app/process/ShellDialects.java b/app/src/main/java/io/xpipe/app/process/ShellDialects.java index d7fd61f64..2c264f1c3 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellDialects.java +++ b/app/src/main/java/io/xpipe/app/process/ShellDialects.java @@ -1,6 +1,6 @@ package io.xpipe.app.process; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.util.ModuleLayerLoader; import java.util.ArrayList; import java.util.List; @@ -71,9 +71,7 @@ public class ShellDialects { @Override public void init(ModuleLayer layer) { - var services = layer != null - ? ServiceLoader.load(layer, ShellDialect.class) - : ServiceLoader.load(ShellDialect.class); + var services = ServiceLoader.load(layer, ShellDialect.class); services.stream().forEach(moduleLayerLoaderProvider -> { ALL.add(moduleLayerLoaderProvider.get()); }); @@ -108,5 +106,10 @@ public class ShellDialects { HETZNER_BOX = byId("hetznerBox"); SFTP = byId("sftp"); } + + @Override + public boolean initForCli() { + return false; + } } } diff --git a/app/src/main/java/io/xpipe/app/process/ShellLaunchCommand.java b/app/src/main/java/io/xpipe/app/process/ShellLaunchCommand.java index 64c3a76eb..5b8cedbcf 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellLaunchCommand.java +++ b/app/src/main/java/io/xpipe/app/process/ShellLaunchCommand.java @@ -1,6 +1,6 @@ package io.xpipe.app.process; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.util.List; diff --git a/app/src/main/java/io/xpipe/app/process/ShellStoreState.java b/app/src/main/java/io/xpipe/app/process/ShellStoreState.java index 55394cf27..6826810d9 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellStoreState.java +++ b/app/src/main/java/io/xpipe/app/process/ShellStoreState.java @@ -1,7 +1,7 @@ package io.xpipe.app.process; import io.xpipe.app.ext.DataStoreState; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.AccessLevel; import lombok.EqualsAndHashCode; diff --git a/app/src/main/java/io/xpipe/app/process/ShellTemp.java b/app/src/main/java/io/xpipe/app/process/ShellTemp.java index d2ef3f231..a622fd0b9 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellTemp.java +++ b/app/src/main/java/io/xpipe/app/process/ShellTemp.java @@ -3,8 +3,8 @@ package io.xpipe.app.process; import io.xpipe.app.core.AppNames; import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import java.io.IOException; diff --git a/app/src/main/java/io/xpipe/app/process/ShellView.java b/app/src/main/java/io/xpipe/app/process/ShellView.java index b1be5f183..908fcdef3 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellView.java +++ b/app/src/main/java/io/xpipe/app/process/ShellView.java @@ -2,9 +2,9 @@ package io.xpipe.app.process; import io.xpipe.app.util.GroupFile; import io.xpipe.app.util.PasswdFile; -import io.xpipe.core.FailableSupplier; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableSupplier; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import java.io.ByteArrayInputStream; import java.io.InputStream; diff --git a/app/src/main/java/io/xpipe/app/process/StubShellControl.java b/app/src/main/java/io/xpipe/app/process/StubShellControl.java index 9d5feb11f..d5020bbbd 100644 --- a/app/src/main/java/io/xpipe/app/process/StubShellControl.java +++ b/app/src/main/java/io/xpipe/app/process/StubShellControl.java @@ -1,6 +1,6 @@ package io.xpipe.app.process; -import io.xpipe.core.FailableConsumer; +import io.xpipe.app.util.FailableConsumer; import java.util.function.Consumer; diff --git a/app/src/main/java/io/xpipe/app/process/SudoCache.java b/app/src/main/java/io/xpipe/app/process/SudoCache.java index 6647c6901..ecf6664f6 100644 --- a/app/src/main/java/io/xpipe/app/process/SudoCache.java +++ b/app/src/main/java/io/xpipe/app/process/SudoCache.java @@ -1,6 +1,6 @@ package io.xpipe.app.process; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.util.Optional; diff --git a/app/src/main/java/io/xpipe/app/process/SystemState.java b/app/src/main/java/io/xpipe/app/process/SystemState.java index 46996529c..4e0909403 100644 --- a/app/src/main/java/io/xpipe/app/process/SystemState.java +++ b/app/src/main/java/io/xpipe/app/process/SystemState.java @@ -1,6 +1,6 @@ package io.xpipe.app.process; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public interface SystemState { diff --git a/app/src/main/java/io/xpipe/app/process/TerminalInitFunction.java b/app/src/main/java/io/xpipe/app/process/TerminalInitFunction.java index 693a44383..fbd0086c8 100644 --- a/app/src/main/java/io/xpipe/app/process/TerminalInitFunction.java +++ b/app/src/main/java/io/xpipe/app/process/TerminalInitFunction.java @@ -1,6 +1,6 @@ package io.xpipe.app.process; -import io.xpipe.core.FailableFunction; +import io.xpipe.app.util.FailableFunction; public interface TerminalInitFunction { diff --git a/app/src/main/java/io/xpipe/app/process/WorkingDirectoryFunction.java b/app/src/main/java/io/xpipe/app/process/WorkingDirectoryFunction.java index 0496073f1..b5ab65b14 100644 --- a/app/src/main/java/io/xpipe/app/process/WorkingDirectoryFunction.java +++ b/app/src/main/java/io/xpipe/app/process/WorkingDirectoryFunction.java @@ -1,7 +1,7 @@ package io.xpipe.app.process; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; public interface WorkingDirectoryFunction { diff --git a/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java b/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java index c27904418..af417a1a1 100644 --- a/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java +++ b/app/src/main/java/io/xpipe/app/process/WrapperShellControl.java @@ -2,9 +2,9 @@ package io.xpipe.app.process; import io.xpipe.app.ext.DataStore; import io.xpipe.app.util.LicensedFeature; -import io.xpipe.core.FailableConsumer; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableConsumer; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java index d7a63599f..6a2bbb63c 100644 --- a/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java @@ -12,8 +12,8 @@ import io.xpipe.app.prefs.PasswordManagerTestComp; import io.xpipe.app.process.*; import io.xpipe.app.terminal.TerminalLaunch; import io.xpipe.app.util.*; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/pwman/DashlanePasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/DashlanePasswordManager.java index f5667039b..643beb70d 100644 --- a/app/src/main/java/io/xpipe/app/pwman/DashlanePasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/DashlanePasswordManager.java @@ -6,7 +6,7 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.prefs.PasswordManagerTestComp; import io.xpipe.app.process.*; import io.xpipe.app.terminal.TerminalLaunch; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java index fe7ecec3b..26f8c5e3c 100644 --- a/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/EnpassPasswordManager.java @@ -14,8 +14,8 @@ import io.xpipe.app.secret.SecretManager; import io.xpipe.app.secret.SecretPromptStrategy; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.*; -import io.xpipe.core.FilePath; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.JacksonMapper; import javafx.application.Platform; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/pwman/KeePassXcAssociationKey.java b/app/src/main/java/io/xpipe/app/pwman/KeePassXcAssociationKey.java index 105469cd6..fd9b820d6 100644 --- a/app/src/main/java/io/xpipe/app/pwman/KeePassXcAssociationKey.java +++ b/app/src/main/java/io/xpipe/app/pwman/KeePassXcAssociationKey.java @@ -1,6 +1,6 @@ package io.xpipe.app.pwman; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; import lombok.Builder; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/pwman/KeePassXcPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/KeePassXcPasswordManager.java index a9c2a921f..02a73d92b 100644 --- a/app/src/main/java/io/xpipe/app/pwman/KeePassXcPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/KeePassXcPasswordManager.java @@ -11,7 +11,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.prefs.PasswordManagerTestComp; import io.xpipe.app.process.LocalShell; import io.xpipe.app.util.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java b/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java index ee563c290..2db70e5a7 100644 --- a/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java +++ b/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java @@ -3,8 +3,8 @@ package io.xpipe.app.pwman; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; diff --git a/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java index 54eed1583..beaa1ba52 100644 --- a/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java @@ -12,8 +12,7 @@ import io.xpipe.app.secret.SecretManager; import io.xpipe.app.secret.SecretPromptStrategy; import io.xpipe.app.secret.SecretQueryState; import io.xpipe.app.terminal.TerminalLaunch; -import io.xpipe.app.util.AskpassAlert; -import io.xpipe.core.*; +import io.xpipe.app.util.*; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/pwman/LastpassPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/LastpassPasswordManager.java index f9257c579..8c93b4f94 100644 --- a/app/src/main/java/io/xpipe/app/pwman/LastpassPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/LastpassPasswordManager.java @@ -7,7 +7,7 @@ import io.xpipe.app.prefs.PasswordManagerTestComp; import io.xpipe.app.process.*; import io.xpipe.app.terminal.TerminalLaunch; import io.xpipe.app.util.*; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/pwman/OnePasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/OnePasswordManager.java index f299b9f3f..737b87031 100644 --- a/app/src/main/java/io/xpipe/app/pwman/OnePasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/OnePasswordManager.java @@ -10,8 +10,8 @@ import io.xpipe.app.prefs.PasswordManagerTestComp; import io.xpipe.app.process.*; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.OsType; import javafx.beans.property.*; import javafx.collections.FXCollections; diff --git a/app/src/main/java/io/xpipe/app/pwman/PassboltPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/PassboltPasswordManager.java index 72eeba488..96a1be88d 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PassboltPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/PassboltPasswordManager.java @@ -15,10 +15,10 @@ import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.HttpProxy; -import io.xpipe.core.FilePath; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.OsType; import javafx.beans.property.*; diff --git a/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java index db5722d63..23646280d 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java @@ -5,9 +5,9 @@ import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.OsType; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.OsType; +import io.xpipe.app.util.SecretValue; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; diff --git a/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommand.java b/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommand.java index 7a8b07230..2c01c5f2e 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommand.java +++ b/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommand.java @@ -14,7 +14,7 @@ import io.xpipe.app.prefs.PasswordManagerTestComp; import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellScript; import io.xpipe.app.storage.DataStorage; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommandTemplate.java b/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommandTemplate.java index af4f3d685..1a743998b 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommandTemplate.java +++ b/app/src/main/java/io/xpipe/app/pwman/PasswordManagerCommandTemplate.java @@ -1,7 +1,7 @@ package io.xpipe.app.pwman; import io.xpipe.app.ext.PrefsChoiceValue; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.util.List; import java.util.stream.Stream; diff --git a/app/src/main/java/io/xpipe/app/pwman/PasswordManagerKeyStrategy.java b/app/src/main/java/io/xpipe/app/pwman/PasswordManagerKeyStrategy.java index 3a14f664a..ab96b661c 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PasswordManagerKeyStrategy.java +++ b/app/src/main/java/io/xpipe/app/pwman/PasswordManagerKeyStrategy.java @@ -9,9 +9,9 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FailableConsumer; -import io.xpipe.core.FilePath; -import io.xpipe.core.KeyValue; +import io.xpipe.app.util.FailableConsumer; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.KeyValue; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/pwman/PassworkPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/PassworkPasswordManager.java index 2517b7291..5bc8db23c 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PassworkPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/PassworkPasswordManager.java @@ -11,7 +11,7 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.CommandSupport; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/pwman/ProtonPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/ProtonPasswordManager.java index d15f8663c..33a21cc7f 100644 --- a/app/src/main/java/io/xpipe/app/pwman/ProtonPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/ProtonPasswordManager.java @@ -9,8 +9,8 @@ import io.xpipe.app.platform.OptionsChoiceBuilder; import io.xpipe.app.prefs.PasswordManagerTestComp; import io.xpipe.app.process.*; import io.xpipe.app.terminal.TerminalLaunch; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.OsType; import javafx.beans.property.*; diff --git a/app/src/main/java/io/xpipe/app/pwman/PsonoPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/PsonoPasswordManager.java index 4afee90a5..01b77fb85 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PsonoPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/PsonoPasswordManager.java @@ -11,8 +11,8 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.CommandSupport; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.JacksonMapper; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/rdp/ExternalRdpClient.java b/app/src/main/java/io/xpipe/app/rdp/ExternalRdpClient.java index 84045b8ef..40b257eb2 100644 --- a/app/src/main/java/io/xpipe/app/rdp/ExternalRdpClient.java +++ b/app/src/main/java/io/xpipe/app/rdp/ExternalRdpClient.java @@ -5,7 +5,7 @@ import io.xpipe.app.ext.PrefsValue; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.util.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java b/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java index e65e8b589..36414681d 100644 --- a/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java +++ b/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java @@ -4,7 +4,7 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.CommandSupport; import io.xpipe.app.process.LocalShell; import io.xpipe.app.util.FlatpakCache; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.Builder; diff --git a/app/src/main/java/io/xpipe/app/rdp/MstscRdpClient.java b/app/src/main/java/io/xpipe/app/rdp/MstscRdpClient.java index 936a1ffb7..0ba4dba18 100644 --- a/app/src/main/java/io/xpipe/app/rdp/MstscRdpClient.java +++ b/app/src/main/java/io/xpipe/app/rdp/MstscRdpClient.java @@ -17,8 +17,8 @@ import io.xpipe.app.util.RdpConfig; import io.xpipe.app.util.RemoteDesktopWindow; import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.WindowsRegistry; -import io.xpipe.core.OsType; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.OsType; +import io.xpipe.app.util.SecretValue; import javafx.application.Platform; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/rdp/RdpLaunchConfig.java b/app/src/main/java/io/xpipe/app/rdp/RdpLaunchConfig.java index 284e00223..ef14d1eed 100644 --- a/app/src/main/java/io/xpipe/app/rdp/RdpLaunchConfig.java +++ b/app/src/main/java/io/xpipe/app/rdp/RdpLaunchConfig.java @@ -2,7 +2,7 @@ package io.xpipe.app.rdp; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.RdpConfig; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/secret/EncryptedValue.java b/app/src/main/java/io/xpipe/app/secret/EncryptedValue.java index 1fdfd8a07..b67189137 100644 --- a/app/src/main/java/io/xpipe/app/secret/EncryptedValue.java +++ b/app/src/main/java/io/xpipe/app/secret/EncryptedValue.java @@ -2,7 +2,7 @@ package io.xpipe.app.secret; import io.xpipe.app.storage.DataStorageSecret; import io.xpipe.app.storage.DataStorageUserHandler; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/secret/PasswordLockSecretValue.java b/app/src/main/java/io/xpipe/app/secret/PasswordLockSecretValue.java index 2b2bb8853..c2d5ff019 100644 --- a/app/src/main/java/io/xpipe/app/secret/PasswordLockSecretValue.java +++ b/app/src/main/java/io/xpipe/app/secret/PasswordLockSecretValue.java @@ -1,8 +1,8 @@ package io.xpipe.app.secret; import io.xpipe.app.storage.DataStorageUserHandler; -import io.xpipe.core.AesSecretValue; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.AesSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.EqualsAndHashCode; diff --git a/app/src/main/java/io/xpipe/app/secret/SecretCustomCommandStrategy.java b/app/src/main/java/io/xpipe/app/secret/SecretCustomCommandStrategy.java index bcf39f56e..a5eee4cc1 100644 --- a/app/src/main/java/io/xpipe/app/secret/SecretCustomCommandStrategy.java +++ b/app/src/main/java/io/xpipe/app/secret/SecretCustomCommandStrategy.java @@ -8,7 +8,7 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellScript; import io.xpipe.app.util.Validators; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; import javafx.beans.property.Property; import javafx.beans.property.ReadOnlyObjectWrapper; diff --git a/app/src/main/java/io/xpipe/app/secret/SecretInPlaceStrategy.java b/app/src/main/java/io/xpipe/app/secret/SecretInPlaceStrategy.java index 714da06d6..16329e6ea 100644 --- a/app/src/main/java/io/xpipe/app/secret/SecretInPlaceStrategy.java +++ b/app/src/main/java/io/xpipe/app/secret/SecretInPlaceStrategy.java @@ -4,7 +4,7 @@ import io.xpipe.app.comp.base.SecretFieldComp; import io.xpipe.app.ext.ValidationException; import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.util.Validators; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/secret/SecretManager.java b/app/src/main/java/io/xpipe/app/secret/SecretManager.java index 0b6bf8b92..fcab32ff4 100644 --- a/app/src/main/java/io/xpipe/app/secret/SecretManager.java +++ b/app/src/main/java/io/xpipe/app/secret/SecretManager.java @@ -4,7 +4,7 @@ import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.process.CountDown; import io.xpipe.app.process.SecretReference; import io.xpipe.app.util.GlobalTimer; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import java.time.Duration; import java.util.*; diff --git a/app/src/main/java/io/xpipe/app/secret/SecretQueryFilter.java b/app/src/main/java/io/xpipe/app/secret/SecretQueryFilter.java index ff0aad20b..1fba8d7ce 100644 --- a/app/src/main/java/io/xpipe/app/secret/SecretQueryFilter.java +++ b/app/src/main/java/io/xpipe/app/secret/SecretQueryFilter.java @@ -1,6 +1,6 @@ package io.xpipe.app.secret; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import java.util.Optional; diff --git a/app/src/main/java/io/xpipe/app/secret/SecretQueryProgress.java b/app/src/main/java/io/xpipe/app/secret/SecretQueryProgress.java index a35e4b17a..e54422d48 100644 --- a/app/src/main/java/io/xpipe/app/secret/SecretQueryProgress.java +++ b/app/src/main/java/io/xpipe/app/secret/SecretQueryProgress.java @@ -3,7 +3,7 @@ package io.xpipe.app.secret; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.process.CountDown; import io.xpipe.app.process.SecretReference; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import lombok.Getter; import lombok.NonNull; diff --git a/app/src/main/java/io/xpipe/app/secret/SecretQueryResult.java b/app/src/main/java/io/xpipe/app/secret/SecretQueryResult.java index b1494db03..e39997af1 100644 --- a/app/src/main/java/io/xpipe/app/secret/SecretQueryResult.java +++ b/app/src/main/java/io/xpipe/app/secret/SecretQueryResult.java @@ -1,6 +1,6 @@ package io.xpipe.app.secret; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/secret/VaultKeySecretValue.java b/app/src/main/java/io/xpipe/app/secret/VaultKeySecretValue.java index 5dbf4993a..5294bd86b 100644 --- a/app/src/main/java/io/xpipe/app/secret/VaultKeySecretValue.java +++ b/app/src/main/java/io/xpipe/app/secret/VaultKeySecretValue.java @@ -1,8 +1,8 @@ package io.xpipe.app.secret; import io.xpipe.app.storage.DataStorage; -import io.xpipe.core.AesSecretValue; -import io.xpipe.core.InPlaceSecretValue; +import io.xpipe.app.util.AesSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.EqualsAndHashCode; diff --git a/app/src/main/java/io/xpipe/app/spice/ExternalSpiceClient.java b/app/src/main/java/io/xpipe/app/spice/ExternalSpiceClient.java index 2a1db62cb..a32c4ae81 100644 --- a/app/src/main/java/io/xpipe/app/spice/ExternalSpiceClient.java +++ b/app/src/main/java/io/xpipe/app/spice/ExternalSpiceClient.java @@ -2,7 +2,7 @@ package io.xpipe.app.spice; import io.xpipe.app.ext.PrefsValue; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java b/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java index 095ee6b4f..d9abb6850 100644 --- a/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java +++ b/app/src/main/java/io/xpipe/app/storage/ContextualFileReference.java @@ -4,7 +4,7 @@ import io.xpipe.app.core.AppProperties; import io.xpipe.app.core.AppSystemInfo; import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorage.java b/app/src/main/java/io/xpipe/app/storage/DataStorage.java index 7f4803cd0..75d67ac71 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorage.java @@ -6,7 +6,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.secret.SecretManager; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.StorePath; +import io.xpipe.app.util.StorePath; import javafx.util.Pair; diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageNode.java b/app/src/main/java/io/xpipe/app/storage/DataStorageNode.java index 1c29ac6b5..9676b7e6a 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorageNode.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageNode.java @@ -5,8 +5,8 @@ import io.xpipe.app.ext.UserScopeStore; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.secret.EncryptionToken; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageSecret.java b/app/src/main/java/io/xpipe/app/storage/DataStorageSecret.java index 6d26a8b8b..9c40c3498 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorageSecret.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageSecret.java @@ -4,10 +4,10 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.secret.EncryptionToken; import io.xpipe.app.secret.PasswordLockSecretValue; import io.xpipe.app.secret.VaultKeySecretValue; -import io.xpipe.core.EncryptedSecretValue; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.EncryptedSecretValue; +import io.xpipe.app.util.InPlaceSecretValue; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.SecretValue; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/app/src/main/java/io/xpipe/app/storage/DataStoreCategory.java b/app/src/main/java/io/xpipe/app/storage/DataStoreCategory.java index 04b87ef6c..a0d456a3a 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStoreCategory.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStoreCategory.java @@ -1,7 +1,7 @@ package io.xpipe.app.storage; import io.xpipe.app.icon.SystemIconManager; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; diff --git a/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java b/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java index 33b60b4f8..3a55d541f 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java @@ -4,7 +4,7 @@ import io.xpipe.app.ext.*; import io.xpipe.app.icon.SystemIconManager; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JacksonException; diff --git a/app/src/main/java/io/xpipe/app/storage/StandardStorage.java b/app/src/main/java/io/xpipe/app/storage/StandardStorage.java index 4d306786d..a095b4970 100644 --- a/app/src/main/java/io/xpipe/app/storage/StandardStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/StandardStorage.java @@ -11,7 +11,7 @@ import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.GlobalTimer; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.Getter; import org.apache.commons.io.FileUtils; diff --git a/app/src/main/java/io/xpipe/app/terminal/ClinkHelper.java b/app/src/main/java/io/xpipe/app/terminal/ClinkHelper.java index 09bc0bf66..cd76a43fb 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ClinkHelper.java +++ b/app/src/main/java/io/xpipe/app/terminal/ClinkHelper.java @@ -3,7 +3,7 @@ package io.xpipe.app.terminal; import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellTemp; import io.xpipe.app.util.GithubReleaseDownloader; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import java.nio.file.FileSystems; diff --git a/app/src/main/java/io/xpipe/app/terminal/ConfigFileTerminalPrompt.java b/app/src/main/java/io/xpipe/app/terminal/ConfigFileTerminalPrompt.java index 4a4f91e3e..a9cfc99a4 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ConfigFileTerminalPrompt.java +++ b/app/src/main/java/io/xpipe/app/terminal/ConfigFileTerminalPrompt.java @@ -6,7 +6,7 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellDialect; import io.xpipe.app.process.ShellScript; import io.xpipe.app.process.ShellTerminalInitCommand; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; diff --git a/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java index dd4139238..6593801aa 100644 --- a/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java @@ -6,7 +6,7 @@ import io.xpipe.app.prefs.ExternalApplicationHelper; import io.xpipe.app.prefs.ExternalApplicationType; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.LocalShell; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.util.Locale; diff --git a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java index 7cd241eda..1409504c4 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java @@ -6,7 +6,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.prefs.ExternalApplicationType; import io.xpipe.app.process.*; import io.xpipe.app.update.AppDistributionType; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java index 3898e34c5..9d86b65ca 100644 --- a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java @@ -11,7 +11,7 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.process.ShellTemp; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/app/src/main/java/io/xpipe/app/terminal/OhMyPoshTerminalPrompt.java b/app/src/main/java/io/xpipe/app/terminal/OhMyPoshTerminalPrompt.java index 545490949..16b042f7a 100644 --- a/app/src/main/java/io/xpipe/app/terminal/OhMyPoshTerminalPrompt.java +++ b/app/src/main/java/io/xpipe/app/terminal/OhMyPoshTerminalPrompt.java @@ -3,8 +3,8 @@ package io.xpipe.app.terminal; import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.*; import io.xpipe.app.util.GithubReleaseDownloader; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/terminal/OhMyZshTerminalPrompt.java b/app/src/main/java/io/xpipe/app/terminal/OhMyZshTerminalPrompt.java index 24bc91a22..d51c59954 100644 --- a/app/src/main/java/io/xpipe/app/terminal/OhMyZshTerminalPrompt.java +++ b/app/src/main/java/io/xpipe/app/terminal/OhMyZshTerminalPrompt.java @@ -6,7 +6,7 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellDialect; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.process.ShellScript; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/terminal/StarshipTerminalPrompt.java b/app/src/main/java/io/xpipe/app/terminal/StarshipTerminalPrompt.java index e3afe15a6..07e135d11 100644 --- a/app/src/main/java/io/xpipe/app/terminal/StarshipTerminalPrompt.java +++ b/app/src/main/java/io/xpipe/app/terminal/StarshipTerminalPrompt.java @@ -3,8 +3,8 @@ package io.xpipe.app.terminal; import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.*; import io.xpipe.app.util.GithubReleaseDownloader; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java index 045f13599..5926c40d9 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java @@ -14,7 +14,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.GlobalTimer; import io.xpipe.app.util.NativeWinWindowControl; import io.xpipe.app.util.Rect; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java b/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java index f0f0b206d..aa22568db 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java @@ -11,8 +11,8 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellScript; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; import lombok.Builder; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalLaunchRequest.java b/app/src/main/java/io/xpipe/app/terminal/TerminalLaunchRequest.java index 00ca1d640..545e6c343 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalLaunchRequest.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalLaunchRequest.java @@ -7,8 +7,8 @@ import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.TerminalInitScriptConfig; import io.xpipe.app.process.WorkingDirectoryFunction; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.beacon.BeaconServerException; -import io.xpipe.core.FilePath; +import io.xpipe.app.beacon.BeaconServerException; +import io.xpipe.app.util.FilePath; import lombok.Setter; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java index 227702815..9dd8db362 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java @@ -8,9 +8,9 @@ import io.xpipe.app.process.*; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FailableFunction; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java index 717aaf334..7879c21e6 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java @@ -6,9 +6,9 @@ import io.xpipe.app.ext.ShellStore; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.process.*; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.beacon.BeaconClientException; -import io.xpipe.beacon.BeaconServerException; -import io.xpipe.core.FilePath; +import io.xpipe.app.beacon.BeaconClientException; +import io.xpipe.app.beacon.BeaconServerException; +import io.xpipe.app.util.FilePath; import java.nio.file.Path; import java.util.*; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexer.java b/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexer.java index fdca946b3..3d405ff21 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexer.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexer.java @@ -5,7 +5,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.ShellControl; import io.xpipe.app.process.ShellScript; import io.xpipe.app.update.AppDistributionType; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexerManager.java b/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexerManager.java index b77cf1510..fb0b1d5b4 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexerManager.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalMultiplexerManager.java @@ -2,7 +2,7 @@ package io.xpipe.app.terminal; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.util.*; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalPaneConfiguration.java b/app/src/main/java/io/xpipe/app/terminal/TerminalPaneConfiguration.java index 613e81c05..64a902c44 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalPaneConfiguration.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalPaneConfiguration.java @@ -7,8 +7,8 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.process.*; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalPrompt.java b/app/src/main/java/io/xpipe/app/terminal/TerminalPrompt.java index c1e3b56b0..c149b4217 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalPrompt.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalPrompt.java @@ -7,7 +7,7 @@ import io.xpipe.app.process.ShellTemp; import io.xpipe.app.process.ShellTerminalInitCommand; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalView.java b/app/src/main/java/io/xpipe/app/terminal/TerminalView.java index eb5cd7355..842c706e0 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalView.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalView.java @@ -7,7 +7,7 @@ import io.xpipe.app.util.ControllableWindowProcess; import io.xpipe.app.util.ControllableWindowsProcess; import io.xpipe.app.util.NativeWinWindowControl; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.Getter; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java index 4c82ba088..89da56a6a 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java @@ -7,7 +7,7 @@ import io.xpipe.app.core.AppCache; import io.xpipe.app.core.AppI18n; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.io.IOException; import java.net.URLEncoder; diff --git a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java index ae53af323..7e8db8035 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java @@ -12,8 +12,8 @@ import io.xpipe.app.process.LocalShell; import io.xpipe.app.util.NativeWinWindowControl; import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.WindowsRegistry; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import lombok.SneakyThrows; diff --git a/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java index 9833bf528..1eb81af3a 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java @@ -10,8 +10,8 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.util.NativeWinWindowControl; -import io.xpipe.core.FilePath; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.JacksonMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/app/src/main/java/io/xpipe/app/terminal/ZellijTerminalMultiplexer.java b/app/src/main/java/io/xpipe/app/terminal/ZellijTerminalMultiplexer.java index 566522f34..96dc59d46 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ZellijTerminalMultiplexer.java +++ b/app/src/main/java/io/xpipe/app/terminal/ZellijTerminalMultiplexer.java @@ -3,8 +3,8 @@ package io.xpipe.app.terminal; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.process.*; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.Builder; diff --git a/app/src/main/java/io/xpipe/app/test/ExtensionTest.java b/app/src/main/java/io/xpipe/app/test/ExtensionTest.java index de1b49819..e8d6d3edd 100644 --- a/app/src/main/java/io/xpipe/app/test/ExtensionTest.java +++ b/app/src/main/java/io/xpipe/app/test/ExtensionTest.java @@ -1,6 +1,6 @@ package io.xpipe.app.test; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.SneakyThrows; diff --git a/app/src/main/java/io/xpipe/app/test/LocalExtensionTest.java b/app/src/main/java/io/xpipe/app/test/LocalExtensionTest.java index 6ed97f698..ec14fa381 100644 --- a/app/src/main/java/io/xpipe/app/test/LocalExtensionTest.java +++ b/app/src/main/java/io/xpipe/app/test/LocalExtensionTest.java @@ -1,7 +1,7 @@ package io.xpipe.app.test; import io.xpipe.app.core.mode.AppOperationMode; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.SneakyThrows; import org.junit.jupiter.api.BeforeAll; diff --git a/app/src/main/java/io/xpipe/app/test/TestModule.java b/app/src/main/java/io/xpipe/app/test/TestModule.java index b8ec2026c..700063ec5 100644 --- a/app/src/main/java/io/xpipe/app/test/TestModule.java +++ b/app/src/main/java/io/xpipe/app/test/TestModule.java @@ -1,6 +1,6 @@ package io.xpipe.app.test; -import io.xpipe.core.FailableSupplier; +import io.xpipe.app.util.FailableSupplier; import lombok.SneakyThrows; import org.junit.jupiter.api.Named; diff --git a/app/src/main/java/io/xpipe/app/update/AppDistributionType.java b/app/src/main/java/io/xpipe/app/update/AppDistributionType.java index dfcb57158..122352334 100644 --- a/app/src/main/java/io/xpipe/app/update/AppDistributionType.java +++ b/app/src/main/java/io/xpipe/app/update/AppDistributionType.java @@ -6,7 +6,7 @@ import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.process.ShellScript; import io.xpipe.app.util.LocalExec; import io.xpipe.app.util.Translatable; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/update/AppDownloads.java b/app/src/main/java/io/xpipe/app/update/AppDownloads.java index 1a33eff98..4c66ceb36 100644 --- a/app/src/main/java/io/xpipe/app/update/AppDownloads.java +++ b/app/src/main/java/io/xpipe/app/update/AppDownloads.java @@ -7,8 +7,8 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.*; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.OsType; +import io.xpipe.app.util.JacksonMapper; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import org.apache.commons.io.FileUtils; diff --git a/app/src/main/java/io/xpipe/app/update/AppInstaller.java b/app/src/main/java/io/xpipe/app/update/AppInstaller.java index 6b769d376..a81a36d71 100644 --- a/app/src/main/java/io/xpipe/app/update/AppInstaller.java +++ b/app/src/main/java/io/xpipe/app/update/AppInstaller.java @@ -7,8 +7,8 @@ import io.xpipe.app.process.ScriptHelper; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.process.ShellScript; import io.xpipe.app.terminal.TerminalLaunch; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/update/AppRelease.java b/app/src/main/java/io/xpipe/app/update/AppRelease.java index 6f48fb754..0983cf66c 100644 --- a/app/src/main/java/io/xpipe/app/update/AppRelease.java +++ b/app/src/main/java/io/xpipe/app/update/AppRelease.java @@ -2,7 +2,7 @@ package io.xpipe.app.update; import io.xpipe.app.core.AppNames; import io.xpipe.app.core.AppProperties; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/update/UpdateAvailableDialog.java b/app/src/main/java/io/xpipe/app/update/UpdateAvailableDialog.java index eb816b36a..8ff7fb409 100644 --- a/app/src/main/java/io/xpipe/app/update/UpdateAvailableDialog.java +++ b/app/src/main/java/io/xpipe/app/update/UpdateAvailableDialog.java @@ -3,11 +3,16 @@ package io.xpipe.app.update; import io.xpipe.app.comp.RegionBuilder; import io.xpipe.app.comp.base.MarkdownComp; import io.xpipe.app.comp.base.ModalOverlay; +import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.TrackEvent; public class UpdateAvailableDialog { public static boolean showIfNeeded(boolean wait) { + if (AppProperties.get().isAotTrainMode()) { + return false; + } + UpdateHandler uh = AppDistributionType.get().getUpdateHandler(); if (uh.getPreparedUpdate().getValue() == null) { return false; diff --git a/app/src/main/java/io/xpipe/app/update/UpdateChangelogDialog.java b/app/src/main/java/io/xpipe/app/update/UpdateChangelogDialog.java index c00094f16..980e5c45d 100644 --- a/app/src/main/java/io/xpipe/app/update/UpdateChangelogDialog.java +++ b/app/src/main/java/io/xpipe/app/update/UpdateChangelogDialog.java @@ -12,7 +12,7 @@ import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.Hyperlinks; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import java.nio.file.Files; diff --git a/core/src/main/java/io/xpipe/core/AesSecretValue.java b/app/src/main/java/io/xpipe/app/util/AesSecretValue.java similarity index 98% rename from core/src/main/java/io/xpipe/core/AesSecretValue.java rename to app/src/main/java/io/xpipe/app/util/AesSecretValue.java index 258343d41..46c55afab 100644 --- a/core/src/main/java/io/xpipe/core/AesSecretValue.java +++ b/app/src/main/java/io/xpipe/app/util/AesSecretValue.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import lombok.EqualsAndHashCode; import lombok.SneakyThrows; diff --git a/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java b/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java index 38e6460b2..68c86dc6f 100644 --- a/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java +++ b/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java @@ -1,5 +1,11 @@ package io.xpipe.app.util; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.xpipe.app.beacon.BeaconAuthMethod; +import io.xpipe.app.beacon.BeaconClientInformation; import io.xpipe.app.cred.SecurityKeyImpl; import io.xpipe.app.cred.SshIdentityStrategy; import io.xpipe.app.ext.HostAddress; @@ -15,9 +21,6 @@ import io.xpipe.app.terminal.ExternalTerminalType; import io.xpipe.app.terminal.TerminalMultiplexer; import io.xpipe.app.terminal.TerminalPrompt; import io.xpipe.app.vnc.ExternalVncClient; -import io.xpipe.core.InPlaceSecretValue; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.OsType; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -34,6 +37,9 @@ import com.fasterxml.jackson.databind.type.SimpleType; import java.io.CharArrayReader; import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.InvalidPathException; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -43,6 +49,13 @@ public class AppJacksonModule extends SimpleModule { @Override public void setupModule(SetupContext context) { + context.registerSubtypes( + new NamedType(BeaconClientInformation.Api.class), + new NamedType(BeaconClientInformation.Cli.class), + new NamedType(BeaconClientInformation.Daemon.class)); + context.registerSubtypes( + new NamedType(BeaconAuthMethod.Local.class), new NamedType(BeaconAuthMethod.ApiKey.class)); + context.registerSubtypes(VaultKeySecretValue.class); context.registerSubtypes(PasswordLockSecretValue.class); @@ -92,9 +105,106 @@ public class AppJacksonModule extends SimpleModule { context.registerSubtypes(DataStorageGroupStrategy.getClasses()); context.registerSubtypes(KeeperPasswordManager.KeeperAuth.getClasses()); + context.registerSubtypes(new NamedType(InPlaceSecretValue.class)); + + addSerializer(FilePath.class, new FilePathSerializer()); + addDeserializer(FilePath.class, new FilePathDeserializer()); + + addSerializer(StorePath.class, new StorePathSerializer()); + addDeserializer(StorePath.class, new StorePathDeserializer()); + + addSerializer(Charset.class, new CharsetSerializer()); + addDeserializer(Charset.class, new CharsetDeserializer()); + + addSerializer(Path.class, new LocalPathSerializer()); + addDeserializer(Path.class, new LocalPathDeserializer()); + + context.setMixInAnnotations(Throwable.class, ThrowableTypeMixIn.class); + super.setupModule(context); } + public static class StorePathSerializer extends JsonSerializer { + + @Override + public void serialize(StorePath value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + var ar = value.getNames().toArray(String[]::new); + jgen.writeArray(ar, 0, ar.length); + } + } + + public static class StorePathDeserializer extends JsonDeserializer { + + @Override + public StorePath deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + JavaType javaType = + JacksonMapper.getDefault().getTypeFactory().constructCollectionLikeType(List.class, String.class); + List list = JacksonMapper.getDefault().readValue(p, javaType); + return new StorePath(list); + } + } + + public static class FilePathSerializer extends JsonSerializer { + + @Override + public void serialize(FilePath value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + jgen.writeString(value.toString()); + } + } + + public static class FilePathDeserializer extends JsonDeserializer { + + @Override + public FilePath deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + return FilePath.of(p.getValueAsString()); + } + } + + public static class CharsetSerializer extends JsonSerializer { + + @Override + public void serialize(Charset value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + jgen.writeString(value.name()); + } + } + + public static class CharsetDeserializer extends JsonDeserializer { + + @Override + public Charset deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + return Charset.forName(p.getValueAsString()); + } + } + + public static class LocalPathSerializer extends JsonSerializer { + + @Override + public void serialize(Path value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + jgen.writeString(value.toString()); + } + } + + public static class LocalPathDeserializer extends JsonDeserializer { + + @Override + public Path deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + try { + return Path.of(p.getValueAsString()); + } catch (InvalidPathException ignored) { + return null; + } + } + } + + @JsonSerialize(as = Throwable.class) + @JsonPropertyOrder(alphabetic = true) + public abstract static class ThrowableTypeMixIn { + + @SuppressWarnings("unused") + @JsonIdentityInfo(generator = ObjectIdGenerators.StringIdGenerator.class, property = "$id") + private Throwable cause; + } + public static class KeePassXcPasswordManagerSerializer extends JsonSerializer { @Override diff --git a/app/src/main/java/io/xpipe/app/util/AskpassAlert.java b/app/src/main/java/io/xpipe/app/util/AskpassAlert.java index 5fa30d137..b0e210086 100644 --- a/app/src/main/java/io/xpipe/app/util/AskpassAlert.java +++ b/app/src/main/java/io/xpipe/app/util/AskpassAlert.java @@ -6,7 +6,6 @@ import io.xpipe.app.core.window.AppSideWindow; import io.xpipe.app.secret.SecretManager; import io.xpipe.app.secret.SecretQueryResult; import io.xpipe.app.secret.SecretQueryState; -import io.xpipe.core.InPlaceSecretValue; import javafx.animation.AnimationTimer; import javafx.application.Platform; diff --git a/app/src/main/java/io/xpipe/app/util/BooleanScope.java b/app/src/main/java/io/xpipe/app/util/BooleanScope.java index b071abf43..2dc7fded1 100644 --- a/app/src/main/java/io/xpipe/app/util/BooleanScope.java +++ b/app/src/main/java/io/xpipe/app/util/BooleanScope.java @@ -1,7 +1,5 @@ package io.xpipe.app.util; -import io.xpipe.core.FailableRunnable; - import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; diff --git a/app/src/main/java/io/xpipe/app/util/Deobfuscator.java b/app/src/main/java/io/xpipe/app/util/Deobfuscator.java index c4c1e6e29..6c58b6542 100644 --- a/app/src/main/java/io/xpipe/app/util/Deobfuscator.java +++ b/app/src/main/java/io/xpipe/app/util/Deobfuscator.java @@ -4,7 +4,6 @@ import io.xpipe.app.core.AppNames; import io.xpipe.app.core.AppProperties; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.process.ShellDialects; -import io.xpipe.core.OsType; import org.apache.commons.lang3.exception.ExceptionUtils; diff --git a/app/src/main/java/io/xpipe/app/util/DesktopHelper.java b/app/src/main/java/io/xpipe/app/util/DesktopHelper.java index 1bb181303..6ab0c3a94 100644 --- a/app/src/main/java/io/xpipe/app/util/DesktopHelper.java +++ b/app/src/main/java/io/xpipe/app/util/DesktopHelper.java @@ -5,8 +5,6 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.ExternalApplicationHelper; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; import java.awt.*; import java.net.URI; diff --git a/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java b/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java index 569d9796c..2482a747c 100644 --- a/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java +++ b/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java @@ -8,8 +8,6 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.update.AppDistributionType; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; import java.io.IOException; import java.nio.file.Files; diff --git a/core/src/main/java/io/xpipe/core/EncryptedSecretValue.java b/app/src/main/java/io/xpipe/app/util/EncryptedSecretValue.java similarity index 98% rename from core/src/main/java/io/xpipe/core/EncryptedSecretValue.java rename to app/src/main/java/io/xpipe/app/util/EncryptedSecretValue.java index 03599be06..ed78aeac2 100644 --- a/core/src/main/java/io/xpipe/core/EncryptedSecretValue.java +++ b/app/src/main/java/io/xpipe/app/util/EncryptedSecretValue.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/core/src/main/java/io/xpipe/core/FailableBiFunction.java b/app/src/main/java/io/xpipe/app/util/FailableBiFunction.java similarity index 83% rename from core/src/main/java/io/xpipe/core/FailableBiFunction.java rename to app/src/main/java/io/xpipe/app/util/FailableBiFunction.java index f4062d510..832c5055e 100644 --- a/core/src/main/java/io/xpipe/core/FailableBiFunction.java +++ b/app/src/main/java/io/xpipe/app/util/FailableBiFunction.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; @FunctionalInterface public interface FailableBiFunction { diff --git a/core/src/main/java/io/xpipe/core/FailableConsumer.java b/app/src/main/java/io/xpipe/app/util/FailableConsumer.java similarity index 81% rename from core/src/main/java/io/xpipe/core/FailableConsumer.java rename to app/src/main/java/io/xpipe/app/util/FailableConsumer.java index 07a89a44b..51907c729 100644 --- a/core/src/main/java/io/xpipe/core/FailableConsumer.java +++ b/app/src/main/java/io/xpipe/app/util/FailableConsumer.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; @FunctionalInterface public interface FailableConsumer { diff --git a/core/src/main/java/io/xpipe/core/FailableFunction.java b/app/src/main/java/io/xpipe/app/util/FailableFunction.java similarity index 81% rename from core/src/main/java/io/xpipe/core/FailableFunction.java rename to app/src/main/java/io/xpipe/app/util/FailableFunction.java index 0ba109719..ea704e3e9 100644 --- a/core/src/main/java/io/xpipe/core/FailableFunction.java +++ b/app/src/main/java/io/xpipe/app/util/FailableFunction.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; @FunctionalInterface public interface FailableFunction { diff --git a/core/src/main/java/io/xpipe/core/FailableRunnable.java b/app/src/main/java/io/xpipe/app/util/FailableRunnable.java similarity index 79% rename from core/src/main/java/io/xpipe/core/FailableRunnable.java rename to app/src/main/java/io/xpipe/app/util/FailableRunnable.java index 6a8e1876f..4b5c010ff 100644 --- a/core/src/main/java/io/xpipe/core/FailableRunnable.java +++ b/app/src/main/java/io/xpipe/app/util/FailableRunnable.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; @FunctionalInterface public interface FailableRunnable { diff --git a/core/src/main/java/io/xpipe/core/FailableSupplier.java b/app/src/main/java/io/xpipe/app/util/FailableSupplier.java similarity index 73% rename from core/src/main/java/io/xpipe/core/FailableSupplier.java rename to app/src/main/java/io/xpipe/app/util/FailableSupplier.java index 4f939a54b..e0f5fff92 100644 --- a/core/src/main/java/io/xpipe/core/FailableSupplier.java +++ b/app/src/main/java/io/xpipe/app/util/FailableSupplier.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; public interface FailableSupplier { diff --git a/app/src/main/java/io/xpipe/app/util/FileBridge.java b/app/src/main/java/io/xpipe/app/util/FileBridge.java index e7b8002ab..20713c1ae 100644 --- a/app/src/main/java/io/xpipe/app/util/FileBridge.java +++ b/app/src/main/java/io/xpipe/app/util/FileBridge.java @@ -8,8 +8,6 @@ import io.xpipe.app.core.AppLocalTemp; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.process.OsFileSystem; -import io.xpipe.core.FailableFunction; -import io.xpipe.core.FailableSupplier; import lombok.Getter; import org.apache.commons.io.FileUtils; diff --git a/app/src/main/java/io/xpipe/app/util/FileOpener.java b/app/src/main/java/io/xpipe/app/util/FileOpener.java index f624fc7c2..01105d2be 100644 --- a/app/src/main/java/io/xpipe/app/util/FileOpener.java +++ b/app/src/main/java/io/xpipe/app/util/FileOpener.java @@ -8,7 +8,6 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.OsType; import com.sun.jna.platform.win32.Shell32; import com.sun.jna.platform.win32.ShellAPI; diff --git a/core/src/main/java/io/xpipe/core/FilePath.java b/app/src/main/java/io/xpipe/app/util/FilePath.java similarity index 99% rename from core/src/main/java/io/xpipe/core/FilePath.java rename to app/src/main/java/io/xpipe/app/util/FilePath.java index a05101a52..7b2865f1d 100644 --- a/core/src/main/java/io/xpipe/core/FilePath.java +++ b/app/src/main/java/io/xpipe/app/util/FilePath.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import lombok.NonNull; diff --git a/app/src/main/java/io/xpipe/app/util/FileReference.java b/app/src/main/java/io/xpipe/app/util/FileReference.java index 4c2bba08e..f4226be50 100644 --- a/app/src/main/java/io/xpipe/app/util/FileReference.java +++ b/app/src/main/java/io/xpipe/app/util/FileReference.java @@ -2,7 +2,6 @@ package io.xpipe.app.util; import io.xpipe.app.ext.FileSystemStore; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.FilePath; import lombok.Value; import lombok.experimental.SuperBuilder; diff --git a/app/src/main/java/io/xpipe/app/util/GithubReleaseDownloader.java b/app/src/main/java/io/xpipe/app/util/GithubReleaseDownloader.java index 01ac9a430..da72b7d90 100644 --- a/app/src/main/java/io/xpipe/app/util/GithubReleaseDownloader.java +++ b/app/src/main/java/io/xpipe/app/util/GithubReleaseDownloader.java @@ -3,7 +3,6 @@ package io.xpipe.app.util; import io.xpipe.app.core.AppLocalTemp; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.LocalShell; -import io.xpipe.core.JacksonMapper; import java.net.URI; import java.net.http.HttpRequest; diff --git a/app/src/main/java/io/xpipe/app/util/GroupFile.java b/app/src/main/java/io/xpipe/app/util/GroupFile.java index 7d1341c4c..244778e51 100644 --- a/app/src/main/java/io/xpipe/app/util/GroupFile.java +++ b/app/src/main/java/io/xpipe/app/util/GroupFile.java @@ -2,7 +2,6 @@ package io.xpipe.app.util; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.OsType; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/util/HashicorpVaultConfig.java b/app/src/main/java/io/xpipe/app/util/HashicorpVaultConfig.java index f46a25217..30d0e2d5a 100644 --- a/app/src/main/java/io/xpipe/app/util/HashicorpVaultConfig.java +++ b/app/src/main/java/io/xpipe/app/util/HashicorpVaultConfig.java @@ -11,8 +11,6 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.*; import io.xpipe.app.pwman.PasswordManager; import io.xpipe.app.terminal.TerminalLaunch; -import io.xpipe.core.FilePath; -import io.xpipe.core.JacksonMapper; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; diff --git a/app/src/main/java/io/xpipe/app/util/HttpProxy.java b/app/src/main/java/io/xpipe/app/util/HttpProxy.java index ee17ba860..9c334400c 100644 --- a/app/src/main/java/io/xpipe/app/util/HttpProxy.java +++ b/app/src/main/java/io/xpipe/app/util/HttpProxy.java @@ -5,7 +5,6 @@ import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.InPlaceSecretValue; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/core/src/main/java/io/xpipe/core/InPlaceSecretValue.java b/app/src/main/java/io/xpipe/app/util/InPlaceSecretValue.java similarity index 98% rename from core/src/main/java/io/xpipe/core/InPlaceSecretValue.java rename to app/src/main/java/io/xpipe/app/util/InPlaceSecretValue.java index 4b08cb7b2..5221a40c2 100644 --- a/core/src/main/java/io/xpipe/core/InPlaceSecretValue.java +++ b/app/src/main/java/io/xpipe/app/util/InPlaceSecretValue.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.EqualsAndHashCode; diff --git a/core/src/main/java/io/xpipe/core/JacksonMapper.java b/app/src/main/java/io/xpipe/app/util/JacksonMapper.java similarity index 96% rename from core/src/main/java/io/xpipe/core/JacksonMapper.java rename to app/src/main/java/io/xpipe/app/util/JacksonMapper.java index e4a6058fc..9370486be 100644 --- a/core/src/main/java/io/xpipe/core/JacksonMapper.java +++ b/app/src/main/java/io/xpipe/app/util/JacksonMapper.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.core.JsonGenerator; @@ -54,8 +54,7 @@ public class JacksonMapper { private static List findModules(ModuleLayer layer) { ArrayList modules = new ArrayList<>(); - ServiceLoader loader = - layer != null ? ServiceLoader.load(layer, Module.class) : ServiceLoader.load(Module.class); + ServiceLoader loader = ServiceLoader.load(layer, Module.class); for (Module module : loader) { modules.add(module); } @@ -150,5 +149,10 @@ public class JacksonMapper { INSTANCE.registerModules(modules); init = true; } + + @Override + public boolean initForCli() { + return true; + } } } diff --git a/core/src/main/java/io/xpipe/core/KeyValue.java b/app/src/main/java/io/xpipe/app/util/KeyValue.java similarity index 96% rename from core/src/main/java/io/xpipe/core/KeyValue.java rename to app/src/main/java/io/xpipe/app/util/KeyValue.java index dc8e30aa0..c67feb833 100644 --- a/core/src/main/java/io/xpipe/core/KeyValue.java +++ b/app/src/main/java/io/xpipe/app/util/KeyValue.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/app/src/main/java/io/xpipe/app/util/LicenseProvider.java b/app/src/main/java/io/xpipe/app/util/LicenseProvider.java index db0b5984f..1dae74307 100644 --- a/app/src/main/java/io/xpipe/app/util/LicenseProvider.java +++ b/app/src/main/java/io/xpipe/app/util/LicenseProvider.java @@ -2,7 +2,6 @@ package io.xpipe.app.util; import io.xpipe.app.comp.BaseRegionBuilder; import io.xpipe.app.ext.ExtensionException; -import io.xpipe.core.ModuleLayerLoader; import javafx.beans.value.ObservableValue; @@ -49,5 +48,10 @@ public abstract class LicenseProvider { .findFirst() .orElseThrow(() -> ExtensionException.corrupt("Missing license provider")); } + + @Override + public boolean initForCli() { + return false; + } } } diff --git a/app/src/main/java/io/xpipe/app/util/LocalExec.java b/app/src/main/java/io/xpipe/app/util/LocalExec.java index a44f3f471..6290a0d6f 100644 --- a/app/src/main/java/io/xpipe/app/util/LocalExec.java +++ b/app/src/main/java/io/xpipe/app/util/LocalExec.java @@ -25,6 +25,9 @@ public class LocalExec { // https://bugs.openjdk.org/browse/JDK-8360500 env.remove("_JPACKAGE_LAUNCHER"); + env.remove("_JAVA_OPTIONS"); + env.remove("JAVA_TOOL_OPTIONS"); + return pb.start(); } catch (Exception ex) { TrackEvent.withTrace("Local command finished") @@ -48,6 +51,9 @@ public class LocalExec { // https://bugs.openjdk.org/browse/JDK-8360500 env.remove("_JPACKAGE_LAUNCHER"); + env.remove("_JAVA_OPTIONS"); + env.remove("JAVA_TOOL_OPTIONS"); + var process = pb.start(); var out = process.getInputStream().readAllBytes(); process.waitFor(); diff --git a/core/src/main/java/io/xpipe/core/ModuleLayerLoader.java b/app/src/main/java/io/xpipe/app/util/ModuleLayerLoader.java similarity index 50% rename from core/src/main/java/io/xpipe/core/ModuleLayerLoader.java rename to app/src/main/java/io/xpipe/app/util/ModuleLayerLoader.java index 695000a74..0cfdaee75 100644 --- a/core/src/main/java/io/xpipe/core/ModuleLayerLoader.java +++ b/app/src/main/java/io/xpipe/app/util/ModuleLayerLoader.java @@ -1,4 +1,6 @@ -package io.xpipe.core; +package io.xpipe.app.util; + +import io.xpipe.app.core.AppProperties; import java.util.ServiceLoader; import java.util.function.Consumer; @@ -6,13 +8,11 @@ import java.util.function.Consumer; public interface ModuleLayerLoader { static void loadAll(ModuleLayer layer, Consumer errorHandler) { - var loaded = layer != null - ? ServiceLoader.load(layer, ModuleLayerLoader.class) - : ServiceLoader.load(ModuleLayerLoader.class); - loaded.stream().forEach(moduleLayerLoaderProvider -> { - var instance = moduleLayerLoaderProvider.get(); + var loaded = ServiceLoader.load(layer, ModuleLayerLoader.class); + loaded.stream().map(ServiceLoader.Provider::get) + .filter(p -> p.initForCli() || !AppProperties.get().isCli()).forEach(p -> { try { - instance.init(layer); + p.init(layer); } catch (Throwable t) { errorHandler.accept(t); } @@ -20,4 +20,6 @@ public interface ModuleLayerLoader { } default void init(ModuleLayer layer) {} + + boolean initForCli(); } diff --git a/app/src/main/java/io/xpipe/app/util/OpenBaoConfig.java b/app/src/main/java/io/xpipe/app/util/OpenBaoConfig.java index b027510de..b6939b222 100644 --- a/app/src/main/java/io/xpipe/app/util/OpenBaoConfig.java +++ b/app/src/main/java/io/xpipe/app/util/OpenBaoConfig.java @@ -8,8 +8,6 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.process.*; import io.xpipe.app.pwman.PasswordManager; import io.xpipe.app.terminal.TerminalLaunch; -import io.xpipe.core.FilePath; -import io.xpipe.core.JacksonMapper; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; diff --git a/core/src/main/java/io/xpipe/core/OsType.java b/app/src/main/java/io/xpipe/app/util/OsType.java similarity index 99% rename from core/src/main/java/io/xpipe/core/OsType.java rename to app/src/main/java/io/xpipe/app/util/OsType.java index 30b35914a..8668e3479 100644 --- a/core/src/main/java/io/xpipe/core/OsType.java +++ b/app/src/main/java/io/xpipe/app/util/OsType.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import java.util.Locale; diff --git a/app/src/main/java/io/xpipe/app/util/PasswdFile.java b/app/src/main/java/io/xpipe/app/util/PasswdFile.java index 43f21337f..169b2a5ff 100644 --- a/app/src/main/java/io/xpipe/app/util/PasswdFile.java +++ b/app/src/main/java/io/xpipe/app/util/PasswdFile.java @@ -2,7 +2,6 @@ package io.xpipe.app.util; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.OsType; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/util/RdpConfig.java b/app/src/main/java/io/xpipe/app/util/RdpConfig.java index 762d2148a..b7562b222 100644 --- a/app/src/main/java/io/xpipe/app/util/RdpConfig.java +++ b/app/src/main/java/io/xpipe/app/util/RdpConfig.java @@ -1,8 +1,6 @@ package io.xpipe.app.util; import io.xpipe.app.issue.ErrorEventFactory; -import io.xpipe.core.FilePath; -import io.xpipe.core.StreamCharset; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/util/RemminaHelper.java b/app/src/main/java/io/xpipe/app/util/RemminaHelper.java index 6f90660b8..246f7d47d 100644 --- a/app/src/main/java/io/xpipe/app/util/RemminaHelper.java +++ b/app/src/main/java/io/xpipe/app/util/RemminaHelper.java @@ -6,7 +6,6 @@ import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.rdp.RdpLaunchConfig; import io.xpipe.app.vnc.VncLaunchConfig; -import io.xpipe.core.SecretValue; import java.nio.file.Files; import java.nio.file.Path; diff --git a/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java b/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java index 4438be9e2..5cc0df490 100644 --- a/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java +++ b/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java @@ -9,7 +9,6 @@ import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStoreColor; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; diff --git a/core/src/main/java/io/xpipe/core/SecretValue.java b/app/src/main/java/io/xpipe/app/util/SecretValue.java similarity index 97% rename from core/src/main/java/io/xpipe/core/SecretValue.java rename to app/src/main/java/io/xpipe/app/util/SecretValue.java index d18505307..da9b9daaf 100644 --- a/core/src/main/java/io/xpipe/core/SecretValue.java +++ b/app/src/main/java/io/xpipe/app/util/SecretValue.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java b/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java index 8d0a2c483..2c2957de9 100644 --- a/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java +++ b/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java @@ -7,7 +7,6 @@ import io.xpipe.app.core.AppSystemInfo; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.*; -import io.xpipe.core.FilePath; import lombok.Getter; import lombok.Setter; diff --git a/core/src/main/java/io/xpipe/core/StorePath.java b/app/src/main/java/io/xpipe/app/util/StorePath.java similarity index 98% rename from core/src/main/java/io/xpipe/core/StorePath.java rename to app/src/main/java/io/xpipe/app/util/StorePath.java index 4a3b7152a..d6de69d28 100644 --- a/core/src/main/java/io/xpipe/core/StorePath.java +++ b/app/src/main/java/io/xpipe/app/util/StorePath.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import com.fasterxml.jackson.annotation.JsonCreator; import lombok.EqualsAndHashCode; diff --git a/core/src/main/java/io/xpipe/core/StreamCharset.java b/app/src/main/java/io/xpipe/app/util/StreamCharset.java similarity index 99% rename from core/src/main/java/io/xpipe/core/StreamCharset.java rename to app/src/main/java/io/xpipe/app/util/StreamCharset.java index fc2419cdc..d08da0188 100644 --- a/core/src/main/java/io/xpipe/core/StreamCharset.java +++ b/app/src/main/java/io/xpipe/app/util/StreamCharset.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/util/ThreadHelper.java b/app/src/main/java/io/xpipe/app/util/ThreadHelper.java index f8c7c99cf..c1924c898 100644 --- a/app/src/main/java/io/xpipe/app/util/ThreadHelper.java +++ b/app/src/main/java/io/xpipe/app/util/ThreadHelper.java @@ -3,7 +3,6 @@ package io.xpipe.app.util; import io.xpipe.app.core.AppProperties; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; -import io.xpipe.core.FailableRunnable; import lombok.SneakyThrows; diff --git a/core/src/main/java/io/xpipe/core/UuidHelper.java b/app/src/main/java/io/xpipe/app/util/UuidHelper.java similarity index 95% rename from core/src/main/java/io/xpipe/core/UuidHelper.java rename to app/src/main/java/io/xpipe/app/util/UuidHelper.java index 702cd9359..e488fcf7b 100644 --- a/core/src/main/java/io/xpipe/core/UuidHelper.java +++ b/app/src/main/java/io/xpipe/app/util/UuidHelper.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import java.nio.charset.StandardCharsets; import java.util.Arrays; diff --git a/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java b/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java index 2f5d88637..f43d7abc1 100644 --- a/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java +++ b/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java @@ -4,7 +4,6 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.LocalShell; import io.xpipe.app.process.ShellControl; -import io.xpipe.core.OsType; import com.sun.jna.Native; import com.sun.jna.platform.win32.Advapi32; diff --git a/core/src/main/java/io/xpipe/core/XPipeDaemonMode.java b/app/src/main/java/io/xpipe/app/util/XPipeDaemonMode.java similarity index 98% rename from core/src/main/java/io/xpipe/core/XPipeDaemonMode.java rename to app/src/main/java/io/xpipe/app/util/XPipeDaemonMode.java index 3093fe366..4fe223f93 100644 --- a/core/src/main/java/io/xpipe/core/XPipeDaemonMode.java +++ b/app/src/main/java/io/xpipe/app/util/XPipeDaemonMode.java @@ -1,4 +1,4 @@ -package io.xpipe.core; +package io.xpipe.app.util; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; diff --git a/app/src/main/java/io/xpipe/app/vnc/ExternalVncClient.java b/app/src/main/java/io/xpipe/app/vnc/ExternalVncClient.java index 1510ec77a..a136f7e6f 100644 --- a/app/src/main/java/io/xpipe/app/vnc/ExternalVncClient.java +++ b/app/src/main/java/io/xpipe/app/vnc/ExternalVncClient.java @@ -3,7 +3,7 @@ package io.xpipe.app.vnc; import io.xpipe.app.ext.PrefsValue; import io.xpipe.app.platform.ClipboardHelper; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/app/src/main/java/io/xpipe/app/vnc/VncLaunchConfig.java b/app/src/main/java/io/xpipe/app/vnc/VncLaunchConfig.java index fb6979c9d..5fe0cbd64 100644 --- a/app/src/main/java/io/xpipe/app/vnc/VncLaunchConfig.java +++ b/app/src/main/java/io/xpipe/app/vnc/VncLaunchConfig.java @@ -3,7 +3,7 @@ package io.xpipe.app.vnc; import io.xpipe.app.process.ShellControl; import io.xpipe.app.secret.SecretManager; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.SecretValue; +import io.xpipe.app.util.SecretValue; import lombok.Value; diff --git a/app/src/main/java/module-info.java b/app/src/main/java/module-info.java index 581578039..62a509326 100644 --- a/app/src/main/java/module-info.java +++ b/app/src/main/java/module-info.java @@ -1,6 +1,6 @@ import io.xpipe.app.action.ActionProvider; import io.xpipe.app.action.XPipeUrlProvider; -import io.xpipe.app.beacon.impl.*; +import io.xpipe.app.beacon.api.*; import io.xpipe.app.browser.action.BrowserActionProvider; import io.xpipe.app.browser.action.impl.*; import io.xpipe.app.browser.menu.impl.*; @@ -14,9 +14,10 @@ import io.xpipe.app.process.ShellDialect; import io.xpipe.app.process.ShellDialects; import io.xpipe.app.terminal.TerminalLauncher; import io.xpipe.app.util.AppJacksonModule; +import io.xpipe.app.util.JacksonMapper; import io.xpipe.app.util.LicenseProvider; -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.ModuleLayerLoader; +import io.xpipe.app.beacon.BeaconInterface; +import io.xpipe.app.util.ModuleLayerLoader; import com.fasterxml.jackson.databind.Module; import org.slf4j.spi.SLF4JServiceProvider; @@ -60,6 +61,7 @@ open module io.xpipe.app { exports io.xpipe.app.platform; exports io.xpipe.app.spice; exports io.xpipe.app.cred; + exports io.xpipe.app.beacon.api; requires com.sun.jna; requires com.sun.jna.platform; @@ -70,9 +72,9 @@ open module io.xpipe.app { requires com.fasterxml.jackson.core; requires com.fasterxml.jackson.databind; requires com.fasterxml.jackson.annotation; + requires com.fasterxml.jackson.datatype.jsr310; requires net.synedra.validatorfx; requires io.xpipe.modulefs; - requires io.xpipe.core; requires static lombok; requires org.apache.commons.io; requires org.apache.commons.lang3; @@ -84,7 +86,6 @@ open module io.xpipe.app { requires javafx.graphics; requires org.kordamp.ikonli.javafx; requires io.sentry; - requires io.xpipe.beacon; requires info.picocli; requires java.instrument; requires java.management; @@ -123,11 +124,13 @@ open module io.xpipe.app { uses BrowserActionProvider; uses LicenseProvider; uses io.xpipe.app.util.LicensedFeature; - uses io.xpipe.beacon.BeaconInterface; + uses BeaconInterface; uses DataStorageExtensionProvider; uses ProcessControlProvider; uses ShellDialect; uses CloudSetupProvider; + uses CliProvider; + uses Module; provides ActionProvider with GradleRunMenuProvider, @@ -209,6 +212,8 @@ open module io.xpipe.app { provides Module with AppJacksonModule; provides ModuleLayerLoader with + JacksonMapper.Loader, + BeaconInterface.Loader, DataStorageExtensionProvider.Loader, DataStoreProviders.Loader, ActionProvider.Loader, @@ -216,43 +221,39 @@ open module io.xpipe.app { LicenseProvider.Loader, ScanProvider.Loader, ShellDialects.Loader, - CloudSetupProvider.Loader; + CloudSetupProvider.Loader, + CliProvider.Loader; provides SLF4JServiceProvider with AppLogs.Slf4jProvider; provides EventHandler with EventHandlerImpl; - provides BeaconInterface with - ShellStartExchangeImpl, - ShellStopExchangeImpl, - ShellExecExchangeImpl, - ConnectionQueryExchangeImpl, - ConnectionInfoExchangeImpl, - ConnectionRemoveExchangeImpl, - ConnectionAddExchangeImpl, - CategoryAddExchangeImpl, - CategoryQueryExchangeImpl, - CategoryInfoExchangeImpl, - CategoryRemoveExchangeImpl, - ActionExchangeImpl, - ConnectionRefreshExchangeImpl, - DaemonOpenExchangeImpl, - DaemonFocusExchangeImpl, - DaemonStatusExchangeImpl, - DaemonStopExchangeImpl, - HandshakeExchangeImpl, - DaemonModeExchangeImpl, - FsBlobExchangeImpl, - FsReadExchangeImpl, - FsScriptExchangeImpl, - FsWriteExchangeImpl, - AskpassExchangeImpl, - TerminalPrepareExchangeImpl, - TerminalRegisterExchangeImpl, - TerminalWaitExchangeImpl, - TerminalLaunchExchangeImpl, - TerminalExternalLaunchExchangeImpl, - SshLaunchExchangeImpl, - DaemonVersionExchangeImpl, - SecretEncryptExchangeImpl, - SecretDecryptExchangeImpl; + provides BeaconInterface with ShellStartExchange, ShellStopExchange, ShellExecExchange, DaemonModeExchange, DaemonStatusExchange, + DaemonFocusExchange, + DaemonOpenExchange, + DaemonStopExchange, + HandshakeExchange, + ConnectionQueryExchange, + ConnectionInfoExchange, + ConnectionRemoveExchange, + ConnectionAddExchange, + CategoryAddExchange, + CategoryQueryExchange, + CategoryInfoExchange, + CategoryRemoveExchange, + ActionExchange, + ConnectionRefreshExchange, + AskpassExchange, + TerminalPrepareExchange, + TerminalRegisterExchange, + TerminalWaitExchange, + TerminalLaunchExchange, + TerminalExternalLaunchExchange, + SshLaunchExchange, + FsReadExchange, + FsBlobExchange, + FsWriteExchange, + FsScriptExchange, + DaemonVersionExchange, + SecretEncryptExchange, + SecretDecryptExchange; } diff --git a/core/src/test/java/io/xpipe/core/test/StorePathTest.java b/app/src/test/java/StorePathTest.java similarity index 97% rename from core/src/test/java/io/xpipe/core/test/StorePathTest.java rename to app/src/test/java/StorePathTest.java index 8323aa89b..e1a6803e2 100644 --- a/core/src/test/java/io/xpipe/core/test/StorePathTest.java +++ b/app/src/test/java/StorePathTest.java @@ -1,7 +1,5 @@ -package io.xpipe.core.test; - -import io.xpipe.core.StorePath; +import io.xpipe.app.util.StorePath; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/beacon/README.md b/beacon/README.md deleted file mode 100644 index 56604a18a..000000000 --- a/beacon/README.md +++ /dev/null @@ -1,36 +0,0 @@ -[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.xpipe/xpipe-beacon/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.xpipe/xpipe-beacon) -[![javadoc](https://javadoc.io/badge2/io.xpipe/xpipe-beacon/javadoc.svg)](https://javadoc.io/doc/io.xpipe/xpipe-beacon) - -## XPipe Beacon - -The XPipe beacon component is responsible for handling all communications between the XPipe daemon -and the APIs and the CLI. It provides an API that supports all kinds -of different operations. - -For a full documentation, see the [OpenAPI spec](https://docs.xpipe.io/api) - -### Inner Workings - -- The underlying communication is realized through an HTTP server on port `21721` - -- The data structures and exchange protocols are specified in the - [io.xpipe.beacon.api package](src/main/java/io/xpipe/beacon/api). - -- Every exchange is initiated from the outside by sending a request message to the XPipe daemon. - The daemon then always sends a response message. - -- The body of a message is usually formatted in the json format. - As a result, all data structures exchanged must be serializable/deserializable with jackson. - -## Configuration - -#### Custom port - -The default port can be changed by passing the property `io.xpipe.beacon.port=` to the daemon. -Note that if both sides do not have the same port setting, they won't be able to reach each other. - -#### Verbose output - -By passing the property `io.xpipe.beacon.printMessages=true`, it is possible to print debug information -about the underlying communications. - diff --git a/beacon/build.gradle b/beacon/build.gradle deleted file mode 100644 index 6bc3c434d..000000000 --- a/beacon/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - id 'java-library' - id 'maven-publish' - id 'signing' -} - -apply from: "$rootDir/gradle/gradle_scripts/java.gradle" -apply from: "$rootDir/gradle/gradle_scripts/lombok.gradle" - -version = versionString -group = groupName -base.archivesName = 'xpipe-beacon' - -repositories { - mavenCentral() -} - -dependencies { - compileOnly 'org.hamcrest:hamcrest:3.0' - compileOnly 'org.junit.jupiter:junit-jupiter-api:5.14.2' - compileOnly 'org.junit.jupiter:junit-jupiter-params:5.14.2' - api project(':core') -} - -tasks.register('dist', Copy) { - from jar.archiveFile - into "${project(':dist').buildDir}/dist/libraries" -} - -apply from: 'publish.gradle' -apply from: "$rootDir/gradle/gradle_scripts/publish-base.gradle" diff --git a/beacon/publish.gradle b/beacon/publish.gradle deleted file mode 100644 index 9ec4eedd5..000000000 --- a/beacon/publish.gradle +++ /dev/null @@ -1,41 +0,0 @@ -publishing { - publications { - mavenJava(MavenPublication) { - artifactId = project.base.archivesName - - from components.java - - pom.withXml { - def pomNode = asNode() - pomNode.dependencies.'*'.findAll().each() { - it.scope*.value = 'compile' - } - } - - - pom { - name = 'XPipe Beacon' - description = 'The socket-based implementation used for the communication with the XPipe daemon.' - url = 'https://github.com/xpipe-io/xpipe/beacon' - licenses { - license { - name = 'Apache License 2.0' - url = 'https://github.com/xpipe-io/xpipe/LICENSE.md' - } - } - developers { - developer { - id = 'crschnick' - name = 'Christopher Schnick' - email = 'crschnick@xpipe.io' - } - } - scm { - connection = 'scm:git:git://github.com/xpipe-io/xpipe.git' - developerConnection = 'scm:git:ssh://github.com/xpipe-io/xpipe.git' - url = 'https://github.com/xpipe-io/xpipe' - } - } - } - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconConfig.java b/beacon/src/main/java/io/xpipe/beacon/BeaconConfig.java deleted file mode 100644 index 02cce4ce6..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconConfig.java +++ /dev/null @@ -1,100 +0,0 @@ -package io.xpipe.beacon; - -import io.xpipe.core.OsType; - -import lombok.experimental.UtilityClass; - -import java.nio.file.Path; -import java.util.Optional; -import java.util.OptionalInt; - -@UtilityClass -public class BeaconConfig { - - public static final String BEACON_PORT_PROP = "io.xpipe.beacon.port"; - private static final String PRINT_MESSAGES_PROPERTY = "io.xpipe.beacon.printMessages"; - private static Integer portOverride; - - public static boolean printMessages() { - if (System.getProperty(PRINT_MESSAGES_PROPERTY) != null) { - return Boolean.parseBoolean(System.getProperty(PRINT_MESSAGES_PROPERTY)); - } - return false; - } - - public static int getUsedPort() { - if (portOverride != null) { - return portOverride; - } - - var beaconPort = System.getenv("BEACON_PORT"); - if (beaconPort != null && !beaconPort.isBlank()) { - return Integer.parseInt(beaconPort); - } - - if (System.getProperty(BEACON_PORT_PROP) != null) { - return Integer.parseInt(System.getProperty(BEACON_PORT_PROP)); - } - - return getDefaultBeaconPort(); - } - - public static OptionalInt fallBackToAnotherPort() { - var hasEnv = System.getenv("BEACON_PORT") != null || System.getenv("XPIPE_BEACON_PORT") != null; - if (hasEnv) { - return OptionalInt.empty(); - } - - var start = 21723; - for (int i = 0; i < 20; i++) { - var p = start + i; - var occupied = BeaconServer.isReachable(p); - if (!occupied) { - portOverride = p; - return OptionalInt.of(p); - } - } - return OptionalInt.empty(); - } - - public static int getDefaultBeaconPort() { - var customPortVar = System.getenv("XPIPE_BEACON_PORT"); - Integer customPort = null; - if (customPortVar != null) { - try { - customPort = Integer.parseInt(customPortVar); - } catch (NumberFormatException ignored) { - } - } - - var effectivePortBase = customPort != null ? customPort : 21721; - - var staging = Optional.ofNullable(System.getProperty("io.xpipe.app.staging")) - .map(Boolean::parseBoolean) - .orElse(false); - var offset = staging ? 1 : 0; - - return effectivePortBase + offset; - } - - public static Path getLocalBeaconAuthFile() { - var staging = Optional.ofNullable(System.getProperty("io.xpipe.app.staging")) - .map(Boolean::parseBoolean) - .orElse(false); - if (OsType.ofLocal() == OsType.LINUX) { - var name = System.getenv("USER") != null ? System.getenv("USER") : System.getProperty("user.name"); - return Path.of(System.getProperty("java.io.tmpdir"), staging ? "xpipe-ptb" : "xpipe", name, "beacon-auth"); - } else { - var path = Path.of(System.getProperty("java.io.tmpdir"), staging ? "xpipe-ptb" : "xpipe", "beacon-auth"); - if (path.startsWith(Path.of("C:\\Windows"))) { - path = Path.of(System.getenv("LOCALAPPDATA")) - .resolve("Temp", staging ? "xpipe-ptb" : "xpipe", "beacon-auth"); - } - return path; - } - } - - public static Path getLocalBeaconLockFile() { - return getLocalBeaconAuthFile().getParent().resolve("lock"); - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconJacksonModule.java b/beacon/src/main/java/io/xpipe/beacon/BeaconJacksonModule.java deleted file mode 100644 index cdfb09373..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconJacksonModule.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.xpipe.beacon; - -import com.fasterxml.jackson.databind.jsontype.NamedType; -import com.fasterxml.jackson.databind.module.SimpleModule; - -public class BeaconJacksonModule extends SimpleModule { - - @Override - public void setupModule(SetupContext context) { - context.registerSubtypes( - new NamedType(BeaconClientInformation.Api.class), - new NamedType(BeaconClientInformation.Cli.class), - new NamedType(BeaconClientInformation.Daemon.class)); - context.registerSubtypes( - new NamedType(BeaconAuthMethod.Local.class), new NamedType(BeaconAuthMethod.ApiKey.class)); - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ActionExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ActionExchange.java deleted file mode 100644 index 4f9e42b09..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ActionExchange.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import com.fasterxml.jackson.databind.JsonNode; -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -public class ActionExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/action"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - JsonNode action; - - boolean confirm; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/AskpassExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/AskpassExchange.java deleted file mode 100644 index 54768ad62..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/AskpassExchange.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.SecretValue; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class AskpassExchange extends BeaconInterface { - - @Override - public boolean acceptInShutdown() { - return true; - } - - @Override - public String getPath() { - return "/askpass"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - long pid; - - UUID secretId; - - UUID request; - - String prompt; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - SecretValue value; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/CategoryAddExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/CategoryAddExchange.java deleted file mode 100644 index dbfdee21a..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/CategoryAddExchange.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class CategoryAddExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/category/add"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - String name; - - @NonNull - UUID parent; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - UUID category; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/CategoryInfoExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/CategoryInfoExchange.java deleted file mode 100644 index 66bcb565a..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/CategoryInfoExchange.java +++ /dev/null @@ -1,60 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.StorePath; - -import com.fasterxml.jackson.databind.JsonNode; -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.time.Instant; -import java.util.List; -import java.util.UUID; - -public class CategoryInfoExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/category/info"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - List categories; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - List<@NonNull InfoResponse> infos; - } - - @Jacksonized - @Builder - @Value - public static class InfoResponse { - @NonNull - UUID category; - - UUID parentCategory; - - @NonNull - StorePath name; - - @NonNull - Instant lastUsed; - - @NonNull - Instant lastModified; - - @NonNull - JsonNode config; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/CategoryQueryExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/CategoryQueryExchange.java deleted file mode 100644 index 9d3a28949..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/CategoryQueryExchange.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; -import java.util.UUID; - -public class CategoryQueryExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/category/query"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - String filter; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - List<@NonNull UUID> found; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/CategoryRemoveExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/CategoryRemoveExchange.java deleted file mode 100644 index 60b0429d7..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/CategoryRemoveExchange.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; -import java.util.UUID; - -public class CategoryRemoveExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/category/remove"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - List categories; - - boolean removeChildrenCategories; - - boolean removeContents; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionAddExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ConnectionAddExchange.java deleted file mode 100644 index 98fee7800..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionAddExchange.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import com.fasterxml.jackson.databind.JsonNode; -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class ConnectionAddExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/connection/add"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - String name; - - @NonNull - JsonNode data; - - @NonNull - Boolean validate; - - UUID category; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - UUID connection; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionInfoExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ConnectionInfoExchange.java deleted file mode 100644 index f608118a8..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionInfoExchange.java +++ /dev/null @@ -1,73 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.StorePath; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.time.Instant; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class ConnectionInfoExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/connection/info"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - List connections; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - List<@NonNull InfoResponse> infos; - } - - @Jacksonized - @Builder - @Value - public static class InfoResponse { - @NonNull - UUID connection; - - @NonNull - StorePath category; - - @NonNull - StorePath name; - - @NonNull - String type; - - @NonNull - Object rawData; - - @NonNull - Object usageCategory; - - @NonNull - Instant lastUsed; - - @NonNull - Instant lastModified; - - @NonNull - Object state; - - @NonNull - Map cache; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionRefreshExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ConnectionRefreshExchange.java deleted file mode 100644 index 2646f0e6e..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionRefreshExchange.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class ConnectionRefreshExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/connection/refresh"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID connection; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionRemoveExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ConnectionRemoveExchange.java deleted file mode 100644 index 530f7b0cd..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ConnectionRemoveExchange.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; -import java.util.UUID; - -public class ConnectionRemoveExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/connection/remove"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - List connections; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/DaemonFocusExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/DaemonFocusExchange.java deleted file mode 100644 index dc442eec8..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/DaemonFocusExchange.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -public class DaemonFocusExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/daemon/focus"; - } - - @Jacksonized - @Builder - @Value - public static class Request {} - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/DaemonModeExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/DaemonModeExchange.java deleted file mode 100644 index 6392e5add..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/DaemonModeExchange.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.XPipeDaemonMode; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -public class DaemonModeExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/daemon/mode"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - XPipeDaemonMode mode; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - XPipeDaemonMode usedMode; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/DaemonOpenExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/DaemonOpenExchange.java deleted file mode 100644 index 934d25281..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/DaemonOpenExchange.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; - -public class DaemonOpenExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/daemon/open"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - List arguments; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/DaemonStatusExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/DaemonStatusExchange.java deleted file mode 100644 index 49d92fa23..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/DaemonStatusExchange.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -public class DaemonStatusExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/daemon/status"; - } - - @Value - @Jacksonized - @Builder - public static class Request {} - - @Jacksonized - @Builder - @Value - public static class Response { - String mode; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/DaemonStopExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/DaemonStopExchange.java deleted file mode 100644 index 7e17e5285..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/DaemonStopExchange.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -/** - * Requests the daemon to stop. - */ -public class DaemonStopExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/daemon/stop"; - } - - @Jacksonized - @Builder - @Value - public static class Request {} - - @Jacksonized - @Builder - @Value - public static class Response { - boolean success; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/DaemonVersionExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/DaemonVersionExchange.java deleted file mode 100644 index a5f7fc04c..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/DaemonVersionExchange.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -public class DaemonVersionExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/daemon/version"; - } - - @Jacksonized - @Builder - @Value - public static class Request {} - - @Jacksonized - @Builder - @Value - public static class Response { - - @NonNull - String version; - - @NonNull - String canonicalVersion; - - @NonNull - String buildVersion; - - @NonNull - String jvmVersion; - - @NonNull - String plan; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/FsBlobExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/FsBlobExchange.java deleted file mode 100644 index 1fe96dddb..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/FsBlobExchange.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class FsBlobExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/fs/blob"; - } - - @Override - public boolean readRawRequestBody() { - return true; - } - - @Jacksonized - @Builder - @Value - public static class Request {} - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - UUID blob; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/FsReadExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/FsReadExchange.java deleted file mode 100644 index b5cb1592f..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/FsReadExchange.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.FilePath; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class FsReadExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/fs/read"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID connection; - - @NonNull - FilePath path; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/FsScriptExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/FsScriptExchange.java deleted file mode 100644 index 818dbe15b..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/FsScriptExchange.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.FilePath; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class FsScriptExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/fs/script"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID connection; - - @NonNull - UUID blob; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - FilePath path; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/FsWriteExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/FsWriteExchange.java deleted file mode 100644 index 91027c11d..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/FsWriteExchange.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.FilePath; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class FsWriteExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/fs/write"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID connection; - - @NonNull - UUID blob; - - @NonNull - FilePath path; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/HandshakeExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/HandshakeExchange.java deleted file mode 100644 index 4a09aed11..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/HandshakeExchange.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconAuthMethod; -import io.xpipe.beacon.BeaconClientInformation; -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -public class HandshakeExchange extends BeaconInterface { - - @Override - public boolean acceptInShutdown() { - return true; - } - - @Override - public boolean requiresAuthentication() { - return false; - } - - @Override - public String getPath() { - return "/handshake"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - BeaconAuthMethod auth; - - @NonNull - BeaconClientInformation client; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - String sessionToken; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/SecretDecryptExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/SecretDecryptExchange.java deleted file mode 100644 index 5d59175d6..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/SecretDecryptExchange.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import com.fasterxml.jackson.databind.JsonNode; -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -public class SecretDecryptExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/secret/decrypt"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - JsonNode encrypted; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - String decrypted; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ShellExecExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ShellExecExchange.java deleted file mode 100644 index 50240477d..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ShellExecExchange.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class ShellExecExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/shell/exec"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID connection; - - @NonNull - String command; - } - - @Jacksonized - @Builder - @Value - public static class Response { - long exitCode; - - @NonNull - String stdout; - - @NonNull - String stderr; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ShellStartExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ShellStartExchange.java deleted file mode 100644 index d28e17c2e..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ShellStartExchange.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class ShellStartExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/shell/start"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID connection; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - String shellDialect; - - @NonNull - OsType.Any osType; - - @NonNull - String osName; - - @NonNull - String ttyState; - - @NonNull - FilePath temp; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/ShellStopExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/ShellStopExchange.java deleted file mode 100644 index 764402eaf..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/ShellStopExchange.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class ShellStopExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/shell/stop"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID connection; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/SshLaunchExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/SshLaunchExchange.java deleted file mode 100644 index 0aee1e029..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/SshLaunchExchange.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; - -public class SshLaunchExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/sshLaunch"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - String arguments; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - List command; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalExternalLaunchExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalExternalLaunchExchange.java deleted file mode 100644 index 135df334f..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalExternalLaunchExchange.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; - -public class TerminalExternalLaunchExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/terminal/externalLaunch"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - String connection; - - @NonNull - List arguments; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - List command; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java deleted file mode 100644 index 757b34a7f..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.nio.file.Path; -import java.util.UUID; - -public class TerminalLaunchExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/terminal/launch"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID request; - } - - @Jacksonized - @Builder - @Value - public static class Response { - @NonNull - Path targetFile; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalPrepareExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalPrepareExchange.java deleted file mode 100644 index 9c4f18608..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalPrepareExchange.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class TerminalPrepareExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/terminal/prepare"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID request; - - long pid; - } - - @Jacksonized - @Builder - @Value - public static class Response { - boolean supportsUnicode; - boolean supportsEscapeSequences; - } -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalRegisterExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalRegisterExchange.java deleted file mode 100644 index eaec4050c..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalRegisterExchange.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class TerminalRegisterExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/terminal/register"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID request; - - long pid; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java deleted file mode 100644 index 1864c923b..000000000 --- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.xpipe.beacon.api; - -import io.xpipe.beacon.BeaconInterface; - -import lombok.Builder; -import lombok.NonNull; -import lombok.Value; -import lombok.extern.jackson.Jacksonized; - -import java.util.UUID; - -public class TerminalWaitExchange extends BeaconInterface { - - @Override - public String getPath() { - return "/terminal/wait"; - } - - @Jacksonized - @Builder - @Value - public static class Request { - @NonNull - UUID request; - } - - @Jacksonized - @Builder - @Value - public static class Response {} -} diff --git a/beacon/src/main/java/module-info.java b/beacon/src/main/java/module-info.java deleted file mode 100644 index 19a349f6e..000000000 --- a/beacon/src/main/java/module-info.java +++ /dev/null @@ -1,62 +0,0 @@ -import io.xpipe.beacon.BeaconInterface; -import io.xpipe.beacon.BeaconJacksonModule; -import io.xpipe.beacon.api.*; -import io.xpipe.core.ModuleLayerLoader; - -import com.fasterxml.jackson.databind.Module; - -open module io.xpipe.beacon { - exports io.xpipe.beacon; - exports io.xpipe.beacon.api; - - requires com.fasterxml.jackson.core; - requires com.fasterxml.jackson.annotation; - requires com.fasterxml.jackson.databind; - requires transitive io.xpipe.core; - requires static lombok; - requires static org.junit.jupiter.api; - requires jdk.httpserver; - requires java.net.http; - requires java.desktop; - - uses io.xpipe.beacon.BeaconInterface; - - provides ModuleLayerLoader with - BeaconInterface.Loader; - provides Module with - BeaconJacksonModule; - provides BeaconInterface with - ShellStartExchange, - ShellStopExchange, - ShellExecExchange, - DaemonModeExchange, - DaemonStatusExchange, - DaemonFocusExchange, - DaemonOpenExchange, - DaemonStopExchange, - HandshakeExchange, - ConnectionQueryExchange, - ConnectionInfoExchange, - ConnectionRemoveExchange, - ConnectionAddExchange, - CategoryAddExchange, - CategoryQueryExchange, - CategoryInfoExchange, - CategoryRemoveExchange, - ActionExchange, - ConnectionRefreshExchange, - AskpassExchange, - TerminalPrepareExchange, - TerminalRegisterExchange, - TerminalWaitExchange, - TerminalLaunchExchange, - TerminalExternalLaunchExchange, - SshLaunchExchange, - FsReadExchange, - FsBlobExchange, - FsWriteExchange, - FsScriptExchange, - DaemonVersionExchange, - SecretEncryptExchange, - SecretDecryptExchange; -} diff --git a/beacon/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader b/beacon/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader deleted file mode 100644 index c70568c84..000000000 --- a/beacon/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader +++ /dev/null @@ -1 +0,0 @@ -io.xpipe.beacon.BeaconInterface$Loader \ No newline at end of file diff --git a/build.gradle b/build.gradle index dc1835ca9..75b80ce39 100644 --- a/build.gradle +++ b/build.gradle @@ -101,14 +101,18 @@ static def getPlatformName() { return platform } -def getJvmArgs() { +def getBaseJvmArgs() { def os = DefaultNativePlatform.currentOperatingSystem - def jvmRunArgs = [ - "-Dfile.encoding=UTF-8", - "-Dvisualvm.display.name=$productName", - "-Djavafx.preloader=" + packageName("core.AppPreloader"), - "-Djdk.virtualThreadScheduler.parallelism=8" - ] + def jvmRunArgs = [] + + // Force UTF8 encoding. This isn't really necessary anymore in JDK25+ + jvmRunArgs += ["-Dfile.encoding=UTF-8"] + + // Make the app show up nicely in VisualVM + jvmRunArgs += ["-Dvisualvm.display.name=$productName"] + + // Make virtual threads behave the same, independently of CPU core count + jvmRunArgs += ["-Djdk.virtualThreadScheduler.parallelism=8"] // Virtual threads cause crashes on Windows ARM if (os.isWindows() && arch == "arm64") { @@ -119,9 +123,6 @@ def getJvmArgs() { // Disable JDK24 warnings jvmRunArgs += [ - "--enable-native-access=com.sun.jna", - "--enable-native-access=javafx.graphics", - "--enable-native-access=javafx.web", "--sun-misc-unsafe-memory-access=allow", ] @@ -130,10 +131,50 @@ def getJvmArgs() { jvmRunArgs += [ "--add-opens", "java.base/java.lang=$appPackage", "--add-opens", "java.base/java.net=$appPackage", - "--add-opens", "net.synedra.validatorfx/net.synedra.validatorfx=$appPackage", "--add-opens", "java.base/java.nio.file=$appPackage", - "--add-exports", "javafx.graphics/com.sun.javafx.tk=$appPackage", "--add-exports", "jdk.zipfs/jdk.nio.zipfs=io.xpipe.modulefs", + ] + + // Use project liliput + jvmRunArgs += ['-XX:+UseCompactObjectHeaders'] + + // Reduce heap usage with deduplication + jvmRunArgs += ['-XX:+UseStringDeduplication'] + + // Why is this not on by default? ... + // https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/net/doc-files/net-properties.html + // https://stackoverflow.com/questions/53333556/proxy-authentication-with-jdk-11-httpclient + // https://stackoverflow.com/questions/75150081/ioexception-too-many-authentication-attempts-limit-3-when-using-jdk-httpcli + jvmRunArgs += [ + '-Djava.net.useSystemProxies=true', + '-Djdk.http.auth.proxying.disabledSchemes=""', + '-Djdk.http.auth.tunneling.disabledSchemes=""', + '-Djdk.httpclient.auth.retrylimit=1' + ] + + + return jvmRunArgs +} + +def getDaemonJvmArgs() { + def os = DefaultNativePlatform.currentOperatingSystem + def jvmRunArgs = ["-Dio.xpipe.app.isDaemon=true"] + + // Use custom JavaFX preloader + jvmRunArgs += ["-Djavafx.preloader=" + packageName("core.AppPreloader")] + + // Disable JDK24 warnings + jvmRunArgs += [ + "--enable-native-access=com.sun.jna", + "--enable-native-access=javafx.graphics", + "--enable-native-access=javafx.web" + ] + + // Module access fixes + def appPackage = packageName(null) + jvmRunArgs += [ + "--add-opens", "net.synedra.validatorfx/net.synedra.validatorfx=$appPackage", + "--add-exports", "javafx.graphics/com.sun.javafx.tk=$appPackage", "--add-opens", "javafx.graphics/com.sun.glass.ui=$appPackage", "--add-opens", "javafx.graphics/javafx.stage=$appPackage", "--add-opens", "javafx.controls/javafx.scene.control.skin=$appPackage", @@ -148,12 +189,6 @@ def getJvmArgs() { ] } - // Use project liliput - jvmRunArgs += ['-XX:+UseCompactObjectHeaders'] - - // Reduce heap usage with deduplication - jvmRunArgs += ['-XX:+UseStringDeduplication'] - // GC config jvmRunArgs += [ '-XX:+UseG1GC', @@ -166,17 +201,6 @@ def getJvmArgs() { '-XX:G1HeapRegionSize=4m' ] - // Why is this not on by default? ... - // https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/net/doc-files/net-properties.html - // https://stackoverflow.com/questions/53333556/proxy-authentication-with-jdk-11-httpclient - // https://stackoverflow.com/questions/75150081/ioexception-too-many-authentication-attempts-limit-3-when-using-jdk-httpcli - jvmRunArgs += [ - '-Djava.net.useSystemProxies=true', - '-Djdk.http.auth.proxying.disabledSchemes=""', - '-Djdk.http.auth.tunneling.disabledSchemes=""', - '-Djdk.httpclient.auth.retrylimit=1' - ] - // Fix platform theme detection on macOS if (os.isMacOsX()) { jvmRunArgs += ["-Dapple.awt.application.appearance=system"] @@ -196,6 +220,69 @@ def getJvmArgs() { jvmRunArgs.addAll("--add-opens", "java.desktop/sun.awt.X11=" + packageName(null)) } + return getBaseJvmArgs() + jvmRunArgs +} + +def getCliJvmArgs() { + def jvmRunArgs = ["-Dio.xpipe.app.isCli=true"] + + // GC config + jvmRunArgs += [ + '-XX:+UseG1GC', + '-Xms60m', + '-Xmx250m', + // The default makes GC pauses longer for some reason + '-XX:G1HeapRegionSize=4m' + ] + + return getBaseJvmArgs() + jvmRunArgs +} + +def getDaemonJPackageReleaseJvmArgs() { + def jvmRunArgs = getDaemonJvmArgs() + + jvmRunArgs += [ + "-D" + propertyName("version") + "=" + versionString, + "-D" + propertyName("build") + "=$versionString/${new Date().format('yyyy-MM-dd-HH-mm')}", + "-D" + propertyName("buildId") + "=" + buildId, + "-D" + propertyName("fullVersion") + "=" + fullVersion, + "-D" + propertyName("staging") + "=" + isStage, + "-D" + propertyName("sentryUrl") + "=" + sentryUrl + ] + + jvmRunArgs += [ + '-Djna.nosys=false', + '-Djna.nounpack=true', + '-Djna.noclasspath=true' + ] + + if (os.isMacOsX()) { + jvmRunArgs += "-Xdock:name=$productName" + } + + if (isFullRelease || isStage) { + jvmRunArgs += "-XX:+DisableAttachMechanism" + } + + return jvmRunArgs +} + +def getCliJPackageReleaseJvmArgs() { + def jvmRunArgs = getCliJvmArgs() + + jvmRunArgs += [ + "-D" + propertyName("version") + "=" + versionString, + "-D" + propertyName("build") + "=$versionString/${new Date().format('yyyy-MM-dd-HH-mm')}", + "-D" + propertyName("buildId") + "=" + buildId, + "-D" + propertyName("fullVersion") + "=" + fullVersion, + "-D" + propertyName("staging") + "=" + isStage, + "-D" + propertyName("sentryUrl") + "=" + sentryUrl + ] + + if (isFullRelease || isStage) { + jvmRunArgs += "-XX:+DisableAttachMechanism" + } + return jvmRunArgs } @@ -274,30 +361,16 @@ project.ext { groupName = 'io.xpipe' artifactName = 'app' arch = getArchName() - jvmRunArgs = getJvmArgs() + daemonJvmRunArgs = getDaemonJvmArgs() + cliJvmRunArgs = getCliJvmArgs() useBundledJna = fullVersion sentryUrl = "https://fd5f67ff10764b7e8a704bec9558c8fe@o1084459.ingest.sentry.io/6094279" // JPackage config jpackageExecutableName = "xpiped" jpackageMacOsBundleName = isStage ? groupName + '.ptb-app' : groupName + '.app' - jpackageReleaseArguments = jvmRunArgs + [ - "-D" + propertyName("version") + "=" + versionString, - "-D" + propertyName("build") + "=$versionString/${new Date().format('yyyy-MM-dd-HH-mm')}", - "-D" + propertyName("buildId") + "=" + buildId, - "-D" + propertyName("fullVersion") + "=" + fullVersion, - "-D" + propertyName("staging") + "=" + isStage, - "-D" + propertyName("sentryUrl") + "=" + sentryUrl, - '-Djna.nosys=false', - '-Djna.nounpack=true', - '-Djna.noclasspath=true' - ] - if (os.isMacOsX()) { - jpackageReleaseArguments += "-Xdock:name=$productName" - } - if (isFullRelease || isStage) { - jpackageReleaseArguments += "-XX:+DisableAttachMechanism" - } + jpackageReleaseDaemonArguments = getDaemonJPackageReleaseJvmArgs() + jpackageReleaseCliArguments = getCliJPackageReleaseJvmArgs() // JavaFX config devJavafxVersion = '27-ea+4' @@ -356,7 +429,6 @@ def replaceVariablesInFile(String f, Map replacements) { // Test results def testTasks = [ - project(':core').getTasksByName('test', true), project(':app').getTasksByName('test', true), project(':base').getTasksByName('localTest', true), project(':proc').getTasksByName('localTest', true), diff --git a/core/README.md b/core/README.md deleted file mode 100644 index dade4b3e3..000000000 --- a/core/README.md +++ /dev/null @@ -1,20 +0,0 @@ -[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.xpipe/xpipe-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.xpipe/xpipe-core) -[![javadoc](https://javadoc.io/badge2/io.xpipe/xpipe-core/javadoc.svg)](https://javadoc.io/doc/io.xpipe/xpipe-core) - -## XPipe Core - -The XPipe core module contains all the shared core classes used by the API, beacon, and daemon implementation. -It contains the following packages: - -- [dialog](src/main/java/io/xpipe/core/dialog): In API to create server/daemon side CLI dialogs. - -- [store](src/main/java/io/xpipe/core/store): The basic data store classes that are used by every data store implementation. - -- [process](src/main/java/io/xpipe/core/process): Base classes for the shell process handling implementation. - -- [util](src/main/java/io/xpipe/core/source): A few utility classes for serialization and more. - -Every class is expected to be potentially used in the context of files and message exchanges. -As a result, essentially all objects must be serializable/deserializable with jackson. - - diff --git a/core/build.gradle b/core/build.gradle deleted file mode 100644 index 74a8f268b..000000000 --- a/core/build.gradle +++ /dev/null @@ -1,38 +0,0 @@ -plugins { - id 'java-library' - id 'maven-publish' - id 'signing' -} - -apply from: "$rootDir/gradle/gradle_scripts/java.gradle" -apply from: "$rootDir/gradle/gradle_scripts/lombok.gradle" -apply from: "$rootDir/gradle/gradle_scripts/junit.gradle" - -compileJava { - options.compilerArgs << '-parameters' -} - -dependencies { - api "com.fasterxml.jackson.core:jackson-databind:2.21.1" - implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.21.1" -} - -version = versionString -group = groupName -base.archivesName = 'xpipe-core' - -repositories { - mavenCentral() -} - -dependencies { - testImplementation project(':core') -} - -tasks.register('dist', Copy) { - from jar.archiveFile - into "${project(':dist').buildDir}/dist/libraries" -} - -apply from: 'publish.gradle' -apply from: "$rootDir/gradle/gradle_scripts/publish-base.gradle" \ No newline at end of file diff --git a/core/publish.gradle b/core/publish.gradle deleted file mode 100644 index db4b943e6..000000000 --- a/core/publish.gradle +++ /dev/null @@ -1,33 +0,0 @@ -publishing { - publications { - mavenJava(MavenPublication) { - artifactId = project.base.archivesName - - from components.java - - pom { - name = 'XPipe Core' - description = 'Core classes used by all XPipe components.' - url = 'https://github.com/xpipe-io/xpipe/core' - licenses { - license { - name = 'Apache License 2.0' - url = 'https://github.com/xpipe-io/xpipe/LICENSE.md' - } - } - developers { - developer { - id = 'crschnick' - name = 'Christopher Schnick' - email = 'crschnick@xpipe.io' - } - } - scm { - connection = 'scm:git:git://github.com/xpipe-io/xpipe.git' - developerConnection = 'scm:git:ssh://github.com/xpipe-io/xpipe.git' - url = 'https://github.com/xpipe-io/xpipe' - } - } - } - } -} diff --git a/core/src/main/java/io/xpipe/core/CoreJacksonModule.java b/core/src/main/java/io/xpipe/core/CoreJacksonModule.java deleted file mode 100644 index 6e164aed5..000000000 --- a/core/src/main/java/io/xpipe/core/CoreJacksonModule.java +++ /dev/null @@ -1,123 +0,0 @@ -package io.xpipe.core; - -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.jsontype.NamedType; -import com.fasterxml.jackson.databind.module.SimpleModule; - -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.InvalidPathException; -import java.nio.file.Path; -import java.util.List; - -public class CoreJacksonModule extends SimpleModule { - - @Override - public void setupModule(SetupContext context) { - context.registerSubtypes(new NamedType(InPlaceSecretValue.class)); - - addSerializer(FilePath.class, new FilePathSerializer()); - addDeserializer(FilePath.class, new FilePathDeserializer()); - - addSerializer(StorePath.class, new StorePathSerializer()); - addDeserializer(StorePath.class, new StorePathDeserializer()); - - addSerializer(Charset.class, new CharsetSerializer()); - addDeserializer(Charset.class, new CharsetDeserializer()); - - addSerializer(Path.class, new LocalPathSerializer()); - addDeserializer(Path.class, new LocalPathDeserializer()); - - context.setMixInAnnotations(Throwable.class, ThrowableTypeMixIn.class); - - context.addSerializers(_serializers); - context.addDeserializers(_deserializers); - } - - public static class StorePathSerializer extends JsonSerializer { - - @Override - public void serialize(StorePath value, JsonGenerator jgen, SerializerProvider provider) throws IOException { - var ar = value.getNames().toArray(String[]::new); - jgen.writeArray(ar, 0, ar.length); - } - } - - public static class StorePathDeserializer extends JsonDeserializer { - - @Override - public StorePath deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - JavaType javaType = - JacksonMapper.getDefault().getTypeFactory().constructCollectionLikeType(List.class, String.class); - List list = JacksonMapper.getDefault().readValue(p, javaType); - return new StorePath(list); - } - } - - public static class FilePathSerializer extends JsonSerializer { - - @Override - public void serialize(FilePath value, JsonGenerator jgen, SerializerProvider provider) throws IOException { - jgen.writeString(value.toString()); - } - } - - public static class FilePathDeserializer extends JsonDeserializer { - - @Override - public FilePath deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return FilePath.of(p.getValueAsString()); - } - } - - public static class CharsetSerializer extends JsonSerializer { - - @Override - public void serialize(Charset value, JsonGenerator jgen, SerializerProvider provider) throws IOException { - jgen.writeString(value.name()); - } - } - - public static class CharsetDeserializer extends JsonDeserializer { - - @Override - public Charset deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return Charset.forName(p.getValueAsString()); - } - } - - public static class LocalPathSerializer extends JsonSerializer { - - @Override - public void serialize(Path value, JsonGenerator jgen, SerializerProvider provider) throws IOException { - jgen.writeString(value.toString()); - } - } - - public static class LocalPathDeserializer extends JsonDeserializer { - - @Override - public Path deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - try { - return Path.of(p.getValueAsString()); - } catch (InvalidPathException ignored) { - return null; - } - } - } - - @JsonSerialize(as = Throwable.class) - @JsonPropertyOrder(alphabetic = true) - public abstract static class ThrowableTypeMixIn { - - @SuppressWarnings("unused") - @JsonIdentityInfo(generator = ObjectIdGenerators.StringIdGenerator.class, property = "$id") - private Throwable cause; - } -} diff --git a/core/src/main/java/module-info.java b/core/src/main/java/module-info.java deleted file mode 100644 index b3eb9fd76..000000000 --- a/core/src/main/java/module-info.java +++ /dev/null @@ -1,22 +0,0 @@ -import io.xpipe.core.CoreJacksonModule; -import io.xpipe.core.JacksonMapper; -import io.xpipe.core.ModuleLayerLoader; - -open module io.xpipe.core { - exports io.xpipe.core; - - requires com.fasterxml.jackson.datatype.jsr310; - requires com.fasterxml.jackson.core; - requires com.fasterxml.jackson.annotation; - requires com.fasterxml.jackson.databind; - requires java.net.http; - requires static lombok; - - uses com.fasterxml.jackson.databind.Module; - uses ModuleLayerLoader; - - provides ModuleLayerLoader with - JacksonMapper.Loader; - provides com.fasterxml.jackson.databind.Module with - CoreJacksonModule; -} diff --git a/core/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module b/core/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module deleted file mode 100644 index 97cd2a927..000000000 --- a/core/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module +++ /dev/null @@ -1 +0,0 @@ -io.xpipe.core.CoreJacksonModule \ No newline at end of file diff --git a/core/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader b/core/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader deleted file mode 100644 index bf6de11bf..000000000 --- a/core/src/main/resources/META-INF/services/io.xpipe.core.ModuleLayerLoader +++ /dev/null @@ -1 +0,0 @@ -io.xpipe.core.JacksonMapper$Loader \ No newline at end of file diff --git a/core/src/test/java/module-info.java b/core/src/test/java/module-info.java deleted file mode 100644 index bf08780de..000000000 --- a/core/src/test/java/module-info.java +++ /dev/null @@ -1,8 +0,0 @@ -module io.xpipe.core.test { - exports io.xpipe.core.test; - - requires org.junit.jupiter.api; - requires org.junit.jupiter.params; - requires io.xpipe.core; - requires static lombok; -} diff --git a/dist/base.gradle b/dist/base.gradle index e27de5917..0f32270e8 100644 --- a/dist/base.gradle +++ b/dist/base.gradle @@ -37,8 +37,10 @@ if (os.isWindows()) { // Don't launch multiple exe instances: https://bugs.openjdk.org/browse/JDK-8340311 // We don't need the /app directory to be in the library path - def configFile = file("$distDir/base/app/${jpackageExecutableName}.cfg") - configFile.text = configFile.text.replace("[Application]", "[Application]\nwin.norestart=true") + def daemonConfigFile = file("$distDir/base/app/${jpackageExecutableName}.cfg") + daemonConfigFile.text = daemonConfigFile.text.replace("[Application]", "[Application]\nwin.norestart=true") + def cliConfigFile = file("$distDir/base/app/xpipe.cfg") + cliConfigFile.text = cliConfigFile.text.replace("[Application]", "[Application]\nwin.norestart=true") def batLauncherFile = file("$distDir/base/runtime/bin/${jpackageExecutableName}.bat") def batLauncherContent = batLauncherFile.text diff --git a/dist/build.gradle b/dist/build.gradle index c70933656..5bffcf2e0 100644 --- a/dist/build.gradle +++ b/dist/build.gradle @@ -96,7 +96,6 @@ apply from: 'jpackage.gradle' if (fullVersion) { apply from: 'train.gradle' apply from: 'base_full.gradle' - apply from: 'cli.gradle' apply from: 'portable.gradle' apply from: 'proguard.gradle' apply from: 'github.gradle' diff --git a/dist/jpackage.gradle b/dist/jpackage.gradle index 9700ab2c4..e0e6fbc0b 100644 --- a/dist/jpackage.gradle +++ b/dist/jpackage.gradle @@ -14,6 +14,9 @@ def extLibrariesTasks = extModules.stream().map { it.getTasksByName('createExtOu dependencies { implementation project(':app') + if (fullVersion) { + implementation project(':cli') + } if (!useBundledJavaFx) { configurations.javafx.getAsFileTree().getFiles().forEach { implementation files(it) @@ -67,11 +70,23 @@ jlink { addOptions("--add-modules", "jdk.jdwp.agent") } + if (fullVersion) { + addOptions("--add-modules", "io.xpipe.cli") + } + launcher { moduleName = packageName(null) mainClass = packageName('Main') name = jpackageExecutableName - jvmArgs = jpackageReleaseArguments + jvmArgs = jpackageReleaseDaemonArguments + } + + secondaryLauncher { + moduleName = packageName(null) + mainClass = packageName('Main') + name = "xpipe" + jvmArgs = jpackageReleaseCliArguments + winConsole = true } jpackage { diff --git a/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopApplicationStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopApplicationStoreProvider.java index e293fca8b..4aaafc075 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopApplicationStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopApplicationStoreProvider.java @@ -8,7 +8,7 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.storage.DataStoreCategory; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.DocumentationLink; -import io.xpipe.core.FailableRunnable; +import io.xpipe.app.util.FailableRunnable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.Property; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityApplyDialog.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityApplyDialog.java index e38fe2ab2..5623202d3 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityApplyDialog.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityApplyDialog.java @@ -23,8 +23,8 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; -import io.xpipe.core.OsType; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.*; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java index 2f620bc46..79de30e68 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java @@ -14,7 +14,7 @@ import io.xpipe.app.secret.*; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.*; -import io.xpipe.core.KeyValue; +import io.xpipe.app.util.KeyValue; import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.EqualsAndHashCode; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/SyncedIdentityStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/SyncedIdentityStoreProvider.java index 9fafc0656..516168436 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/SyncedIdentityStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/SyncedIdentityStoreProvider.java @@ -19,7 +19,7 @@ import io.xpipe.app.secret.SecretRetrievalStrategy; import io.xpipe.app.secret.SecretStrategyChoiceConfig; import io.xpipe.app.storage.*; import io.xpipe.app.util.*; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.property.*; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSource.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSource.java index e344136e6..b2d3588ec 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSource.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSource.java @@ -10,8 +10,8 @@ import io.xpipe.app.platform.OptionsBuilder; import io.xpipe.app.storage.ContextualFileReference; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.Validators; -import io.xpipe.core.FilePath; -import io.xpipe.core.UuidHelper; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.UuidHelper; import javafx.beans.property.*; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSourceImportDialog.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSourceImportDialog.java index e5f4a9cbb..415ec7826 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSourceImportDialog.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptCollectionSourceImportDialog.java @@ -11,7 +11,7 @@ import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.application.Platform; import javafx.beans.binding.Bindings; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java index 37ea614e9..007a1d8e5 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreProvider.java @@ -14,7 +14,7 @@ import io.xpipe.app.process.ShellDialects; import io.xpipe.app.storage.DataStoreCategory; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import javafx.beans.property.*; import javafx.beans.value.ObservableValue; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreSetup.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreSetup.java index 7f3186c65..9ca089f9e 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreSetup.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStoreSetup.java @@ -6,7 +6,7 @@ import io.xpipe.app.process.*; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import lombok.SneakyThrows; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptTextSource.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptTextSource.java index 81c068f0b..41b8d5c95 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptTextSource.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptTextSource.java @@ -18,8 +18,8 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.HttpHelper; import io.xpipe.app.util.Validators; -import io.xpipe.core.FilePath; -import io.xpipe.core.UuidHelper; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.UuidHelper; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java index efccd45a0..a5504400e 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java @@ -8,7 +8,7 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.DocumentationLink; import io.xpipe.app.util.StoreStateFormat; -import io.xpipe.core.FailableRunnable; +import io.xpipe.app.util.FailableRunnable; import io.xpipe.ext.base.host.HostAddressGatewayStore; import javafx.beans.binding.Bindings; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java index 2b2dd3d7d..39455b2e7 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java @@ -11,7 +11,7 @@ import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.terminal.TerminalLaunch; import io.xpipe.app.terminal.TerminalPromptManager; import io.xpipe.app.util.StoreStateFormat; -import io.xpipe.core.FailableRunnable; +import io.xpipe.app.util.FailableRunnable; import io.xpipe.ext.base.script.ScriptStoreSetup; import javafx.beans.property.BooleanProperty; diff --git a/ext/base/src/main/java/module-info.java b/ext/base/src/main/java/module-info.java index 5d7cc3972..89dc6352c 100644 --- a/ext/base/src/main/java/module-info.java +++ b/ext/base/src/main/java/module-info.java @@ -20,7 +20,6 @@ open module io.xpipe.ext.base { exports io.xpipe.ext.base.host; requires java.desktop; - requires io.xpipe.core; requires com.fasterxml.jackson.databind; requires com.fasterxml.jackson.annotation; requires java.net.http; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java index 81373638a..358d4e75b 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java @@ -5,7 +5,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.*; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.JacksonMapper; import io.xpipe.ext.base.identity.IdentityValue; import com.fasterxml.jackson.databind.JsonNode; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java index c24fd8b73..0439eb9ef 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigActionProvider.java @@ -9,7 +9,7 @@ import io.xpipe.app.hub.action.HubLeafProvider; import io.xpipe.app.hub.action.StoreAction; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.value.ObservableValue; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusScanProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusScanProvider.java index b34591587..3b8231903 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusScanProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/incus/IncusScanProvider.java @@ -4,7 +4,7 @@ import io.xpipe.app.ext.ScanProvider; import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class IncusScanProvider extends ScanProvider { diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java index 186f74331..cb8490a6d 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java @@ -5,8 +5,8 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.*; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.FilePath; -import io.xpipe.core.JacksonMapper; +import io.xpipe.app.util.FilePath; +import io.xpipe.app.util.JacksonMapper; import io.xpipe.ext.base.identity.IdentityValue; import com.fasterxml.jackson.databind.JsonNode; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdScanProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdScanProvider.java index 2c783a174..3ab4a2165 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdScanProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdScanProvider.java @@ -5,7 +5,7 @@ import io.xpipe.app.process.ProcessOutputException; import io.xpipe.app.process.ShellControl; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; public class LxdScanProvider extends ScanProvider { diff --git a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanCommandView.java b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanCommandView.java index 6abd6ac29..93fa3d1c4 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanCommandView.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanCommandView.java @@ -2,7 +2,7 @@ package io.xpipe.ext.system.podman; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.*; -import io.xpipe.core.OsType; +import io.xpipe.app.util.OsType; import lombok.NonNull; import lombok.Value; diff --git a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerUnitFileEditActionProvider.java b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerUnitFileEditActionProvider.java index 1c2124106..f0a60c37e 100644 --- a/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerUnitFileEditActionProvider.java +++ b/ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerUnitFileEditActionProvider.java @@ -8,7 +8,7 @@ import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.platform.LabelGraphic; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.FileOpener; -import io.xpipe.core.FilePath; +import io.xpipe.app.util.FilePath; import javafx.beans.value.ObservableValue; diff --git a/ext/system/src/main/java/module-info.java b/ext/system/src/main/java/module-info.java index 1eb56528c..52f8f46fe 100644 --- a/ext/system/src/main/java/module-info.java +++ b/ext/system/src/main/java/module-info.java @@ -12,7 +12,6 @@ open module io.xpipe.ext.system { requires static lombok; requires static javafx.controls; requires static io.xpipe.app; - requires io.xpipe.core; requires io.xpipe.ext.base; provides ScanProvider with diff --git a/get-xpipe.ps1 b/get-xpipe.ps1 index b6bebadd5..70f386e8b 100644 --- a/get-xpipe.ps1 +++ b/get-xpipe.ps1 @@ -187,7 +187,7 @@ Write-Host "$ProductName has been successfully installed. You should be able to Write-Host # Use absolute path as we can't assume that the user has selected to put XPipe into the Path -& "$env:LOCALAPPDATA\$ProductName\bin\xpipe.exe" open +& "$env:LOCALAPPDATA\$ProductName\xpiped.exe" open #endregion Install XPipe diff --git a/gradle/gradle_scripts/extension.gradle b/gradle/gradle_scripts/extension.gradle index c3ee9f6d2..ef464b2c5 100644 --- a/gradle/gradle_scripts/extension.gradle +++ b/gradle/gradle_scripts/extension.gradle @@ -51,8 +51,6 @@ configurations { dependencies { compileOnly "com.fasterxml.jackson.core:jackson-databind:2.21.1" - compileOnly project(':core') - compileOnly project(':beacon') compileOnly project(':app') compileOnly 'net.synedra:validatorfx:0.4.2' compileOnly files("$rootDir/gradle/gradle_scripts/atlantafx-base-2.0.2.jar") diff --git a/gradle/gradle_scripts/local_junit_suite.gradle b/gradle/gradle_scripts/local_junit_suite.gradle index 2f9ecff8e..cfc80c472 100644 --- a/gradle/gradle_scripts/local_junit_suite.gradle +++ b/gradle/gradle_scripts/local_junit_suite.gradle @@ -6,8 +6,6 @@ testing { useJUnitJupiter() dependencies { - implementation project(':core') - implementation project(':beacon') implementation project(':app') implementation project(':base') implementation project() @@ -18,8 +16,7 @@ testing { testTask.configure { workingDir = rootDir - jvmArgs += ["-Xmx2g"] - jvmArgs += jvmRunArgs + jvmArgs += daemonJvmRunArgs def exts = files(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0].outputs.files.singleFile).toList()) classpath += exts diff --git a/gradle/gradle_scripts/modules.gradle b/gradle/gradle_scripts/modules.gradle index 7e05590d9..89cb23c1f 100644 --- a/gradle/gradle_scripts/modules.gradle +++ b/gradle/gradle_scripts/modules.gradle @@ -1,23 +1,3 @@ -extraJavaModuleInfo { - module("de.vandermeer:asciitable", "de.vandermeer.asciitable") { - exportAllPackages() - requires('de.vandermeer.skb_interfaces') - requires('de.vandermeer.ascii_utf_themes') - requires('org.apache.commons.lang3') - } - - module("de.vandermeer:skb-interfaces", "de.vandermeer.skb_interfaces") { - exportAllPackages() - requires('org.apache.commons.lang3') - } - - module("de.vandermeer:ascii-utf-themes", "de.vandermeer.ascii_utf_themes") { - exportAllPackages() - requires('org.apache.commons.lang3') - requires('de.vandermeer.skb_interfaces') - } -} - extraJavaModuleInfo { module("com.vladsch.flexmark:flexmark", "com.vladsch.flexmark") { mergeJar('com.vladsch.flexmark:flexmark-util') diff --git a/gradle/gradle_scripts/remote_junit_suite.gradle b/gradle/gradle_scripts/remote_junit_suite.gradle index c05306a9a..c17743761 100644 --- a/gradle/gradle_scripts/remote_junit_suite.gradle +++ b/gradle/gradle_scripts/remote_junit_suite.gradle @@ -8,8 +8,6 @@ testing { useJUnitJupiter() dependencies { - implementation project(':core') - implementation project(':beacon') implementation project() } @@ -18,8 +16,7 @@ testing { testTask.configure { workingDir = projectDir - jvmArgs += ["-Xmx2g"] - jvmArgs += jvmRunArgs + jvmArgs += daemonJvmRunArgs def daemonArgs = Map.of( propertyName("dataDir"), "$projectDir/local/", diff --git a/lang/strings/translations_en.properties b/lang/strings/translations_en.properties index cc162c798..2cf39a683 100644 --- a/lang/strings/translations_en.properties +++ b/lang/strings/translations_en.properties @@ -2047,6 +2047,10 @@ passwordManagerKeyStrategy=SSH key retrieval method passwordManagerKeyStrategyDescription=How to retrieve SSH keys stored in the password manager. When disabled, no keys can be retrieved. When an SSH agent is configured, the agent must be properly started in the password manager. sshAgentNoKeys=The agent does not have any keys at the moment sshAgentHasKeys=The agent currently offers the following keys: +networkInterfacesBroadcastNone=No network interfaces could automatically be detected +networkInterfacesBroadcastFound=The gateway system has the following broadcast addresses: +networkInterfacesNone=No network interfaces could automatically be detected +networkInterfacesFound=The system has the following network interfaces: passwordManagerNoAgentSupport=Password manager does not support retrieving SSH keys via an agent passwordManagerNoAgentConfigured=XPipe is not configured for retrieving SSH keys from the agent passwordManagerEmpty=No password manager is configured @@ -2199,3 +2203,12 @@ syncInProgressTitle=Sync in progress syncInProgressContent=Your changes are currently being saved and synced. You should see the changes on the remote once the operation is finished. syncIdentity=Sync identity convertToMulti=Convert to multi +wakeOnLanHost=Target host +wakeOnLanHostDescription=The system to wake +wakeOnLanGateway=Broadcast host +wakeOnLanGatewayDescription=The system from which to send the broadcast +wakeOnLanAddress=Network interface +wakeOnLanAddressDescription=The MAC address of the target network interface +wakeOnLan.displayName=Wake-on-Lan +wakeOnLan.displayDescription=Wake a sleeping computer by sending a magic packet +wakeOnLanInterface=Interface $ADDR$ diff --git a/settings.gradle b/settings.gradle index 8f46a615a..6b073eb6c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,8 +1,5 @@ rootProject.name = 'xpipe' -include 'core' -include 'beacon' - include "base" project(":base").projectDir = file("ext/base")