mirror of
https://github.com/xpipe-io/xpipe.git
synced 2026-08-23 01:36:33 +00:00
Rework states
This commit is contained in:
@@ -58,12 +58,13 @@ public interface ShellControl extends ProcessControl {
|
||||
|
||||
default <T extends ShellStoreState> ShellControl withShellStateInit(StatefulDataStore<T> 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());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 extends DataStoreState> DS asNeeded() {
|
||||
return (DS) this;
|
||||
}
|
||||
|
||||
protected static <T> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<T extends DataStoreState> extends DataStore {
|
||||
|
||||
@@ -19,20 +17,14 @@ public interface StatefulDataStore<T extends DataStoreState> 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<T> def) {
|
||||
return DataStateProvider.get().getState(this, def);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@SuppressWarnings("unchecked")
|
||||
default Class<T> getStateClass() {
|
||||
|
||||
Reference in New Issue
Block a user