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