/*
* Copyright 2014-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.facebook.buck.util;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
/**
* Helper class that keeps a list of compiled patterns and provides a method to check whether a
* string matches at least one of them.
*
* <p>Note that a string is considered to be matched if there are no patterns.
*/
public class PatternsMatcher {
private final Iterable<Pattern> patterns;
private final boolean hasPatterns;
public PatternsMatcher(Iterable<String> rawPatterns) {
patterns = Iterables.transform(rawPatterns, Pattern::compile);
hasPatterns = rawPatterns.iterator().hasNext();
}
public PatternsMatcher(Set<Pattern> compiledPatterns) {
patterns = compiledPatterns;
hasPatterns = !compiledPatterns.isEmpty();
}
/** @return true if the given string matches some of the patterns or there are no patterns */
public boolean matches(final String string) {
if (!hasPatterns) {
return true;
}
for (Pattern pattern : patterns) {
if (pattern.matcher(string).matches()) {
return true;
}
}
return false;
}
/** @return true if there is at least one pattern */
public boolean hasPatterns() {
return hasPatterns;
}
/** @return a view of the given map where all non-matching keys are removed. */
public <V> Map<String, V> filterMatchingMapKeys(final Map<String, V> entries) {
if (!hasPatterns) {
return entries;
}
return Maps.filterEntries(entries, entry -> matches(entry.getKey()));
}
}