More cleanup

This commit is contained in:
crschnick 2023-02-08 15:09:20 +00:00
parent 6c50478341
commit 6f76df55b0
21 changed files with 97 additions and 153 deletions

View file

@ -9,7 +9,7 @@ import io.xpipe.extension.I18n;
import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.event.ErrorEvent;
import io.xpipe.extension.fxcomps.SimpleComp; import io.xpipe.extension.fxcomps.SimpleComp;
import io.xpipe.extension.util.DynamicOptionsBuilder; import io.xpipe.extension.util.DynamicOptionsBuilder;
import io.xpipe.extension.util.OsHelper; import io.xpipe.extension.util.DesktopHelper;
import javafx.scene.layout.Region; import javafx.scene.layout.Region;
public class BrowseDirectoryComp extends SimpleComp { public class BrowseDirectoryComp extends SimpleComp {
@ -36,13 +36,13 @@ public class BrowseDirectoryComp extends SimpleComp {
.addComp( .addComp(
"logFiles", "logFiles",
new ButtonComp(I18n.observable("openLogsDirectory"), () -> { new ButtonComp(I18n.observable("openLogsDirectory"), () -> {
OsHelper.browsePath(AppLogs.get().getSessionLogsDirectory()); DesktopHelper.browsePath(AppLogs.get().getSessionLogsDirectory());
}), }),
null) null)
.addComp( .addComp(
"installationFiles", "installationFiles",
new ButtonComp(I18n.observable("openInstallationDirectory"), () -> { new ButtonComp(I18n.observable("openInstallationDirectory"), () -> {
OsHelper.browsePath(XPipeInstallation.getLocalInstallationBasePath()); DesktopHelper.browsePath(XPipeInstallation.getLocalInstallationBasePath());
}), }),
null) null)
.build(); .build();

View file

@ -5,7 +5,7 @@ import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.extension.I18n; import io.xpipe.extension.I18n;
import io.xpipe.extension.fxcomps.CompStructure; import io.xpipe.extension.fxcomps.CompStructure;
import io.xpipe.extension.fxcomps.augment.PopupMenuAugment; 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.Alert;
import javafx.scene.control.ContextMenu; import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
@ -88,7 +88,7 @@ public class SourceCollectionContextMenu<S extends CompStructure<?>> extends Pop
if (AppPrefs.get().developerMode().getValue()) { if (AppPrefs.get().developerMode().getValue()) {
var openDir = new MenuItem(I18n.get("openDir"), new FontIcon("mdal-edit")); var openDir = new MenuItem(I18n.get("openDir"), new FontIcon("mdal-edit"));
openDir.setOnAction(e -> { openDir.setOnAction(e -> {
OsHelper.browseFileInDirectory(group.getCollection().getDirectory()); DesktopHelper.browseFileInDirectory(group.getCollection().getDirectory());
}); });
cm.getItems().add(openDir); cm.getItems().add(openDir);
} }

View file

@ -8,7 +8,7 @@ import io.xpipe.extension.I18n;
import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.event.ErrorEvent;
import io.xpipe.extension.fxcomps.CompStructure; import io.xpipe.extension.fxcomps.CompStructure;
import io.xpipe.extension.fxcomps.augment.PopupMenuAugment; 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.beans.binding.Bindings;
import javafx.scene.control.ContextMenu; import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
@ -89,7 +89,7 @@ public class SourceEntryContextMenu<S extends CompStructure<?>> extends PopupMen
var openDir = new MenuItem(I18n.get("browseInternal"), new FontIcon("mdi2f-folder-open-outline")); var openDir = new MenuItem(I18n.get("browseInternal"), new FontIcon("mdi2f-folder-open-outline"));
openDir.setOnAction(e -> { openDir.setOnAction(e -> {
OsHelper.browsePath(entry.getEntry().getDirectory()); DesktopHelper.browsePath(entry.getEntry().getDirectory());
}); });
cm.getItems().add(openDir); cm.getItems().add(openDir);
} }

View file

@ -19,7 +19,7 @@ import io.xpipe.extension.fxcomps.impl.IconButtonComp;
import io.xpipe.extension.fxcomps.impl.PrettyImageComp; import io.xpipe.extension.fxcomps.impl.PrettyImageComp;
import io.xpipe.extension.fxcomps.util.PlatformThread; import io.xpipe.extension.fxcomps.util.PlatformThread;
import io.xpipe.extension.fxcomps.util.SimpleChangeListener; 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 io.xpipe.extension.util.ThreadHelper;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
@ -245,7 +245,7 @@ public class StoreEntryComp extends SimpleComp {
if (AppPrefs.get().developerMode().getValue()) { if (AppPrefs.get().developerMode().getValue()) {
var browse = new MenuItem(I18n.get("browse"), new FontIcon("mdi2f-folder-open-outline")); 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); contextMenu.getItems().add(browse);
} }

View file

@ -69,7 +69,7 @@ public class App extends Application {
AppActionLinkDetector.detectOnFocus(); 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); var appWindow = new AppMainWindow(stage);
appWindow.initialize(); appWindow.initialize();
appWindow.setContent(title, content); appWindow.setContent(title, content);

View file

@ -1,7 +1,7 @@
package io.xpipe.app.core; package io.xpipe.app.core;
import io.xpipe.app.exchange.MessageExchangeImpls; 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.core.util.XPipeInstallation;
import io.xpipe.extension.ModuleInstall; import io.xpipe.extension.ModuleInstall;
import io.xpipe.extension.XPipeServiceProviders; import io.xpipe.extension.XPipeServiceProviders;

View file

@ -2,7 +2,7 @@ package io.xpipe.app.core;
import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.prefs.SupportedLocale; 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.I18n;
import io.xpipe.extension.Translatable; import io.xpipe.extension.Translatable;
import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.event.ErrorEvent;
@ -25,7 +25,10 @@ import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; 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.concurrent.atomic.AtomicInteger;
import java.util.function.UnaryOperator; import java.util.function.UnaryOperator;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -94,11 +97,20 @@ public class AppI18n implements I18n {
prettyTime = null; prettyTime = null;
} }
@SuppressWarnings("removal")
public static class CallingClass extends SecurityManager {
public static final CallingClass INSTANCE = new CallingClass();
public Class<?>[] getCallingClasses() {
return getClassContext();
}
}
@SneakyThrows @SneakyThrows
private static String getCallerModuleName() { private static String getCallerModuleName() {
var callers = ModuleHelper.CallingClass.INSTANCE.getCallingClasses(); var callers = CallingClass.INSTANCE.getCallingClasses();
for (Class<?> caller : callers) { for (Class<?> caller : callers) {
if (caller.equals(ModuleHelper.CallingClass.class) if (caller.equals(CallingClass.class)
|| caller.equals(ModuleHelper.class) || caller.equals(ModuleHelper.class)
|| caller.equals(AppI18n.class) || caller.equals(AppI18n.class)
|| caller.equals(I18n.class) || caller.equals(I18n.class)

View file

@ -1,7 +1,7 @@
package io.xpipe.app.core; package io.xpipe.app.core;
import io.xpipe.app.prefs.AppPrefs; 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.ErrorEvent;
import io.xpipe.extension.event.TrackEvent; import io.xpipe.extension.event.TrackEvent;
import lombok.Value; import lombok.Value;

View file

@ -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();
}
}
}

View file

@ -2,11 +2,12 @@ package io.xpipe.app.util;
import io.xpipe.app.core.AppProperties; import io.xpipe.app.core.AppProperties;
import io.xpipe.app.core.AppWindowHelper; import io.xpipe.app.core.AppWindowHelper;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.update.AppDownloads; import io.xpipe.app.update.AppDownloads;
import io.xpipe.app.update.AppInstaller; import io.xpipe.app.update.AppInstaller;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.core.impl.FileNames; import io.xpipe.core.impl.FileNames;
import io.xpipe.core.process.ShellProcessControl; import io.xpipe.core.process.ShellProcessControl;
import io.xpipe.core.util.ModuleHelper;
import io.xpipe.core.util.ProxyManagerProvider; import io.xpipe.core.util.ProxyManagerProvider;
import io.xpipe.core.util.XPipeInstallation; import io.xpipe.core.util.XPipeInstallation;
import io.xpipe.extension.I18n; import io.xpipe.extension.I18n;

View file

@ -3,6 +3,7 @@ package io.xpipe.core.util;
import io.xpipe.core.charsetter.NewLine; import io.xpipe.core.charsetter.NewLine;
import io.xpipe.core.process.OsType; import io.xpipe.core.process.OsType;
import io.xpipe.core.process.ShellTypes; import io.xpipe.core.process.ShellTypes;
import io.xpipe.core.store.ShellStore;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
@ -105,6 +106,6 @@ public class Deobfuscator {
} }
var t = ShellTypes.getPlatformDefault(); var t = ShellTypes.getPlatformDefault();
return LocalProcess.executeSimpleBooleanCommand(t.getWhichCommand("retrace." + t.getScriptFileEnding())); return ShellStore.local().create().executeBooleanSimpleCommand(t.getWhichCommand("retrace." + t.getScriptFileEnding()));
} }
} }

View file

@ -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;
}
}

View file

@ -1,5 +1,10 @@
package io.xpipe.core.util; package io.xpipe.core.util;
import lombok.SneakyThrows;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ModuleHelper { public class ModuleHelper {
public static boolean isImage() { public static boolean isImage() {
@ -10,4 +15,43 @@ public class ModuleHelper {
.getProtocol() .getProtocol()
.equals("jrt"); .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);
}
} }

View file

@ -4,7 +4,7 @@ import io.xpipe.core.impl.FileStore;
import io.xpipe.core.impl.LocalStore; import io.xpipe.core.impl.LocalStore;
import io.xpipe.extension.DataStoreActionProvider; import io.xpipe.extension.DataStoreActionProvider;
import io.xpipe.extension.I18n; import io.xpipe.extension.I18n;
import io.xpipe.extension.util.OsHelper; import io.xpipe.extension.util.DesktopHelper;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import java.nio.file.Files; import java.nio.file.Files;
@ -34,6 +34,6 @@ public class FileBrowseAction implements DataStoreActionProvider<FileStore> {
@Override @Override
public void execute(FileStore store) throws Exception { public void execute(FileStore store) throws Exception {
OsHelper.browseFileInDirectory(Path.of(store.getFile())); DesktopHelper.browseFileInDirectory(Path.of(store.getFile()));
} }
} }

View file

@ -4,7 +4,7 @@ import io.xpipe.core.store.StreamDataStore;
import io.xpipe.extension.DataStoreActionProvider; import io.xpipe.extension.DataStoreActionProvider;
import io.xpipe.extension.I18n; import io.xpipe.extension.I18n;
import io.xpipe.extension.event.ErrorEvent; 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 io.xpipe.extension.util.ThreadHelper;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
@ -49,7 +49,7 @@ public class StreamExportAction implements DataStoreActionProvider<StreamDataSto
try (OutputStream outputStream = Files.newOutputStream(outputFile.toPath())) { try (OutputStream outputStream = Files.newOutputStream(outputFile.toPath())) {
inputStream.transferTo(outputStream); inputStream.transferTo(outputStream);
} }
OsHelper.browseFileInDirectory(outputFile.toPath()); DesktopHelper.browseFileInDirectory(outputFile.toPath());
} catch (Exception e) { } catch (Exception e) {
ErrorEvent.fromThrowable(e).handle(); ErrorEvent.fromThrowable(e).handle();
} }

View file

@ -3,6 +3,7 @@ package io.xpipe.extension.fxcomps.util;
import io.xpipe.extension.util.ThreadHelper; import io.xpipe.extension.util.ThreadHelper;
import javafx.beans.binding.Binding; import javafx.beans.binding.Binding;
import javafx.beans.binding.ListBinding; import javafx.beans.binding.ListBinding;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
@ -20,6 +21,17 @@ public class BindingsHelper {
private static final Set<ReferenceEntry> REFERENCES = Collections.newSetFromMap(new ConcurrentHashMap<ReferenceEntry, Boolean>()); private static final Set<ReferenceEntry> REFERENCES = Collections.newSetFromMap(new ConcurrentHashMap<ReferenceEntry, Boolean>());
public static <T, V> void bindExclusive(
Property<V> selected, Map<V, ? extends Property<T>> map, Property<T> toBind
) {
selected.addListener((c, o, n) -> {
toBind.unbind();
toBind.bind(map.get(n));
});
toBind.bind(map.get(selected.getValue()));
}
@Value @Value
private static class ReferenceEntry { private static class ReferenceEntry {

View file

@ -1,25 +1,11 @@
package io.xpipe.extension.util; package io.xpipe.extension.util;
import io.xpipe.extension.event.ErrorEvent; import io.xpipe.extension.event.ErrorEvent;
import org.apache.commons.lang3.SystemUtils;
import java.awt.*; import java.awt.*;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
public class OsHelper { public class DesktopHelper {
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 static void browsePath(Path file) { public static void browsePath(Path file) {
if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) { if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) {

View file

@ -1,19 +0,0 @@
package io.xpipe.extension.util;
import javafx.beans.property.Property;
import java.util.Map;
public class PropertiesHelper {
public static <T, V> void bindExclusive(
Property<V> selected, Map<V, ? extends Property<T>> map, Property<T> toBind
) {
selected.addListener((c, o, n) -> {
toBind.unbind();
toBind.bind(map.get(n));
});
toBind.bind(map.get(selected.getValue()));
}
}

View file

@ -5,13 +5,6 @@ import org.apache.commons.lang3.function.FailableRunnable;
public class ThreadHelper { public class ThreadHelper {
public static void await(FailableRunnable<InterruptedException> r) {
try {
r.run();
} catch (InterruptedException e) {
}
}
public static Thread runAsync(Runnable r) { public static Thread runAsync(Runnable r) {
var t = new Thread(r); var t = new Thread(r);
t.setDaemon(true); t.setDaemon(true);

View file

@ -1,14 +1,6 @@
repositories {
mavenCentral()
flatDir {
dirs file(buildscript.sourceFile).parent
}
}
dependencies { dependencies {
// A forked version of Lombok because the official one doesn't support Java 19 yet compileOnly 'org.projectlombok:lombok:1.18.26'
compileOnly name: 'lombok-jdk19-20221010' annotationProcessor 'org.projectlombok:lombok:1.18.26'
annotationProcessor name: 'lombok-jdk19-20221010' testCompileOnly 'org.projectlombok:lombok:1.18.26'
testCompileOnly name: 'lombok-jdk19-20221010' testAnnotationProcessor 'org.projectlombok:lombok:1.18.26'
testAnnotationProcessor name: 'lombok-jdk19-20221010'
} }