diff options
Diffstat (limited to 'src/main/java/junitparams/custom/FileParametersProvider.java')
-rw-r--r-- | src/main/java/junitparams/custom/FileParametersProvider.java | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/main/java/junitparams/custom/FileParametersProvider.java b/src/main/java/junitparams/custom/FileParametersProvider.java new file mode 100644 index 0000000..746fe5c --- /dev/null +++ b/src/main/java/junitparams/custom/FileParametersProvider.java @@ -0,0 +1,62 @@ +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!"); + } + +} |