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}