
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}