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 package org.sonar.batch.issue;
021
022 import org.sonar.api.BatchComponent;
023 import org.sonar.api.issue.batch.IssueFilter;
024 import org.sonar.api.issue.internal.DefaultIssue;
025 import org.sonar.api.rules.Violation;
026 import org.sonar.batch.ViolationFilters;
027
028 import javax.annotation.Nullable;
029
030 public class IssueFilters implements BatchComponent {
031
032 private final ViolationFilters deprecatedFilters;
033 private final DeprecatedViolations deprecatedViolations;
034 private final org.sonar.api.issue.IssueFilter[] exclusionFilters;
035 private final IssueFilter[] filters;
036
037 public IssueFilters(@Nullable ViolationFilters deprecatedFilters, @Nullable DeprecatedViolations deprecatedViolations, org.sonar.api.issue.IssueFilter[] exclusionFilters,
038 IssueFilter[] filters) {
039 this.deprecatedFilters = deprecatedFilters;
040 this.deprecatedViolations = deprecatedViolations;
041 this.exclusionFilters = exclusionFilters;
042 this.filters = filters;
043 }
044
045 public IssueFilters(@Nullable ViolationFilters deprecatedFilters, @Nullable DeprecatedViolations deprecatedViolations, IssueFilter[] filters) {
046 this(deprecatedFilters, deprecatedViolations, new org.sonar.api.issue.IssueFilter[0], filters);
047 }
048
049 public IssueFilters(@Nullable ViolationFilters deprecatedFilters, @Nullable DeprecatedViolations deprecatedViolations, org.sonar.api.issue.IssueFilter[] exclusionFilters) {
050 this(deprecatedFilters, deprecatedViolations, exclusionFilters, new IssueFilter[0]);
051 }
052
053 public IssueFilters(@Nullable ViolationFilters deprecatedFilters, @Nullable DeprecatedViolations deprecatedViolations) {
054 this(deprecatedFilters, deprecatedViolations, new org.sonar.api.issue.IssueFilter[0]);
055 }
056
057 /**
058 * Used by scan2
059 */
060 public IssueFilters(org.sonar.api.issue.IssueFilter[] exclusionFilters, IssueFilter[] filters) {
061 this(null, null, exclusionFilters, filters);
062 }
063
064 public IssueFilters(org.sonar.api.issue.IssueFilter[] exclusionFilters) {
065 this(null, null, exclusionFilters, new IssueFilter[0]);
066 }
067
068 public IssueFilters(IssueFilter[] filters) {
069 this(null, null, new org.sonar.api.issue.IssueFilter[0], filters);
070 }
071
072 public IssueFilters() {
073 this(null, null, new org.sonar.api.issue.IssueFilter[0], new IssueFilter[0]);
074 }
075
076 public boolean accept(DefaultIssue issue, @Nullable Violation violation) {
077 if (new DefaultIssueFilterChain(filters).accept(issue)) {
078 // Apply deprecated rules only if filter chain accepts the current issue
079 for (org.sonar.api.issue.IssueFilter filter : exclusionFilters) {
080 if (!filter.accept(issue)) {
081 return false;
082 }
083 }
084 if (deprecatedFilters != null && !deprecatedFilters.isEmpty() && deprecatedViolations != null) {
085 Violation v = violation != null ? violation : deprecatedViolations.toViolation(issue);
086 return !deprecatedFilters.isIgnored(v);
087 }
088 return true;
089 } else {
090 return false;
091 }
092 }
093 }