Skip to content

Commit 8d064e2

Browse files
authored
Implement support for adding globalAssetId to Discovery Service (#894)
1 parent 8688fb7 commit 8d064e2

2 files changed

Lines changed: 147 additions & 31 deletions

File tree

basyx.aasregistry/basyx.aasregistry-feature-discovery-integration/src/main/java/org/eclipse/digitaltwin/basyx/aasregistry/feature/discovery/integration/DiscoveryIntegrationAasRegistry.java

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
package org.eclipse.digitaltwin.basyx.aasregistry.feature.discovery.integration;
2828

29-
import jakarta.validation.Valid;
3029
import lombok.NonNull;
3130
import lombok.extern.slf4j.Slf4j;
3231
import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId;
@@ -42,7 +41,6 @@
4241
import org.eclipse.digitaltwin.basyx.core.pagination.CursorResult;
4342
import org.eclipse.digitaltwin.basyx.core.pagination.PaginationInfo;
4443

45-
import java.util.Base64;
4644
import java.util.List;
4745
import java.util.Set;
4846
import java.util.stream.Collectors;
@@ -74,21 +72,14 @@ public void insertAasDescriptor(AssetAdministrationShellDescriptor descr)
7472
throws AasDescriptorAlreadyExistsException {
7573
decorated.insertAasDescriptor(descr);
7674

77-
List<org.eclipse.digitaltwin.basyx.aasregistry.model.SpecificAssetId> ids = descr.getSpecificAssetIds();
78-
if (ids == null || ids.isEmpty()) {
79-
log.debug("No specificAssetIds present for AAS '{}', skipping discovery integration", descr.getId());
75+
List<SpecificAssetId> allAssetIds = collectAllAssetIds(descr);
76+
77+
if (allAssetIds.isEmpty()) {
78+
log.debug("No specificAssetIds or globalAssetId present for AAS '{}', skipping discovery integration", descr.getId());
8079
return;
8180
}
8281

83-
List<SpecificAssetId> specificAssetIds = ids.stream()
84-
.map(rId -> {
85-
SpecificAssetId assetId = new DefaultSpecificAssetId();
86-
assetId.setName(rId.getName());
87-
assetId.setValue(rId.getValue());
88-
return assetId;
89-
}).collect(Collectors.toList());
90-
91-
discoveryApi.createAllAssetLinksById(descr.getId(), specificAssetIds);
82+
discoveryApi.createAllAssetLinksById(descr.getId(), allAssetIds);
9283
}
9384

9485
@Override
@@ -97,25 +88,11 @@ public void replaceAasDescriptor(@NonNull String aasDescriptorId,
9788
throws AasDescriptorNotFoundException {
9889
decorated.replaceAasDescriptor(aasDescriptorId, descriptor);
9990

100-
List<org.eclipse.digitaltwin.basyx.aasregistry.model.SpecificAssetId> ids = descriptor.getSpecificAssetIds();
101-
102-
if (ids == null || ids.isEmpty()) {
103-
log.debug("No specificAssetIds present for AAS '{}', skipping discovery integration update", aasDescriptorId);
104-
discoveryApi.deleteAllAssetLinksById(aasDescriptorId);
105-
return;
106-
}
107-
108-
List<SpecificAssetId> specificAssetIds = ids.stream()
109-
.map(rId -> {
110-
SpecificAssetId assetId = new DefaultSpecificAssetId();
111-
assetId.setName(rId.getName());
112-
assetId.setValue(rId.getValue());
113-
return assetId;
114-
})
115-
.collect(Collectors.toList());
91+
List<SpecificAssetId> allAssetIds = collectAllAssetIds(descriptor);
11692

11793
discoveryApi.deleteAllAssetLinksById(aasDescriptorId);
118-
discoveryApi.createAllAssetLinksById(aasDescriptorId, specificAssetIds);
94+
95+
discoveryApi.createAllAssetLinksById(aasDescriptorId, allAssetIds);
11996
}
12097

12198
@Override
@@ -158,4 +135,41 @@ public Set<String> clear() {
158135
public ShellDescriptorSearchResponse searchAasDescriptors(@NonNull ShellDescriptorSearchRequest request) {
159136
return decorated.searchAasDescriptors(request);
160137
}
138+
139+
/**
140+
* Collects all asset IDs from the descriptor, including both specificAssetIds and globalAssetId.
141+
* The globalAssetId is converted to a SpecificAssetId with name "globalAssetId".
142+
*
143+
* @param descriptor the AssetAdministrationShellDescriptor
144+
* @return a list of all asset IDs
145+
*/
146+
private List<SpecificAssetId> collectAllAssetIds(AssetAdministrationShellDescriptor descriptor) {
147+
List<SpecificAssetId> allAssetIds = new java.util.ArrayList<>();
148+
149+
// Add specificAssetIds
150+
List<org.eclipse.digitaltwin.basyx.aasregistry.model.SpecificAssetId> ids = descriptor.getSpecificAssetIds();
151+
if (ids != null && !ids.isEmpty()) {
152+
List<SpecificAssetId> specificAssetIds = ids.stream()
153+
.map(rId -> {
154+
SpecificAssetId assetId = new DefaultSpecificAssetId();
155+
assetId.setName(rId.getName());
156+
assetId.setValue(rId.getValue());
157+
return assetId;
158+
})
159+
.collect(Collectors.toList());
160+
allAssetIds.addAll(specificAssetIds);
161+
}
162+
163+
// Add globalAssetId if present
164+
String globalAssetId = descriptor.getGlobalAssetId();
165+
if (globalAssetId != null && !globalAssetId.isEmpty()) {
166+
SpecificAssetId globalAssetIdEntry = new DefaultSpecificAssetId();
167+
globalAssetIdEntry.setName("globalAssetId");
168+
globalAssetIdEntry.setValue(globalAssetId);
169+
allAssetIds.add(globalAssetIdEntry);
170+
log.debug("Added globalAssetId '{}' to discovery service for AAS '{}'", globalAssetId, descriptor.getId());
171+
}
172+
173+
return allAssetIds;
174+
}
161175
}

basyx.aasregistry/basyx.aasregistry-feature-discovery-integration/src/test/java/org/eclipse/digitaltwin/basyx/aasregistry/feature/discovery/integration/DiscoveryIntegrationAasRegistryTest.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,106 @@ private SubmodelDescriptor createTestSubmodelDescriptor(String id) {
232232
submodel.setAdministration(new AdministrativeInformation());
233233
return submodel;
234234
}
235+
236+
@Test
237+
void insertAasDescriptorWithGlobalAssetIdShouldPropagateToDiscovery() throws Exception {
238+
log.info("Started unit test - insertAasDescriptorWithGlobalAssetIdShouldPropagateToDiscovery()");
239+
AssetAdministrationShellDescriptor descriptor = createTestDescriptor(AAS_DESCRIPTOR_ID);
240+
descriptor.setGlobalAssetId("https://example.com/global-asset-123");
241+
descriptor.setSpecificAssetIds(createRegistrySpecificAssetIds());
242+
243+
registry.insertAasDescriptor(descriptor);
244+
245+
verify(decoratedStorage).insertAasDescriptor(descriptor);
246+
247+
ArgumentCaptor<String> idCaptor = ArgumentCaptor.forClass(String.class);
248+
ArgumentCaptor<List<SpecificAssetId>> assetIdsCaptor = ArgumentCaptor.forClass(List.class);
249+
verify(discoveryService).createAllAssetLinksById(idCaptor.capture(), assetIdsCaptor.capture());
250+
251+
assertEquals(AAS_DESCRIPTOR_ID, idCaptor.getValue());
252+
assertEquals(3, assetIdsCaptor.getValue().size()); // 2 specificAssetIds + 1 globalAssetId
253+
254+
// Verify globalAssetId was added
255+
boolean hasGlobalAssetId = assetIdsCaptor.getValue().stream()
256+
.anyMatch(id -> "globalAssetId".equals(id.getName()) &&
257+
"https://example.com/global-asset-123".equals(id.getValue()));
258+
assertTrue(hasGlobalAssetId, "globalAssetId should be present in the asset IDs sent to discovery service");
259+
log.info("Successfully conducted unit test");
260+
}
261+
262+
@Test
263+
void insertAasDescriptorWithOnlyGlobalAssetIdShouldPropagateToDiscovery() throws Exception {
264+
log.info("Started unit test - insertAasDescriptorWithOnlyGlobalAssetIdShouldPropagateToDiscovery()");
265+
AssetAdministrationShellDescriptor descriptor = createTestDescriptor(AAS_DESCRIPTOR_ID);
266+
descriptor.setGlobalAssetId("https://example.com/global-asset-456");
267+
descriptor.setSpecificAssetIds(Collections.emptyList());
268+
269+
registry.insertAasDescriptor(descriptor);
270+
271+
verify(decoratedStorage).insertAasDescriptor(descriptor);
272+
273+
ArgumentCaptor<String> idCaptor = ArgumentCaptor.forClass(String.class);
274+
ArgumentCaptor<List<SpecificAssetId>> assetIdsCaptor = ArgumentCaptor.forClass(List.class);
275+
verify(discoveryService).createAllAssetLinksById(idCaptor.capture(), assetIdsCaptor.capture());
276+
277+
assertEquals(AAS_DESCRIPTOR_ID, idCaptor.getValue());
278+
assertEquals(1, assetIdsCaptor.getValue().size()); // Only globalAssetId
279+
280+
// Verify globalAssetId was added
281+
SpecificAssetId capturedId = assetIdsCaptor.getValue().get(0);
282+
assertEquals("globalAssetId", capturedId.getName());
283+
assertEquals("https://example.com/global-asset-456", capturedId.getValue());
284+
log.info("Successfully conducted unit test");
285+
}
286+
287+
@Test
288+
void replaceAasDescriptorWithGlobalAssetIdShouldPropagateToDiscovery() throws Exception {
289+
log.info("Started unit test - replaceAasDescriptorWithGlobalAssetIdShouldPropagateToDiscovery()");
290+
AssetAdministrationShellDescriptor descriptor = createTestDescriptor(AAS_DESCRIPTOR_ID);
291+
descriptor.setGlobalAssetId("https://example.com/global-asset-789");
292+
descriptor.setSpecificAssetIds(createRegistrySpecificAssetIds());
293+
294+
registry.replaceAasDescriptor(AAS_DESCRIPTOR_ID, descriptor);
295+
296+
InOrder inOrder = inOrder(discoveryService);
297+
verify(decoratedStorage).replaceAasDescriptor(AAS_DESCRIPTOR_ID, descriptor);
298+
inOrder.verify(discoveryService).deleteAllAssetLinksById(AAS_DESCRIPTOR_ID);
299+
300+
ArgumentCaptor<List<SpecificAssetId>> assetIdsCaptor = ArgumentCaptor.forClass(List.class);
301+
inOrder.verify(discoveryService).createAllAssetLinksById(eq(AAS_DESCRIPTOR_ID), assetIdsCaptor.capture());
302+
303+
assertEquals(3, assetIdsCaptor.getValue().size()); // 2 specificAssetIds + 1 globalAssetId
304+
305+
// Verify globalAssetId was added
306+
boolean hasGlobalAssetId = assetIdsCaptor.getValue().stream()
307+
.anyMatch(id -> "globalAssetId".equals(id.getName()) &&
308+
"https://example.com/global-asset-789".equals(id.getValue()));
309+
assertTrue(hasGlobalAssetId, "globalAssetId should be present in the asset IDs sent to discovery service");
310+
311+
inOrder.verifyNoMoreInteractions();
312+
log.info("Successfully conducted unit test");
313+
}
314+
315+
@Test
316+
void insertAasDescriptorWithoutGlobalAssetIdShouldStillWork() throws Exception {
317+
log.info("Started unit test - insertAasDescriptorWithoutGlobalAssetIdShouldStillWork()");
318+
AssetAdministrationShellDescriptor descriptor = createTestDescriptor(AAS_DESCRIPTOR_ID);
319+
descriptor.setSpecificAssetIds(createRegistrySpecificAssetIds());
320+
// No globalAssetId set
321+
322+
registry.insertAasDescriptor(descriptor);
323+
324+
verify(decoratedStorage).insertAasDescriptor(descriptor);
325+
326+
ArgumentCaptor<List<SpecificAssetId>> assetIdsCaptor = ArgumentCaptor.forClass(List.class);
327+
verify(discoveryService).createAllAssetLinksById(eq(AAS_DESCRIPTOR_ID), assetIdsCaptor.capture());
328+
329+
assertEquals(2, assetIdsCaptor.getValue().size()); // Only 2 specificAssetIds
330+
331+
// Verify no globalAssetId was added
332+
boolean hasGlobalAssetId = assetIdsCaptor.getValue().stream()
333+
.anyMatch(id -> "globalAssetId".equals(id.getName()));
334+
assertFalse(hasGlobalAssetId, "globalAssetId should not be present when not set in descriptor");
335+
log.info("Successfully conducted unit test");
336+
}
235337
}

0 commit comments

Comments
 (0)