@@ -258,17 +258,21 @@ private void handleSampleOption(Path samplePath, JobProto.Job.Builder jobBuilder
258258 }
259259
260260 private void handleAnalysisOption (Path analysisPath , JobProto .Job .Builder jobBuilder ) {
261- boolean isLegacyAnalysis = false ;
262- try {
263- JobProto .Job job = JobReader .readJob (analysisPath );
264- jobBuilder .clear ().mergeFrom (job );
265- isLegacyAnalysis = true ;
266- logger .debug ("{} is a legacy analysis format" , analysisPath );
267- } catch (IllegalArgumentException e ) {
268- // not a legacy analysis job
269- }
270- if (!isLegacyAnalysis ) {
271- jobBuilder .setAnalysis (readAnalysis (analysisPath ));
261+ AnalysisProto .Analysis analysis = readAnalysis (analysisPath );
262+ if (!AnalysisProto .Analysis .getDefaultInstance ().equals (analysis )) {
263+ logger .debug ("New analysis format file {} {}" , analysisPath , analysis );
264+ jobBuilder .setAnalysis (analysis );
265+ } else {
266+ try {
267+ JobProto .Job job = JobReader .readJob (analysisPath );
268+ if (job .hasSample () || job .hasPhenopacket () || job .hasFamily ()) {
269+ logger .info ("{} is a legacy analysis format" , analysisPath );
270+ jobBuilder .clear ().mergeFrom (job );
271+ }
272+ } catch (IllegalArgumentException e ) {
273+ // not a legacy analysis job
274+ logger .error ("{}" , e .getMessage ());
275+ }
272276 }
273277 }
274278
@@ -380,55 +384,66 @@ private void handleOutputFileNameOption(String outputFileNameOptionValue, JobPro
380384 }
381385
382386 private AnalysisProto .Analysis readAnalysis (Path analysisPath ) {
383- AnalysisProto .Analysis analysis = tryParseJsonOrYaml (AnalysisProto .Analysis .newBuilder (), analysisPath )
384- .build ();
385- if (analysis .equals (AnalysisProto .Analysis .getDefaultInstance ())) {
386- throw new IllegalArgumentException ("Unable to parse analysis from file " + analysisPath + " please check the format" );
387+ var parseResult = tryParseJsonOrYaml (AnalysisProto .Analysis .newBuilder (), analysisPath );
388+ if (parseResult .isErr ()) {
389+ throw new IllegalArgumentException ("Unable to parse analysis from file " + analysisPath + " please check the format." , parseResult .err ());
387390 }
388- return analysis ;
391+ return parseResult . ok (). build () ;
389392 }
390393
391394 private JobProto .Job readSampleJob (Path samplePath ) {
392395 logger .debug ("Reading sample from {}" , samplePath );
393396 JobProto .Job .Builder jobBuilder = JobProto .Job .newBuilder ();
394- SampleProto .Sample sampleProto = tryParseJsonOrYaml (SampleProto .Sample .newBuilder (), samplePath ).build ();
395- if (!sampleProto .equals (SampleProto .Sample .getDefaultInstance ())) {
396- jobBuilder .setSample (sampleProto );
397- return jobBuilder .build ();
397+ Result <SampleProto .Sample .Builder , Exception > sampleParseResult = tryParseJsonOrYaml (SampleProto .Sample .newBuilder (), samplePath );
398+ if (sampleParseResult .isOk ()) {
399+ SampleProto .Sample sampleProto = sampleParseResult .ok ().build ();
400+ if (!SampleProto .Sample .getDefaultInstance ().equals (sampleProto )) {
401+ jobBuilder .setSample (sampleProto );
402+ return jobBuilder .build ();
403+ }
398404 }
399405 //try phenopacket:
400- Phenopacket phenopacket = tryParseJsonOrYaml (Phenopacket .newBuilder (), samplePath ).build ();
401- // note that the underlying ProtoParser uses permissive parsing so it is possible to extract an imperfectly
402- // formed phenopacket from a family message so these need to be checked before returning.
403- if (!phenopacket .equals (Phenopacket .getDefaultInstance ()) && !phenopacket .getPhenotypicFeaturesList ()
404- .isEmpty ()) {
405- jobBuilder .setPhenopacket (phenopacket );
406- return jobBuilder .build ();
406+ var phenopacketResult = tryParseJsonOrYaml (Phenopacket .newBuilder (), samplePath );
407+ if (phenopacketResult .isOk ()) {
408+ Phenopacket phenopacket = phenopacketResult .ok ().build ();
409+ // note that the underlying ProtoParser uses permissive parsing so it is possible to extract an imperfectly
410+ // formed phenopacket from a family message so these need to be checked before returning.
411+ if (!Phenopacket .getDefaultInstance ().equals (phenopacket ) && !phenopacket .getPhenotypicFeaturesList ()
412+ .isEmpty ()) {
413+ jobBuilder .setPhenopacket (phenopacket );
414+ return jobBuilder .build ();
415+ }
407416 }
408417 //try family:
409- Family family = tryParseJsonOrYaml (Family .newBuilder (), samplePath ).build ();
410- if (!family .equals (Family .getDefaultInstance ())) {
411- jobBuilder .setFamily (family );
412- return jobBuilder .build ();
418+ var familyResult = tryParseJsonOrYaml (Family .newBuilder (), samplePath );
419+ if (familyResult .isOk ()) {
420+ Family family = familyResult .ok ().build ();
421+ if (!Family .getDefaultInstance ().equals (family )) {
422+ jobBuilder .setFamily (family );
423+ return jobBuilder .build ();
424+ }
413425 }
414426 throw new IllegalArgumentException ("Unable to parse sample from file " + samplePath + " please check the format" );
415427 }
416428
417429 private OutputProto .OutputOptions readOutputOptions (Path outputOptionsPath ) {
418- OutputProto .OutputOptions outputOptions = tryParseJsonOrYaml (OutputProto .OutputOptions .newBuilder (), outputOptionsPath )
419- .build ();
420- if (outputOptions .equals (OutputProto .OutputOptions .getDefaultInstance ())) {
421- throw new IllegalArgumentException ("Unable to parse outputOptions from file " + outputOptionsPath + " please check the format" );
430+ var outputOpionsParseResult = tryParseJsonOrYaml (OutputProto .OutputOptions .newBuilder (), outputOptionsPath );
431+ if (outputOpionsParseResult .isOk ()) {
432+ OutputProto .OutputOptions outputOptions = outputOpionsParseResult .ok ().build ();
433+ if (OutputProto .OutputOptions .getDefaultInstance ().equals (outputOptions )) {
434+ throw new IllegalArgumentException ("Unable to parse outputOptions from file " + outputOptionsPath + " please check the format" );
435+ }
436+ return outputOptions ;
422437 }
423- return outputOptions ;
438+ throw new IllegalArgumentException ( "Unable to parse outputOptions from file " + outputOptionsPath + " please check the format" ) ;
424439 }
425440
426- private <U extends Message .Builder > U tryParseJsonOrYaml (U messageBuilder , Path path ) {
441+ private <U extends Message .Builder > Result < U , Exception > tryParseJsonOrYaml (U messageBuilder , Path path ) {
427442 try {
428- return ProtoParser .parseFromJsonOrYaml (messageBuilder , path );
443+ return Result . ok ( ProtoParser .parseFromJsonOrYaml (messageBuilder , path ) );
429444 } catch (Exception exception ) {
430445 logger .debug ("{} not parsable as a {} ..." , path , messageBuilder .getClass ().getName ());
446+ return Result .err (exception );
431447 }
432- return messageBuilder ;
433448 }
434449}
0 commit comments