77import com .univocity .parsers .csv .CsvParserSettings ;
88import java .io .InputStream ;
99import java .util .ArrayList ;
10- import java .util .Collections ;
1110import java .util .List ;
1211import java .util .Optional ;
1312import java .util .stream .Collectors ;
13+ import javax .annotation .Nonnull ;
1414import javax .annotation .Nullable ;
1515import org .mobilitydata .gtfsvalidator .notice .CsvParsingFailedNotice ;
1616import org .mobilitydata .gtfsvalidator .notice .EmptyFileNotice ;
17- import org .mobilitydata .gtfsvalidator .notice .MissingRecommendedFileNotice ;
18- import org .mobilitydata .gtfsvalidator .notice .MissingRequiredFileNotice ;
1917import org .mobilitydata .gtfsvalidator .notice .NoticeContainer ;
2018import org .mobilitydata .gtfsvalidator .parsing .CsvFile ;
2119import org .mobilitydata .gtfsvalidator .parsing .CsvHeader ;
2220import org .mobilitydata .gtfsvalidator .parsing .CsvRow ;
2321import org .mobilitydata .gtfsvalidator .parsing .FieldCache ;
2422import org .mobilitydata .gtfsvalidator .parsing .RowParser ;
25- import org .mobilitydata .gtfsvalidator .validator .FileValidator ;
2623import org .mobilitydata .gtfsvalidator .validator .SingleEntityValidator ;
2724import org .mobilitydata .gtfsvalidator .validator .ValidatorProvider ;
2825import org .mobilitydata .gtfsvalidator .validator .ValidatorUtil ;
2926
30- public final class AnyTableLoader {
27+ /** This class loads csv files specifically. */
28+ public final class CsvFileLoader extends TableLoader {
3129
32- private static final FluentLogger logger = FluentLogger . forEnclosingClass ();
33- private static final List < Class <? extends FileValidator >> singleFileValidatorsWithParsingErrors =
34- new ArrayList <> ();
30+ private CsvFileLoader () {}
31+ // Create the singleton and add a method to obtain it
32+ private static final CsvFileLoader INSTANCE = new CsvFileLoader ();
3533
36- private static final List <Class <? extends SingleEntityValidator >>
37- singleEntityValidatorsWithParsingErrors = new ArrayList <>();
38-
39- public List <Class <? extends FileValidator >> getValidatorsWithParsingErrors () {
40- return Collections .unmodifiableList (singleFileValidatorsWithParsingErrors );
34+ @ Nonnull
35+ public static CsvFileLoader getInstance () {
36+ return INSTANCE ;
4137 }
4238
43- public List <Class <? extends SingleEntityValidator >> getSingleEntityValidatorsWithParsingErrors () {
44- return Collections .unmodifiableList (singleEntityValidatorsWithParsingErrors );
45- }
39+ private final FluentLogger logger = FluentLogger .forEnclosingClass ();
4640
47- public static GtfsTableContainer load (
48- GtfsTableDescriptor tableDescriptor ,
41+ @ Override
42+ public GtfsEntityContainer <?, ?> load (
43+ GtfsFileDescriptor fileDescriptor ,
4944 ValidatorProvider validatorProvider ,
5045 InputStream csvInputStream ,
5146 NoticeContainer noticeContainer ) {
47+ GtfsTableDescriptor tableDescriptor = (GtfsTableDescriptor ) fileDescriptor ;
5248 final String gtfsFilename = tableDescriptor .gtfsFilename ();
5349
5450 CsvFile csvFile ;
@@ -61,22 +57,19 @@ public static GtfsTableContainer load(
6157 csvFile = new CsvFile (csvInputStream , gtfsFilename , settings );
6258 } catch (TextParsingException e ) {
6359 noticeContainer .addValidationNotice (new CsvParsingFailedNotice (gtfsFilename , e ));
64- return tableDescriptor .createContainerForInvalidStatus (
65- GtfsTableContainer .TableStatus .INVALID_HEADERS );
60+ return tableDescriptor .createContainerForInvalidStatus (TableStatus .INVALID_HEADERS );
6661 }
6762 if (csvFile .isEmpty ()) {
6863 noticeContainer .addValidationNotice (new EmptyFileNotice (gtfsFilename ));
69- return tableDescriptor .createContainerForInvalidStatus (
70- GtfsTableContainer .TableStatus .EMPTY_FILE );
64+ return tableDescriptor .createContainerForInvalidStatus (TableStatus .EMPTY_FILE );
7165 }
7266 final CsvHeader header = csvFile .getHeader ();
7367 final ImmutableList <GtfsColumnDescriptor > columnDescriptors = tableDescriptor .getColumns ();
7468 final NoticeContainer headerNotices =
7569 validateHeaders (validatorProvider , gtfsFilename , header , columnDescriptors );
7670 noticeContainer .addAll (headerNotices );
7771 if (headerNotices .hasValidationErrors ()) {
78- return tableDescriptor .createContainerForInvalidStatus (
79- GtfsTableContainer .TableStatus .INVALID_HEADERS );
72+ return tableDescriptor .createContainerForInvalidStatus (TableStatus .INVALID_HEADERS );
8073 }
8174 final int nColumns = columnDescriptors .size ();
8275 final ImmutableMap <String , GtfsFieldLoader > fieldLoadersMap = tableDescriptor .getFieldLoaders ();
@@ -99,8 +92,8 @@ public static GtfsTableContainer load(
9992 final List <GtfsEntity > entities = new ArrayList <>();
10093 boolean hasUnparsableRows = false ;
10194 final List <SingleEntityValidator <GtfsEntity >> singleEntityValidators =
102- validatorProvider . createSingleEntityValidators (
103- tableDescriptor . getEntityClass (), singleEntityValidatorsWithParsingErrors :: add );
95+ createSingleEntityValidators (tableDescriptor . getEntityClass (), validatorProvider );
96+
10497 try {
10598 for (CsvRow row : csvFile ) {
10699 if (row .getRowNumber () % 200000 == 0 ) {
@@ -133,26 +126,23 @@ public static GtfsTableContainer load(
133126 }
134127 } catch (TextParsingException e ) {
135128 noticeContainer .addValidationNotice (new CsvParsingFailedNotice (gtfsFilename , e ));
136- return tableDescriptor .createContainerForInvalidStatus (
137- GtfsTableContainer .TableStatus .UNPARSABLE_ROWS );
129+ return tableDescriptor .createContainerForInvalidStatus (TableStatus .UNPARSABLE_ROWS );
138130 } finally {
139131 logFieldCacheStats (gtfsFilename , fieldCaches , columnDescriptors );
140132 }
141133 if (hasUnparsableRows ) {
142134 logger .atSevere ().log ("Failed to parse some rows in %s" , gtfsFilename );
143- return tableDescriptor .createContainerForInvalidStatus (
144- GtfsTableContainer .TableStatus .UNPARSABLE_ROWS );
135+ return tableDescriptor .createContainerForInvalidStatus (TableStatus .UNPARSABLE_ROWS );
145136 }
146137 GtfsTableContainer table =
147138 tableDescriptor .createContainerForHeaderAndEntities (header , entities , noticeContainer );
139+
148140 ValidatorUtil .invokeSingleFileValidators (
149- validatorProvider .createSingleFileValidators (
150- table , singleFileValidatorsWithParsingErrors ::add ),
151- noticeContainer );
141+ createSingleFileValidators (table , validatorProvider ), noticeContainer );
152142 return table ;
153143 }
154144
155- private static NoticeContainer validateHeaders (
145+ private NoticeContainer validateHeaders (
156146 ValidatorProvider validatorProvider ,
157147 String gtfsFilename ,
158148 CsvHeader header ,
@@ -178,7 +168,7 @@ private static NoticeContainer validateHeaders(
178168 return headerNotices ;
179169 }
180170
181- private static void logFieldCacheStats (
171+ private void logFieldCacheStats (
182172 String gtfsFilename ,
183173 FieldCache [] fieldCaches ,
184174 ImmutableList <GtfsColumnDescriptor > columnDescriptors ) {
@@ -196,25 +186,4 @@ private static void logFieldCacheStats(
196186 }
197187 }
198188 }
199-
200- public static GtfsTableContainer loadMissingFile (
201- GtfsTableDescriptor tableDescriptor ,
202- ValidatorProvider validatorProvider ,
203- NoticeContainer noticeContainer ) {
204- String gtfsFilename = tableDescriptor .gtfsFilename ();
205- GtfsTableContainer table =
206- tableDescriptor .createContainerForInvalidStatus (
207- GtfsTableContainer .TableStatus .MISSING_FILE );
208- if (tableDescriptor .isRecommended ()) {
209- noticeContainer .addValidationNotice (new MissingRecommendedFileNotice (gtfsFilename ));
210- }
211- if (tableDescriptor .isRequired ()) {
212- noticeContainer .addValidationNotice (new MissingRequiredFileNotice (gtfsFilename ));
213- }
214- ValidatorUtil .invokeSingleFileValidators (
215- validatorProvider .createSingleFileValidators (
216- table , singleFileValidatorsWithParsingErrors ::add ),
217- noticeContainer );
218- return table ;
219- }
220189}
0 commit comments