Skip to content

Commit 7ff37ba

Browse files
committed
Update Java API with 'skipFileChecks' and 'maxCharsPerCell'
1 parent 7f77b61 commit 7ff37ba

File tree

7 files changed

+377
-35
lines changed

7 files changed

+377
-35
lines changed

README.md

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,35 +41,63 @@ If you wish to use the CSV Validator from your own Java project, we provide a na
4141
<dependency>
4242
<groupId>uk.gov.nationalarchives</groupId>
4343
<artifactId>csv-validator-java-api</artifactId>
44-
<version>1.3.0</version>
44+
<version>1.4.0</version>
4545
</dependency>
4646
```
4747

4848
The Javadoc, can be found in either Maven Central or you can build it locally by executing `mvn javadoc:javadoc`.
4949

5050
Example Java code of using the CSV Validator through the Java API:
5151
```java
52-
Boolean failFast = false;
53-
List<Substitution> pathSubstitutions = new ArrayList<Substitution>();
54-
55-
List<FailMessage> messages = CsvValidator.validate(
56-
"/data/csv/data.csv",
57-
"/data/csv/data-schema.csvs",
58-
failFast,
59-
pathSubstitutions,
60-
true,
61-
false);
52+
Charset csvEncoding = JCharset.forName("UTF-8"); // default is UTF-8
53+
boolean validateCsvEncoding = true;
54+
Charset csvSchemaEncoding = JCharset.forName("UTF-8"); // default is UTF-8
55+
boolean failFast = true; // default is false
56+
List<Substitution> pathSubstitutions = new ArrayList<Substitution>(); // default is any empty ArrayList
57+
boolean enforceCaseSensitivePathChecks = true; // default is false
58+
boolean trace = false; // default is false
59+
ProgressCallback progress; // default is null
60+
boolean skipFileChecks = true; // default is false
61+
int maxCharsPerCell = 8096; // default is 4096
62+
63+
// add a substitution path
64+
pathSubstitutions.add(new Substitution("file://something", "/home/xxx"));
65+
66+
CsvValidator.ValidatorBuilder validateWithStringNames = new CsvValidator.ValidatorBuilder(
67+
"/home/dev/IdeaProjects/csv/csv-validator/csv-validator-core/data.csv",
68+
"/home/dev/IdeaProjects/csv/csv-validator/csv-validator-core/data-schema.csvs"
69+
)
70+
71+
// alternatively, you can pass in Readers for each file
72+
Reader csvReader = new Reader();
73+
Reader csvSchemaReader = new Reader();
74+
CsvValidator.ValidatorBuilder validateWithReaders = new CsvValidator.ValidatorBuilder(
75+
csvReader, csvSchemaReader
76+
)
77+
78+
List<FailMessage> messages = validateWithStringNames
79+
.usingCsvEncoding(csvEncoding, validateCsvEncoding) // should only be `true` if using UTF-8 encoding, otherwise it will throw an exception
80+
.usingCsvSchemaEncoding(csvSchemaEncoding)
81+
.usingFailFast(failFast)
82+
.usingPathSubstitutions(pathSubstitutions)
83+
.usingEnforceCaseSensitivePathChecks(enforceCaseSensitivePathChecks)
84+
.usingTrace(trace)
85+
.usingProgress(progress)
86+
.usingSkipFileChecks(skipFileChecks)
87+
.usingMaxCharsPerCell(maxCharsPerCell)
88+
.runValidation();
6289

6390
if(messages.isEmpty()) {
64-
System.out.println("Completed validation OK");
91+
System.out.println("All worked OK");
6592
} else {
66-
for(FailMessage message : messages) {
67-
if(message instanceof WarningMessage) {
68-
System.out.println("[WARN] " + message.getMessage());
69-
} else {
70-
System.out.println("[ERROR] " + message.getMessage());
71-
}
72-
}
93+
for(FailMessage message : messages) {
94+
if(message instanceof WarningMessage) {
95+
System.out.println("Warning: " + message.getMessage());
96+
} else {
97+
System.out.println("Error: " + message.getMessage());
98+
}
99+
}
100+
}
73101
}
74102
```
75103

csv-validator-java-api/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@
129129
<artifactId>csv-validator-core</artifactId>
130130
<version>${project.version}</version>
131131
</dependency>
132+
<dependency>
133+
<groupId>junit</groupId>
134+
<artifactId>junit</artifactId>
135+
<scope>test</scope>
136+
</dependency>
132137
</dependencies>
133138

134139
</project>

csv-validator-java-api/src/main/java/uk/gov/nationalarchives/csv/validator/api/java/CsvValidator.java

Lines changed: 126 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import java.io.Reader;
1212
import java.nio.charset.Charset;
13+
import java.util.ArrayList;
1314
import java.util.List;
1415
import static uk.gov.nationalarchives.csv.validator.api.CsvValidator$.MODULE$;
1516

@@ -19,18 +20,41 @@
1920
*
2021
* <p> A typical invocation sequence:</p>
2122
* <blockquote><pre>{@code
22-
* Boolean failFast = false;
23-
* List<Substitution> pathSubstitutions = new ArrayList<Substitution>();
23+
* Charset csvEncoding = JCharset.forName("UTF-8"); // default is UTF-8
24+
* Charset csvSchemaEncoding = JCharset.forName("UTF-8"); // default is UTF-8
25+
* boolean failFast = true; // default is false
26+
* List<Substitution> pathSubstitutions = new ArrayList<Substitution>(); // default is any empty ArrayList
27+
* boolean enforceCaseSensitivePathChecks = true; // default is false
28+
* boolean trace = false; // default is false
29+
* ProgressCallback progress; // default is null
30+
* boolean skipFileChecks = true; // default is false
31+
* int maxCharsPerCell = 8096; // default is 4096
2432
*
2533
* //add a substitution path
2634
* pathSubstitutions.add(new Substitution("file://something", "/home/xxx"));
2735
*
28-
* List<FailMessage> messages = CsvValidator.validate(
29-
* "/home/dev/IdeaProjects/csv/csv-validator/csv-validator-core/data.csv",
30-
* "/home/dev/IdeaProjects/csv/csv-validator/csv-validator-core/data-schema.csvs",
31-
* failFast,
32-
* pathSubstitutions,
33-
* true);
36+
* CsvValidator.ValidatorBuilder validateWithStringNames = new CsvValidator.ValidatorBuilder(
37+
* "/home/dev/IdeaProjects/csv/csv-validator/csv-validator-core/data.csv",
38+
* "/home/dev/IdeaProjects/csv/csv-validator/csv-validator-core/data-schema.csvs"
39+
* )
40+
*
41+
* // alternatively, you can pass in Readers for each file
42+
* Reader csvReader = new Reader();
43+
* Reader csvSchemaReader = new Reader();
44+
* CsvValidator.ValidatorBuilder validateWithReaders = new CsvValidator.ValidatorBuilder(
45+
* csvReader, csvSchemaReader
46+
* )
47+
*
48+
* List<FailMessage> messages = validateWithStringNames
49+
* .csvEncoding()
50+
* .csvSchemaEncoding()
51+
* .failFast(failFast)
52+
* .pathSubstitutions(pathSubstitutions)
53+
* .enforceCaseSensitivePathChecks(enforceCaseSensitivePathChecks)
54+
* .trace(trace)
55+
* .progress(progress)
56+
* .skipFileChecks(skipFileChecks)
57+
* .maxCharsPerCell(maxCharsPerCell)
3458
*
3559
* if(messages.isEmpty()) {
3660
* System.out.println("All worked OK");
@@ -63,6 +87,7 @@ public class CsvValidator {
6387
*
6488
* @return empty list of (if there are no errors), or list of error strings.
6589
*/
90+
@Deprecated
6691
public static List<FailMessage> validate(final String csvFilename, final String csvSchemaFilename, final boolean failFast, final List<Substitution> pathSubstitutions, final Boolean enforceCaseSensitivePathChecks, final Boolean trace) {
6792
return validate(csvFilename, MODULE$.DEFAULT_ENCODING(), csvSchemaFilename, MODULE$.DEFAULT_ENCODING(), failFast, pathSubstitutions, enforceCaseSensitivePathChecks, trace);
6893
}
@@ -82,6 +107,7 @@ public static List<FailMessage> validate(final String csvFilename, final String
82107
*
83108
* @return empty list of (if there are no errors), or list of error strings.
84109
*/
110+
@Deprecated
85111
public static List<FailMessage> validate(final String csvFilename, final Charset csvEncoding, final String csvSchemaFilename, final Charset csvSchemaEncoding, final boolean failFast, final List<Substitution> pathSubstitutions, final Boolean enforceCaseSensitivePathChecks, final Boolean trace) {
86112
return CsvValidatorJavaBridge.validate(csvFilename, csvEncoding, csvSchemaFilename, csvSchemaEncoding, failFast, pathSubstitutions, enforceCaseSensitivePathChecks, trace);
87113
}
@@ -104,6 +130,7 @@ public static List<FailMessage> validate(final String csvFilename, final Charset
104130
*
105131
* @return empty list of (if there are no errors), or list of error strings.
106132
*/
133+
@Deprecated
107134
public static List<FailMessage> validate(final String csvFilename, final String csvSchemaFilename, final boolean failFast, final List<Substitution> pathSubstitutions, final Boolean enforceCaseSensitivePathChecks, final Boolean trace, final ProgressCallback progress) {
108135
return validate(csvFilename, MODULE$.DEFAULT_ENCODING(), csvSchemaFilename, MODULE$.DEFAULT_ENCODING(), failFast, pathSubstitutions, enforceCaseSensitivePathChecks, trace, progress);
109136
}
@@ -125,6 +152,7 @@ public static List<FailMessage> validate(final String csvFilename, final String
125152
*
126153
* @return empty list of (if there are no errors), or list of error strings.
127154
*/
155+
@Deprecated
128156
public static List<FailMessage> validate(final String csvFilename, final Charset csvEncoding, final String csvSchemaFilename, final Charset csvSchemaEncoding, final boolean failFast, final List<Substitution> pathSubstitutions, final Boolean enforceCaseSensitivePathChecks, final Boolean trace, final ProgressCallback progress) {
129157
return CsvValidatorJavaBridge.validate(csvFilename, csvEncoding, csvSchemaFilename, csvSchemaEncoding, failFast, pathSubstitutions, enforceCaseSensitivePathChecks, trace, progress);
130158
}
@@ -142,6 +170,7 @@ public static List<FailMessage> validate(final String csvFilename, final Charset
142170
*
143171
* @return empty list of (if there are no errors), or list of error strings.
144172
*/
173+
@Deprecated
145174
public static List<FailMessage> validate(final Reader csvData, final Reader csvSchema, final boolean failFast, final List<Substitution> pathSubstitutions, final Boolean enforceCaseSensitivePathChecks, final Boolean trace) {
146175
return CsvValidatorJavaBridge.validate(csvData, csvSchema, failFast, pathSubstitutions, enforceCaseSensitivePathChecks, trace);
147176
}
@@ -161,8 +190,97 @@ public static List<FailMessage> validate(final Reader csvData, final Reader csvS
161190
*
162191
* @return empty list of (if there are no errors), or list of error strings.
163192
*/
193+
@Deprecated
164194
public static List<FailMessage> validate(final Reader csvData, final Reader csvSchema, final boolean failFast, final List<Substitution> pathSubstitutions, final Boolean enforceCaseSensitivePathChecks, final Boolean trace, final ProgressCallback progress) {
165195
return CsvValidatorJavaBridge.validate(csvData, csvSchema, failFast, pathSubstitutions, enforceCaseSensitivePathChecks, trace, progress);
166196
}
197+
198+
static class ValidatorBuilder {
199+
private String csvFileName;
200+
private String csvSchemaFilename;
201+
private Reader csvReader;
202+
private Reader csvSchemaReader;
203+
private Charset csvEncoding = MODULE$.DEFAULT_ENCODING();
204+
private boolean validateUtf8Encoding = csvEncoding.name().equals("UTF-8");
205+
private Charset csvSchemaEncoding = MODULE$.DEFAULT_ENCODING();
206+
private boolean failFast = false;
207+
private List<Substitution> pathSubstitutions = new ArrayList<>();
208+
private boolean enforceCaseSensitivePathChecks = false;
209+
private boolean trace = false;
210+
private ProgressCallback progress;
211+
private boolean skipFileChecks = false;
212+
private int maxCharsPerCell = 4096;
213+
214+
private boolean textFileValidation = false;
215+
216+
public ValidatorBuilder(String csvFileName, String csvSchemaFilename) {
217+
this.csvFileName = csvFileName;
218+
this.csvSchemaFilename = csvSchemaFilename;
219+
this.textFileValidation = true;
220+
}
221+
222+
public ValidatorBuilder(Reader csvReader, Reader csvSchemaReader) {
223+
this.csvReader = csvReader;
224+
this.csvSchemaReader = csvSchemaReader;
225+
}
226+
227+
public ValidatorBuilder usingCsvEncoding(Charset encoding, boolean validateUtf8Encoding) throws Exception {
228+
if(!encoding.name().equals("UTF-8") && validateUtf8Encoding){
229+
throw new Exception("'validateUtf8Encoding' is set to 'true' but " + encoding.name() + " charset was passed in");
230+
}
231+
232+
this.csvEncoding = encoding;
233+
this.validateUtf8Encoding = validateUtf8Encoding;
234+
return this;
235+
}
236+
237+
public ValidatorBuilder usingCsvSchemaEncoding(Charset schemaEncoding) {
238+
this.csvSchemaEncoding = schemaEncoding;
239+
return this;
240+
}
241+
242+
public ValidatorBuilder usingFailFast(boolean failFast) {
243+
this.failFast = failFast;
244+
return this;
245+
}
246+
247+
public ValidatorBuilder usingPathSubstitutions(List<Substitution> pathSubstitutions) {
248+
this.pathSubstitutions = pathSubstitutions;
249+
return this;
250+
}
251+
252+
public ValidatorBuilder usingEnforceCaseSensitivePathChecks(boolean enforceCaseSensitivePathChecks) {
253+
this.enforceCaseSensitivePathChecks = enforceCaseSensitivePathChecks;
254+
return this;
255+
}
256+
257+
public ValidatorBuilder usingTrace(boolean trace) {
258+
this.trace = trace;
259+
return this;
260+
}
261+
262+
public ValidatorBuilder usingProgress(ProgressCallback progress) {
263+
this.progress = progress;
264+
return this;
265+
}
266+
267+
public ValidatorBuilder usingSkipFileChecks(boolean skipFileChecks) {
268+
this.skipFileChecks = skipFileChecks;
269+
return this;
270+
}
271+
272+
public ValidatorBuilder usingMaxCharsPerCell(int maxCharsPerCell) {
273+
this.maxCharsPerCell = maxCharsPerCell;
274+
return this;
275+
}
276+
277+
public Result runValidation() {
278+
if(textFileValidation) {
279+
return CsvValidatorJavaBridge.validate(new CsvValidatorJavaBridge.ValidationRequest(this.csvFileName, this.csvEncoding, this.validateUtf8Encoding, this.csvSchemaFilename, this.csvSchemaEncoding, true, this.failFast, this.pathSubstitutions, this.enforceCaseSensitivePathChecks, this.trace, this.progress, this.skipFileChecks, this.maxCharsPerCell));
280+
} else {
281+
return CsvValidatorJavaBridge.validate(new CsvValidatorJavaBridge.ReaderValidationRequest(this.csvReader, this.csvSchemaReader, this.failFast, this.pathSubstitutions, this.enforceCaseSensitivePathChecks, this.trace, this.progress, this.skipFileChecks, this.maxCharsPerCell));
282+
}
283+
}
284+
}
167285
}
168286

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) 2013, The National Archives <[email protected]>
3+
* https://www.nationalarchives.gov.uk
4+
*
5+
* This Source Code Form is subject to the terms of the Mozilla Public
6+
* License, v. 2.0. If a copy of the MPL was not distributed with this
7+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
8+
*/
9+
package uk.gov.nationalarchives.csv.validator.api.java;
10+
11+
import java.util.ArrayList;
12+
13+
public interface Request {
14+
boolean failFast = false;
15+
ArrayList<Substitution> pathSubstitutionsList = new ArrayList<>();
16+
boolean enforceCaseSensitivePathChecks = false;
17+
boolean trace = false;
18+
ProgressCallback progress = null;
19+
boolean skipFileChecks = false;
20+
int maxCharsPerCellLimit = 4096;
21+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (c) 2013, The National Archives <[email protected]>
3+
* https://www.nationalarchives.gov.uk
4+
*
5+
* This Source Code Form is subject to the terms of the Mozilla Public
6+
* License, v. 2.0. If a copy of the MPL was not distributed with this
7+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
8+
*/
9+
package uk.gov.nationalarchives.csv.validator.api.java;
10+
11+
import java.util.ArrayList;
12+
13+
public interface Result {
14+
ArrayList<FailMessage> errors = new ArrayList<>();
15+
Request validatorRequest = null;
16+
}

0 commit comments

Comments
 (0)