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}