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