diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2014-12-17 16:29:22 +0100 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2014-12-17 16:29:22 +0100 |
commit | c8b766ce8f89d4b978fd52e485c3cc3c97032a4b (patch) | |
tree | 50d1515eef3d089461989d967681ff197d3988f1 /sonar-batch/src/main | |
parent | 764d9e62e1a867bf702772597524d7b40f736399 (diff) | |
download | sonarqube-c8b766ce8f89d4b978fd52e485c3cc3c97032a4b.tar.gz sonarqube-c8b766ce8f89d4b978fd52e485c3cc3c97032a4b.zip |
SONAR-5867 Sort symbol references to avoid variations between consecutive runs
Diffstat (limited to 'sonar-batch/src/main')
5 files changed, 28 insertions, 15 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java b/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java index 186e37edaa6..342c3503fb6 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java @@ -58,7 +58,9 @@ import javax.annotation.Nullable; import java.io.IOException; import java.io.StringWriter; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -330,7 +332,15 @@ public class SourcePersister implements ScanPersister { StringBuilder[] symbolRefsPerLine = new StringBuilder[file.lines()]; long[] originalLineOffsets = file.originalLineOffsets(); int symbolId = 1; - for (Symbol symbol : symbolRefs.referencesBySymbol().keySet()) { + List<Symbol> symbols = new ArrayList<Symbol>(symbolRefs.referencesBySymbol().keySet()); + // Sort symbols to avoid false variation that would lead to an unnecessary update + Collections.sort(symbols, new Comparator<Symbol>() { + @Override + public int compare(Symbol o1, Symbol o2) { + return o1.getDeclarationStartOffset() - o2.getDeclarationStartOffset(); + } + }); + for (Symbol symbol : symbols) { int declarationStartOffset = symbol.getDeclarationStartOffset(); int declarationEndOffset = symbol.getDeclarationEndOffset(); int length = declarationEndOffset - declarationStartOffset; diff --git a/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java b/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java index 8499776bfb7..2886cfbc28c 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java +++ b/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java @@ -80,6 +80,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; /** * Main utility class for writing batch medium tests. @@ -406,7 +407,7 @@ public class BatchMediumTester { * @param symbolEndOffset 0-based end offset for the symbol in file */ @CheckForNull - public List<Integer> symbolReferencesFor(InputFile file, int symbolStartOffset, int symbolEndOffset) { + public Set<Integer> symbolReferencesFor(InputFile file, int symbolStartOffset, int symbolEndOffset) { SymbolData data = symbolTablePerFile.get(file); if (data == null) { return null; diff --git a/sonar-batch/src/main/java/org/sonar/batch/source/DefaultSymbolTable.java b/sonar-batch/src/main/java/org/sonar/batch/source/DefaultSymbolTable.java index 8aafb847386..b4ce0c15878 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/source/DefaultSymbolTable.java +++ b/sonar-batch/src/main/java/org/sonar/batch/source/DefaultSymbolTable.java @@ -28,16 +28,18 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.TreeSet; public class DefaultSymbolTable implements Symbolizable.SymbolTable { - private Map<Symbol, List<Integer>> referencesBySymbol; + private Map<Symbol, Set<Integer>> referencesBySymbol; - private DefaultSymbolTable(Map<Symbol, List<Integer>> referencesBySymbol) { + private DefaultSymbolTable(Map<Symbol, Set<Integer>> referencesBySymbol) { this.referencesBySymbol = referencesBySymbol; } - public Map<Symbol, List<Integer>> getReferencesBySymbol() { + public Map<Symbol, Set<Integer>> getReferencesBySymbol() { return referencesBySymbol; } @@ -57,7 +59,7 @@ public class DefaultSymbolTable implements Symbolizable.SymbolTable { public static class Builder implements Symbolizable.SymbolTableBuilder { - private final Map<Symbol, List<Integer>> referencesBySymbol = new LinkedHashMap<Symbol, List<Integer>>(); + private final Map<Symbol, Set<Integer>> referencesBySymbol = new LinkedHashMap<Symbol, Set<Integer>>(); private final String componentKey; public Builder(String componentKey) { @@ -67,7 +69,7 @@ public class DefaultSymbolTable implements Symbolizable.SymbolTable { @Override public Symbol newSymbol(int fromOffset, int toOffset) { Symbol symbol = new DefaultSymbol(fromOffset, toOffset); - referencesBySymbol.put(symbol, new ArrayList<Integer>()); + referencesBySymbol.put(symbol, new TreeSet<Integer>()); return symbol; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/symbol/DefaultSymbolTableBuilder.java b/sonar-batch/src/main/java/org/sonar/batch/symbol/DefaultSymbolTableBuilder.java index a6e8c8c0aaf..72d4c050eb4 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/symbol/DefaultSymbolTableBuilder.java +++ b/sonar-batch/src/main/java/org/sonar/batch/symbol/DefaultSymbolTableBuilder.java @@ -27,17 +27,17 @@ import org.sonar.batch.index.ComponentDataCache; import org.sonar.core.source.SnapshotDataTypes; import java.io.Serializable; -import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.TreeSet; public class DefaultSymbolTableBuilder implements SymbolTableBuilder { private final String componentKey; private final ComponentDataCache cache; - private final Map<org.sonar.api.source.Symbol, List<Integer>> referencesBySymbol = new LinkedHashMap<org.sonar.api.source.Symbol, List<Integer>>(); + private final Map<org.sonar.api.source.Symbol, Set<Integer>> referencesBySymbol = new LinkedHashMap<org.sonar.api.source.Symbol, Set<Integer>>(); public DefaultSymbolTableBuilder(String componentKey, ComponentDataCache cache) { this.componentKey = componentKey; @@ -47,7 +47,7 @@ public class DefaultSymbolTableBuilder implements SymbolTableBuilder { @Override public Symbol newSymbol(int fromOffset, int toOffset) { org.sonar.api.source.Symbol symbol = new DefaultSymbol(fromOffset, toOffset); - referencesBySymbol.put(symbol, new ArrayList<Integer>()); + referencesBySymbol.put(symbol, new TreeSet<Integer>()); return symbol; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/symbol/SymbolData.java b/sonar-batch/src/main/java/org/sonar/batch/symbol/SymbolData.java index 0f55e194e8b..baf897c6d1b 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/symbol/SymbolData.java +++ b/sonar-batch/src/main/java/org/sonar/batch/symbol/SymbolData.java @@ -24,21 +24,21 @@ import org.sonar.api.batch.sensor.symbol.Symbol; import org.sonar.batch.index.Data; import java.util.Collection; -import java.util.List; import java.util.Map; +import java.util.Set; public class SymbolData implements Data { public static final String FIELD_SEPARATOR = ","; public static final String SYMBOL_SEPARATOR = ";"; - private final Map<org.sonar.api.source.Symbol, List<Integer>> referencesBySymbol; + private final Map<org.sonar.api.source.Symbol, Set<Integer>> referencesBySymbol; - public SymbolData(Map<org.sonar.api.source.Symbol, List<Integer>> referencesBySymbol) { + public SymbolData(Map<org.sonar.api.source.Symbol, Set<Integer>> referencesBySymbol) { this.referencesBySymbol = referencesBySymbol; } - public Map<org.sonar.api.source.Symbol, List<Integer>> referencesBySymbol() { + public Map<org.sonar.api.source.Symbol, Set<Integer>> referencesBySymbol() { return referencesBySymbol; } |