001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2008-2011 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     */
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.DuplicatedSourceException;
027    import org.sonar.api.resources.Project;
028    import org.sonar.api.resources.ProjectLink;
029    import org.sonar.api.resources.Resource;
030    import org.sonar.api.rules.Violation;
031    import org.sonar.graph.DirectedGraphAccessor;
032    
033    import java.util.Collection;
034    import java.util.Date;
035    import java.util.List;
036    import java.util.Set;
037    
038    public abstract class SonarIndex implements DirectedGraphAccessor<Resource, Dependency> {
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       * If the method resource.getParent() does not return null, then this parent will be indexed too.
043       *
044       * @return false if the resource is excluded
045       * @since 2.6
046       */
047      public abstract boolean index(Resource resource);
048    
049    
050      /**
051       * Indexes a resource. This method does nothing if the resource is already indexed.
052       *
053       * @param resource        the resource to index. Not nullable
054       * @param parentReference a reference to the indexed parent. If null, the resource is indexed as a direct child of project.
055       * @return false if the parent is not indexed or if the resource is excluded
056       * @since 2.6
057       */
058      public abstract boolean index(Resource resource, Resource parentReference);
059    
060      /**
061       * Returns true if the referenced resource is excluded. An excluded resource is not indexed.
062       * @since 2.6
063       */
064      public abstract boolean isExcluded(Resource reference);
065    
066      /**
067       * @since 2.6
068       */
069      public abstract 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      public abstract <R extends Resource> R getResource(R reference);
079    
080      /**
081       * @since 2.6
082       */
083      public abstract Resource getParent(Resource reference);
084    
085      /**
086       * @since 2.6
087       */
088    
089      public abstract Collection<Resource> getChildren(Resource reference);
090    
091      /**
092       * Save the source code of a file. The file must be have been indexed before.
093       * Note: the source stream is not closed.
094       *
095       * @return false if the resource is excluded or not indexed
096       * @throws org.sonar.api.resources.DuplicatedSourceException
097       *          if the source has already been set on this resource
098       */
099      public abstract void setSource(Resource reference, String source) throws DuplicatedSourceException;
100    
101      public abstract Project getProject();
102    
103      public final Collection<Resource> getResources() {
104        return getVertices();
105      }
106    
107      /**
108       * Indexes the resource.
109       * @return the indexed resource, even if it's excluded
110       * @deprecated since 2.6. Use methods index()
111       */
112      @Deprecated
113      public abstract Resource addResource(Resource resource);
114    
115      public abstract Measure getMeasure(Resource resource, Metric metric);
116    
117      public abstract <M> M getMeasures(Resource resource, MeasuresFilter<M> filter);
118    
119      /**
120       * @since 2.5
121       */
122      public abstract void addViolation(Violation violation, boolean force);
123    
124      public final void addViolation(Violation violation) {
125        addViolation(violation, false);
126      }
127    
128      /**
129       * Warning: the resource is automatically indexed for backward-compatibility, but it should be explictly
130       * indexed before. Next versions will deactivate this automatic indexation.
131       *
132       * @throws SonarException if the metric is unknown.
133       */
134      public abstract Measure addMeasure(Resource resource, Measure measure);
135    
136      public abstract Dependency addDependency(Dependency dependency);
137    
138      public abstract Set<Dependency> getDependencies();
139    
140      public abstract void addLink(ProjectLink link);
141    
142      public abstract void deleteLink(String key);
143    
144      public abstract List<Event> getEvents(Resource resource);
145    
146      public abstract void deleteEvent(Event event);
147    
148      public abstract Event addEvent(Resource resource, String name, String description, String category, Date date);
149    
150      public final Collection<Dependency> getOutgoingDependencies(Resource from) {
151        return getOutgoingEdges(from);
152      }
153    
154      public final Collection<Dependency> getIncomingDependencies(Resource to) {
155        return getIncomingEdges(to);
156      }
157    }