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.resources; 021 022 import org.apache.commons.lang.StringUtils; 023 024 import javax.annotation.CheckForNull; 025 import javax.annotation.Nullable; 026 027 import java.io.Serializable; 028 029 /** 030 * The interface to implement to create a resource in Sonar 031 * 032 * @since 1.10 033 */ 034 public abstract class Resource implements Serializable { 035 036 /** 037 * @deprecated since 2.6. Use Scopes.PROJECT. 038 */ 039 @Deprecated 040 public static final String SCOPE_SET = Scopes.PROJECT; 041 042 /** 043 * @deprecated since 2.6. Use Scopes.DIRECTORY. 044 */ 045 @Deprecated 046 public static final String SCOPE_SPACE = Scopes.DIRECTORY; 047 048 /** 049 * @deprecated since 2.6. Use Scopes.FILE. 050 */ 051 @Deprecated 052 public static final String SCOPE_ENTITY = Scopes.FILE; 053 054 /** 055 * @deprecated since 2.6. Use Qualifiers.VIEW. 056 */ 057 @Deprecated 058 public static final String QUALIFIER_VIEW = Qualifiers.VIEW; 059 060 /** 061 * @deprecated since 2.6. Use Qualifiers.SUBVIEW. 062 */ 063 @Deprecated 064 public static final String QUALIFIER_SUBVIEW = Qualifiers.SUBVIEW; 065 066 /** 067 * @deprecated since 2.6. Use Qualifiers.LIBRARY. 068 */ 069 @Deprecated 070 public static final String QUALIFIER_LIB = Qualifiers.LIBRARY; 071 072 /** 073 * @deprecated since 2.6. Use Qualifiers.PROJECT. 074 */ 075 @Deprecated 076 public static final String QUALIFIER_PROJECT = Qualifiers.PROJECT; 077 078 /** 079 * @deprecated since 2.6. Use Qualifiers.MODULE. 080 */ 081 @Deprecated 082 public static final String QUALIFIER_MODULE = Qualifiers.MODULE; 083 084 /** 085 * @deprecated since 2.6. Use Qualifiers.PACKAGE. 086 */ 087 @Deprecated 088 public static final String QUALIFIER_PACKAGE = Qualifiers.PACKAGE; 089 090 /** 091 * @deprecated since 2.6. Use Qualifiers.DIRECTORY. 092 */ 093 @Deprecated 094 public static final String QUALIFIER_DIRECTORY = Qualifiers.DIRECTORY; 095 096 /** 097 * @deprecated since 2.6. Use Qualifiers.FILE. 098 */ 099 @Deprecated 100 public static final String QUALIFIER_FILE = Qualifiers.FILE; 101 102 /** 103 * @deprecated since 2.6. Use Qualifiers.CLASS. 104 */ 105 @Deprecated 106 public static final String QUALIFIER_CLASS = Qualifiers.CLASS; 107 108 /** 109 * @deprecated since 2.6. Use Qualifiers.FIELD. 110 */ 111 @Deprecated 112 public static final String QUALIFIER_FIELD = Qualifiers.FIELD; 113 114 /** 115 * @deprecated since 2.6. Use Qualifiers.METHOD. 116 */ 117 @Deprecated 118 public static final String QUALIFIER_METHOD = Qualifiers.METHOD; 119 120 /** 121 * @deprecated since 2.6. Use Qualifiers.UNIT_TEST_FILE. 122 */ 123 @Deprecated 124 public static final String QUALIFIER_UNIT_TEST_CLASS = Qualifiers.UNIT_TEST_FILE; 125 126 private Integer id; 127 128 private String key; 129 130 private String uuid; 131 132 private String deprecatedKey; 133 134 private String path; 135 136 private String effectiveKey; 137 138 /** 139 * @return the resource key 140 */ 141 public final String getKey() { 142 return key; 143 } 144 145 /** 146 * Internal use only 147 */ 148 public void setKey(String s) { 149 this.key = s; 150 } 151 152 /** 153 * @since 5.0 154 */ 155 public final String getUuid() { 156 return uuid; 157 } 158 159 /** 160 * Internal use only 161 */ 162 public void setUuid(String s) { 163 this.uuid = s; 164 } 165 166 /** 167 * @return the resource deprecated key. Should not be used except to deal with backward compatibility. 168 * @since 4.2 169 */ 170 public final String getDeprecatedKey() { 171 return deprecatedKey; 172 } 173 174 /** 175 * For internal use only 176 */ 177 public void setDeprecatedKey(String s) { 178 this.deprecatedKey = s; 179 } 180 181 /** 182 * @return the resource name 183 */ 184 public abstract String getName(); 185 186 /** 187 * @return the resource long name 188 */ 189 public abstract String getLongName(); 190 191 /** 192 * @return the resource description 193 */ 194 public abstract String getDescription(); 195 196 /** 197 * @return the language of the resource. Only {@link File}s have a non null value. 198 */ 199 @CheckForNull 200 public abstract Language getLanguage(); 201 202 /** 203 * @return the scope 204 */ 205 public abstract String getScope(); 206 207 /** 208 * The qualifier tells the type of the resource. For example, it can be a File, a Class, a Project, a Unit Test... 209 * 210 * @return the qualifier 211 * @see org.sonar.api.resources.Qualifiers for the list of qualifiers 212 * @see org.sonar.api.resources.ResourceUtils to find out if a resource if a class, a unit test,... from its qualifier 213 */ 214 public abstract String getQualifier(); 215 216 /** 217 * The parent is used to build the resources tree, for example for relations between classes, packages and projects. 218 * <p> 219 * Return null if the parent is the project. 220 * </p> 221 */ 222 public abstract Resource getParent(); 223 224 /** 225 * Check resource against an Ant pattern, like mypackag?/*Foo.java. It's used for example to match resource exclusions. 226 * 227 * @param antPattern Ant-like pattern (with **, * and ?). It includes file suffixes. 228 * @return true if the resource matches the Ant pattern 229 */ 230 public abstract boolean matchFilePattern(String antPattern); 231 232 public final Integer getId() { 233 return id; 234 } 235 236 /** 237 * Internal use only 238 */ 239 public Resource setId(Integer id) { 240 this.id = id; 241 return this; 242 } 243 244 public String getPath() { 245 return path; 246 } 247 248 public Resource setPath(@Nullable String path) { 249 this.path = normalize(path); 250 return this; 251 } 252 253 @CheckForNull 254 protected static String normalize(@Nullable String path) { 255 if (StringUtils.isBlank(path)) { 256 return null; 257 } 258 String normalizedPath = path; 259 normalizedPath = normalizedPath.replace('\\', '/'); 260 normalizedPath = StringUtils.trim(normalizedPath); 261 if (Directory.SEPARATOR.equals(normalizedPath)) { 262 return Directory.SEPARATOR; 263 } 264 normalizedPath = StringUtils.removeStart(normalizedPath, Directory.SEPARATOR); 265 normalizedPath = StringUtils.removeEnd(normalizedPath, Directory.SEPARATOR); 266 return normalizedPath; 267 } 268 269 public String getEffectiveKey() { 270 return effectiveKey; 271 } 272 273 /** 274 * Internal use only 275 */ 276 public final Resource setEffectiveKey(String effectiveKey) { 277 this.effectiveKey = effectiveKey; 278 return this; 279 } 280 281 /** 282 * @deprecated since 2.6. 283 */ 284 @Deprecated 285 public final boolean isExcluded() { 286 return false; 287 } 288 289 /** 290 * Internal use only 291 * 292 * @deprecated since 2.6 should use SensorContext#isExcluded(resource). It will make inheritance of Resource easier. 293 */ 294 @Deprecated 295 public final Resource setExcluded(boolean b) { 296 return this; 297 } 298 299 @Override 300 public boolean equals(Object o) { 301 if (this == o) { 302 return true; 303 } 304 if (o == null) { 305 return false; 306 } 307 if (getClass() != o.getClass()) { 308 return false; 309 } 310 311 Resource resource = (Resource) o; 312 if (key != null) { 313 return key.equals(resource.key); 314 } else { 315 return resource.key == null && deprecatedKey.equals(resource.deprecatedKey); 316 } 317 } 318 319 @Override 320 public int hashCode() { 321 return key != null ? key.hashCode() : deprecatedKey.hashCode(); 322 } 323 }