diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLSchemaGenerator.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLSchemaGenerator.java index 7fa04a878..bd2bf1854 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLSchemaGenerator.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLSchemaGenerator.java @@ -277,8 +277,14 @@ public class GraphQLSchemaGenerator { private void generateElementBase(Writer writer, EnumSet operations) throws IOException { if (operations.contains(FHIROperationType.READ) || operations.contains(FHIROperationType.SEARCH)) { + writer.write("interface IElement {\r\n"); + writer.write(" id: String\r\n"); + writer.write(" extension: [Extension]\r\n"); + writer.write("}\r\n"); + writer.write("\r\n"); + writer.write("type ElementBase {\r\n"); - writer.write(" id: ID\r\n"); + writer.write(" id: String\r\n"); writer.write(" extension: [Extension]\r\n"); writer.write("}\r\n"); writer.write("\r\n"); @@ -298,19 +304,25 @@ public class GraphQLSchemaGenerator { List list = new ArrayList<>(); StringBuilder b = new StringBuilder(); list.add(b); - b.append("type "); - b.append(sd.getName()); - StructureDefinition sdp = context.fetchResource(StructureDefinition.class, sd.getBaseDefinition()); - if (sdp != null) { - b.append(" implements "); - b.append(sdp.getType()); - } + b.append("interface "); + b.append("I" + sd.getName()); + generateTypeSuperinterfaceDeclaration(sd, b); b.append(" {\r\n"); ElementDefinition ed = sd.getSnapshot().getElementFirstRep(); generateProperties(existingTypeNames, list, b, sd.getName(), sd, ed, "type", ""); b.append("}"); b.append("\r\n"); b.append("\r\n"); + + b.append("type "); + b.append(sd.getName()); + generateTypeSuperinterfaceDeclaration(sd, b); + b.append(" {\r\n"); + generateProperties(existingTypeNames, list, b, sd.getName(), sd, ed, "type", ""); + b.append("}"); + b.append("\r\n"); + b.append("\r\n"); + for (StringBuilder bs : list) { writer.write(bs.toString()); } @@ -336,6 +348,23 @@ public class GraphQLSchemaGenerator { } + private void generateTypeSuperinterfaceDeclaration(StructureDefinition theParentSd, StringBuilder theBuilder) { + StructureDefinition baseSd = theParentSd; + boolean first = true; + while (baseSd != null && baseSd.getBaseDefinition() != null) { + baseSd = context.fetchResource(StructureDefinition.class, baseSd.getBaseDefinition()); + if (baseSd != null) { + if (first) { + theBuilder.append(" implements "); + first = false; + } else { + theBuilder.append(" & "); + } + theBuilder.append("I" + baseSd.getType()); + } + } + } + private void generateProperties(Map existingTypeNames, List list, StringBuilder b, String typeName, StructureDefinition sd, ElementDefinition ed, String mode, String suffix) throws IOException { List children = profileUtilities.getChildList(sd, ed); for (ElementDefinition child : children) {