001package org.hl7.fhir.validation.cli.services;
002
003import java.awt.Desktop;
004import java.io.File;
005import java.io.IOException;
006
007import org.hl7.fhir.exceptions.FHIRException;
008import org.hl7.fhir.r5.comparison.ComparisonRenderer;
009import org.hl7.fhir.r5.comparison.ComparisonSession;
010import org.hl7.fhir.r5.comparison.ProfileComparer;
011import org.hl7.fhir.r5.model.CanonicalResource;
012import org.hl7.fhir.r5.model.CapabilityStatement;
013import org.hl7.fhir.r5.model.Resource;
014import org.hl7.fhir.r5.model.StructureDefinition;
015import org.hl7.fhir.r5.utils.EOperationOutcome;
016import org.hl7.fhir.utilities.Utilities;
017import org.hl7.fhir.validation.ValidationEngine;
018import org.hl7.fhir.validation.cli.utils.Params;
019
020public class ComparisonService {
021
022  public static void doLeftRightComparison(String[] args, String dest, ValidationEngine validator) throws IOException, FHIRException, EOperationOutcome {
023    // ok now set up the comparison
024    String left = Params.getParam(args, Params.LEFT);
025    String right = Params.getParam(args, Params.RIGHT);
026
027    Resource resLeft = validator.getContext().fetchResource(Resource.class, left);
028    Resource resRight = validator.getContext().fetchResource(Resource.class, right);
029    if (resLeft == null) {
030      System.out.println("Unable to locate left resource " + left);
031    }
032    if (resRight == null) {
033      System.out.println("Unable to locate right resource " + right);
034    }
035
036    if (resLeft != null && resRight != null) {
037      if (resLeft instanceof StructureDefinition && resRight instanceof StructureDefinition) {
038        ComparisonService.compareStructureDefinitions(dest, validator, left, right, (StructureDefinition) resLeft, (StructureDefinition) resRight);
039      } else if (resLeft instanceof CapabilityStatement && resRight instanceof CapabilityStatement) {
040        ComparisonService.compareCapabilityStatements(args, dest, validator, left, right, (CanonicalResource) resLeft, (CanonicalResource) resRight);
041      } else
042        System.out.println("Unable to compare left resource " + left + " (" + resLeft.fhirType() + ") with right resource " + right + " (" + resRight.fhirType() + ")");
043    }
044  }
045
046  public static void compareCapabilityStatements(String[] args, String dest, ValidationEngine validator, String left, String right, CanonicalResource resLeft, CanonicalResource resRight) throws IOException {
047    throw new Error("CapabilityStatement comparison is not implemented at this time (WIP)");
048//    System.out.println("Comparing CapabilityStatements " + left + " to " + right);
049//    ComparisonSession session = new ComparisonSession(validator.getContext(), validator.getContext(), "Comparing Capability Statements", null);
050//    session.compare(resLeft, resRight);
051//    ComparisonRenderer cr = new ComparisonRenderer(validator.getContext(), validator.getContext(), dest, session);
052//    cr.getTemplates().put("CodeSystem", new String(validator.getContext().getBinaries().get("template-comparison-CodeSystem.html")));
053//    cr.getTemplates().put("ValueSet", new String(validator.getContext().getBinaries().get("template-comparison-ValueSet.html")));
054//    cr.getTemplates().put("Profile", new String(validator.getContext().getBinaries().get("template-comparison-Profile.html")));
055//    cr.getTemplates().put("Index", new String(validator.getContext().getBinaries().get("template-comparison-index.html")));
056//    File htmlFile = cr.render(left, right);
057//    Desktop.getDesktop().browse(htmlFile.toURI());
058//    System.out.println("Done");
059  }
060
061  public static void compareStructureDefinitions(String dest, ValidationEngine validator, String left, String right, StructureDefinition resLeft, StructureDefinition resRight) throws IOException, FHIRException, EOperationOutcome {
062    System.out.println("Comparing StructureDefinitions " + left + " to " + right);
063    ComparisonSession session = new ComparisonSession(validator.getContext(), validator.getContext(), "Comparing Profiles", null);
064    session.compare(resLeft, resRight);
065    
066    System.out.println("Generating output to " + dest + "...");
067    Utilities.createDirectory(dest);
068    ComparisonRenderer cr = new ComparisonRenderer(validator.getContext(), validator.getContext(), dest, session);
069    cr.getTemplates().put("CodeSystem", new String(validator.getContext().getBinaries().get("template-comparison-CodeSystem.html")));
070    cr.getTemplates().put("ValueSet", new String(validator.getContext().getBinaries().get("template-comparison-ValueSet.html")));
071    cr.getTemplates().put("Profile", new String(validator.getContext().getBinaries().get("template-comparison-Profile.html")));
072    cr.getTemplates().put("Index", new String(validator.getContext().getBinaries().get("template-comparison-index.html")));
073    File htmlFile = cr.render(left, right);
074    Desktop.getDesktop().browse(htmlFile.toURI());
075    System.out.println("Done");
076  }
077
078  private static String chooseName(String[] args, String name, CanonicalResource mr) {
079    String s = Params.getParam(args, "-" + name);
080    if (Utilities.noString(s))
081      s = mr.present();
082    return s;
083  }
084}