Skip to content

Commit

Permalink
ReusableJsonParser introduced
Browse files Browse the repository at this point in the history
Signed-off-by: David Kral <[email protected]>
  • Loading branch information
Verdent committed Jan 23, 2025
1 parent c461720 commit 92ed356
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,32 @@

import java.io.ByteArrayOutputStream;
import java.lang.reflect.Type;
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.ReentrantLock;

import io.helidon.common.GenericType;
import io.helidon.json.processor.Generator;
import io.helidon.json.processor.JsonParser;
import io.helidon.json.processor.ReusableJsonParser;

final class JsonBindingImpl implements JsonBinding, JsonBindingConfigurer {

static final JsonBinding DEFAULT_INSTANCE = JsonBinding.builder().build();
private static final JsonParser JSON_PARSER = JsonParser.createParser("");
private static final ReusableJsonParser JSON_PARSER = (ReusableJsonParser) JsonParser.createParser("");

// private static final Queue<JsonParser> PARSERS = new ArrayDeque<>();
// private static final Queue<JsonParser> PARSERS = new ArrayBlockingQueue<>(1);
private static final Queue<JsonParser> PARSERS = new ConcurrentLinkedQueue<>();
private static final Queue<ReusableJsonParser> PARSERS = new ConcurrentLinkedQueue<>();
static {
PARSERS.add(JSON_PARSER);
}
private static final ReentrantLock LOCK = new ReentrantLock();

private final ThreadLocal<JsonParser> parsers = new ThreadLocal<>();
private final ThreadLocal<ReusableJsonParser> parsers = new ThreadLocal<>();

private final JsonBindingConfig config;
private final Map<Class<?>, JsonSerializer<?>> identitySerializers = new IdentityHashMap<>();
Expand Down Expand Up @@ -128,14 +127,14 @@ public <T> String toJson(T obj, GenericType<T> type) {
@Override
public <T> T fromJson(String jsonStr, Class<T> type) {
JsonDeserializer<T> deserializer = getFinishedDeserializer(type);
JsonParser parser;
ReusableJsonParser parser;
boolean isVirtual = Thread.currentThread().isVirtual();
if (isVirtual) {
parser = JsonParser.createParser(jsonStr);
parser = (ReusableJsonParser) JsonParser.createParser(jsonStr);
} else {
parser = this.parsers.get();
if (parser == null) {
parser = JsonParser.createParser(jsonStr);
parser = (ReusableJsonParser) JsonParser.createParser(jsonStr);
} else {
this.parsers.set(null);
parser.reset(jsonStr.getBytes());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ static JsonParser createParser(String json) {
// return new StreamJsonParser(new ByteArrayInputStream(json.getBytes()));
}

void reset(byte[] buffer);

byte readNextByte();
byte nextToken();
byte lastByte();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
/**
* TODO javadoc
*/
final class JsonParserImpl implements JsonParser {
final class JsonParserImpl implements ReusableJsonParser {

//We need this to check if the next number digit overflows int max capacity
private static final int INT_SIZE_BORDER = Integer.MAX_VALUE / 10;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.helidon.json.processor;

public sealed interface ReusableJsonParser extends JsonParser permits JsonParserImpl{

void reset(byte[] buffer);

}

0 comments on commit 92ed356

Please sign in to comment.