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 */
020package org.sonar.api.batch.fs.internal;
021
022import org.sonar.api.batch.fs.FilePredicate;
023import org.sonar.api.batch.fs.FilePredicates;
024import org.sonar.api.batch.fs.InputFile;
025
026import java.io.File;
027import java.util.ArrayList;
028import java.util.Arrays;
029import java.util.Collection;
030import java.util.List;
031
032/**
033 * Factory of {@link org.sonar.api.batch.fs.FilePredicate}
034 *
035 * @since 4.2
036 */
037public class DefaultFilePredicates implements FilePredicates {
038
039  private final File baseDir;
040
041  /**
042   * Client code should use {@link org.sonar.api.batch.fs.FileSystem#predicates()} to get an instance
043   */
044  DefaultFilePredicates(File baseDir) {
045    this.baseDir = baseDir;
046  }
047
048  /**
049   * Returns a predicate that always evaluates to true
050   */
051  public FilePredicate all() {
052    return TruePredicate.TRUE;
053  }
054
055  /**
056   * Returns a predicate that always evaluates to false
057   */
058  public FilePredicate none() {
059    return FalsePredicate.FALSE;
060  }
061
062  @Override
063  public FilePredicate hasAbsolutePath(String s) {
064    return new AbsolutePathPredicate(s, baseDir);
065  }
066
067  /**
068   * non-normalized path and Windows-style path are supported
069   */
070  public FilePredicate hasRelativePath(String s) {
071    return new RelativePathPredicate(s);
072  }
073
074  public FilePredicate matchesPathPattern(String inclusionPattern) {
075    return new PathPatternPredicate(PathPattern.create(inclusionPattern));
076  }
077
078  public FilePredicate matchesPathPatterns(String[] inclusionPatterns) {
079    if (inclusionPatterns.length == 0) {
080      return TruePredicate.TRUE;
081    }
082    FilePredicate[] predicates = new FilePredicate[inclusionPatterns.length];
083    for (int i = 0; i < inclusionPatterns.length; i++) {
084      predicates[i] = new PathPatternPredicate(PathPattern.create(inclusionPatterns[i]));
085    }
086    return or(predicates);
087  }
088
089  public FilePredicate doesNotMatchPathPattern(String exclusionPattern) {
090    return not(matchesPathPattern(exclusionPattern));
091  }
092
093  public FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns) {
094    if (exclusionPatterns.length == 0) {
095      return TruePredicate.TRUE;
096    }
097    return not(matchesPathPatterns(exclusionPatterns));
098  }
099
100  public FilePredicate hasPath(String s) {
101    File file = new File(s);
102    if (file.isAbsolute()) {
103      return hasAbsolutePath(s);
104    }
105    return hasRelativePath(s);
106  }
107
108  public FilePredicate is(File ioFile) {
109    if (ioFile.isAbsolute()) {
110      return hasAbsolutePath(ioFile.getAbsolutePath());
111    }
112    return hasRelativePath(ioFile.getPath());
113  }
114
115  public FilePredicate hasLanguage(String language) {
116    return new LanguagePredicate(language);
117  }
118
119  public FilePredicate hasLanguages(Collection<String> languages) {
120    List<FilePredicate> list = new ArrayList<FilePredicate>();
121    for (String language : languages) {
122      list.add(hasLanguage(language));
123    }
124    return or(list);
125  }
126
127  public FilePredicate hasLanguages(String... languages) {
128    List<FilePredicate> list = new ArrayList<FilePredicate>();
129    for (String language : languages) {
130      list.add(hasLanguage(language));
131    }
132    return or(list);
133  }
134
135  public FilePredicate hasStatus(InputFile.Status status) {
136    return new StatusPredicate(status);
137  }
138
139  public FilePredicate hasType(InputFile.Type type) {
140    return new TypePredicate(type);
141  }
142
143  public FilePredicate not(FilePredicate p) {
144    return new NotPredicate(p);
145  }
146
147  public FilePredicate or(Collection<FilePredicate> or) {
148    return OrPredicate.create(or);
149  }
150
151  public FilePredicate or(FilePredicate... or) {
152    return OrPredicate.create(Arrays.asList(or));
153  }
154
155  public FilePredicate or(FilePredicate first, FilePredicate second) {
156    return OrPredicate.create(Arrays.asList(first, second));
157  }
158
159  public FilePredicate and(Collection<FilePredicate> and) {
160    return AndPredicate.create(and);
161  }
162
163  public FilePredicate and(FilePredicate... and) {
164    return AndPredicate.create(Arrays.asList(and));
165  }
166
167  public FilePredicate and(FilePredicate first, FilePredicate second) {
168    return AndPredicate.create(Arrays.asList(first, second));
169  }
170}