/* * Copyright 2015-2017 the original author or authors. * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.platform.engine.discovery; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.function.Predicate; import java.util.regex.Pattern; import org.junit.platform.commons.util.Preconditions; /** * Abstract {@link ClassNameFilter} that servers as a superclass * for filters including or excluding fully qualified class names * based on pattern-matching. * * @since 1.0 */ abstract class AbstractClassNameFilter implements ClassNameFilter { protected final List<Pattern> patterns; protected final String patternDescription; AbstractClassNameFilter(String... patterns) { Preconditions.notEmpty(patterns, "patterns must not be null or empty"); Preconditions.containsNoNullElements(patterns, "patterns must not contain null elements"); this.patterns = Arrays.stream(patterns).map(Pattern::compile).collect(toList()); this.patternDescription = Arrays.stream(patterns).collect(joining("' OR '", "'", "'")); } @Override public abstract Predicate<String> toPredicate(); protected Optional<Pattern> findMatchingPattern(String className) { return this.patterns.stream().filter(pattern -> pattern.matcher(className).matches()).findAny(); } }