001package org.hl7.fhir.r5.testfactory.dataprovider;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.hl7.fhir.exceptions.FHIRException;
007import org.hl7.fhir.r5.model.ValueSet.ConceptPropertyComponent;
008import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionComponent;
009import org.hl7.fhir.r5.model.ValueSet.ValueSetExpansionContainsComponent;
010import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
011
012@MarkedToMoveToAdjunctPackage
013public class ValueSetDataProvider extends TableDataProvider {
014
015  public enum ColumnSpecifierType {
016    COUNTER, SYSTEM, VERSION, CODE, DISPLAY, ABSTRACT, INACTIVE, PROPERTY
017
018  }
019
020  public class ColumnSpecifier {
021
022    private String name;
023    private ColumnSpecifierType type;
024    private String details;
025
026    public ColumnSpecifier(String name, ColumnSpecifierType type) {
027     this.name = name;
028     this.type = type;
029    }
030
031    public ColumnSpecifier(String name, ColumnSpecifierType type, String details) {
032      this.name = name;
033      this.type = type;
034      this.details = details;
035    }
036
037  }
038
039  ValueSetExpansionComponent expansion;
040  private List<ColumnSpecifier> columns;
041  private List<String> columnNames;
042  private int cursor;
043
044  public ValueSetDataProvider(ValueSetExpansionComponent expansion) {
045    super();
046    this.expansion = expansion;
047    process();
048  }
049
050
051
052  private void process() {
053    columns = new ArrayList<ColumnSpecifier>();
054    columns.add(new ColumnSpecifier("counter", ColumnSpecifierType.COUNTER));
055    columns.add(new ColumnSpecifier("system", ColumnSpecifierType.SYSTEM));
056    columns.add(new ColumnSpecifier("version", ColumnSpecifierType.VERSION));
057    columns.add(new ColumnSpecifier("code", ColumnSpecifierType.CODE));
058    columns.add(new ColumnSpecifier("display", ColumnSpecifierType.DISPLAY));
059    columns.add(new ColumnSpecifier("abstract", ColumnSpecifierType.ABSTRACT));
060    columns.add(new ColumnSpecifier("inactive", ColumnSpecifierType.INACTIVE));
061    for (ValueSetExpansionContainsComponent cc : expansion.getContains()) {
062//      for (ConceptReferenceDesignationComponent d : cc.getDesignation()) {
063//        if (!hasColumn(d.getLanguage(), d.getUse())) {
064//          
065//        }
066//      }
067      for (ConceptPropertyComponent p : cc.getProperty()) {
068        if (!hasColumn(ColumnSpecifierType.PROPERTY, p.getCode()) ) {
069          columns.add(new ColumnSpecifier("property."+p.getCode(), ColumnSpecifierType.PROPERTY, p.getCode()));
070        }
071      }
072    }
073    columnNames = new ArrayList<>();    
074    for (ColumnSpecifier sp : columns) {
075      columnNames.add(sp.name);
076    }
077  }
078
079  private boolean hasColumn(ColumnSpecifierType type, String details) {
080    for (ColumnSpecifier sp : columns) {
081      if (sp.type == type && details.equals(sp.details)) {
082        return true;
083      }
084    }
085    return false;
086  }
087
088
089
090  @Override
091  public List<String> columns() {
092    return columnNames;
093  }
094
095  @Override
096  public boolean nextRow() throws FHIRException {
097    cursor++;
098    return cursor < expansion.getContains().size();
099  }
100
101  @Override
102  public List<String> cells() throws FHIRException {
103    List<String> cells = new ArrayList<>();
104    ValueSetExpansionContainsComponent cc = expansion.getContains().get(cursor);
105    for (ColumnSpecifier sp : columns) {
106      switch (sp.type) {
107      case ABSTRACT:
108        cells.add(""+cc.getAbstract());
109        break;
110      case CODE:
111        cells.add(cc.getCode());
112        break;
113      case COUNTER:
114        cells.add(""+cursor);
115        break;
116      case DISPLAY:
117        cells.add(cc.getDisplay());
118        break;
119      case INACTIVE:
120        cells.add(""+cc.getInactive());
121        break;
122      case PROPERTY:
123        for (ConceptPropertyComponent p : cc.getProperty()) {
124          if (sp.details.equals(p.getCode())) {
125            cells.add(p.getValue().primitiveValue());
126          }
127        }
128        break;
129      case SYSTEM:
130        cells.add(cc.getSystem());
131        break;
132      case VERSION:
133        cells.add(cc.getVersion());
134        break;
135      default:
136        break;
137      }
138    }
139    return cells;
140  }
141
142  @Override
143  public String cell(String name) throws FHIRException {
144    int i = columns.indexOf(name);
145    return i == -1 ? null : cells().get(i);
146  }
147
148  @Override
149  public void reset() throws FHIRException {
150    cursor = -1;
151  }
152
153}