@@ -43,17 +43,18 @@ public abstract class DepthTraversalTypeAwareVisitor implements TypeAwareVisitor | |||
} | |||
if (order == Order.PRE_ORDER) { | |||
visitAny(component); | |||
visitNode(component); | |||
} | |||
visitChildren(component); | |||
if (order == Order.POST_ORDER) { | |||
visitAny(component); | |||
visitNode(component); | |||
} | |||
} | |||
protected void visitAny(Component component) { | |||
protected void visitNode(Component component) { | |||
visitAny(component); | |||
switch (component.getType()) { | |||
case PROJECT: | |||
visitProject(component); | |||
@@ -105,6 +106,11 @@ public abstract class DepthTraversalTypeAwareVisitor implements TypeAwareVisitor | |||
// empty implementation, meant to be override at will by subclasses | |||
} | |||
@Override | |||
public void visitAny(Component component) { | |||
// empty implementation, meant to be override at will by subclasses | |||
} | |||
public enum Order { | |||
PRE_ORDER, POST_ORDER | |||
} |
@@ -23,13 +23,33 @@ package org.sonar.server.computation.component; | |||
* A {@link ComponentVisitor} which can exposes methods which ensure the type of the visited Component. | |||
*/ | |||
public interface TypeAwareVisitor extends ComponentVisitor { | |||
/** | |||
* Called when encountering a Component of type {@link Component.Type#PROJECT} | |||
*/ | |||
void visitProject(Component tree); | |||
/** | |||
* Called when encountering a Component of type {@link Component.Type#MODULE} | |||
*/ | |||
void visitModule(Component tree); | |||
/** | |||
* Called when encountering a Component of type {@link Component.Type#DIRECTORY} | |||
*/ | |||
void visitDirectory(Component tree); | |||
/** | |||
* Called when encountering a Component of type {@link Component.Type#FILE} | |||
*/ | |||
void visitFile(Component tree); | |||
/** | |||
* Called when encountering a Component of an unknown type | |||
*/ | |||
void visitUnknown(Component tree); | |||
/** | |||
* Called for any component, <strong>in addition</strong> to the methods specific to each type | |||
*/ | |||
void visitAny(Component component); | |||
} |
@@ -90,7 +90,7 @@ public class PersistMeasuresStep implements ComputationStep { | |||
} | |||
@Override | |||
protected void visitAny(Component component) { | |||
public void visitAny(Component component) { | |||
int componentRef = component.getRef(); | |||
List<BatchReport.Measure> measures = reportReader.readComponentMeasures(componentRef); | |||
persistMeasures(measures, dbIdsRepository.getComponentId(component), dbIdsRepository.getSnapshotId(component)); |
@@ -66,6 +66,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(component); | |||
inOrder.verify(spyFileVisitor).visit(component); | |||
inOrder.verify(spyFileVisitor).visitAny(component); | |||
inOrder.verify(spyFileVisitor).visitFile(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -76,6 +77,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(component); | |||
inOrder.verify(spyFileVisitor).visit(component); | |||
inOrder.verify(spyFileVisitor).visitAny(component); | |||
inOrder.verify(spyFileVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -86,6 +88,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(component); | |||
inOrder.verify(spyFileVisitor).visit(component); | |||
inOrder.verify(spyFileVisitor).visitAny(component); | |||
inOrder.verify(spyFileVisitor).visitDirectory(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -96,12 +99,13 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(component); | |||
inOrder.verify(spyFileVisitor).visit(component); | |||
inOrder.verify(spyFileVisitor).visitAny(component); | |||
inOrder.verify(spyFileVisitor).visitProject(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@Test | |||
public void visit_file_with_depth_DIRECTORY_does_not_call_visit_file() { | |||
public void visit_file_with_depth_DIRECTORY_does_not_call_visit_file_nor_visitAny() { | |||
Component component = component(FILE, 1); | |||
spyDirectoryVisitor.visit(component); | |||
@@ -115,6 +119,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyDirectoryVisitor.visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visitAny(component); | |||
inOrder.verify(spyDirectoryVisitor).visitDirectory(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -125,6 +130,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyDirectoryVisitor.visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visitAny(component); | |||
inOrder.verify(spyDirectoryVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -135,12 +141,13 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyDirectoryVisitor.visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visitAny(component); | |||
inOrder.verify(spyDirectoryVisitor).visitProject(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@Test | |||
public void visit_file_with_depth_MODULE_does_not_call_visit_file() { | |||
public void visit_file_with_depth_MODULE_does_not_call_visit_file_nor_visitAny() { | |||
Component component = component(FILE, 1); | |||
spyModuleVisitor.visit(component); | |||
@@ -149,7 +156,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_directory_with_depth_MODULE_does_not_call_visit_directory() { | |||
public void visit_directory_with_depth_MODULE_does_not_call_visit_directory_nor_visitAny() { | |||
Component component = component(DIRECTORY, 1); | |||
spyModuleVisitor.visit(component); | |||
@@ -163,6 +170,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyModuleVisitor.visit(component); | |||
inOrder.verify(spyModuleVisitor).visit(component); | |||
inOrder.verify(spyModuleVisitor).visitAny(component); | |||
inOrder.verify(spyModuleVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -173,12 +181,13 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyModuleVisitor.visit(component); | |||
inOrder.verify(spyModuleVisitor).visit(component); | |||
inOrder.verify(spyModuleVisitor).visitAny(component); | |||
inOrder.verify(spyModuleVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@Test | |||
public void visit_file_with_depth_PROJECT_does_not_call_visit_file() { | |||
public void visit_file_with_depth_PROJECT_does_not_call_visit_file_nor_visitAny() { | |||
Component component = component(FILE, 1); | |||
spyProjectVisitor.visit(component); | |||
@@ -187,7 +196,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_directory_with_depth_PROJECT_does_not_call_visit_directory() { | |||
public void visit_directory_with_depth_PROJECT_does_not_call_visit_directory_nor_visitAny() { | |||
Component component = component(DIRECTORY, 1); | |||
spyProjectVisitor.visit(component); | |||
@@ -196,7 +205,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_module_with_depth_PROJECT_does_not_call_visit_module() { | |||
public void visit_module_with_depth_PROJECT_does_not_call_visit_module_nor_visitAny() { | |||
Component component = component(MODULE, 1); | |||
spyProjectVisitor.visit(component); | |||
@@ -210,6 +219,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyProjectVisitor.visit(component); | |||
inOrder.verify(spyProjectVisitor).visit(component); | |||
inOrder.verify(spyProjectVisitor).visitAny(component); | |||
inOrder.verify(spyProjectVisitor).visitProject(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -222,11 +232,16 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
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(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).visitAny(MODULE_2); | |||
inOrder.verify(spyFileVisitor).visitModule(MODULE_2); | |||
inOrder.verify(spyFileVisitor).visitAny(COMPONENT_TREE); | |||
inOrder.verify(spyFileVisitor).visitProject(COMPONENT_TREE); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -238,8 +253,11 @@ 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).visitAny(MODULE_2); | |||
inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_2); | |||
inOrder.verify(spyDirectoryVisitor).visitAny(COMPONENT_TREE); | |||
inOrder.verify(spyDirectoryVisitor).visitProject(COMPONENT_TREE); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -250,7 +268,9 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
inOrder.verify(spyModuleVisitor).visit(COMPONENT_TREE); | |||
inOrder.verify(spyModuleVisitor).visit(MODULE_2); | |||
inOrder.verify(spyModuleVisitor).visitAny(MODULE_2); | |||
inOrder.verify(spyModuleVisitor).visitModule(MODULE_2); | |||
inOrder.verify(spyModuleVisitor).visitAny(COMPONENT_TREE); | |||
inOrder.verify(spyModuleVisitor).visitProject(COMPONENT_TREE); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -260,6 +280,7 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { | |||
spyProjectVisitor.visit(COMPONENT_TREE); | |||
inOrder.verify(spyProjectVisitor).visit(COMPONENT_TREE); | |||
inOrder.verify(spyProjectVisitor).visitAny(COMPONENT_TREE); | |||
inOrder.verify(spyProjectVisitor).visitProject(COMPONENT_TREE); | |||
inOrder.verifyNoMoreInteractions(); | |||
} |
@@ -66,6 +66,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(component); | |||
inOrder.verify(spyFileVisitor).visit(component); | |||
inOrder.verify(spyFileVisitor).visitAny(component); | |||
inOrder.verify(spyFileVisitor).visitFile(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -76,6 +77,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(component); | |||
inOrder.verify(spyFileVisitor).visit(component); | |||
inOrder.verify(spyFileVisitor).visitAny(component); | |||
inOrder.verify(spyFileVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -86,6 +88,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(component); | |||
inOrder.verify(spyFileVisitor).visit(component); | |||
inOrder.verify(spyFileVisitor).visitAny(component); | |||
inOrder.verify(spyFileVisitor).visitDirectory(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -101,7 +104,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_file_with_depth_DIRECTORY_does_not_call_visit_file() { | |||
public void visit_file_with_depth_DIRECTORY_does_not_call_visit_file_nor_visitAny() { | |||
Component component = component(FILE, 1); | |||
spyDirectoryVisitor.visit(component); | |||
@@ -115,6 +118,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyDirectoryVisitor.visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visitAny(component); | |||
inOrder.verify(spyDirectoryVisitor).visitDirectory(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -125,6 +129,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyDirectoryVisitor.visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visitAny(component); | |||
inOrder.verify(spyDirectoryVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -135,12 +140,13 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyDirectoryVisitor.visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visit(component); | |||
inOrder.verify(spyDirectoryVisitor).visitAny(component); | |||
inOrder.verify(spyDirectoryVisitor).visitProject(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@Test | |||
public void visit_file_with_depth_MODULE_does_not_call_visit_file() { | |||
public void visit_file_with_depth_MODULE_does_not_call_visit_file_nor_visit_any() { | |||
Component component = component(FILE, 1); | |||
spyModuleVisitor.visit(component); | |||
@@ -149,7 +155,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_directory_with_depth_MODULE_does_not_call_visit_directory() { | |||
public void visit_directory_with_depth_MODULE_does_not_call_visit_directory_not_visit_any() { | |||
Component component = component(DIRECTORY, 1); | |||
spyModuleVisitor.visit(component); | |||
@@ -163,6 +169,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyModuleVisitor.visit(component); | |||
inOrder.verify(spyModuleVisitor).visit(component); | |||
inOrder.verify(spyModuleVisitor).visitAny(component); | |||
inOrder.verify(spyModuleVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -173,12 +180,13 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyModuleVisitor.visit(component); | |||
inOrder.verify(spyModuleVisitor).visit(component); | |||
inOrder.verify(spyModuleVisitor).visitAny(component); | |||
inOrder.verify(spyModuleVisitor).visitModule(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@Test | |||
public void visit_file_with_depth_PROJECT_does_not_call_visit_file() { | |||
public void visit_file_with_depth_PROJECT_does_not_call_visit_file_nor_visitAny() { | |||
Component component = component(FILE, 1); | |||
spyProjectVisitor.visit(component); | |||
@@ -187,7 +195,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_directory_with_depth_PROJECT_does_not_call_visit_directory() { | |||
public void visit_directory_with_depth_PROJECT_does_not_call_visit_directory_nor_visitAny() { | |||
Component component = component(DIRECTORY, 1); | |||
spyProjectVisitor.visit(component); | |||
@@ -196,7 +204,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_module_with_depth_PROJECT_does_not_call_visit_module() { | |||
public void visit_module_with_depth_PROJECT_does_not_call_visit_module_nor_visitAny() { | |||
Component component = component(MODULE, 1); | |||
spyProjectVisitor.visit(component); | |||
@@ -205,11 +213,12 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
} | |||
@Test | |||
public void visit_project_with_depth_PROJECT_calls_visit_project() { | |||
public void visit_project_with_depth_PROJECT_calls_visit_project_nor_visitAny() { | |||
Component component = component(PROJECT, 1); | |||
spyProjectVisitor.visit(component); | |||
inOrder.verify(spyProjectVisitor).visit(component); | |||
inOrder.verify(spyProjectVisitor).visitAny(component); | |||
inOrder.verify(spyProjectVisitor).visitProject(component); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -219,14 +228,19 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyFileVisitor.visit(COMPONENT_TREE); | |||
inOrder.verify(spyFileVisitor).visit(COMPONENT_TREE); | |||
inOrder.verify(spyFileVisitor).visitAny(COMPONENT_TREE); | |||
inOrder.verify(spyFileVisitor).visitProject(COMPONENT_TREE); | |||
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(FILE_5); | |||
inOrder.verify(spyFileVisitor).visitAny(FILE_5); | |||
inOrder.verify(spyFileVisitor).visitFile(FILE_5); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -249,8 +263,10 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyModuleVisitor.visit(COMPONENT_TREE); | |||
inOrder.verify(spyModuleVisitor).visit(COMPONENT_TREE); | |||
inOrder.verify(spyModuleVisitor).visitAny(COMPONENT_TREE); | |||
inOrder.verify(spyModuleVisitor).visitProject(COMPONENT_TREE); | |||
inOrder.verify(spyModuleVisitor).visit(MODULE_2); | |||
inOrder.verify(spyModuleVisitor).visitAny(MODULE_2); | |||
inOrder.verify(spyModuleVisitor).visitModule(MODULE_2); | |||
inOrder.verifyNoMoreInteractions(); | |||
} | |||
@@ -260,6 +276,7 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { | |||
spyProjectVisitor.visit(COMPONENT_TREE); | |||
inOrder.verify(spyProjectVisitor).visit(COMPONENT_TREE); | |||
inOrder.verify(spyProjectVisitor).visitAny(COMPONENT_TREE); | |||
inOrder.verify(spyProjectVisitor).visitProject(COMPONENT_TREE); | |||
inOrder.verifyNoMoreInteractions(); | |||
} |