001package org.hl7.fhir.r5.renderers.utils; 002 003import java.io.IOException; 004import java.io.UnsupportedEncodingException; 005import java.util.ArrayList; 006import java.util.List; 007 008import org.hl7.fhir.exceptions.FHIRException; 009import org.hl7.fhir.exceptions.FHIRFormatError; 010import org.hl7.fhir.r5.model.Base; 011import org.hl7.fhir.r5.model.StructureDefinition; 012import org.hl7.fhir.r5.renderers.ResourceRenderer; 013import org.hl7.fhir.r5.renderers.utils.BaseWrappers.RendererWrapper; 014import org.hl7.fhir.utilities.xhtml.XhtmlNode; 015 016public class BaseWrappers { 017 018 public interface RendererWrapper { 019 public ResourceRenderer getRenderer(); 020 } 021 022 public interface PropertyWrapper extends RendererWrapper { 023 public String getName(); 024 public boolean hasValues(); 025 public List<BaseWrapper> getValues(); 026 public String getTypeCode(); 027 public String getDefinition(); 028 public int getMinCardinality(); 029 public int getMaxCardinality(); 030 public StructureDefinition getStructure(); 031 public BaseWrapper value(); 032 } 033 034 public interface WrapperBase extends RendererWrapper { 035 public boolean has(String name); 036 public Base get(String name) throws UnsupportedEncodingException, FHIRException, IOException; 037 public List<BaseWrapper> children(String name) throws UnsupportedEncodingException, FHIRException, IOException; 038 public List<PropertyWrapper> children(); 039 } 040 041 public interface ResourceWrapper extends WrapperBase { 042 public List<ResourceWrapper> getContained(); 043 public String getId(); 044 public XhtmlNode getNarrative() throws FHIRFormatError, IOException, FHIRException; 045 public String getName(); 046 public void describe(XhtmlNode x) throws UnsupportedEncodingException, IOException; 047 } 048 049 public interface BaseWrapper extends WrapperBase { 050 public Base getBase() throws UnsupportedEncodingException, IOException, FHIRException; 051 public PropertyWrapper getChildByName(String tail); 052 } 053 054 public static abstract class RendererWrapperImpl implements RendererWrapper { 055 protected ResourceRenderer renderer; 056 057 public RendererWrapperImpl(ResourceRenderer renderer) { 058 super(); 059 this.renderer = renderer; 060 } 061 062 public ResourceRenderer getRenderer() { 063 return renderer; 064 } 065 066 protected String tail(String path) { 067 return path.substring(path.lastIndexOf(".")+1); 068 } 069 070 } 071 072 public static abstract class WrapperBaseImpl extends RendererWrapperImpl implements WrapperBase { 073 074 public WrapperBaseImpl(ResourceRenderer renderer) { 075 super(renderer); 076 } 077 078 @Override 079 public boolean has(String name) { 080 for (PropertyWrapper p : children()) { 081 if (p.getName().equals(name)) { 082 return p.hasValues(); 083 } 084 } 085 return false; 086 } 087 088 @Override 089 public Base get(String name) throws UnsupportedEncodingException, FHIRException, IOException { 090 for (PropertyWrapper p : children()) { 091 if (p.getName().equals(name)) { 092 if (p.hasValues()) { 093 return p.getValues().get(0).getBase(); 094 } else { 095 return null; 096 } 097 } 098 } 099 return null; 100 } 101 102 @Override 103 public List<BaseWrapper> children(String name) throws UnsupportedEncodingException, FHIRException, IOException { 104 for (PropertyWrapper p : children()) { 105 if (p.getName().equals(name)) { 106 List<BaseWrapper> res = new ArrayList<>(); 107 for (BaseWrapper b : p.getValues()) { 108 res.add(b); 109 } 110 return res; 111 } 112 } 113 return null; 114 } 115 } 116}