package ru.yandex.qatools.allure.commons; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.CanReadFileFilter; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.commons.io.filefilter.RegexFileFilter; import ru.yandex.qatools.allure.config.AllureConfig; import ru.yandex.qatools.allure.model.TestSuiteResult; import javax.xml.bind.JAXB; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Some file utils using mainly in tests. Class contains methods that can help to find attachments and * allures xml in given directories. * * @author Dmitry Baev charlie@yandex-team.ru * Date: 06.06.14 */ public final class AllureFileUtils { AllureFileUtils() { throw new IllegalStateException(); } /** * Unmarshal test suite from given file. */ public static TestSuiteResult unmarshal(File testSuite) throws IOException { try (InputStream stream = new FileInputStream(testSuite)) { return unmarshal(stream); } } /** * Unmarshal test suite from given input stream. * * @see #unmarshal(Reader) */ public static TestSuiteResult unmarshal(InputStream testSuite) { return unmarshal(new InputStreamReader(testSuite, StandardCharsets.UTF_8)); } /** * Unmarshal test suite from given reader. * * @see BadXmlCharacterFilterReader */ public static TestSuiteResult unmarshal(Reader testSuite) { return JAXB.unmarshal(new BadXmlCharacterFilterReader(testSuite), TestSuiteResult.class); } /** * Find and unmarshal all test suite files in given directories. * * @throws IOException if any occurs. * @see #unmarshal(File) */ public static List<TestSuiteResult> unmarshalSuites(File... directories) throws IOException { List<TestSuiteResult> results = new ArrayList<>(); List<File> files = listTestSuiteFiles(directories); for (File file : files) { results.add(unmarshal(file)); } return results; } /** * Returns list of files matches {@link AllureConfig#testSuiteFileRegex} in specified directories * * @param directories to find * @return list of testSuite files in specified directories */ public static List<File> listTestSuiteFiles(File... directories) { return listFilesByRegex( AllureConfig.newInstance().getTestSuiteFileRegex(), directories ); } /** * Returns list of files matches {@link AllureConfig#attachmentFileRegex} in specified directories * * @param directories to find * @return list of attachment files in specified directories */ public static List<File> listAttachmentFiles(File... directories) { return listFilesByRegex( AllureConfig.newInstance().getAttachmentFileRegex(), directories ); } /** * Returns list of files matches specified regex in specified directories * * @param regex to match file names * @param directories to find * @return list of files matches specified regex in specified directories */ public static List<File> listFilesByRegex(String regex, File... directories) { return listFiles(directories, new RegexFileFilter(regex), CanReadFileFilter.CAN_READ); } /** * Returns list of files matches filters in specified directories * * @param directories which will using to find files * @param fileFilter file filter * @param dirFilter directory filter * @return list of files matches filters in specified directories */ public static List<File> listFiles(File[] directories, IOFileFilter fileFilter, IOFileFilter dirFilter) { List<File> files = new ArrayList<>(); for (File directory : directories) { if (!directory.isDirectory()) { continue; } Collection<File> filesInDirectory = FileUtils.listFiles(directory, fileFilter, dirFilter); files.addAll(filesInDirectory); } return files; } }