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.apache.commons.io.FilenameUtils; 023 import org.sonar.api.batch.fs.InputFile; 024 import org.sonar.api.utils.PathUtils; 025 026 import javax.annotation.CheckForNull; 027 import java.io.*; 028 029 /** 030 * @since 4.2 031 */ 032 public class DefaultInputFile implements InputFile, org.sonar.api.resources.InputFile, Serializable { 033 034 private final String relativePath; 035 private String absolutePath; 036 private String language; 037 private Type type = Type.MAIN; 038 private Status status; 039 private String hash; 040 private int lines; 041 private String key; 042 private String deprecatedKey; 043 private String sourceDirAbsolutePath; 044 private String pathRelativeToSourceDir; 045 private String basedir; 046 047 public DefaultInputFile(String relativePath) { 048 this.relativePath = FilenameUtils.normalize(relativePath, true); 049 } 050 051 @Override 052 public String relativePath() { 053 return relativePath; 054 } 055 056 /** 057 * Marked as nullable just for the unit tests that do not call {@link #setFile(java.io.File)} 058 * previously. 059 */ 060 @Override 061 @CheckForNull 062 public String absolutePath() { 063 return absolutePath; 064 } 065 066 @Override 067 public File file() { 068 if (absolutePath == null) { 069 throw new IllegalStateException("Can not return the java.io.File because absolute path is not set (see method setFile(java.io.File))"); 070 } 071 return new File(absolutePath); 072 } 073 074 /** 075 * Marked as nullable just for the unit tests that do not call {@link #setLanguage(String)} 076 * previously. 077 */ 078 @CheckForNull 079 @Override 080 public String language() { 081 return language; 082 } 083 084 @Override 085 public Type type() { 086 return type; 087 } 088 089 /** 090 * Marked as nullable just for the unit tests that do not previously call 091 * {@link #setStatus(org.sonar.api.batch.fs.InputFile.Status)} 092 */ 093 @CheckForNull 094 @Override 095 public Status status() { 096 return status; 097 } 098 099 /** 100 * Digest hash of the file. Marked as nullable just for the unit tests 101 * that do not previously call {@link #setHash(String)} 102 */ 103 @CheckForNull 104 public String hash() { 105 return hash; 106 } 107 108 @Override 109 public int lines() { 110 return lines; 111 } 112 113 /** 114 * Component key. It's marked as nullable just for the unit tests that 115 * do not previously call {@link #setKey(String)}. 116 */ 117 @CheckForNull 118 public String key() { 119 return key; 120 } 121 122 public DefaultInputFile setAbsolutePath(String s) { 123 this.absolutePath = FilenameUtils.normalize(s, true); 124 return this; 125 } 126 127 public DefaultInputFile setLanguage(String language) { 128 this.language = language; 129 return this; 130 } 131 132 public DefaultInputFile setFile(File file) { 133 setAbsolutePath(file.getAbsolutePath()); 134 return this; 135 } 136 137 public DefaultInputFile setType(Type type) { 138 this.type = type; 139 return this; 140 } 141 142 public DefaultInputFile setStatus(Status status) { 143 this.status = status; 144 return this; 145 } 146 147 public DefaultInputFile setHash(String hash) { 148 this.hash = hash; 149 return this; 150 } 151 152 public DefaultInputFile setLines(int lines) { 153 this.lines = lines; 154 return this; 155 } 156 157 public DefaultInputFile setKey(String s) { 158 this.key = s; 159 return this; 160 } 161 162 /** 163 * Key used before version 4.2. It can be different than {@link #key} on Java files. 164 */ 165 public String deprecatedKey() { 166 return deprecatedKey; 167 } 168 169 public DefaultInputFile setDeprecatedKey(String s) { 170 this.deprecatedKey = s; 171 return this; 172 } 173 174 /** 175 * Used only for backward-compatibility. Meaningless since version 4.2. 176 */ 177 public String sourceDirAbsolutePath() { 178 return sourceDirAbsolutePath; 179 } 180 181 public DefaultInputFile setSourceDirAbsolutePath(String s) { 182 this.sourceDirAbsolutePath = FilenameUtils.normalize(s, true); 183 return this; 184 } 185 186 /** 187 * Used only for backward-compatibility. Meaningless since version 4.2. 188 */ 189 190 public String pathRelativeToSourceDir() { 191 return pathRelativeToSourceDir; 192 } 193 194 public DefaultInputFile setPathRelativeToSourceDir(String s) { 195 this.pathRelativeToSourceDir = FilenameUtils.normalize(s, true); 196 return this; 197 } 198 199 /** 200 * @deprecated in 4.2. Replaced by {@link org.sonar.api.batch.fs.FileSystem#baseDir()} 201 */ 202 @Deprecated 203 @Override 204 public File getFileBaseDir() { 205 return new File(basedir); 206 } 207 208 public void setBasedir(File basedir) { 209 this.basedir = PathUtils.sanitize(basedir.getAbsolutePath()); 210 } 211 212 /** 213 * @deprecated in 4.2. Use {@link #file()} 214 */ 215 @Deprecated 216 @Override 217 public File getFile() { 218 return file(); 219 } 220 221 /** 222 * @deprecated in 4.2. Use {@link #relativePath()} 223 */ 224 @Deprecated 225 @Override 226 public String getRelativePath() { 227 return pathRelativeToSourceDir; 228 } 229 230 @Override 231 public InputStream getInputStream() throws FileNotFoundException { 232 return new BufferedInputStream(new FileInputStream(file())); 233 } 234 235 @Override 236 public boolean equals(Object o) { 237 if (this == o) { 238 return true; 239 } 240 if (o == null || getClass() != o.getClass()) { 241 return false; 242 } 243 244 DefaultInputFile that = (DefaultInputFile) o; 245 return relativePath.equals(that.relativePath); 246 } 247 248 @Override 249 public int hashCode() { 250 return relativePath.hashCode(); 251 } 252 253 @Override 254 public String toString() { 255 return "[relative=" + relativePath + ", abs=" + absolutePath + "]"; 256 } 257 } 258 259 260