package com.noga.njexl.testing.dataprovider.dir;
import com.noga.njexl.lang.extension.TypeUtility;
import com.noga.njexl.lang.extension.dataaccess.DataMatrix;
import com.noga.njexl.testing.dataprovider.DataSource;
import com.noga.njexl.testing.dataprovider.DataSourceTable;
import java.io.File;
import java.util.*;
import java.util.regex.Pattern;
/**
* Use a directory as data source,
* Idea is to use any TSV file inside as table
*/
public class DirectoryDataSource extends DataSource {
public static final Pattern LOADER_PATTERN = Pattern.compile("^[fF][iI][lL][eE]\\://.+",Pattern.CASE_INSENSITIVE);
public static final DataMatrix.DataLoader DATA_LOADER = new DirectoryDataSource();
public static class TextDataFile extends DataSourceTable{
public static final String DELIMITER = "\t";
DataSource dataSource ;
String location;
List<String[]> data ;
@Override
public DataSource dataSource() {
return dataSource;
}
@Override
public String name() {
return location;
}
@Override
public int length() {
return data.size();
}
@Override
public String[] row(int rowIndex) {
if ( rowIndex >= data.size() || rowIndex < 0 ) {
return null;
}
return data.get(rowIndex);
}
public TextDataFile(String file) throws Exception{
data = new ArrayList<>();
List<String> lines = (List)TypeUtility.readLines(file,false);
for ( int i = 0 ; i < lines.size();i++ ){
String line = lines.get(i);
String[] row = line.split(DELIMITER);
data.add(row);
}
location = new File(file).getName();
if ( location.contains(".")) {
location = location.substring(0, location.lastIndexOf("."));
}
}
}
@Override
protected Map<String, DataSourceTable> init(String location) throws Exception {
File file = new File(location);
if ( !file.isDirectory() ) { return Collections.emptyMap(); }
String[] files = file.list();
HashMap<String,DataSourceTable> map = new HashMap<>();
for ( int i = 0 ; i < files.length ; i++ ){
DataSourceTable table = new TextDataFile(files[i]);
map.put(table.name(), table);
}
return map;
}
public DirectoryDataSource() {}
public DirectoryDataSource(String location) throws Exception {
super(location);
}
}