001/*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar 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 * Sonar 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
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019 */
020package org.sonar.api.batch;
021
022import org.sonar.api.design.Dependency;
023import org.sonar.api.measures.Measure;
024import org.sonar.api.measures.MeasuresFilter;
025import org.sonar.api.measures.Metric;
026import org.sonar.api.resources.DuplicatedSourceException;
027import org.sonar.api.resources.Project;
028import org.sonar.api.resources.ProjectLink;
029import org.sonar.api.resources.Resource;
030import org.sonar.api.rules.Violation;
031import org.sonar.api.violations.ViolationQuery;
032import org.sonar.graph.DirectedGraphAccessor;
033
034import java.util.Collection;
035import java.util.Date;
036import java.util.List;
037import java.util.Set;
038
039public abstract class SonarIndex implements DirectedGraphAccessor<Resource, Dependency> {
040
041  /**
042   * Indexes a resource as a direct child of project. This method does nothing and returns true if the resource already indexed.
043   * If the method resource.getParent() does not return null, then this parent will be indexed too.
044   *
045   * @return false if the resource is excluded
046   * @since 2.6
047   */
048  public abstract boolean index(Resource resource);
049
050
051  /**
052   * Indexes a resource. This method does nothing if the resource is already indexed.
053   *
054   * @param resource        the resource to index. Not nullable
055   * @param parentReference a reference to the indexed parent. If null, the resource is indexed as a direct child of project.
056   * @return false if the parent is not indexed or if the resource is excluded
057   * @since 2.6
058   */
059  public abstract boolean index(Resource resource, Resource parentReference);
060
061  /**
062   * Returns true if the referenced resource is excluded. An excluded resource is not indexed.
063   * @since 2.6
064   */
065  public abstract boolean isExcluded(Resource reference);
066
067  /**
068   * @since 2.6
069   */
070  public abstract boolean isIndexed(Resource reference, boolean acceptExcluded);
071
072  /**
073   * Search for an indexed resource.
074   *
075   * @param reference the resource reference
076   * @return the indexed resource, null if it's not indexed
077   * @since 1.10. Generic types since 2.6.
078   */
079  public abstract <R extends Resource> R getResource(R reference);
080
081  /**
082   * @since 2.6
083   */
084  public abstract Resource getParent(Resource reference);
085
086  /**
087   * @since 2.6
088   */
089
090  public abstract Collection<Resource> getChildren(Resource reference);
091
092  /**
093   * Save the source code of a file. The file must be have been indexed before.
094   * Note: the source stream is not closed.
095   *
096   * @return false if the resource is excluded or not indexed
097   * @throws org.sonar.api.resources.DuplicatedSourceException
098   *          if the source has already been set on this resource
099   */
100  public abstract void setSource(Resource reference, String source) throws DuplicatedSourceException;
101
102  /**
103   * @return source code associated with a specified resource, <code>null</code> if not available
104   * @since 2.9
105   */
106  public abstract String getSource(Resource resource);
107
108  public abstract Project getProject();
109
110  public final Collection<Resource> getResources() {
111    return getVertices();
112  }
113
114  /**
115   * Indexes the resource.
116   * @return the indexed resource, even if it's excluded
117   * @deprecated since 2.6. Use methods index()
118   */
119  @Deprecated
120  public abstract Resource addResource(Resource resource);
121
122  public abstract Measure getMeasure(Resource resource, Metric metric);
123
124  public abstract <M> M getMeasures(Resource resource, MeasuresFilter<M> filter);
125
126  /**
127   * Returns the violations that match the {@link ViolationQuery} parameters.
128   *
129   * @since 2.8
130   * @param violationQuery
131   *          the request parameters specified as a {@link ViolationQuery}
132   * @return the list of violations that match those parameters
133   */
134  public abstract List<Violation> getViolations(ViolationQuery violationQuery);
135
136  /**
137   * Returns all the active (= non switched-off) violations found on the given resource. Equivalent to
138   * {@link #getViolations(ViolationQuery)} called with <code>ViolationQuery.create().forResource(resource).ignoreSwitchedOff(true)</code>
139   * as a parameter.
140   *
141   * @since 2.7
142   * @return the list of violations
143   */
144  public final List<Violation> getViolations(Resource resource) {
145    return getViolations(ViolationQuery.create().forResource(resource));
146  }
147
148  /**
149   * @since 2.5
150   */
151  public abstract void addViolation(Violation violation, boolean force);
152
153  public final void addViolation(Violation violation) {
154    addViolation(violation, false);
155  }
156
157  /**
158   * Warning: the resource is automatically indexed for backward-compatibility, but it should be explictly
159   * indexed before. Next versions will deactivate this automatic indexation.
160   */
161  public abstract Measure addMeasure(Resource resource, Measure measure);
162
163  public abstract Dependency addDependency(Dependency dependency);
164
165  public abstract Set<Dependency> getDependencies();
166
167  public abstract void addLink(ProjectLink link);
168
169  public abstract void deleteLink(String key);
170
171  public abstract List<Event> getEvents(Resource resource);
172
173  public abstract void deleteEvent(Event event);
174
175  public abstract Event addEvent(Resource resource, String name, String description, String category, Date date);
176
177  public final Collection<Dependency> getOutgoingDependencies(Resource from) {
178    return getOutgoingEdges(from);
179  }
180
181  public final Collection<Dependency> getIncomingDependencies(Resource to) {
182    return getIncomingEdges(to);
183  }
184}