org.sonarsource.sonarlint.core.client.api.common.FileExclusions Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sonarlint-core Show documentation
Show all versions of sonarlint-core Show documentation
Common library used by some SonarLint flavors
/*
* SonarLint Core - Implementation
* Copyright (C) 2016-2022 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonarsource.sonarlint.core.client.api.common;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
public class FileExclusions implements Predicate {
private static final String SYNTAX = "glob";
private final List matchers;
private final Set directoryExclusions;
private final Set fileExclusions;
public FileExclusions(Set fileExclusions, Set directoryExclusions, Set globPatterns) {
this.fileExclusions = fileExclusions;
this.directoryExclusions = directoryExclusions;
this.matchers = parseGlobPatterns(globPatterns);
}
private static List parseGlobPatterns(Set globPatterns) {
var fs = FileSystems.getDefault();
List parsedMatchers = new ArrayList<>(globPatterns.size());
for (String pattern : globPatterns) {
try {
parsedMatchers.add(fs.getPathMatcher(SYNTAX + ":" + pattern));
} catch (Exception e) {
// ignore invalid patterns, simply skip them
}
}
return parsedMatchers;
}
public boolean test(Path path) {
return testFileExclusions(path) || testDirectoryExclusions(path) || testGlob(path);
}
private boolean testGlob(Path path) {
return matchers.stream().anyMatch(matcher -> matcher.matches(path));
}
private boolean testFileExclusions(Path path) {
return fileExclusions.contains(path.toString());
}
private boolean testDirectoryExclusions(Path path) {
var p = path;
while (p != null) {
if (directoryExclusions.contains(p.toString())) {
return true;
}
p = p.getParent();
}
return false;
}
@Override
public boolean test(String string) {
return test(Paths.get(string));
}
}