From: Julien Lancelot Date: Wed, 3 Jun 2015 08:13:17 +0000 (+0200) Subject: Add TreeRootHolder.getComponentByRef() X-Git-Tag: 5.2-RC1~1668 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=bc1a403c27668fa5f4b3ab4d262682287b3c629a;p=sonarqube.git Add TreeRootHolder.getComponentByRef() It will allow to be able to get any component but its reference --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolder.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolder.java index 4b990fc9845..6d6d03348e6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolder.java @@ -26,4 +26,12 @@ public interface TreeRootHolder { * @throws IllegalStateException if the holder is empty (ie. there is no root yet) */ Component getRoot(); + + /** + * Return a component by its batch reference + * + * @throws IllegalStateException if the holder is empty (ie. there is no root yet) + * @throws IllegalArgumentException if there's no component for the reference + */ + Component getComponentByRef(int ref); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolderImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolderImpl.java index 1be5c91b1b0..fc0aee4129c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolderImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/TreeRootHolderImpl.java @@ -19,24 +19,54 @@ */ package org.sonar.server.computation.component; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; +import static org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor.Order.POST_ORDER; + /** * Holds the reference to the root of the {@link Component} tree for the current CE run. */ public class TreeRootHolderImpl implements MutableTreeRootHolder { + private Component root; + private Map componentsByRef = new HashMap<>(); @Override public void setRoot(Component newRoot) { this.root = Objects.requireNonNull(newRoot); + feedComponentsByRef(); } @Override public Component getRoot() { + checkRoot(); + return this.root; + } + + @Override + public Component getComponentByRef(int ref) { + checkRoot(); + Component component = componentsByRef.get(ref); + if (component == null) { + throw new IllegalArgumentException(String.format("Component '%s' hasn't been found", ref)); + } + return component; + } + + private void checkRoot() { if (this.root == null) { throw new IllegalStateException("Root has not been created yet"); } - return this.root; + } + + private void feedComponentsByRef() { + new DepthTraversalTypeAwareVisitor(Component.Type.FILE, POST_ORDER) { + @Override + public void visitAny(Component component) { + componentsByRef.put(component.getRef(), component); + } + }.visit(root); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java index b3ca3251ddd..c715cfbabb2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/TreeRootHolderRule.java @@ -19,15 +19,21 @@ */ package org.sonar.server.computation.batch; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor; import org.sonar.server.computation.component.TreeRootHolder; +import static org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor.Order.POST_ORDER; + public class TreeRootHolderRule implements TestRule, TreeRootHolder { private Component root; + private Map componentsByRef = new HashMap<>(); @Override public Statement apply(final Statement statement, Description description) { @@ -55,7 +61,26 @@ public class TreeRootHolderRule implements TestRule, TreeRootHolder { return root; } + @Override + public Component getComponentByRef(int ref) { + if (root == null) { + throw new IllegalStateException("Root has not been set in " + TreeRootHolder.class.getSimpleName()); + } + + Component component = componentsByRef.get(ref); + if (component == null) { + throw new IllegalArgumentException(String.format("Component '%s' hasn't been found", ref)); + } + return component; + } + public void setRoot(Component newRoot) { this.root = Objects.requireNonNull(newRoot); + new DepthTraversalTypeAwareVisitor(Component.Type.FILE, POST_ORDER) { + @Override + public void visitAny(Component component) { + componentsByRef.put(component.getRef(), component); + } + }.visit(root); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/TreeRootHolderImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/TreeRootHolderImplTest.java index 1613b765545..679b708ef18 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/TreeRootHolderImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/TreeRootHolderImplTest.java @@ -19,29 +19,62 @@ */ package org.sonar.server.computation.component; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; public class TreeRootHolderImplTest { + @Rule + public ExpectedException thrown = ExpectedException.none(); + TreeRootHolderImpl treeRootHolder = new TreeRootHolderImpl(); - Component component = mock(Component.class); + Component project = DumbComponent.DUMB_PROJECT; - @Test(expected = NullPointerException.class) + @Test public void setRoot_throws_NPE_if_arg_is_null() { + thrown.expect(NullPointerException.class); treeRootHolder.setRoot(null); } - @Test(expected = IllegalStateException.class) + @Test public void getRoot_throws_ISE_if_root_has_not_been_set_yet() { + thrown.expect(IllegalStateException.class); treeRootHolder.getRoot(); } @Test public void verify_setRoot_getRoot() { - treeRootHolder.setRoot(component); - assertThat(treeRootHolder.getRoot()).isSameAs(component); + treeRootHolder.setRoot(project); + assertThat(treeRootHolder.getRoot()).isSameAs(project); + } + + @Test + public void get_by_ref() throws Exception { + Component file = new DumbComponent(Component.Type.FILE, 4, null, null); + Component directory = new DumbComponent(Component.Type.DIRECTORY, 3, null, null, file); + Component module = new DumbComponent(Component.Type.MODULE, 2, null, null, directory); + Component project = new DumbComponent(Component.Type.PROJECT, 1, null, null, module); + treeRootHolder.setRoot(project); + + assertThat(treeRootHolder.getComponentByRef(1)).isEqualTo(project); + assertThat(treeRootHolder.getComponentByRef(2)).isEqualTo(module); + assertThat(treeRootHolder.getComponentByRef(3)).isEqualTo(directory); + assertThat(treeRootHolder.getComponentByRef(4)).isEqualTo(file); + } + + @Test + public void fail_to_get_by_ref_if_root_not_set() throws Exception { + thrown.expect(IllegalStateException.class); + treeRootHolder.getComponentByRef(project.getRef()); + } + + @Test + public void fail_to_get_by_ref_if_ref_not_found() throws Exception { + thrown.expect(IllegalArgumentException.class); + treeRootHolder.setRoot(project); + treeRootHolder.getComponentByRef(123); } }