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.resources; 021 022import org.apache.commons.lang.StringUtils; 023 024import javax.annotation.CheckForNull; 025import javax.annotation.Nullable; 026 027import java.io.Serializable; 028 029/** 030 * The interface to implement to create a resource in Sonar 031 * 032 * @since 1.10 033 */ 034public 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 = null; 127 128 private String key = null; 129 130 private String deprecatedKey = null; 131 132 private String path = null; 133 134 private String effectiveKey = null; 135 136 /** 137 * @return the resource key 138 */ 139 public final String getKey() { 140 return key; 141 } 142 143 /** 144 * Internal use only 145 */ 146 public void setKey(String s) { 147 this.key = s; 148 } 149 150 /** 151 * @return the resource deprecated key. Should not be used except to deal with backward compatibility. 152 * @since 4.2 153 */ 154 public final String getDeprecatedKey() { 155 return deprecatedKey; 156 } 157 158 /** 159 * For internal use only 160 */ 161 public void setDeprecatedKey(String s) { 162 this.deprecatedKey = s; 163 } 164 165 /** 166 * @return the resource name 167 */ 168 public abstract String getName(); 169 170 /** 171 * @return the resource long name 172 */ 173 public abstract String getLongName(); 174 175 /** 176 * @return the resource description 177 */ 178 public abstract String getDescription(); 179 180 /** 181 * @return the language of the resource. Only {@link File}s have a non null value. 182 */ 183 @CheckForNull 184 public abstract Language getLanguage(); 185 186 /** 187 * @return the scope 188 */ 189 public abstract String getScope(); 190 191 /** 192 * The qualifier tells the type of the resource. For example, it can be a File, a Class, a Project, a Unit Test... 193 * 194 * @return the qualifier 195 * @see org.sonar.api.resources.Qualifiers for the list of qualifiers 196 * @see org.sonar.api.resources.ResourceUtils to find out if a resource if a class, a unit test,... from its qualifier 197 */ 198 public abstract String getQualifier(); 199 200 /** 201 * The parent is used to build the resources tree, for example for relations between classes, packages and projects. 202 * <p> 203 * Return null if the parent is the project. 204 * </p> 205 */ 206 public abstract Resource getParent(); 207 208 /** 209 * Check resource against an Ant pattern, like mypackag?/*Foo.java. It's used for example to match resource exclusions. 210 * 211 * @param antPattern Ant-like pattern (with **, * and ?). It includes file suffixes. 212 * @return true if the resource matches the Ant pattern 213 */ 214 public abstract boolean matchFilePattern(String antPattern); 215 216 public final Integer getId() { 217 return id; 218 } 219 220 /** 221 * Internal use only 222 */ 223 public Resource setId(Integer id) { 224 this.id = id; 225 return this; 226 } 227 228 public String getPath() { 229 return path; 230 } 231 232 public Resource setPath(@Nullable String path) { 233 this.path = normalize(path); 234 return this; 235 } 236 237 @CheckForNull 238 protected static String normalize(@Nullable String path) { 239 if (StringUtils.isBlank(path)) { 240 return null; 241 } 242 String normalizedPath = path; 243 normalizedPath = normalizedPath.replace('\\', '/'); 244 normalizedPath = StringUtils.trim(normalizedPath); 245 if (Directory.SEPARATOR.equals(normalizedPath)) { 246 return Directory.SEPARATOR; 247 } 248 normalizedPath = StringUtils.removeStart(normalizedPath, Directory.SEPARATOR); 249 normalizedPath = StringUtils.removeEnd(normalizedPath, Directory.SEPARATOR); 250 return normalizedPath; 251 } 252 253 public String getEffectiveKey() { 254 return effectiveKey; 255 } 256 257 /** 258 * Internal use only 259 */ 260 public final Resource setEffectiveKey(String effectiveKey) { 261 this.effectiveKey = effectiveKey; 262 return this; 263 } 264 265 /** 266 * @deprecated since 2.6. 267 */ 268 @Deprecated 269 public final boolean isExcluded() { 270 return false; 271 } 272 273 /** 274 * Internal use only 275 * 276 * @deprecated since 2.6 should use SensorContext#isExcluded(resource). It will make inheritance of Resource easier. 277 */ 278 @Deprecated 279 public final Resource setExcluded(boolean b) { 280 return this; 281 } 282 283 @Override 284 public boolean equals(Object o) { 285 if (this == o) { 286 return true; 287 } 288 if (o == null) { 289 return false; 290 } 291 if (getClass() != o.getClass()) { 292 return false; 293 } 294 295 Resource resource = (Resource) o; 296 if (key != null) { 297 return key.equals(resource.key); 298 } else { 299 return resource.key == null && deprecatedKey.equals(resource.deprecatedKey); 300 } 301 } 302 303 @Override 304 public int hashCode() { 305 return key != null ? key.hashCode() : deprecatedKey.hashCode(); 306 } 307}