Skip to content

Commit

Permalink
refactor JsonSpliterator into non-static inner class
Browse files Browse the repository at this point in the history
  • Loading branch information
esaulpaugh committed Feb 10, 2025
1 parent afbc83d commit cf1270f
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 24 deletions.
16 changes: 11 additions & 5 deletions src/main/java/com/esaulpaugh/headlong/abi/ABIJSON.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,14 @@ public static List<ContractError<Tuple>> parseErrors(String arrayJson) {
}

public static <T extends ABIObject> List<T> parseElements(int flags, String arrayJson, Set<TypeEnum> types) {
return parseArray(reader(arrayJson), types, flags);
return parseArray(reader(arrayJson), types, flags, requiresDigest(types) ? Function.newDefaultDigest() : null);
}

static boolean requiresDigest(Set<TypeEnum> types) {
return types.contains(TypeEnum.FUNCTION)
|| types.contains(TypeEnum.CONSTRUCTOR)
|| types.contains(TypeEnum.RECEIVE)
|| types.contains(TypeEnum.FALLBACK);
}

/**
Expand All @@ -112,7 +119,7 @@ public static <T extends ABIObject> List<T> parseABIField(int flags, String obje
reader.beginObject();
while (reader.peek() != JsonToken.END_OBJECT) {
if ("abi".equals(reader.nextName())) {
return parseArray(reader, types, flags);
return parseArray(reader, types, flags, requiresDigest(types) ? Function.newDefaultDigest() : null);
}
reader.skipValue();
}
Expand All @@ -134,19 +141,18 @@ public static String optimize(String json) {
if (token == JsonToken.BEGIN_OBJECT) {
return toJson(ABIObject.fromJson(json), false, true);
} else if (token == JsonToken.BEGIN_ARRAY) {
return toMinifiedJsonArray(parseArray(reader, ABIJSON.ALL, ABIType.FLAGS_NONE));
return toMinifiedJsonArray(parseArray(reader, ABIJSON.ALL, ABIType.FLAGS_NONE, Function.newDefaultDigest()));
}
throw new IllegalArgumentException("unexpected token: " + token);
} catch (IOException io) {
throw new IllegalStateException(io);
}
}
//----------------------------------------------------------------------------------------------------------------------
static <T extends ABIObject> List<T> parseArray(final JsonReader reader, Set<TypeEnum> types, int flags) {
static <T extends ABIObject> List<T> parseArray(final JsonReader reader, Set<TypeEnum> types, int flags, MessageDigest digest) {
final List<T> list = new ArrayList<>();
try (JsonReader ignored = reader) {
reader.beginArray();
final MessageDigest digest = Function.newDefaultDigest();
while (reader.peek() != JsonToken.END_ARRAY) {
T e = tryParseStreaming(reader, types, digest, flags);
if (e != null) {
Expand Down
38 changes: 20 additions & 18 deletions src/main/java/com/esaulpaugh/headlong/abi/ABIParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public final class ABIParser {

private final int flags;
private final Set<TypeEnum> types;
private final boolean requiresDigest;

public ABIParser() {
this(ABIType.FLAGS_NONE, ABIJSON.ALL);
Expand All @@ -62,49 +63,50 @@ public ABIParser(int flags, Set<TypeEnum> types) {
}
this.flags = flags;
this.types = EnumSet.copyOf(types);
this.requiresDigest = ABIJSON.requiresDigest(this.types);
}

public <T extends ABIObject> List<T> parse(String arrayJson) {
return ABIJSON.parseArray(reader(arrayJson), types, flags);
return parse(reader(arrayJson));
}

public <T extends ABIObject> List<T> parse(InputStream arrayStream) {
return ABIJSON.parseArray(reader(arrayStream), types, flags);
return parse(reader(arrayStream));
}

private <T extends ABIObject> List<T> parse(JsonReader reader) {
return ABIJSON.parseArray(reader, types, flags, requiresDigest ? Function.newDefaultDigest() : null);
}

public <T extends ABIObject> Stream<T> stream(String arrayJson) {
return stream(reader(arrayJson), types, flags);
return stream(reader(arrayJson));
}

public <T extends ABIObject> Stream<T> stream(InputStream arrayStream) {
return stream(reader(arrayStream), types, flags);
return stream(reader(arrayStream));
}

private static <T extends ABIObject> Stream<T> stream(JsonReader reader, Set<TypeEnum> types, int flags) {
final JsonSpliterator<T> spliterator = new JsonSpliterator<>(reader, types, flags); // For single-threaded use only
private <T extends ABIObject> Stream<T> stream(JsonReader reader) {
final JsonSpliterator<T> spliterator = new JsonSpliterator<>(reader); // sequential (non-parallel)
return StreamSupport.stream(spliterator, false)
.onClose(spliterator::close);
}

private static final class JsonSpliterator<T extends ABIObject> extends Spliterators.AbstractSpliterator<T> implements Closeable {
private final class JsonSpliterator<T extends ABIObject> extends Spliterators.AbstractSpliterator<T> implements Closeable {

private final JsonReader jsonReader;
private final Set<TypeEnum> types;
private final MessageDigest digest;
private final int flags;
boolean closed = false;
private final MessageDigest digest = requiresDigest ? Function.newDefaultDigest() : null;

private boolean closed = false;

JsonSpliterator(JsonReader reader, Set<TypeEnum> types, int flags) {
super(Long.SIZE, ORDERED | NONNULL);
JsonSpliterator(final JsonReader reader) {
super(0, ORDERED | NONNULL);
this.jsonReader = reader;
try {
reader.beginArray();
this.jsonReader.beginArray();
} catch (IOException io) {
throw new IllegalStateException(io);
}
this.jsonReader = reader;
this.types = types;
this.digest = Function.newDefaultDigest();
this.flags = flags;
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/esaulpaugh/headlong/abi/TypeEnum.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ public static TypeEnum parse(final String typeString) {
return FUNCTION;
}
if (ABIJSON.EVENT.equals(typeString)) return EVENT;
if (ABIJSON.CONSTRUCTOR.equals(typeString)) return CONSTRUCTOR;
if (ABIJSON.ERROR.equals(typeString)) return ERROR;
if (ABIJSON.RECEIVE.equals(typeString)) return RECEIVE;
if (ABIJSON.FALLBACK.equals(typeString)) return FALLBACK;
if (ABIJSON.CONSTRUCTOR.equals(typeString)) return CONSTRUCTOR;
throw unexpectedType(typeString);
}

Expand Down

0 comments on commit cf1270f

Please sign in to comment.