Skip to content

Commit a4807b5

Browse files
authored
Merge pull request #102 from com-pas/process-riseclipse-messages
Updated processing RiseClipse validation message to update ValidationError Response
2 parents b3dbbae + 86e44cb commit a4807b5

File tree

6 files changed

+157
-27
lines changed

6 files changed

+157
-27
lines changed

app/src/test/java/org/lfenergy/compas/scl/validator/rest/v1/websocket/SclValidateResponseEncoderTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,26 @@ void init() {
2828
@Test
2929
void encode_WhenCalledWithRequest_ThenRequestConvertedToString() {
3030
var validationMessage = "Some Validation Message";
31+
var ruleName = "Rule Name 1";
32+
var linenumber = 15;
33+
3134
var request = new SclValidateResponse();
3235
request.setValidationErrorList(new ArrayList<>());
3336
var validationError = new ValidationError();
3437
validationError.setMessage(validationMessage);
38+
validationError.setRuleName(ruleName);
39+
validationError.setLinenumber(linenumber);
3540
request.getValidationErrorList().add(validationError);
3641

3742
var result = encoder.encode(request);
3843

3944
var expectedResult = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
4045
"<svs:SclValidateResponse xmlns:svs=\"" + SCL_VALIDATOR_SERVICE_V1_NS_URI + "\">" +
41-
"<svs:ValidationErrors><svs:Message>" + validationMessage + "</svs:Message></svs:ValidationErrors>" +
46+
"<svs:ValidationErrors>" +
47+
"<svs:Message>" + validationMessage + "</svs:Message>" +
48+
"<svs:RuleName>" + ruleName + "</svs:RuleName>" +
49+
"<svs:Linenumber>" + linenumber + "</svs:Linenumber>" +
50+
"</svs:ValidationErrors>" +
4251
"</svs:SclValidateResponse>";
4352
assertNotNull(result);
4453
assertEquals(expectedResult, result);

riseclipse/validator-riseclipse/src/main/java/org/lfenergy/compas/scl/validator/impl/SclRiseClipseValidator.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import java.util.ArrayList;
2626
import java.util.List;
2727

28-
import static org.lfenergy.compas.scl.validator.util.MessageUtil.cleanupMessage;
28+
import static org.lfenergy.compas.scl.validator.util.MessageUtil.createValidationError;
2929

3030
public class SclRiseClipseValidator implements SclValidator {
3131
private static final Logger LOGGER = LoggerFactory.getLogger(SclRiseClipseValidator.class);
@@ -77,12 +77,16 @@ public List<ValidationError> validate(SclFileType type, String sclData) {
7777
private void processDiagnostic(Diagnostic diagnostic, List<ValidationError> validationErrors) {
7878
// If there are children in the diagnostic there are validation errors to be processed.
7979
for (Diagnostic childDiagnostic : diagnostic.getChildren()) {
80-
var validationError = new ValidationError();
81-
validationErrors.add(validationError);
82-
83-
String message = cleanupMessage(childDiagnostic.getMessage());
84-
validationError.setMessage(message);
85-
LOGGER.debug("SCL Validation Error '{}'", message);
80+
var validationError = createValidationError(childDiagnostic.getMessage());
81+
if (validationError.isPresent()) {
82+
validationErrors.add(validationError.get());
83+
if (LOGGER.isDebugEnabled()) {
84+
LOGGER.debug("SCL Validation Error '{}' from Rule '{}' (Linenumber {})",
85+
validationError.get().getMessage(),
86+
validationError.get().getRuleName(),
87+
validationError.get().getLinenumber());
88+
}
89+
}
8690

8791
// Also process the children of the children.
8892
processDiagnostic(childDiagnostic, validationErrors);

riseclipse/validator-riseclipse/src/main/java/org/lfenergy/compas/scl/validator/util/MessageUtil.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,46 @@
33
// SPDX-License-Identifier: Apache-2.0
44
package org.lfenergy.compas.scl.validator.util;
55

6+
import org.lfenergy.compas.scl.validator.model.ValidationError;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import java.util.Optional;
11+
612
public class MessageUtil {
13+
private static final Logger LOGGER = LoggerFactory.getLogger(MessageUtil.class);
14+
715
MessageUtil() {
816
throw new UnsupportedOperationException("MessageUtil class");
917
}
1018

11-
public static String cleanupMessage(String message) {
12-
String cleanedMessage = message;
13-
if (cleanedMessage != null
14-
&& cleanedMessage.toUpperCase().startsWith("ERROR;")) {
15-
cleanedMessage = cleanedMessage.substring(6);
19+
public static Optional<ValidationError> createValidationError(String message) {
20+
if (message == null || message.isBlank()) {
21+
return Optional.empty();
1622
}
17-
return cleanedMessage;
23+
24+
var validationError = new ValidationError();
25+
var messageParts = message.split(";");
26+
if (messageParts.length == 5) {
27+
// The expected number of parts is found, the message and rule are set as-is, the linenumber is converted
28+
// to a Long value,
29+
validationError.setRuleName(messageParts[1]);
30+
validationError.setMessage(messageParts[4]);
31+
32+
try {
33+
validationError.setLinenumber(Long.parseLong(messageParts[3]));
34+
} catch (NumberFormatException exp) {
35+
validationError.setLinenumber(-1);
36+
LOGGER.debug("Invalid linenumber '{}' found", messageParts[3], exp);
37+
}
38+
} else if (messageParts.length == 2) {
39+
// It seems like an old message that starts with 'ERROR;', so only set the second part as Message
40+
validationError.setMessage(messageParts[1]);
41+
} else {
42+
// If we can split it correctly, just put the message as-is to the response.
43+
validationError.setMessage(message);
44+
}
45+
46+
return Optional.of(validationError);
1847
}
1948
}

riseclipse/validator-riseclipse/src/test/java/org/lfenergy/compas/scl/validator/impl/SclRiseClipseValidatorTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,11 @@ void validate_WhenCalled_ThenExpectedValidationErrorsReturned() throws IOExcepti
3232

3333
assertNotNull(result);
3434
assertEquals(15, result.size());
35+
36+
// Check if parsing of the message is still working.
37+
var firstMessage = result.get(0);
38+
assertNotNull(firstMessage.getRuleName());
39+
assertNotNull(firstMessage.getMessage());
40+
assertTrue(firstMessage.getLinenumber() > 0);
3541
}
3642
}

riseclipse/validator-riseclipse/src/test/java/org/lfenergy/compas/scl/validator/util/MessageUtilTest.java

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.junit.jupiter.api.Test;
77

88
import static org.junit.jupiter.api.Assertions.*;
9-
import static org.lfenergy.compas.scl.validator.util.MessageUtil.cleanupMessage;
9+
import static org.lfenergy.compas.scl.validator.util.MessageUtil.createValidationError;
1010

1111
class MessageUtilTest {
1212
@Test
@@ -15,27 +15,81 @@ void constructor_WhenConstructorCalled_ThenShouldThrowExceptionCauseForbidden()
1515
}
1616

1717
@Test
18-
void cleanupMessage_WhenCalledWithNullMessage_ThenNullIsReturned() {
19-
var result = cleanupMessage(null);
18+
void createValidationError_WhenCalledNullPassed_ThenEmptyOptionalReturned() {
19+
var result = createValidationError(null);
2020

21-
assertNull(result);
21+
assertNotNull(result);
22+
assertTrue(result.isEmpty());
2223
}
2324

2425
@Test
25-
void cleanupMessage_WhenCalledWithAlreadyCleanMessage_ThenSameMessageIsReturned() {
26-
var expectedMessage = "Some validation message";
26+
void createValidationError_WhenCalledBlankStringPassed_ThenEmptyOptionalReturned() {
27+
var result = createValidationError("");
2728

28-
var result = cleanupMessage(expectedMessage);
29+
assertNotNull(result);
30+
assertTrue(result.isEmpty());
31+
}
32+
33+
@Test
34+
void createValidationError_WhenCalledWithoutParts_ThenSameMessageReturned() {
35+
var message = "Just some message";
36+
37+
var result = createValidationError(message);
38+
39+
assertNotNull(result);
40+
assertFalse(result.isEmpty());
41+
42+
var validationError = result.get();
43+
assertNull(validationError.getRuleName());
44+
assertEquals(0, validationError.getLinenumber());
45+
assertEquals(message, validationError.getMessage());
46+
}
47+
48+
@Test
49+
void createValidationError_WhenCalledWithTooManyParts_ThenSameMessageReturned() {
50+
var message = "ERROR;Part1;Part2;Part3;Part4;Just some message";
2951

30-
assertEquals(expectedMessage, result);
52+
var result = createValidationError(message);
53+
54+
assertNotNull(result);
55+
assertFalse(result.isEmpty());
56+
57+
var validationError = result.get();
58+
assertNull(validationError.getRuleName());
59+
assertEquals(0, validationError.getLinenumber());
60+
assertEquals(message, validationError.getMessage());
3161
}
3262

3363
@Test
34-
void cleanupMessage_WhenCalledWithMessageThatStartWithError_ThenCleanedMessageIsReturned() {
35-
var expectedMessage = "Some validation message";
64+
void createValidationError_WhenCalledWithCorrectMessage_ThenConvertValidationErrorReturned() {
65+
var message = "AnyLN (lnType=LN2) does not refer an existing LNodeType in DataTypeTemplates section";
66+
var ruleName = "OCL/SemanticConstraints/AnyLN_RefersToLNodeType";
67+
var linenumber = (long) 9;
68+
69+
var result = createValidationError("ERROR;" + ruleName + ";scl-file.scd;" + linenumber + ";" + message);
70+
71+
assertNotNull(result);
72+
assertFalse(result.isEmpty());
73+
74+
var validationError = result.get();
75+
assertEquals(ruleName, validationError.getRuleName());
76+
assertEquals(linenumber, validationError.getLinenumber());
77+
assertEquals(message, validationError.getMessage());
78+
}
79+
80+
@Test
81+
void createValidationError_WhenCalledWithInvalidLinenumber_ThenNegativeLinenumberReturned() {
82+
var message = "AnyLN (lnType=LN2) does not refer an existing LNodeType in DataTypeTemplates section";
83+
var ruleName = "OCL/SemanticConstraints/AnyLN_RefersToLNodeType";
84+
85+
var result = createValidationError("ERROR;" + ruleName + ";scl-file.scd;INVALID_LINENUMBER;" + message);
3686

37-
var result = cleanupMessage("ERROR;" + expectedMessage);
87+
assertNotNull(result);
88+
assertFalse(result.isEmpty());
3889

39-
assertEquals(expectedMessage, result);
90+
var validationError = result.get();
91+
assertEquals(ruleName, validationError.getRuleName());
92+
assertEquals(-1, validationError.getLinenumber());
93+
assertEquals(message, validationError.getMessage());
4094
}
4195
}

validator/src/main/java/org/lfenergy/compas/scl/validator/model/ValidationError.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,45 @@
1515
@XmlAccessorType(XmlAccessType.FIELD)
1616
public class ValidationError {
1717
@Schema(description = "The message of the validation error that occurred.",
18-
example = "ERROR:[SemanticConstraints] Terminal (name=T1) (line 27) does not refer an existing ConnectivityNode")
18+
example = "Terminal (name=T1) (line 27) does not refer an existing ConnectivityNode")
1919
@XmlElement(name = "Message",
2020
namespace = SCL_VALIDATOR_SERVICE_V1_NS_URI,
2121
required = true)
2222
private String message;
2323

24+
@Schema(description = "The name of the rule in RiseClipse that created the validation error",
25+
example = "SemanticConstraints")
26+
@XmlElement(name = "RuleName",
27+
namespace = SCL_VALIDATOR_SERVICE_V1_NS_URI)
28+
private String ruleName;
29+
30+
@Schema(description = "The linenumber in the SCL file where the validation error occurred",
31+
example = "9")
32+
@XmlElement(name = "Linenumber",
33+
namespace = SCL_VALIDATOR_SERVICE_V1_NS_URI)
34+
private long linenumber;
35+
2436
public String getMessage() {
2537
return message;
2638
}
2739

2840
public void setMessage(String message) {
2941
this.message = message;
3042
}
43+
44+
public String getRuleName() {
45+
return ruleName;
46+
}
47+
48+
public void setRuleName(String ruleName) {
49+
this.ruleName = ruleName;
50+
}
51+
52+
public long getLinenumber() {
53+
return linenumber;
54+
}
55+
56+
public void setLinenumber(long linenumber) {
57+
this.linenumber = linenumber;
58+
}
3159
}

0 commit comments

Comments
 (0)