From e14b38b31fcf9835bb8cfcb81147fcffe9de8c0b Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 29 May 2024 05:41:29 +0000 Subject: [PATCH] Rework states --- .../xpipe/app/browser/file/BrowserEntry.java | 8 ++++ .../io/xpipe/app/storage/DataStorage.java | 4 +- .../io/xpipe/core/process/ShellControl.java | 18 ++++---- .../core/process/ShellNameStoreState.java | 24 +++++++++++ .../xpipe/core/process/ShellStoreState.java | 25 ++++++----- .../io/xpipe/core/store/DataStoreState.java | 43 ++++--------------- .../xpipe/core/store/StatefulDataStore.java | 10 +---- .../base/script/ScriptGroupStoreProvider.java | 6 +-- .../io/xpipe/ext/base/script/ScriptStore.java | 17 ++------ .../script/SimpleScriptStoreProvider.java | 6 +-- 10 files changed, 75 insertions(+), 86 deletions(-) create mode 100644 core/src/main/java/io/xpipe/core/process/ShellNameStoreState.java diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java index de226a240..bcc4e9404 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java @@ -24,6 +24,10 @@ public class BrowserEntry { } private static BrowserIconFileType fileType(FileSystem.FileEntry rawFileEntry) { + if (rawFileEntry == null) { + return null; + } + if (rawFileEntry.getKind() == FileKind.DIRECTORY) { return null; } @@ -38,6 +42,10 @@ public class BrowserEntry { } private static BrowserIconDirectoryType directoryType(FileSystem.FileEntry rawFileEntry) { + if (rawFileEntry == null) { + return null; + } + if (rawFileEntry.getKind() != FileKind.DIRECTORY) { return null; } 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 a4d724ae7..fb255fc8e 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorage.java @@ -448,8 +448,8 @@ public abstract class DataStorage { pair.getKey().setStoreInternal(merged, false); } - var mergedState = pair.getKey().getStorePersistentState().copy(); - mergedState.merge(pair.getValue().get().getStorePersistentState()); + var s = pair.getKey().getStorePersistentState(); + var mergedState = s.mergeCopy(pair.getValue().get().getStorePersistentState()); pair.getKey().setStorePersistentState(mergedState); } } diff --git a/core/src/main/java/io/xpipe/core/process/ShellControl.java b/core/src/main/java/io/xpipe/core/process/ShellControl.java index a50e1266e..fdcd066ce 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellControl.java +++ b/core/src/main/java/io/xpipe/core/process/ShellControl.java @@ -58,12 +58,13 @@ public interface ShellControl extends ProcessControl { default ShellControl withShellStateInit(StatefulDataStore store) { return onInit(shellControl -> { - var s = store.getState(); - s.setOsType(shellControl.getOsType()); - s.setShellDialect(shellControl.getOriginalShellDialect()); - s.setRunning(true); - s.setOsName(shellControl.getOsName()); - store.setState(s); + var s = store.getState().toBuilder() + .osType(shellControl.getOsType()) + .shellDialect(shellControl.getOriginalShellDialect()) + .running(true) + .osName(shellControl.getOsName()) + .build(); + store.setState(s.asNeeded()); }); } @@ -74,9 +75,8 @@ public interface ShellControl extends ProcessControl { return; } - var s = store.getState(); - s.setRunning(false); - store.setState(s); + var s = store.getState().toBuilder().running(false).build(); + store.setState(s.asNeeded()); }); } diff --git a/core/src/main/java/io/xpipe/core/process/ShellNameStoreState.java b/core/src/main/java/io/xpipe/core/process/ShellNameStoreState.java new file mode 100644 index 000000000..55a06aea4 --- /dev/null +++ b/core/src/main/java/io/xpipe/core/process/ShellNameStoreState.java @@ -0,0 +1,24 @@ +package io.xpipe.core.process; + +import io.xpipe.core.store.DataStoreState; +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Value +@EqualsAndHashCode(callSuper=true) +@SuperBuilder(toBuilder = true) +@Jacksonized +public class ShellNameStoreState extends ShellStoreState { + + String shellName; + + @Override + public DataStoreState mergeCopy(DataStoreState newer) { + var n = (ShellNameStoreState) newer; + var b = toBuilder(); + mergeBuilder(n,b); + return b.shellName(useNewer(shellName, n.shellName)).build(); + } +} diff --git a/core/src/main/java/io/xpipe/core/process/ShellStoreState.java b/core/src/main/java/io/xpipe/core/process/ShellStoreState.java index faf4d688e..26d8208f3 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellStoreState.java +++ b/core/src/main/java/io/xpipe/core/process/ShellStoreState.java @@ -1,19 +1,18 @@ package io.xpipe.core.process; import io.xpipe.core.store.DataStoreState; - import lombok.AccessLevel; +import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; import lombok.experimental.FieldDefaults; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; -@FieldDefaults(level = AccessLevel.PRIVATE) -@Setter +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter +@EqualsAndHashCode(callSuper=true) +@SuperBuilder(toBuilder = true) @Jacksonized -@SuperBuilder public class ShellStoreState extends DataStoreState implements OsNameState { OsType.Any osType; @@ -26,11 +25,17 @@ public class ShellStoreState extends DataStoreState implements OsNameState { } @Override - public void merge(DataStoreState newer) { + public DataStoreState mergeCopy(DataStoreState newer) { var shellStoreState = (ShellStoreState) newer; - osType = useNewer(osType, shellStoreState.getOsType()); - osName = useNewer(osName, shellStoreState.getOsName()); - shellDialect = useNewer(shellDialect, shellStoreState.getShellDialect()); - running = useNewer(running, shellStoreState.getRunning()); + var b = toBuilder(); + mergeBuilder(shellStoreState, b); + return b.build(); + } + + protected void mergeBuilder(ShellStoreState shellStoreState, ShellStoreStateBuilder b) { + b.osType(useNewer(osType, shellStoreState.getOsType())) + .osName(useNewer(osName, shellStoreState.getOsName())) + .shellDialect(useNewer(shellDialect, shellStoreState.getShellDialect())) + .running(useNewer(running, shellStoreState.getRunning())); } } diff --git a/core/src/main/java/io/xpipe/core/store/DataStoreState.java b/core/src/main/java/io/xpipe/core/store/DataStoreState.java index 7b40db544..03b7f9ec8 100644 --- a/core/src/main/java/io/xpipe/core/store/DataStoreState.java +++ b/core/src/main/java/io/xpipe/core/store/DataStoreState.java @@ -1,49 +1,22 @@ package io.xpipe.core.store; -import io.xpipe.core.util.JacksonMapper; - -import lombok.SneakyThrows; import lombok.experimental.SuperBuilder; -@SuperBuilder +@SuperBuilder(toBuilder = true) public abstract class DataStoreState { public DataStoreState() {} + @SuppressWarnings("unchecked") + public DS asNeeded() { + return (DS) this; + } + protected static T useNewer(T older, T newer) { return newer != null ? newer : older; } - public abstract void merge(DataStoreState newer); - - @SneakyThrows - public DataStoreState deepCopy() { - return JacksonMapper.getDefault().treeToValue(JacksonMapper.getDefault().valueToTree(this), getClass()); - } - - @Override - public final int hashCode() { - var tree = JacksonMapper.getDefault().valueToTree(this); - return tree.hashCode(); - } - - @Override - public final boolean equals(Object o) { - if (this == o) { - return true; - } - if (o != null && getClass() != o.getClass()) { - return false; - } - - var tree = JacksonMapper.getDefault().valueToTree(this); - var otherTree = JacksonMapper.getDefault().valueToTree(o); - return tree.equals(otherTree); - } - - @SneakyThrows - public String toString() { - var tree = JacksonMapper.getDefault().valueToTree(this); - return tree.toPrettyString(); + public DataStoreState mergeCopy(DataStoreState newer) { + return this; } } diff --git a/core/src/main/java/io/xpipe/core/store/StatefulDataStore.java b/core/src/main/java/io/xpipe/core/store/StatefulDataStore.java index ff571c084..5bda9d93e 100644 --- a/core/src/main/java/io/xpipe/core/store/StatefulDataStore.java +++ b/core/src/main/java/io/xpipe/core/store/StatefulDataStore.java @@ -1,11 +1,9 @@ package io.xpipe.core.store; import io.xpipe.core.util.DataStateProvider; - import lombok.SneakyThrows; import java.util.Arrays; -import java.util.function.Supplier; public interface StatefulDataStore extends DataStore { @@ -19,20 +17,14 @@ public interface StatefulDataStore extends DataStore { return getStateClass().cast(m.invoke(b)); } - @SuppressWarnings("unchecked") default T getState() { - return (T) - DataStateProvider.get().getState(this, this::createDefaultState).deepCopy(); + return DataStateProvider.get().getState(this, this::createDefaultState); } default void setState(T val) { DataStateProvider.get().setState(this, val); } - default T getState(Supplier def) { - return DataStateProvider.get().getState(this, def); - } - @SneakyThrows @SuppressWarnings("unchecked") default Class getStateClass() { diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStoreProvider.java index 185dd0370..c72da8880 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptGroupStoreProvider.java @@ -31,15 +31,13 @@ public class ScriptGroupStoreProvider implements DataStoreProvider { var def = StoreToggleComp.simpleToggle( "base.isDefaultGroup", sec, s -> s.getState().isDefault(), (s, aBoolean) -> { - var state = s.getState(); - state.setDefault(aBoolean); + var state = s.getState().toBuilder().isDefault(aBoolean).build(); s.setState(state); }); var bring = StoreToggleComp.simpleToggle( "base.bringToShells", sec, s -> s.getState().isBringToShell(), (s, aBoolean) -> { - var state = s.getState(); - state.setBringToShell(aBoolean); + var state = s.getState().toBuilder().bringToShell(aBoolean).build(); s.setState(state); }); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java index b74cde281..bb7531199 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/ScriptStore.java @@ -6,15 +6,14 @@ import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.ShellTemp; import io.xpipe.app.util.Validators; -import io.xpipe.core.process.ShellInitCommand; import io.xpipe.core.process.ShellControl; +import io.xpipe.core.process.ShellInitCommand; import io.xpipe.core.store.DataStore; import io.xpipe.core.store.DataStoreState; import io.xpipe.core.store.FileNames; import io.xpipe.core.store.StatefulDataStore; import io.xpipe.core.util.JacksonizedValue; import lombok.*; -import lombok.experimental.FieldDefaults; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; @@ -222,20 +221,12 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore, public abstract List> getEffectiveScripts(); - @FieldDefaults(level = AccessLevel.PRIVATE) - @Setter - @Getter - @SuperBuilder + @Value + @EqualsAndHashCode(callSuper=true) + @SuperBuilder(toBuilder = true) @Jacksonized public static class State extends DataStoreState { boolean isDefault; boolean bringToShell; - - @Override - public void merge(DataStoreState newer) { - var s = (State) newer; - isDefault = s.isDefault; - bringToShell = s.bringToShell; - } } } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java index 0d6cbb9fb..808f3b187 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java @@ -56,15 +56,13 @@ public class SimpleScriptStoreProvider implements DataStoreProvider { var def = StoreToggleComp.simpleToggle( "base.isDefaultGroup", sec, s -> s.getState().isDefault(), (s, aBoolean) -> { - var state = s.getState(); - state.setDefault(aBoolean); + var state = s.getState().toBuilder().isDefault(aBoolean).build(); s.setState(state); }); var bring = StoreToggleComp.simpleToggle( "base.bringToShells", sec, s -> s.getState().isBringToShell(), (s, aBoolean) -> { - var state = s.getState(); - state.setBringToShell(aBoolean); + var state = s.getState().toBuilder().bringToShell(aBoolean).build(); s.setState(state); });