| package junitparams.custom; |
| |
| import java.io.FileInputStream; |
| import java.io.FileReader; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.io.Reader; |
| |
| import junitparams.FileParameters; |
| import junitparams.mappers.DataMapper; |
| |
| public class FileParametersProvider implements ParametersProvider<FileParameters> { |
| |
| private FileParameters fileParameters; |
| |
| @Override |
| public void initialize(FileParameters fileParameters) { |
| this.fileParameters = fileParameters; |
| } |
| |
| @Override |
| public Object[] getParameters() { |
| return paramsFromFile(); |
| } |
| |
| private Object[] paramsFromFile() { |
| try { |
| Reader reader = createProperReader(); |
| DataMapper mapper = fileParameters.mapper().newInstance(); |
| try { |
| return mapper.map(reader); |
| } finally { |
| reader.close(); |
| } |
| } catch (Exception e) { |
| e.printStackTrace(); |
| throw new RuntimeException( |
| "Could not successfully read parameters from file: " + fileParameters.value(), e); |
| } |
| } |
| |
| private Reader createProperReader() throws IOException { |
| String filepath = fileParameters.value(); |
| String encoding = fileParameters.encoding(); |
| |
| if (filepath.indexOf(':') < 0) { |
| return new FileReader(filepath); |
| } |
| |
| String protocol = filepath.substring(0, filepath.indexOf(':')); |
| String filename = filepath.substring(filepath.indexOf(':') + 1); |
| |
| if ("classpath".equals(protocol)) { |
| return new InputStreamReader(getClass().getClassLoader().getResourceAsStream(filename), encoding); |
| } else if ("file".equals(protocol)) { |
| return new InputStreamReader(new FileInputStream(filename), encoding); |
| } |
| |
| throw new IllegalArgumentException("Unknown file access protocol. Only 'file' and 'classpath' are supported!"); |
| } |
| |
| } |