// Copyright © 2011-2014, Esko Luontola <www.orfjackal.net> // This software is released under the Apache License 2.0. // The license text is at http://www.apache.org/licenses/LICENSE-2.0 package fi.jumi.core.config; import fi.jumi.core.util.ClassFiles; import javax.annotation.concurrent.NotThreadSafe; import java.net.URI; import java.nio.file.*; import java.util.*; @NotThreadSafe public class SuiteConfigurationBuilder { private final List<URI> classpath; private final List<String> jvmOptions; private URI workingDirectory; private String includedTestsPattern; private String excludedTestsPattern; public SuiteConfigurationBuilder() { this(SuiteConfiguration.DEFAULTS); } SuiteConfigurationBuilder(SuiteConfiguration src) { classpath = new ArrayList<>(src.getClasspath()); jvmOptions = new ArrayList<>(src.getJvmOptions()); workingDirectory = src.getWorkingDirectory(); includedTestsPattern = src.getIncludedTestsPattern(); excludedTestsPattern = src.getExcludedTestsPattern(); } public SuiteConfiguration freeze() { return new SuiteConfiguration(this); } // getters and setters public List<URI> getClasspath() { return classpath; } public SuiteConfigurationBuilder setClasspath(Path... files) { classpath.clear(); for (Path file : files) { addToClasspath(file); } return this; } public SuiteConfigurationBuilder setClasspath(URI... files) { classpath.clear(); for (URI file : files) { addToClasspath(file); } return this; } public SuiteConfigurationBuilder addToClasspath(Path file) { return addToClasspath(file.toUri()); } public SuiteConfigurationBuilder addToClasspath(URI file) { classpath.add(file); return this; } public List<String> getJvmOptions() { return jvmOptions; } public SuiteConfigurationBuilder setJvmOptions(String... jvmOptions) { this.jvmOptions.clear(); this.addJvmOptions(jvmOptions); return this; } public SuiteConfigurationBuilder addJvmOptions(String... jvmOptions) { this.jvmOptions.addAll(Arrays.asList(jvmOptions)); return this; } public URI getWorkingDirectory() { return workingDirectory; } public SuiteConfigurationBuilder setWorkingDirectory(Path workingDirectory) { return setWorkingDirectory(workingDirectory.toUri()); } public SuiteConfigurationBuilder setWorkingDirectory(URI workingDirectory) { this.workingDirectory = workingDirectory; return this; } public SuiteConfigurationBuilder setTestClasses(Class<?>... testClasses) { String[] classNames = new String[testClasses.length]; for (int i = 0; i < testClasses.length; i++) { classNames[i] = testClasses[i].getName(); } return setTestClasses(classNames); } public SuiteConfigurationBuilder setTestClasses(String... testClasses) { return setTestClasses(Arrays.asList(testClasses)); } public SuiteConfigurationBuilder setTestClasses(List<String> testClasses) { List<String> paths = new ArrayList<>(); for (String testClass : testClasses) { paths.add(ClassFiles.classNameToPath(testClass)); } StringBuilder pattern = new StringBuilder(); for (String path : paths) { if (pattern.length() > 0) { pattern.append(','); } pattern.append(path); } setIncludedTestsPattern("glob:{" + pattern + "}"); setExcludedTestsPattern(""); return this; } public String getIncludedTestsPattern() { return includedTestsPattern; } /** * The parameter's format is the same in {@link java.nio.file.FileSystem#getPathMatcher(String)} */ public SuiteConfigurationBuilder setIncludedTestsPattern(String syntaxAndPattern) { checkPathMatcherSyntaxAndPattern(syntaxAndPattern); this.includedTestsPattern = syntaxAndPattern; return this; } public String getExcludedTestsPattern() { return excludedTestsPattern; } /** * The parameter's format is the same in {@link java.nio.file.FileSystem#getPathMatcher(String)} */ public SuiteConfigurationBuilder setExcludedTestsPattern(String syntaxAndPattern) { if (!syntaxAndPattern.isEmpty()) { checkPathMatcherSyntaxAndPattern(syntaxAndPattern); } this.excludedTestsPattern = syntaxAndPattern; return this; } private static void checkPathMatcherSyntaxAndPattern(String syntaxAndPattern) { FileSystems.getDefault().getPathMatcher(syntaxAndPattern); } }