mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-11-25 00:50:31 +00:00
Cleanup
This commit is contained in:
parent
562f02b607
commit
a6bb824bd3
22 changed files with 149 additions and 151 deletions
|
@ -61,7 +61,7 @@ public class DataStructureNodePointer {
|
|||
return path;
|
||||
}
|
||||
|
||||
public static interface Element {
|
||||
public interface Element {
|
||||
|
||||
DataStructureNode tryMatch(DataStructureNode n);
|
||||
|
||||
|
@ -70,7 +70,7 @@ public class DataStructureNodePointer {
|
|||
}
|
||||
}
|
||||
|
||||
public static final record NameElement(String name) implements Element {
|
||||
public record NameElement(String name) implements Element {
|
||||
|
||||
@Override
|
||||
public DataStructureNode tryMatch(DataStructureNode n) {
|
||||
|
@ -88,7 +88,7 @@ public class DataStructureNodePointer {
|
|||
}
|
||||
}
|
||||
|
||||
public static final record IndexElement(int index) implements Element {
|
||||
public record IndexElement(int index) implements Element {
|
||||
|
||||
@Override
|
||||
public DataStructureNode tryMatch(DataStructureNode n) {
|
||||
|
@ -104,7 +104,7 @@ public class DataStructureNodePointer {
|
|||
}
|
||||
}
|
||||
|
||||
public static final record SupplierElement(Supplier<String> keySupplier) implements Element {
|
||||
public record SupplierElement(Supplier<String> keySupplier) implements Element {
|
||||
|
||||
@Override
|
||||
public DataStructureNode tryMatch(DataStructureNode n) {
|
||||
|
@ -126,7 +126,7 @@ public class DataStructureNodePointer {
|
|||
}
|
||||
}
|
||||
|
||||
public static final record FunctionElement(Function<DataStructureNode, String> keyFunc) implements Element {
|
||||
public record FunctionElement(Function<DataStructureNode, String> keyFunc) implements Element {
|
||||
|
||||
@Override
|
||||
public DataStructureNode tryMatch(DataStructureNode n) {
|
||||
|
@ -148,7 +148,7 @@ public class DataStructureNodePointer {
|
|||
}
|
||||
}
|
||||
|
||||
public static final record SelectorElement(Predicate<DataStructureNode> selector) implements Element {
|
||||
public record SelectorElement(Predicate<DataStructureNode> selector) implements Element {
|
||||
|
||||
@Override
|
||||
public DataStructureNode tryMatch(DataStructureNode n) {
|
||||
|
|
|
@ -9,22 +9,21 @@ import java.util.List;
|
|||
|
||||
public class GenericArrayReader implements GenericAbstractReader {
|
||||
|
||||
public static GenericArrayReader newReader(int length) {
|
||||
var ar = new GenericArrayReader();
|
||||
ar.onArrayStart(length);
|
||||
return ar;
|
||||
}
|
||||
|
||||
private boolean initialized;
|
||||
private List<DataStructureNode> nodes;
|
||||
private int length;
|
||||
private int currentIndex = 0;
|
||||
private GenericAbstractReader currentReader;
|
||||
private DataStructureNode created;
|
||||
|
||||
public GenericArrayReader() {
|
||||
}
|
||||
|
||||
public static GenericArrayReader newReader(int length) {
|
||||
var ar = new GenericArrayReader();
|
||||
ar.onArrayStart(length);
|
||||
return ar;
|
||||
}
|
||||
|
||||
private void init(int length) {
|
||||
this.length = length;
|
||||
this.nodes = new ArrayList<>(length);
|
||||
|
|
|
@ -2,7 +2,8 @@ package io.xpipe.core.data.generic;
|
|||
|
||||
public interface GenericDataStreamCallback {
|
||||
|
||||
default void onName(String name) {}
|
||||
default void onName(String name) {
|
||||
}
|
||||
|
||||
default void onArrayStart(int length) {
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public class GenericDataStreamParser {
|
|||
public static List<DataStructureNode> readN(InputStream in, int n) throws IOException {
|
||||
var list = new ArrayList<DataStructureNode>();
|
||||
var reader = new GenericDataStructureNodeReader();
|
||||
for (int i = 0; i < n ; i++) {
|
||||
for (int i = 0; i < n; i++) {
|
||||
read(in, reader);
|
||||
list.add(reader.create());
|
||||
}
|
||||
|
|
|
@ -1,21 +1,15 @@
|
|||
package io.xpipe.core.data.generic;
|
||||
|
||||
import io.xpipe.core.data.DataStructureNode;
|
||||
import io.xpipe.core.data.node.SimpleTupleNode;
|
||||
import io.xpipe.core.data.node.TupleNode;
|
||||
import io.xpipe.core.data.node.ValueNode;
|
||||
import io.xpipe.core.data.node.SimpleTupleNode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class GenericTupleReader implements GenericAbstractReader {
|
||||
|
||||
public static GenericTupleReader newReader(int length) {
|
||||
var tr = new GenericTupleReader();
|
||||
tr.onTupleStart(length);
|
||||
return tr;
|
||||
}
|
||||
|
||||
private boolean initialized;
|
||||
private int length;
|
||||
private List<String> names;
|
||||
|
@ -23,10 +17,15 @@ public class GenericTupleReader implements GenericAbstractReader {
|
|||
private int currentIndex = 0;
|
||||
private GenericAbstractReader currentReader;
|
||||
private DataStructureNode created;
|
||||
|
||||
public GenericTupleReader() {
|
||||
}
|
||||
|
||||
public static GenericTupleReader newReader(int length) {
|
||||
var tr = new GenericTupleReader();
|
||||
tr.onTupleStart(length);
|
||||
return tr;
|
||||
}
|
||||
|
||||
private boolean hasReader() {
|
||||
return currentReader != null;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,10 @@ import io.xpipe.core.data.type.DataType;
|
|||
import io.xpipe.core.data.type.TupleType;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
public class SimpleTupleNode extends TupleNode {
|
||||
|
|
|
@ -10,38 +10,6 @@ import java.util.stream.Collectors;
|
|||
|
||||
public abstract class TupleNode extends DataStructureNode {
|
||||
|
||||
@Value
|
||||
public static class KeyValue {
|
||||
|
||||
String key;
|
||||
DataStructureNode value;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
|
||||
private final List<KeyValue> entries = new ArrayList<>();
|
||||
|
||||
public Builder add(String name, DataStructureNode node) {
|
||||
Objects.requireNonNull(node);
|
||||
entries.add(new KeyValue(name, node));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder add(DataStructureNode node) {
|
||||
Objects.requireNonNull(node);
|
||||
entries.add(new KeyValue(null, node));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TupleNode build() {
|
||||
boolean hasKeys = entries.stream().anyMatch(kv -> kv.key != null);
|
||||
return hasKeys ? TupleNode.wrap(
|
||||
entries.stream().map(kv -> kv.key).toList(),
|
||||
entries.stream().map(kv -> kv.value).toList()) :
|
||||
TupleNode.wrap(entries.stream().map(kv -> kv.value).toList());
|
||||
}
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
@ -112,4 +80,36 @@ public abstract class TupleNode extends DataStructureNode {
|
|||
public abstract List<String> getNames();
|
||||
|
||||
public abstract List<DataStructureNode> getNodes();
|
||||
|
||||
@Value
|
||||
public static class KeyValue {
|
||||
|
||||
String key;
|
||||
DataStructureNode value;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
|
||||
private final List<KeyValue> entries = new ArrayList<>();
|
||||
|
||||
public Builder add(String name, DataStructureNode node) {
|
||||
Objects.requireNonNull(node);
|
||||
entries.add(new KeyValue(name, node));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder add(DataStructureNode node) {
|
||||
Objects.requireNonNull(node);
|
||||
entries.add(new KeyValue(null, node));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TupleNode build() {
|
||||
boolean hasKeys = entries.stream().anyMatch(kv -> kv.key != null);
|
||||
return hasKeys ? TupleNode.wrap(
|
||||
entries.stream().map(kv -> kv.key).toList(),
|
||||
entries.stream().map(kv -> kv.value).toList()) :
|
||||
TupleNode.wrap(entries.stream().map(kv -> kv.value).toList());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,10 @@ import java.nio.charset.StandardCharsets;
|
|||
@EqualsAndHashCode(callSuper = false)
|
||||
public abstract class ValueNode extends DataStructureNode {
|
||||
|
||||
private static final byte[] NULL = new byte[] {0};
|
||||
private static final byte[] NULL = new byte[]{0};
|
||||
|
||||
protected ValueNode() {
|
||||
}
|
||||
|
||||
public static ValueNode immutable(byte[] data) {
|
||||
return new ImmutableValueNode(data);
|
||||
|
@ -40,9 +43,6 @@ public abstract class ValueNode extends DataStructureNode {
|
|||
return mutable(o);
|
||||
}
|
||||
|
||||
protected ValueNode() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract DataStructureNode setRawData(byte[] data);
|
||||
|
||||
|
|
|
@ -11,6 +11,12 @@ import java.util.List;
|
|||
@EqualsAndHashCode
|
||||
public class ArrayType implements DataType {
|
||||
|
||||
private final DataType sharedType;
|
||||
|
||||
public ArrayType(DataType sharedType) {
|
||||
this.sharedType = sharedType;
|
||||
}
|
||||
|
||||
public static ArrayType ofWildcard() {
|
||||
return new ArrayType(WildcardType.of());
|
||||
}
|
||||
|
@ -25,12 +31,6 @@ public class ArrayType implements DataType {
|
|||
return new ArrayType(eq ? first : WildcardType.of());
|
||||
}
|
||||
|
||||
private final DataType sharedType;
|
||||
|
||||
public ArrayType(DataType sharedType) {
|
||||
this.sharedType = sharedType;
|
||||
}
|
||||
|
||||
public boolean isSimple() {
|
||||
return hasSharedType() && getSharedType().isValue();
|
||||
}
|
||||
|
|
|
@ -13,8 +13,8 @@ import java.util.List;
|
|||
@EqualsAndHashCode
|
||||
public class TupleType implements DataType {
|
||||
|
||||
private List<String> names;
|
||||
private List<DataType> types;
|
||||
private final List<String> names;
|
||||
private final List<DataType> types;
|
||||
|
||||
@JsonCreator
|
||||
private TupleType(List<String> names, List<DataType> types) {
|
||||
|
|
|
@ -9,14 +9,14 @@ import lombok.EqualsAndHashCode;
|
|||
@EqualsAndHashCode
|
||||
public class ValueType implements DataType {
|
||||
|
||||
public static ValueType of() {
|
||||
return new ValueType();
|
||||
}
|
||||
|
||||
private ValueType() {
|
||||
|
||||
}
|
||||
|
||||
public static ValueType of() {
|
||||
return new ValueType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "value";
|
||||
|
|
|
@ -5,14 +5,14 @@ import io.xpipe.core.data.type.callback.DataTypeCallback;
|
|||
|
||||
public class WildcardType implements DataType {
|
||||
|
||||
public static WildcardType of() {
|
||||
return new WildcardType();
|
||||
}
|
||||
|
||||
private WildcardType() {
|
||||
|
||||
}
|
||||
|
||||
public static WildcardType of() {
|
||||
return new WildcardType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "wildcard";
|
||||
|
|
|
@ -9,7 +9,7 @@ import java.util.function.Consumer;
|
|||
|
||||
public interface DataTypeCallback {
|
||||
|
||||
public static DataTypeCallback flatten(Consumer<DataType> typeConsumer) {
|
||||
static DataTypeCallback flatten(Consumer<DataType> typeConsumer) {
|
||||
return new DataTypeCallback() {
|
||||
@Override
|
||||
public void onValue() {
|
||||
|
|
|
@ -46,7 +46,7 @@ public class FlatArrayTypeCallback implements DataTypeCallback {
|
|||
arrayDepth++;
|
||||
}
|
||||
|
||||
public static interface FlatCallback {
|
||||
public interface FlatCallback {
|
||||
|
||||
default void onValue() {
|
||||
}
|
||||
|
|
|
@ -14,6 +14,13 @@ import java.util.function.Consumer;
|
|||
|
||||
public class TypedDataStreamParser {
|
||||
|
||||
private final DataType dataType;
|
||||
private GenericDataStructureNodeReader genericReader;
|
||||
|
||||
public TypedDataStreamParser(DataType dataType) {
|
||||
this.dataType = dataType;
|
||||
}
|
||||
|
||||
public boolean hasNext(InputStream in) throws IOException {
|
||||
var b = in.read();
|
||||
if (b == -1) {
|
||||
|
@ -98,13 +105,6 @@ public class TypedDataStreamParser {
|
|||
cb.onTupleEnd();
|
||||
}
|
||||
|
||||
private DataType dataType;
|
||||
private GenericDataStructureNodeReader genericReader;
|
||||
|
||||
public TypedDataStreamParser(DataType dataType) {
|
||||
this.dataType = dataType;
|
||||
}
|
||||
|
||||
private GenericDataStructureNodeReader getGenericReader() {
|
||||
if (genericReader == null) {
|
||||
genericReader = new GenericDataStructureNodeReader();
|
||||
|
|
|
@ -23,11 +23,9 @@ public class TypedDataStreamWriter {
|
|||
private static void write(OutputStream out, DataStructureNode node, DataType type) throws IOException {
|
||||
if (type.isTuple() && node.isTuple()) {
|
||||
writeTuple(out, (SimpleTupleNode) node, (TupleType) type);
|
||||
}
|
||||
else if (node.isArray() && type.isArray()) {
|
||||
} else if (node.isArray() && type.isArray()) {
|
||||
writeArray(out, (ArrayNode) node, (ArrayType) type);
|
||||
}
|
||||
else if (node.isValue() && type.isValue()) {
|
||||
} else if (node.isValue() && type.isValue()) {
|
||||
writeValue(out, (ValueNode) node);
|
||||
} else {
|
||||
throw new AssertionError();
|
||||
|
|
|
@ -17,23 +17,14 @@ import java.util.Stack;
|
|||
|
||||
public class TypedDataStructureNodeReader implements TypedAbstractReader {
|
||||
|
||||
public static TypedDataStructureNodeReader mutable(DataType type) {
|
||||
return new TypedDataStructureNodeReader(type, false);
|
||||
}
|
||||
|
||||
public static TypedDataStructureNodeReader immutable(DataType type) {
|
||||
return new TypedDataStructureNodeReader(type, true);
|
||||
}
|
||||
|
||||
private int currentDataTypeIndex;
|
||||
private final List<DataType> flattened;
|
||||
private final Stack<List<DataStructureNode>> children;
|
||||
private final Stack<DataStructureNode> nodes;
|
||||
private final boolean makeImmutable;
|
||||
private int currentDataTypeIndex;
|
||||
private DataStructureNode readNode;
|
||||
private boolean initialized;
|
||||
private int arrayDepth;
|
||||
private final boolean makeImmutable;
|
||||
|
||||
private TypedDataStructureNodeReader(DataType type, boolean makeImmutable) {
|
||||
flattened = new ArrayList<>();
|
||||
children = new Stack<>();
|
||||
|
@ -42,6 +33,14 @@ public class TypedDataStructureNodeReader implements TypedAbstractReader {
|
|||
this.makeImmutable = makeImmutable;
|
||||
}
|
||||
|
||||
public static TypedDataStructureNodeReader mutable(DataType type) {
|
||||
return new TypedDataStructureNodeReader(type, false);
|
||||
}
|
||||
|
||||
public static TypedDataStructureNodeReader immutable(DataType type) {
|
||||
return new TypedDataStructureNodeReader(type, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNodeBegin() {
|
||||
if (nodes.size() != 0 || children.size() != 0) {
|
||||
|
|
|
@ -13,10 +13,10 @@ import java.util.Stack;
|
|||
|
||||
public class TypedReusableDataStructureNodeReader implements TypedAbstractReader {
|
||||
|
||||
private TypedDataStructureNodeReader initialReader;
|
||||
private DataStructureNode node;
|
||||
private final List<DataType> flattened;
|
||||
private Stack<Integer> indices;
|
||||
private final TypedDataStructureNodeReader initialReader;
|
||||
private DataStructureNode node;
|
||||
private final Stack<Integer> indices;
|
||||
private int arrayDepth;
|
||||
|
||||
public TypedReusableDataStructureNodeReader(DataType type) {
|
||||
|
|
|
@ -7,7 +7,7 @@ import lombok.Getter;
|
|||
/**
|
||||
* Represents a reference to an XPipe data source.
|
||||
* This reference consists out of a collection name and an entry name to allow for better organisation.
|
||||
*
|
||||
* <p>
|
||||
* To allow for a simple usage of data source ids, the collection and entry names are trimmed and
|
||||
* converted to lower case names when creating them.
|
||||
* The two names are separated by a colon and are therefore not allowed to contain colons themselves.
|
||||
|
@ -20,12 +20,19 @@ import lombok.Getter;
|
|||
public class DataSourceId {
|
||||
|
||||
public static final char SEPARATOR = ':';
|
||||
private final String collectionName;
|
||||
private final String entryName;
|
||||
@JsonCreator
|
||||
private DataSourceId(String collectionName, String entryName) {
|
||||
this.collectionName = collectionName;
|
||||
this.entryName = entryName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new data source id from a collection name and an entry name.
|
||||
*
|
||||
* @param collectionName the collection name, which must be not null and not empty
|
||||
* @param entryName the entry name, which must be not null and not empty
|
||||
* @param entryName the entry name, which must be not null and not empty
|
||||
* @throws IllegalArgumentException if any name is not valid
|
||||
*/
|
||||
public static DataSourceId create(String collectionName, String entryName) {
|
||||
|
@ -52,15 +59,6 @@ public class DataSourceId {
|
|||
return new DataSourceId(collectionName, entryName);
|
||||
}
|
||||
|
||||
private final String collectionName;
|
||||
private final String entryName;
|
||||
|
||||
@JsonCreator
|
||||
private DataSourceId(String collectionName, String entryName) {
|
||||
this.collectionName = collectionName;
|
||||
this.entryName = entryName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new data source id from a string representation.
|
||||
* The string must contain exactly one colon and non-empty names.
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package io.xpipe.core.store;
|
||||
|
||||
import com.fasterxml.jackson.annotation.*;
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeName;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
|
|
|
@ -20,40 +20,6 @@ import java.nio.file.Path;
|
|||
|
||||
public class CoreJacksonModule extends SimpleModule {
|
||||
|
||||
public static class CharsetSerializer extends JsonSerializer<Charset> {
|
||||
|
||||
@Override
|
||||
public void serialize(Charset value, JsonGenerator jgen, SerializerProvider provider)
|
||||
throws IOException, JsonProcessingException {
|
||||
jgen.writeString(value.name());
|
||||
}
|
||||
}
|
||||
|
||||
public static class CharsetDeserializer extends JsonDeserializer<Charset> {
|
||||
|
||||
@Override
|
||||
public Charset deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
||||
return Charset.forName(p.getValueAsString());
|
||||
}
|
||||
}
|
||||
|
||||
public static class LocalPathSerializer extends JsonSerializer<Path> {
|
||||
|
||||
@Override
|
||||
public void serialize(Path value, JsonGenerator jgen, SerializerProvider provider)
|
||||
throws IOException, JsonProcessingException {
|
||||
jgen.writeString(value.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public static class LocalPathDeserializer extends JsonDeserializer<Path> {
|
||||
|
||||
@Override
|
||||
public Path deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
||||
return Path.of(p.getValueAsString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupModule(SetupContext context) {
|
||||
context.registerSubtypes(
|
||||
|
@ -69,4 +35,38 @@ public class CoreJacksonModule extends SimpleModule {
|
|||
addSerializer(Path.class, new LocalPathSerializer());
|
||||
addDeserializer(Path.class, new LocalPathDeserializer());
|
||||
}
|
||||
|
||||
public static class CharsetSerializer extends JsonSerializer<Charset> {
|
||||
|
||||
@Override
|
||||
public void serialize(Charset value, JsonGenerator jgen, SerializerProvider provider)
|
||||
throws IOException {
|
||||
jgen.writeString(value.name());
|
||||
}
|
||||
}
|
||||
|
||||
public static class CharsetDeserializer extends JsonDeserializer<Charset> {
|
||||
|
||||
@Override
|
||||
public Charset deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
|
||||
return Charset.forName(p.getValueAsString());
|
||||
}
|
||||
}
|
||||
|
||||
public static class LocalPathSerializer extends JsonSerializer<Path> {
|
||||
|
||||
@Override
|
||||
public void serialize(Path value, JsonGenerator jgen, SerializerProvider provider)
|
||||
throws IOException {
|
||||
jgen.writeString(value.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public static class LocalPathDeserializer extends JsonDeserializer<Path> {
|
||||
|
||||
@Override
|
||||
public Path deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
|
||||
return Path.of(p.getValueAsString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,8 +28,7 @@ public class JacksonHelper {
|
|||
init = true;
|
||||
}
|
||||
|
||||
private static List<Module> findModules(ModuleLayer layer)
|
||||
{
|
||||
private static List<Module> findModules(ModuleLayer layer) {
|
||||
ArrayList<Module> modules = new ArrayList<Module>();
|
||||
ServiceLoader<Module> loader = ServiceLoader.load(layer, Module.class);
|
||||
for (Module module : loader) {
|
||||
|
|
Loading…
Reference in a new issue