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!"); } }