001package org.hl7.fhir.r5.testfactory.dataprovider;
002
003import java.sql.Connection;
004import java.sql.DriverManager;
005import java.sql.ResultSet;
006import java.sql.SQLException;
007import java.util.HashMap;
008import java.util.Map;
009
010import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
011
012@MarkedToMoveToAdjunctPackage
013public class BaseDataTableProvider {
014  private Connection connection;
015  Map<String, String> elements = new HashMap<>();
016  Map<String, String> types = new HashMap<>();
017  private boolean testing; 
018  
019  public BaseDataTableProvider(String filename) throws SQLException {
020    super();
021    connection = DriverManager.getConnection("jdbc:sqlite:"+filename);
022    
023    ResultSet rs = connection.createStatement().executeQuery("select * from TestElements");
024    while (rs.next()) {
025      elements.put(rs.getString("ElementId"), rs.getString("ElementKey"));
026    }
027    
028    rs = connection.createStatement().executeQuery("select * from TestTypes");
029    while (rs.next()) {
030      types.put(rs.getString("TypeName"), rs.getString("TypeKey"));
031    }
032  }
033  
034  public String getPrimitiveValue(String elementId, String typeName) throws SQLException {
035    String ek = elements.get(elementId);
036    String tk = types.get(typeName);
037    if (tk == null) {
038      return null;
039    }
040    if (ek != null) {
041      ResultSet rs = connection.createStatement().executeQuery("select ValueData from TestValues where ElementKey = "+ek+" and TypeKey = "+tk+(testing ? " ORDER BY ValueKey" : " ORDER BY RANDOM() LIMIT 1" ));
042      if (rs.next()) {
043        return rs.getString(1);
044      }
045    }
046    ResultSet rs = connection.createStatement().executeQuery("select ValueData from TestValues where TypeKey = "+tk+(testing ? " ORDER BY ValueKey" : " ORDER BY RANDOM() LIMIT 1" ));
047    if (rs.next()) {
048      return rs.getString(1);
049    }
050    return null;
051  }
052
053  public Map<String, String> getComplexValue(String elementId, String typeName) throws SQLException {
054    String ek = elements.get(elementId);
055    String tk = types.get(typeName);
056    if (tk == null) {
057      return null;
058    }
059    if (ek != null) {
060      String sql = "select ValueData from TestValues where ElementKey = "+ek+" and TypeKey = "+tk+(testing ? " ORDER BY ValueKey" : " ORDER BY RANDOM() LIMIT 1" );
061      ResultSet rs = connection.createStatement().executeQuery(sql);
062      if (rs.next()) {
063        return parse(rs.getString(1));
064      }
065    }
066    String sql = "select ValueData from TestValues where TypeKey = "+tk+(testing ? " ORDER BY ValueKey" : " ORDER BY RANDOM() LIMIT 1" );
067    ResultSet rs = connection.createStatement().executeQuery(sql);
068    if (rs.next()) {
069      return parse(rs.getString(1));
070    }
071    return null;
072  }
073
074  private Map<String, String> parse(String value) {
075    Map<String, String> map = new HashMap<>();
076    String[] parts = value.split("\\|\\:\\|");
077    for (String p : parts) {
078      String n = p.substring(0, p.indexOf(":"));
079      String v = p.substring(p.indexOf(":")+1);
080      
081      map.put(n.trim(), v.trim());
082    }
083    return map;
084  }
085
086  public boolean isTesting() {
087    return testing;
088  }
089
090  public void setTesting(boolean testing) {
091    this.testing = testing;
092  }
093  
094}