001    /*
002     * SonarQube, open source software quality management tool.
003     * Copyright (C) 2008-2013 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 java.io.Serializable;
023    
024    /**
025     * The interface to implement to create a resource in Sonar
026     * 
027     * @since 1.10
028     */
029    public abstract class Resource<P extends Resource> implements Serializable {
030    
031      /**
032       * @deprecated since 2.6. Use Scopes.PROJECT.
033       */
034      @Deprecated
035      public static final String SCOPE_SET = Scopes.PROJECT;
036    
037      /**
038       * @deprecated since 2.6. Use Scopes.DIRECTORY.
039       */
040      @Deprecated
041      public static final String SCOPE_SPACE = Scopes.DIRECTORY;
042    
043      /**
044       * @deprecated since 2.6. Use Scopes.FILE.
045       */
046      @Deprecated
047      public static final String SCOPE_ENTITY = Scopes.FILE;
048    
049      /**
050       * @deprecated since 2.6. Use Qualifiers.VIEW.
051       */
052      @Deprecated
053      public static final String QUALIFIER_VIEW = Qualifiers.VIEW;
054    
055      /**
056       * @deprecated since 2.6. Use Qualifiers.SUBVIEW.
057       */
058      @Deprecated
059      public static final String QUALIFIER_SUBVIEW = Qualifiers.SUBVIEW;
060    
061      /**
062       * @deprecated since 2.6. Use Qualifiers.LIBRARY.
063       */
064      @Deprecated
065      public static final String QUALIFIER_LIB = Qualifiers.LIBRARY;
066    
067      /**
068       * @deprecated since 2.6. Use Qualifiers.PROJECT.
069       */
070      @Deprecated
071      public static final String QUALIFIER_PROJECT = Qualifiers.PROJECT;
072    
073      /**
074       * @deprecated since 2.6. Use Qualifiers.MODULE.
075       */
076      @Deprecated
077      public static final String QUALIFIER_MODULE = Qualifiers.MODULE;
078    
079      /**
080       * @deprecated since 2.6. Use Qualifiers.PACKAGE.
081       */
082      @Deprecated
083      public static final String QUALIFIER_PACKAGE = Qualifiers.PACKAGE;
084    
085      /**
086       * @deprecated since 2.6. Use Qualifiers.DIRECTORY.
087       */
088      @Deprecated
089      public static final String QUALIFIER_DIRECTORY = Qualifiers.DIRECTORY;
090    
091      /**
092       * @deprecated since 2.6. Use Qualifiers.FILE.
093       */
094      @Deprecated
095      public static final String QUALIFIER_FILE = Qualifiers.FILE;
096    
097      /**
098       * @deprecated since 2.6. Use Qualifiers.CLASS.
099       */
100      @Deprecated
101      public static final String QUALIFIER_CLASS = Qualifiers.CLASS;
102    
103      /**
104       * @deprecated since 2.6. Use Qualifiers.FIELD.
105       */
106      @Deprecated
107      public static final String QUALIFIER_FIELD = Qualifiers.FIELD;
108    
109      /**
110       * @deprecated since 2.6. Use Qualifiers.METHOD.
111       */
112      @Deprecated
113      public static final String QUALIFIER_METHOD = Qualifiers.METHOD;
114    
115      /**
116       * @deprecated since 2.6. Use Qualifiers.UNIT_TEST_FILE.
117       */
118      @Deprecated
119      public static final String QUALIFIER_UNIT_TEST_CLASS = Qualifiers.UNIT_TEST_FILE;
120    
121      private Integer id = null;
122    
123      private String key = null;
124    
125      private String effectiveKey = null;
126    
127      private boolean isExcluded = false;
128    
129      /**
130       * @return the resource key
131       */
132      public final String getKey() {
133        return key;
134      }
135    
136      protected void setKey(String s) {
137        this.key = s;
138      }
139    
140      /**
141       * @return the resource name
142       */
143      public abstract String getName();
144    
145      /**
146       * @return the resource long name
147       */
148      public abstract String getLongName();
149    
150      /**
151       * @return the resource description
152       */
153      public abstract String getDescription();
154    
155      /**
156       * @return the language
157       */
158      public abstract Language getLanguage();
159    
160      /**
161       * @return the scope
162       */
163      public abstract String getScope();
164    
165      /**
166       * The qualifier tells the type of the resource. For example, it can be a File, a Class, a Project, a Unit Test...
167       *
168       * @return the qualifier
169       *
170       * @see org.sonar.api.resources.Qualifiers for the list of qualifiers
171       * @see org.sonar.api.resources.ResourceUtils to find out if a resource if a class, a unit test,... from its qualifier
172       */
173      public abstract String getQualifier();
174    
175      /**
176       * The parent is used to build the resources tree, for example for relations between classes, packages and projects.
177       * <p>
178       * Return null if the parent is the project.
179       * </p>
180       */
181      public abstract P getParent();
182    
183      /**
184       * Check resource against an Ant pattern, like mypackag?/*Foo.java. It's used for example to match resource exclusions.
185       * 
186       * @param antPattern Ant-like pattern (with **, * and ?). It includes file suffixes.
187       * @return true if the resource matches the Ant pattern
188       */
189      public abstract boolean matchFilePattern(String antPattern);
190    
191      public final Integer getId() {
192        return id;
193      }
194    
195      /**
196       * Internal use only
197       */
198      public Resource setId(Integer id) {
199        this.id = id;
200        return this;
201      }
202    
203      public String getEffectiveKey() {
204        return effectiveKey;
205      }
206    
207      /**
208       * Internal use only
209       */
210      public final Resource setEffectiveKey(String effectiveKey) {
211        this.effectiveKey = effectiveKey;
212        return this;
213      }
214    
215      /**
216       * @deprecated since 2.6 should use SensorContext#isExcluded(resource). It will make inheritance of Resource easier.
217       */
218      @Deprecated
219      public final boolean isExcluded() {
220        return isExcluded;
221      }
222    
223      /**
224       * Internal use only
225       * @deprecated since 2.6 should use SensorContext#isExcluded(resource). It will make inheritance of Resource easier.
226       */
227      @Deprecated
228      public final Resource setExcluded(boolean b) {
229        isExcluded = b;
230        return this;
231      }
232    
233      @Override
234      public boolean equals(Object o) {
235        if (this == o) {
236          return true;
237        }
238        if (o == null || getClass() != o.getClass()) {
239          return false;
240        }
241    
242        Resource resource = (Resource) o;
243        return key.equals(resource.key);
244    
245      }
246    
247      @Override
248      public int hashCode() {
249        return key.hashCode();
250      }
251    }