Skip to content

Commit cad48b8

Browse files
authored
Fix referredIdSemanticId not being set in client - createSubmodelInAas (#369)
* Fix referredIdSemanticId not being set in client - createSubmodelInAas * Add link to related aas4j issue * chore: Fix formatting issues
1 parent 9ca510f commit cad48b8

File tree

3 files changed

+45
-17
lines changed

3 files changed

+45
-17
lines changed

basyx.aasenvironment/basyx.aasenvironment-client/src/main/java/org/eclipse/digitaltwin/basyx/aasenvironment/client/ConnectedAasManager.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.AssetAdministrationShellDescriptor;
4646
import org.eclipse.digitaltwin.basyx.aasrepository.client.ConnectedAasRepository;
4747
import org.eclipse.digitaltwin.basyx.aasrepository.feature.registry.integration.AasDescriptorFactory;
48-
import org.eclipse.digitaltwin.basyx.client.internal.resolver.DescriptorResolver;
4948
import org.eclipse.digitaltwin.basyx.aasservice.client.ConnectedAasService;
49+
import org.eclipse.digitaltwin.basyx.client.internal.resolver.DescriptorResolver;
5050
import org.eclipse.digitaltwin.basyx.submodelregistry.client.api.SubmodelRegistryApi;
5151
import org.eclipse.digitaltwin.basyx.submodelregistry.client.model.SubmodelDescriptor;
5252
import org.eclipse.digitaltwin.basyx.submodelrepository.client.ConnectedSubmodelRepository;
@@ -212,6 +212,8 @@ public void createAas(AssetAdministrationShell aas) {
212212
* The Submodel object to create under the specified AAS.
213213
*/
214214
public void createSubmodelInAas(String aasIdentifier, Submodel submodel) {
215+
AssetAdministrationShell shell = getAasService(aasIdentifier).getAAS();
216+
215217
smRepository.createSubmodel(submodel);
216218
SubmodelDescriptor descriptor = smDescriptorFactory.create(submodel);
217219

@@ -221,7 +223,12 @@ public void createSubmodelInAas(String aasIdentifier, Submodel submodel) {
221223
throw new RegistryHttpRequestException(aasIdentifier, e);
222224
}
223225

224-
aasRepository.addSubmodelReference(aasIdentifier, AasUtils.toReference(submodel));
226+
Reference smRef = AasUtils.toReference(AasUtils.toReference(shell), submodel);
227+
228+
// TODO See https://github.com/eclipse-aas4j/aas4j/issues/308
229+
smRef.setReferredSemanticId(submodel.getSemanticId());
230+
231+
aasRepository.addSubmodelReference(aasIdentifier, smRef);
225232
}
226233

227234
private String extractSubmodelIdentifierFromReference(Reference submodelReference) {

basyx.aasenvironment/basyx.aasenvironment-client/src/test/java/org/eclipse/digitaltwin/basyx/aasenvironment/client/TestConnectedAasManager.java

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535

3636
import java.util.Arrays;
3737
import java.util.List;
38+
import java.util.Optional;
3839
import java.util.stream.Collectors;
3940

4041
import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell;
42+
import org.eclipse.digitaltwin.aas4j.v3.model.Reference;
4143
import org.eclipse.digitaltwin.aas4j.v3.model.Submodel;
4244
import org.eclipse.digitaltwin.basyx.aasenvironment.client.exceptions.NoValidEndpointFoundException;
4345
import org.eclipse.digitaltwin.basyx.aasenvironment.client.resolvers.AasDescriptorResolver;
@@ -73,16 +75,16 @@
7375
*
7476
*/
7577
public class TestConnectedAasManager {
76-
protected final static String AAS_REPOSITORY_BASE_PATH = "http://localhost:8081";
77-
protected final static String SM_REPOSITORY_BASE_PATH = "http://localhost:8081";
78-
protected final static String AAS_REGISTRY_BASE_PATH = "http://localhost:8050";
79-
protected final static String SM_REGISTRY_BASE_PATH = "http://localhost:8060";
78+
protected static final String AAS_REPOSITORY_BASE_PATH = "http://localhost:8081";
79+
protected static final String SM_REPOSITORY_BASE_PATH = "http://localhost:8081";
80+
protected static final String AAS_REGISTRY_BASE_PATH = "http://localhost:8050";
81+
protected static final String SM_REGISTRY_BASE_PATH = "http://localhost:8060";
8082

8183
protected static ConfigurableApplicationContext appContext;
8284
protected static AasRepository aasRepository;
8385
protected static SubmodelRepository smRepository;
8486

85-
protected final static TestFixture FIXTURE = new TestFixture(AAS_REPOSITORY_BASE_PATH, SM_REPOSITORY_BASE_PATH);
87+
protected static final TestFixture FIXTURE = new TestFixture(AAS_REPOSITORY_BASE_PATH, SM_REPOSITORY_BASE_PATH);
8688

8789
protected static ConnectedAasRepository connectedAasRepository;
8890
protected static ConnectedSubmodelRepository connectedSmRepository;
@@ -146,20 +148,19 @@ public void createAas() throws ApiException {
146148
public void createSubmodelInAas() throws Exception {
147149
Submodel expectedSm = FIXTURE.buildSmPos1();
148150
SubmodelDescriptor expectedDescriptor = FIXTURE.buildSmPos1Descriptor();
151+
Reference expectedRef = FIXTURE.buildSmPos1Ref();
149152

150153
aasManager.createSubmodelInAas(TestFixture.AAS_PRE1_ID, expectedSm);
151154

152155
InOrder inOrder = inOrder(connectedSmRepository, smRegistryApi, connectedAasRepository);
153156

154-
inOrder.verify(connectedSmRepository, times(1))
155-
.createSubmodel(expectedSm);
156-
inOrder.verify(smRegistryApi, times(1))
157-
.postSubmodelDescriptor(expectedDescriptor);
158-
inOrder.verify(connectedAasRepository, times(1))
159-
.addSubmodelReference(eq(TestFixture.AAS_PRE1_ID), any());
157+
inOrder.verify(connectedSmRepository, times(1)).createSubmodel(expectedSm);
158+
inOrder.verify(smRegistryApi, times(1)).postSubmodelDescriptor(expectedDescriptor);
159+
inOrder.verify(connectedAasRepository, times(1)).addSubmodelReference(eq(TestFixture.AAS_PRE1_ID), any());
160160

161161
assertEquals(expectedSm, getSubmodelFromRepo(TestFixture.SM_POS1_ID));
162162
assertEquals(expectedDescriptor, getDescriptorFromSubmodelRegistry(TestFixture.SM_POS1_ID));
163+
assertEquals(expectedRef, getSubmodelRefFromAasRepository(TestFixture.AAS_PRE1_ID, TestFixture.SM_POS1_ID).get());
163164
}
164165

165166
@Test
@@ -195,7 +196,7 @@ public void deleteSubmodelOfAas() throws Exception {
195196
}
196197

197198
@Test
198-
public void getAas() throws ApiException, NoValidEndpointFoundException {
199+
public void getAas() throws NoValidEndpointFoundException {
199200
AssetAdministrationShell expectedAas = FIXTURE.buildAasPre1();
200201

201202
AssetAdministrationShell actualAas = aasManager.getAasService(TestFixture.AAS_PRE1_ID)
@@ -205,7 +206,7 @@ public void getAas() throws ApiException, NoValidEndpointFoundException {
205206
}
206207

207208
@Test
208-
public void getSubmodel() throws Exception {
209+
public void getSubmodel() {
209210
Submodel expectedSm = FIXTURE.buildSmPre1();
210211

211212
Submodel actualSm = aasManager.getSubmodelService(TestFixture.SM_PRE1_ID)
@@ -340,4 +341,14 @@ protected void cleanUpRepositories() {
340341
}
341342
}
342343

344+
private Optional<Reference> getSubmodelRefFromAasRepository(String aasId, String smId) {
345+
return aasManager.getAasService(aasId)
346+
.getAAS()
347+
.getSubmodels()
348+
.stream()
349+
.filter(ref -> ref.getKeys().stream()
350+
.anyMatch(key -> key.getValue().equals(smId)))
351+
.findAny();
352+
}
353+
343354
}

basyx.aasenvironment/basyx.aasenvironment-client/src/test/java/org/eclipse/digitaltwin/basyx/aasenvironment/client/TestFixture.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.eclipse.digitaltwin.basyx.http.Base64UrlEncoder;
4343
import org.eclipse.digitaltwin.basyx.submodelregistry.client.model.SubmodelDescriptor;
4444
import org.eclipse.digitaltwin.basyx.submodelrepository.feature.registry.integration.DummySubmodelDescriptorFactory;
45+
import org.eclipse.digitaltwin.basyx.submodelrepository.feature.registry.integration.mapper.AttributeMapper;
4546

4647
/**
4748
* Test fixture for {@link ConnectedAasManager} and related Components
@@ -68,6 +69,7 @@ public class TestFixture {
6869
public static final String SM_POS1_ID = "smPos1";
6970
public static final String SM_POS1_ID_ENCODED = Base64UrlEncoder.encode(SM_POS1_ID);
7071
public static final String SM_POS1_IDSHORT = "smPos1IdShort";
72+
public static final String SM_POS1_SEMANTICID = "smPos1SemanticId";
7173

7274
private final String aasRepositoryBasePath;
7375
private final String smRepositoryBasePath;
@@ -114,11 +116,19 @@ public AssetAdministrationShellDescriptor buildAasPos1Descriptor() {
114116
}
115117

116118
public SubmodelDescriptor buildSmPos1Descriptor() {
117-
return DummySubmodelDescriptorFactory.createDummyDescriptor(SM_POS1_ID, SM_POS1_IDSHORT, smRepositoryBasePath, null);
119+
return DummySubmodelDescriptorFactory.createDummyDescriptor(SM_POS1_ID, SM_POS1_IDSHORT, smRepositoryBasePath, new AttributeMapper(ConnectedAasManagerHelper.buildObjectMapper()).mapSemanticId(buildSmPos1SemanticId()));
120+
}
121+
122+
public Reference buildSmPos1SemanticId() {
123+
return new DefaultReference.Builder().type(ReferenceTypes.EXTERNAL_REFERENCE).keys(new DefaultKey.Builder().type(KeyTypes.GLOBAL_REFERENCE).value("https://admin-shell.io/aas/3/0/CustomDataSpecification").build()).build();
118124
}
119125

120126
public Submodel buildSmPos1() {
121-
return new DefaultSubmodel.Builder().id(SM_POS1_ID).idShort(SM_POS1_IDSHORT).build();
127+
return new DefaultSubmodel.Builder().id(SM_POS1_ID).idShort(SM_POS1_IDSHORT).semanticId(buildSmPos1SemanticId()).build();
128+
}
129+
130+
public Reference buildSmPos1Ref() {
131+
return new DefaultReference.Builder().type(ReferenceTypes.MODEL_REFERENCE).referredSemanticId(buildSmPos1SemanticId()).keys(new DefaultKey.Builder().type(KeyTypes.SUBMODEL).value(SM_POS1_ID).build()).build();
122132
}
123133

124134
}

0 commit comments

Comments
 (0)