Skip to content

Commit f3b586d

Browse files
authored
Bump aas4j-version from 1.0.2 to 1.0.3 (#565)
* bump: Aas4j to version 1.0.3 * refactor: extract OperationRequest handling to own class * test: add success fields to test results * chore: bump license header year * chore: add todo for async op execution support * fix: todo rel. to aas4j issue in ConnectedAasManager
1 parent 0198595 commit f3b586d

File tree

7 files changed

+92
-52
lines changed

7 files changed

+92
-52
lines changed

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,7 @@ public void createSubmodelInAas(String aasIdentifier, Submodel submodel) {
223223
throw new RegistryHttpRequestException(aasIdentifier, e);
224224
}
225225

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());
226+
Reference smRef = AasUtils.toReference(AasUtils.toReference(shell), submodel, true);
230227

231228
aasRepository.addSubmodelReference(aasIdentifier, smRef);
232229
}

basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import org.eclipse.digitaltwin.basyx.http.pagination.Base64UrlEncodedCursor;
4949
import org.eclipse.digitaltwin.basyx.http.pagination.PagedResult;
5050
import org.eclipse.digitaltwin.basyx.http.pagination.PagedResultPagingMetadata;
51+
import org.eclipse.digitaltwin.basyx.operation.OperationRequestExecutor;
52+
import org.eclipse.digitaltwin.basyx.operation.OperationRequestExecutor.Invokable;
5153
import org.eclipse.digitaltwin.basyx.pagination.GetSubmodelElementsResult;
5254
import org.eclipse.digitaltwin.basyx.submodelrepository.SubmodelRepository;
5355
import org.eclipse.digitaltwin.basyx.submodelrepository.http.pagination.GetSubmodelsResult;
@@ -283,28 +285,12 @@ private ResponseEntity<SubmodelElement> handleSubmodelElementValueNormalGetReque
283285

284286
@Override
285287
public ResponseEntity<OperationResult> invokeOperationSubmodelRepo(Base64UrlEncodedIdentifier submodelIdentifier, String idShortPath, @Valid OperationRequest body, @Valid Boolean async) {
286-
List<OperationVariable> inVars = new ArrayList<>();
287-
inVars.addAll(body.getInputArguments());
288-
inVars.addAll(body.getInoutputArguments());
289288

290-
List<OperationVariable> result = Arrays.asList(repository.invokeOperation(submodelIdentifier.getIdentifier(), idShortPath, inVars.toArray(new OperationVariable[0])));
289+
// TODO: #566 Add async operation execution support to
290+
// SubmodelRepositoryController
291291

292-
List<OperationVariable> outVars = new ArrayList<>(result);
293-
List<OperationVariable> inoutputVars = new ArrayList<>();
294-
295-
if (!body.getInoutputArguments().isEmpty()) {
296-
List<String> inoutputVarsIdShorts = body.getInoutputArguments().stream().map(OperationVariable::getValue).map(SubmodelElement::getIdShort).toList();
297-
298-
inoutputVars = result.stream().filter(opVar -> inoutputVarsIdShorts.contains(opVar.getValue().getIdShort())).toList();
299-
300-
outVars.removeAll(inoutputVars);
301-
}
302-
303-
return ResponseEntity.ok(createOperationResult(outVars, inoutputVars));
304-
}
305-
306-
private OperationResult createOperationResult(List<OperationVariable> outputVars, List<OperationVariable> inoutputVars) {
307-
return new DefaultOperationResult.Builder().outputArguments(outputVars).inoutputArguments(inoutputVars).build();
292+
Invokable invokable = inArgs -> repository.invokeOperation(submodelIdentifier.getIdentifier(), idShortPath, inArgs);
293+
return ResponseEntity.ok(OperationRequestExecutor.executeOperationRequestSynchronously(invokable, body));
308294
}
309295

310296
private String getEncodedCursorFromCursorResult(CursorResult<?> cursorResult) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*******************************************************************************
2+
* Copyright (C) 2024 the Eclipse BaSyx Authors
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining
5+
* a copy of this software and associated documentation files (the
6+
* "Software"), to deal in the Software without restriction, including
7+
* without limitation the rights to use, copy, modify, merge, publish,
8+
* distribute, sublicense, and/or sell copies of the Software, and to
9+
* permit persons to whom the Software is furnished to do so, subject to
10+
* the following conditions:
11+
*
12+
* The above copyright notice and this permission notice shall be
13+
* included in all copies or substantial portions of the Software.
14+
*
15+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20+
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21+
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22+
*
23+
* SPDX-License-Identifier: MIT
24+
******************************************************************************/
25+
26+
package org.eclipse.digitaltwin.basyx.operation;
27+
28+
import java.util.ArrayList;
29+
import java.util.Arrays;
30+
import java.util.List;
31+
32+
import org.eclipse.digitaltwin.aas4j.v3.model.OperationRequest;
33+
import org.eclipse.digitaltwin.aas4j.v3.model.OperationResult;
34+
import org.eclipse.digitaltwin.aas4j.v3.model.OperationVariable;
35+
import org.eclipse.digitaltwin.aas4j.v3.model.SubmodelElement;
36+
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultOperationResult;
37+
38+
/**
39+
* Executes an Operation Request
40+
*
41+
* @author mateusmolina
42+
*/
43+
public class OperationRequestExecutor {
44+
45+
private OperationRequestExecutor() {
46+
}
47+
48+
public static OperationResult executeOperationRequestSynchronously(Invokable invokable, OperationRequest request) {
49+
List<OperationVariable> inVars = new ArrayList<>();
50+
inVars.addAll(request.getInputArguments());
51+
inVars.addAll(request.getInoutputArguments());
52+
53+
List<OperationVariable> result = Arrays.asList(invokable.invoke(inVars.toArray(new OperationVariable[0])));
54+
55+
List<OperationVariable> outVars = new ArrayList<>(result);
56+
List<OperationVariable> inoutputVars = new ArrayList<>();
57+
58+
if (!request.getInoutputArguments().isEmpty()) {
59+
List<String> inoutputVarsIdShorts = request.getInoutputArguments().stream().map(OperationVariable::getValue).map(SubmodelElement::getIdShort).toList();
60+
61+
inoutputVars = result.stream().filter(opVar -> inoutputVarsIdShorts.contains(opVar.getValue().getIdShort())).toList();
62+
63+
outVars.removeAll(inoutputVars);
64+
}
65+
66+
return createSuccessOperationResult(outVars, inoutputVars);
67+
}
68+
69+
private static OperationResult createSuccessOperationResult(List<OperationVariable> outputVars, List<OperationVariable> inoutputVars) {
70+
return new DefaultOperationResult.Builder().success(true).outputArguments(outputVars).inoutputArguments(inoutputVars).build();
71+
}
72+
73+
@FunctionalInterface
74+
public interface Invokable {
75+
OperationVariable[] invoke(OperationVariable[] arguments);
76+
}
77+
78+
}

basyx.submodelservice/basyx.submodelservice-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceHTTPApiController.java

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,12 @@
2727

2828
import java.io.IOException;
2929
import java.io.InputStream;
30-
import java.util.ArrayList;
31-
import java.util.Arrays;
3230
import java.util.List;
3331

3432
import org.eclipse.digitaltwin.aas4j.v3.model.OperationRequest;
3533
import org.eclipse.digitaltwin.aas4j.v3.model.OperationResult;
36-
import org.eclipse.digitaltwin.aas4j.v3.model.OperationVariable;
3734
import org.eclipse.digitaltwin.aas4j.v3.model.Submodel;
3835
import org.eclipse.digitaltwin.aas4j.v3.model.SubmodelElement;
39-
import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultOperationResult;
4036
import org.eclipse.digitaltwin.basyx.core.exceptions.ElementDoesNotExistException;
4137
import org.eclipse.digitaltwin.basyx.core.exceptions.ElementNotAFileException;
4238
import org.eclipse.digitaltwin.basyx.core.exceptions.FileDoesNotExistException;
@@ -45,6 +41,8 @@
4541
import org.eclipse.digitaltwin.basyx.http.pagination.Base64UrlEncodedCursor;
4642
import org.eclipse.digitaltwin.basyx.http.pagination.PagedResult;
4743
import org.eclipse.digitaltwin.basyx.http.pagination.PagedResultPagingMetadata;
44+
import org.eclipse.digitaltwin.basyx.operation.OperationRequestExecutor;
45+
import org.eclipse.digitaltwin.basyx.operation.OperationRequestExecutor.Invokable;
4846
import org.eclipse.digitaltwin.basyx.pagination.GetSubmodelElementsResult;
4947
import org.eclipse.digitaltwin.basyx.serialization.SubmodelMetadataUtil;
5048
import org.eclipse.digitaltwin.basyx.submodelservice.SubmodelService;
@@ -236,30 +234,9 @@ public ResponseEntity<Void> patchSubmodelValueOnly(@Parameter(in = ParameterIn.D
236234
public ResponseEntity<OperationResult> invokeOperation(
237235
@Parameter(in = ParameterIn.PATH, description = "IdShort path to the submodel element (dot-separated)", required = true, schema = @Schema()) @PathVariable("idShortPath") String idShortPath,
238236
@Parameter(in = ParameterIn.DEFAULT, description = "Operation request object", required = true, schema = @Schema()) @Valid @RequestBody OperationRequest body) {
239-
List<OperationVariable> inVars = new ArrayList<>();
240-
inVars.addAll(body.getInputArguments());
241-
inVars.addAll(body.getInoutputArguments());
242237

243-
List<OperationVariable> result = Arrays.asList(service.invokeOperation(idShortPath, inVars.toArray(new OperationVariable[0])));
244-
245-
List<OperationVariable> outVars = new ArrayList<>(result);
246-
List<OperationVariable> inoutputVars = new ArrayList<>();
247-
248-
if (!body.getInoutputArguments().isEmpty()) {
249-
List<String> inoutputVarsIdShorts = body.getInoutputArguments().stream().map(OperationVariable::getValue).map(SubmodelElement::getIdShort).toList();
250-
251-
inoutputVars = result.stream().filter(opVar -> inoutputVarsIdShorts.contains(opVar.getValue().getIdShort())).toList();
252-
253-
outVars.removeAll(inoutputVars);
254-
}
255-
256-
return ResponseEntity.ok(createOperationResult(outVars, inoutputVars));
257-
}
258-
259-
private OperationResult createOperationResult(List<OperationVariable> outputVars, List<OperationVariable> inoutputVars) {
260-
return new DefaultOperationResult.Builder()
261-
.outputArguments(outputVars).inoutputArguments(inoutputVars)
262-
.build();
238+
Invokable invokable = inArgs -> service.invokeOperation(idShortPath, inArgs);
239+
return ResponseEntity.ok(OperationRequestExecutor.executeOperationRequestSynchronously(invokable, body));
263240
}
264241

265242
private String getEncodedCursorFromCursorResult(CursorResult<?> cursorResult) {

basyx.submodelservice/basyx.submodelservice-http/src/test/resources/operation/result-inout.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"success": true,
23
"inoutputArguments": [
34
{
45
"value": {

basyx.submodelservice/basyx.submodelservice-http/src/test/resources/operation/result.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"success": true,
23
"outputArguments": [
34
{
45
"value": {

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
<docker.target.platforms>linux/amd64, linux/arm64, linux/arm/v7</docker.target.platforms>
8080
<docker.host.port>8081</docker.host.port>
8181
<docker.container.port>8081</docker.container.port>
82-
<aas4j-version>1.0.2</aas4j-version>
82+
<aas4j-version>1.0.3</aas4j-version>
8383
</properties>
8484

8585
<pluginRepositories>

0 commit comments

Comments
 (0)