Skip to content

Commit

Permalink
Merge branch 'master' into issue294
Browse files Browse the repository at this point in the history
  • Loading branch information
lukasj authored and jbescos committed Dec 8, 2021
2 parents 7c944b5 + f54e0ef commit 00c13c9
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 4 deletions.
50 changes: 50 additions & 0 deletions impl/src/main/java/org/eclipse/parsson/JsonNumberImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ static JsonNumber getJsonNumber(long num) {
}

static JsonNumber getJsonNumber(BigInteger value) {
if (value == null) {
throw new NullPointerException("Value is null");
}
return new JsonBigDecimalNumber(new BigDecimal(value));
}

Expand All @@ -49,9 +52,56 @@ static JsonNumber getJsonNumber(double value) {
}

static JsonNumber getJsonNumber(BigDecimal value) {
if (value == null) {
throw new NullPointerException("Value is null");
}
return new JsonBigDecimalNumber(value);
}

static JsonNumber getJsonNumber(Number value) {
if (value == null) {
throw new NullPointerException("Value is null");
}
if (value instanceof Integer) {
return getJsonNumber(value.intValue());
} else if (value instanceof Long) {
return getJsonNumber(value.longValue());
} else if (value instanceof Double) {
return getJsonNumber(value.doubleValue());
} else if (value instanceof BigInteger) {
return getJsonNumber((BigInteger) value);
} else if (value instanceof BigDecimal) {
return getJsonNumber((BigDecimal) value);
} else {
return new JsonNumberNumber(value);
}
}

private static final class JsonNumberNumber extends JsonNumberImpl {

private final Number num;
private BigDecimal bigDecimal;

JsonNumberNumber(Number num) {
this.num = num;
}

@Override
public Number numberValue() {
return num;
}

@Override
public BigDecimal bigDecimalValue() {
BigDecimal bd = bigDecimal;
if (bd == null) {
bigDecimal = bd = new BigDecimal(num.toString());
}
return bd;
}

}

// Optimized JsonNumber impl for int numbers.
private static final class JsonIntNumber extends JsonNumberImpl {
private final int num;
Expand Down
6 changes: 6 additions & 0 deletions impl/src/main/java/org/eclipse/parsson/JsonParserImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import jakarta.json.stream.JsonLocation;
import jakarta.json.stream.JsonParser;
import jakarta.json.stream.JsonParsingException;
import jakarta.json.stream.JsonParser.Event;

import org.eclipse.parsson.JsonTokenizer.JsonToken;
import org.eclipse.parsson.api.BufferPool;
Expand Down Expand Up @@ -381,6 +382,11 @@ public Event next() {
return currentEvent = currentContext.getNextEvent();
}

@Override
public Event currentEvent() {
return currentEvent;
}

@Override
public void close() {
if (!closed) {
Expand Down
6 changes: 5 additions & 1 deletion impl/src/main/java/org/eclipse/parsson/JsonProviderImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -281,10 +281,14 @@ public JsonBuilderFactory createBuilderFactory(Map<String, ?> config) {
return new JsonBuilderFactoryImpl(pool, rejectDuplicateKeys);
}

@Override
public JsonNumber createValue(Number value) {
return JsonNumberImpl.getJsonNumber(value);
}

private void addKnowProperty(Map<String, Object> providerConfig, Map<String, ?> config, String property) {
if (config.containsKey(property)) {
providerConfig.put(property, config.get(property));
}
}

static boolean isPrettyPrintingEnabled(Map<String, ?> config) {
Expand Down
63 changes: 60 additions & 3 deletions impl/src/test/java/org/eclipse/parsson/tests/JsonNumberTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,19 @@

package org.eclipse.parsson.tests;

import junit.framework.TestCase;

import jakarta.json.*;
import java.io.StringReader;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.math.BigInteger;

import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonNumber;
import jakarta.json.JsonReader;
import jakarta.json.JsonValue;
import jakarta.json.JsonWriter;
import junit.framework.TestCase;

/**
* @author Jitendra Kotamraju
*/
Expand Down Expand Up @@ -216,4 +221,56 @@ public void testHashCode() {
assertTrue(jsonNumber1.hashCode() == jsonNumber2.hashCode());
}

public void testNumber() {
assertEquals(Json.createValue(1), Json.createValue(Byte.valueOf((byte) 1)));
assertEquals(Json.createValue(1).toString(), Json.createValue(Byte.valueOf((byte) 1)).toString());
assertEquals(Json.createValue(1), Json.createValue(Short.valueOf((short) 1)));
assertEquals(Json.createValue(1).toString(), Json.createValue(Short.valueOf((short) 1)).toString());
assertEquals(Json.createValue(1), Json.createValue(Integer.valueOf(1)));
assertEquals(Json.createValue(1).toString(), Json.createValue(Integer.valueOf(1)).toString());
assertEquals(Json.createValue(1L), Json.createValue(Long.valueOf(1)));
assertEquals(Json.createValue(1L).toString(), Json.createValue(Long.valueOf(1)).toString());
assertEquals(Json.createValue(1D), Json.createValue(Float.valueOf(1)));
assertEquals(Json.createValue(1D).toString(), Json.createValue(Float.valueOf(1)).toString());
assertEquals(Json.createValue(1D), Json.createValue(Double.valueOf(1)));
assertEquals(Json.createValue(1D).toString(), Json.createValue(Double.valueOf(1)).toString());
assertEquals(Json.createValue(1), Json.createValue(new CustomNumber(1)));
assertEquals(Json.createValue(1).toString(), Json.createValue(new CustomNumber(1)).toString());
}

private static class CustomNumber extends Number {

private static final long serialVersionUID = 1L;
private final int num;

private CustomNumber(int num) {
this.num = num;
}

@Override
public int intValue() {
return num;
}

@Override
public long longValue() {
return num;
}

@Override
public float floatValue() {
return num;
}

@Override
public double doubleValue() {
return num;
}

@Override
public String toString() {
return Integer.toString(num);
}

}
}

0 comments on commit 00c13c9

Please sign in to comment.