Skip to content

Commit ebf773a

Browse files
committed
[Enhancement #54] Ensure extended term definition is correctly created for collection-valued object property attributes.
1 parent 76982fb commit ebf773a

File tree

4 files changed

+72
-10
lines changed

4 files changed

+72
-10
lines changed

src/main/java/cz/cvut/kbss/jsonld/common/BeanClassProcessor.java

+12
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,18 @@ public static void verifyPropertiesFieldType(Field field) {
244244
}
245245
}
246246

247+
/**
248+
* Checks whether the specified class represents an individual reference and not a complex object.
249+
*
250+
* Individual references are identifiers or enum constants mapped to individuals.
251+
* @param cls Class to check
252+
* @return {@code true} when the type represents an individual, {@code false} otherwise
253+
* @see #isIdentifierType(Class)
254+
*/
255+
public static boolean isIndividualType(Class<?> cls) {
256+
return isIdentifierType(cls) || cls.isEnum();
257+
}
258+
247259
/**
248260
* Checks whether the specified type is a valid identifier type.
249261
*

src/main/java/cz/cvut/kbss/jsonld/serialization/serializer/context/ContextBuildingObjectPropertyValueSerializer.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import cz.cvut.kbss.jsonld.ConfigParam;
44
import cz.cvut.kbss.jsonld.Configuration;
55
import cz.cvut.kbss.jsonld.JsonLd;
6+
import cz.cvut.kbss.jsonld.common.BeanClassProcessor;
67
import cz.cvut.kbss.jsonld.serialization.model.JsonNode;
78
import cz.cvut.kbss.jsonld.serialization.serializer.SerializerUtils;
89
import cz.cvut.kbss.jsonld.serialization.serializer.compact.ObjectPropertyValueSerializer;
910
import cz.cvut.kbss.jsonld.serialization.traversal.ObjectGraphTraverser;
1011
import cz.cvut.kbss.jsonld.serialization.traversal.SerializationContext;
1112

13+
import java.util.Collection;
14+
1215
public class ContextBuildingObjectPropertyValueSerializer extends ObjectPropertyValueSerializer {
1316

1417
private boolean serializeUsingExtendedDefinition;
@@ -26,7 +29,7 @@ public JsonNode serialize(Object value, SerializationContext ctx) {
2629
}
2730

2831
private void registerTermDefinition(SerializationContext<?> ctx) {
29-
if (serializeUsingExtendedDefinition) {
32+
if (serializeUsingExtendedDefinition && isIndividual(ctx)) {
3033
ctx.registerTermMapping(ctx.getFieldName(),
3134
SerializerUtils.createTypedTermDefinition(ctx.getFieldName(), ctx.getTerm(),
3235
JsonLd.ID));
@@ -35,6 +38,21 @@ private void registerTermDefinition(SerializationContext<?> ctx) {
3538
}
3639
}
3740

41+
private static boolean isIndividual(SerializationContext<?> ctx) {
42+
if (BeanClassProcessor.isIndividualType(ctx.getValue().getClass())) {
43+
return true;
44+
}
45+
if (ctx.getValue() instanceof Collection) {
46+
final Collection<?> c = (Collection<?>) ctx.getValue();
47+
for (Object elem : c) {
48+
if (elem != null) {
49+
return BeanClassProcessor.isIndividualType(elem.getClass());
50+
}
51+
}
52+
}
53+
return false;
54+
}
55+
3856
@Override
3957
public void configure(Configuration config) {
4058
this.serializeUsingExtendedDefinition = config.is(ConfigParam.SERIALIZE_INDIVIDUALS_USING_EXPANDED_DEFINITION);

src/main/java/cz/cvut/kbss/jsonld/serialization/traversal/ObjectGraphTraverser.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ void traverseSingular(SerializationContext<?> ctx) {
8585
if (!shouldTraverse) {
8686
return;
8787
}
88-
if (isIndividual(ctx)) {
88+
if (BeanClassProcessor.isIndividualType(ctx.getValue().getClass())) {
8989
visitIndividual(ctx);
9090
return;
9191
}
@@ -100,10 +100,6 @@ void traverseSingular(SerializationContext<?> ctx) {
100100
closeInstance(ctx);
101101
}
102102

103-
private static boolean isIndividual(SerializationContext<?> ctx) {
104-
return BeanClassProcessor.isIdentifierType(ctx.getValue().getClass()) || ctx.getValue().getClass().isEnum();
105-
}
106-
107103
private void serializeFields(SerializationContext<?> ctx) {
108104
final Object instance = ctx.getValue();
109105
final List<Field> fieldsToSerialize =

src/test/java/cz/cvut/kbss/jsonld/serialization/serializer/context/ContextBuildingObjectPropertyValueSerializerTest.java

+40-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
import org.mockito.Mock;
1818
import org.mockito.junit.jupiter.MockitoExtension;
1919

20+
import java.net.URI;
21+
import java.util.Arrays;
22+
import java.util.HashSet;
23+
import java.util.Set;
24+
2025
import static org.mockito.Mockito.mock;
2126
import static org.mockito.Mockito.verify;
2227

@@ -42,6 +47,23 @@ void serializeRegistersTermIriMappingInJsonLdContext() throws Exception {
4247

4348
@Test
4449
void serializeRegistersExtendedTermDefinitionWithIdAndTypeInJsonLdContextWhenConfiguredToUseExtendedDefinition() throws Exception {
50+
final Configuration config = new Configuration();
51+
config.set(ConfigParam.SERIALIZE_INDIVIDUALS_USING_EXPANDED_DEFINITION, Boolean.TRUE.toString());
52+
sut.configure(config);
53+
final JsonLdContext ctx = mock(JsonLdContext.class);
54+
final URI value = Generator.generateUri();
55+
final SerializationContext<URI> serializationCtx =
56+
new SerializationContext<>(Vocabulary.ORIGIN, Organization.class.getDeclaredField("country"), value,
57+
ctx);
58+
59+
sut.serialize(value, serializationCtx);
60+
verify(ctx).registerTermMapping("country",
61+
SerializerUtils.createTypedTermDefinition("country", Vocabulary.ORIGIN,
62+
JsonLd.ID));
63+
}
64+
65+
@Test
66+
void serializeRegistersTermIriMappingInJsonLdContextWhenConfiguredToUseExtendedDefinitionWhenValueIsComplex() throws Exception {
4567
final Configuration config = new Configuration();
4668
config.set(ConfigParam.SERIALIZE_INDIVIDUALS_USING_EXPANDED_DEFINITION, Boolean.TRUE.toString());
4769
sut.configure(config);
@@ -51,9 +73,23 @@ void serializeRegistersExtendedTermDefinitionWithIdAndTypeInJsonLdContextWhenCon
5173
new SerializationContext<>(Vocabulary.IS_MEMBER_OF, Employee.getEmployerField(), value, ctx);
5274

5375
sut.serialize(value, serializationCtx);
54-
verify(ctx).registerTermMapping(Employee.getEmployerField().getName(),
55-
SerializerUtils.createTypedTermDefinition(Employee.getEmployerField().getName(),
56-
Vocabulary.IS_MEMBER_OF,
57-
JsonLd.ID));
76+
verify(ctx).registerTermMapping(Employee.getEmployerField().getName(), Vocabulary.IS_MEMBER_OF);
77+
}
78+
79+
@Test
80+
void serializeRegistersTermIriMappingInJsonLdContextWhenConfiguredToUseExtendedDefinitionWhenValueIsCollectionOfComplexObjects() throws Exception {
81+
final Configuration config = new Configuration();
82+
config.set(ConfigParam.SERIALIZE_INDIVIDUALS_USING_EXPANDED_DEFINITION, Boolean.TRUE.toString());
83+
sut.configure(config);
84+
final JsonLdContext ctx = mock(JsonLdContext.class);
85+
final Set<URI> value = new HashSet<>(Arrays.asList(Generator.generateUri(), Generator.generateUri()));
86+
final SerializationContext<Set<URI>> serializationCtx =
87+
new SerializationContext<>(Vocabulary.HAS_MEMBER, Organization.getEmployeesField(), value, ctx);
88+
89+
sut.serialize(value, serializationCtx);
90+
verify(ctx).registerTermMapping(Organization.getEmployeesField().getName(),
91+
SerializerUtils.createTypedTermDefinition(
92+
Organization.getEmployeesField().getName(), Vocabulary.HAS_MEMBER,
93+
JsonLd.ID));
5894
}
5995
}

0 commit comments

Comments
 (0)