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.api.batch.fs.internal;
021    
022    import org.sonar.api.batch.fs.FilePredicate;
023    import org.sonar.api.batch.fs.FilePredicates;
024    import org.sonar.api.batch.fs.InputFile;
025    
026    import java.io.File;
027    import java.util.ArrayList;
028    import java.util.Arrays;
029    import java.util.Collection;
030    import java.util.List;
031    
032    /**
033     * Factory of {@link org.sonar.api.batch.fs.FilePredicate}
034     *
035     * @since 4.2
036     */
037    public 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    }