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}