]> source.dussan.org Git - sonarqube.git/commitdiff
Fix loading of metric formulas when defined in plugins
authorSimon Brandhof <simon.brandhof@gmail.com>
Tue, 31 May 2011 13:32:25 +0000 (15:32 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Tue, 31 May 2011 13:32:37 +0000 (15:32 +0200)
sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchExtensionInstaller.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchModule.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/BatchExtensionDictionnary.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/Metrics.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/BatchExtensionDictionnaryTest.java

index f176e1a81fc5ab8acf2dd6987d1f8bc86d5718f7..cee17e434d7fe133a09fe0c66342021013db1605 100644 (file)
@@ -24,6 +24,8 @@ import org.sonar.api.ExtensionProvider;
 import org.sonar.api.Plugin;
 import org.sonar.api.batch.CoverageExtension;
 import org.sonar.api.batch.InstantiationStrategy;
+import org.sonar.api.measures.Metric;
+import org.sonar.api.measures.Metrics;
 import org.sonar.batch.bootstrapper.EnvironmentInformation;
 
 import java.util.List;
@@ -45,6 +47,15 @@ public final class BatchExtensionInstaller implements BatchComponent {
       }
     }
     installExtensionProviders(module);
+    installMetrics(module);
+  }
+
+  private void installMetrics(Module module) {
+    for (Metrics metrics : module.getComponents(Metrics.class)) {
+      for (Metric metric : metrics.getMetrics()) {
+        module.addComponent(metric.getKey(), metric);
+      }
+    }
   }
 
   void installExtensionProviders(Module module) {
index c69b34c6b82159b3191c983f97c2a89fad14a328..e78c7251f496f261bc27e228b50b452bab7ba2d0 100644 (file)
@@ -20,6 +20,9 @@
 package org.sonar.batch.bootstrap;
 
 import org.sonar.api.Plugins;
+import org.sonar.api.measures.CoreMetrics;
+import org.sonar.api.measures.Metric;
+import org.sonar.api.measures.Metrics;
 import org.sonar.api.resources.Project;
 import org.sonar.api.utils.ServerHttpClient;
 import org.sonar.batch.DefaultResourceCreationLock;
@@ -59,6 +62,7 @@ public class BatchModule extends Module {
     addComponent(PastSnapshotFinderByVersion.class);
     addComponent(PastMeasuresLoader.class);
     addComponent(PastSnapshotFinder.class);
+    addCoreMetrics();
     addBatchExtensions();
   }
 
@@ -67,6 +71,12 @@ public class BatchModule extends Module {
     installer.install(this);
   }
 
+  void addCoreMetrics() {
+    for (Metric metric : CoreMetrics.getMetrics()) {
+      addComponent(metric.getKey(), metric);
+    }
+  }
+
   @Override
   protected void doStart() {
     ProjectTree projectTree = getComponent(ProjectTree.class);
index 1ea854e61de97f6a86b304246860bf325016a416..ae0c69aec40733bb051c75ee4d6d80661e4bf24d 100644 (file)
@@ -104,16 +104,6 @@ public class ProjectModule extends Module {
     for (Class clazz : Phases.getPhaseClasses()) {
       addComponent(clazz);
     }
-
-    // TODO move metrics to BatchComponents
-    for (Metric metric : CoreMetrics.getMetrics()) {
-      addComponent(metric.getKey(), metric);
-    }
-    for (Metrics metricRepo : getComponents(Metrics.class)) {
-      for (Metric metric : metricRepo.getMetrics()) {
-        addComponent(metric.getKey(), metric);
-      }
-    }
   }
 
   private void addProjectPluginExtensions() {
index 806323bbdfba43d91308538c464ab31cb25cbd40..dddea1ccc0b08a2ab75647d37b4bc1942b0e95d0 100644 (file)
@@ -24,6 +24,7 @@ import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.ClassUtils;
 import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.PicoContainer;
 import org.sonar.api.BatchExtension;
 import org.sonar.api.batch.maven.DependsUponMavenPlugin;
 import org.sonar.api.batch.maven.MavenPluginHandler;
@@ -86,7 +87,16 @@ public class BatchExtensionDictionnary {
   }
 
   private List<BatchExtension> getExtensions() {
-    return picoContainer.getComponents(BatchExtension.class);
+    List<BatchExtension> extensions = Lists.newArrayList();
+    completeBatchExtensions(picoContainer, extensions);
+    return extensions;
+  }
+
+  private void completeBatchExtensions(PicoContainer picoContainer, List<BatchExtension> extensions) {
+    if (picoContainer!=null) {
+      extensions.addAll(picoContainer.getComponents(BatchExtension.class));
+      completeBatchExtensions(picoContainer.getParent(), extensions);
+    }
   }
 
   private <T> List<T> getFilteredExtensions(Class<T> type, Project project) {
index 6a29a569a51c5ac98b7ca7cc94387bf8893640a6..f0217638aed695afbc7f967edc8566371c799f9b 100644 (file)
@@ -21,12 +21,14 @@ package org.sonar.api.measures;
 
 import org.sonar.api.BatchExtension;
 import org.sonar.api.ServerExtension;
+import org.sonar.api.batch.InstantiationStrategy;
 
 import java.util.List;
 
 /**
  * @since 1.10
  */
+@InstantiationStrategy(InstantiationStrategy.PER_BATCH)
 public interface Metrics extends BatchExtension, ServerExtension {
   List<Metric> getMetrics();
 }
index 210da5a4c595e2e4dc08b579a7a2cd38718f66ad..37e6e644c49a30d6f6087e51e1ac99f6abc38f34 100644 (file)
@@ -21,8 +21,13 @@ package org.sonar.api.batch;
 
 import com.google.common.collect.Lists;
 import org.junit.Test;
+import org.picocontainer.Characteristics;
+import org.picocontainer.DefaultPicoContainer;
+import org.picocontainer.PicoContainer;
 import org.picocontainer.containers.TransientPicoContainer;
 import org.sonar.api.BatchExtension;
+import org.sonar.api.measures.CoreMetrics;
+import org.sonar.api.measures.Metric;
 import org.sonar.api.resources.Project;
 
 import java.util.ArrayList;
@@ -33,6 +38,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.internal.matchers.IsCollectionContaining.hasItem;
+import static org.junit.internal.matchers.IsCollectionContaining.hasItems;
 import static org.mockito.Mockito.mock;
 
 public class BatchExtensionDictionnaryTest {
@@ -47,7 +53,7 @@ public class BatchExtensionDictionnaryTest {
   }
 
   @Test
-  public void getFilteredExtensions() {
+  public void testGetFilteredExtensions() {
     Sensor sensor1 = new FakeSensor(), sensor2 = new FakeSensor();
     Decorator decorator = mock(Decorator.class);
 
@@ -59,6 +65,22 @@ public class BatchExtensionDictionnaryTest {
     assertEquals(2, sensors.size());
   }
 
+  @Test
+  public void shouldSearchInParentContainers() {
+    TransientPicoContainer grandParent = new TransientPicoContainer();
+    grandParent.as(Characteristics.CACHE).addComponent("ncloc", CoreMetrics.NCLOC);
+
+    DefaultPicoContainer parent = (DefaultPicoContainer)grandParent.makeChildContainer();
+    parent.as(Characteristics.CACHE).addComponent("coverage", CoreMetrics.COVERAGE);
+
+    DefaultPicoContainer child = (DefaultPicoContainer)parent.makeChildContainer();
+    child.as(Characteristics.CACHE).addComponent("complexity", CoreMetrics.COMPLEXITY);
+
+    BatchExtensionDictionnary dictionnary = new BatchExtensionDictionnary(child);
+    assertThat(dictionnary.select(Metric.class).size(), is(3));
+    assertThat(dictionnary.select(Metric.class), hasItems(CoreMetrics.NCLOC, CoreMetrics.COVERAGE, CoreMetrics.COMPLEXITY));
+  }
+
   @Test
   public void sortExtensionsByDependency() {
     BatchExtension a = new MethodDependentOf(null);