001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
019 */
020
021 package org.sonar.batch.issue.ignore.scanner;
022
023 import org.sonar.api.batch.fs.FileSystem;
024 import org.sonar.api.batch.fs.InputFile;
025 import org.sonar.api.batch.fs.internal.DeprecatedDefaultInputFile;
026 import org.sonar.api.resources.Project;
027 import org.sonar.api.utils.SonarException;
028 import org.sonar.batch.issue.ignore.pattern.IssueExclusionPatternInitializer;
029 import org.sonar.batch.issue.ignore.pattern.IssueInclusionPatternInitializer;
030
031 import java.nio.charset.Charset;
032
033 public final class IssueExclusionsLoader {
034
035 private final IssueExclusionsRegexpScanner regexpScanner;
036 private final IssueExclusionPatternInitializer exclusionPatternInitializer;
037 private final IssueInclusionPatternInitializer inclusionPatternInitializer;
038 private final FileSystem fileSystem;
039
040 public IssueExclusionsLoader(IssueExclusionsRegexpScanner regexpScanner, IssueExclusionPatternInitializer exclusionPatternInitializer,
041 IssueInclusionPatternInitializer inclusionPatternInitializer,
042 FileSystem fileSystem) {
043 this.regexpScanner = regexpScanner;
044 this.exclusionPatternInitializer = exclusionPatternInitializer;
045 this.inclusionPatternInitializer = inclusionPatternInitializer;
046 this.fileSystem = fileSystem;
047 }
048
049 public boolean shouldExecuteOnProject(Project project) {
050 return inclusionPatternInitializer.hasConfiguredPatterns()
051 || exclusionPatternInitializer.hasConfiguredPatterns();
052 }
053
054 /**
055 * {@inheritDoc}
056 */
057 public void execute() {
058 Charset sourcesEncoding = fileSystem.encoding();
059
060 for (InputFile inputFile : fileSystem.inputFiles(fileSystem.predicates().all())) {
061 try {
062 String componentEffectiveKey = ((DeprecatedDefaultInputFile) inputFile).key();
063 if (componentEffectiveKey != null) {
064 String path = inputFile.relativePath();
065 inclusionPatternInitializer.initializePatternsForPath(path, componentEffectiveKey);
066 exclusionPatternInitializer.initializePatternsForPath(path, componentEffectiveKey);
067 if (exclusionPatternInitializer.hasFileContentPattern()) {
068 regexpScanner.scan(componentEffectiveKey, inputFile.file(), sourcesEncoding);
069 }
070 }
071 } catch (Exception e) {
072 throw new SonarException("Unable to read the source file : '" + inputFile.absolutePath() + "' with the charset : '"
073 + sourcesEncoding.name() + "'.", e);
074 }
075 }
076 }
077
078 @Override
079 public String toString() {
080 return "Issues Exclusions - Source Scanner";
081 }
082
083 }