aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-batch/src/main
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2014-12-17 16:29:22 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2014-12-17 16:29:22 +0100
commitc8b766ce8f89d4b978fd52e485c3cc3c97032a4b (patch)
tree50d1515eef3d089461989d967681ff197d3988f1 /sonar-batch/src/main
parent764d9e62e1a867bf702772597524d7b40f736399 (diff)
downloadsonarqube-c8b766ce8f89d4b978fd52e485c3cc3c97032a4b.tar.gz
sonarqube-c8b766ce8f89d4b978fd52e485c3cc3c97032a4b.zip
SONAR-5867 Sort symbol references to avoid variations between consecutive runs
Diffstat (limited to 'sonar-batch/src/main')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java12
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java3
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/source/DefaultSymbolTable.java12
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/symbol/DefaultSymbolTableBuilder.java8
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/symbol/SymbolData.java8
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;
}