Skip to content

Commit 206690d

Browse files
author
Dennis Labordus
committed
Refactoring and testing added for Websocket solution.
Signed-off-by: Dennis Labordus <[email protected]>
1 parent b36f7f3 commit 206690d

26 files changed

+647
-217
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ SPDX-License-Identifier: Apache-2.0
1414

1515
Service to validate SCL Files.
1616

17+
## Rest and Websockets versions
18+
19+
The validation can be done using both Rest and Websockets as transportation technic.
20+
21+
| Method | URL |
22+
|-----------|-----------------------------------------------------------------------|
23+
| Rest | http(s)://**server-address**/compas-scl-validator/validate/v1/{type} |
24+
| Websocket | ws(s)://**server-address**/compas-scl-validator/validate-ws/v1/{type} |
25+
26+
In CoMPAS OpenSCD there is a switch in the setting to indicate if websockets needs to be used. The logic will
27+
automatically determine the URL to be used.
28+
1729
## Development
1830

1931
For the RiseClipse implementation of the validator parts of the RiseClipse project are being used. Currently, these

app/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ SPDX-License-Identifier: Apache-2.0
6565
<groupId>io.quarkus</groupId>
6666
<artifactId>quarkus-resteasy-jaxb</artifactId>
6767
</dependency>
68+
<dependency>
69+
<groupId>io.quarkus</groupId>
70+
<artifactId>quarkus-resteasy-mutiny</artifactId>
71+
</dependency>
6872
<dependency>
6973
<groupId>io.quarkus</groupId>
7074
<artifactId>quarkus-vertx</artifactId>

app/src/main/java/org/lfenergy/compas/scl/validator/rest/v1/SclValidatorResource.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
package org.lfenergy.compas.scl.validator.rest.v1;
55

66
import io.quarkus.security.Authenticated;
7+
import io.smallrye.mutiny.Uni;
8+
import io.vertx.mutiny.core.eventbus.EventBus;
9+
import io.vertx.mutiny.core.eventbus.Message;
710
import org.lfenergy.compas.scl.extensions.model.SclFileType;
11+
import org.lfenergy.compas.scl.validator.rest.v1.event.SclValidatorEventRequest;
812
import org.lfenergy.compas.scl.validator.rest.v1.model.SclValidateRequest;
913
import org.lfenergy.compas.scl.validator.rest.v1.model.SclValidateResponse;
10-
import org.lfenergy.compas.scl.validator.service.SclValidatorService;
1114

1215
import javax.enterprise.context.RequestScoped;
1316
import javax.inject.Inject;
@@ -21,20 +24,21 @@
2124
@RequestScoped
2225
@Path("/validate/v1/{" + TYPE_PATH_PARAM + "}")
2326
public class SclValidatorResource {
24-
private final SclValidatorService sclValidatorService;
27+
private final EventBus eventBus;
2528

2629
@Inject
27-
public SclValidatorResource(SclValidatorService compasCimMappingService) {
28-
this.sclValidatorService = compasCimMappingService;
30+
public SclValidatorResource(EventBus eventBus) {
31+
this.eventBus = eventBus;
2932
}
3033

3134
@POST
3235
@Consumes(MediaType.APPLICATION_XML)
3336
@Produces(MediaType.APPLICATION_XML)
34-
public SclValidateResponse validateSCL(@PathParam(TYPE_PATH_PARAM) SclFileType type,
35-
@Valid SclValidateRequest request) {
36-
var response = new SclValidateResponse();
37-
response.setValidationErrorList(sclValidatorService.validate(type, request.getSclData()));
38-
return response;
37+
public Uni<SclValidateResponse> validateSCL(@PathParam(TYPE_PATH_PARAM) SclFileType type,
38+
@Valid SclValidateRequest request) {
39+
return eventBus.<SclValidateResponse>request(
40+
"validate-rest",
41+
new SclValidatorEventRequest(type, request.getSclData()))
42+
.onItem().transform(Message::body);
3943
}
4044
}

app/src/main/java/org/lfenergy/compas/scl/validator/rest/v1/AsyncWebsocketResource.java renamed to app/src/main/java/org/lfenergy/compas/scl/validator/rest/v1/SclValidatorServerEndpoint.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@
66
import io.quarkus.security.Authenticated;
77
import io.vertx.mutiny.core.eventbus.EventBus;
88
import org.lfenergy.compas.scl.extensions.model.SclFileType;
9-
import org.lfenergy.compas.scl.validator.rest.v1.event.AsyncWebsocketEventRequest;
9+
import org.lfenergy.compas.scl.validator.rest.v1.event.SclValidatorEventRequest;
1010
import org.lfenergy.compas.scl.validator.rest.v1.model.SclValidateRequest;
11-
import org.lfenergy.compas.scl.validator.rest.v1.websocket.AsyncWebsocketRequestDecoder;
12-
import org.lfenergy.compas.scl.validator.rest.v1.websocket.AsyncWebsocketResponseEncoder;
11+
import org.lfenergy.compas.scl.validator.rest.v1.websocket.SclValidateRequestDecoder;
12+
import org.lfenergy.compas.scl.validator.rest.v1.websocket.SclValidateResponseEncoder;
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
1515

1616
import javax.enterprise.context.ApplicationScoped;
1717
import javax.inject.Inject;
1818
import javax.websocket.OnError;
1919
import javax.websocket.OnMessage;
20+
import javax.websocket.OnOpen;
2021
import javax.websocket.Session;
2122
import javax.websocket.server.PathParam;
2223
import javax.websocket.server.ServerEndpoint;
@@ -27,16 +28,21 @@
2728
@Authenticated
2829
@ApplicationScoped
2930
@ServerEndpoint(value = "/compas-scl-validator/validate-ws/v1/{" + TYPE_PATH_PARAM + "}",
30-
decoders = AsyncWebsocketRequestDecoder.class,
31-
encoders = AsyncWebsocketResponseEncoder.class)
32-
public class AsyncWebsocketResource {
33-
private static final Logger LOGGER = LoggerFactory.getLogger(AsyncWebsocketResource.class);
31+
decoders = SclValidateRequestDecoder.class,
32+
encoders = SclValidateResponseEncoder.class)
33+
public class SclValidatorServerEndpoint {
34+
private static final Logger LOGGER = LoggerFactory.getLogger(SclValidatorServerEndpoint.class);
3435

35-
private final EventBus bus;
36+
private final EventBus eventBus;
3637

3738
@Inject
38-
public AsyncWebsocketResource(EventBus bus) {
39-
this.bus = bus;
39+
public SclValidatorServerEndpoint(EventBus eventBus) {
40+
this.eventBus = eventBus;
41+
}
42+
43+
@OnOpen
44+
public void onOpen(Session session, @PathParam(TYPE_PATH_PARAM) String type) {
45+
LOGGER.debug("Starting session {} for type {}.", session.getId(), type);
4046
}
4147

4248
@OnError
@@ -48,7 +54,7 @@ public void onError(Session session, @PathParam(TYPE_PATH_PARAM) String type, Th
4854
@OnMessage
4955
public void validateSCL(Session session, SclValidateRequest request, @PathParam(TYPE_PATH_PARAM) String type) {
5056
LOGGER.info("Message from session {} for type {}.", session.getId(), type);
51-
bus.send("validate-ws", new AsyncWebsocketEventRequest(
57+
eventBus.send("validate-ws", new SclValidatorEventRequest(
5258
session, SclFileType.valueOf(type), request.getSclData()));
5359
}
5460
}
Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,40 @@
44
package org.lfenergy.compas.scl.validator.rest.v1.event;
55

66
import io.quarkus.vertx.ConsumeEvent;
7+
import io.smallrye.mutiny.Uni;
78
import org.lfenergy.compas.scl.validator.rest.v1.model.SclValidateResponse;
89
import org.lfenergy.compas.scl.validator.service.SclValidatorService;
910

1011
import javax.enterprise.context.ApplicationScoped;
1112
import javax.inject.Inject;
1213
import java.io.IOException;
1314

15+
/**
16+
* Event Handler used by the Websockets implementation to execute the validation asynchronized.
17+
*/
1418
@ApplicationScoped
15-
public class AsyncWebsocketEventHandler {
19+
public class SclValidatorEventHandler {
1620
private final SclValidatorService sclValidatorService;
1721

1822
@Inject
19-
public AsyncWebsocketEventHandler(SclValidatorService sclValidatorService) {
23+
public SclValidatorEventHandler(SclValidatorService sclValidatorService) {
2024
this.sclValidatorService = sclValidatorService;
2125
}
2226

2327
@ConsumeEvent(value = "validate-ws", blocking = true)
24-
public void validateEvent(AsyncWebsocketEventRequest request) throws IOException {
28+
public void validateWebsocketsEvent(SclValidatorEventRequest request) throws IOException {
2529
var response = new SclValidateResponse();
2630
response.setValidationErrorList(sclValidatorService.validate(request.getType(), request.getSclData()));
2731

2832
var session = request.getSession();
2933
session.getAsyncRemote().sendObject(response);
3034
session.close();
3135
}
36+
37+
@ConsumeEvent(value = "validate-rest", blocking = true)
38+
public Uni<SclValidateResponse> validateRestEvent(SclValidatorEventRequest request) {
39+
var response = new SclValidateResponse();
40+
response.setValidationErrorList(sclValidatorService.validate(request.getType(), request.getSclData()));
41+
return Uni.createFrom().item(response);
42+
}
3243
}
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77

88
import javax.websocket.Session;
99

10-
public class AsyncWebsocketEventRequest {
11-
private final Session session;
10+
public class SclValidatorEventRequest {
11+
private Session session;
1212
private final SclFileType type;
1313
private final String sclData;
1414

15-
public AsyncWebsocketEventRequest(Session session, SclFileType type, String sclData) {
15+
public SclValidatorEventRequest(SclFileType type, String sclData) {
16+
this(null, type, sclData);
17+
}
18+
19+
public SclValidatorEventRequest(Session session, SclFileType type, String sclData) {
1620
this.session = session;
1721
this.type = type;
1822
this.sclData = sclData;

app/src/main/java/org/lfenergy/compas/scl/validator/rest/v1/websocket/AsyncWebsocketRequestDecoder.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

app/src/main/java/org/lfenergy/compas/scl/validator/rest/v1/websocket/AsyncWebsocketRequestEncoder.java

Lines changed: 0 additions & 38 deletions
This file was deleted.

app/src/main/java/org/lfenergy/compas/scl/validator/rest/v1/websocket/AsyncWebsocketResponseDecoder.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

app/src/main/java/org/lfenergy/compas/scl/validator/rest/v1/websocket/AsyncWebsocketResponseEncoder.java

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)