aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2015-07-03 16:10:38 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2015-07-07 10:40:25 +0200
commitfd0d17f3c68b342ba37c5875d200bf28d476432e (patch)
treef76022563b78edcd7d15090260c47966c7970746
parent23254b9034fdbed29388a985cc9f501c44cb3e57 (diff)
downloadsonarqube-fd0d17f3c68b342ba37c5875d200bf28d476432e.tar.gz
sonarqube-fd0d17f3c68b342ba37c5875d200bf28d476432e.zip
Fix visitors when there's many component types of max depth type
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java4
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java143
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java34
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java31
5 files changed, 175 insertions, 41 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java
index 7ff708046b5..cf6277cd8dc 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java
@@ -74,8 +74,8 @@ public abstract class DepthTraversalTypeAwareVisitor implements TypeAwareVisitor
}
private void visitChildren(Component component) {
- if (component.getType() != maxDepth) {
- for (Component child : component.getChildren()) {
+ for (Component child : component.getChildren()) {
+ if (!child.getType().isDeeperThan(maxDepth)) {
visit(child);
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java
index b8114ca02cf..21e65c9eeea 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java
@@ -83,8 +83,8 @@ public abstract class PathAwareVisitor<T> implements ComponentVisitor {
}
private void visitChildren(Component component) {
- if (component.getType() != maxDepth) {
- for (Component child : component.getChildren()) {
+ for (Component child : component.getChildren()) {
+ if (!child.getType().isDeeperThan(maxDepth)) {
visit(child);
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java
index 4130a79b850..2ee69e3d78c 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java
@@ -62,17 +62,20 @@ public class PathAwareVisitorTest {
.build(),
DumbComponent.builder(MODULE, 12)
.addChildren(
- DumbComponent.builder(DIRECTORY, 121)
+ DumbComponent.builder(MODULE, 121)
.addChildren(
- DumbComponent.builder(FILE, 1211).build()
- )
- .build()
+ DumbComponent.builder(DIRECTORY, 1211)
+ .addChildren(
+ DumbComponent.builder(FILE, 12111).build()
+ )
+ .build()
+ ).build()
).build()
).build();
@Test
- public void verify_preOrder() {
- TestPathAwareVisitor underTest = new TestPathAwareVisitor(PRE_ORDER);
+ public void verify_preOrder_visit_call_when_visit_tree_with_depth_FILE() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(FILE, PRE_ORDER);
underTest.visit(SOME_TREE_ROOT);
Iterator<CallRecord> expected = of(
@@ -93,16 +96,72 @@ public class PathAwareVisitorTest {
newCallRecord("visitAny", 12, 1, of(12, 1)),
newCallRecord("visitModule", 12, 1, of(12, 1)),
newCallRecord("visitAny", 121, 12, of(121, 12, 1)),
- newCallRecord("visitDirectory", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitModule", 121, 12, of(121, 12, 1)),
newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)),
- newCallRecord("visitFile", 1211, 121, of(1211, 121, 12, 1))
+ newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1)),
+ newCallRecord("visitAny", 12111, 1211, of(12111, 1211, 121, 12, 1)),
+ newCallRecord("visitFile", 12111, 1211, of(12111, 1211, 121, 12, 1))
+ ).iterator();
+ verifyCallRecords(expected, underTest.callsRecords.iterator());
+ }
+
+ @Test
+ public void verify_preOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(DIRECTORY, PRE_ORDER);
+ underTest.visit(SOME_TREE_ROOT);
+
+ Iterator<CallRecord> expected = of(
+ newCallRecord("visitAny", 1, null, of(1)),
+ newCallRecord("visitProject", 1, null, of(1)),
+ newCallRecord("visitAny", 11, 1, of(11, 1)),
+ newCallRecord("visitModule", 11, 1, of(11, 1)),
+ newCallRecord("visitAny", 111, 11, of(111, 11, 1)),
+ newCallRecord("visitDirectory", 111, 11, of(111, 11, 1)),
+ newCallRecord("visitAny", 112, 11, of(112, 11, 1)),
+ newCallRecord("visitDirectory", 112, 11, of(112, 11, 1)),
+ newCallRecord("visitAny", 12, 1, of(12, 1)),
+ newCallRecord("visitModule", 12, 1, of(12, 1)),
+ newCallRecord("visitAny", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitModule", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)),
+ newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1))
+ ).iterator();
+ verifyCallRecords(expected, underTest.callsRecords.iterator());
+ }
+
+ @Test
+ public void verify_preOrder_visit_call_when_visit_tree_with_depth_MODULE() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(MODULE, PRE_ORDER);
+ underTest.visit(SOME_TREE_ROOT);
+
+ Iterator<CallRecord> expected = of(
+ newCallRecord("visitAny", 1, null, of(1)),
+ newCallRecord("visitProject", 1, null, of(1)),
+ newCallRecord("visitAny", 11, 1, of(11, 1)),
+ newCallRecord("visitModule", 11, 1, of(11, 1)),
+ newCallRecord("visitAny", 12, 1, of(12, 1)),
+ newCallRecord("visitModule", 12, 1, of(12, 1)),
+ newCallRecord("visitAny", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitModule", 121, 12, of(121, 12, 1))
+ ).iterator();
+ verifyCallRecords(expected, underTest.callsRecords.iterator());
+ }
+
+ @Test
+ public void verify_preOrder_visit_call_when_visit_tree_with_depth_PROJECT() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(PROJECT, PRE_ORDER);
+ underTest.visit(SOME_TREE_ROOT);
+
+ Iterator<CallRecord> expected = of(
+ newCallRecord("visitAny", 1, null, of(1)),
+ newCallRecord("visitProject", 1, null, of(1))
).iterator();
verifyCallRecords(expected, underTest.callsRecords.iterator());
}
@Test
- public void verify_postOrder() {
- TestPathAwareVisitor underTest = new TestPathAwareVisitor(POST_ORDER);
+ public void verify_postOrder_visit_call_when_visit_tree_with_depth_FILE() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(FILE, POST_ORDER);
underTest.visit(SOME_TREE_ROOT);
Iterator<CallRecord> expected = of(
@@ -118,10 +177,12 @@ public class PathAwareVisitorTest {
newCallRecord("visitDirectory", 112, 11, of(112, 11, 1)),
newCallRecord("visitAny", 11, 1, of(11, 1)),
newCallRecord("visitModule", 11, 1, of(11, 1)),
+ newCallRecord("visitAny", 12111, 1211, of(12111, 1211, 121, 12, 1)),
+ newCallRecord("visitFile", 12111, 1211, of(12111, 1211, 121, 12, 1)),
newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)),
- newCallRecord("visitFile", 1211, 121, of(1211, 121, 12, 1)),
+ newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1)),
newCallRecord("visitAny", 121, 12, of(121, 12, 1)),
- newCallRecord("visitDirectory", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitModule", 121, 12, of(121, 12, 1)),
newCallRecord("visitAny", 12, 1, of(12, 1)),
newCallRecord("visitModule", 12, 1, of(12, 1)),
newCallRecord("visitAny", 1, null, of(1)),
@@ -130,6 +191,60 @@ public class PathAwareVisitorTest {
verifyCallRecords(expected, underTest.callsRecords.iterator());
}
+ @Test
+ public void verify_postOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(DIRECTORY, POST_ORDER);
+ underTest.visit(SOME_TREE_ROOT);
+
+ Iterator<CallRecord> expected = of(
+ newCallRecord("visitAny", 111, 11, of(111, 11, 1)),
+ newCallRecord("visitDirectory", 111, 11, of(111, 11, 1)),
+ newCallRecord("visitAny", 112, 11, of(112, 11, 1)),
+ newCallRecord("visitDirectory", 112, 11, of(112, 11, 1)),
+ newCallRecord("visitAny", 11, 1, of(11, 1)),
+ newCallRecord("visitModule", 11, 1, of(11, 1)),
+ newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)),
+ newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1)),
+ newCallRecord("visitAny", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitModule", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitAny", 12, 1, of(12, 1)),
+ newCallRecord("visitModule", 12, 1, of(12, 1)),
+ newCallRecord("visitAny", 1, null, of(1)),
+ newCallRecord("visitProject", 1, null, of(1))
+ ).iterator();
+ verifyCallRecords(expected, underTest.callsRecords.iterator());
+ }
+
+ @Test
+ public void verify_postOrder_visit_call_when_visit_tree_with_depth_MODULE() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(MODULE, POST_ORDER);
+ underTest.visit(SOME_TREE_ROOT);
+
+ Iterator<CallRecord> expected = of(
+ newCallRecord("visitAny", 11, 1, of(11, 1)),
+ newCallRecord("visitModule", 11, 1, of(11, 1)),
+ newCallRecord("visitAny", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitModule", 121, 12, of(121, 12, 1)),
+ newCallRecord("visitAny", 12, 1, of(12, 1)),
+ newCallRecord("visitModule", 12, 1, of(12, 1)),
+ newCallRecord("visitAny", 1, null, of(1)),
+ newCallRecord("visitProject", 1, null, of(1))
+ ).iterator();
+ verifyCallRecords(expected, underTest.callsRecords.iterator());
+ }
+
+ @Test
+ public void verify_postOrder_visit_call_when_visit_tree_with_depth_PROJECT() {
+ TestPathAwareVisitor underTest = new TestPathAwareVisitor(PROJECT, POST_ORDER);
+ underTest.visit(SOME_TREE_ROOT);
+
+ Iterator<CallRecord> expected = of(
+ newCallRecord("visitAny", 1, null, of(1)),
+ newCallRecord("visitProject", 1, null, of(1))
+ ).iterator();
+ verifyCallRecords(expected, underTest.callsRecords.iterator());
+ }
+
private static void verifyCallRecords(Iterator<CallRecord> expected, Iterator<CallRecord> actual) {
while (expected.hasNext()) {
assertThat(actual.next()).isEqualTo(expected.next());
@@ -143,8 +258,8 @@ public class PathAwareVisitorTest {
private static class TestPathAwareVisitor extends PathAwareVisitor<Integer> {
private final List<CallRecord> callsRecords = new ArrayList<>();
- public TestPathAwareVisitor(ComponentVisitor.Order order) {
- super(FILE, order, new SimpleStackElementFactory<Integer>() {
+ public TestPathAwareVisitor(Component.Type maxDepth, ComponentVisitor.Order order) {
+ super(maxDepth, order, new SimpleStackElementFactory<Integer>() {
@Override
public Integer createForAny(Component component) {
return component.getRef();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java
index 3e3514b115b..94ebd8fa8b2 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java
@@ -33,10 +33,11 @@ import static org.sonar.server.computation.component.ComponentVisitor.Order.POST
public class PostOrderDepthTraversalTypeAwareVisitorTest {
- private static final Component FILE_4 = component(FILE, 4);
private static final Component FILE_5 = component(FILE, 5);
- private static final Component DIRECTORY_3 = component(DIRECTORY, 3, FILE_4, FILE_5);
- private static final Component MODULE_2 = component(MODULE, 2, DIRECTORY_3);
+ private static final Component FILE_6 = component(FILE, 6);
+ private static final Component DIRECTORY_4 = component(DIRECTORY, 4, FILE_5, FILE_6);
+ private static final Component MODULE_3 = component(MODULE, 3, DIRECTORY_4);
+ private static final Component MODULE_2 = component(MODULE, 2, MODULE_3);
private static final Component COMPONENT_TREE = component(PROJECT, 1, MODULE_2);
private final DepthTraversalTypeAwareVisitor spyProjectVisitor = spy(new DepthTraversalTypeAwareVisitor(PROJECT, POST_ORDER) {
@@ -230,15 +231,18 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest {
inOrder.verify(spyFileVisitor).visit(COMPONENT_TREE);
inOrder.verify(spyFileVisitor).visit(MODULE_2);
- inOrder.verify(spyFileVisitor).visit(DIRECTORY_3);
- inOrder.verify(spyFileVisitor).visit(FILE_4);
- inOrder.verify(spyFileVisitor).visitAny(FILE_4);
- inOrder.verify(spyFileVisitor).visitFile(FILE_4);
+ inOrder.verify(spyFileVisitor).visit(MODULE_3);
+ inOrder.verify(spyFileVisitor).visit(DIRECTORY_4);
inOrder.verify(spyFileVisitor).visit(FILE_5);
inOrder.verify(spyFileVisitor).visitAny(FILE_5);
inOrder.verify(spyFileVisitor).visitFile(FILE_5);
- inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_3);
- inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_3);
+ inOrder.verify(spyFileVisitor).visit(FILE_6);
+ inOrder.verify(spyFileVisitor).visitAny(FILE_6);
+ inOrder.verify(spyFileVisitor).visitFile(FILE_6);
+ inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_4);
+ inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_4);
+ inOrder.verify(spyFileVisitor).visitAny(MODULE_3);
+ inOrder.verify(spyFileVisitor).visitModule(MODULE_3);
inOrder.verify(spyFileVisitor).visitAny(MODULE_2);
inOrder.verify(spyFileVisitor).visitModule(MODULE_2);
inOrder.verify(spyFileVisitor).visitAny(COMPONENT_TREE);
@@ -252,9 +256,12 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest {
inOrder.verify(spyDirectoryVisitor).visit(COMPONENT_TREE);
inOrder.verify(spyDirectoryVisitor).visit(MODULE_2);
- inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_3);
- inOrder.verify(spyDirectoryVisitor).visitAny(DIRECTORY_3);
- inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_3);
+ inOrder.verify(spyDirectoryVisitor).visit(MODULE_3);
+ inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_4);
+ inOrder.verify(spyDirectoryVisitor).visitAny(DIRECTORY_4);
+ inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_4);
+ inOrder.verify(spyDirectoryVisitor).visitAny(MODULE_3);
+ inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_3);
inOrder.verify(spyDirectoryVisitor).visitAny(MODULE_2);
inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_2);
inOrder.verify(spyDirectoryVisitor).visitAny(COMPONENT_TREE);
@@ -268,6 +275,9 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest {
inOrder.verify(spyModuleVisitor).visit(COMPONENT_TREE);
inOrder.verify(spyModuleVisitor).visit(MODULE_2);
+ inOrder.verify(spyModuleVisitor).visit(MODULE_3);
+ inOrder.verify(spyModuleVisitor).visitAny(MODULE_3);
+ inOrder.verify(spyModuleVisitor).visitModule(MODULE_3);
inOrder.verify(spyModuleVisitor).visitAny(MODULE_2);
inOrder.verify(spyModuleVisitor).visitModule(MODULE_2);
inOrder.verify(spyModuleVisitor).visitAny(COMPONENT_TREE);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java
index f2129085694..8385d345cdd 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java
@@ -33,10 +33,11 @@ import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_
public class PreOrderDepthTraversalTypeAwareVisitorTest {
- private static final Component FILE_4 = component(FILE, 4);
private static final Component FILE_5 = component(FILE, 5);
- private static final Component DIRECTORY_3 = component(DIRECTORY, 3, FILE_4, FILE_5);
- private static final Component MODULE_2 = component(MODULE, 2, DIRECTORY_3);
+ private static final Component FILE_6 = component(FILE, 6);
+ private static final Component DIRECTORY_4 = component(DIRECTORY, 4, FILE_5, FILE_6);
+ private static final Component MODULE_3 = component(MODULE, 3, DIRECTORY_4);
+ private static final Component MODULE_2 = component(MODULE, 2, MODULE_3);
private static final Component COMPONENT_TREE = component(PROJECT, 1, MODULE_2);
private final DepthTraversalTypeAwareVisitor spyProjectVisitor = spy(new DepthTraversalTypeAwareVisitor(PROJECT, PRE_ORDER) {
@@ -233,15 +234,18 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest {
inOrder.verify(spyFileVisitor).visit(MODULE_2);
inOrder.verify(spyFileVisitor).visitAny(MODULE_2);
inOrder.verify(spyFileVisitor).visitModule(MODULE_2);
- inOrder.verify(spyFileVisitor).visit(DIRECTORY_3);
- inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_3);
- inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_3);
- inOrder.verify(spyFileVisitor).visit(FILE_4);
- inOrder.verify(spyFileVisitor).visitAny(FILE_4);
- inOrder.verify(spyFileVisitor).visitFile(FILE_4);
+ inOrder.verify(spyFileVisitor).visit(MODULE_3);
+ inOrder.verify(spyFileVisitor).visitAny(MODULE_3);
+ inOrder.verify(spyFileVisitor).visitModule(MODULE_3);
+ inOrder.verify(spyFileVisitor).visit(DIRECTORY_4);
+ inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_4);
+ inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_4);
inOrder.verify(spyFileVisitor).visit(FILE_5);
inOrder.verify(spyFileVisitor).visitAny(FILE_5);
inOrder.verify(spyFileVisitor).visitFile(FILE_5);
+ inOrder.verify(spyFileVisitor).visit(FILE_6);
+ inOrder.verify(spyFileVisitor).visitAny(FILE_6);
+ inOrder.verify(spyFileVisitor).visitFile(FILE_6);
inOrder.verifyNoMoreInteractions();
}
@@ -253,8 +257,10 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest {
inOrder.verify(spyDirectoryVisitor).visitProject(COMPONENT_TREE);
inOrder.verify(spyDirectoryVisitor).visit(MODULE_2);
inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_2);
- inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_3);
- inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_3);
+ inOrder.verify(spyDirectoryVisitor).visit(MODULE_3);
+ inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_3);
+ inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_4);
+ inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_4);
inOrder.verifyNoMoreInteractions();
}
@@ -268,6 +274,9 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest {
inOrder.verify(spyModuleVisitor).visit(MODULE_2);
inOrder.verify(spyModuleVisitor).visitAny(MODULE_2);
inOrder.verify(spyModuleVisitor).visitModule(MODULE_2);
+ inOrder.verify(spyModuleVisitor).visit(MODULE_3);
+ inOrder.verify(spyModuleVisitor).visitAny(MODULE_3);
+ inOrder.verify(spyModuleVisitor).visitModule(MODULE_3);
inOrder.verifyNoMoreInteractions();
}