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}