Skip to content

Commit 5a9b1b4

Browse files
author
Dennis Labordus
committed
Changed the way XSD Message are processed. Trying to extract rule from message.
Signed-off-by: Dennis Labordus <[email protected]>
1 parent e2e811b commit 5a9b1b4

File tree

3 files changed

+96
-4
lines changed

3 files changed

+96
-4
lines changed

validator/src/main/java/org/lfenergy/compas/scl/validator/xsd/XSDErrorHandler.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
public class XSDErrorHandler implements ErrorHandler {
1515
private static final Logger LOGGER = LoggerFactory.getLogger(XSDErrorHandler.class);
1616

17+
public static final String DEFAULT_PREFIX = "XSD/";
18+
public static final String DEFAULT_RULE_NAME = DEFAULT_PREFIX + "general";
19+
1720
private List<ValidationError> errorList;
1821

1922
public XSDErrorHandler(List<ValidationError> errorList) {
@@ -55,10 +58,39 @@ public void fatalError(SAXParseException exception) {
5558

5659
private ValidationError createValidationError(SAXParseException exception) {
5760
var validationError = new ValidationError();
58-
validationError.setMessage(exception.getMessage());
59-
validationError.setRuleName("XSD validation");
61+
var xsdMessage = exception.getMessage();
62+
validationError.setMessage(getMessage(xsdMessage));
63+
validationError.setRuleName(getRuleName(xsdMessage));
6064
validationError.setLinenumber(exception.getLineNumber());
6165
validationError.setColumnNumber(exception.getColumnNumber());
6266
return validationError;
6367
}
68+
69+
String getRuleName(String xsdMessage) {
70+
var ruleName = DEFAULT_RULE_NAME;
71+
if (xsdMessage != null && !xsdMessage.isBlank()) {
72+
int endIndex = xsdMessage.indexOf(':');
73+
if (endIndex > 0) {
74+
var tmpRuleName = xsdMessage.substring(0, endIndex);
75+
if (!tmpRuleName.contains(" ")) {
76+
ruleName = "XSD/" + tmpRuleName;
77+
}
78+
}
79+
}
80+
return ruleName;
81+
}
82+
83+
String getMessage(String xsdMessage) {
84+
var message = xsdMessage;
85+
if (message != null && !message.isBlank()) {
86+
int endIndex = message.indexOf(':');
87+
if (endIndex > 0) {
88+
var tmpRuleName = xsdMessage.substring(0, endIndex);
89+
if (!tmpRuleName.contains(" ")) {
90+
message = message.substring(endIndex + 1).trim();
91+
}
92+
}
93+
}
94+
return message;
95+
}
6496
}

validator/src/test/java/org/lfenergy/compas/scl/validator/xsd/XSDErrorHandlerTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.util.List;
1212

1313
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.lfenergy.compas.scl.validator.xsd.XSDErrorHandler.DEFAULT_PREFIX;
15+
import static org.lfenergy.compas.scl.validator.xsd.XSDErrorHandler.DEFAULT_RULE_NAME;
1416

1517
class XSDErrorHandlerTest {
1618
private List<ValidationError> errorList = new ArrayList<>();
@@ -57,4 +59,62 @@ private void assertValidationError(ValidationError validationError, String messa
5759
assertEquals(linenumber, validationError.getLinenumber());
5860
assertEquals(columnNumber, validationError.getColumnNumber());
5961
}
62+
63+
@Test
64+
void getRuleName_WhenXSDMessageContainsNoRule_ThenDefaultXSDRuleNameReturned() {
65+
var xsdMessage = "Duplicate match in scope for field \"depth\"";
66+
67+
var ruleName = handler.getRuleName(xsdMessage);
68+
69+
assertEquals(DEFAULT_RULE_NAME, ruleName);
70+
}
71+
72+
@Test
73+
void getRuleName_WhenXSDMessageContainsRuleWithSpaces_ThenDefaultXSDRuleNameReturned() {
74+
var xsdMessage = "SOME SPACES RULE: Duplicate match in scope for field \"depth\"";
75+
76+
var ruleName = handler.getRuleName(xsdMessage);
77+
78+
assertEquals(DEFAULT_RULE_NAME, ruleName);
79+
}
80+
81+
@Test
82+
void getRuleName_WhenXSDMessageContainsRule_ThenRuleNameReturned() {
83+
var expectedRuleName = "cvc-complex-type.2.1";
84+
var xsdMessage = expectedRuleName + ": Element 'depth' must have no character or element information " +
85+
"item [children], because the type's content type is empty.";
86+
87+
var ruleName = handler.getRuleName(xsdMessage);
88+
89+
assertEquals(DEFAULT_PREFIX + expectedRuleName, ruleName);
90+
}
91+
92+
@Test
93+
void getMessage_WhenXSDMessageContainsNoRule_ThenOriginalMessageReturned() {
94+
var xsdMessage = "Duplicate match in scope for field \"depth\"";
95+
96+
var message = handler.getMessage(xsdMessage);
97+
98+
assertEquals(xsdMessage, message);
99+
}
100+
101+
@Test
102+
void getMessage_WhenXSDMessageContainsRuleWithSpaces_ThenOriginalMessageReturned() {
103+
var xsdMessage = "SOME SPACES RULE: Duplicate match in scope for field \"depth\"";
104+
105+
var message = handler.getMessage(xsdMessage);
106+
107+
assertEquals(xsdMessage, message);
108+
}
109+
110+
@Test
111+
void getMessage_WhenXSDMessageContainsRule_ThenRuleNameIsStrippedFromMessage() {
112+
var ruleName = "cvc-complex-type.2.1";
113+
var expectedMessage = "Element 'depth' must have no character or element information item [children], " +
114+
"because the type's content type is empty.";
115+
116+
var message = handler.getMessage(ruleName + ": " + expectedMessage);
117+
118+
assertEquals(expectedMessage, message);
119+
}
60120
}

validator/src/test/java/org/lfenergy/compas/scl/validator/xsd/XSDValidatorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ void validate_WhenCalledWithSclDataWithXsdValidationErrors_ThenErrorsAreRetrieve
3939
assertEquals(4, errorList.size());
4040

4141
var error = errorList.get(2);
42-
assertEquals("cvc-complex-type.4: Attribute 'name' must appear on element 'BDA'.", error.getMessage());
43-
assertEquals("XSD validation", error.getRuleName());
42+
assertEquals("Attribute 'name' must appear on element 'BDA'.", error.getMessage());
43+
assertEquals("XSD/cvc-complex-type.4", error.getRuleName());
4444
assertEquals(66, error.getLinenumber());
4545
assertEquals(45, error.getColumnNumber());
4646
}

0 commit comments

Comments
 (0)