com.facebook.buck.util.PatternsMatcher.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.buck.util.PatternsMatcher.java

Source

/*
 * 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()));
    }

}