Skip to content

Commit 0399389

Browse files
committed
[Enhancement #37] Start migration to Jakarta JSON API.
This API is used by Titanium JSON-LD.
1 parent 419c84c commit 0399389

16 files changed

+70
-41
lines changed

pom.xml

+12
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
<artifactId>jopa-api</artifactId>
3434
<version>${cz.cvut.kbss.jopa.version}</version>
3535
</dependency>
36+
<dependency>
37+
<groupId>org.glassfish</groupId>
38+
<artifactId>jakarta.json</artifactId>
39+
<version>2.0.1</version>
40+
</dependency>
3641

3742
<!-- Test dependencies -->
3843
<dependency>
@@ -72,12 +77,19 @@
7277
<scope>test</scope>
7378
</dependency>
7479
<!-- JSON-LD Java implementation -->
80+
<!-- TODO To remove -->
7581
<dependency>
7682
<groupId>com.github.jsonld-java</groupId>
7783
<artifactId>jsonld-java</artifactId>
7884
<version>${com.github.jsonld-java.version}</version>
7985
<scope>test</scope>
8086
</dependency>
87+
<dependency>
88+
<groupId>com.apicatalog</groupId>
89+
<artifactId>titanium-json-ld</artifactId>
90+
<version>1.3.2</version>
91+
<scope>test</scope>
92+
</dependency>
8193
<dependency>
8294
<groupId>ch.qos.logback</groupId>
8395
<artifactId>logback-classic</artifactId>

src/main/java/cz/cvut/kbss/jsonld/deserialization/JsonLdDeserializer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import cz.cvut.kbss.jsonld.deserialization.util.TargetClassResolver;
2525
import cz.cvut.kbss.jsonld.deserialization.util.TargetClassResolverConfig;
2626
import cz.cvut.kbss.jsonld.deserialization.util.TypeMap;
27+
import jakarta.json.JsonValue;
2728

2829
import java.util.Objects;
2930

@@ -92,7 +93,7 @@ public <T> void registerDeserializer(Class<T> type, ValueDeserializer<T> deseria
9293
* @param resultClass Type of the result instance
9394
* @return Deserialized Java instance
9495
*/
95-
public abstract <T> T deserialize(Object jsonLd, Class<T> resultClass);
96+
public abstract <T> T deserialize(JsonValue jsonLd, Class<T> resultClass);
9697

9798
/**
9899
* Creates deserializer for expanded JSON-LD, initialized with the specified configuration.

src/main/java/cz/cvut/kbss/jsonld/deserialization/ValueDeserializer.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import cz.cvut.kbss.jsonld.Configuration;
44
import cz.cvut.kbss.jsonld.common.Configurable;
5-
6-
import java.util.Map;
5+
import jakarta.json.JsonValue;
76

87
/**
98
* Deserializes JSON-LD nodes to Java objects.
@@ -19,7 +18,7 @@ public interface ValueDeserializer<T> extends Configurable {
1918
* @param ctx Deserialization context
2019
* @return Deserialized object
2120
*/
22-
T deserialize(Map<?, ?> jsonNode, DeserializationContext<T> ctx);
21+
T deserialize(JsonValue jsonNode, DeserializationContext<T> ctx);
2322

2423
/**
2524
* Applies the specified configuration to this deserializer.

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/DateDeserializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import cz.cvut.kbss.jsonld.Configuration;
44
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
55
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
6+
import jakarta.json.JsonValue;
67

78
import java.time.OffsetDateTime;
89
import java.util.Date;
9-
import java.util.Map;
1010

1111
/**
1212
* Deserializes values to {@link Date}.
@@ -20,7 +20,7 @@ public DateDeserializer(OffsetDateTimeDeserializer innerDeserializer) {
2020
}
2121

2222
@Override
23-
public Date deserialize(Map<?, ?> jsonNode, DeserializationContext<Date> ctx) {
23+
public Date deserialize(JsonValue jsonNode, DeserializationContext<Date> ctx) {
2424
return Date.from(innerDeserializer.deserialize(jsonNode,
2525
new DeserializationContext<>(OffsetDateTime.class, ctx.getClassResolver())).toInstant());
2626
}

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/DurationDeserializer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
44
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
55
import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
6+
import jakarta.json.JsonObject;
7+
import jakarta.json.JsonValue;
68

79
import java.time.Duration;
8-
import java.util.Map;
910

1011
import static cz.cvut.kbss.jsonld.deserialization.datetime.OffsetDateTimeDeserializer.getLiteralValue;
1112

@@ -17,7 +18,7 @@
1718
public class DurationDeserializer implements ValueDeserializer<Duration> {
1819

1920
@Override
20-
public Duration deserialize(Map<?, ?> jsonNode, DeserializationContext<Duration> ctx) {
21+
public Duration deserialize(JsonValue jsonNode, DeserializationContext<Duration> ctx) {
2122
final Object value = getLiteralValue(jsonNode);
2223
try {
2324
return Duration.parse(value.toString());

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/EpochBasedDateTimeResolver.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import cz.cvut.kbss.jopa.datatype.DateTimeUtil;
44
import cz.cvut.kbss.jsonld.common.Configurable;
5+
import jakarta.json.JsonNumber;
56

67
import java.time.Instant;
78
import java.time.OffsetDateTime;
@@ -11,8 +12,8 @@
1112
*/
1213
class EpochBasedDateTimeResolver implements Configurable {
1314

14-
OffsetDateTime resolve(Long value) {
15+
OffsetDateTime resolve(JsonNumber value) {
1516
assert value != null;
16-
return DateTimeUtil.toDateTime(Instant.ofEpochMilli(value));
17+
return DateTimeUtil.toDateTime(Instant.ofEpochMilli(value.longValue()));
1718
}
1819
}

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/InstantDeserializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import cz.cvut.kbss.jsonld.Configuration;
44
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
55
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
6+
import jakarta.json.JsonValue;
67

78
import java.time.Instant;
89
import java.time.OffsetDateTime;
9-
import java.util.Map;
1010

1111
/**
1212
* Deserializes values to {@link Instant}.
@@ -20,7 +20,7 @@ public InstantDeserializer(OffsetDateTimeDeserializer innerDeserializer) {
2020
}
2121

2222
@Override
23-
public Instant deserialize(Map<?, ?> jsonNode, DeserializationContext<Instant> ctx) {
23+
public Instant deserialize(JsonValue jsonNode, DeserializationContext<Instant> ctx) {
2424
return innerDeserializer.deserialize(jsonNode,
2525
new DeserializationContext<>(OffsetDateTime.class, ctx.getClassResolver()))
2626
.toInstant();

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/LocalDateDeserializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
55
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
66
import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
7+
import jakarta.json.JsonValue;
78

89
import java.time.LocalDate;
9-
import java.util.Map;
1010

1111
import static cz.cvut.kbss.jsonld.deserialization.datetime.OffsetDateTimeDeserializer.getLiteralValue;
1212

@@ -18,7 +18,7 @@
1818
public class LocalDateDeserializer implements ValueDeserializer<LocalDate> {
1919

2020
@Override
21-
public LocalDate deserialize(Map<?, ?> jsonNode, DeserializationContext<LocalDate> ctx) {
21+
public LocalDate deserialize(JsonValue jsonNode, DeserializationContext<LocalDate> ctx) {
2222
final Object value = getLiteralValue(jsonNode);
2323
try {
2424
return XsdDateMapper.map(value.toString());

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/LocalDateTimeDeserializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import cz.cvut.kbss.jsonld.Configuration;
44
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
55
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
6+
import jakarta.json.JsonValue;
67

78
import java.time.LocalDateTime;
89
import java.time.OffsetDateTime;
9-
import java.util.Map;
1010

1111
/**
1212
* Deserializes values to {@link LocalDateTime}.
@@ -20,7 +20,7 @@ public LocalDateTimeDeserializer(OffsetDateTimeDeserializer innerDeserializer) {
2020
}
2121

2222
@Override
23-
public LocalDateTime deserialize(Map<?, ?> jsonNode, DeserializationContext<LocalDateTime> ctx) {
23+
public LocalDateTime deserialize(JsonValue jsonNode, DeserializationContext<LocalDateTime> ctx) {
2424
return innerDeserializer.deserialize(jsonNode, new DeserializationContext<>(OffsetDateTime.class, ctx.getClassResolver())).
2525
toLocalDateTime();
2626
}

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/LocalTimeDeserializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
44
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
5+
import jakarta.json.JsonValue;
56

67
import java.time.LocalTime;
78
import java.time.OffsetTime;
8-
import java.util.Map;
99

1010
/**
1111
* Deserializes values to {@link LocalTime}.
@@ -21,7 +21,7 @@ public LocalTimeDeserializer(OffsetTimeDeserializer innerDeserializer) {
2121
}
2222

2323
@Override
24-
public LocalTime deserialize(Map<?, ?> jsonNode, DeserializationContext<LocalTime> ctx) {
24+
public LocalTime deserialize(JsonValue jsonNode, DeserializationContext<LocalTime> ctx) {
2525
return innerDeserializer.deserialize(jsonNode,
2626
new DeserializationContext<>(OffsetTime.class, ctx.getClassResolver())).toLocalTime();
2727
}

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/OffsetDateTimeDeserializer.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
66
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
77
import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
8+
import jakarta.json.JsonNumber;
9+
import jakarta.json.JsonValue;
810

911
import java.time.OffsetDateTime;
10-
import java.util.Map;
1112

1213
/**
1314
* Deserializes values to {@link OffsetDateTime}.
@@ -25,23 +26,22 @@ public class OffsetDateTimeDeserializer implements ValueDeserializer<OffsetDateT
2526
private final EpochBasedDateTimeResolver epochResolver = new EpochBasedDateTimeResolver();
2627

2728
@Override
28-
public OffsetDateTime deserialize(Map<?, ?> jsonNode, DeserializationContext<OffsetDateTime> ctx) {
29-
final Object value = getLiteralValue(jsonNode);
29+
public OffsetDateTime deserialize(JsonValue jsonNode, DeserializationContext<OffsetDateTime> ctx) {
30+
final JsonValue value = getLiteralValue(jsonNode);
3031
try {
31-
return value instanceof Long ? epochResolver.resolve((Long) value) :
32+
return value.getValueType() == JsonValue.ValueType.NUMBER ? epochResolver.resolve((JsonNumber) value) :
3233
stringResolver.resolve(value.toString());
3334
} catch (RuntimeException e) {
3435
throw new JsonLdDeserializationException("Unable to deserialize datetime value.", e);
3536
}
3637
}
3738

38-
static Object getLiteralValue(Map<?, ?> jsonNode) {
39-
final Object value = jsonNode.get(JsonLd.VALUE);
40-
if (value == null) {
39+
static JsonValue getLiteralValue(JsonValue jsonNode) {
40+
if (jsonNode.getValueType() != JsonValue.ValueType.OBJECT || !jsonNode.asJsonObject().containsKey(JsonLd.VALUE)) {
4141
throw new JsonLdDeserializationException("Cannot deserialize node " + jsonNode + "as literal. " +
4242
"It is missing attribute '" + JsonLd.VALUE + "'.");
4343
}
44-
return value;
44+
return jsonNode.asJsonObject().get(JsonLd.VALUE);
4545
}
4646

4747
@Override

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/OffsetTimeDeserializer.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
55
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
66
import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
7+
import jakarta.json.JsonValue;
78

89
import java.time.OffsetTime;
9-
import java.util.Map;
1010

1111
import static cz.cvut.kbss.jsonld.deserialization.datetime.OffsetDateTimeDeserializer.getLiteralValue;
1212

@@ -18,8 +18,8 @@
1818
public class OffsetTimeDeserializer implements ValueDeserializer<OffsetTime> {
1919

2020
@Override
21-
public OffsetTime deserialize(Map<?, ?> jsonNode, DeserializationContext<OffsetTime> ctx) {
22-
final Object value = getLiteralValue(jsonNode);
21+
public OffsetTime deserialize(JsonValue jsonNode, DeserializationContext<OffsetTime> ctx) {
22+
final JsonValue value = getLiteralValue(jsonNode);
2323
try {
2424
return XsdTimeMapper.map(value.toString());
2525
} catch (RuntimeException e) {

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/PeriodDeserializer.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
44
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
55
import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
6+
import jakarta.json.JsonValue;
67

78
import java.time.Period;
8-
import java.util.Map;
99

1010
import static cz.cvut.kbss.jsonld.deserialization.datetime.OffsetDateTimeDeserializer.getLiteralValue;
1111

@@ -17,8 +17,8 @@
1717
public class PeriodDeserializer implements ValueDeserializer<Period> {
1818

1919
@Override
20-
public Period deserialize(Map<?, ?> jsonNode, DeserializationContext<Period> ctx) {
21-
final Object value = getLiteralValue(jsonNode);
20+
public Period deserialize(JsonValue jsonNode, DeserializationContext<Period> ctx) {
21+
final JsonValue value = getLiteralValue(jsonNode);
2222
try {
2323
return Period.parse(value.toString());
2424
} catch (RuntimeException e) {

src/main/java/cz/cvut/kbss/jsonld/deserialization/datetime/ZonedDateTimeDeserializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import cz.cvut.kbss.jsonld.Configuration;
44
import cz.cvut.kbss.jsonld.deserialization.DeserializationContext;
55
import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer;
6+
import jakarta.json.JsonValue;
67

78
import java.time.OffsetDateTime;
89
import java.time.ZonedDateTime;
9-
import java.util.Map;
1010

1111
/**
1212
* Deserializes values to {@link ZonedDateTime}.
@@ -20,7 +20,7 @@ public ZonedDateTimeDeserializer(OffsetDateTimeDeserializer innerDeserializer) {
2020
}
2121

2222
@Override
23-
public ZonedDateTime deserialize(Map<?, ?> jsonNode, DeserializationContext<ZonedDateTime> ctx) {
23+
public ZonedDateTime deserialize(JsonValue jsonNode, DeserializationContext<ZonedDateTime> ctx) {
2424
return innerDeserializer.deserialize(jsonNode, new DeserializationContext<>(OffsetDateTime.class, ctx.getClassResolver()))
2525
.toZonedDateTime();
2626
}

src/main/java/cz/cvut/kbss/jsonld/deserialization/expanded/ExpandedJsonLdDeserializer.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
import cz.cvut.kbss.jsonld.deserialization.JsonLdDeserializer;
2222
import cz.cvut.kbss.jsonld.deserialization.reference.PendingReferenceRegistry;
2323
import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
24-
25-
import java.util.List;
26-
import java.util.Map;
24+
import jakarta.json.JsonArray;
25+
import jakarta.json.JsonObject;
26+
import jakarta.json.JsonValue;
2727

2828
public class ExpandedJsonLdDeserializer extends JsonLdDeserializer {
2929

@@ -35,18 +35,18 @@ public ExpandedJsonLdDeserializer(Configuration configuration) {
3535
}
3636

3737
@Override
38-
public <T> T deserialize(Object jsonLd, Class<T> resultClass) {
39-
if (!(jsonLd instanceof List)) {
38+
public <T> T deserialize(JsonValue jsonLd, Class<T> resultClass) {
39+
if (jsonLd.getValueType() != JsonValue.ValueType.ARRAY) {
4040
throw new JsonLdDeserializationException(
4141
"Expanded JSON-LD deserializer requires a JSON-LD array as input.");
4242
}
43-
final List<?> input = (List<?>) jsonLd;
43+
final JsonArray input = jsonLd.asJsonArray();
4444
if (input.size() != 1) {
4545
throw new JsonLdDeserializationException(
4646
"Input is not expanded JSON-LD. The input does not contain exactly one root element.");
4747
}
4848
deserializers.configure(configuration());
49-
final Map<?, ?> root = (Map<?, ?>) input.get(0);
49+
final JsonObject root = input.getJsonObject(0);
5050
final PendingReferenceRegistry referenceRegistry = new PendingReferenceRegistry();
5151
if (deserializers.hasCustomDeserializer(resultClass)) {
5252
final DeserializationContext<T> ctx = new DeserializationContext<>(resultClass, classResolver);

src/test/java/cz/cvut/kbss/jsonld/deserialization/expanded/ExpandedJsonLdDeserializerTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
*/
1313
package cz.cvut.kbss.jsonld.deserialization.expanded;
1414

15+
import com.apicatalog.jsonld.api.ExpansionApi;
16+
import com.apicatalog.jsonld.document.Document;
17+
import com.apicatalog.jsonld.document.JsonDocument;
1518
import com.github.jsonldjava.core.JsonLdProcessor;
1619
import com.github.jsonldjava.utils.JsonUtils;
1720
import cz.cvut.kbss.jopa.model.annotations.Properties;
@@ -26,9 +29,11 @@
2629
import cz.cvut.kbss.jsonld.environment.Vocabulary;
2730
import cz.cvut.kbss.jsonld.environment.model.*;
2831
import cz.cvut.kbss.jsonld.exception.*;
32+
import jakarta.json.JsonArray;
2933
import org.junit.jupiter.api.BeforeEach;
3034
import org.junit.jupiter.api.Test;
3135

36+
import java.io.InputStream;
3237
import java.net.URI;
3338
import java.util.*;
3439

@@ -802,4 +807,14 @@ void deserializeSupportsMappingIndividualToEnumConstant() throws Exception {
802807
assertThat(result.getPluralPropertyType(),
803808
hasItems(OwlPropertyType.ANNOTATION_PROPERTY, OwlPropertyType.OBJECT_PROPERTY));
804809
}
810+
811+
@Test
812+
void testReadingJsonLdWithTitanium() throws Exception {
813+
final InputStream is = TestUtil.class.getClassLoader().getResourceAsStream("objectWithDataProperties.json");
814+
assert is != null;
815+
final Document doc = JsonDocument.of(is);
816+
com.apicatalog.jsonld.JsonLd.compact(doc, null).get();
817+
final JsonArray expanded = com.apicatalog.jsonld.JsonLd.expand(doc).get();
818+
819+
}
805820
}

0 commit comments

Comments
 (0)