Initial commit

That's a lotta stuff for an initial commit, but well...
This commit is contained in:
2024-05-25 19:22:26 +02:00
commit b0f35b03b9
99 changed files with 6476 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
package de.siphalor.tweed5.dataapi.api;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.Nullable;
@Getter
public class TweedDataReadException extends RuntimeException {
@Nullable
private final TweedDataReaderRecoverMode recoverMode;
protected TweedDataReadException(String message, Throwable cause, @Nullable TweedDataReaderRecoverMode recoverMode) {
super(message, cause);
this.recoverMode = recoverMode;
}
public boolean canRecover() {
return recoverMode != null;
}
public static Builder builder() {
return new Builder();
}
@Setter
public static class Builder {
private String message;
private Throwable cause;
@Setter(AccessLevel.NONE)
@Nullable
private TweedDataReaderRecoverMode recoverMode;
public TweedDataReadException build() {
return new TweedDataReadException(message, cause, recoverMode);
}
public Builder recoverable(TweedDataReaderRecoverMode recoverMode) {
this.recoverMode = recoverMode;
return this;
}
}
}

View File

@@ -0,0 +1,6 @@
package de.siphalor.tweed5.dataapi.api;
public interface TweedDataReader {
TweedDataToken peekToken() throws TweedDataReadException;
TweedDataToken readToken() throws TweedDataReadException;
}

View File

@@ -0,0 +1,6 @@
package de.siphalor.tweed5.dataapi.api;
public enum TweedDataReaderRecoverMode {
SKIP,
REPEAT,
}

View File

@@ -0,0 +1,82 @@
package de.siphalor.tweed5.dataapi.api;
public interface TweedDataToken {
default boolean isNull() {
return false;
}
default boolean canReadAsBoolean() {
return false;
}
default boolean readAsBoolean() throws TweedDataReadException {
throw createUnsupportedReadException("boolean");
}
default boolean canReadAsByte() {
return false;
}
default byte readAsByte() throws TweedDataReadException {
throw createUnsupportedReadException("byte");
}
default boolean canReadAsShort() {
return false;
}
default short readAsShort() throws TweedDataReadException {
throw createUnsupportedReadException("short");
}
default boolean canReadAsInt() {
return false;
}
default int readAsInt() throws TweedDataReadException {
throw createUnsupportedReadException("integer");
}
default boolean canReadAsLong() {
return false;
}
default long readAsLong() throws TweedDataReadException {
throw createUnsupportedReadException("long");
}
default boolean canReadAsFloat() {
return false;
}
default float readAsFloat() throws TweedDataReadException {
throw createUnsupportedReadException("float");
}
default boolean canReadAsDouble() {
return false;
}
default double readAsDouble() throws TweedDataReadException {
throw createUnsupportedReadException("double");
}
default boolean canReadAsString() {
return false;
}
default String readAsString() throws TweedDataReadException {
throw createUnsupportedReadException("string");
}
default boolean isListStart() {
return false;
}
default boolean isListValue() {
return false;
}
default boolean isListEnd() {
return false;
}
default boolean isMapStart() {
return false;
}
default boolean isMapEntryKey() {
return false;
}
default boolean isMapEntryValue() {
return false;
}
default boolean isMapEnd() {
return false;
}
default TweedDataReadException createUnsupportedReadException(String requestedType) {
return TweedDataReadException.builder().message("Token can not be read as " + requestedType + ": " + this).build();
}
}

View File

@@ -0,0 +1,259 @@
package de.siphalor.tweed5.dataapi.api;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public final class TweedDataTokens {
private static final TweedDataToken NULL = new TweedDataToken() {
@Override
public boolean isNull() {
return true;
}
@Override
public String toString() {
return "NULL";
}
};
private static final TweedDataToken LIST_START = new TweedDataToken() {
@Override
public boolean isListStart() {
return true;
}
@Override
public String toString() {
return "LIST_START";
}
};
private static final TweedDataToken LIST_END = new TweedDataToken() {
@Override
public boolean isListEnd() {
return true;
}
@Override
public String toString() {
return "LIST_END";
}
};
private static final TweedDataToken MAP_START = new TweedDataToken() {
@Override
public boolean isMapStart() {
return true;
}
@Override
public String toString() {
return "MAP_START";
}
};
private static final TweedDataToken MAP_END = new TweedDataToken() {
@Override
public boolean isMapEnd() {
return true;
}
@Override
public String toString() {
return "MAP_END";
}
};
public static TweedDataToken getNull() {
return NULL;
}
public static TweedDataToken getListStart() {
return LIST_START;
}
public static TweedDataToken asListValue(TweedDataToken delegate) {
return new DelegatingToken(delegate) {
@Override
public boolean isListValue() {
return true;
}
@Override
public String toString() {
return "LIST_VALUE[" + delegate.toString() + "]";
}
};
}
public static TweedDataToken getListEnd() {
return LIST_END;
}
public static TweedDataToken getMapStart() {
return MAP_START;
}
public static TweedDataToken asMapEntryKey(TweedDataToken delegate) {
return new DelegatingToken(delegate) {
@Override
public boolean isMapEntryKey() {
return true;
}
@Override
public String toString() {
return "MAP_ENTRY_KEY[" + delegate.toString() + "]";
}
};
}
public static TweedDataToken asMapEntryValue(TweedDataToken delegate) {
return new DelegatingToken(delegate) {
@Override
public boolean isMapEntryValue() {
return true;
}
@Override
public String toString() {
return "MAP_ENTRY_VALUE[" + delegate.toString() + "]";
}
};
}
public static TweedDataToken getMapEnd() {
return MAP_END;
}
@RequiredArgsConstructor
private static class DelegatingToken implements TweedDataToken {
private final TweedDataToken delegate;
@Override
public boolean isNull() {
return delegate.isNull();
}
@Override
public boolean canReadAsBoolean() {
return delegate.canReadAsBoolean();
}
@Override
public boolean readAsBoolean() throws TweedDataReadException {
return delegate.readAsBoolean();
}
@Override
public boolean canReadAsByte() {
return delegate.canReadAsByte();
}
@Override
public byte readAsByte() throws TweedDataReadException {
return delegate.readAsByte();
}
@Override
public boolean canReadAsShort() {
return delegate.canReadAsShort();
}
@Override
public short readAsShort() throws TweedDataReadException {
return delegate.readAsShort();
}
@Override
public boolean canReadAsInt() {
return delegate.canReadAsInt();
}
@Override
public int readAsInt() throws TweedDataReadException {
return delegate.readAsInt();
}
@Override
public boolean canReadAsLong() {
return delegate.canReadAsLong();
}
@Override
public long readAsLong() throws TweedDataReadException {
return delegate.readAsLong();
}
@Override
public boolean canReadAsFloat() {
return delegate.canReadAsFloat();
}
@Override
public float readAsFloat() throws TweedDataReadException {
return delegate.readAsFloat();
}
@Override
public boolean canReadAsDouble() {
return delegate.canReadAsDouble();
}
@Override
public double readAsDouble() throws TweedDataReadException {
return delegate.readAsDouble();
}
@Override
public boolean canReadAsString() {
return delegate.canReadAsString();
}
@Override
public String readAsString() throws TweedDataReadException {
return delegate.readAsString();
}
@Override
public boolean isListStart() {
return delegate.isListStart();
}
@Override
public boolean isListValue() {
return delegate.isListValue();
}
@Override
public boolean isListEnd() {
return delegate.isListEnd();
}
@Override
public boolean isMapStart() {
return delegate.isMapStart();
}
@Override
public boolean isMapEntryKey() {
return delegate.isMapEntryKey();
}
@Override
public boolean isMapEntryValue() {
return delegate.isMapEntryValue();
}
@Override
public boolean isMapEnd() {
return delegate.isMapEnd();
}
@Override
public String toString() {
return delegate.toString() + "(delegated)";
}
}
}

View File

@@ -0,0 +1,32 @@
package de.siphalor.tweed5.dataapi.api;
import org.jetbrains.annotations.NotNull;
public interface TweedDataVisitor {
void visitNull();
void visitBoolean(boolean value);
void visitByte(byte value);
void visitShort(short value);
void visitInt(int value);
void visitLong(long value);
void visitFloat(float value);
void visitDouble(double value);
void visitString(@NotNull String value);
default void visitEmptyList() {
visitListStart();
visitListEnd();
}
void visitListStart();
void visitListEnd();
default void visitEmptyMap() {
visitMapStart();
visitMapEnd();
}
void visitMapStart();
void visitMapEntryKey(String key);
void visitMapEnd();
void visitComment(String comment);
}

View File

@@ -0,0 +1,18 @@
package de.siphalor.tweed5.dataapi.api;
public class TweedDataWriteException extends RuntimeException {
public TweedDataWriteException() {
}
public TweedDataWriteException(String message) {
super(message);
}
public TweedDataWriteException(String message, Throwable cause) {
super(message, cause);
}
public TweedDataWriteException(Throwable cause) {
super(cause);
}
}

View File

@@ -0,0 +1,5 @@
package de.siphalor.tweed5.dataapi.api;
public interface TweedDataWriter extends TweedDataVisitor {
}

View File

@@ -0,0 +1,11 @@
package de.siphalor.tweed5.dataapi.api;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public interface TweedSerde {
TweedDataReader createReader(InputStream inputStream);
TweedDataVisitor createWriter(OutputStream outputStream) throws IOException;
String getPreferredFileExtension();
}