Skip to content

Commit de75ffc

Browse files
committed
Fix broken AnalysisCommandTest tests caused by broken AnalyseCommand.handleAnalysisOption
1 parent 2418c55 commit de75ffc

1 file changed

Lines changed: 54 additions & 39 deletions

File tree

exomiser-cli/src/main/java/org/monarchinitiative/exomiser/cli/commands/AnalyseCommand.java

Lines changed: 54 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)