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