Initial commit
That's a lotta stuff for an initial commit, but well...
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package de.siphalor.tweed5.dataapi.api;
|
||||
|
||||
public interface TweedDataReader {
|
||||
TweedDataToken peekToken() throws TweedDataReadException;
|
||||
TweedDataToken readToken() throws TweedDataReadException;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package de.siphalor.tweed5.dataapi.api;
|
||||
|
||||
public enum TweedDataReaderRecoverMode {
|
||||
SKIP,
|
||||
REPEAT,
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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)";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package de.siphalor.tweed5.dataapi.api;
|
||||
|
||||
public interface TweedDataWriter extends TweedDataVisitor {
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user