]> source.dussan.org Git - sonarqube.git/commitdiff
small refactoring of ComponentProvider
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Thu, 5 Nov 2015 14:44:11 +0000 (15:44 +0100)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 9 Nov 2015 15:34:20 +0000 (16:34 +0100)
change so that initialization state verification is responsability of ComponentProvider implementation, not user of ComponentProvider
add NoComponentProvider implementation so that componentProvider property can be never null

server/sonar-server/src/test/java/org/sonar/server/computation/component/AbstractComponentProvider.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/component/ComponentProvider.java
server/sonar-server/src/test/java/org/sonar/server/computation/component/MutableDbIdsRepositoryRule.java
server/sonar-server/src/test/java/org/sonar/server/computation/component/NoComponentProvider.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/component/TreeComponentProvider.java
server/sonar-server/src/test/java/org/sonar/server/computation/component/TreeRootHolderComponentProvider.java
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryRule.java

diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/AbstractComponentProvider.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/AbstractComponentProvider.java
new file mode 100644 (file)
index 0000000..c0ab6c4
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.component;
+
+import static com.google.common.base.Preconditions.checkState;
+
+abstract class AbstractComponentProvider implements ComponentProvider {
+  private boolean initialized = false;
+
+  @Override
+  public void ensureInitialized() {
+    if (!this.initialized) {
+      ensureInitializedImpl();
+      this.initialized = true;
+    }
+  }
+
+  protected abstract void ensureInitializedImpl();
+
+  @Override
+  public void reset() {
+    resetImpl();
+    this.initialized = false;
+  }
+
+  protected abstract void resetImpl();
+
+  @Override
+  public Component getByRef(int componentRef) {
+    checkState(this.initialized, "%s has not been initialized", getClass().getSimpleName());
+    return getByRefImpl(componentRef);
+  }
+
+  protected abstract Component getByRefImpl(int componentRef);
+}
index 9b6d032c23ba3efdfb2158915e6dc92e26ce6581..2258777d9b918672f9ca98a385371a6b16d557aa 100644 (file)
 package org.sonar.server.computation.component;
 
 public interface ComponentProvider {
-  void init();
+  /**
+   * does nothing if already initialized
+   */
+  void ensureInitialized();
 
   void reset();
 
   /**
    * @throws IllegalStateException if no component is found for the specified ref
+   * @throws IllegalStateException if provider has not been initialized
    */
   Component getByRef(int componentRef);
 }
index c07426f3f04a4604fd571f34d35a249ceb53532b..4fd4ff95ff3f122e6497810c1705e132a0f0e5c3 100644 (file)
 package org.sonar.server.computation.component;
 
 import com.google.common.base.Function;
-import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 import org.junit.rules.ExternalResource;
 import org.sonar.server.computation.batch.TreeRootHolderRule;
 
-import static com.google.common.base.Preconditions.checkState;
-
 /**
  * Implementation of {@link DbIdsRepository} as a JUnit {@link org.junit.Rule} which supports both
  * {@link ViewsComponent} and {@link ReportComponent}.
  */
 public class MutableDbIdsRepositoryRule extends ExternalResource implements MutableDbIdsRepository {
-  @CheckForNull
   private final ComponentProvider componentProvider;
-  private boolean providerInitialized = false;
   private MutableDbIdsRepository delegate = newDelegate();
 
-  private MutableDbIdsRepositoryRule(@Nullable ComponentProvider componentProvider) {
+  private MutableDbIdsRepositoryRule(ComponentProvider componentProvider) {
     this.componentProvider = componentProvider;
   }
 
   public static MutableDbIdsRepositoryRule standalone() {
-    return new MutableDbIdsRepositoryRule(null);
+    return new MutableDbIdsRepositoryRule(NoComponentProvider.INSTANCE);
   }
 
   public static MutableDbIdsRepositoryRule create(TreeRootHolderRule treeRootHolder) {
@@ -66,29 +61,18 @@ public class MutableDbIdsRepositoryRule extends ExternalResource implements Muta
   @Override
   protected void before() throws Throwable {
     this.delegate = newDelegate();
-    if (this.componentProvider != null) {
-      this.providerInitialized = false;
-    }
   }
 
   public DbIdsRepository setComponentId(int componentRef, long componentId) {
-    checkAndInitProvider();
+    this.componentProvider.ensureInitialized();
     return delegate.setComponentId(componentProvider.getByRef(componentRef), componentId);
   }
 
   public DbIdsRepository setSnapshotId(int componentRef, long snapshotId) {
-    checkAndInitProvider();
+    this.componentProvider.ensureInitialized();
     return delegate.setSnapshotId(componentProvider.getByRef(componentRef), snapshotId);
   }
 
-  private void checkAndInitProvider() {
-    checkState(this.componentProvider != null, "Can not use methods set taking a ref if no ComponentProvider has been set");
-    if (!this.providerInitialized) {
-      this.componentProvider.init();
-      this.providerInitialized = true;
-    }
-  }
-
   @Override
   public DbIdsRepository setComponentId(Component component, long componentId) {
     return delegate.setComponentId(component, componentId);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/NoComponentProvider.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/NoComponentProvider.java
new file mode 100644 (file)
index 0000000..bfdc74e
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.component;
+
+public enum NoComponentProvider implements ComponentProvider {
+  INSTANCE;
+
+  private static final String ERROR_MSG = "Can not add a measure by Component ref if MeasureRepositoryRule has not been created for some Component provider";
+
+  @Override
+  public void ensureInitialized() {
+    throw new IllegalStateException(ERROR_MSG);
+  }
+
+  @Override
+  public void reset() {
+    // do nothing
+  }
+
+  @Override
+  public Component getByRef(int componentRef) {
+    throw new IllegalStateException(ERROR_MSG);
+  }
+}
index a58aef6bd3901118fff65675bbfe4c8544a8b42c..93606568cce9ee609fd6c2fd192f7e2fcab80478 100644 (file)
@@ -24,10 +24,21 @@ import java.util.Map;
 
 import static com.google.common.base.Preconditions.checkState;
 
-public final class TreeComponentProvider implements ComponentProvider {
+public final class TreeComponentProvider extends AbstractComponentProvider {
+  private final Component root;
   private final Map<String, Component> componentsByRef = new HashMap<>();
 
   public TreeComponentProvider(Component root) {
+    this.root = root;
+    ensureInitialized();
+  }
+
+  private static String getRef(Component component) {
+    return component.getType().isReportType() ? String.valueOf(component.getReportAttributes().getRef()) : component.getKey();
+  }
+
+  @Override
+  protected void ensureInitializedImpl() {
     new DepthTraversalTypeAwareCrawler(
       new TypeAwareVisitorAdapter(CrawlerDepthLimit.LEAVES, ComponentVisitor.Order.PRE_ORDER) {
         @Override
@@ -39,22 +50,13 @@ public final class TreeComponentProvider implements ComponentProvider {
       }).visit(root);
   }
 
-  private static String getRef(Component component) {
-    return component.getType().isReportType() ? String.valueOf(component.getReportAttributes().getRef()) : component.getKey();
-  }
-
-  @Override
-  public void init() {
-    // nothing to do, init done in constructor
-  }
-
   @Override
-  public void reset() {
+  protected void resetImpl() {
     // we can not reset
   }
 
   @Override
-  public Component getByRef(int componentRef) {
+  protected Component getByRefImpl(int componentRef) {
     Component component = componentsByRef.get(String.valueOf(componentRef));
     checkState(component != null, "Can not find Component for ref " + componentRef);
     return component;
index 3e72a97d542cf165e04bc6791b5b589d2299aa6d..084d180601d0e55085fa1cd3b422e7e533eb47c3 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.server.computation.component;
 
-public final class TreeRootHolderComponentProvider implements ComponentProvider {
+public final class TreeRootHolderComponentProvider extends AbstractComponentProvider {
   private final TreeRootHolder treeRootHolder;
   private TreeComponentProvider delegate;
 
@@ -28,20 +28,20 @@ public final class TreeRootHolderComponentProvider implements ComponentProvider
   }
 
   @Override
-  public void init() {
+  protected void ensureInitializedImpl() {
     if (this.delegate == null) {
       this.delegate = new TreeComponentProvider(treeRootHolder.getRoot());
-      this.delegate.init();
+      this.delegate.ensureInitialized();
     }
   }
 
   @Override
-  public void reset() {
+  protected void resetImpl() {
     this.delegate = null;
   }
 
   @Override
-  public Component getByRef(int componentRef) {
+  protected Component getByRefImpl(int componentRef) {
     return delegate.getByRef(componentRef);
   }
 }
index 4aec1bce93871afaed7fbdf1e576a6057f621694..d435cc11e3812f20f6860dcabd84d449bff0e776 100644 (file)
@@ -34,6 +34,7 @@ import javax.annotation.Nullable;
 import org.junit.rules.ExternalResource;
 import org.sonar.server.computation.component.Component;
 import org.sonar.server.computation.component.ComponentProvider;
+import org.sonar.server.computation.component.NoComponentProvider;
 import org.sonar.server.computation.component.TreeComponentProvider;
 import org.sonar.server.computation.component.TreeRootHolder;
 import org.sonar.server.computation.component.TreeRootHolderComponentProvider;
@@ -53,7 +54,6 @@ import static java.util.Objects.requireNonNull;
  * providers.
  */
 public class MeasureRepositoryRule extends ExternalResource implements MeasureRepository {
-  @CheckForNull
   private final ComponentProvider componentProvider;
   @CheckForNull
   private final MetricRepositoryRule metricRepositoryRule;
@@ -68,22 +68,20 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe
     }
   };
 
-  private MeasureRepositoryRule(@Nullable ComponentProvider componentProvider, @Nullable MetricRepositoryRule metricRepositoryRule) {
+  private MeasureRepositoryRule(ComponentProvider componentProvider, @Nullable MetricRepositoryRule metricRepositoryRule) {
     this.componentProvider = componentProvider;
     this.metricRepositoryRule = metricRepositoryRule;
   }
 
   @Override
   protected void after() {
-    if (componentProvider != null) {
-      componentProvider.reset();
-    }
+    componentProvider.reset();
     baseMeasures.clear();
     rawMeasures.clear();
   }
 
   public static MeasureRepositoryRule create() {
-    return new MeasureRepositoryRule(null, null);
+    return new MeasureRepositoryRule(NoComponentProvider.INSTANCE, null);
   }
 
   public static MeasureRepositoryRule create(TreeRootHolder treeRootHolder, MetricRepositoryRule metricRepositoryRule) {
@@ -305,9 +303,8 @@ public class MeasureRepositoryRule extends ExternalResource implements MeasureRe
   }
 
   private void checkAndInitProvidersState() {
-    checkState(componentProvider != null, "Can not add a measure by Component ref if MeasureRepositoryRule has not been created for some Component provider");
     checkState(metricRepositoryRule != null, "Can not add a measure by metric key if MeasureRepositoryRule has not been created for a MetricRepository");
-    componentProvider.init();
+    componentProvider.ensureInitialized();
   }
 
   public boolean isEmpty() {