diff --git a/app/src/main/java/io/xpipe/app/comp/about/BrowseDirectoryComp.java b/app/src/main/java/io/xpipe/app/comp/about/BrowseDirectoryComp.java index a8260a3c..232de11e 100644 --- a/app/src/main/java/io/xpipe/app/comp/about/BrowseDirectoryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/about/BrowseDirectoryComp.java @@ -9,7 +9,7 @@ import io.xpipe.extension.I18n; import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.fxcomps.SimpleComp; import io.xpipe.extension.util.DynamicOptionsBuilder; -import io.xpipe.extension.util.OsHelper; +import io.xpipe.extension.util.DesktopHelper; import javafx.scene.layout.Region; public class BrowseDirectoryComp extends SimpleComp { @@ -36,13 +36,13 @@ public class BrowseDirectoryComp extends SimpleComp { .addComp( "logFiles", new ButtonComp(I18n.observable("openLogsDirectory"), () -> { - OsHelper.browsePath(AppLogs.get().getSessionLogsDirectory()); + DesktopHelper.browsePath(AppLogs.get().getSessionLogsDirectory()); }), null) .addComp( "installationFiles", new ButtonComp(I18n.observable("openInstallationDirectory"), () -> { - OsHelper.browsePath(XPipeInstallation.getLocalInstallationBasePath()); + DesktopHelper.browsePath(XPipeInstallation.getLocalInstallationBasePath()); }), null) .build(); diff --git a/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java b/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java index 050abfd5..f1c7ab42 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java @@ -5,7 +5,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.extension.I18n; import io.xpipe.extension.fxcomps.CompStructure; import io.xpipe.extension.fxcomps.augment.PopupMenuAugment; -import io.xpipe.extension.util.OsHelper; +import io.xpipe.extension.util.DesktopHelper; import javafx.scene.control.Alert; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; @@ -88,7 +88,7 @@ public class SourceCollectionContextMenu> extends Pop if (AppPrefs.get().developerMode().getValue()) { var openDir = new MenuItem(I18n.get("openDir"), new FontIcon("mdal-edit")); openDir.setOnAction(e -> { - OsHelper.browseFileInDirectory(group.getCollection().getDirectory()); + DesktopHelper.browseFileInDirectory(group.getCollection().getDirectory()); }); cm.getItems().add(openDir); } diff --git a/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java b/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java index 009411e3..64454c5f 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java @@ -8,7 +8,7 @@ import io.xpipe.extension.I18n; import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.fxcomps.CompStructure; import io.xpipe.extension.fxcomps.augment.PopupMenuAugment; -import io.xpipe.extension.util.OsHelper; +import io.xpipe.extension.util.DesktopHelper; import javafx.beans.binding.Bindings; import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; @@ -89,7 +89,7 @@ public class SourceEntryContextMenu> extends PopupMen var openDir = new MenuItem(I18n.get("browseInternal"), new FontIcon("mdi2f-folder-open-outline")); openDir.setOnAction(e -> { - OsHelper.browsePath(entry.getEntry().getDirectory()); + DesktopHelper.browsePath(entry.getEntry().getDirectory()); }); cm.getItems().add(openDir); } diff --git a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java index e8149576..79ac4e4d 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java @@ -19,7 +19,7 @@ import io.xpipe.extension.fxcomps.impl.IconButtonComp; import io.xpipe.extension.fxcomps.impl.PrettyImageComp; import io.xpipe.extension.fxcomps.util.PlatformThread; import io.xpipe.extension.fxcomps.util.SimpleChangeListener; -import io.xpipe.extension.util.OsHelper; +import io.xpipe.extension.util.DesktopHelper; import io.xpipe.extension.util.ThreadHelper; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleStringProperty; @@ -245,7 +245,7 @@ public class StoreEntryComp extends SimpleComp { if (AppPrefs.get().developerMode().getValue()) { var browse = new MenuItem(I18n.get("browse"), new FontIcon("mdi2f-folder-open-outline")); - browse.setOnAction(event -> OsHelper.browsePath(entry.getEntry().getDirectory())); + browse.setOnAction(event -> DesktopHelper.browsePath(entry.getEntry().getDirectory())); contextMenu.getItems().add(browse); } diff --git a/app/src/main/java/io/xpipe/app/core/App.java b/app/src/main/java/io/xpipe/app/core/App.java index 8671987d..1fe5e704 100644 --- a/app/src/main/java/io/xpipe/app/core/App.java +++ b/app/src/main/java/io/xpipe/app/core/App.java @@ -69,7 +69,7 @@ public class App extends Application { AppActionLinkDetector.detectOnFocus(); }); }); - var title = String.format("X-Pipe Desktop (%s)", AppProperties.get().getVersion()); + var title = String.format("X-Pipe Desktop (Alpha %s)", AppProperties.get().getVersion()); var appWindow = new AppMainWindow(stage); appWindow.initialize(); appWindow.setContent(title, content); 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 dc7f3036..e763ac45 100644 --- a/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java +++ b/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java @@ -1,7 +1,7 @@ package io.xpipe.app.core; import io.xpipe.app.exchange.MessageExchangeImpls; -import io.xpipe.app.util.ModuleHelper; +import io.xpipe.core.util.ModuleHelper; import io.xpipe.core.util.XPipeInstallation; import io.xpipe.extension.ModuleInstall; import io.xpipe.extension.XPipeServiceProviders; diff --git a/app/src/main/java/io/xpipe/app/core/AppI18n.java b/app/src/main/java/io/xpipe/app/core/AppI18n.java index deb18eeb..92e75322 100644 --- a/app/src/main/java/io/xpipe/app/core/AppI18n.java +++ b/app/src/main/java/io/xpipe/app/core/AppI18n.java @@ -2,7 +2,7 @@ package io.xpipe.app.core; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.prefs.SupportedLocale; -import io.xpipe.app.util.ModuleHelper; +import io.xpipe.core.util.ModuleHelper; import io.xpipe.extension.I18n; import io.xpipe.extension.Translatable; import io.xpipe.extension.event.ErrorEvent; @@ -25,7 +25,10 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.time.Duration; import java.time.Instant; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.UnaryOperator; import java.util.regex.Pattern; @@ -94,11 +97,20 @@ public class AppI18n implements I18n { prettyTime = null; } + @SuppressWarnings("removal") + public static class CallingClass extends SecurityManager { + public static final CallingClass INSTANCE = new CallingClass(); + + public Class[] getCallingClasses() { + return getClassContext(); + } + } + @SneakyThrows private static String getCallerModuleName() { - var callers = ModuleHelper.CallingClass.INSTANCE.getCallingClasses(); + var callers = CallingClass.INSTANCE.getCallingClasses(); for (Class caller : callers) { - if (caller.equals(ModuleHelper.CallingClass.class) + if (caller.equals(CallingClass.class) || caller.equals(ModuleHelper.class) || caller.equals(AppI18n.class) || caller.equals(I18n.class) 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 cfad6a7c..78a2dedb 100644 --- a/app/src/main/java/io/xpipe/app/core/AppProperties.java +++ b/app/src/main/java/io/xpipe/app/core/AppProperties.java @@ -1,7 +1,7 @@ package io.xpipe.app.core; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.app.util.ModuleHelper; +import io.xpipe.core.util.ModuleHelper; import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.event.TrackEvent; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/util/ModuleHelper.java b/app/src/main/java/io/xpipe/app/util/ModuleHelper.java deleted file mode 100644 index 04c87b6a..00000000 --- a/app/src/main/java/io/xpipe/app/util/ModuleHelper.java +++ /dev/null @@ -1,66 +0,0 @@ -package io.xpipe.app.util; - -import lombok.SneakyThrows; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -public class ModuleHelper { - - public static boolean isImage() { - return ModuleHelper.class - .getProtectionDomain() - .getCodeSource() - .getLocation() - .getProtocol() - .equals("jrt"); - } - - @SneakyThrows - public static Module getEveryoneModule() { - Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class); - getDeclaredFields0.setAccessible(true); - Field[] fields = (Field[]) getDeclaredFields0.invoke(Module.class, false); - Field modifiers = null; - for (Field each : fields) { - if ("EVERYONE_MODULE".equals(each.getName())) { - modifiers = each; - break; - } - } - modifiers.setAccessible(true); - return (Module) modifiers.get(null); - } - - @SneakyThrows - public static void exportAndOpen(String pkg, Module mod) { - if (mod.isExported(pkg) && mod.isOpen(pkg)) { - return; - } - - Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredMethods0", boolean.class); - getDeclaredFields0.setAccessible(true); - Method[] fields = (Method[]) getDeclaredFields0.invoke(Module.class, false); - Method modifiers = null; - for (Method each : fields) { - if ("implAddExportsOrOpens".equals(each.getName())) { - modifiers = each; - break; - } - } - modifiers.setAccessible(true); - - var e = getEveryoneModule(); - modifiers.invoke(mod, pkg, e, false, true); - modifiers.invoke(mod, pkg, e, true, true); - } - - @SuppressWarnings("removal") - public static class CallingClass extends SecurityManager { - public static final CallingClass INSTANCE = new CallingClass(); - - public Class[] getCallingClasses() { - return getClassContext(); - } - } -} diff --git a/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java b/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java index efd98101..f63fe645 100644 --- a/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java +++ b/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java @@ -2,11 +2,12 @@ package io.xpipe.app.util; import io.xpipe.app.core.AppProperties; import io.xpipe.app.core.AppWindowHelper; +import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.update.AppDownloads; import io.xpipe.app.update.AppInstaller; -import io.xpipe.app.prefs.AppPrefs; import io.xpipe.core.impl.FileNames; import io.xpipe.core.process.ShellProcessControl; +import io.xpipe.core.util.ModuleHelper; import io.xpipe.core.util.ProxyManagerProvider; import io.xpipe.core.util.XPipeInstallation; import io.xpipe.extension.I18n; diff --git a/core/src/main/java/io/xpipe/core/util/Deobfuscator.java b/core/src/main/java/io/xpipe/core/util/Deobfuscator.java index d2d058c2..893e8a2b 100644 --- a/core/src/main/java/io/xpipe/core/util/Deobfuscator.java +++ b/core/src/main/java/io/xpipe/core/util/Deobfuscator.java @@ -3,6 +3,7 @@ package io.xpipe.core.util; import io.xpipe.core.charsetter.NewLine; import io.xpipe.core.process.OsType; import io.xpipe.core.process.ShellTypes; +import io.xpipe.core.store.ShellStore; import java.io.PrintWriter; import java.io.StringWriter; @@ -105,6 +106,6 @@ public class Deobfuscator { } var t = ShellTypes.getPlatformDefault(); - return LocalProcess.executeSimpleBooleanCommand(t.getWhichCommand("retrace." + t.getScriptFileEnding())); + return ShellStore.local().create().executeBooleanSimpleCommand(t.getWhichCommand("retrace." + t.getScriptFileEnding())); } } diff --git a/core/src/main/java/io/xpipe/core/util/LocalProcess.java b/core/src/main/java/io/xpipe/core/util/LocalProcess.java deleted file mode 100644 index 7b12a3f1..00000000 --- a/core/src/main/java/io/xpipe/core/util/LocalProcess.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.xpipe.core.util; - -import io.xpipe.core.process.ShellTypes; - -public class LocalProcess { - - public static boolean executeSimpleBooleanCommand(String cmd) throws Exception { - var proc = new ProcessBuilder(ShellTypes.getPlatformDefault().executeCommandListWithShell(cmd)).redirectErrorStream(true).redirectOutput( - ProcessBuilder.Redirect.DISCARD).start(); - return proc.waitFor() == 0; - } -} diff --git a/core/src/main/java/io/xpipe/core/util/ModuleHelper.java b/core/src/main/java/io/xpipe/core/util/ModuleHelper.java index 59a831c6..54c5e04b 100644 --- a/core/src/main/java/io/xpipe/core/util/ModuleHelper.java +++ b/core/src/main/java/io/xpipe/core/util/ModuleHelper.java @@ -1,5 +1,10 @@ package io.xpipe.core.util; +import lombok.SneakyThrows; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + public class ModuleHelper { public static boolean isImage() { @@ -10,4 +15,43 @@ public class ModuleHelper { .getProtocol() .equals("jrt"); } + + @SneakyThrows + public static Module getEveryoneModule() { + Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class); + getDeclaredFields0.setAccessible(true); + Field[] fields = (Field[]) getDeclaredFields0.invoke(Module.class, false); + Field modifiers = null; + for (Field each : fields) { + if ("EVERYONE_MODULE".equals(each.getName())) { + modifiers = each; + break; + } + } + modifiers.setAccessible(true); + return (Module) modifiers.get(null); + } + + @SneakyThrows + public static void exportAndOpen(String pkg, Module mod) { + if (mod.isExported(pkg) && mod.isOpen(pkg)) { + return; + } + + Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredMethods0", boolean.class); + getDeclaredFields0.setAccessible(true); + Method[] fields = (Method[]) getDeclaredFields0.invoke(Module.class, false); + Method modifiers = null; + for (Method each : fields) { + if ("implAddExportsOrOpens".equals(each.getName())) { + modifiers = each; + break; + } + } + modifiers.setAccessible(true); + + var e = getEveryoneModule(); + modifiers.invoke(mod, pkg, e, false, true); + modifiers.invoke(mod, pkg, e, true, true); + } } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/actions/FileBrowseAction.java b/ext/base/src/main/java/io/xpipe/ext/base/actions/FileBrowseAction.java index afb29037..5ead7869 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/actions/FileBrowseAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/actions/FileBrowseAction.java @@ -4,7 +4,7 @@ import io.xpipe.core.impl.FileStore; import io.xpipe.core.impl.LocalStore; import io.xpipe.extension.DataStoreActionProvider; import io.xpipe.extension.I18n; -import io.xpipe.extension.util.OsHelper; +import io.xpipe.extension.util.DesktopHelper; import javafx.beans.value.ObservableValue; import java.nio.file.Files; @@ -34,6 +34,6 @@ public class FileBrowseAction implements DataStoreActionProvider { @Override public void execute(FileStore store) throws Exception { - OsHelper.browseFileInDirectory(Path.of(store.getFile())); + DesktopHelper.browseFileInDirectory(Path.of(store.getFile())); } } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/actions/StreamExportAction.java b/ext/base/src/main/java/io/xpipe/ext/base/actions/StreamExportAction.java index 7952d273..5eef2658 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/actions/StreamExportAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/actions/StreamExportAction.java @@ -4,7 +4,7 @@ import io.xpipe.core.store.StreamDataStore; import io.xpipe.extension.DataStoreActionProvider; import io.xpipe.extension.I18n; import io.xpipe.extension.event.ErrorEvent; -import io.xpipe.extension.util.OsHelper; +import io.xpipe.extension.util.DesktopHelper; import io.xpipe.extension.util.ThreadHelper; import javafx.beans.value.ObservableValue; import javafx.stage.FileChooser; @@ -49,7 +49,7 @@ public class StreamExportAction implements DataStoreActionProvider REFERENCES = Collections.newSetFromMap(new ConcurrentHashMap()); + public static void bindExclusive( + Property selected, Map> map, Property toBind + ) { + selected.addListener((c, o, n) -> { + toBind.unbind(); + toBind.bind(map.get(n)); + }); + + toBind.bind(map.get(selected.getValue())); + } + @Value private static class ReferenceEntry { diff --git a/extension/src/main/java/io/xpipe/extension/util/OsHelper.java b/extension/src/main/java/io/xpipe/extension/util/DesktopHelper.java similarity index 72% rename from extension/src/main/java/io/xpipe/extension/util/OsHelper.java rename to extension/src/main/java/io/xpipe/extension/util/DesktopHelper.java index ef2af664..9c883b19 100644 --- a/extension/src/main/java/io/xpipe/extension/util/OsHelper.java +++ b/extension/src/main/java/io/xpipe/extension/util/DesktopHelper.java @@ -1,25 +1,11 @@ package io.xpipe.extension.util; import io.xpipe.extension.event.ErrorEvent; -import org.apache.commons.lang3.SystemUtils; import java.awt.*; import java.nio.file.Path; -import java.nio.file.Paths; -public class OsHelper { - - public static String getFileSystemCompatibleName(String name) { - return name.replaceAll("[\\\\/:*?\"<>|]", "_"); - } - - public static Path getUserDocumentsPath() { - if (SystemUtils.IS_OS_WINDOWS) { - return Paths.get(System.getProperty("user.home")); - } else { - return Paths.get(System.getProperty("user.home"), ".local", "share"); - } - } +public class DesktopHelper { public static void browsePath(Path file) { if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) { diff --git a/extension/src/main/java/io/xpipe/extension/util/PropertiesHelper.java b/extension/src/main/java/io/xpipe/extension/util/PropertiesHelper.java deleted file mode 100644 index 9a22832c..00000000 --- a/extension/src/main/java/io/xpipe/extension/util/PropertiesHelper.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.xpipe.extension.util; - -import javafx.beans.property.Property; - -import java.util.Map; - -public class PropertiesHelper { - - public static void bindExclusive( - Property selected, Map> map, Property toBind - ) { - selected.addListener((c, o, n) -> { - toBind.unbind(); - toBind.bind(map.get(n)); - }); - - toBind.bind(map.get(selected.getValue())); - } -} diff --git a/extension/src/main/java/io/xpipe/extension/util/ThreadHelper.java b/extension/src/main/java/io/xpipe/extension/util/ThreadHelper.java index 62ebd32e..2de7dc6a 100644 --- a/extension/src/main/java/io/xpipe/extension/util/ThreadHelper.java +++ b/extension/src/main/java/io/xpipe/extension/util/ThreadHelper.java @@ -5,13 +5,6 @@ import org.apache.commons.lang3.function.FailableRunnable; public class ThreadHelper { - public static void await(FailableRunnable r) { - try { - r.run(); - } catch (InterruptedException e) { - } - } - public static Thread runAsync(Runnable r) { var t = new Thread(r); t.setDaemon(true); diff --git a/gradle/gradle_scripts/lombok-jdk19-20221010.jar b/gradle/gradle_scripts/lombok-jdk19-20221010.jar deleted file mode 100644 index f5f37bab..00000000 Binary files a/gradle/gradle_scripts/lombok-jdk19-20221010.jar and /dev/null differ diff --git a/gradle/gradle_scripts/lombok.gradle b/gradle/gradle_scripts/lombok.gradle index 98c3cc3e..d1cc1d4e 100644 --- a/gradle/gradle_scripts/lombok.gradle +++ b/gradle/gradle_scripts/lombok.gradle @@ -1,14 +1,6 @@ -repositories { - mavenCentral() - flatDir { - dirs file(buildscript.sourceFile).parent - } -} - dependencies { - // A forked version of Lombok because the official one doesn't support Java 19 yet - compileOnly name: 'lombok-jdk19-20221010' - annotationProcessor name: 'lombok-jdk19-20221010' - testCompileOnly name: 'lombok-jdk19-20221010' - testAnnotationProcessor name: 'lombok-jdk19-20221010' + compileOnly 'org.projectlombok:lombok:1.18.26' + annotationProcessor 'org.projectlombok:lombok:1.18.26' + testCompileOnly 'org.projectlombok:lombok:1.18.26' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.26' } \ No newline at end of file