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.batch;
021    
022    import org.sonar.api.batch.fs.InputFile;
023    import org.sonar.api.batch.fs.InputPath;
024    import org.sonar.api.design.Dependency;
025    import org.sonar.api.measures.Measure;
026    import org.sonar.api.measures.MeasuresFilter;
027    import org.sonar.api.measures.Metric;
028    import org.sonar.api.resources.ProjectLink;
029    import org.sonar.api.resources.Resource;
030    import org.sonar.api.rules.Violation;
031    
032    import javax.annotation.CheckForNull;
033    
034    import java.io.Serializable;
035    import java.util.Collection;
036    import java.util.Date;
037    import java.util.List;
038    import java.util.Set;
039    
040    /**
041     * @since 1.10
042     */
043    public interface SensorContext {
044    
045      /**
046       * Indexes a resource as a direct child of project. This method does nothing and returns true if the resource already indexed.
047       *
048       * @return false if the resource is excluded
049       * @deprecated since 4.2 Resource indexing is done by the platform for all physical resources.
050       */
051      @Deprecated
052      boolean index(Resource resource);
053    
054      /**
055       * Indexes a resource. This method does nothing if the resource is already indexed.
056       *
057       * @param resource        the resource to index. Not nullable
058       * @param parentReference a reference to the parent. If null, the the resource is indexed as a direct child of project.
059       * @return false if the parent is not indexed or if the resource is excluded
060       * @deprecated since 4.2 Resource indexing is done by the platform for all physical resources.
061       */
062      @Deprecated
063      boolean index(Resource resource, Resource parentReference);
064    
065      /**
066       * Returns true if the referenced resource is indexed and excluded.
067       *
068       * @since 2.6
069       * @deprecated since 4.2 Excluded resources are not indexed.
070       */
071      @Deprecated
072      boolean isExcluded(Resource reference);
073    
074      /**
075       * Returns true if the referenced resource is indexed.
076       *
077       * @since 2.6
078       * @deprecated since 4.2 Excluded resources are not indexed.
079       */
080      @Deprecated
081      boolean isIndexed(Resource reference, boolean acceptExcluded);
082    
083      /**
084       * Search for an indexed resource.
085       *
086       * @param reference the resource reference
087       * @return the indexed resource, null if it's not indexed
088       * @since 1.10. Generic types since 2.6.
089       */
090      @CheckForNull
091      <R extends Resource> R getResource(R reference);
092    
093      /**
094       * @since 2.6
095       */
096      Resource getParent(Resource reference);
097    
098      /**
099       * @since 2.6
100       */
101    
102      Collection<Resource> getChildren(Resource reference);
103    
104      // ----------- MEASURES ON PROJECT --------------
105    
106      /**
107       * Find a project measure
108       */
109      <G extends Serializable> Measure<G> getMeasure(Metric<G> metric);
110    
111      /**
112       * All measures of the project. Never return null.
113       */
114      <M> M getMeasures(MeasuresFilter<M> filter);
115    
116      /**
117       * Add a measure on project
118       */
119      Measure saveMeasure(Measure measure);
120    
121      /**
122       * Add a measure on project
123       */
124      Measure saveMeasure(Metric metric, Double value);
125    
126      // ----------- MEASURES ON RESOURCES --------------
127    
128      /**
129       * Find a measure for this project
130       */
131      <G extends Serializable> Measure<G> getMeasure(Resource resource, Metric<G> metric);
132    
133      /**
134       * Key is updated when saving the resource.
135       *
136       * @return the key as saved in database. Null if the resource is set as excluded.
137       * @deprecated use the methods index()
138       */
139      @Deprecated
140      String saveResource(Resource resource);
141    
142      /**
143       * Find all measures for this project. Never return null.
144       */
145      <M> M getMeasures(Resource resource, MeasuresFilter<M> filter);
146    
147      /**
148       * Add or update a measure.
149       * <p>
150       * The resource is automatically saved, so there is no need to execute the method saveResource(). Does nothing if the resource is set as
151       * excluded.
152       * </p>
153       */
154      Measure saveMeasure(Resource resource, Metric metric, Double value);
155    
156      /**
157       * Add or update a measure.
158       * <p>
159       * The resource is automatically saved, so there is no need to execute the method saveResource(). Does nothing if the resource is set as
160       * excluded.
161       * </p>
162       */
163      Measure saveMeasure(Resource resource, Measure measure);
164    
165      // ----------- RULE VIOLATIONS --------------
166    
167      /**
168       * Save a coding rule violation.
169       *
170       * @param force allows to force creation of violation even if it was supressed by {@link org.sonar.api.rules.ViolationFilter}
171       * @since 2.5
172       * @deprecated in 3.6, replaced by {@link org.sonar.api.issue.Issuable}
173       */
174      @Deprecated
175      void saveViolation(Violation violation, boolean force);
176    
177      /**
178       * Save a coding rule violation.
179       * @deprecated in 3.6, replaced by {@link org.sonar.api.issue.Issuable}
180       */
181      @Deprecated
182      void saveViolation(Violation violation);
183    
184      /**
185       * Saves a list of violations.
186       * @deprecated in 3.6, replaced by {@link org.sonar.api.issue.Issuable}
187       */
188      @Deprecated
189      void saveViolations(Collection<Violation> violations);
190    
191      // ----------- DEPENDENCIES BETWEEN RESOURCES --------------
192    
193      /**
194       * Build a new dependency : from depends upon to. The dependency is NOT saved. The method saveDependency() must still be executed.
195       */
196      Dependency saveDependency(Dependency dependency);
197    
198      Set<Dependency> getDependencies();
199    
200      Collection<Dependency> getIncomingDependencies(Resource to);
201    
202      Collection<Dependency> getOutgoingDependencies(Resource from);
203    
204      // ----------- FILE SOURCES --------------
205    
206      /**
207       * Save the source code of a file. The file must be have been indexed before.
208       *
209       * @throws org.sonar.api.resources.DuplicatedSourceException if the source has already been set on this resource
210       * @since 1.10. Returns a boolean since 2.6.
211       * @deprecated since 4.2 Source import is done by the platform
212       */
213      @Deprecated
214      void saveSource(Resource reference, String source);
215    
216      // ----------- LINKS --------------
217    
218      /**
219       * add a link to an external page like project homepage, sources (subversion, ...), continuous integration server... Example :
220       * context.addLink(new ProjectLink("maven_site, "Maven site", "http://my.maven.com)
221       */
222      void saveLink(ProjectLink link);
223    
224      /**
225       * remove a link. It does not fail if key is unknown.
226       */
227      void deleteLink(String key);
228    
229      // ----------- EVENTS --------------
230    
231      /**
232       * @param resource set null for project events
233       */
234      List<Event> getEvents(Resource resource);
235    
236      /**
237       * Creates an event for a given date
238       *
239       * @param name        the event name
240       * @param description the event description
241       * @param category    the event category
242       * @param date        the event date
243       * @return the created event
244       */
245      Event createEvent(Resource resource, String name, String description, String category, Date date);
246    
247      /**
248       * Deletes an event
249       *
250       * @param event the event to delete
251       */
252      void deleteEvent(Event event);
253    
254      /**
255       * Save measure on {@link InputFile}
256       * @since 4.2
257       */
258      Measure saveMeasure(InputFile inputFile, Metric metric, Double value);
259    
260      /**
261       * Save measure on {@link InputFile}
262       * @since 4.2
263       */
264      Measure saveMeasure(InputFile inputFile, Measure measure);
265    
266      /**
267       * Allow to get {@link Resource} corresponding to provided {@link InputPath}.
268       * @since 4.5.2
269       */
270      Resource getResource(InputPath inputPath);
271    }