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 * Client code should use {@link org.sonar.api.batch.fs.FileSystem#predicates()} to get an instance 040 */ 041 DefaultFilePredicates() { 042 } 043 044 /** 045 * Returns a predicate that always evaluates to true 046 */ 047 @Override 048 public FilePredicate all() { 049 return TruePredicate.TRUE; 050 } 051 052 /** 053 * Returns a predicate that always evaluates to false 054 */ 055 @Override 056 public FilePredicate none() { 057 return FalsePredicate.FALSE; 058 } 059 060 /** 061 * Warning - not efficient because absolute path is not indexed yet. 062 */ 063 @Override 064 public FilePredicate hasAbsolutePath(String s) { 065 return new AbsolutePathPredicate(s); 066 } 067 068 /** 069 * TODO document that non-normalized path and Windows-style path are supported 070 */ 071 @Override 072 public FilePredicate hasRelativePath(String s) { 073 return new RelativePathPredicate(s); 074 } 075 076 @Override 077 public FilePredicate matchesPathPattern(String inclusionPattern) { 078 return new PathPatternPredicate(PathPattern.create(inclusionPattern)); 079 } 080 081 @Override 082 public FilePredicate matchesPathPatterns(String[] inclusionPatterns) { 083 if (inclusionPatterns.length == 0) { 084 return TruePredicate.TRUE; 085 } 086 FilePredicate[] predicates = new FilePredicate[inclusionPatterns.length]; 087 for (int i = 0; i < inclusionPatterns.length; i++) { 088 predicates[i] = new PathPatternPredicate(PathPattern.create(inclusionPatterns[i])); 089 } 090 return or(predicates); 091 } 092 093 @Override 094 public FilePredicate doesNotMatchPathPattern(String exclusionPattern) { 095 return not(matchesPathPattern(exclusionPattern)); 096 } 097 098 @Override 099 public FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns) { 100 if (exclusionPatterns.length == 0) { 101 return TruePredicate.TRUE; 102 } 103 return not(matchesPathPatterns(exclusionPatterns)); 104 } 105 106 @Override 107 public FilePredicate hasPath(String s) { 108 File file = new File(s); 109 if (file.isAbsolute()) { 110 return hasAbsolutePath(s); 111 } 112 return hasRelativePath(s); 113 } 114 115 @Override 116 public FilePredicate is(File ioFile) { 117 if (ioFile.isAbsolute()) { 118 return hasAbsolutePath(ioFile.getAbsolutePath()); 119 } 120 return hasRelativePath(ioFile.getPath()); 121 } 122 123 @Override 124 public FilePredicate hasLanguage(String language) { 125 return new LanguagePredicate(language); 126 } 127 128 @Override 129 public FilePredicate hasLanguages(Collection<String> languages) { 130 List<FilePredicate> list = new ArrayList<FilePredicate>(); 131 for (String language : languages) { 132 list.add(hasLanguage(language)); 133 } 134 return or(list); 135 } 136 137 @Override 138 public FilePredicate hasLanguages(String... languages) { 139 List<FilePredicate> list = new ArrayList<FilePredicate>(); 140 for (String language : languages) { 141 list.add(hasLanguage(language)); 142 } 143 return or(list); 144 } 145 146 @Override 147 public FilePredicate hasStatus(InputFile.Status status) { 148 return new StatusPredicate(status); 149 } 150 151 @Override 152 public FilePredicate hasType(InputFile.Type type) { 153 return new TypePredicate(type); 154 } 155 156 @Override 157 public FilePredicate not(FilePredicate p) { 158 return new NotPredicate(p); 159 } 160 161 @Override 162 public FilePredicate or(Collection<FilePredicate> or) { 163 return new OrPredicate(or); 164 } 165 166 @Override 167 public FilePredicate or(FilePredicate... or) { 168 return new OrPredicate(Arrays.asList(or)); 169 } 170 171 @Override 172 public FilePredicate or(FilePredicate first, FilePredicate second) { 173 return new OrPredicate(Arrays.asList(first, second)); 174 } 175 176 @Override 177 public FilePredicate and(Collection<FilePredicate> and) { 178 return new AndPredicate(and); 179 } 180 181 @Override 182 public FilePredicate and(FilePredicate... and) { 183 return new AndPredicate(Arrays.asList(and)); 184 } 185 186 @Override 187 public FilePredicate and(FilePredicate first, FilePredicate second) { 188 return new AndPredicate(Arrays.asList(first, second)); 189 } 190 }