diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2013-01-31 12:56:15 +0100 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2013-01-31 12:56:15 +0100 |
commit | 9029430f5f78d0abe373c4b2d9cee405530fc481 (patch) | |
tree | 8214a219b5034ff265dce6a5d1d4a98d0e107c32 /sonar-core | |
parent | 04e8a2dc3dbd73170008e6eb9bd02285c3eac9ff (diff) | |
download | sonarqube-9029430f5f78d0abe373c4b2d9cee405530fc481.tar.gz sonarqube-9029430f5f78d0abe373c4b2d9cee405530fc481.zip |
SONAR-2501 code refactoring
Diffstat (limited to 'sonar-core')
13 files changed, 210 insertions, 56 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/component/PerspectiveBuilder.java b/sonar-core/src/main/java/org/sonar/core/component/PerspectiveBuilder.java index d74ef70f998..0a66905e077 100644 --- a/sonar-core/src/main/java/org/sonar/core/component/PerspectiveBuilder.java +++ b/sonar-core/src/main/java/org/sonar/core/component/PerspectiveBuilder.java @@ -22,6 +22,7 @@ package org.sonar.core.component; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; import org.sonar.api.component.Perspective; +import org.sonar.core.graph.EdgePath; import javax.annotation.CheckForNull; @@ -48,6 +49,6 @@ public abstract class PerspectiveBuilder<T extends Perspective> implements Batch public abstract T create(ComponentVertex component); - public abstract Object[] storagePath(); + public abstract EdgePath path(); } diff --git a/sonar-core/src/main/java/org/sonar/core/component/ScanGraphStore.java b/sonar-core/src/main/java/org/sonar/core/component/ScanGraphStore.java index eb91efe5834..3d88849a6bd 100644 --- a/sonar-core/src/main/java/org/sonar/core/component/ScanGraphStore.java +++ b/sonar-core/src/main/java/org/sonar/core/component/ScanGraphStore.java @@ -20,15 +20,19 @@ package org.sonar.core.component; import com.tinkerpop.blueprints.Graph; +import org.apache.commons.io.IOUtils; import org.slf4j.LoggerFactory; import org.sonar.api.component.Perspective; -import org.sonar.core.graph.GraphWriter; import org.sonar.core.graph.SubGraph; +import org.sonar.core.graph.graphson.GraphsonMode; +import org.sonar.core.graph.graphson.GraphsonWriter; import org.sonar.core.graph.jdbc.GraphDto; import org.sonar.core.graph.jdbc.GraphDtoMapper; import org.sonar.core.persistence.BatchSession; import org.sonar.core.persistence.MyBatis; +import java.io.StringWriter; + public class ScanGraphStore { private final MyBatis myBatis; private final ScanGraph projectGraph; @@ -45,15 +49,14 @@ public class ScanGraphStore { BatchSession session = myBatis.openBatchSession(); GraphDtoMapper mapper = session.getMapper(GraphDtoMapper.class); try { - GraphWriter writer = new GraphWriter(); for (ComponentVertex component : projectGraph.getComponents()) { Long snapshotId = (Long) component.element().getProperty("sid"); if (snapshotId != null) { for (PerspectiveBuilder builder : builders) { Perspective perspective = builder.load(component); if (perspective != null) { - Graph subGraph = SubGraph.extract(component.element(), builder.storagePath()); - String data = writer.write(subGraph); + Graph subGraph = SubGraph.extract(component.element(), builder.path()); + String data = write(subGraph); mapper.insert(new GraphDto() .setData(data) .setFormat("graphson") @@ -72,4 +75,14 @@ public class ScanGraphStore { session.close(); } } + + private String write(Graph graph) { + StringWriter output = new StringWriter(); + try { + new GraphsonWriter().write(graph, output, GraphsonMode.EXTENDED); + return output.toString(); + } finally { + IOUtils.closeQuietly(output); + } + } } diff --git a/sonar-core/src/main/java/org/sonar/core/graph/EdgePath.java b/sonar-core/src/main/java/org/sonar/core/graph/EdgePath.java new file mode 100644 index 00000000000..00c856be2c1 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/graph/EdgePath.java @@ -0,0 +1,55 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2012 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.core.graph; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.tinkerpop.blueprints.Direction; + +import java.util.List; + +public class EdgePath { + private List<Object> elements; + + private EdgePath(Object[] elements) { + Preconditions.checkArgument(elements != null && elements.length > 0, "Elements can't be null or empty"); + Preconditions.checkArgument(elements.length % 2 == 0, "Odd number of elements (" + elements.length + ")"); + + for (int i = 0; i < elements.length; i++) { + if (i % 2 == 0) { + Preconditions.checkArgument(elements[i] instanceof Direction, + "Element " + i + " must be a " + Direction.class.getName() + " (got " + elements[i].getClass().getName() + ")"); + } else { + Preconditions.checkArgument(elements[i] instanceof String, + "Element " + i + " must be a String" + " (got " + elements[i].getClass().getName() + ")"); + } + } + + this.elements = ImmutableList.copyOf(elements); + } + + public List<Object> getElements() { + return elements; + } + + public static EdgePath create(Object... elements) { + return new EdgePath(elements); + } +} diff --git a/sonar-core/src/main/java/org/sonar/core/graph/SubGraph.java b/sonar-core/src/main/java/org/sonar/core/graph/SubGraph.java index 22d3d27c4c9..048a59f65c8 100644 --- a/sonar-core/src/main/java/org/sonar/core/graph/SubGraph.java +++ b/sonar-core/src/main/java/org/sonar/core/graph/SubGraph.java @@ -27,6 +27,7 @@ import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.impls.tg.TinkerGraph; import com.tinkerpop.blueprints.util.ElementHelper; +import java.util.List; import java.util.Set; /** @@ -40,13 +41,13 @@ public class SubGraph { private SubGraph() { } - public static Graph extract(Vertex start, Object... edgePath) { + public static Graph extract(Vertex start, EdgePath edgePath) { return new SubGraph().process(start, edgePath); } - private Graph process(Vertex start, Object... edgePath) { + private Graph process(Vertex start, EdgePath edgePath) { copy(start); - browse(start, 0, edgePath); + browse(start, 0, edgePath.getElements()); for (Edge edge : edgesToCopy) { Vertex from = edge.getVertex(Direction.OUT); Vertex to = edge.getVertex(Direction.IN); @@ -56,11 +57,11 @@ public class SubGraph { return sub; } - private void browse(Vertex from, int cursor, Object... edgePath) { + private void browse(Vertex from, int cursor, List<Object> edgePath) { if (from != null) { - if (cursor < edgePath.length) { - String edgeLabel = (String) edgePath[cursor]; - Direction edgeDirection = (Direction) edgePath[cursor + 1]; + if (cursor < edgePath.size()) { + Direction edgeDirection = (Direction) edgePath.get(cursor); + String edgeLabel = (String) edgePath.get(cursor + 1); Iterable<Edge> edges = from.getEdges(edgeDirection, edgeLabel); for (Edge edge : edges) { edgesToCopy.add(edge); diff --git a/sonar-core/src/main/java/org/sonar/core/test/TestPlanBuilder.java b/sonar-core/src/main/java/org/sonar/core/test/TestPlanBuilder.java index 98e7f44f0bc..3084d6e3891 100644 --- a/sonar-core/src/main/java/org/sonar/core/test/TestPlanBuilder.java +++ b/sonar-core/src/main/java/org/sonar/core/test/TestPlanBuilder.java @@ -24,18 +24,19 @@ import com.tinkerpop.blueprints.Vertex; import org.sonar.api.test.MutableTestPlan; import org.sonar.core.component.ComponentVertex; import org.sonar.core.component.PerspectiveBuilder; +import org.sonar.core.graph.EdgePath; import org.sonar.core.graph.GraphUtil; public class TestPlanBuilder extends PerspectiveBuilder<MutableTestPlan> { static final String PERSPECTIVE_KEY = "testplan"; - private static final Object[] PATH = new Object[]{ - "testplan", Direction.OUT, - "testcase", Direction.OUT, - "covers", Direction.OUT, - "testable", Direction.IN - }; + private static final EdgePath PATH = EdgePath.create( + Direction.OUT, "testplan", + Direction.OUT, "testcase", + Direction.OUT, "covers", + Direction.IN, "testable" + ); public TestPlanBuilder() { super(PERSPECTIVE_KEY, MutableTestPlan.class); @@ -56,7 +57,7 @@ public class TestPlanBuilder extends PerspectiveBuilder<MutableTestPlan> { } @Override - public Object[] storagePath() { + public EdgePath path() { return PATH; } } diff --git a/sonar-core/src/main/java/org/sonar/core/test/TestableBuilder.java b/sonar-core/src/main/java/org/sonar/core/test/TestableBuilder.java index e19380784f8..a7a86813213 100644 --- a/sonar-core/src/main/java/org/sonar/core/test/TestableBuilder.java +++ b/sonar-core/src/main/java/org/sonar/core/test/TestableBuilder.java @@ -23,6 +23,7 @@ import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Vertex; import org.sonar.api.test.MutableTestable; import org.sonar.core.component.ComponentVertex; +import org.sonar.core.graph.EdgePath; import org.sonar.core.component.PerspectiveBuilder; import org.sonar.core.graph.GraphUtil; @@ -30,12 +31,12 @@ public class TestableBuilder extends PerspectiveBuilder<MutableTestable> { static final String PERSPECTIVE_KEY = "testable"; - private static final Object[] PATH = new Object[]{ - "testable", Direction.OUT, - "covers", Direction.IN, - "testcase", Direction.IN, - "testplan", Direction.IN - }; + private static final EdgePath PATH = EdgePath.create( + Direction.OUT, "testable", + Direction.IN,"covers", + Direction.IN,"testcase", + Direction.IN,"testplan" + ); public TestableBuilder() { super(PERSPECTIVE_KEY, MutableTestable.class); @@ -56,7 +57,7 @@ public class TestableBuilder extends PerspectiveBuilder<MutableTestable> { } @Override - public Object[] storagePath() { + public EdgePath path() { return PATH; } } diff --git a/sonar-core/src/test/java/org/sonar/core/graph/BeanGraphTest.java b/sonar-core/src/test/java/org/sonar/core/graph/BeanGraphTest.java index 23bf7d657a7..0181d81e111 100644 --- a/sonar-core/src/test/java/org/sonar/core/graph/BeanGraphTest.java +++ b/sonar-core/src/test/java/org/sonar/core/graph/BeanGraphTest.java @@ -38,8 +38,7 @@ public class BeanGraphTest { @Test public void should_create_bean_vertex() { - TinkerGraph graph = new TinkerGraph(); - BeanGraph beanGraph = new BeanGraph(graph); + BeanGraph beanGraph = BeanGraph.createInMemory(); Person person = beanGraph.createVertex(Person.class); assertThat(person).isNotNull(); @@ -64,8 +63,7 @@ public class BeanGraphTest { @Test public void should_create_adjacent_bean_vertex() { - TinkerGraph graph = new TinkerGraph(); - BeanGraph beanGraph = new BeanGraph(graph); + BeanGraph beanGraph = BeanGraph.createInMemory(); Person person = beanGraph.createVertex(Person.class); Person adjacent = beanGraph.createAdjacentVertex(person, Person.class, "knows", "type", "family"); diff --git a/sonar-core/src/test/java/org/sonar/core/graph/EdgePathTest.java b/sonar-core/src/test/java/org/sonar/core/graph/EdgePathTest.java new file mode 100644 index 00000000000..f4251e1cc6b --- /dev/null +++ b/sonar-core/src/test/java/org/sonar/core/graph/EdgePathTest.java @@ -0,0 +1,68 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2012 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.core.graph; + +import com.tinkerpop.blueprints.Direction; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import static org.fest.assertions.Assertions.assertThat; + +public class EdgePathTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void create_valid_edge_path() { + EdgePath path = EdgePath.create(Direction.OUT, "knows", Direction.OUT, "has"); + + assertThat(path).isNotNull(); + assertThat(path.getElements()).hasSize(4); + assertThat(path.getElements().get(0)).isEqualTo(Direction.OUT); + assertThat(path.getElements().get(1)).isEqualTo("knows"); + assertThat(path.getElements().get(2)).isEqualTo(Direction.OUT); + assertThat(path.getElements().get(3)).isEqualTo("has"); + } + + @Test + public void should_have_even_number_of_elements() { + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Odd number of elements (3)"); + EdgePath.create(Direction.OUT, "knows", Direction.OUT); + } + + @Test + public void should_have_sequence_of_directions_and_strings_1() { + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Element 0 must be a com.tinkerpop.blueprints.Direction (got java.lang.String)"); + + EdgePath.create("knows", Direction.OUT); + } + + @Test + public void should_have_sequence_of_directions_and_strings_2() { + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Element 1 must be a String (got com.tinkerpop.blueprints.Direction)"); + + EdgePath.create(Direction.OUT, Direction.OUT); + } +} diff --git a/sonar-core/src/test/java/org/sonar/core/graph/SubGraphTest.java b/sonar-core/src/test/java/org/sonar/core/graph/SubGraphTest.java index d34d9ff087e..e65e4d1aa51 100644 --- a/sonar-core/src/test/java/org/sonar/core/graph/SubGraphTest.java +++ b/sonar-core/src/test/java/org/sonar/core/graph/SubGraphTest.java @@ -48,7 +48,7 @@ public class SubGraphTest { // a -uses-> b -inherits -> c // a -uses-> d -implements-> e - Graph sub = SubGraph.extract(a, "uses", Direction.OUT, "implements", Direction.OUT); + Graph sub = SubGraph.extract(a, EdgePath.create(Direction.OUT, "uses", Direction.OUT, "implements")); // a -uses-> b // a -uses-> d -implements-> e @@ -85,7 +85,7 @@ public class SubGraphTest { // a -uses-> b -implements-> c -package-> e // a -uses-> d -implements-> c -package-> e - Graph sub = SubGraph.extract(a, "uses", Direction.OUT, "implements", Direction.OUT, "package", Direction.OUT); + Graph sub = SubGraph.extract(a, EdgePath.create(Direction.OUT, "uses", Direction.OUT, "implements", Direction.OUT, "package")); // same graph assertThat(sub.getVertices()).hasSize(5); @@ -109,7 +109,7 @@ public class SubGraphTest { // a -uses-> b -inherits -> c // a -uses-> d -implements-> e - Graph sub = SubGraph.extract(a, "uses", Direction.IN /* instead of out */, "implements", Direction.OUT); + Graph sub = SubGraph.extract(a, EdgePath.create(Direction.IN /* instead of out */, "uses", Direction.OUT, "implements")); assertThat(sub.getVertices()).hasSize(1); assertThat(sub.getVertex(a.getId())).isNotNull(); diff --git a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java index cceb46414cd..d6bf3168e10 100644 --- a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java +++ b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestCaseTest.java @@ -19,11 +19,13 @@ */ package org.sonar.core.test; +import com.google.common.collect.Iterables; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.sonar.api.test.exception.IllegalDurationException; +import org.sonar.api.test.Cover; import org.sonar.api.test.TestCase; +import org.sonar.api.test.exception.IllegalDurationException; import org.sonar.core.graph.BeanGraph; import java.util.Arrays; @@ -46,7 +48,24 @@ public class DefaultTestCaseTest { } @Test - public void should_cover_testables() { + public void should_cover_testable() { + BeanGraph beanGraph = BeanGraph.createInMemory(); + DefaultTestable testable = beanGraph.createVertex(DefaultTestable.class); + DefaultTestCase testCase = beanGraph.createVertex(DefaultTestCase.class); + testCase.setCover(testable, Arrays.asList(10, 11, 12)); + + assertThat(testCase.doesCover()).isTrue(); + assertThat(testCase.countCoveredLines()).isEqualTo(3); + assertThat(testCase.covers()).hasSize(1); + + Cover cover = Iterables.<Cover>getFirst(testCase.covers(), null); + assertThat(cover.testCase()).isEqualTo(testCase); + assertThat(cover.testable()).isSameAs(testable); + assertThat(cover.lines()).containsExactly(10, 11, 12); + } + + @Test + public void should_cover_multiple_testables() { BeanGraph beanGraph = BeanGraph.createInMemory(); DefaultTestable testable1 = beanGraph.createVertex(DefaultTestable.class); DefaultTestable testable2 = beanGraph.createVertex(DefaultTestable.class); diff --git a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestPlanTest.java b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestPlanTest.java index 63e623aa751..32a3c32157e 100644 --- a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestPlanTest.java +++ b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestPlanTest.java @@ -52,8 +52,13 @@ public class DefaultTestPlanTest { plan.addTestCase("T2"); assertThat(plan.testCases()).hasSize(2); - assertThat(Iterables.<MutableTestCase>get(plan.testCases(), 0).key()).isEqualTo("T1"); - assertThat(Iterables.<MutableTestCase>get(plan.testCases(), 1).key()).isEqualTo("T2"); + MutableTestCase firstTestCase = Iterables.get(plan.testCases(), 0); + assertThat(firstTestCase.key()).isEqualTo("T1"); + assertThat(firstTestCase.testPlan()).isSameAs(plan); + + MutableTestCase secondTestCase = Iterables.get(plan.testCases(), 1); + assertThat(secondTestCase.key()).isEqualTo("T2"); + assertThat(secondTestCase.testPlan()).isSameAs(plan); } @Test diff --git a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java index 65a240e973a..962902be5b7 100644 --- a/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java +++ b/sonar-core/src/test/java/org/sonar/core/test/DefaultTestableTest.java @@ -46,6 +46,9 @@ public class DefaultTestableTest { testCase2.setCover(testable, Arrays.asList(12, 48, 49)); assertThat(testable.testedLines()).containsOnly(10, 11, 12, 48, 49); + assertThat(testable.countTestCasesOfLine(2)).isEqualTo(0); + assertThat(testable.countTestCasesOfLine(10)).isEqualTo(1); + assertThat(testable.countTestCasesOfLine(12)).isEqualTo(2); } @Test diff --git a/sonar-core/src/main/java/org/sonar/core/graph/GraphWriter.java b/sonar-core/src/test/java/org/sonar/core/test/TestableBuilderTest.java index abc4ddef444..a78553ec5d2 100644 --- a/sonar-core/src/main/java/org/sonar/core/graph/GraphWriter.java +++ b/sonar-core/src/test/java/org/sonar/core/test/TestableBuilderTest.java @@ -17,28 +17,17 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.graph; +package org.sonar.core.test; -import com.tinkerpop.blueprints.Graph; -import org.apache.commons.io.IOUtils; -import org.sonar.core.graph.graphson.GraphsonMode; -import org.sonar.core.graph.graphson.GraphsonWriter; +import org.junit.Test; -import java.io.IOException; -import java.io.StringWriter; +import static org.fest.assertions.Assertions.assertThat; -public class GraphWriter { +public class TestableBuilderTest { + @Test + public void storagePath() { + TestableBuilder builder = new TestableBuilder(); - public String write(Graph graph) { - StringWriter output = new StringWriter(); - try { - new GraphsonWriter().write(graph, output, GraphsonMode.EXTENDED); - System.out.println("------------------------------------------------"); - System.out.println(output.toString()); - System.out.println("------------------------------------------------"); - return output.toString(); - } finally { - IOUtils.closeQuietly(output); - } + assertThat(builder.path().getElements()).isNotEmpty(); } } |