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