diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-02 17:14:05 +0200 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-02 17:14:52 +0200 |
commit | 833e747cee8e1927972a1d30bd1fd9d16d9e55ba (patch) | |
tree | f730d155e351a8df1662e4f04ddd901bbcbbeb41 /plugins | |
parent | d1d86087723954a671e9e8bfa8aa2d98e0f9c9f8 (diff) | |
download | sonarqube-833e747cee8e1927972a1d30bd1fd9d16d9e55ba.tar.gz sonarqube-833e747cee8e1927972a1d30bd1fd9d16d9e55ba.zip |
SONAR-5672 Fix regression with measure duplication_lines_data
Diffstat (limited to 'plugins')
5 files changed, 35 insertions, 49 deletions
diff --git a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/DefaultCpdEngine.java b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/DefaultCpdEngine.java index 4c198581b8a..ba472cbc2b0 100644 --- a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/DefaultCpdEngine.java +++ b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/DefaultCpdEngine.java @@ -33,7 +33,6 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DeprecatedDefaultInputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.config.Settings; -import org.sonar.api.measures.FileLinesContextFactory; import org.sonar.api.resources.Project; import org.sonar.api.utils.SonarException; import org.sonar.batch.duplication.BlockCache; @@ -70,21 +69,18 @@ public class DefaultCpdEngine extends CpdEngine { private final Settings settings; private final BlockCache duplicationCache; private final Project project; - private final FileLinesContextFactory contextFactory; - public DefaultCpdEngine(@Nullable Project project, IndexFactory indexFactory, CpdMappings mappings, FileSystem fs, Settings settings, BlockCache duplicationCache, - FileLinesContextFactory contextFactory) { + public DefaultCpdEngine(@Nullable Project project, IndexFactory indexFactory, CpdMappings mappings, FileSystem fs, Settings settings, BlockCache duplicationCache) { this.project = project; this.indexFactory = indexFactory; this.mappings = mappings; this.fs = fs; this.settings = settings; this.duplicationCache = duplicationCache; - this.contextFactory = contextFactory; } - public DefaultCpdEngine(IndexFactory indexFactory, CpdMappings mappings, FileSystem fs, Settings settings, BlockCache duplicationCache, FileLinesContextFactory contextFactory) { - this(null, indexFactory, mappings, fs, settings, duplicationCache, contextFactory); + public DefaultCpdEngine(IndexFactory indexFactory, CpdMappings mappings, FileSystem fs, Settings settings, BlockCache duplicationCache) { + this(null, indexFactory, mappings, fs, settings, duplicationCache); } @Override @@ -135,7 +131,7 @@ public class DefaultCpdEngine extends CpdEngine { throw new SonarException("Fail during detection of duplication for " + inputFile, e); } - JavaCpdEngine.save(context, inputFile, filtered, contextFactory); + JavaCpdEngine.save(context, inputFile, filtered); } } finally { executorService.shutdown(); diff --git a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java index 5dfff7e3dcd..5632e495681 100644 --- a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java +++ b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java @@ -35,9 +35,8 @@ import org.sonar.api.batch.sensor.duplication.DuplicationBuilder; import org.sonar.api.batch.sensor.duplication.internal.DefaultDuplicationBuilder; import org.sonar.api.config.Settings; import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.FileLinesContext; -import org.sonar.api.measures.FileLinesContextFactory; import org.sonar.api.resources.Project; +import org.sonar.api.utils.KeyValueFormat; import org.sonar.api.utils.SonarException; import org.sonar.duplications.block.Block; import org.sonar.duplications.block.BlockChunker; @@ -60,8 +59,10 @@ import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.Reader; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -85,18 +86,16 @@ public class JavaCpdEngine extends CpdEngine { private final FileSystem fs; private final Settings settings; private final Project project; - private final FileLinesContextFactory contextFactory; - public JavaCpdEngine(@Nullable Project project, IndexFactory indexFactory, FileSystem fs, Settings settings, FileLinesContextFactory contextFactory) { + public JavaCpdEngine(@Nullable Project project, IndexFactory indexFactory, FileSystem fs, Settings settings) { this.project = project; this.indexFactory = indexFactory; this.fs = fs; this.settings = settings; - this.contextFactory = contextFactory; } - public JavaCpdEngine(IndexFactory indexFactory, FileSystem fs, Settings settings, FileLinesContextFactory contextFactory) { - this(null, indexFactory, fs, settings, contextFactory); + public JavaCpdEngine(IndexFactory indexFactory, FileSystem fs, Settings settings) { + this(null, indexFactory, fs, settings); } @Override @@ -172,7 +171,7 @@ public class JavaCpdEngine extends CpdEngine { throw new SonarException("Fail during detection of duplication for " + inputFile, e); } - save(context, inputFile, clones, contextFactory); + save(context, inputFile, clones); } } finally { executorService.shutdown(); @@ -193,18 +192,22 @@ public class JavaCpdEngine extends CpdEngine { } } - static void save(org.sonar.api.batch.sensor.SensorContext context, InputFile inputFile, @Nullable Iterable<CloneGroup> duplications, - FileLinesContextFactory contextFactory) { + static void save(org.sonar.api.batch.sensor.SensorContext context, InputFile inputFile, @Nullable Iterable<CloneGroup> duplications) { if (duplications == null || Iterables.isEmpty(duplications)) { return; } Set<Integer> duplicatedLines = new HashSet<Integer>(); int duplicatedBlocks = computeBlockAndLineCount(duplications, duplicatedLines); - FileLinesContext linesContext = contextFactory.createFor(inputFile); + Map<Integer, Integer> duplicationByLine = new HashMap<Integer, Integer>(); for (int i = 1; i <= inputFile.lines(); i++) { - linesContext.setIntValue(CoreMetrics.DUPLICATION_LINES_DATA_KEY, i, duplicatedLines.contains(i) ? 1 : 0); + duplicationByLine.put(i, duplicatedLines.contains(i) ? 1 : 0); } - linesContext.save(); + ((DefaultMeasure<String>) context.<String>newMeasure() + .forMetric(CoreMetrics.DUPLICATION_LINES_DATA) + .onFile(inputFile) + .withValue(KeyValueFormat.format(duplicationByLine))) + .setFromCore() + .save(); // Save context.<Integer>newMeasure() .forMetric(CoreMetrics.DUPLICATED_FILES) diff --git a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java index a307f859edf..7724fa6f725 100644 --- a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java +++ b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java @@ -41,8 +41,8 @@ public class CpdSensorTest { @Before public void setUp() { IndexFactory indexFactory = mock(IndexFactory.class); - sonarEngine = new JavaCpdEngine(indexFactory, null, null, null); - sonarBridgeEngine = new DefaultCpdEngine(indexFactory, new CpdMappings(), null, null, mock(BlockCache.class), null); + sonarEngine = new JavaCpdEngine(indexFactory, null, null); + sonarBridgeEngine = new DefaultCpdEngine(indexFactory, new CpdMappings(), null, null, mock(BlockCache.class)); settings = new Settings(new PropertyDefinitions(CpdPlugin.class)); DefaultFileSystem fs = new DefaultFileSystem(); diff --git a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/DefaultCpdEngineTest.java b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/DefaultCpdEngineTest.java index 4c65940417a..6dc28f4e64d 100644 --- a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/DefaultCpdEngineTest.java +++ b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/DefaultCpdEngineTest.java @@ -22,7 +22,6 @@ package org.sonar.plugins.cpd; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; -import org.sonar.api.CoreProperties; import org.sonar.api.config.Settings; import org.sonar.api.resources.Project; import org.sonar.batch.duplication.BlockCache; @@ -42,7 +41,7 @@ public class DefaultCpdEngineTest { @Before public void init() { settings = new Settings(); - engine = new DefaultCpdEngine(null, null, null, settings, mock(BlockCache.class), null); + engine = new DefaultCpdEngine(null, null, null, settings, mock(BlockCache.class)); } @Test diff --git a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/JavaCpdEngineTest.java b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/JavaCpdEngineTest.java index 1b565ff56b3..aa87b90dc13 100644 --- a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/JavaCpdEngineTest.java +++ b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/JavaCpdEngineTest.java @@ -36,8 +36,6 @@ import org.sonar.api.batch.sensor.duplication.internal.DefaultDuplicationBuilder import org.sonar.api.batch.sensor.measure.Measure; import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.FileLinesContext; -import org.sonar.api.measures.FileLinesContextFactory; import org.sonar.duplications.index.CloneGroup; import org.sonar.duplications.index.ClonePart; @@ -61,8 +59,6 @@ public class JavaCpdEngineTest { SensorContext context = mock(SensorContext.class); DeprecatedDefaultInputFile inputFile; private DefaultDuplicationBuilder duplicationBuilder; - private FileLinesContextFactory contextFactory; - private FileLinesContext linesContext; private SensorStorage storage = mock(SensorStorage.class); @Before @@ -77,46 +73,38 @@ public class JavaCpdEngineTest { duplicationBuilder = spy(new DefaultDuplicationBuilder(inputFile)); when(context.duplicationBuilder(any(InputFile.class))).thenReturn(duplicationBuilder); inputFile.setFile(temp.newFile("Foo.java")); - contextFactory = mock(FileLinesContextFactory.class); - linesContext = mock(FileLinesContext.class); - when(contextFactory.createFor(inputFile)).thenReturn(linesContext); } @SuppressWarnings("unchecked") @Test public void testNothingToSave() { - JavaCpdEngine.save(context, inputFile, null, contextFactory); - JavaCpdEngine.save(context, inputFile, Collections.EMPTY_LIST, contextFactory); + JavaCpdEngine.save(context, inputFile, null); + JavaCpdEngine.save(context, inputFile, Collections.EMPTY_LIST); verifyZeroInteractions(context); } @Test public void testOneSimpleDuplicationBetweenTwoFiles() { - inputFile.setLines(300); - List<CloneGroup> groups = Arrays.asList(newCloneGroup(new ClonePart("key1", 0, 5, 204), new ClonePart("key2", 0, 15, 214))); - JavaCpdEngine.save(context, inputFile, groups, contextFactory); + inputFile.setLines(5); + List<CloneGroup> groups = Arrays.asList(newCloneGroup(new ClonePart("key1", 0, 2, 4), new ClonePart("key2", 0, 15, 17))); + JavaCpdEngine.save(context, inputFile, groups); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_FILES).onFile(inputFile).withValue(1)); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_BLOCKS).onFile(inputFile).withValue(1)); - verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_LINES).onFile(inputFile).withValue(200)); + verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_LINES).onFile(inputFile).withValue(3)); + verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATION_LINES_DATA).onFile(inputFile).withValue("1=0;2=1;3=1;4=1;5=0")); InOrder inOrder = Mockito.inOrder(duplicationBuilder); - inOrder.verify(duplicationBuilder).originBlock(5, 204); - inOrder.verify(duplicationBuilder).isDuplicatedBy("key2", 15, 214); + inOrder.verify(duplicationBuilder).originBlock(2, 4); + inOrder.verify(duplicationBuilder).isDuplicatedBy("key2", 15, 17); inOrder.verify(duplicationBuilder).build(); - - verify(linesContext).setIntValue(CoreMetrics.DUPLICATION_LINES_DATA_KEY, 1, 0); - verify(linesContext).setIntValue(CoreMetrics.DUPLICATION_LINES_DATA_KEY, 4, 0); - verify(linesContext).setIntValue(CoreMetrics.DUPLICATION_LINES_DATA_KEY, 5, 1); - verify(linesContext).setIntValue(CoreMetrics.DUPLICATION_LINES_DATA_KEY, 204, 1); - verify(linesContext).setIntValue(CoreMetrics.DUPLICATION_LINES_DATA_KEY, 205, 0); } @Test public void testDuplicationOnSameFile() throws Exception { List<CloneGroup> groups = Arrays.asList(newCloneGroup(new ClonePart("key1", 0, 5, 204), new ClonePart("key1", 0, 215, 414))); - JavaCpdEngine.save(context, inputFile, groups, contextFactory); + JavaCpdEngine.save(context, inputFile, groups); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_FILES).onFile(inputFile).withValue(1)); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_BLOCKS).onFile(inputFile).withValue(2)); @@ -131,7 +119,7 @@ public class JavaCpdEngineTest { @Test public void testOneDuplicatedGroupInvolvingMoreThanTwoFiles() throws Exception { List<CloneGroup> groups = Arrays.asList(newCloneGroup(new ClonePart("key1", 0, 5, 204), new ClonePart("key2", 0, 15, 214), new ClonePart("key3", 0, 25, 224))); - JavaCpdEngine.save(context, inputFile, groups, contextFactory); + JavaCpdEngine.save(context, inputFile, groups); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_FILES).onFile(inputFile).withValue(1)); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_BLOCKS).onFile(inputFile).withValue(1)); @@ -155,7 +143,7 @@ public class JavaCpdEngineTest { List<CloneGroup> groups = Arrays.asList( newCloneGroup(new ClonePart("key1", 0, 5, 204), new ClonePart("key2", 0, 15, 214)), newCloneGroup(new ClonePart("key1", 0, 15, 214), new ClonePart("key3", 0, 15, 214))); - JavaCpdEngine.save(context, inputFile, groups, contextFactory); + JavaCpdEngine.save(context, inputFile, groups); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_FILES).onFile(inputFile).withValue(1)); verify(storage).store(new DefaultMeasure().forMetric(CoreMetrics.DUPLICATED_BLOCKS).onFile(inputFile).withValue(2)); |