3636import java .util .stream .Collectors ;
3737import lombok .NonNull ;
3838import lombok .RequiredArgsConstructor ;
39+ import org .bson .Document ;
3940import org .eclipse .digitaltwin .basyx .aasregistry .model .AssetAdministrationShellDescriptor ;
4041import org .eclipse .digitaltwin .basyx .aasregistry .model .AssetKind ;
4142import org .eclipse .digitaltwin .basyx .aasregistry .model .ShellDescriptorQuery ;
@@ -80,6 +81,8 @@ public class MongoDbAasRegistryStorage implements AasRegistryStorage {
8081 private static final String SUBMODEL_DESCRIPTORS_ID = "submodelDescriptors._id" ;
8182 private static final String ASSET_TYPE = "assetType" ;
8283 private static final String ASSET_KIND = "assetKind" ;
84+ private static final String SUPPLEMENTAL_SEMANTIC_ID = "supplementalSemanticId" ;
85+ private static final String SUPPLEMENTAL_SEMANTIC_IDS = "supplementalSemanticIds" ;
8386
8487 private final MongoTemplate template ;
8588
@@ -91,8 +94,8 @@ public CursorResult<List<AssetAdministrationShellDescriptor>> getAllAasDescripto
9194 applyFilter (filter , allAggregations );
9295 applySorting (allAggregations );
9396 applyPagination (pRequest , allAggregations );
94- AggregationResults <AssetAdministrationShellDescriptor > results = template .aggregate (Aggregation .newAggregation (allAggregations ), collectionName , AssetAdministrationShellDescriptor .class );
95- List <AssetAdministrationShellDescriptor > foundDescriptors = results .getMappedResults ();
97+ AggregationResults <Document > results = template .aggregate (Aggregation .newAggregation (allAggregations ), collectionName , Document .class );
98+ List <AssetAdministrationShellDescriptor > foundDescriptors = results .getMappedResults (). stream (). map ( this :: toAasDescriptor ). collect ( Collectors . toList ()) ;
9699 String cursor = resolveCursor (pRequest , foundDescriptors , AssetAdministrationShellDescriptor ::getId );
97100 return new CursorResult <>(cursor , foundDescriptors );
98101 }
@@ -148,11 +151,11 @@ public Optional<Criteria> createFilterCriteria(DescriptorFilter filter) {
148151
149152 @ Override
150153 public AssetAdministrationShellDescriptor getAasDescriptor (@ NonNull String aasDescriptorId ) throws AasDescriptorNotFoundException {
151- AssetAdministrationShellDescriptor descriptor = template .findById (aasDescriptorId , AssetAdministrationShellDescriptor .class , collectionName );
154+ Document descriptor = template .findById (aasDescriptorId , Document .class , collectionName );
152155 if (descriptor == null ) {
153156 throw new AasDescriptorNotFoundException (aasDescriptorId );
154157 }
155- return descriptor ;
158+ return toAasDescriptor ( descriptor ) ;
156159 }
157160
158161 @ Override
@@ -212,8 +215,8 @@ public CursorResult<List<SubmodelDescriptor>> getAllSubmodels(@NonNull String aa
212215 allAggregations .add (Aggregation .replaceRoot (SUBMODEL_DESCRIPTORS ));
213216 this .applySorting (allAggregations );
214217 this .applyPagination (pRequest , allAggregations );
215- AggregationResults <SubmodelDescriptor > results = template .aggregate (Aggregation .newAggregation (allAggregations ), collectionName , SubmodelDescriptor .class );
216- List <SubmodelDescriptor > submodels = results .getMappedResults ();
218+ AggregationResults <Document > results = template .aggregate (Aggregation .newAggregation (allAggregations ), collectionName , Document .class );
219+ List <SubmodelDescriptor > submodels = results .getMappedResults (). stream (). map ( this :: toSubmodelDescriptor ). collect ( Collectors . toList ()) ;
217220 String cursor = resolveCursor (pRequest , submodels , SubmodelDescriptor ::getId );
218221 return new CursorResult <>(cursor , submodels );
219222 }
@@ -224,16 +227,21 @@ public SubmodelDescriptor getSubmodel(@NonNull String aasDescriptorId, @NonNull
224227 all .add (Aggregation .match (Criteria .where (ID ).is (aasDescriptorId )));
225228 ArrayOperators .Filter filter = ArrayOperators .arrayOf (SUBMODEL_DESCRIPTORS ).filter ().as (SUBMODEL_DESCRIPTORS ).by (ComparisonOperators .valueOf (SUBMODEL_DESCRIPTORS_ID ).equalToValue (submodelId ));
226229 all .add (Aggregation .project ().and (filter ).as (SUBMODEL_DESCRIPTORS ));
227- AggregationResults <AssetAdministrationShellDescriptor > results = template .aggregate (Aggregation .newAggregation (all ), collectionName , AssetAdministrationShellDescriptor .class );
228- List <AssetAdministrationShellDescriptor > aasDescriptors = results .getMappedResults ();
230+ AggregationResults <Document > results = template .aggregate (Aggregation .newAggregation (all ), collectionName , Document .class );
231+ List <Document > aasDescriptors = results .getMappedResults ();
229232 if (aasDescriptors .isEmpty ()) {
230233 throw new AasDescriptorNotFoundException (aasDescriptorId );
231234 }
232- List <SubmodelDescriptor > descriptors = aasDescriptors .get (0 ).getSubmodelDescriptors ();
233- if (descriptors == null || descriptors .isEmpty ()) {
235+ Document compatibleAasDescriptor = ensureLegacyAasDescriptorCompatibility (aasDescriptors .get (0 ));
236+ Object descriptorsObject = compatibleAasDescriptor .get (SUBMODEL_DESCRIPTORS );
237+ if (!(descriptorsObject instanceof List <?> descriptors ) || descriptors .isEmpty ()) {
234238 throw new SubmodelNotFoundException (aasDescriptorId , submodelId );
235239 }
236- return descriptors .get (0 );
240+ Object firstDescriptor = descriptors .get (0 );
241+ if (!(firstDescriptor instanceof Document descriptorDocument )) {
242+ throw new SubmodelNotFoundException (aasDescriptorId , submodelId );
243+ }
244+ return toSubmodelDescriptor (descriptorDocument );
237245 }
238246
239247 @ Override
@@ -321,9 +329,52 @@ public ShellDescriptorSearchResponse searchAasDescriptors(@NonNull ShellDescript
321329 qBuilder .withProjection (grouped .getQueriesInsideSubmodel (), aggregationOps );
322330
323331 Aggregation aggregation = Aggregation .newAggregation (aggregationOps );
324- AggregationResults <AssetAdministrationShellDescriptor > results = template .aggregate (aggregation , collectionName , AssetAdministrationShellDescriptor .class );
332+ AggregationResults <Document > results = template .aggregate (aggregation , collectionName , Document .class );
325333
326- List <AssetAdministrationShellDescriptor > descriptors = results .getMappedResults ();
334+ List <AssetAdministrationShellDescriptor > descriptors = results .getMappedResults (). stream (). map ( this :: toAasDescriptor ). collect ( Collectors . toList ()) ;
327335 return new ShellDescriptorSearchResponse (total , descriptors );
328336 }
337+
338+ private AssetAdministrationShellDescriptor toAasDescriptor (Document descriptorDocument ) {
339+ Document compatibleDocument = ensureLegacyAasDescriptorCompatibility (descriptorDocument );
340+ return template .getConverter ().read (AssetAdministrationShellDescriptor .class , compatibleDocument );
341+ }
342+
343+ private SubmodelDescriptor toSubmodelDescriptor (Document descriptorDocument ) {
344+ Document compatibleDocument = ensureLegacySubmodelDescriptorCompatibility (descriptorDocument );
345+ return template .getConverter ().read (SubmodelDescriptor .class , compatibleDocument );
346+ }
347+
348+ private Document ensureLegacyAasDescriptorCompatibility (Document descriptorDocument ) {
349+ Object submodelDescriptorsObject = descriptorDocument .get (SUBMODEL_DESCRIPTORS );
350+ if (!(submodelDescriptorsObject instanceof List <?> submodelDescriptors )) {
351+ return descriptorDocument ;
352+ }
353+ boolean changed = false ;
354+ List <Object > compatibleSubmodels = new ArrayList <>(submodelDescriptors .size ());
355+ for (Object eachSubmodel : submodelDescriptors ) {
356+ if (eachSubmodel instanceof Document submodelDocument ) {
357+ Document compatibleSubmodel = ensureLegacySubmodelDescriptorCompatibility (submodelDocument );
358+ compatibleSubmodels .add (compatibleSubmodel );
359+ changed |= compatibleSubmodel != submodelDocument ;
360+ } else {
361+ compatibleSubmodels .add (eachSubmodel );
362+ }
363+ }
364+ if (!changed ) {
365+ return descriptorDocument ;
366+ }
367+ Document compatibleDescriptor = new Document (descriptorDocument );
368+ compatibleDescriptor .put (SUBMODEL_DESCRIPTORS , compatibleSubmodels );
369+ return compatibleDescriptor ;
370+ }
371+
372+ private Document ensureLegacySubmodelDescriptorCompatibility (Document descriptorDocument ) {
373+ if (descriptorDocument .containsKey (SUPPLEMENTAL_SEMANTIC_IDS ) || !descriptorDocument .containsKey (SUPPLEMENTAL_SEMANTIC_ID )) {
374+ return descriptorDocument ;
375+ }
376+ Document compatibleDocument = new Document (descriptorDocument );
377+ compatibleDocument .put (SUPPLEMENTAL_SEMANTIC_IDS , descriptorDocument .get (SUPPLEMENTAL_SEMANTIC_ID ));
378+ return compatibleDocument ;
379+ }
329380}
0 commit comments