Skip to content

Commit ab7cfe6

Browse files
committed
Adds Legacy Compatibility
1 parent 2db0077 commit ab7cfe6

2 files changed

Lines changed: 81 additions & 5 deletions

File tree

basyx.submodelregistry/basyx.submodelregistry-service-mongodb-storage/src/main/java/org/eclipse/digitaltwin/basyx/submodelregistry/service/storage/mongodb/MongoDbSubmodelRegistryStorage.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.Set;
3131
import java.util.stream.Collectors;
3232

33+
import org.bson.Document;
3334
import org.eclipse.digitaltwin.basyx.core.pagination.CursorResult;
3435
import org.eclipse.digitaltwin.basyx.core.pagination.PaginationInfo;
3536
import org.eclipse.digitaltwin.basyx.submodelregistry.model.SubmodelDescriptor;
@@ -58,6 +59,8 @@ public class MongoDbSubmodelRegistryStorage implements SubmodelRegistryStorage {
5859

5960
// mongodb maps all id fields internally to _id
6061
private static final String ID = "_id";
62+
private static final String SUPPLEMENTAL_SEMANTIC_ID = "supplementalSemanticId";
63+
private static final String SUPPLEMENTAL_SEMANTIC_IDS = "supplementalSemanticIds";
6164

6265
private final MongoTemplate template;
6366

@@ -68,8 +71,8 @@ public CursorResult<List<SubmodelDescriptor>> getAllSubmodelDescriptors(@NonNull
6871
List<AggregationOperation> allAggregations = new LinkedList<>();
6972
applySorting(allAggregations);
7073
applyPagination(pRequest, allAggregations);
71-
AggregationResults<SubmodelDescriptor> results = template.aggregate(Aggregation.newAggregation(allAggregations), collectionName, SubmodelDescriptor.class);
72-
List<SubmodelDescriptor> foundDescriptors = results.getMappedResults();
74+
AggregationResults<Document> results = template.aggregate(Aggregation.newAggregation(allAggregations), collectionName, Document.class);
75+
List<SubmodelDescriptor> foundDescriptors = results.getMappedResults().stream().map(this::toSubmodelDescriptor).collect(Collectors.toList());
7376
String cursor = resolveCursor(pRequest, foundDescriptors);
7477
return new CursorResult<List<SubmodelDescriptor>>(cursor, foundDescriptors);
7578
}
@@ -84,11 +87,11 @@ public Set<String> clear() {
8487

8588
@Override
8689
public SubmodelDescriptor getSubmodelDescriptor(@NonNull String submodelId) throws SubmodelNotFoundException {
87-
SubmodelDescriptor descriptor = template.findById(submodelId, SubmodelDescriptor.class, collectionName);
88-
if (descriptor == null) {
90+
Document foundDescriptor = template.findById(submodelId, Document.class, collectionName);
91+
if (foundDescriptor == null) {
8992
throw new SubmodelNotFoundException(submodelId);
9093
}
91-
return descriptor;
94+
return toSubmodelDescriptor(foundDescriptor);
9295
}
9396

9497
@Override
@@ -142,6 +145,20 @@ private void applySorting(List<AggregationOperation> allAggregations) {
142145
allAggregations.add(sortOp);
143146
}
144147

148+
private SubmodelDescriptor toSubmodelDescriptor(Document descriptorDocument) {
149+
Document compatibleDocument = ensureLegacyFieldCompatibility(descriptorDocument);
150+
return template.getConverter().read(SubmodelDescriptor.class, compatibleDocument);
151+
}
152+
153+
private Document ensureLegacyFieldCompatibility(Document descriptorDocument) {
154+
if (descriptorDocument.containsKey(SUPPLEMENTAL_SEMANTIC_IDS) || !descriptorDocument.containsKey(SUPPLEMENTAL_SEMANTIC_ID)) {
155+
return descriptorDocument;
156+
}
157+
Document compatibleDocument = new Document(descriptorDocument);
158+
compatibleDocument.put(SUPPLEMENTAL_SEMANTIC_IDS, descriptorDocument.get(SUPPLEMENTAL_SEMANTIC_ID));
159+
return compatibleDocument;
160+
}
161+
145162
private String resolveCursor(PaginationInfo pRequest, List<SubmodelDescriptor> foundDescriptors) {
146163
if (foundDescriptors.isEmpty() || !pRequest.isPaged()) {
147164
return null;

basyx.submodelregistry/basyx.submodelregistry-service-mongodb-storage/src/test/java/org/eclipse/digitaltwin/basyx/submodelregistry/service/tests/MongoDbSubmodelRegistryStorageTest.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,20 @@
2626

2727
import static org.assertj.core.api.Assertions.assertThat;
2828

29+
import java.util.Arrays;
30+
import java.util.List;
31+
2932
import org.bson.Document;
33+
import org.eclipse.digitaltwin.basyx.core.pagination.CursorResult;
34+
import org.eclipse.digitaltwin.basyx.core.pagination.PaginationInfo;
35+
import org.eclipse.digitaltwin.basyx.submodelregistry.model.SubmodelDescriptor;
36+
import org.eclipse.digitaltwin.basyx.submodelregistry.service.configuration.MongoDbConfiguration;
37+
import org.eclipse.digitaltwin.basyx.submodelregistry.service.storage.SubmodelRegistryStorage;
3038
import org.junit.Test;
3139
import org.springframework.beans.factory.annotation.Autowired;
3240
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3341
import org.springframework.data.mongodb.core.MongoTemplate;
42+
import org.springframework.data.mongodb.core.query.Query;
3443
import org.springframework.test.context.ContextConfiguration;
3544
import org.springframework.test.context.TestPropertySource;
3645

@@ -47,10 +56,60 @@ public class MongoDbSubmodelRegistryStorageTest extends SubmodelRegistryStorageT
4756
@Autowired
4857
private MongoTemplate template;
4958

59+
@Autowired
60+
private SubmodelRegistryStorage storage;
61+
62+
@Autowired
63+
private MongoDbConfiguration configuration;
64+
5065
@Test
5166
public void whenGetById_NotAllDocumentsScannedButIndexUsed() {
5267
MongoCollection<Document> collection = template.getCollection("submodeldescriptors");
5368
Document doc = collection.find(new Document("_id", "11")).explain(ExplainVerbosity.QUERY_PLANNER);
5469
assertThat(doc.toJson()).doesNotContain("\"COLLSCAN\"");
5570
}
71+
72+
@Test
73+
public void givenLegacySupplementalSemanticId_whenGetById_thenDescriptorContainsSupplementalSemanticField() {
74+
template.remove(new Query(), configuration.collectionName);
75+
template.save(createLegacyDocument("legacy-get-1"), configuration.collectionName);
76+
77+
SubmodelDescriptor descriptor = storage.getSubmodelDescriptor("legacy-get-1");
78+
Document writtenDescriptor = new Document();
79+
template.getConverter().write(descriptor, writtenDescriptor);
80+
81+
assertThat(extractSupplementalSemanticField(writtenDescriptor)).isNotNull();
82+
assertThat(extractSupplementalSemanticField(writtenDescriptor)).isInstanceOf(List.class);
83+
assertThat((List<?>) extractSupplementalSemanticField(writtenDescriptor)).hasSize(1);
84+
}
85+
86+
@Test
87+
public void givenLegacySupplementalSemanticId_whenGetAll_thenDescriptorContainsSupplementalSemanticField() {
88+
template.remove(new Query(), configuration.collectionName);
89+
template.save(createLegacyDocument("legacy-getall-1"), configuration.collectionName);
90+
91+
CursorResult<List<SubmodelDescriptor>> result = storage.getAllSubmodelDescriptors(PaginationInfo.NO_LIMIT);
92+
SubmodelDescriptor descriptor = result.getResult().stream().filter(x -> "legacy-getall-1".equals(x.getId())).findFirst().orElse(null);
93+
assertThat(descriptor).isNotNull();
94+
95+
Document writtenDescriptor = new Document();
96+
template.getConverter().write(descriptor, writtenDescriptor);
97+
98+
assertThat(extractSupplementalSemanticField(writtenDescriptor)).isNotNull();
99+
assertThat(extractSupplementalSemanticField(writtenDescriptor)).isInstanceOf(List.class);
100+
assertThat((List<?>) extractSupplementalSemanticField(writtenDescriptor)).hasSize(1);
101+
}
102+
103+
private Object extractSupplementalSemanticField(Document descriptorDocument) {
104+
if (descriptorDocument.containsKey("supplementalSemanticIds")) {
105+
return descriptorDocument.get("supplementalSemanticIds");
106+
}
107+
return descriptorDocument.get("supplementalSemanticId");
108+
}
109+
110+
private Document createLegacyDocument(String id) {
111+
Document key = new Document("type", "GlobalReference").append("value", "urn:test:" + id);
112+
Document reference = new Document("type", "ExternalReference").append("keys", Arrays.asList(key));
113+
return new Document("_id", id).append("idShort", "short-" + id).append("endpoints", Arrays.asList()).append("supplementalSemanticId", Arrays.asList(reference));
114+
}
56115
}

0 commit comments

Comments
 (0)