Skip to content

Commit 4ffa16e

Browse files
author
Rob Tjalma
authored
Merge pull request #40 from com-pas/add-xsd-validation
Add XSD Validation
2 parents 300af5b + 72d0a0d commit 4ffa16e

File tree

26 files changed

+1154
-15
lines changed

26 files changed

+1154
-15
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import io.quarkus.runtime.Startup;
77
import org.lfenergy.compas.core.commons.ElementConverter;
8+
import org.lfenergy.compas.scl.validator.xsd.SclXsdValidator;
89
import org.lfenergy.compas.scl.validator.collector.CompasOclFileCollector;
910
import org.lfenergy.compas.scl.validator.collector.OclFileCollector;
1011
import org.lfenergy.compas.scl.validator.common.NsdocFinder;
@@ -37,6 +38,11 @@ public SclRiseClipseValidator createSclRiseClipseValidator(OclFileCollector oclF
3738
}
3839

3940
@Produces
41+
@ApplicationScoped
42+
public SclXsdValidator createSclXsdValidator() {
43+
return new SclXsdValidator();
44+
}
45+
4046
@Startup
4147
@ApplicationScoped
4248
public NsdocFinder createNsdocFinder(ValidatorProperties properties) {

app/src/test/java/org/lfenergy/compas/scl/validator/rest/CompasSclValidatorConfigurationTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,19 @@ void createSclRiseClipseValidator_WhenCalled_ThenObjectReturned() {
4545

4646
verify(validatorProperties, times(1)).tempDirectory();
4747
}
48+
49+
@Test
50+
void createSclXsdValidator_WhenCalled_ThenObjectReturned() {
51+
assertNotNull(new CompasSclValidatorConfiguration().createSclXsdValidator());
52+
}
53+
54+
@Test
55+
void createNsdocFinder_WhenCalled_ThenObjectReturned() {
56+
when(validatorProperties.nsdocDirectory()).thenReturn("./target/nsodcdir");
57+
58+
assertNotNull(new CompasSclValidatorConfiguration().createNsdocFinder(
59+
validatorProperties));
60+
61+
verify(validatorProperties, times(1)).nsdocDirectory();
62+
}
4863
}

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ SPDX-License-Identifier: Apache-2.0
2424
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
2525
<sonarqube-plugin.version>3.2.0</sonarqube-plugin.version>
2626

27+
<compas.scl.xsd.version>0.0.4</compas.scl.xsd.version>
2728
<compas.core.version>0.8.0</compas.core.version>
2829

2930
<quarkus.platform.version>2.7.5.Final</quarkus.platform.version>
@@ -67,6 +68,12 @@ SPDX-License-Identifier: Apache-2.0
6768
<scope>import</scope>
6869
</dependency>
6970

71+
<dependency>
72+
<groupId>org.lfenergy.compas.xsd</groupId>
73+
<artifactId>compas-scl-xsd</artifactId>
74+
<version>${compas.scl.xsd.version}</version>
75+
</dependency>
76+
7077
<dependency>
7178
<groupId>org.lfenergy.compas.scl.validator</groupId>
7279
<artifactId>service</artifactId>

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.lfenergy.compas.scl.validator.util.OclUtil;
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
23-
2423
import java.nio.file.Path;
2524
import java.util.ArrayList;
2625
import java.util.List;

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
import java.io.IOException;
1212
import java.nio.file.Path;
1313

14-
import static org.junit.jupiter.api.Assertions.assertEquals;
15-
import static org.junit.jupiter.api.Assertions.assertNotNull;
14+
import static org.junit.jupiter.api.Assertions.*;
1615
import static org.lfenergy.compas.scl.validator.util.TestSupportUtil.readSCL;
1716

1817
class SclRiseClipseValidatorTest {

service/src/main/java/org/lfenergy/compas/scl/validator/service/SclValidatorService.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import org.lfenergy.compas.scl.extensions.model.SclFileType;
77
import org.lfenergy.compas.scl.validator.SclValidator;
8+
import org.lfenergy.compas.scl.validator.xsd.SclXsdValidator;
89
import org.lfenergy.compas.scl.validator.model.ValidationError;
910

1011
import javax.enterprise.context.ApplicationScoped;
@@ -14,13 +15,21 @@
1415
@ApplicationScoped
1516
public class SclValidatorService {
1617
private final SclValidator validator;
18+
private final SclXsdValidator xsdValidator;
1719

1820
@Inject
19-
public SclValidatorService(SclValidator validator) {
21+
public SclValidatorService(SclValidator validator, SclXsdValidator xsdValidator) {
2022
this.validator = validator;
23+
this.xsdValidator = xsdValidator;
2124
}
2225

2326
public List<ValidationError> validate(SclFileType type, String sclData) {
24-
return validator.validate(type, sclData);
27+
var errors = xsdValidator.validate(sclData);
28+
29+
if (errors.isEmpty()) {
30+
errors = validator.validate(type, sclData);
31+
}
32+
33+
return errors;
2534
}
2635
}

service/src/test/java/org/lfenergy/compas/scl/validator/service/SclValidatorServiceTest.java

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

6-
import org.junit.jupiter.api.BeforeEach;
76
import org.junit.jupiter.api.Test;
87
import org.junit.jupiter.api.extension.ExtendWith;
98
import org.lfenergy.compas.scl.extensions.model.SclFileType;
109
import org.lfenergy.compas.scl.validator.SclValidator;
10+
import org.lfenergy.compas.scl.validator.xsd.SclXsdValidator;
1111
import org.lfenergy.compas.scl.validator.model.ValidationError;
12+
import org.mockito.InjectMocks;
1213
import org.mockito.Mock;
1314
import org.mockito.junit.jupiter.MockitoExtension;
1415

16+
import java.util.Collections;
1517
import java.util.List;
1618

1719
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -21,28 +23,45 @@
2123
@ExtendWith(MockitoExtension.class)
2224
class SclValidatorServiceTest {
2325

26+
@InjectMocks
2427
private SclValidatorService sclValidatorService;
2528

2629
@Mock
2730
private SclValidator sclValidator;
2831

29-
@BeforeEach
30-
void beforeEach() {
31-
sclValidatorService = new SclValidatorService(sclValidator);
32-
}
32+
@Mock
33+
private SclXsdValidator xsdValidator;
3334

3435
@Test
3536
void validate_WhenCalled_ThenExpectedListReturned() {
3637
var type = SclFileType.CID;
3738
var sclData = "Some String";
3839

3940
when(sclValidator.validate(type, sclData)).thenReturn(List.of(new ValidationError()));
41+
when(xsdValidator.validate(sclData)).thenReturn(Collections.emptyList());
4042

4143
var result = sclValidatorService.validate(type, sclData);
4244

4345
assertNotNull(result);
4446
assertEquals(1, result.size());
4547

4648
verify(sclValidator, times(1)).validate(type, sclData);
49+
verify(xsdValidator, times(1)).validate(sclData);
50+
}
51+
52+
@Test
53+
void validate_WhenXsdErrorsAreReturned_ThenSclValidatorIsNeverCalled() {
54+
var type = SclFileType.CID;
55+
var sclData = "Some String";
56+
57+
when(xsdValidator.validate(sclData)).thenReturn(List.of(new ValidationError()));
58+
59+
var result = sclValidatorService.validate(type, sclData);
60+
61+
assertNotNull(result);
62+
assertEquals(1, result.size());
63+
64+
verify(xsdValidator, times(1)).validate(sclData);
65+
verify(sclValidator, never()).validate(type, sclData);
4766
}
4867
}

validator/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ SPDX-License-Identifier: Apache-2.0
1818
<packaging>jar</packaging>
1919

2020
<dependencies>
21+
<dependency>
22+
<groupId>org.lfenergy.compas.xsd</groupId>
23+
<artifactId>compas-scl-xsd</artifactId>
24+
</dependency>
2125
<dependency>
2226
<groupId>org.lfenergy.compas.core</groupId>
2327
<artifactId>commons</artifactId>

validator/src/main/java/org/lfenergy/compas/scl/validator/exception/SclValidatorErrorCode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class SclValidatorErrorCode {
1010

1111
public static final String NO_SCL_ELEMENT_FOUND_ERROR_CODE = "SVS-0001";
1212
public static final String LOADING_SCL_FILE_ERROR_CODE = "SVS-0002";
13+
public static final String LOADING_XSD_FILE_ERROR_CODE = "SVS-0003";
1314

1415
public static final String LOADING_OCL_FILES_FAILED = "SVS-1001";
1516
public static final String LOADING_CUSTOM_OCL_FILES_FAILED = "SVS-1002";
@@ -19,6 +20,7 @@ public class SclValidatorErrorCode {
1920
public static final String WRITE_TO_OCL_TEMP_FILES_FAILED = "SVS-2003";
2021
public static final String OCL_MODEL_PACKAGE_NOT_FOUND = "SVS-2005";
2122
public static final String NO_URI_PASSED = "SVS-2006";
23+
public static final String RESOURCE_RESOLVER_FAILED = "SVS-2007";
2224

2325
public static final String CALCULATING_CHECKSUM_FAILED = "SVS-3001";
2426
public static final String DETERMINING_ID_FAILED = "SVS-3002";
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// SPDX-FileCopyrightText: 2022 Alliander N.V.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.scl.validator.xsd;
5+
6+
import org.lfenergy.compas.scl.validator.exception.SclValidatorException;
7+
8+
import javax.xml.stream.XMLInputFactory;
9+
import javax.xml.stream.XMLStreamException;
10+
import javax.xml.stream.events.StartElement;
11+
import javax.xml.stream.events.XMLEvent;
12+
import java.io.ByteArrayInputStream;
13+
import java.io.IOException;
14+
import java.nio.charset.StandardCharsets;
15+
16+
import static org.lfenergy.compas.scl.validator.exception.SclValidatorErrorCode.LOADING_SCL_FILE_ERROR_CODE;
17+
import static org.lfenergy.compas.scl.validator.util.StaxUtil.getAttributeValue;
18+
import static org.lfenergy.compas.scl.validator.util.StaxUtil.isElement;
19+
20+
public class SclInfo {
21+
private static final String SCL_ELEMENT_NAME = "SCL";
22+
23+
private String version = null;
24+
private String revision = null;
25+
private String release = null;
26+
27+
public SclInfo(String sclData) {
28+
try (var fis = new ByteArrayInputStream(sclData.getBytes(StandardCharsets.UTF_8))) {
29+
var xmlInputFactory = getXMLInputFactory();
30+
var reader = xmlInputFactory.createXMLEventReader(fis);
31+
32+
while (reader.hasNext()) {
33+
processEvent(reader.nextEvent());
34+
}
35+
} catch (IOException | XMLStreamException exp) {
36+
throw new SclValidatorException(LOADING_SCL_FILE_ERROR_CODE, "Error loading SCL File", exp);
37+
}
38+
}
39+
40+
private void processEvent(XMLEvent nextEvent) {
41+
if (nextEvent.isStartElement()) {
42+
processStartElement(nextEvent.asStartElement());
43+
}
44+
}
45+
46+
private void processStartElement(StartElement element) {
47+
if (isElement(element, SCL_ELEMENT_NAME)) {
48+
version = getAttributeValue(element, "version");
49+
revision = getAttributeValue(element, "revision");
50+
release = getAttributeValue(element, "release");
51+
}
52+
}
53+
54+
private XMLInputFactory getXMLInputFactory() {
55+
var xmlInputFactory = XMLInputFactory.newInstance();
56+
xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
57+
return xmlInputFactory;
58+
}
59+
60+
public String getSclVersion() {
61+
var sclVersion = "";
62+
if (version != null) sclVersion += version;
63+
if (revision != null) sclVersion += revision;
64+
if (release != null) sclVersion += release;
65+
66+
return sclVersion;
67+
}
68+
}

0 commit comments

Comments
 (0)