Skip to content

Commit 31ac86c

Browse files
authored
Fix default endpoint resolve strategy from client lib not conforming with specification (#504)
* test: add bug failing test * fix: change endpoint parsing mechanism of the Aas/Sm DescriptorResolvers to conform with spec * ci: retriggering * fix: address review remarks
1 parent cebe8f0 commit 31ac86c

File tree

7 files changed

+102
-48
lines changed

7 files changed

+102
-48
lines changed

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,20 @@
3030

3131
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.AssetAdministrationShellDescriptor;
3232
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.Endpoint;
33+
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.ProtocolInformation;
3334
import org.eclipse.digitaltwin.basyx.aasservice.client.ConnectedAasService;
3435
import org.eclipse.digitaltwin.basyx.client.internal.resolver.DescriptorResolver;
3536

3637
/**
3738
* Resolves an AasDescriptor into a {@link ConnectedAasService}
38-
*
39+
*
3940
* @author mateusmolina, danish
4041
*
4142
*/
4243
public class AasDescriptorResolver implements DescriptorResolver<AssetAdministrationShellDescriptor, ConnectedAasService> {
4344

45+
static final String SPEC_INTERFACE = "AAS-3.0";
46+
4447
private final EndpointResolver endpointResolver;
4548

4649
/**
@@ -66,16 +69,7 @@ public ConnectedAasService resolveDescriptor(AssetAdministrationShellDescriptor
6669

6770
public static Optional<URI> parseEndpoint(Endpoint endpoint) {
6871
try {
69-
if (endpoint == null || endpoint.getProtocolInformation() == null || endpoint.getProtocolInformation()
70-
.getHref() == null)
71-
return Optional.empty();
72-
73-
String baseHref = endpoint.getProtocolInformation()
74-
.getHref();
75-
// TODO not working: String queryString = "?" + endpoint.toUrlQueryString();
76-
String queryString = "";
77-
URI uri = new URI(baseHref + queryString);
78-
return Optional.of(uri);
72+
return Optional.ofNullable(endpoint).filter(ep -> ep.getInterface().equals(SPEC_INTERFACE)).map(Endpoint::getProtocolInformation).map(ProtocolInformation::getHref).map(URI::create);
7973
} catch (Exception e) {
8074
return Optional.empty();
8175
}

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
package org.eclipse.digitaltwin.basyx.aasenvironment.client.resolvers;
2727

28+
import org.eclipse.digitaltwin.basyx.submodelregistry.client.model.ProtocolInformation;
2829
import org.eclipse.digitaltwin.basyx.client.internal.resolver.DescriptorResolver;
2930
import java.net.URI;
3031
import java.util.Optional;
@@ -41,6 +42,8 @@
4142
*/
4243
public class SubmodelDescriptorResolver implements DescriptorResolver<SubmodelDescriptor, ConnectedSubmodelService> {
4344

45+
static final String SPEC_INTERFACE = "SUBMODEL-3.0";
46+
4447
private final EndpointResolver endpointResolver;
4548

4649
/**
@@ -67,16 +70,7 @@ public ConnectedSubmodelService resolveDescriptor(SubmodelDescriptor smDescripto
6770

6871
public static Optional<URI> parseEndpoint(Endpoint endpoint) {
6972
try {
70-
if (endpoint == null || endpoint.getProtocolInformation() == null || endpoint.getProtocolInformation()
71-
.getHref() == null)
72-
return Optional.empty();
73-
74-
String baseHref = endpoint.getProtocolInformation()
75-
.getHref();
76-
// TODO not working: String queryString = "?" + endpoint.toUrlQueryString();
77-
String queryString = "";
78-
URI uri = new URI(baseHref + queryString);
79-
return Optional.of(uri);
73+
return Optional.ofNullable(endpoint).filter(ep -> ep.getInterface().equals(SPEC_INTERFACE)).map(Endpoint::getProtocolInformation).map(ProtocolInformation::getHref).map(URI::create);
8074
} catch (Exception e) {
8175
return Optional.empty();
8276
}

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
package org.eclipse.digitaltwin.basyx.aasenvironment.client;
2727

28+
import java.util.LinkedList;
29+
2830
import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell;
2931
import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation;
3032
import org.eclipse.digitaltwin.aas4j.v3.model.AssetKind;
@@ -38,6 +40,7 @@
3840
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultReference;
3941
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultSubmodel;
4042
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.AssetAdministrationShellDescriptor;
43+
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.Endpoint;
4144
import org.eclipse.digitaltwin.basyx.aasregistry.main.client.mapper.DummyAasDescriptorFactory;
4245
import org.eclipse.digitaltwin.basyx.http.Base64UrlEncoder;
4346
import org.eclipse.digitaltwin.basyx.submodelregistry.client.mapper.AttributeMapper;
@@ -91,6 +94,15 @@ public AssetAdministrationShellDescriptor buildAasPre1Descriptor() {
9194
return DummyAasDescriptorFactory.createDummyDescriptor(AAS_PRE1_ID, AAS_PRE1_IDSHORT, AAS_PRE1_GLOBALASSETID, aasRepositoryBasePath);
9295
}
9396

97+
public AssetAdministrationShellDescriptor buildAasPre1Descriptor_withMultipleInterfaces() {
98+
LinkedList<Endpoint> endpoints = new LinkedList<>();
99+
100+
endpoints.add(DummyAasDescriptorFactory.createEndpoint(aasRepositoryBasePath, "AAS-REPOSITORY-3.0"));
101+
endpoints.add(DummyAasDescriptorFactory.createEndpoint(AAS_PRE1_ID, aasRepositoryBasePath, "AAS-3.0"));
102+
103+
return DummyAasDescriptorFactory.createDummyDescriptor(AAS_PRE1_ID, AAS_PRE1_IDSHORT, AAS_PRE1_GLOBALASSETID, endpoints);
104+
}
105+
94106
public Reference buildSmPre1Ref() {
95107
return new DefaultReference.Builder().type(ReferenceTypes.MODEL_REFERENCE).keys(new DefaultKey.Builder().type(KeyTypes.SUBMODEL).value(SM_PRE1_ID).build()).build();
96108
}
@@ -100,7 +112,16 @@ public Submodel buildSmPre1() {
100112
}
101113

102114
public SubmodelDescriptor buildSmPre1Descriptor() {
103-
return DummySubmodelDescriptorFactory.createDummyDescriptor(SM_PRE1_ID, SM_PRE1_IDSHORT, smRepositoryBasePath, null);
115+
return DummySubmodelDescriptorFactory.createDummyDescriptor(SM_PRE1_ID, SM_PRE1_IDSHORT, null, smRepositoryBasePath);
116+
}
117+
118+
public SubmodelDescriptor buildSmPre1Descriptor_withMultipleInterfaces() {
119+
LinkedList<org.eclipse.digitaltwin.basyx.submodelregistry.client.model.Endpoint> endpoints = new LinkedList<>();
120+
121+
endpoints.add(DummySubmodelDescriptorFactory.createEndpoint(smRepositoryBasePath, "SUBMODEL-REPOSITORY-3.0"));
122+
endpoints.add(DummySubmodelDescriptorFactory.createEndpoint(SM_PRE1_ID, smRepositoryBasePath, "SUBMODEL-3.0"));
123+
124+
return DummySubmodelDescriptorFactory.createDummyDescriptor(SM_PRE1_ID, SM_PRE1_IDSHORT, null, endpoints);
104125
}
105126

106127
public AssetAdministrationShell buildAasPos1() {
@@ -116,7 +137,7 @@ public AssetAdministrationShellDescriptor buildAasPos1Descriptor() {
116137
}
117138

118139
public SubmodelDescriptor buildSmPos1Descriptor() {
119-
return DummySubmodelDescriptorFactory.createDummyDescriptor(SM_POS1_ID, SM_POS1_IDSHORT, smRepositoryBasePath, new AttributeMapper(ConnectedAasManagerHelper.buildObjectMapper()).mapSemanticId(buildSmPos1SemanticId()));
140+
return DummySubmodelDescriptorFactory.createDummyDescriptor(SM_POS1_ID, SM_POS1_IDSHORT, new AttributeMapper(ConnectedAasManagerHelper.buildObjectMapper()).mapSemanticId(buildSmPos1SemanticId()), smRepositoryBasePath);
120141
}
121142

122143
public Reference buildSmPos1SemanticId() {

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

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.eclipse.digitaltwin.aas4j.v3.model.Submodel;
3232
import org.eclipse.digitaltwin.basyx.aasenvironment.client.DummyAasEnvironmentComponent;
3333
import org.eclipse.digitaltwin.basyx.aasenvironment.client.TestFixture;
34-
import org.eclipse.digitaltwin.basyx.aasregistry.client.ApiException;
3534
import org.eclipse.digitaltwin.basyx.aasrepository.AasRepository;
3635
import org.eclipse.digitaltwin.basyx.submodelrepository.SubmodelRepository;
3736
import org.junit.AfterClass;
@@ -52,10 +51,10 @@ public class RegistryDescriptorResolverTest {
5251
private static AasRepository aasRepository;
5352
private static SubmodelRepository smRepository;
5453

55-
private final static String AAS_REPOSITORY_BASE_PATH = "http://localhost:8081";
56-
private final static String SM_REPOSITORY_BASE_PATH = "http://localhost:8081";
54+
private static final String AAS_REPOSITORY_BASE_PATH = "http://localhost:8081";
55+
private static final String SM_REPOSITORY_BASE_PATH = "http://localhost:8081";
5756

58-
private final static TestFixture FIXTURE = new TestFixture(AAS_REPOSITORY_BASE_PATH, SM_REPOSITORY_BASE_PATH);
57+
private static final TestFixture FIXTURE = new TestFixture(AAS_REPOSITORY_BASE_PATH, SM_REPOSITORY_BASE_PATH);
5958

6059
@BeforeClass
6160
public static void initApplication() {
@@ -73,7 +72,7 @@ public static void cleanUp() {
7372
}
7473

7574
@Test
76-
public void resolveAasDescriptor() throws ApiException {
75+
public void resolveAasDescriptor() {
7776
AasDescriptorResolver resolver = new AasDescriptorResolver(new EndpointResolver());
7877

7978
AssetAdministrationShell expectedAas = FIXTURE.buildAasPre1();
@@ -84,7 +83,18 @@ public void resolveAasDescriptor() throws ApiException {
8483
}
8584

8685
@Test
87-
public void resolveSmDescriptor() throws ApiException {
86+
public void resolveAasDescriptor_withMultipleInterfaces() {
87+
AasDescriptorResolver resolver = new AasDescriptorResolver(new EndpointResolver());
88+
89+
AssetAdministrationShell expectedAas = FIXTURE.buildAasPre1();
90+
91+
AssetAdministrationShell actualAas = resolver.resolveDescriptor(FIXTURE.buildAasPre1Descriptor_withMultipleInterfaces()).getAAS();
92+
93+
assertEquals(expectedAas, actualAas);
94+
}
95+
96+
@Test
97+
public void resolveSmDescriptor() {
8898
SubmodelDescriptorResolver resolver = new SubmodelDescriptorResolver(new EndpointResolver());
8999

90100
Submodel expectedSm = FIXTURE.buildSmPre1();
@@ -94,4 +104,14 @@ public void resolveSmDescriptor() throws ApiException {
94104
assertEquals(expectedSm, actualSm);
95105
}
96106

107+
@Test
108+
public void resolveSmDescriptor_withMultipleInterfaces() {
109+
SubmodelDescriptorResolver resolver = new SubmodelDescriptorResolver(new EndpointResolver());
110+
111+
Submodel expectedSm = FIXTURE.buildSmPre1();
112+
113+
Submodel actualSm = resolver.resolveDescriptor(FIXTURE.buildSmPre1Descriptor_withMultipleInterfaces()).getSubmodel();
114+
115+
assertEquals(expectedSm, actualSm);
116+
}
97117
}

basyx.aasregistry/basyx.aasregistry-client-native/src/test/java/org/eclipse/digitaltwin/basyx/aasregistry/main/client/mapper/DummyAasDescriptorFactory.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import java.net.MalformedURLException;
2929
import java.net.URL;
30+
import java.util.LinkedList;
31+
import java.util.List;
3032

3133
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.AssetAdministrationShellDescriptor;
3234
import org.eclipse.digitaltwin.basyx.aasregistry.client.model.AssetKind;
@@ -43,31 +45,44 @@
4345
public class DummyAasDescriptorFactory {
4446
private static final String AAS_REPOSITORY_PATH = "/shells";
4547

46-
public static AssetAdministrationShellDescriptor createDummyDescriptor(String aasId, String idShort, String globalAssetId, String... aasRepoBaseUrls) {
48+
public static AssetAdministrationShellDescriptor createDummyDescriptor(String aasId, String idShort, String globalAssetId, List<Endpoint> endpoints) {
4749

4850
AssetAdministrationShellDescriptor descriptor = new AssetAdministrationShellDescriptor();
4951

5052
descriptor.setId(aasId);
5153
descriptor.setIdShort(idShort);
5254
descriptor.setAssetKind(AssetKind.INSTANCE);
5355
descriptor.setGlobalAssetId(globalAssetId);
56+
descriptor.setEndpoints(endpoints);
57+
58+
return descriptor;
59+
}
60+
61+
public static AssetAdministrationShellDescriptor createDummyDescriptor(String aasId, String idShort, String globalAssetId, String... aasRepoBaseUrls) {
62+
LinkedList<Endpoint> endpoints = new LinkedList<>();
63+
5464
for (String eachUrl : aasRepoBaseUrls) {
55-
descriptor.addEndpointsItem(createEndpointItem(aasId, eachUrl));
65+
endpoints.add(createEndpoint(aasId, eachUrl, "AAS-3.0"));
5666
}
57-
return descriptor;
67+
68+
return createDummyDescriptor(aasId, idShort, globalAssetId, endpoints);
5869
}
5970

60-
private static Endpoint createEndpointItem(String aasId, String aasRepoBaseUrl) {
71+
public static Endpoint createEndpoint(String endpointUrl, String endpointInterface) {
6172
Endpoint endpoint = new Endpoint();
62-
endpoint.setInterface("AAS-3.0");
63-
endpoint.setProtocolInformation(createProtocolInformation(aasId, aasRepoBaseUrl));
73+
endpoint.setInterface(endpointInterface);
74+
endpoint.setProtocolInformation(createProtocolInformation(endpointUrl));
6475

6576
return endpoint;
6677
}
6778

68-
private static ProtocolInformation createProtocolInformation(String aasId, String aasRepoBaseUrl) {
79+
public static Endpoint createEndpoint(String aasId, String aasRepoBaseUrl, String endpointInterface) {
6980
String href = createHref(aasId, aasRepoBaseUrl);
7081

82+
return createEndpoint(href, endpointInterface);
83+
}
84+
85+
private static ProtocolInformation createProtocolInformation(String href) {
7186
ProtocolInformation protocolInformation = new ProtocolInformation();
7287
protocolInformation.setHref(href);
7388
protocolInformation.endpointProtocol(getProtocol(href));

basyx.submodelregistry/basyx.submodelregistry-client-native/src/test/java/org/eclipse/digitaltwin/basyx/submodelregistry/client/mapper/DummySubmodelDescriptorFactory.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.net.MalformedURLException;
2929
import java.net.URL;
3030
import java.util.Arrays;
31+
import java.util.LinkedList;
32+
import java.util.List;
3133

3234
import org.eclipse.digitaltwin.basyx.http.Base64UrlEncodedIdentifier;
3335
import org.eclipse.digitaltwin.basyx.submodelregistry.client.model.Endpoint;
@@ -47,37 +49,45 @@
4749
public class DummySubmodelDescriptorFactory {
4850
private static final String SUBMODEL_REPOSITORY_PATH = "/submodels";
4951

50-
public static SubmodelDescriptor createDummyDescriptor(String smId, String idShort, String smRepoBaseUrl, Reference semanticId) {
51-
return createDummyDescriptor(smId, idShort, new String[] {smRepoBaseUrl}, semanticId);
52-
}
53-
54-
public static SubmodelDescriptor createDummyDescriptor(String smId, String idShort, String[] smRepoBaseUrls, Reference semanticId) {
52+
public static SubmodelDescriptor createDummyDescriptor(String smId, String idShort, Reference semanticId, List<Endpoint> endpoints) {
5553
SubmodelDescriptor descriptor = new SubmodelDescriptor();
5654

5755
descriptor.setId(smId);
5856
descriptor.setIdShort(idShort);
5957
descriptor.setSemanticId(semanticId);
58+
descriptor.setEndpoints(endpoints);
59+
60+
return descriptor;
61+
}
62+
63+
public static SubmodelDescriptor createDummyDescriptor(String smId, String idShort, Reference semanticId, String... smRepoBaseUrls) {
64+
LinkedList<Endpoint> endpoints = new LinkedList<>();
6065
for (String eachUrl : smRepoBaseUrls) {
61-
descriptor.addEndpointsItem(createEndpointItem(smId, eachUrl));
66+
endpoints.add(createEndpoint(smId, eachUrl, "SUBMODEL-3.0"));
6267
}
63-
return descriptor;
68+
69+
return createDummyDescriptor(smId, idShort, semanticId, endpoints);
6470
}
6571

6672
public static Reference createSemanticId() {
6773
return new Reference().keys(Arrays.asList(new Key().type(KeyTypes.GLOBALREFERENCE).value("0173-1#01-AFZ615#016"))).type(ReferenceTypes.EXTERNALREFERENCE);
6874
}
6975

70-
private static Endpoint createEndpointItem(String smId, String smRepoBaseUrl) {
76+
public static Endpoint createEndpoint(String endpointUrl, String endpointInterface) {
7177
Endpoint endpoint = new Endpoint();
72-
endpoint.setInterface("SUBMODEL-3.0");
73-
endpoint.setProtocolInformation(createProtocolInformation(smId, smRepoBaseUrl));
78+
endpoint.setInterface(endpointInterface);
79+
endpoint.setProtocolInformation(createProtocolInformation(endpointUrl));
7480

7581
return endpoint;
7682
}
7783

78-
private static ProtocolInformation createProtocolInformation(String smId, String smRepoBaseUrl) {
84+
public static Endpoint createEndpoint(String smId, String smRepoBaseUrl, String endpointInterface) {
7985
String href = createHref(smId, smRepoBaseUrl);
8086

87+
return createEndpoint(href, endpointInterface);
88+
}
89+
90+
private static ProtocolInformation createProtocolInformation(String href) {
8191
ProtocolInformation protocolInformation = new ProtocolInformation();
8292
protocolInformation.setHref(href);
8393
protocolInformation.endpointProtocol(getProtocol(href));

basyx.submodelrepository/basyx.submodelrepository-feature-registry-integration/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/registry/integration/SubmodelRepositoryRegistryLinkTestSuite.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public abstract class SubmodelRepositoryRegistryLinkTestSuite {
6464
protected abstract String getSubmodelRegistryUrl();
6565
protected abstract SubmodelRegistryApi getSubmodelRegistryApi();
6666

67-
private final SubmodelDescriptor DUMMY_DESCRIPTOR = DummySubmodelDescriptorFactory.createDummyDescriptor(DUMMY_SUBMODEL_ID, DUMMY_SUBMODEL_IDSHORT, getSubmodelRepoBaseUrls(), DummySubmodelDescriptorFactory.createSemanticId());
67+
private final SubmodelDescriptor DUMMY_DESCRIPTOR = DummySubmodelDescriptorFactory.createDummyDescriptor(DUMMY_SUBMODEL_ID, DUMMY_SUBMODEL_IDSHORT, DummySubmodelDescriptorFactory.createSemanticId(), getSubmodelRepoBaseUrls());
6868

6969
@Test
7070
public void createSubmodel() throws FileNotFoundException, IOException, ApiException {

0 commit comments

Comments
 (0)