001package org.hl7.fhir.r4.formats; 002 003import java.io.IOException; 004import java.io.InputStream; 005import java.io.OutputStream; 006 007import org.hl7.fhir.r4.model.CodeType; 008import org.hl7.fhir.r4.model.CodeableConcept; 009import org.hl7.fhir.r4.model.Coding; 010import org.hl7.fhir.r4.model.Enumeration; 011import org.hl7.fhir.r4.model.Resource; 012import org.hl7.fhir.r4.model.Type; 013import org.hl7.fhir.r4.utils.formats.Turtle; 014import org.hl7.fhir.r4.utils.formats.Turtle.Complex; 015import org.hl7.fhir.r4.utils.formats.Turtle.Section; 016import org.hl7.fhir.r4.utils.formats.Turtle.Subject; 017import org.hl7.fhir.exceptions.FHIRFormatError; 018import org.hl7.fhir.utilities.xhtml.XhtmlNode; 019 020public abstract class RdfParserBase extends ParserBase implements IParser { 021 022 protected abstract void composeResource(Complex complex, Resource resource) throws IOException; 023 024 @Override 025 public ParserType getType() { 026 return ParserType.RDF_TURTLE; 027 } 028 029 @Override 030 public Resource parse(InputStream input) throws IOException, FHIRFormatError { 031 throw new Error("Parsing not implemented yet"); 032 } 033 034 @Override 035 public Type parseType(InputStream input, String knownType) throws IOException, FHIRFormatError { 036 throw new Error("Parsing not implemented yet"); 037 } 038 039 @Override 040 public Type parseAnyType(InputStream input, String knownType) throws IOException, FHIRFormatError { 041 throw new Error("Parsing not implemented yet"); 042 } 043 044 private String url; 045 046 @Override 047 public void compose(OutputStream stream, Resource resource) throws IOException { 048 Turtle ttl = new Turtle(); 049 // ttl.setFormat(FFormat); 050 ttl.prefix("fhir", "http://hl7.org/fhir/"); 051 ttl.prefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); 052 Section section = ttl.section("resource"); 053 Subject subject; 054 if (url != null) 055 subject = section.triple("<"+url+">", "a", "fhir:"+resource.getResourceType().toString()); 056 else 057 subject = section.triple("[]", "a", "fhir:"+resource.getResourceType().toString()); 058 059 composeResource(subject, resource); 060 try { 061 ttl.commit(stream, false); 062 } catch (Exception e) { 063 throw new IOException(e); 064 } 065 } 066 067 @Override 068 public void compose(OutputStream stream, Type type, String rootName) throws IOException { 069 throw new Error("Not supported in RDF"); 070 } 071 072 protected String ttlLiteral(String value) { 073 return "\"" +Turtle.escape(value, true) + "\""; 074 } 075 076 protected void composeXhtml(Complex t, String string, String string2, XhtmlNode div, int i) { 077 } 078 079 protected void decorateCode(Complex t, Enumeration<? extends Enum> value) { 080 } 081 082 protected void decorateCode(Complex t, CodeType value) { 083 } 084 085 protected void decorateCoding(Complex t, Coding element) { 086 if (!element.hasSystem()) 087 return; 088 if ("http://snomed.info/sct".equals(element.getSystem())) { 089 t.prefix("sct", "http://snomed.info/sct/"); 090 t.predicate("a", "sct:"+element.getCode()); 091 } else if ("http://snomed.info/sct".equals(element.getSystem())) { 092 t.prefix("loinc", "http://loinc.org/rdf#"); 093 t.predicate("a", "loinc:"+element.getCode()); 094 } 095 } 096 097 protected void decorateCodeableConcept(Complex t, CodeableConcept element) { 098 for (Coding c : element.getCoding()) 099 decorateCoding(t, c); 100 } 101 102 103}