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}