2020
2121package org .entur .gbfs .validator .api .handler ;
2222
23+ import com .google .common .collect .Multimap ;
24+ import com .google .common .collect .MultimapBuilder ;
2325import org .entur .gbfs .validation .GbfsValidator ;
2426import org .entur .gbfs .validation .GbfsValidatorFactory ;
2527import org .entur .gbfs .validation .model .FileValidationError ;
2628import org .entur .gbfs .validation .model .FileValidationResult ;
2729import org .entur .gbfs .validation .model .ValidationResult ;
28- import org .entur .gbfs .validator .api .gen .ValidateOption1ApiDelegate ;
30+ import org .entur .gbfs .validator .api .gen .ValidateApiDelegate ;
31+
2932import org .entur .gbfs .validator .api .model .FileError ;
30- import org .entur .gbfs .validator .api .model .FileLangOption1 ;
31- import org .entur .gbfs .validator .api .model .FileOption1 ;
32- import org .entur .gbfs .validator .api .model .ValidateOption1PostRequest ;
33- import org .entur .gbfs .validator .api .model .ValidationResultOption1 ;
34- import org .entur .gbfs .validator .api .model .ValidationResultOption1Summary ;
35- import org .entur .gbfs .validator .api .model .ValidationResultOption1SummaryFilesInner ;
33+ import org .entur .gbfs .validator .api .model .GbfsFile ;
34+ import org .entur .gbfs .validator .api .model .ValidatePostRequest ;
35+ import org .entur .gbfs .validator .api .model .ValidationResultSummary ;
36+ import org .entur .gbfs .validator .loader .LoadedFile ;
3637import org .entur .gbfs .validator .loader .Loader ;
38+ import org .openapitools .jackson .nullable .JsonNullable ;
3739import org .springframework .http .ResponseEntity ;
3840import org .springframework .stereotype .Service ;
3941
42+ import javax .annotation .Nullable ;
4043import java .io .IOException ;
4144import java .io .InputStream ;
4245import java .util .ArrayList ;
46+ import java .util .HashMap ;
4347import java .util .List ;
4448import java .util .Map ;
4549
4650@ Service
47- public class ValidateApiDelegateHandler implements ValidateOption1ApiDelegate {
51+ public class ValidateApiDelegateHandler implements ValidateApiDelegate {
4852
4953 @ Override
50- public ResponseEntity <ValidationResultOption1 > validateOption1Post ( ValidateOption1PostRequest validateOption1PostRequest ) {
54+ public ResponseEntity <org . entur . gbfs . validator . api . model . ValidationResult > validatePost ( ValidatePostRequest validatePostRequest ) {
5155 Loader loader = new Loader ();
52- Map <String , InputStream > fileMap = null ;
5356 try {
54- fileMap = loader .load (validateOption1PostRequest .getFeedUrl ());
57+ List <LoadedFile > loadedFiles = loader .load (validatePostRequest .getFeedUrl ());
58+
59+ Multimap <String , LoadedFile > fileMap = MultimapBuilder .hashKeys ().arrayListValues ().build ();
60+ for (LoadedFile loadedFile : loadedFiles ) {
61+ fileMap .put (loadedFile .language (), loadedFile );
62+ }
63+
64+ GbfsValidator validator = GbfsValidatorFactory .getGbfsJsonValidator ();
65+
66+ List <org .entur .gbfs .validator .api .model .ValidationResult > results = new ArrayList <>();
67+
68+ fileMap .keySet ().forEach (language -> {
69+ Map <String , InputStream > validatorInputMap = new HashMap <>();
70+ fileMap .get (language ).forEach (file -> validatorInputMap .put (file .fileName (), file .fileContents ()));
71+ results .add (
72+ mapValidationResult (
73+ validator .validate (
74+ validatorInputMap
75+ ),
76+ language
77+ )
78+ );
79+ });
80+
81+
82+ // merge the list of ValidationResult into a single validation result
83+ return ResponseEntity .ok (
84+ mergeValidationResults (results )
85+ );
86+
5587 } catch (IOException e ) {
5688 throw new RuntimeException (e );
5789 }
58- GbfsValidator validator = GbfsValidatorFactory .getGbfsJsonValidator ();
59- return ResponseEntity .ok (
60- mapValidationResult (validator .validate (fileMap ))
61- );
6290 }
6391
64- private ValidationResultOption1 mapValidationResult (ValidationResult validationResult ) {
65- ValidationResultOption1Summary validationResultOption1Summary = new ValidationResultOption1Summary ();
66- validationResultOption1Summary .setValidatorVersion ("2.0.30-SNAPSHOT" ); // TODO inject this value
67- validationResultOption1Summary .setGbfsVersion (validationResult .summary ().version ());
68- validationResultOption1Summary .setFiles (mapFiles (validationResult .files ()));
69- ValidationResultOption1 validationResultOption1 = new ValidationResultOption1 ();
70- validationResultOption1 .setSummary (validationResultOption1Summary );
92+ private org .entur .gbfs .validator .api .model .ValidationResult mergeValidationResults (List <org .entur .gbfs .validator .api .model .ValidationResult > results ) {
93+ org .entur .gbfs .validator .api .model .ValidationResult mergedResult = new org .entur .gbfs .validator .api .model .ValidationResult ();
94+ ValidationResultSummary summary = new ValidationResultSummary ();
95+ summary .setValidatorVersion (results .get (0 ).getSummary ().getValidatorVersion ());
96+ summary .setFiles (new ArrayList <>());
97+ results .forEach (result -> summary .getFiles ().addAll (result .getSummary ().getFiles ()));
98+ mergedResult .setSummary (summary );
99+ return mergedResult ;
100+ }
101+
102+ private org .entur .gbfs .validator .api .model .ValidationResult mapValidationResult (ValidationResult validationResult , @ Nullable String language ) {
103+ ValidationResultSummary validationResultSummary = new ValidationResultSummary ();
104+ validationResultSummary .setValidatorVersion ("2.0.30-SNAPSHOT" ); // TODO inject this value
105+ validationResultSummary .setFiles (mapFiles (validationResult .files (), language ));
106+ org .entur .gbfs .validator .api .model .ValidationResult validationResultOption1 = new org .entur .gbfs .validator .api .model .ValidationResult ();
107+ validationResultOption1 .setSummary (validationResultSummary );
71108 return validationResultOption1 ;
72109 }
73110
74- private List <ValidationResultOption1SummaryFilesInner > mapFiles (Map <String , FileValidationResult > files ) {
75- List <ValidationResultOption1SummaryFilesInner > summaryFiles = new ArrayList <>();
76- files .entrySet ().stream ().forEach (entry -> {
111+ private List <GbfsFile > mapFiles (Map <String , FileValidationResult > files , @ Nullable String language ) {
112+ return files .entrySet ().stream ().map (entry -> {
77113 String fileName = entry .getKey ();
78114 FileValidationResult fileValidationResult = entry .getValue ();
79115
80- FileLangOption1 filesInner = new FileLangOption1 ();
81- filesInner .setName (fileName );
82- filesInner .setExists (fileValidationResult .exists ());
83- filesInner .setRequired (fileValidationResult .required ());
84- //filesInner.setRecommended(); // TODO not available
85- filesInner .setSchema (fileValidationResult .schema ());
86- filesInner .setVersion (fileValidationResult .version ());
87-
88- FileOption1 file = new FileOption1 ();
89- file .exists (fileValidationResult .exists ());
90- file .errors (
91- mapFileErrors (fileValidationResult .errors ())
92- );
93- file .fileContent (fileValidationResult .fileContents ());
94-
95-
96- filesInner .setFiles (
97- List .of (file )
98- );
99- summaryFiles .add (filesInner );
100- });
101- return summaryFiles ;
116+ GbfsFile file = new GbfsFile ();
117+ file .setName (fileName );
118+ //file.setUrl(); // TODO must be carried from loader
119+ file .setSchema (fileValidationResult .schema ());
120+ file .setVersion (fileValidationResult .version ());
121+ file .setLanguage (JsonNullable .of (language ));
122+ file .setErrors (mapFileErrors (fileValidationResult .errors ()));
123+ return file ;
124+ }).toList ();
125+
102126 }
103127
104128 private List <FileError > mapFileErrors (List <FileValidationError > errors ) {
@@ -108,7 +132,7 @@ private List<FileError> mapFileErrors(List<FileValidationError> errors) {
108132 mapped .setInstancePath (error .violationPath ());
109133 mapped .setSchemaPath (error .schemaPath ());
110134 //mapped.setParams(error.); // TODO no source?
111- //mapped.setKeyword(error.); // TODO no source?
135+ //mapped.setKeyword(error.); // TODO get from source
112136 return mapped ;
113137 }).toList ();
114138 }
0 commit comments