]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3755 use persistent cache
authorSimon Brandhof <simon.brandhof@gmail.com>
Tue, 23 Apr 2013 14:16:31 +0000 (16:16 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Tue, 23 Apr 2013 16:55:28 +0000 (18:55 +0200)
sonar-batch/src/main/java/org/sonar/batch/index/Caches.java
sonar-batch/src/main/java/org/sonar/batch/issue/IssueCache.java
sonar-batch/src/main/java/org/sonar/batch/issue/IssuePersister.java
sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java
sonar-batch/src/test/java/org/sonar/batch/index/CachesTest.java
sonar-batch/src/test/java/org/sonar/batch/issue/IssueCacheTest.java
sonar-core/src/test/java/org/sonar/core/issue/workflow/SetResolutionTest.java
sonar-core/src/test/java/org/sonar/core/issue/workflow/TransitionTest.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java

index 9f43b582b84b3b3f24152b41884b154d0efeddc6..f67a74680551eac0166b0137b12b79812b63ea25 100644 (file)
@@ -49,21 +49,11 @@ public class Caches implements BatchComponent, Startable {
   private Persistit persistit;
   private Volume volume;
 
-  public <K extends Serializable, V extends Serializable> Cache<K, V> createCache(String cacheName) {
-    Preconditions.checkState(volume != null && volume.isOpened(), "Caches are not started");
-    Preconditions.checkState(!cacheNames.contains(cacheName), "Cache is already created: " + cacheName);
-    try {
-      Exchange exchange = persistit.getExchange(volume, cacheName, true);
-      Cache<K, V> cache = new Cache<K, V>(cacheName, exchange);
-      cacheNames.add(cacheName);
-      return cache;
-    } catch (Exception e) {
-      throw new IllegalStateException("Fail to create cache: " + cacheName, e);
-    }
+  public Caches() {
+    initPersistit();
   }
 
-  @Override
-  public void start() {
+  private void initPersistit() {
     try {
       tempDir = Files.createTempDir();
       persistit = new Persistit();
@@ -85,6 +75,23 @@ public class Caches implements BatchComponent, Startable {
     }
   }
 
+  public <K extends Serializable, V extends Serializable> Cache<K, V> createCache(String cacheName) {
+    Preconditions.checkState(volume != null && volume.isOpened(), "Caches are not initialized");
+    Preconditions.checkState(!cacheNames.contains(cacheName), "Cache is already created: " + cacheName);
+    try {
+      Exchange exchange = persistit.getExchange(volume, cacheName, true);
+      Cache<K, V> cache = new Cache<K, V>(cacheName, exchange);
+      cacheNames.add(cacheName);
+      return cache;
+    } catch (Exception e) {
+      throw new IllegalStateException("Fail to create cache: " + cacheName, e);
+    }
+  }
+
+  @Override
+  public void start() {
+  }
+
   @Override
   public void stop() {
     if (persistit != null) {
index a319ef97fd5879797ae7d16c2dce50c10ece35e7..f901eaa0ce64f55f4f2fcba8e203d4895b8ce18b 100644 (file)
  */
 package org.sonar.batch.issue;
 
-import com.google.common.collect.Maps;
 import org.sonar.api.BatchComponent;
 import org.sonar.api.issue.Issue;
+import org.sonar.batch.index.Cache;
+import org.sonar.batch.index.Caches;
 
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
 
 /**
  * Shared issues among all project modules
@@ -33,28 +32,22 @@ import java.util.Map;
 public class IssueCache implements BatchComponent {
 
   // component key -> issue key -> issue
-  private final Map<String, Map<String, Issue>> componentIssues = Maps.newHashMap();
+  private final Cache<String, Issue> cache;
+
+  public IssueCache(Caches caches) {
+    cache = caches.createCache("issues");
+  }
 
   public Collection<Issue> componentIssues(String componentKey) {
-    Map<String, Issue> issuesByKey = componentIssues.get(componentKey);
-    return issuesByKey == null ? Collections.<Issue>emptyList() : issuesByKey.values();
+    return cache.values(componentKey);
   }
 
   public Issue componentIssue(String componentKey, String issueKey) {
-    Map<String, Issue> issuesByKey = componentIssues.get(componentKey);
-    if (issuesByKey != null) {
-      return issuesByKey.get(issueKey);
-    }
-    return null;
+    return cache.get(componentKey, issueKey);
   }
 
   public IssueCache addOrUpdate(Issue issue) {
-    Map<String, Issue> issuesByKey = componentIssues.get(issue.componentKey());
-    if (issuesByKey == null) {
-      issuesByKey = Maps.newHashMap();
-      componentIssues.put(issue.componentKey(), issuesByKey);
-    }
-    issuesByKey.put(issue.key(), issue);
+    cache.put(issue.componentKey(), issue.key(), issue);
     return this;
   }
 }
index f8d51fd14b5074136d4dc53e94a69b557f75e5f9..ae2aeda4b8cc123498ceebd3ce13831298af9818 100644 (file)
@@ -74,6 +74,4 @@ public class IssuePersister implements ScanPersister {
       }
     }
   }
-
-
 }
index f965cf0d69b68b039c207342332c1e2bfd9475a6..bfcb3d57cb78c294a348897abe67f7e1d39e7f1e 100644 (file)
@@ -90,7 +90,6 @@ public class ProjectScanContainer extends ComponentContainer {
 
       // issues
       IssueWorkflow.class,
-      ScanIssues.class,
       DeprecatedViolations.class,
       IssueCache.class,
       IssuePersister.class,
index 95366042b3816d6745c2c4569992176571110176..200a4295afd4a17f0642dd259294c44bd13572a7 100644 (file)
@@ -37,12 +37,7 @@ public class CachesTest {
   }
 
   @Test
-  public void should_start_and_stop_persistit() throws Exception {
-    assertThat(caches.tempDir()).isNull();
-    assertThat(caches.persistit()).isNull();
-
-    caches.start();
-
+  public void should_stop_and_clean_temp_dir() throws Exception {
     File tempDir = caches.tempDir();
     assertThat(tempDir).isDirectory().exists();
     assertThat(caches.persistit()).isNotNull();
@@ -74,16 +69,6 @@ public class CachesTest {
     }
   }
 
-  @Test
-  public void should_not_create_cache_before_starting() {
-    try {
-      caches.createCache("too_early");
-      fail();
-    } catch (IllegalStateException e) {
-      assertThat(e).hasMessage("Caches are not started");
-    }
-  }
-
   static class Element implements Serializable {
 
   }
index 8ca98a6fa5a44d4ea8d2a210d9c2f7f3b0c1baf9..8956e7156576daac48437d264cddb07aebefb44c 100644 (file)
@@ -50,7 +50,7 @@ public class IssueCacheTest {
 
   @Test
   public void should_add_new_issue() throws Exception {
-    IssueCache cache = new IssueCache();
+    IssueCache cache = new IssueCache(caches);
     DefaultIssue issue1 = new DefaultIssue().setKey("111").setComponentKey("org.struts.Action");
     DefaultIssue issue2 = new DefaultIssue().setKey("222").setComponentKey("org.struts.Action");
     DefaultIssue issue3 = new DefaultIssue().setKey("333").setComponentKey("org.struts.Filter");
@@ -62,7 +62,7 @@ public class IssueCacheTest {
 
   @Test
   public void should_update_existing_issue() throws Exception {
-    IssueCache cache = new IssueCache();
+    IssueCache cache = new IssueCache(caches);
     DefaultIssue issue = new DefaultIssue().setKey("111").setComponentKey("org.struts.Action").setSeverity(Severity.BLOCKER);
     cache.addOrUpdate(issue);
 
index 19e7c17cd3fef6774eda87a3de7362a85743bfa9..2ab06515ada284b9c5296da0fd5d4a9bb657d967 100644 (file)
@@ -24,6 +24,7 @@ import org.sonar.api.issue.Issue;
 import org.sonar.core.issue.DefaultIssue;
 
 import static org.fest.assertions.Assertions.assertThat;
+import static org.fest.assertions.Fail.fail;
 
 public class SetResolutionTest {
   @Test
@@ -38,6 +39,7 @@ public class SetResolutionTest {
   public void resolution_should_not_be_empty() throws Exception {
     try {
       new SetResolution("");
+      fail();
     } catch (IllegalArgumentException e) {
       assertThat(e).hasMessage("Resolution must be set");
     }
index 6298954e0946b365102616fa7f2cac3b44211cd5..4f068afe6cc35b4d68c4c69018d30a662f4f167d 100644 (file)
@@ -23,6 +23,7 @@ import org.junit.Test;
 import org.sonar.core.issue.DefaultIssue;
 
 import static org.fest.assertions.Assertions.assertThat;
+import static org.fest.assertions.Fail.fail;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -64,6 +65,7 @@ public class TransitionTest {
   public void key_should_be_set() throws Exception {
     try {
       Transition.builder("").from("OPEN").to("CLOSED").build();
+      fail();
     } catch (Exception e) {
       assertThat(e).hasMessage("Transition key must be set");
     }
@@ -73,6 +75,7 @@ public class TransitionTest {
   public void key_should_be_lower_case() throws Exception {
     try {
       Transition.builder("CLOSE").from("OPEN").to("CLOSED").build();
+      fail();
     } catch (Exception e) {
       assertThat(e).hasMessage("Transition key must be lower-case");
     }
@@ -82,6 +85,7 @@ public class TransitionTest {
   public void originating_status_should_be_set() throws Exception {
     try {
       Transition.builder("close").from("").to("CLOSED").build();
+      fail();
     } catch (Exception e) {
       assertThat(e).hasMessage("Originating status must be set");
     }
@@ -91,6 +95,7 @@ public class TransitionTest {
   public void destination_status_should_be_set() throws Exception {
     try {
       Transition.builder("close").from("OPEN").to("").build();
+      fail();
     } catch (Exception e) {
       assertThat(e).hasMessage("Destination status must be set");
     }
index 57ae00e3a45d6bc5b7b93765541c2721f7fcff76..ff32f86e54c0a0d156a334144d47701b1fbc3325 100644 (file)
@@ -21,13 +21,14 @@ package org.sonar.api.issue;
 
 import org.sonar.api.rule.RuleKey;
 
+import java.io.Serializable;
 import java.util.Date;
 import java.util.Map;
 
 /**
  * @since 3.6
  */
-public interface Issue {
+public interface Issue extends Serializable {
 
   int DESCRIPTION_MAX_SIZE = 4000;
   String STATUS_OPEN = "OPEN";