All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.codearte.accurest.file.ContractFileScanner.groovy Maven / Gradle / Ivy

The newest version!
package io.codearte.accurest.file

import com.google.common.collect.ArrayListMultimap
import com.google.common.collect.ListMultimap
import org.apache.commons.io.FilenameUtils
import org.apache.commons.lang3.SystemUtils

import java.nio.file.FileSystem
import java.nio.file.FileSystems
import java.nio.file.Path
import java.nio.file.PathMatcher
import java.util.regex.Pattern

/**
 * @author Jakub Kubrynski
 */
class ContractFileScanner {

	private static final String MATCH_PREFIX = "glob:"
	private static final Pattern SCENARIO_STEP_FILENAME_PATTERN = Pattern.compile("[0-9]+_.*")
	private final File baseDir
	private final Set excludeMatchers
	private final Set ignoreMatchers

	ContractFileScanner(File baseDir, Set excluded, Set ignored) {
		this.baseDir = baseDir
		excludeMatchers = processPatterns(excluded)
		ignoreMatchers = processPatterns(ignored)
	}

	private Set processPatterns(Set patterns) {
		FileSystem fileSystem = FileSystems.getDefault()
		return patterns.collect({
			String syntaxAndPattern = MATCH_PREFIX + '**' + File.separator + it
			// FIXME: This looks strange, need to be checked on windows
			if (SystemUtils.IS_OS_WINDOWS) {
				syntaxAndPattern = syntaxAndPattern.replace("\\", "\\\\")
			}
			fileSystem.getPathMatcher(syntaxAndPattern)
		}) as Set
	}

	ListMultimap findContracts() {
		ListMultimap result = ArrayListMultimap.create()
		appendRecursively(baseDir, result)
		return result
	}

	private void appendRecursively(File baseDir, ListMultimap result) {
		File[] files = baseDir.listFiles()
		if (!files) {
			return;
		}
		files.sort().eachWithIndex { File file, int index ->
			if (!matchesPattern(file, excludeMatchers)) {
				if (isContractFile(file)) {
					Path path = file.toPath()
					Integer order = null
					if (hasScenarioFilenamePattern(path)) {
						order = index
					}
					result.put(file.parentFile.toPath(), new Contract(path, matchesPattern(file, ignoreMatchers), files.size(), order))
				} else {
					appendRecursively(file, result)
				}
			}
		}
	}

	private boolean hasScenarioFilenamePattern(Path path) {
		return SCENARIO_STEP_FILENAME_PATTERN.matcher(path.fileName.toString()).matches()
	}

	boolean matchesPattern(File file, Set excludeMatchers) {
		for (PathMatcher matcher : excludeMatchers) {
			if (matcher.matches(file.toPath())) {
				return true;
			}
		}
		return false;
	}

	private boolean isContractFile(File file) {
		return file.isFile() && FilenameUtils.getExtension(file.toString()).equalsIgnoreCase("groovy")
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy